ZGlmZiAtLWdpdCBhLy5naXRhdHRyaWJ1dGVzIGIvLmdpdGF0dHJpYnV0ZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E0NGQ4ZAotLS0gL2Rldi9udWxsCisrKyBiLy5naXRhdHRyaWJ1dGVzCkBAIC0wLDAgKzEsMTU0IEBACisqIHRleHQ9YXV0byAhZW9sCisKKyouYyB0ZXh0ICFlb2wKKyouY2MgdGV4dCAhZW9sCisqLmNsYXNzcGF0aCB0ZXh0ICFlb2wKKyouY3BwIHRleHQgIWVvbAorKi5jc3MgdGV4dCAhZW9sCisqLmRzcCB0ZXh0ICFlb2wKKyouZHN3IHRleHQgIWVvbAorKi5maWx0ZXJzIHRleHQgIWVvbAorKi5oIHRleHQgIWVvbAorKi5odG0gdGV4dCAhZW9sCisqLmh0bWwgdGV4dCAhZW9sCisqLmluIHRleHQgIWVvbAorKi5qYXZhIHRleHQgIWVvbAorKi5sYXVuY2ggdGV4dCAhZW9sCisqLm1hayB0ZXh0ICFlb2wKKyoubWQgdGV4dCAhZW9sCisqLk1GIHRleHQgIWVvbAorKi5tayB0ZXh0ICFlb2wKKyoucGwgdGV4dCAhZW9sCisqLnBtIHRleHQgIWVvbAorKi5wcm9qZWN0IHRleHQgIWVvbAorKi5wcm9wZXJ0aWVzIHRleHQgIWVvbAorKi5weSB0ZXh0ICFlb2wKKyoucmMgdGV4dCAhZW9sCisqLnNoIHRleHQgZW9sPWxmCisqLnNsbiB0ZXh0ICFlb2wKKyouc3R1YiB0ZXh0ICFlb2wKKyoudHh0IHRleHQgIWVvbAorKi51Y20gdGV4dCAhZW9sCisqLnZjcHJvaiB0ZXh0ICFlb2wKKyoudmN4cHJvaiB0ZXh0ICFlb2wKKyoueG1sIHRleHQgIWVvbAorKi54c2wgdGV4dCAhZW9sCisqLnhzbHQgdGV4dCAhZW9sCitNYWtlZmlsZSB0ZXh0ICFlb2wKK2NvbmZpZ3VyZSB0ZXh0ICFlb2wKK0xJQ0VOU0UgdGV4dCAhZW9sCitSRUFETUUgdGV4dCAhZW9sCisKKyouYmluIC10ZXh0CisqLmJyayAtdGV4dAorKi5jbnYgLXRleHQKKyouaWN1IC10ZXh0CisqLnJlcyAtdGV4dAorKi5ucm0gLXRleHQKKyouc3BwIC10ZXh0CisqLnRyaTIgLXRleHQKKworbXVsdGkvYy9NYWtlZmlsZS1jLmluYyAtdGV4dAorbXVsdGkvYy9wYXRjaC8zXzAgLXRleHQKK211bHRpL2MvcGF0Y2gvM18yIC10ZXh0CittdWx0aS9jL3BhdGNoLzNfNF8xIC10ZXh0CittdWx0aS9jb21tb24vTWFrZWZpbGUtbXVsdGkuaW5jIC10ZXh0CittdWx0aS9qL01ha2VmaWxlLWouaW5jIC10ZXh0CittdWx0aS9wcm9qL3Byb3ZpZGVyL01ha2VmaWxlLmxvY2FsLXNhbXBsZSAtdGV4dAorbXVsdGkvcHJvai9wcm92aWRlci9pY3UtY29uZmlnLnNlZCAtdGV4dAorbXVsdGkvcHJvai9wcm92aWRlci9yZWFkbWUudHh0IC10ZXh0CityZWxlYXNlL2MvYm9tZml4LnB5IC10ZXh0CityZWxlYXNlL2phdmEvLmNsYXNzcGF0aCAtdGV4dAorcmVsZWFzZS9qYXZhLy5wcm9qZWN0IC10ZXh0CityZWxlYXNlL2phdmEvTWFrZWZpbGUgLXRleHQKK3JlbGVhc2UvamF2YS9pY3U0Yy5jc3MgLXRleHQKK3JlbGVhc2UvamF2YS9zcmMvY29tL2libS9pY3UvZGV2L3Rvb2xzL2RvY3MvZHVtcEFsbENGdW5jX3htbC54c2x0IC10ZXh0CityZWxlYXNlL2phdmEvc3JjL2NvbS9pYm0vaWN1L2Rldi90b29scy9kb2NzL2R1bXBBbGxDcHBGdW5jX3htbC54c2x0IC10ZXh0CityZWxlYXNlL2phdmEvc3JjL2NvbS9pYm0vaWN1L2Rldi90b29scy9kb2NzL2dlbnJlcG9ydF94bWwueHNsdCAtdGV4dAorc2NyaXB0cy9pY3VydW4gLXRleHQKK3RyYWMvSWN1Q29kZVRvb2xzLzAuMTEvaWN1Y29kZXRvb2xzL19faW5pdF9fLnB5IC10ZXh0Cit0cmFjL0ljdUNvZGVUb29scy8wLjExL2ljdWNvZGV0b29scy9kY3V0LnB5IC10ZXh0Cit0cmFjL0ljdUNvZGVUb29scy8wLjExL2ljdWNvZGV0b29scy9odGRvY3MvY3NzL2ljdXh0bi5jc3MgLXRleHQKK3RyYWMvSWN1Q29kZVRvb2xzLzAuMTEvaWN1Y29kZXRvb2xzL3Jldmlldy5weSAtdGV4dAordHJhYy9JY3VDb2RlVG9vbHMvMC4xMS9pY3Vjb2RldG9vbHMvdGVtcGxhdGVzL25vdGhpbmcuaHRtbCAtdGV4dAordHJhYy9JY3VDb2RlVG9vbHMvMC4xMS9pY3Vjb2RldG9vbHMvdGVtcGxhdGVzL3Jldmlldy5odG1sIC10ZXh0Cit0cmFjL0ljdUNvZGVUb29scy8wLjExL2ljdWNvZGV0b29scy90aWNrZXRtZ3IucHkgLXRleHQKK3RyYWMvSWN1Q29kZVRvb2xzLzAuMTEvaWN1Y29kZXRvb2xzL3RrdGxpc3QucHkgLXRleHQKK3RyYWMvSWN1Q29kZVRvb2xzLzAuMTEvbGljZW5zZS5odG1sIC10ZXh0Cit0cmFjL0ljdUNvZGVUb29scy8wLjExL3JlYWRtZS50eHQgLXRleHQKK3RyYWMvSWN1Q29kZVRvb2xzLzAuMTEvc2V0dXAuY2ZnIC10ZXh0Cit0cmFjL0ljdUNvZGVUb29scy8wLjExL3NldHVwLnB5IC10ZXh0Cit0cmFjL0ljdUNvZGVUb29scy8wLjEyL2ljdWNvZGV0b29scy9fX2luaXRfXy5weSAtdGV4dAordHJhYy9JY3VDb2RlVG9vbHMvMC4xMi9pY3Vjb2RldG9vbHMvZGN1dC5weSAtdGV4dAordHJhYy9JY3VDb2RlVG9vbHMvMC4xMi9pY3Vjb2RldG9vbHMvaHRkb2NzL2Nzcy9pY3V4dG4uY3NzIC10ZXh0Cit0cmFjL0ljdUNvZGVUb29scy8wLjEyL2ljdWNvZGV0b29scy9yZXZpZXcucHkgLXRleHQKK3RyYWMvSWN1Q29kZVRvb2xzLzAuMTIvaWN1Y29kZXRvb2xzL3RlbXBsYXRlcy9ub3RoaW5nLmh0bWwgLXRleHQKK3RyYWMvSWN1Q29kZVRvb2xzLzAuMTIvaWN1Y29kZXRvb2xzL3RlbXBsYXRlcy9yZXZpZXcuaHRtbCAtdGV4dAordHJhYy9JY3VDb2RlVG9vbHMvMC4xMi9pY3Vjb2RldG9vbHMvdGlja2V0bWdyLnB5IC10ZXh0Cit0cmFjL0ljdUNvZGVUb29scy8wLjEyL2ljdWNvZGV0b29scy90a3RsaXN0LnB5IC10ZXh0Cit0cmFjL0ljdUNvZGVUb29scy8wLjEyL2xpY2Vuc2UuaHRtbCAtdGV4dAordHJhYy9JY3VDb2RlVG9vbHMvMC4xMi9yZWFkbWUudHh0IC10ZXh0Cit0cmFjL0ljdUNvZGVUb29scy8wLjEyL3NldHVwLmNmZyAtdGV4dAordHJhYy9JY3VDb2RlVG9vbHMvMC4xMi9zZXR1cC5weSAtdGV4dAordW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL1RpdGxlTG9nb190cmFuc3BhcmVudC5naWYgLXRleHQKK3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9hcnJvd19idWxsZXQuZ2lmIC10ZXh0Cit1bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvZGlhbW9uZF9idWxsZXQuZ2lmIC10ZXh0Cit1bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvaWJtX2xvZ29fc21hbGxfd2hpdGUuZ2lmIC10ZXh0Cit1bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvUkJSZXBvcnRlci5naWYgLXRleHQKK3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9iYXNpY19maWxlLmdpZiAtdGV4dAordW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL2Jhc2ljX2dyb3VwLmdpZiAtdGV4dAordW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL2Jhc2ljX3Jlc291cmNlLmdpZiAtdGV4dAordW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL2Jhc2ljX3RyYW5zbGF0aW9uLmdpZiAtdGV4dAordW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL2Jhc2ljX3VudHJhbnNsYXRlZC5naWYgLXRleHQKK3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9jcmVhdGVfZ3JvdXAuZ2lmIC10ZXh0Cit1bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvZW1wdHlfZ3JvdXAuZ2lmIC10ZXh0Cit1bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvZW1wdHlfcmVzb3VyY2UuZ2lmIC10ZXh0Cit1bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvZW1wdHlfc2NyZWVuLmdpZiAtdGV4dAordW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL2VtcHR5X3dpdGhfcHJlZmVyZW5jZXMuZ2lmIC10ZXh0Cit1bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvbGFmX21ldGFsLmdpZiAtdGV4dAordW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL2xhZl9tb3RpZi5naWYgLXRleHQKK3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9sYWZfd2luZG93cy5naWYgLXRleHQKK3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9sb29rdXBfcmVzb3VyY2UuZ2lmIC10ZXh0Cit1bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvbWFpbl9wYWdlLmdpZiAtdGV4dAordW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL21lbnVfZmlsZS5naWYgLXRleHQKK3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9tZW51X2ZpbGVfZXhwb3J0LmdpZiAtdGV4dAordW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL21lbnVfZmlsZV9pbXBvcnQuZ2lmIC10ZXh0Cit1bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvbWVudV9oZWxwLmdpZiAtdGV4dAordW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL21lbnVfb3B0aW9ucy5naWYgLXRleHQKK3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9tZW51X3BvcHVwX3RyZWUuZ2lmIC10ZXh0Cit1bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvbmV3X2Jhc2VjbGFzcy5naWYgLXRleHQKK3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9uZXdfYnVuZGxlLmdpZiAtdGV4dAordW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL3ByZWZlcmVuY2VzX2RpYWxvZy5naWYgLXRleHQKK3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy92aWV3X2dyb3Vwc19idW5kbGUuZ2lmIC10ZXh0Cit1bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvdmlld19ncm91cHNfZmlsZS5naWYgLXRleHQKK3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy92aWV3X3NlYXJjaC5naWYgLXRleHQKK3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy92aWV3X3N0YXRzX2J1bmRsZS5naWYgLXRleHQKK3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy92aWV3X3N0YXRzX2ZpbGUuZ2lmIC10ZXh0Cit1bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvdmlld190cmVlX2Jhc2ljLmdpZiAtdGV4dAordW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL3ZpZXdfdW50cmFuc19idW5kbGUuZ2lmIC10ZXh0Cit1bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvdmlld191bnRyYW5zX2RpYWxvZzAuZ2lmIC10ZXh0Cit1bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvdmlld191bnRyYW5zX2ZpbGUuZ2lmIC10ZXh0Cit1bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc3BhY2VyLmdpZiAtdGV4dAordW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3RlbXBsYXRlX2wuZ2lmIC10ZXh0Cit1bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvdGVtcGxhdGVfbGluZS5naWYgLXRleHQKK3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy90ZW1wbGF0ZV9sbC5naWYgLXRleHQKK3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy90ZW1wbGF0ZV91LmdpZiAtdGV4dAordW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3RlbXBsYXRlX3VsLmdpZiAtdGV4dAordW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2d1aS9pbWFnZXMvVGl0bGVMb2dvX3RyYW5zcGFyZW50LmdpZiAtdGV4dAordW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2d1aS9pbWFnZXMvdHJlZV9pY29uX2J1bmRsZS5naWYgLXRleHQKK3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9ndWkvaW1hZ2VzL3RyZWVfaWNvbl9jb3VudHJ5LmdpZiAtdGV4dAordW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2d1aS9pbWFnZXMvdHJlZV9pY29uX2ZpbGUuZ2lmIC10ZXh0Cit1bmljb2RldG9vbHMvY29tL2libS9yYm0vZ3VpL2ltYWdlcy90cmVlX2ljb25fZ3JvdXAuZ2lmIC10ZXh0Cit1bmljb2RldG9vbHMvY29tL2libS9yYm0vZ3VpL2ltYWdlcy90cmVlX2ljb25faXRlbS5naWYgLXRleHQKK3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9ndWkvaW1hZ2VzL3RyZWVfaWNvbl9sYW5ndWFnZS5naWYgLXRleHQKK3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9ndWkvaW1hZ2VzL3RyZWVfaWNvbl9wcm9qZWN0LmdpZiAtdGV4dAordW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2d1aS9pbWFnZXMvdHJlZV9pY29uX3ZhcmlhbnQuZ2lmIC10ZXh0CisKKyMgVGhlIGZvbGxvd2luZyBmaWxlIHR5cGVzIGFyZSBzdG9yZWQgaW4gR2l0LUxGUy4KKyouamFyIGZpbHRlcj1sZnMgZGlmZj1sZnMgbWVyZ2U9bGZzIC10ZXh0CisqLmRhdCBmaWx0ZXI9bGZzIGRpZmY9bGZzIG1lcmdlPWxmcyAtdGV4dAorKi56aXAgZmlsdGVyPWxmcyBkaWZmPWxmcyBtZXJnZT1sZnMgLXRleHQKKyouZ3ogZmlsdGVyPWxmcyBkaWZmPWxmcyBtZXJnZT1sZnMgLXRleHQKKyouYnoyIGZpbHRlcj1sZnMgZGlmZj1sZnMgbWVyZ2U9bGZzIC10ZXh0CisqLmdpZiBmaWx0ZXI9bGZzIGRpZmY9bGZzIG1lcmdlPWxmcyAtdGV4dAorCmRpZmYgLS1naXQgYS8uZ2l0aWdub3JlIGIvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDNiZjM2Ci0tLSAvZGV2L251bGwKKysrIGIvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDEyMSBAQAorbXVsdGkvYy9NYWtlZmlsZS5sb2NhbAorbXVsdGkvcGFja2FnZXMvKi5qYXIKK211bHRpL3BhY2thZ2VzLyoudGd6CittdWx0aS9wcm9qL2NoZWxsby9vdXQKK211bHRpL3Byb2ovcHJvdmlkZXIvTWFrZWZpbGUubG9jYWwKK211bHRpL3Byb2ovcHJvdmlkZXIvb3V0CittdWx0aS90bXAKK3JlbGVhc2UvamF2YS9BUElDaGFuZ2VSZXBvcnQqCityZWxlYXNlL2phdmEvTWFrZWZpbGUubG9jYWwKK3JlbGVhc2UvamF2YS9jbGFzc2VzCityZWxlYXNlL2phdmEvbGliCityZWxlYXNlL2phdmEvc3JjL2NvbS9pYm0vaWN1L2Rldi90b29scy9taXNjLyouY2xhc3MKK3RyYWMvSWN1Q29kZVRvb2xzLzAuMTEvKi5lZ2ctaW5mbwordHJhYy9JY3VDb2RlVG9vbHMvMC4xMS9idWlsZAordHJhYy9JY3VDb2RlVG9vbHMvMC4xMS9pY3Vjb2RldG9vbHMvKi5weWMKK3RyYWMvSWN1Q29kZVRvb2xzLzAuMTIvKi5lZ2ctaW5mbwordHJhYy9JY3VDb2RlVG9vbHMvMC4xMi9idWlsZAordHJhYy9JY3VDb2RlVG9vbHMvMC4xMi9pY3Vjb2RldG9vbHMvKi5weWMKK3VuaWNvZGUvYy9nZW5iaWRpLyouZAordW5pY29kZS9jL2dlbmJpZGkvKi5vCit1bmljb2RlL2MvZ2VuYmlkaS8qLnBkYgordW5pY29kZS9jL2dlbmJpZGkvKi5wbGcKK3VuaWNvZGUvYy9nZW5iaWRpL0RlYnVnCit1bmljb2RlL2MvZ2VuYmlkaS9NYWtlZmlsZQordW5pY29kZS9jL2dlbmJpZGkvUmVsZWFzZQordW5pY29kZS9jL2dlbmJpZGkvZGVidWcKK3VuaWNvZGUvYy9nZW5iaWRpL2dlbmJpZGkKK3VuaWNvZGUvYy9nZW5iaWRpL2dlbmJpZGkuWzAtOV0KK3VuaWNvZGUvYy9nZW5iaWRpL2dlbmJpZGkudmNwcm9qLiouKi51c2VyCit1bmljb2RlL2MvZ2VuYmlkaS9yZWxlYXNlCit1bmljb2RlL2MvZ2VuYmlkaS94NjQKK3VuaWNvZGUvYy9nZW5iaWRpL3g4NgordW5pY29kZS9jL2dlbmNhc2UvKi5kCit1bmljb2RlL2MvZ2VuY2FzZS8qLm5jYgordW5pY29kZS9jL2dlbmNhc2UvKi5vCit1bmljb2RlL2MvZ2VuY2FzZS8qLm9wdAordW5pY29kZS9jL2dlbmNhc2UvKi5wZGIKK3VuaWNvZGUvYy9nZW5jYXNlLyoucGxnCit1bmljb2RlL2MvZ2VuY2FzZS9EZWJ1ZwordW5pY29kZS9jL2dlbmNhc2UvTWFrZWZpbGUKK3VuaWNvZGUvYy9nZW5jYXNlL1JlbGVhc2UKK3VuaWNvZGUvYy9nZW5jYXNlL2RlYnVnCit1bmljb2RlL2MvZ2VuY2FzZS9nZW5jYXNlCit1bmljb2RlL2MvZ2VuY2FzZS9nZW5jYXNlLlswLTldCit1bmljb2RlL2MvZ2VuY2FzZS9nZW5jYXNlLnZjcHJvai4qLioudXNlcgordW5pY29kZS9jL2dlbmNhc2UvcmVsZWFzZQordW5pY29kZS9jL2dlbmNhc2UveDY0Cit1bmljb2RlL2MvZ2VuY2FzZS94ODYKK3VuaWNvZGUvYy9nZW5uYW1lcy8qLmQKK3VuaWNvZGUvYy9nZW5uYW1lcy8qLm5jYgordW5pY29kZS9jL2dlbm5hbWVzLyoubwordW5pY29kZS9jL2dlbm5hbWVzLyoub3B0Cit1bmljb2RlL2MvZ2VubmFtZXMvKi5wZGIKK3VuaWNvZGUvYy9nZW5uYW1lcy8qLnBsZwordW5pY29kZS9jL2dlbm5hbWVzL0RlYnVnCit1bmljb2RlL2MvZ2VubmFtZXMvTWFrZWZpbGUKK3VuaWNvZGUvYy9nZW5uYW1lcy9SZWxlYXNlCit1bmljb2RlL2MvZ2VubmFtZXMvZGVidWcKK3VuaWNvZGUvYy9nZW5uYW1lcy9nZW5uYW1lcwordW5pY29kZS9jL2dlbm5hbWVzL2dlbm5hbWVzLlswLTldCit1bmljb2RlL2MvZ2VubmFtZXMvZ2VubmFtZXMudmNwcm9qLiouKi51c2VyCit1bmljb2RlL2MvZ2VubmFtZXMvcmVsZWFzZQordW5pY29kZS9jL2dlbm5hbWVzL3g2NAordW5pY29kZS9jL2dlbm5hbWVzL3g4NgordW5pY29kZS9jL2dlbm5vcm0vKi5kCit1bmljb2RlL2MvZ2Vubm9ybS8qLm8KK3VuaWNvZGUvYy9nZW5ub3JtLyoucGRiCit1bmljb2RlL2MvZ2Vubm9ybS8qLnBsZwordW5pY29kZS9jL2dlbm5vcm0vRGVidWcKK3VuaWNvZGUvYy9nZW5ub3JtL01ha2VmaWxlCit1bmljb2RlL2MvZ2Vubm9ybS9SZWxlYXNlCit1bmljb2RlL2MvZ2Vubm9ybS9kZWJ1ZwordW5pY29kZS9jL2dlbm5vcm0vZ2Vubm9ybQordW5pY29kZS9jL2dlbm5vcm0vZ2Vubm9ybS5bMC05XQordW5pY29kZS9jL2dlbm5vcm0vZ2Vubm9ybS52Y3Byb2ouKi4qLnVzZXIKK3VuaWNvZGUvYy9nZW5ub3JtL3JlbGVhc2UKK3VuaWNvZGUvYy9nZW5ub3JtL3g2NAordW5pY29kZS9jL2dlbm5vcm0veDg2Cit1bmljb2RlL2MvZ2VucG5hbWUvKi5kCit1bmljb2RlL2MvZ2VucG5hbWUvKi5vCit1bmljb2RlL2MvZ2VucG5hbWUvKi5wZGIKK3VuaWNvZGUvYy9nZW5wbmFtZS8qLnBsZwordW5pY29kZS9jL2dlbnBuYW1lL0RlYnVnCit1bmljb2RlL2MvZ2VucG5hbWUvTWFrZWZpbGUKK3VuaWNvZGUvYy9nZW5wbmFtZS9SZWxlYXNlCit1bmljb2RlL2MvZ2VucG5hbWUvZGVidWcKK3VuaWNvZGUvYy9nZW5wbmFtZS9nZW5wbmFtZQordW5pY29kZS9jL2dlbnBuYW1lL2dlbnBuYW1lLnZjcHJvai4qLioudXNlcgordW5pY29kZS9jL2dlbnBuYW1lL3JlbGVhc2UKK3VuaWNvZGUvYy9nZW5wbmFtZS94NjQKK3VuaWNvZGUvYy9nZW5wbmFtZS94ODYKK3VuaWNvZGUvYy9nZW5wcm9wcy8qLmQKK3VuaWNvZGUvYy9nZW5wcm9wcy8qLm5jYgordW5pY29kZS9jL2dlbnByb3BzLyoubwordW5pY29kZS9jL2dlbnByb3BzLyoub3B0Cit1bmljb2RlL2MvZ2VucHJvcHMvKi5wZGIKK3VuaWNvZGUvYy9nZW5wcm9wcy8qLnBsZwordW5pY29kZS9jL2dlbnByb3BzL0RlYnVnCit1bmljb2RlL2MvZ2VucHJvcHMvTWFrZWZpbGUKK3VuaWNvZGUvYy9nZW5wcm9wcy9SZWxlYXNlCit1bmljb2RlL2MvZ2VucHJvcHMvZGVidWcKK3VuaWNvZGUvYy9nZW5wcm9wcy9nZW5wcm9wcwordW5pY29kZS9jL2dlbnByb3BzL2dlbnByb3BzLlswLTldCit1bmljb2RlL2MvZ2VucHJvcHMvZ2VucHJvcHMudmNwcm9qLiouKi51c2VyCit1bmljb2RlL2MvZ2VucHJvcHMvcmVsZWFzZQordW5pY29kZS9jL2dlbnByb3BzL3g2NAordW5pY29kZS9jL2dlbnByb3BzL3g4NgordW5pY29kZS9jL2dlbnVjYS8qLmQKK3VuaWNvZGUvYy9nZW51Y2EvKi5vCit1bmljb2RlL2MvZ2VudWNhLyoucGRiCit1bmljb2RlL2MvZ2VudWNhL0RlYnVnCit1bmljb2RlL2MvZ2VudWNhL01ha2VmaWxlCit1bmljb2RlL2MvZ2VudWNhL1JlbGVhc2UKK3VuaWNvZGUvYy9nZW51Y2EvZGVidWcKK3VuaWNvZGUvYy9nZW51Y2EvZ2VudWNhCit1bmljb2RlL2MvZ2VudWNhL2dlbnVjYS44Cit1bmljb2RlL2MvZ2VudWNhL2dlbnVjYS52Y3Byb2ouKi4qLnVzZXIKK3VuaWNvZGUvYy9nZW51Y2EvcmVsZWFzZQordW5pY29kZS9jL2dlbnVjYS94NjQKK3VuaWNvZGUvYy9nZW51Y2EveDg2Cit1bmljb2RldG9vbHMvY29tL2libS9yYm0vbGliCmRpZmYgLS1naXQgYS9jb2xwcm9iZS9NYWtlZmlsZS5pbiBiL2NvbHByb2JlL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YmVmZmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb2xwcm9iZS9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDgxIEBACisjIyBNYWtlZmlsZS5pbiBmb3IgSUNVIC0gZXh0cmEvY29scHJvYmUKKyMjIENvcHlyaWdodCAoYykgMjAwMSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQKKyMjIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworIyMgU291cmNlIGRpcmVjdG9yeSBpbmZvcm1hdGlvbgorc3JjZGlyID0gQHNyY2RpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKKwordG9wX2J1aWxkZGlyID0gLi4vLi4KKworaW5jbHVkZSAkKHRvcF9idWlsZGRpcikvaWN1ZGVmcy5taworCisjIyBCdWlsZCBkaXJlY3RvcnkgaW5mb3JtYXRpb24KK3N1YmRpciA9IGV4dHJhL2NvbHByb2JlCisKKyMjIEV4dHJhIGZpbGVzIHRvIHJlbW92ZSBmb3IgJ21ha2UgY2xlYW4nCitDTEVBTkZJTEVTID0gKn4gJChERVBTKQorCisjIyBUYXJnZXQgaW5mb3JtYXRpb24KK1RBUkdFVCA9IGNvbHByb2JlIAorTE9OR05BTUUgPSBsb25nbmFtZQorCitDUFBGTEFHUyArPSAtSSQodG9wX3NyY2RpcikvY29tbW9uIC1JJCh0b3Bfc3JjZGlyKS9pMThuIC1JJCh0b3Bfc3JjZGlyKS90b29scy90b29sdXRpbCAtSSQodG9wX3NyY2RpcikvaW8KK0xJQlMgPSAkKExJQklDVUkxOE4pICQoTElCSUNVVUMpICQoTElCVVNURElPKSAkKExJQklDVVRPT0xVVElMKSAkKERFRkFVTFRfTElCUykgJChMSUJfTSkKKworT0JKRUNUUyA9IGNvbHByb2JlTmV3Lm8gbGluZS5vIHNvcnRlZGxpbmVzLm8gc3RyZW5ndGhwcm9iZS5vIHVwcmludGVyLm8gCitMT05HTkFNRV9PQkogPSBsb25nbmFtZS5vCisKK0RFUFMgPSAkKE9CSkVDVFM6Lm89LmQpCitMT05HTkFNRV9ERVBTID0gJChMT05HTkFNRV9PQko6Lm89LmQpCisKKyMjIExpc3Qgb2YgcGhvbnkgdGFyZ2V0cworLlBIT05ZIDogYWxsIGFsbC1sb2NhbCBpbnN0YWxsIGluc3RhbGwtbG9jYWwgY2xlYW4gY2xlYW4tbG9jYWwJXAorZGlzdGNsZWFuIGRpc3RjbGVhbi1sb2NhbCBkaXN0IGRpc3QtbG9jYWwgY2hlY2sgY2hlY2stbG9jYWwKKworIyMgQ2xlYXIgc3VmZml4IGxpc3QKKy5TVUZGSVhFUyA6CisKKyMjIExpc3Qgb2Ygc3RhbmRhcmQgdGFyZ2V0cworYWxsOiBhbGwtbG9jYWwKK2luc3RhbGw6IGluc3RhbGwtbG9jYWwKK2NsZWFuOiBjbGVhbi1sb2NhbAorZGlzdGNsZWFuIDogZGlzdGNsZWFuLWxvY2FsCitkaXN0OiBkaXN0LWxvY2FsCitjaGVjazogYWxsIGNoZWNrLWxvY2FsCisKK2FsbC1sb2NhbDogJChUQVJHRVQpCisKK2luc3RhbGwtbG9jYWw6CisKK2Rpc3QtbG9jYWw6CisKK2NsZWFuLWxvY2FsOgorCXRlc3QgLXogIiQoQ0xFQU5GSUxFUykiIHx8ICQoUk1WKSAkKENMRUFORklMRVMpCisJJChSTVYpICQoT0JKRUNUUykgJChUQVJHRVQpCisKK2Rpc3RjbGVhbi1sb2NhbDogY2xlYW4tbG9jYWwKKwkkKFJNVikgTWFrZWZpbGUKKworY2hlY2stbG9jYWw6IGFsbC1sb2NhbAorCitNYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCWNkICQodG9wX2J1aWxkZGlyKSBcCisJICYmIENPTkZJR19GSUxFUz0kKHN1YmRpcikvJEAgQ09ORklHX0hFQURFUlM9ICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cworCiskKFRBUkdFVCkgOiAkKE9CSkVDVFMpCisJJChMSU5LLmNjKSAtbyAkQCAkXiAkKExJQlMpCisKKyQoTE9OR05BTUUpIDogJChMT05HTkFNRV9PQkopCisJJChMSU5LLmNjKSAtbyAkQCAkXiAkKExJQlMpCisKK2ludm9rZToKKwlJQ1VfREFUQT0kJHtJQ1VfREFUQTotJCh0b3BfYnVpbGRkaXIpL2RhdGEvfSBUWj1QU1Q4UERUICQoSU5WT0tFKSAkKElOVk9DQVRJT04pCisKK2lmZXEgKCwkKE1BS0VDTURHT0FMUykpCistaW5jbHVkZSAkKERFUFMpCitlbHNlCitpZm5lcSAoJChwYXRzdWJzdCAlY2xlYW4sLCQoTUFLRUNNREdPQUxTKSksKQorLWluY2x1ZGUgJChERVBTKQorZW5kaWYKK2VuZGlmCmRpZmYgLS1naXQgYS9jb2xwcm9iZS9jb2xwcm9iZS5jcHAgYi9jb2xwcm9iZS9jb2xwcm9iZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE3NTFiZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbHByb2JlL2NvbHByb2JlLmNwcApAQCAtMCwwICsxLDE3MzAgQEAKKy8qCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgQ29weXJpZ2h0IChDKSAyMDAzLCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzCisqICAgQ29ycG9yYXRpb24gYW5kIG90aGVycy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIEZpbGUgY29scHJvYmUuY3BwCisqCisqIE1vZGlmaWNhdGlvbiBIaXN0b3J5OgorKgorKiAgIERhdGUgICAgICAgIE5hbWUgICAgICAgIERlc2NyaXB0aW9uCisqICAgMDMvMTgvMjAwMyAgd2VpdiAgICAgICAgQ3JlYXRpb24uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisjaW5jbHVkZSAidW9wdGlvbnMuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3Vjb2wuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3Vjb2xlaXRyLmgiCisjaW5jbHVkZSAidW5pY29kZS91cmVzLmgiCisjaW5jbHVkZSAidW5pY29kZS91bmlzZXQuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3VzZXRpdGVyLmgiCisjaW5jbHVkZSAidW5pY29kZS91c3RyaW5nLmgiCisjaW5jbHVkZSAidW5pY29kZS91Y2hhci5oIgorI2luY2x1ZGUgInVuaWNvZGUvdXNjcmlwdC5oIgorI2luY2x1ZGUgInVwcm9wcy5oIgorI2luY2x1ZGUgImhhc2guaCIKKyNpbmNsdWRlICJ1Y29sX2ltcC5oIgorCisjaW5jbHVkZSAidW5pY29kZS91c3RkaW8uaCIKKyNpbmNsdWRlICJ1bmljb2RlL3V0cmFucy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxpby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpbmNsdWRlICJjb2xwcm9iZS5oIgorCisKKyNpZmRlZiBXSU4zMgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbHNlCisvLworLy8gIFN0dWJzIGZvciBXaW5kb3dzIEFQSSBmdW5jdGlvbnMgd2hlbiBidWlsZGluZyBvbiBVTklYZXMuCisvLwordHlwZWRlZiBpbnQgRFdPUkQ7CitpbmxpbmUgaW50IENvbXBhcmVTdHJpbmdXKERXT1JELCBEV09SRCwgVUNoYXIgKiwgaW50LCBVQ2hhciAqLCBpbnQpIHtyZXR1cm4gMDt9OworI2luY2x1ZGUgPHN5cy90aW1lLmg+Cit1bnNpZ25lZCBsb25nIHRpbWVHZXRUaW1lKCkgeworICAgIHN0cnVjdCB0aW1ldmFsIHQ7CisgICAgZ2V0dGltZW9mZGF5KCZ0LCAwKTsKKyAgICB1bnNpZ25lZCBsb25nIHZhbCA9IHQudHZfc2VjICogMTAwMDsgIC8vIExldCBpdCBvdmVyZmxvdy4gIFdobyBjYXJlcy4KKyAgICB2YWwgKz0gdC50dl91c2VjIC8gMTAwMDsKKyAgICByZXR1cm4gdmFsOworfTsKK2lubGluZSBpbnQgTENNYXBTdHJpbmdXKERXT1JELCBEV09SRCwgVUNoYXIgKiwgaW50LCBVQ2hhciAqLCBpbnQpIHtyZXR1cm4gMDt9OworY29uc3QgaW50IExDTUFQX1NPUlRLRVkgPSAwOworI2RlZmluZSBNQUtFTENJRChhLGIpIDAKK2NvbnN0IGludCBTT1JUX0RFRkFVTFQgPSAwOworI2VuZGlmCisKKyNpbmNsdWRlICJsaW5lLmgiCisKK3N0YXRpYyBVQm9vbCBnVmVyYm9zZSA9IEZBTFNFOworc3RhdGljIFVCb29sIGdEZWJ1ZyA9IEZBTFNFOworc3RhdGljIFVCb29sIGdRdWlldCA9IEZBTFNFOworc3RhdGljIFVCb29sIGdFeGVtcGxhciA9IEZBTFNFOworCitEV09SRCAgICAgICAgICBnV2luTENJRDsKK2ludCAgICAgICAgICAgIGdDb3VudDsKK0xpbmUgICAgICAgICAgKipnSUNVTGluZXM7CitVQ29sbGF0b3IgICAgICpnQ29sOworVUNvbGxhdG9yICAgICAqZ1VDQTsKK0xpbmUgICAgICAgICAgc291cmNlOworTGluZSAgICAgICAgICB0YXJnZXQ7CitMaW5lICAgICAgICAgICpnU291cmNlID0gJnNvdXJjZTsKK0xpbmUgICAgICAgICAgKmdUYXJnZXQgPSAmdGFyZ2V0OworSGFzaHRhYmxlICAgICBnRWxlbWVudHMoRkFMU0UpOworSGFzaHRhYmxlICAgICBnRXhwYW5zaW9ucyhGQUxTRSk7CitDb21wYXJlRm4gZ0NvbXBhcmVyOworCitjb25zdCBVQ2hhciBzZXBhcmF0b3JDaGFyID0gMHgwMDMwOworCitVRklMRSAqb3V0ID0gTlVMTDsKK1VGSUxFICplcnIgPSBOVUxMOworVUZJTEUgKmxvZyA9IE5VTEw7IAorCitjb25zdCBjaGFyICpwcm9nTmFtZSA9ICJjb2xwcm9iZSI7CisKK2NvbnN0IGNoYXIgKmdMb2NhbGUgPSBOVUxMOworLy9jaGFyIHBsYXRmb3JtWzI1Nl07CitpbnQzMl90IHBsYXRmb3JtSW5kZXggPSAtMTsKK2ludDMyX3QgZ1BsYXRmb3JtTm8gPSAwOworaW50MzJfdCBnUGxhdGZvcm1JbmRleGVzWzEwXTsKK2ludDMyX3QgZ0xvY2FsZU5vID0gMDsKK2NvbnN0IGNoYXIqIGdMb2NhbGVzWzEwMF07CitVQm9vbCBnUnVsZXNTdGRpbiA9IEZBTFNFOworCitlbnVtIHsKKyAgSEVMUDEsCisgICAgSEVMUDIsCisgICAgVkVSQk9TRSwKKyAgICBRVUlFVCwKKyAgICBWRVJTSU9OLAorICAgIElDVURBVEFESVIsCisgICAgQ09QWVJJR0hULAorICAgIExPQ0FMRSwKKyAgICBQTEFURk9STSwKKyAgICBERUJVRywgCisgICAgRVhFTVBMQVIsCisgICAgUlVMRVNTVERJTgorfTsKKworVU9wdGlvbiBvcHRpb25zW109eworICAvKjAqLyBVT1BUSU9OX0hFTFBfSCwKKyAgLyoxKi8gVU9QVElPTl9IRUxQX1FVRVNUSU9OX01BUkssCisgIC8qMiovIFVPUFRJT05fVkVSQk9TRSwKKyAgLyozKi8gVU9QVElPTl9RVUlFVCwKKyAgLyo0Ki8gVU9QVElPTl9WRVJTSU9OLAorICAvKjUqLyBVT1BUSU9OX0lDVURBVEFESVIsCisgIC8qNiovIFVPUFRJT05fQ09QWVJJR0hULAorICAvKjcqLyBVT1BUSU9OX0RFRigibG9jYWxlIiwgJ2wnLCBVT1BUX1JFUVVJUkVTX0FSRyksCisgIC8qOCovIFVPUFRJT05fREVGKCJwbGF0Zm9ybSIsICdwJywgVU9QVF9SRVFVSVJFU19BUkcpLAorICAvKjkqLyBVT1BUSU9OX0RFRigiZGVidWciLCAnRCcsIFVPUFRfTk9fQVJHKSwKKyAgLyoxMCovIFVPUFRJT05fREVGKCJleGVtcGxhciIsICdFJywgVU9QVF9OT19BUkcpLAorICAvKjExKi8gVU9QVElPTl9ERUYoInJ1bGVzc3RkaW4iLCAnUicsIFVPUFRfTk9fQVJHKQorfTsKKworaW50IFdpbnN0cmNtcChjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKSB7CisgICAgZ0NvdW50Kys7CisgICAgaW50IHQ7CisgICAgdCA9IENvbXBhcmVTdHJpbmdXKGdXaW5MQ0lELCAwLCAKKyAgICAgICgqKExpbmUgKiopYSktPm5hbWUsICgqKExpbmUgKiopYSktPmxlbiwgCisgICAgICAoKihMaW5lICoqKWIpLT5uYW1lLCAoKihMaW5lICoqKWIpLT5sZW4pOworICAgIHJldHVybiB0LTI7Cit9CisKK2ludCBJQ1VzdHJjbXAoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikgeworICAgIGdDb3VudCsrOworICAgIFVDb2xsYXRpb25SZXN1bHQgdDsKKyAgICB0ID0gdWNvbF9zdHJjb2xsKGdDb2wsIAorICAgICAgKCooTGluZSAqKilhKS0+bmFtZSwgKCooTGluZSAqKilhKS0+bGVuLCAgCisgICAgICAoKihMaW5lICoqKWIpLT5uYW1lLCAoKihMaW5lICoqKWIpLT5sZW4pOworICAgIGlmICh0ID09IFVDT0xfTEVTUykgcmV0dXJuIC0xOworICAgIGlmICh0ID09IFVDT0xfR1JFQVRFUikgcmV0dXJuICsxOworICAgIHJldHVybiAwOworfQorCitzdHJ1Y3QgeworICBjb25zdCBjaGFyKiBuYW1lOworICBDb21wYXJlRm4gY29tcGFyZXI7Cit9IHBsYXRmb3Jtc1tdID0geworICB7ICJpY3UiLCBJQ1VzdHJjbXAgfSwKKyAgeyAid2luIiwgV2luc3RyY21wfQorfTsKKworCit2b2lkIGRlbGV0ZUxpbmVFbGVtZW50KHZvaWQgKmxpbmUpIHsKKyAgZGVsZXRlKChMaW5lICopbGluZSk7Cit9CisKK3ZvaWQgc3RyaW5nVG9Mb3dlcihjaGFyICpzdHJpbmcpIHsKKyAgdWludDMyX3QgaSA9IDA7CisgIGZvcihpID0gMDsgaSA8IHN0cmxlbihzdHJpbmcpOyBpKyspIHsKKyAgICBzdHJpbmdbaV0gPSB0b2xvd2VyKHN0cmluZ1tpXSk7CisgIH0KK30KKwordm9pZCB1c2FnZShjb25zdCBjaGFyICpuYW1lKSB7CisgIHVfZnByaW50ZihvdXQsICJVc2FnZTogJXMgLS1sb2NhbGUgbG9jX25hbWUgLS1wbGF0Zm9ybSBwbGF0Zm9ybVxuIiwgbmFtZSk7Cit9CisKK3ZvaWQgbGlzdEtub3duUGxhdGZvcm1zKCkgeworICBpbnQzMl90IGkgPSAwOworICB1X2ZwcmludGYoZXJyLCAiS25vd24gcGxhdGZvcm1zOlxuIik7CisgIGZvcihpID0gMDsgaSA8IHNpemVvZihwbGF0Zm9ybXMpL3NpemVvZihwbGF0Zm9ybXNbMF0pOyBpKyspIHsKKyAgICB1X2ZwcmludGYoZXJyLCAiXHQlc1xuIiwgcGxhdGZvcm1zW2ldKTsKKyAgfQorfQorCit2b2lkIGFkZFBsYXRmb3JtKGNvbnN0IGNoYXIgKnBsYXRmb3JtKSB7CisgIGludDMyX3QgaTsKKyAgLy9zdHJpbmdUb0xvd2VyKHBsYXRmb3JtKTsKKyAgaW50MzJfdCBvbGRQbGF0Zm9ybU5vID0gZ1BsYXRmb3JtTm87CisKKyAgZm9yKGkgPSAwOyBpIDwgc2l6ZW9mKHBsYXRmb3Jtcykvc2l6ZW9mKHBsYXRmb3Jtc1swXSk7IGkrKykgeworICAgIGlmKHN0cmNtcChwbGF0Zm9ybSwgcGxhdGZvcm1zW2ldLm5hbWUpID09IDApIHsKKyAgICAgIGdQbGF0Zm9ybUluZGV4ZXNbZ1BsYXRmb3JtTm8rK10gPSBpOworICAgIH0KKyAgfQorICBpZihnUGxhdGZvcm1ObyA9PSBvbGRQbGF0Zm9ybU5vKSB7CisgICAgdV9mcHJpbnRmKGVyciwgIlVua25vd24gcGxhdGZvcm0gJXNcbiIsIHBsYXRmb3JtKTsKKyAgICBsaXN0S25vd25QbGF0Zm9ybXMoKTsKKyAgfQorfQorCit2b2lkIHByb2Nlc3NBcmdzKGludCBhcmdjLCBjaGFyKiBhcmd2W10sIFVFcnJvckNvZGUgJnN0YXR1cykKK3sKKyAgaW50MzJfdCBpID0gMDsKKyAgVV9NQUlOX0lOSVRfQVJHUyhhcmdjLCBhcmd2KTsKKworICBhcmdjID0gdV9wYXJzZUFyZ3MoYXJnYywgYXJndiwgKGludDMyX3QpKHNpemVvZihvcHRpb25zKS9zaXplb2Yob3B0aW9uc1swXSkpLCBvcHRpb25zKTsKKworICBpZihhcmdjIDwgMCkgeworICAgIHVfZnByaW50ZihlcnIsICJVbmtub3duIG9wdGlvbjogJXNcbiIsIGFyZ3ZbLWFyZ2NdKTsKKyAgICB1c2FnZShwcm9nTmFtZSk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYob3B0aW9uc1swXS5kb2VzT2NjdXIgfHwgb3B0aW9uc1sxXS5kb2VzT2NjdXIpIHsKKyAgICB1c2FnZShwcm9nTmFtZSk7CisgICAgcmV0dXJuOworICB9CisgIGlmKG9wdGlvbnNbVkVSQk9TRV0uZG9lc09jY3VyKSB7CisgICAgZ1ZlcmJvc2UgPSBUUlVFOworICB9CisgIGlmKG9wdGlvbnNbREVCVUddLmRvZXNPY2N1cikgeworICAgIGdEZWJ1ZyA9IFRSVUU7CisgICAgZ1ZlcmJvc2UgPSBUUlVFOworICB9CisgIGlmKG9wdGlvbnNbRVhFTVBMQVJdLmRvZXNPY2N1cikgeworICAgIGdFeGVtcGxhciA9IFRSVUU7CisgIH0KKyAgaWYob3B0aW9uc1tRVUlFVF0uZG9lc09jY3VyKSB7CisgICAgZ1F1aWV0ID0gVFJVRTsKKyAgfQorLyoKKyAgZm9yKGkgPSA4OyBpIDwgOTsgaSsrKSB7CisgICAgaWYoIW9wdGlvbnNbaV0uZG9lc09jY3VyKSB7CisgICAgICB1X2ZwcmludGYoZXJyLCAiT3B0aW9uICVzIGlzIHJlcXVpcmVkIVxuIiwgb3B0aW9uc1tpXS5sb25nTmFtZSk7CisgICAgICB1c2FnZShwcm9nTmFtZSk7CisgICAgICBzdGF0dXMgPSBVX0lMTEVHQUxfQVJHVU1FTlRfRVJST1I7CisgICAgfQorICAgIGlmKG9wdGlvbnNbaV0udmFsdWUgPT0gTlVMTCkgeworICAgICAgdV9mcHJpbnRmKGVyciwgIk9wdGlvbiAlcyBuZWVkcyBhbiBhcmd1bWVudCFcbiIsIG9wdGlvbnNbaV0ubG9uZ05hbWUpOworICAgICAgdXNhZ2UocHJvZ05hbWUpOworICAgICAgc3RhdHVzID0gVV9JTExFR0FMX0FSR1VNRU5UX0VSUk9SOworICAgIH0KKyAgfQorKi8KKyAgLy8gQVNDSUkgYmFzZWQgb3B0aW9ucyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZQorICAvLyB0aGlzIGlzIGZvciB0ZXN0aW5nIHB1cnBvc2VzLCB3aWxsIGFsbG93IHRvIGxvYWQKKyAgLy8gdXAgSUNVIHJ1bGVzIGFuZCB0aGVuIHBva2UgdGhyb3VnaCB0aGVtLgorICAvLyBJbiB0aGF0IGNhc2UsIHdlIHRlc3Qgb25seSBJQ1UgYW5kIGRvbid0IG5lZWQgCisgIC8vIGEgbG9jYWxlLgorICBpZihvcHRpb25zW1JVTEVTU1RESU5dLmRvZXNPY2N1cikgeworICAgIGdSdWxlc1N0ZGluID0gVFJVRTsKKyAgICBhZGRQbGF0Zm9ybSgiaWN1Iik7CisgICAgcmV0dXJuOworICB9IAorCisgIGlmKG9wdGlvbnNbTE9DQUxFXS5kb2VzT2NjdXIpIHsKKyAgICBnTG9jYWxlID0gb3B0aW9uc1tMT0NBTEVdLnZhbHVlOworICB9IGVsc2UgeworICAgIGZvcihpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworICAgICAgZ0xvY2FsZXNbZ0xvY2FsZU5vKytdID0gYXJndltpXTsKKyAgICB9CisgIH0KKyAgaWYob3B0aW9uc1tQTEFURk9STV0uZG9lc09jY3VyKSB7CisgICAgLy9zdHJjcHkocGxhdGZvcm0sIG9wdGlvbnNbUExBVEZPUk1dLnZhbHVlKTsKKyAgICAvL2FkZFBsYXRmb3JtKCJpY3UiKTsKKyAgICBhZGRQbGF0Zm9ybShvcHRpb25zW1BMQVRGT1JNXS52YWx1ZSk7CisgIH0gZWxzZSB7IC8vIHRoZXJlIGlzIGEgbGlzdCBvZiBwbGF0Zm9ybXMgCisgICAgdV9mcHJpbnRmKGVyciwgIk9wdGlvbiAlcyBpcyByZXF1aXJlZCFcbiIsIG9wdGlvbnNbaV0ubG9uZ05hbWUpOworICAgIHVzYWdlKHByb2dOYW1lKTsKKyAgICBzdGF0dXMgPSBVX0lMTEVHQUxfQVJHVU1FTlRfRVJST1I7CisgIH0KKworICAvLworICAvLyAgU2V0IHVwIGEgV2luZG93cyBMQ0lECisgIC8vCisgIGdXaW5MQ0lEID0gdWxvY19nZXRMQ0lEKGdMb2NhbGUpOworICAvKgorICBpZiAoZ0xvY2FsZSAhPSAwKSB7CisgICAgICBnV2luTENJRCA9IE1BS0VMQ0lEKGdMb2NhbGUsIFNPUlRfREVGQVVMVCk7CisgIH0KKyAgZWxzZSB7CisgICAgICBnV2luTENJRCA9IHVsb2NfZ2V0TENJRChnTG9jYWxlKTsKKyAgfQorICAqLworCit9CisKK3ZvaWQgcHJpbnRSdWxlcyhjb25zdCBVQ2hhciAqbmFtZSwgaW50MzJfdCBsZW4sIFVGSUxFICpmaWxlKSB7CisgIC8vIHZlcnkgcnVkaW1lbnRhcnkgcHJldHR5IHJ1bGVzIHByaW50CisgIGludDMyX3QgaSA9IDA7CisgIFVDaGFyIHRvUHJpbnRbMTYzODRdOworICBpbnQzMl90IHRvUHJpbnRJbmRleCA9IDA7CisgIGZvcihpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgaWYobmFtZVtpXSA9PSAweDAwMjYpIHsKKyAgICAgIGlmKHRvUHJpbnRJbmRleCkgeworICAgICAgICB0b1ByaW50W3RvUHJpbnRJbmRleF0gPSAwOworICAgICAgICB1X2ZwcmludGYoZmlsZSwgIiVVXG4iLCB0b1ByaW50KTsKKyAgICAgICAgdG9QcmludEluZGV4ID0gMDsKKyAgICAgICAgdG9QcmludFt0b1ByaW50SW5kZXgrK10gPSBuYW1lW2ldOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdG9QcmludFt0b1ByaW50SW5kZXgrK10gPSBuYW1lW2ldOworICAgICAgfSAKKyAgICB9IGVsc2UgeworICAgICAgdG9QcmludFt0b1ByaW50SW5kZXgrK10gPSBuYW1lW2ldOworICAgIH0KKyAgfQorICBpZih0b1ByaW50SW5kZXgpIHsKKyAgICB0b1ByaW50W3RvUHJpbnRJbmRleF0gPSAwOworICAgIHVfZnByaW50ZihmaWxlLCAiJVVcbiIsIHRvUHJpbnQpOworICAgIHRvUHJpbnRJbmRleCA9IDA7CisgIH0KKworCit9CisKK3ZvaWQgZXNjYXBlU3RyaW5nKGNvbnN0IFVDaGFyICpuYW1lLCBpbnQzMl90IGxlbiwgVUZJTEUgKmZpbGUpIHsKKyAgdV9mcHJpbnRmKGZpbGUsICIlVSIsIG5hbWUpOworLyoKKyAgaW50MzJfdCBqID0gMDsKKyAgZm9yKGogPSAwOyBqIDwgbGVuOyBqKyspIHsKKyAgICBpZihuYW1lW2pdID49IDB4MjAgJiYgbmFtZVtqXSA8IDB4ODApIHsKKyAgICAgIHVfZnByaW50ZihmaWxlLCAiJWMiLCBuYW1lW2pdKTsKKyAgICB9IGVsc2UgeworICAgICAgdV9mcHJpbnRmKGZpbGUsICJcXHUlMDRYIiwgbmFtZVtqXSk7CisgICAgfQorICB9CisqLworfQordm9pZCBlc2NhcGVBTGluZShMaW5lICpsaW5lLCBVRklMRSAqZmlsZSkgeworICBlc2NhcGVTdHJpbmcobGluZS0+bmFtZSwgbGluZS0+bGVuLCBmaWxlKTsKK30KKwordm9pZCBlc2NhcGVFeHBhbnNpb24oTGluZSAqbGluZSwgVUZJTEUgKmZpbGUpIHsKKyAgZXNjYXBlU3RyaW5nKGxpbmUtPmV4cGFuc2lvblN0cmluZywgbGluZS0+ZXhwTGVuLCBmaWxlKTsKK30KKwordm9pZCBzaG93TmFtZXMoTGluZSAqbGluZSwgVUZJTEUgKmZpbGUpIHsKKyAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisgIGludDMyX3QgaiA9IDA7CisgIGNoYXIgY2hhck5hbWVbMjU2XTsKKyAgZm9yKGogPSAwOyBqIDwgbGluZS0+bGVuOyBqKyspIHsKKyAgICB1X2NoYXJOYW1lKGxpbmUtPm5hbWVbal0sIFVfRVhURU5ERURfQ0hBUl9OQU1FLCBjaGFyTmFtZSwgMjU2LCAmc3RhdHVzKTsKKyAgICB1X2ZwcmludGYoZmlsZSwgIiVzICIsIGNoYXJOYW1lKTsKKyAgfQorfQorCit2b2lkIHNldEFycmF5KExpbmUgKiphcnJheSwgTGluZSAqY29udGVudHMsIGludDMyX3Qgc2l6ZSkgeworICBpbnQzMl90IGkgPSAwOworICBmb3IoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICBhcnJheVtpXSA9IGNvbnRlbnRzK2k7CisgIH0KK30KKworLy8gc2V0IGFuIGFycmF5IGZyb20gYSBIYXNodGFibGUKK2ludDMyX3QgCitzZXRBcnJheShMaW5lICoqYXJyYXksIEhhc2h0YWJsZSAqdGFibGUgPSAmZ0VsZW1lbnRzKSB7CisgIGludDMyX3Qgc2l6ZSA9IHRhYmxlLT5jb3VudCgpOworICBpbnQzMl90IGhhc2hJbmRleCA9IC0xOworICBjb25zdCBVSGFzaEVsZW1lbnQgKmhhc2hFbGVtZW50ID0gTlVMTDsKKyAgaW50MzJfdCBjb3VudCA9IDA7CisgIHdoaWxlKChoYXNoRWxlbWVudCA9IHRhYmxlLT5uZXh0RWxlbWVudChoYXNoSW5kZXgpKSAhPSBOVUxMKSB7CisgICAgYXJyYXlbY291bnQrK10gPSAoTGluZSAqKWhhc2hFbGVtZW50LT52YWx1ZS5wb2ludGVyOworICB9CisgIHJldHVybiBzaXplOworfQorCitVQm9vbCB0cnlTd2FtcGVkKExpbmUgKipzbWFsbGVyLCBMaW5lICoqZ3JlYXRlciwgVUNoYXIgY2hhcnNbMl0sIENvbXBhcmVGbiBjb21wYXJlcikgeworICB1X3N0cmNweShnU291cmNlLT5uYW1lLCAoKnNtYWxsZXIpLT5uYW1lKTsKKyAgZ1NvdXJjZS0+bmFtZVsoKnNtYWxsZXIpLT5sZW5dID0gc2VwYXJhdG9yQ2hhcjsKKyAgZ1NvdXJjZS0+bmFtZVsoKnNtYWxsZXIpLT5sZW4rMV0gPSBjaGFyc1swXTsKKyAgZ1NvdXJjZS0+bmFtZVsoKnNtYWxsZXIpLT5sZW4rMl0gPSAwOworICBnU291cmNlLT5sZW4gPSAoKnNtYWxsZXIpLT5sZW4rMjsKKworICB1X3N0cmNweShnVGFyZ2V0LT5uYW1lLCAoKmdyZWF0ZXIpLT5uYW1lKTsKKyAgZ1RhcmdldC0+bmFtZVsoKmdyZWF0ZXIpLT5sZW5dID0gc2VwYXJhdG9yQ2hhcjsKKyAgZ1RhcmdldC0+bmFtZVsoKmdyZWF0ZXIpLT5sZW4rMV0gPSBjaGFyc1sxXTsKKyAgZ1RhcmdldC0+bmFtZVsoKmdyZWF0ZXIpLT5sZW4rMl0gPSAwOworICBnVGFyZ2V0LT5sZW4gPSAoKmdyZWF0ZXIpLT5sZW4rMjsKKworICBpZihjb21wYXJlcigmZ1NvdXJjZSwgJmdUYXJnZXQpID4gMCkgeworICAgIHJldHVybiBUUlVFOworICB9IGVsc2UgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitVQm9vbCB0cnlTd2FtcHMoTGluZSAqKnNtYWxsZXIsIExpbmUgKipncmVhdGVyLCBVQ2hhciBjaGFyc1syXSwgQ29tcGFyZUZuIGNvbXBhcmVyKSB7CisgIGdTb3VyY2UtPm5hbWVbMF0gPSBjaGFyc1swXTsKKyAgZ1NvdXJjZS0+bmFtZVsxXSA9IHNlcGFyYXRvckNoYXI7CisgIHVfc3RyY3B5KGdTb3VyY2UtPm5hbWUrMiwgKCpzbWFsbGVyKS0+bmFtZSk7CisgIGdTb3VyY2UtPmxlbiA9ICgqc21hbGxlciktPmxlbisyOworCisgIGdUYXJnZXQtPm5hbWVbMF0gPSBjaGFyc1sxXTsKKyAgZ1RhcmdldC0+bmFtZVsxXSA9IHNlcGFyYXRvckNoYXI7CisgIHVfc3RyY3B5KGdUYXJnZXQtPm5hbWUrMiwgKCpncmVhdGVyKS0+bmFtZSk7CisgIGdUYXJnZXQtPmxlbiA9ICgqZ3JlYXRlciktPmxlbisyOworCisgIGlmKGNvbXBhcmVyKCZnU291cmNlLCAmZ1RhcmdldCkgPCAwKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK1VDb2xBdHRyaWJ1dGVWYWx1ZSAKK3Byb2JlU3RyZW5ndGgoTGluZSoqIHByZXZMaW5lLCBMaW5lICoqY3VyckxpbmUsIENvbXBhcmVGbiBjb21wYXJlcikgeworICAvLyBQcmltYXJ5IHN3YW1wcyBzZWNvbmRhcnkKKyAgLy8gaGF2ZSBwYWlycyB3aGVyZSBbMF0gMj4gWzFdCisgIFVDaGFyIHByaW1Td2FtcHNbXVsyXSA9IHsKKyAgICB7IDB4MDBFMCwgMHgwMDYxIH0sCisgICAgeyAweDA0NTAsIDB4MDQzNSB9LAorICAgIHsgMHgzMWEzLCAweDMxMGQgfQorICB9OworICAvLyBTZWNvbmRhcnkgc3dhbXBzIHRlcnRpYXJ5CisgIC8vIGhhdmUgcGFpcnMgd2hlcmUgWzBdIDM+IFsxXQorICBVQ2hhciBzZWNTd2FtcHNbXVsyXSA9IHsKKyAgICB7IDB4MDA1MywgMHgwMDczIH0sCisgICAgeyAweDA0MTUsIDB4MDQzNSB9LAorICAgIHsgMHgzMWI2LCAweDMxMGUgfQorICB9OworICAvLyBTZWNvbmRhcnkgaXMgc3dhbXBlZCBieSBwcmltYXJ5CisgIC8vIGhhdmUgcGFpcnMgd2hlcmUgWzBdIDE+IFsxXQorICBVQ2hhciBzZWNTd2FtcGVkW11bMl0gPSB7CisgICAgeyAweDAwNjIsIDB4MDA2MSB9LAorICAgIHsgMHgwNDM2LCAweDA0NTQgfSwKKyAgICB7IDB4MzEwZSwgMHgzMTBkIH0KKyAgfTsKKyAgLy8gVGVydGlhcnkgaXMgc3dhbXBlZCBieSBzZWNvbmRhcnkKKyAgLy8gaGF2ZSBwYWlycyB3aGVyZSBbMF0gMj4gWzFdCisgIFVDaGFyIHRlclN3YW1wZWRbXVsyXSA9IHsKKyAgICB7IDB4MDBFMCwgMHgwMDYxIH0sCisgICAgeyAweDA0NTAsIDB4MDQzNSB9LAorICAgIHsgMHgzMWEzLCAweDMxMGQgfQorICB9OworICBpbnQzMl90IGkgPSAwOworICAvLyBUZXJ0aWFyeSBzd2FtcHMgZXF1YWw/CisgIGludCByZXN1bHQgPSAwOworICAvLyBDaG9vc2UgdGhlIHBhaXIKKyAgaSA9IDA7CisgIC8qCisgIGlmKCgqcHJldkxpbmUpLT5uYW1lWzBdID4gMHhGRiAmJiAoKmN1cnJMaW5lKS0+bmFtZVswXSA+IDB4RkYpIHsKKyAgICBpID0gMDsKKyAgfSBlbHNlIGlmKCgqcHJldkxpbmUpLT5uYW1lWzBdIDwgMHgwNDAwICYmICgqY3VyckxpbmUpLT5uYW1lWzBdIDwgMHgwNDAwKSB7CisgICAgaSA9IDE7CisgIH0gZWxzZSB7CisgICAgaSA9IDI7CisgIH0KKyAgKi8KKyAgLy8gYXJlIHRoZXkgZXF1YWw/CisgIGlmKChyZXN1bHQgPSBjb21wYXJlcihwcmV2TGluZSwgY3VyckxpbmUpKSA9PSAwKSB7CisgICAgcmV0dXJuIFVDT0xfSURFTlRJQ0FMOworICB9IGVsc2UgaWYocmVzdWx0ID4gMCkgeworICAgIC8vZnByaW50ZihzdGRlcnIsICJsaW5lcyBzaG91bGQgYmUgb3JkZXJlZCEiKTsKKyAgICByZXR1cm4gVUNPTF9PRkY7CisgIH0gZWxzZSBpZih0cnlTd2FtcHMocHJldkxpbmUsIGN1cnJMaW5lLCBwcmltU3dhbXBzW2ldLCBjb21wYXJlcikpIHsKKyAgICByZXR1cm4gVUNPTF9QUklNQVJZOworICB9IGVsc2UgaWYodHJ5U3dhbXBzKHByZXZMaW5lLCBjdXJyTGluZSwgc2VjU3dhbXBzW2ldLCBjb21wYXJlcikpIHsKKyAgICByZXR1cm4gVUNPTF9TRUNPTkRBUlk7CisgIH0gZWxzZSBpZih0cnlTd2FtcGVkKHByZXZMaW5lLCBjdXJyTGluZSwgdGVyU3dhbXBlZFtpXSwgY29tcGFyZXIpKSB7CisgICAgLy8gaXMgdGhlcmUgYSB0ZXJ0aWFyeSBkaWZmZXJlbmNlCisgICAgcmV0dXJuIFVDT0xfVEVSVElBUlk7CisgIH0gZWxzZSB7CisgICAgLy9mcHJpbnRmKHN0ZGVyciwgIlVua25vd24gc3RyZW5ndGghXG4iKTsKKyAgICByZXR1cm4gVUNPTF9PTjsKKyAgfQorfQorCisvLyBUaGlzIGZ1bmN0aW9uIHRyaWVzIHRvIHByb2JlIHRoZSBzZXQgb2YgbGluZXMgCisvLyAoYWxyZWFkeSBzb3J0ZWQgYnkgcXNvcnQpIGFuZCBkZWR1Y3QgdGhlIHN0cmVuZ3Rocwordm9pZCAKK2FuYWx5emVTdHJlbmd0aChMaW5lICoqbGluZXMsIGludDMyX3Qgc2l6ZSwgQ29tcGFyZUZuIGNvbXBhcmVyKSB7CisgIGludDMyX3QgaSA9IDA7CisKKyAgZm9yKGkgPSAxOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgTGluZSAqKnByZXZMaW5lID0gbGluZXMraS0xOworICAgIExpbmUgKipjdXJyTGluZSA9IGxpbmVzK2k7CisgICAgKCpjdXJyTGluZSktPnN0cmVuZ3RoID0gcHJvYmVTdHJlbmd0aChwcmV2TGluZSwgY3VyckxpbmUsIGNvbXBhcmVyKTsKKyAgICAoKmN1cnJMaW5lKS0+c29ydGVkSW5kZXggPSBpOworICAgICgqY3VyckxpbmUpLT5wcmV2aW91cyA9ICpwcmV2TGluZTsKKyAgICAoKnByZXZMaW5lKS0+bmV4dCA9ICpjdXJyTGluZTsKKworICB9CisKK30KKwordm9pZCBwcmludFN0cmVuZ3RoKFVDb2xBdHRyaWJ1dGVWYWx1ZSBzdHJlbmd0aCwgVUZJTEUgKmZpbGUpIHsKKyAgdV9mcHJpbnRmKGZpbGUsICIgIik7CisgIHN3aXRjaChzdHJlbmd0aCkgeworICBjYXNlIFVDT0xfSURFTlRJQ0FMOgorICAgIHVfZnByaW50ZihmaWxlLCAiPSIpOworICAgIGJyZWFrOworICBjYXNlIFVDT0xfVEVSVElBUlk6CisgICAgLy91X2ZwcmludGYoZmlsZSwgIjwzIik7CisgICAgdV9mcHJpbnRmKGZpbGUsICI8PDwiKTsKKyAgICBicmVhazsKKyAgY2FzZSBVQ09MX1NFQ09OREFSWToKKyAgICAvL3VfZnByaW50ZihmaWxlLCAiPDIiKTsKKyAgICB1X2ZwcmludGYoZmlsZSwgIjw8Iik7CisgICAgYnJlYWs7CisgIGNhc2UgVUNPTF9QUklNQVJZOgorICAgIC8vdV9mcHJpbnRmKGZpbGUsICI8MSIpOworICAgIHVfZnByaW50ZihmaWxlLCAiPCIpOworICAgIGJyZWFrOworICBjYXNlIFVDT0xfT0ZGOgorICAgIHVfZnByaW50ZihmaWxlLCAiPj8iKTsKKyAgZGVmYXVsdDoKKyAgICB1X2ZwcmludGYoZmlsZSwgIj8hIik7CisgICAgYnJlYWs7CisgIH0KKyAgdV9mcHJpbnRmKGZpbGUsICIgIik7Cit9CisKK3ZvaWQgcHJpbnRTdHJlbmd0aChMaW5lICpsaW5lLCBVRklMRSAqZmlsZSkgeworICBwcmludFN0cmVuZ3RoKGxpbmUtPnN0cmVuZ3RoLCBmaWxlKTsKK30KKwordm9pZCBwcmludExpbmUoTGluZSAqbGluZSwgVUZJTEUgKmZpbGUpIHsKKyAgZXNjYXBlQUxpbmUobGluZSwgZmlsZSk7CisgIGlmKGxpbmUtPmlzRXhwYW5zaW9uKSB7CisgICAgdV9mcHJpbnRmKGZpbGUsICIvIik7CisgICAgZXNjYXBlRXhwYW5zaW9uKGxpbmUsIGZpbGUpOworICB9Cit9CisKK3ZvaWQgcHJpbnRPcmRlcmluZyhMaW5lICoqbGluZXMsIGludDMyX3Qgc2l6ZSwgVUZJTEUgKmZpbGUsIFVCb29sIHVzZUxpbmtzID0gRkFMU0UpIHsKKyAgaW50MzJfdCBpID0gMDsKKworICAvL3ByaW50TGluZSgqbGluZXMpOworICAvL2VzY2FwZUFMaW5lKCpsaW5lcyk7IC8vIFByaW50IGZpcnN0IGxpbmUKKworICBMaW5lICpsaW5lID0gTlVMTDsKKyAgTGluZSAqcHJldmlvdXMgPSAqbGluZXM7CisgIGlmKHByZXZpb3VzLT5pc1Jlc2V0KSB7CisgICAgdV9mcHJpbnRmKGZpbGUsICJcbiYgIik7CisgICAgZXNjYXBlQUxpbmUocHJldmlvdXMsIGZpbGUpOworICB9IGVsc2UgaWYoIXByZXZpb3VzLT5pc1JlbW92ZWQpIHsKKyAgICBwcmludExpbmUocHJldmlvdXMsIGZpbGUpOworICB9CisgIGkgPSAxOworICB3aGlsZShpIDwgc2l6ZSAmJiBwcmV2aW91cy0+bmV4dCkgeworICAgIGlmKHVzZUxpbmtzKSB7CisgICAgICBsaW5lID0gcHJldmlvdXMtPm5leHQ7CisgICAgfSBlbHNlIHsKKyAgICAgIGxpbmUgPSAqKGxpbmVzK2kpOworICAgIH0KKyAgICBpZihsaW5lLT5pc1Jlc2V0KSB7CisgICAgICB1X2ZwcmludGYoZmlsZSwgIlxuJiAiKTsKKyAgICAgIGVzY2FwZUFMaW5lKGxpbmUsIGZpbGUpOworICAgIH0gZWxzZSBpZighbGluZS0+aXNSZW1vdmVkKSB7CisgICAgICBpZihmaWxlID09IG91dCkgeworICAgICAgICB1X2ZwcmludGYoZmlsZSwgIlxuIik7CisgICAgICB9CisgICAgICBpZihpID4gMCkgeworICAgICAgICBwcmludFN0cmVuZ3RoKGxpbmUsIGZpbGUpOworICAgICAgfQorICAgICAgcHJpbnRMaW5lKGxpbmUsIGZpbGUpOworICAgICAgLy9lc2NhcGVBTGluZShsaW5lLCBmaWxlKTsKKyAgICB9CisgICAgcHJldmlvdXMgPSBsaW5lOworICAgIGkrKzsKKyAgfQorICB1X2ZwcmludGYoZmlsZSwgIlxuIik7Cit9CisKKwordm9pZCBzZXRJbmRleGVzKExpbmUgKipsaW5lcywgaW50MzJfdCBzaXplKSB7CisgIGludDMyX3QgaSA9IDA7CisgICgqbGluZXMpLT5zb3J0ZWRJbmRleCA9IDA7CisgIGZvcihpID0gMTsgaSA8IHNpemU7IGkrKykgeworICAgIExpbmUgKmxpbmUgPSAqKGxpbmVzK2kpOworICAgIExpbmUgKnByZXYgPSAqKGxpbmVzK2ktMSk7CisgICAgbGluZS0+cHJldmlvdXMgPSBwcmV2OworICAgIHByZXYtPm5leHQgPSBsaW5lOworICAgIGxpbmUtPnNvcnRlZEluZGV4ID0gaTsKKyAgfQorfQorCisKKy8vIHRoaXMgc2VlbXMgdG8gYmUgYSBkZWFkIGVuZAordm9pZAorbm90ZUV4cGFuc2lvbihMaW5lICoqZ0xpbmVzLCBMaW5lICpsaW5lLCBpbnQzMl90IHNpemUsIENvbXBhcmVGbiBjb21wYXJlcikgeworICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKworICBVbmljb2RlU3RyaW5nIGtleShsaW5lLT5uYW1lLCBsaW5lLT5sZW4pOworICAvL0xpbmUgKnRvSW5zZXJ0ID0gKExpbmUgKilnRWxlbWVudHMuZ2V0KGtleSk7CisgIExpbmUgKnRvSW5zZXJ0ID0gKExpbmUgKilnRXhwYW5zaW9ucy5nZXQoa2V5KTsKKyAgaWYodG9JbnNlcnQgIT0gTlVMTCkgeworICAgIHRvSW5zZXJ0LT5pc0V4cGFuc2lvbiA9IFRSVUU7CisgICAgdV9zdHJjcHkodG9JbnNlcnQtPmV4cGFuc2lvblN0cmluZywgbGluZS0+ZXhwYW5zaW9uU3RyaW5nKTsKKyAgICB0b0luc2VydC0+ZXhwTGVuID0gbGluZS0+ZXhwTGVuOworICAgIHRvSW5zZXJ0LT5wcmV2aW91cy0+bmV4dCA9IHRvSW5zZXJ0LT5uZXh0OworICAgIHRvSW5zZXJ0LT5uZXh0LT5wcmV2aW91cyA9IHRvSW5zZXJ0LT5wcmV2aW91czsKKyAgICBnRWxlbWVudHMucmVtb3ZlKGtleSk7CisgIH0gZWxzZSB7CisgICAgdG9JbnNlcnQgPSBuZXcgTGluZSgqbGluZSk7IAorICAgIHRvSW5zZXJ0LT5pc0V4cGFuc2lvbiA9IFRSVUU7CisgICAgZ0VsZW1lbnRzLnB1dChVbmljb2RlU3RyaW5nKHRvSW5zZXJ0LT5uYW1lLCB0b0luc2VydC0+bGVuKSwgdG9JbnNlcnQsIHN0YXR1cyk7CisgIH0KKworICBpbnQzMl90IGkgPSAwOworICBMaW5lIHRlc3RMaW5lOworICBMaW5lICpsID0gJnRlc3RMaW5lOworICBmb3IoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICB1X3N0cmNweSh0ZXN0TGluZS5uYW1lLCAoKihnTGluZXMraSkpLT5uYW1lKTsKKyAgICB1X3N0cmNhdCh0ZXN0TGluZS5uYW1lLCBsaW5lLT5leHBhbnNpb25TdHJpbmcpOworICAgIHRlc3RMaW5lLmxlbiA9ICgqKGdMaW5lcytpKSktPmxlbiArIGxpbmUtPmV4cExlbjsKKyAgICBpZihjb21wYXJlcigmbCwgJmxpbmUpID4gMCkgeworICAgICAgdG9JbnNlcnQtPnByZXZpb3VzID0gKihnTGluZXMraS0xKTsKKyAgICAgIHRvSW5zZXJ0LT5uZXh0ID0gKihnTGluZXMraSk7CisgICAgICB0b0luc2VydC0+cHJldmlvdXMtPm5leHQgPSB0b0luc2VydDsKKyAgICAgIHRvSW5zZXJ0LT5uZXh0LT5wcmV2aW91cyA9IHRvSW5zZXJ0OworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGlmKGdWZXJib3NlKSB7CisgICAgdV9mcHJpbnRmKGxvZywgIkFkZGluZyBleHBhbnNpb25cbiIpOworICAgIGVzY2FwZUFMaW5lKGxpbmUsIGxvZyk7CisgICAgdV9mcHJpbnRmKGxvZywgIi8iKTsKKyAgICBlc2NhcGVFeHBhbnNpb24obGluZSwgbG9nKTsKKyAgICB1X2ZwcmludGYobG9nLCAiICIpOworICB9Cit9CisKK3ZvaWQKK3Bvc2l0aW9uRXhwYW5zaW9ucyhMaW5lICoqZ0xpbmVzLCBpbnQzMl90IHNpemUsIENvbXBhcmVGbiBjb21wYXJlcikgeworICBpbnQgcmVzdWx0ID0gMDsKKyAgTGluZSAqbGluZSA9IE5VTEw7CisgIExpbmUgKnRvTW92ZSA9IE5VTEw7CisgIGludDMyX3QgaSA9IDAsIGogPSAwOworICBMaW5lICoqc29ydGVkRXhwYW5zaW9ucyA9IG5ldyBMaW5lKltnRXhwYW5zaW9ucy5jb3VudCgpXTsKKyAgaW50MzJfdCBzb3J0ZWRFeHBhbnNpb25zU2l6ZSA9IHNldEFycmF5KHNvcnRlZEV4cGFuc2lvbnMsICZnRXhwYW5zaW9ucyk7CisgIHFzb3J0KHNvcnRlZEV4cGFuc2lvbnMsIHNvcnRlZEV4cGFuc2lvbnNTaXplLCBzaXplb2YoTGluZSAqKSwgY29tcGFyZXIpOworICAvLyBNYWtlIGEgbGlzdCBvZiB0aGluZ3MgaW4gdGhlIHZpbmNpbml0eSBvZiBleHBhbnNpb24gY2FuZGlkYXRlCisgIGZvcihqID0gMDsgaiA8IHNvcnRlZEV4cGFuc2lvbnNTaXplOyBqKyspIHsKKyAgICBsaW5lID0gKihzb3J0ZWRFeHBhbnNpb25zK2opOworICAgIFVuaWNvZGVTdHJpbmcga2V5KGxpbmUtPm5hbWUsIGxpbmUtPmxlbik7CisgICAgdG9Nb3ZlID0gKExpbmUgKilnRWxlbWVudHMuZ2V0KGtleSk7CisgICAgaW50MzJfdCBpID0gMDsKKyAgICBMaW5lIHRlc3RMaW5lLCBwcmV2VGVzdExpbmU7CisgICAgTGluZSAqbCA9ICZ0ZXN0TGluZTsKKyAgICBMaW5lICpwcmV2TCA9ICZwcmV2VGVzdExpbmU7CisgICAgLy8gVGhpcyBjYW4gYmUgZnVydGhlciBvcHRpbWl6ZWQsIHNpbmNlIHdlIG5vdyBrbm93IHRoYXQgd2UgaGF2ZSBhIAorICAgIC8vIHNvcnRlZCBsaXN0IG9mIGV4cGFuc2lvbnMsIHNvIGN1cnJlbnQgY2FuIHN0YXJ0IGZyb20gdG9Nb3ZlLCBzaW5jZSBhbGwKKyAgICAvLyB0aGUgZWxlbWVudHMgYmVmb3JlIGl0IGFyZSBhbHJlYWR5IHNtYWxsZXIuIEluIHRoZSBiZWdnaW5pbmcgaXQgbmVlZHMgdG8gCisgICAgLy8gYmUgb24gZ0xpbmVzLCB0aG91Z2guCisgICAgTGluZSAqY3VycmVudCA9ICpnTGluZXM7CisgICAgd2hpbGUoY3VycmVudCkgeworICAgICAgaWYoY3VycmVudCA9PSB0b01vdmUpIHsKKyAgICAgICAgLy8gd2UgYXJlIHdhZGluZyB0aHJvdWdoIGEgc29ydGVkIGxpc3QKKyAgICAgICAgLy8gaWYgd2UgZm91bmQgb3Vyc2VsdmVzLCBpdCBtZWFucyB0aGF0IHdlIAorICAgICAgICAvLyBhcmUgYWxyZWFkeSBpbiBhIHJpZ2h0IHBsYWNlLCBzbyBubyBtb3ZpbmcKKyAgICAgICAgLy8gaXMgbmVlZGVkLCBidXQgd2UgbmVlZCB0byBtYWtlIHN1cmUgd2UgaGF2ZQorICAgICAgICAvLyB0aGUgcmlnaHQgc3RyZW5ndGguCisgICAgICAgIHRvTW92ZS0+c3RyZW5ndGggPSBwcm9iZVN0cmVuZ3RoKCZwcmV2TCwgJnRvTW92ZSwgY29tcGFyZXIpOworICAgICAgICBpZigwKSB7CisgICAgICAgICAgdV9mcHJpbnRmKGxvZywgIlBvc2l0aW9uZWQgZXhwYW5zaW9uIHdpdGhvdXQgbW92aW5nICIpOworICAgICAgICAgIHByaW50TGluZSh0b01vdmUsIGxvZyk7CisgICAgICAgICAgdV9mcHJpbnRmKGxvZywgIiBuZXcgb3JkZXJpbmc6IFxuIik7CisgICAgICAgICAgcHJpbnRPcmRlcmluZyhnTGluZXMsIHNpemUsIGxvZywgVFJVRSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9IGVsc2UgeworICAgICAgICB1X3N0cmNweSh0ZXN0TGluZS5uYW1lLCBjdXJyZW50LT5uYW1lKTsKKyAgICAgICAgaWYoIWN1cnJlbnQtPmlzRXhwYW5zaW9uKSB7CisgICAgICAgICAgdV9zdHJjYXQodGVzdExpbmUubmFtZSwgbGluZS0+ZXhwYW5zaW9uU3RyaW5nKTsKKyAgICAgICAgICB0ZXN0TGluZS5sZW4gPSBjdXJyZW50LT5sZW4gKyBsaW5lLT5leHBMZW47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGVzdExpbmUubGVuID0gY3VycmVudC0+bGVuOworICAgICAgICB9CisgICAgICAgIGlmKGNvbXBhcmVyKCZsLCAmbGluZSkgPiAwKSB7CisgICAgICAgICAgLy8gcmVtb3ZlIGZyb20gY2hhaW4KKyAgICAgICAgICBpZih0b01vdmUtPm5leHQpIHsKKyAgICAgICAgICAgIHRvTW92ZS0+bmV4dC0+c3RyZW5ndGggPSBwcm9iZVN0cmVuZ3RoKCYodG9Nb3ZlLT5wcmV2aW91cyksICYodG9Nb3ZlLT5uZXh0KSwgY29tcGFyZXIpOworICAgICAgICAgICAgdG9Nb3ZlLT5uZXh0LT5wcmV2aW91cyA9IHRvTW92ZS0+cHJldmlvdXM7CisgICAgICAgICAgfQorICAgICAgICAgIGlmKHRvTW92ZS0+cHJldmlvdXMpIHsKKyAgICAgICAgICAgIHRvTW92ZS0+cHJldmlvdXMtPm5leHQgPSB0b01vdmUtPm5leHQ7CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gaW5zZXJ0CisgICAgICAgICAgdG9Nb3ZlLT5wcmV2aW91cyA9IGN1cnJlbnQtPnByZXZpb3VzOworICAgICAgICAgIHRvTW92ZS0+bmV4dCA9IGN1cnJlbnQ7CisKKyAgICAgICAgICBpZihjdXJyZW50LT5wcmV2aW91cykgeworICAgICAgICAgICAgY3VycmVudC0+cHJldmlvdXMtPm5leHQgPSB0b01vdmU7CisgICAgICAgICAgfQorICAgICAgICAgIGN1cnJlbnQtPnByZXZpb3VzID0gdG9Nb3ZlOworCisgICAgICAgICAgdG9Nb3ZlLT5zdHJlbmd0aCA9IHByb2JlU3RyZW5ndGgoJnByZXZMLCAmdG9Nb3ZlLCBjb21wYXJlcik7CisgICAgICAgICAgdG9Nb3ZlLT5uZXh0LT5zdHJlbmd0aCA9IHByb2JlU3RyZW5ndGgoJnRvTW92ZSwgJmwsIGNvbXBhcmVyKTsKKyAgICAgICAgICBpZigwKSB7CisgICAgICAgICAgICB1X2ZwcmludGYobG9nLCAiUG9zaXRpb25lZCBleHBhbnNpb24gIik7CisgICAgICAgICAgICBwcmludExpbmUodG9Nb3ZlLCBsb2cpOworICAgICAgICAgICAgdV9mcHJpbnRmKGxvZywgIiBuZXcgb3JkZXJpbmc6IFxuIik7CisgICAgICAgICAgICBwcmludE9yZGVyaW5nKGdMaW5lcywgc2l6ZSwgbG9nLCBUUlVFKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYodG9Nb3ZlLT5zdHJlbmd0aCA9PSBVQ09MX0lERU5USUNBTCkgeworICAgICAgICAgICAgLy8gY2hlY2sgZm9yIGNyYXppbmVzcyBzdWNoIGFzIHMgPSBzcy9zCisgICAgICAgICAgICAvLyBzdWNoIGxpbmUgd291bGQgY29uc2lzdCBvZiBwcmV2aW91cyAob3IgbmV4dCkgY29uY2F0ZW5hdGVkIHdpdGggdGhlIGV4cGFuc2lvbiB2YWx1ZQorICAgICAgICAgICAgLy8gbWFrZSBhIHRlc3QKKyAgICAgICAgICAgIFVDaGFyIGZ1bGxTdHJpbmdbMjU2XTsKKyAgICAgICAgICAgIHVfc3RyY3B5KGZ1bGxTdHJpbmcsIHRvTW92ZS0+cHJldmlvdXMtPm5hbWUpOworICAgICAgICAgICAgdV9zdHJjYXQoZnVsbFN0cmluZywgdG9Nb3ZlLT5leHBhbnNpb25TdHJpbmcpOworICAgICAgICAgICAgaWYodV9zdHJjbXAoZnVsbFN0cmluZywgdG9Nb3ZlLT5uYW1lKSA9PSAwKSB7CisgICAgICAgICAgICAgIHRvTW92ZS0+cHJldmlvdXMtPm5leHQgPSB0b01vdmUtPm5leHQ7CisgICAgICAgICAgICAgIHRvTW92ZS0+bmV4dC0+cHJldmlvdXMgPSB0b01vdmUtPnByZXZpb3VzOworICAgICAgICAgICAgICB0b01vdmUtPmlzUmVtb3ZlZCA9IFRSVUU7CisgICAgICAgICAgICAgIHVfZnByaW50Zihsb2csICJSZW1vdmVkOiAiKTsKKyAgICAgICAgICAgICAgcHJpbnRMaW5lKHRvTW92ZSwgbG9nKTsKKyAgICAgICAgICAgICAgdV9mcHJpbnRmKGxvZywgIlxuIik7CisgICAgICAgICAgICB9IAorICAgICAgICAgIH0gZWxzZSBpZih0b01vdmUtPm5leHQtPnN0cmVuZ3RoID09IFVDT0xfSURFTlRJQ0FMKSB7CisgICAgICAgICAgICBVQ2hhciBmdWxsU3RyaW5nWzI1Nl07CisgICAgICAgICAgICB1X3N0cmNweShmdWxsU3RyaW5nLCB0b01vdmUtPm5leHQtPm5hbWUpOworICAgICAgICAgICAgdV9zdHJjYXQoZnVsbFN0cmluZywgdG9Nb3ZlLT5leHBhbnNpb25TdHJpbmcpOworICAgICAgICAgICAgaWYodV9zdHJjbXAoZnVsbFN0cmluZywgdG9Nb3ZlLT5uYW1lKSA9PSAwKSB7CisgICAgICAgICAgICAgIHRvTW92ZS0+bmV4dC0+c3RyZW5ndGggPSB0b01vdmUtPnN0cmVuZ3RoOworICAgICAgICAgICAgICB0b01vdmUtPnByZXZpb3VzLT5uZXh0ID0gdG9Nb3ZlLT5uZXh0OworICAgICAgICAgICAgICB0b01vdmUtPm5leHQtPnByZXZpb3VzID0gdG9Nb3ZlLT5wcmV2aW91czsKKyAgICAgICAgICAgICAgdG9Nb3ZlLT5pc1JlbW92ZWQgPSBUUlVFOworICAgICAgICAgICAgICB1X2ZwcmludGYobG9nLCAiUmVtb3ZlZCBiZWNhdXNlIG9mIGJhY2s6ICIpOworICAgICAgICAgICAgICBwcmludExpbmUodG9Nb3ZlLCBsb2cpOworICAgICAgICAgICAgICB1X2ZwcmludGYobG9nLCAiXG4iKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHByZXZUZXN0TGluZSA9IHRlc3RMaW5lOworICAgICAgfQorICAgICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHQ7CisgICAgfQorICB9CisgIGRlbGV0ZVtdIHNvcnRlZEV4cGFuc2lvbnM7Cit9CisKKwordm9pZAorbm90ZUV4cGFuc2lvbihMaW5lICpsaW5lKSB7CisgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICBVbmljb2RlU3RyaW5nIGtleShsaW5lLT5uYW1lLCBsaW5lLT5sZW4pOworICBMaW5lICplbCA9IChMaW5lICopZ0VsZW1lbnRzLmdldChrZXkpOworICBpZihlbCAhPSBOVUxMKSB7CisgICAgZWwtPmlzRXhwYW5zaW9uID0gVFJVRTsKKyAgICB1X3N0cmNweShlbC0+ZXhwYW5zaW9uU3RyaW5nLCBsaW5lLT5leHBhbnNpb25TdHJpbmcpOworICAgIGVsLT5leHBMZW4gPSBsaW5lLT5leHBMZW47CisgIH0gZWxzZSB7CisgICAgTGluZSAqdG9JbnNlcnQgPSBuZXcgTGluZSgqbGluZSk7IAorICAgIHRvSW5zZXJ0LT5pc0V4cGFuc2lvbiA9IFRSVUU7CisgICAgZ0VsZW1lbnRzLnB1dChVbmljb2RlU3RyaW5nKGxpbmUtPm5hbWUsIGxpbmUtPmxlbiksIHRvSW5zZXJ0LCBzdGF0dXMpOworICB9CisKKyAgTGluZSAqZWwyID0gKExpbmUgKilnRXhwYW5zaW9ucy5nZXQoa2V5KTsKKyAgZWwyLT5pc0V4cGFuc2lvbiA9IFRSVUU7CisgIHVfc3RyY3B5KGVsMi0+ZXhwYW5zaW9uU3RyaW5nLCBsaW5lLT5leHBhbnNpb25TdHJpbmcpOworICBlbDItPmV4cExlbiA9IGxpbmUtPmV4cExlbjsKKworICBpZihnRGVidWcpIHsKKyAgICB1X2ZwcmludGYobG9nLCAiQWRkaW5nIGV4cGFuc2lvblxuIik7CisgICAgcHJpbnRMaW5lKGxpbmUsIGxvZyk7CisgICAgdV9mcHJpbnRmKGxvZywgIlxuIik7CisgIH0KK30KKwordm9pZCAKK25vdGVDb250cmFjdGlvbihMaW5lICpsaW5lKSB7CisgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICBMaW5lICp0b0luc2VydCA9IG5ldyBMaW5lKCpsaW5lKTsgCisgIHRvSW5zZXJ0LT5pc0NvbnRyYWN0aW9uID0gVFJVRTsKKyAgZ0VsZW1lbnRzLnB1dChVbmljb2RlU3RyaW5nKGxpbmUtPm5hbWUsIGxpbmUtPmxlbiksIHRvSW5zZXJ0LCBzdGF0dXMpOworICBpZihnVmVyYm9zZSkgeworICAgIHVfZnByaW50Zihsb2csICJBZGRpbmcgY29udHJhY3Rpb25cbiIpOworICAgIGVzY2FwZUFMaW5lKGxpbmUsIGxvZyk7CisgICAgdV9mcHJpbnRmKGxvZywgIiAiKTsKKyAgfQorfQorCit2b2lkCitub3RlRWxlbWVudChMaW5lICpsaW5lKSB7CisgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICBMaW5lICp0b0luc2VydCA9IG5ldyBMaW5lKCpsaW5lKTsKKyAgZ0VsZW1lbnRzLnB1dChVbmljb2RlU3RyaW5nKGxpbmUtPm5hbWUsIGxpbmUtPmxlbiksIHRvSW5zZXJ0LCBzdGF0dXMpOworICBpZigwKSB7IC8vaWYoZ0RlYnVnKSAKKyAgICBlc2NhcGVBTGluZShsaW5lLCBsb2cpOworICAgIHVfZnByaW50Zihsb2csICIgIik7CisgIH0KK30KKworCisKKy8vIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIGEgY29tYmluYXRpb24gb2YgY2hhcmFjdGVycyBoYXMgY2hhbmdlZCBwbGFjZSB3aXRoIHRoZSAKKy8vIGFkamFjZW50IGVsZW1lbnRzLiBJZiBzbywgdGhlc2UgYXJlIG1vc3QgcHJvYmFibHkgY29udHJhY3Rpb25zLgorLy8gSG93ZXZlciwgaXQgc3RpbGwgbmVlZHMgdG8gYmUgY2hlY2tlZCBpZiB0aGVzZSBjb250cmFjdGlvbnMgYXJlIGZha2UgLSB0aGUgCisvLyB0ZXN0IGlzIHNpbXBsZSAtIGlmIHh5IGlzIHN1c3BlY3RlZCBjb250cmFjdGlvbiwgaWYgd2UgZ2V0IHRoYXQgeC95IGlzIGV4cGFuc2lvbiwgdGhlbgorLy8geHkgaXMgYSBmYWtlIGNvbnRyYWN0aW9uLgoraW50MzJfdCAKK2FuYWx5emVDb250cmFjdGlvbnMoTGluZSoqIGxpbmVzLCBpbnQzMl90IHNpemUsIENvbXBhcmVGbiBjb21wYXJlcikgeworICBpbnQzMl90IGkgPSAwLCBqID0gMDsKKyAgaW50MzJfdCBvdXRPZk9yZGVyID0gMDsKKyAgVUNvbEF0dHJpYnV0ZVZhbHVlIHN0cmVuZ3RoID0gVUNPTF9PRkY7CisgIFVDb2xBdHRyaWJ1dGVWYWx1ZSBjdXJyU3RyZW5ndGggPSBVQ09MX09GRjsKKyAgTGluZSAqKnByZXZMaW5lID0gbGluZXM7CisgIExpbmUgKipjdXJyTGluZSA9IE5VTEw7CisgIExpbmUgKipiYWNrdXBMaW5lID0gTlVMTDsKKyAgVUJvb2wgcHJldklzQ29udHJhY3Rpb24gPSBGQUxTRSwgY3VycklzQ29udHJhY3Rpb24gPSBGQUxTRTsKKyAgLy8gUHJvYmxlbSBoZXJlIGlzIGRldGVjdGluZyBhIGNvbnRyYWN0aW9uIHRoYXQgaXMgYXQgdGhlIHZlcnkgZW5kIG9mIHRoZSBzb3J0ZWQgbGlzdAorICBmb3IoaSA9IDE7IGkgPCBzaXplOyBpKyspIHsKKyAgICBjdXJyTGluZSA9IGxpbmVzK2k7CisgICAgc3RyZW5ndGggPSBwcm9iZVN0cmVuZ3RoKHByZXZMaW5lLCBjdXJyTGluZSwgY29tcGFyZXIpOworICAgIGlmKHN0cmVuZ3RoID09IFVDT0xfT0ZGIHx8IHN0cmVuZ3RoICE9ICgqY3VyckxpbmUpLT5zdHJlbmd0aCkgeworICAgICAgcHJldklzQ29udHJhY3Rpb24gPSBGQUxTRTsKKyAgICAgIGN1cnJJc0NvbnRyYWN0aW9uID0gRkFMU0U7CisgICAgICBpZighb3V0T2ZPcmRlcikgeworICAgICAgICBpZihnVmVyYm9zZSkgeworICAgICAgICAgIHVfZnByaW50Zihsb2csICJQb3NzaWJsZSBjb250cmFjdGlvbnM6ICIpOworICAgICAgICB9CisgICAgICB9CisgICAgICAvLyBub3cgd2UgaGF2ZSB0d28gZWxlbWVudHMgdGhhdCBhcmUgZGlmZmVyZW50LiBUaGUgcXVlc3Rpb24gaXMsIAorICAgICAgLy8gd2hpY2ggb25lIG9mIHRoZW0gaXMgdGhlIGNvbnRyYWN0aW9uIC0gd2hpY2ggb25lIGhhcyBtb3ZlZC4gCisgICAgICAvLyBDb3VsZCBiZSB0aGUgcHJldmlvdXMsIGJ1dCBjb3VsZCBhbHNvIGJlIHRoZSBjdXJyZW50LgorCisgICAgICBvdXRPZk9yZGVyKys7CisKKyAgICAgIC8vIEZpcnN0LCBsZXRzIGNoZWNrIHdoZXRoZXIgdGhlIHByZXZpb3VzIGhhcyBqdW1wZWQgYmFjaworICAgICAgaiA9IGkrMTsKKyAgICAgIC8vIHNraXAgYWxsIHRoZSBuZXh0cyB0aGF0IGhhdmUgc21hbGxlciBzdHJlbmd0aCwgdGhleSBkb24ndCBoYXZlIGFuIGVmZmVjdAorICAgICAgd2hpbGUoaiA8IHNpemUgJiYgKCoobGluZXMraikpLT5zdHJlbmd0aCA+ICgqY3VyckxpbmUpLT5zdHJlbmd0aCkgeworICAgICAgICBqKys7CisgICAgICB9CisgICAgICAvLyBjaGVjayBpZiB0aGVyZSBhcmUgb3RoZXIgZWxlbWVudHMgb2Ygc2FtZSBvciBncmVhdGVyIHN0cmVuZ3RoCisgICAgICB3aGlsZShqIDwgc2l6ZSAmJiAKKyAgICAgICAgKHN0cmVuZ3RoID0gcHJvYmVTdHJlbmd0aChwcmV2TGluZSwgKGJhY2t1cExpbmUgPSBsaW5lcytqKSwgY29tcGFyZXIpKSA9PSBVQ09MX09GRikgeworICAgICAgICBqKys7CisgICAgICAgIC8vIGlmIHdlIHNraXBwZWQgbW9yZSB0aGFuIG9uZSwgaXQgbWlnaHQgYmUgaW4gZmFjdCBhIGNvbnRyYWN0aW9uCisgICAgICAgIHByZXZJc0NvbnRyYWN0aW9uID0gVFJVRTsKKyAgICAgIH0KKyAgICAgIGlmKHByZXZJc0NvbnRyYWN0aW9uKSB7CisgICAgICAgIG5vdGVDb250cmFjdGlvbigqcHJldkxpbmUpOworICAgICAgICBqID0gaS0yOworICAgICAgICAvLyBhZGQgYWxsIHRoZSBwcmV2aW91cyBlbGVtZW50cyB3aXRoIHNtYWxsZXIgc3RyZW5ndGgsIHNpbmNlIHRoZXkgYWxzbworICAgICAgICAvLyB3aWxsIGp1bXAgb3ZlciBhbmQgYXJlIGNvbnRyYWN0aW9ucworICAgICAgICB3aGlsZShqID49IDAgJiYgKCoobGluZXMraisxKSktPnN0cmVuZ3RoID4gKCpjdXJyTGluZSktPnN0cmVuZ3RoKSB7CisgICAgICAgICAgc3RyZW5ndGggPSBwcm9iZVN0cmVuZ3RoKGxpbmVzK2osIGN1cnJMaW5lLCBjb21wYXJlcik7CisgICAgICAgICAgaWYoc3RyZW5ndGggPT0gVUNPTF9PRkYpIHsKKyAgICAgICAgICAgIG5vdGVDb250cmFjdGlvbigqKGxpbmVzK2opKTsKKyAgICAgICAgICB9CisgICAgICAgICAgai0tOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vIG5vdyB3ZSBjaGVjayBpZiB0aGUgY3VycmVudCBlbGVtZW50IGlzIGp1bXBpbmcgZm9yd2FyZCwKKyAgICAgIC8vIHRoZSBkYW5jZSBzdGVwcyBhcmUgYW5hbG9nb3VzIHRvIGFib3ZlLgorICAgICAgaiA9IGkgLSAyOworICAgICAgd2hpbGUoaiA+PSAwICYmICgqKGxpbmVzK2orMSkpLT5zdHJlbmd0aCA+ICgqY3VyckxpbmUpLT5zdHJlbmd0aCkgeworICAgICAgICBqLS07CisgICAgICB9CisgICAgICB3aGlsZShqID49IDAgJiYgCisgICAgICAgIChzdHJlbmd0aCA9IHByb2JlU3RyZW5ndGgoKGJhY2t1cExpbmUgPSBsaW5lcytqKSwgY3VyckxpbmUsIGNvbXBhcmVyKSkgPT0gVUNPTF9PRkYpIHsKKyAgICAgICAgai0tOworICAgICAgICBjdXJySXNDb250cmFjdGlvbiA9IFRSVUU7CisgICAgICB9CisgICAgICBpZihjdXJySXNDb250cmFjdGlvbikgeworICAgICAgICBpZihnVmVyYm9zZSkgeworICAgICAgICAgIGVzY2FwZUFMaW5lKCpjdXJyTGluZSwgbG9nKTsKKyAgICAgICAgICB1X2ZwcmludGYobG9nLCAiICIpOworICAgICAgICB9CisgICAgICAgIGogPSBpKzE7CisgICAgICAgIHdoaWxlKGogPCBzaXplICYmICgqKGxpbmVzK2opKS0+c3RyZW5ndGggPiAoKmN1cnJMaW5lKS0+c3RyZW5ndGgpIHsKKyAgICAgICAgICBzdHJlbmd0aCA9IHByb2JlU3RyZW5ndGgocHJldkxpbmUsIGxpbmVzK2osIGNvbXBhcmVyKTsKKyAgICAgICAgICBpZihzdHJlbmd0aCA9PSBVQ09MX09GRikgeworICAgICAgICAgICAgbm90ZUNvbnRyYWN0aW9uKCoobGluZXMraikpOworICAgICAgICAgIH0KKyAgICAgICAgICBqKys7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy8gTm90IHN1cmUgYWJvdXQgZWl0aGVyLiBMaXN0IGJvdGggYW5kIHRoZW4gY2hlY2sKKyAgICAgIGlmKCEocHJldklzQ29udHJhY3Rpb24gfHwgY3VycklzQ29udHJhY3Rpb24pKSB7CisgICAgICAgIG5vdGVDb250cmFjdGlvbigqcHJldkxpbmUpOworICAgICAgICBub3RlQ29udHJhY3Rpb24oKmN1cnJMaW5lKTsKKyAgICAgIH0KKyAgICB9CisgICAgcHJldkxpbmUgPSBjdXJyTGluZTsKKyAgfQorICBpZihvdXRPZk9yZGVyKSB7CisgICAgaWYoZ1ZlcmJvc2UpIHsKKyAgICAgIHVfZnByaW50Zihsb2csICJcbiIpOworICAgIH0KKyAgfQorICByZXR1cm4gb3V0T2ZPcmRlcjsKK30KKworaW50MzJfdAorZGV0ZWN0Q29udHJhY3Rpb25zKExpbmUgKipnTGluZXMsIExpbmUgKmxpbmVzLCBpbnQzMl90IHNpemUsIENvbXBhcmVGbiBjb21wYXJlcikgeworICBpbnQzMl90IGkgPSAwLCBqID0gMDsKKyAgaW50MzJfdCBub0NvbnRyYWN0aW9ucyA9IDA7CisgIC8vIENyZWF0ZSBhbmQgY29tcGFyZSBkb3VibGVzOgorICBMaW5lICpiYWNrdXBMaW5lcyA9IG5ldyBMaW5lW3NpemVdOyAKKyAgTGluZTo6Y29weUFycmF5KGJhY2t1cExpbmVzLCBsaW5lcywgc2l6ZSk7IAorICAvLyBkZXRlY3QgY29udHJhY3Rpb25zCisKKyAgTGluZSAqKmdMaW5lc0JhY2t1cCA9IE5VTEw7IC8vbmV3IExpbmUqW3NpemVdOyAKKworICBmb3IoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAvLyBwcmVzZXJ2ZSBpbmRleCBhbmQgcHJldmlvdXMKKyAgICBMaW5lOjpjb3B5QXJyYXkobGluZXMsIGJhY2t1cExpbmVzLCBzaXplKTsgCisgICAgZm9yKGogPSAwOyBqIDwgc2l6ZTsgaisrKSB7CisgICAgICB1X3N0cmNweShsaW5lc1tqXS5uYW1lLCBiYWNrdXBMaW5lc1tpXS5uYW1lKTsKKyAgICAgIHVfc3RyY2F0KGxpbmVzW2pdLm5hbWUsIGJhY2t1cExpbmVzW2pdLm5hbWUpOworICAgICAgbGluZXNbal0ubGVuID0gYmFja3VwTGluZXNbaV0ubGVuK2JhY2t1cExpbmVzW2pdLmxlbjsgICAgIAorICAgIH0KKworICAgIGlmKChub0NvbnRyYWN0aW9ucyArPSBhbmFseXplQ29udHJhY3Rpb25zKGdMaW5lcywgc2l6ZSwgY29tcGFyZXIpKSAmJiBnRGVidWcpIHsKKyAgICAgIGlmKGdMaW5lc0JhY2t1cCA9PSBOVUxMKSB7CisgICAgICAgIGdMaW5lc0JhY2t1cCA9IG5ldyBMaW5lKltzaXplXTsKKyAgICAgIH0KKyAgICAgIC8vIFNob3cgdGhlIHNvcnRlZCBkb3VibGVzLCBmb3IgZGVidWdnaW5nCisgICAgICBzZXRBcnJheShnTGluZXNCYWNrdXAsIGxpbmVzLCBzaXplKTsKKyAgICAgIHFzb3J0KGdMaW5lc0JhY2t1cCwgc2l6ZSwgc2l6ZW9mKExpbmUgKiksIGNvbXBhcmVyKTsKKyAgICAgIC8vc2V0SW5kZXhlcyhnTGluZXNCYWNrdXAsIHNpemUpOworICAgICAgYW5hbHl6ZVN0cmVuZ3RoKGdMaW5lc0JhY2t1cCwgc2l6ZSwgY29tcGFyZXIpOworICAgICAgcHJpbnRPcmRlcmluZyhnTGluZXNCYWNrdXAsIHNpemUsIGxvZyk7CisgICAgfQorICAgIGlmKCFnUXVpZXQpIHsKKyAgICAgIHVfZnByaW50Zihsb2csICIuIik7CisgICAgfQorICB9CisgIGlmKCFnUXVpZXQpIHsKKyAgICB1X2ZwcmludGYobG9nLCAiXG4iKTsKKyAgfQorICBkZWxldGVbXSBiYWNrdXBMaW5lczsgCisgIGlmKGdMaW5lc0JhY2t1cCkgeworICAgIGRlbGV0ZVtdIGdMaW5lc0JhY2t1cDsgCisgIH0KKyAgcmV0dXJuIG5vQ29udHJhY3Rpb25zOworfQorCisvLyBnTGluZXMgaW4gdGhpcyBmdW5jdGlvbiBpcyBhbiBhcnJheSBvZiBzb3J0ZWQgcG9pbnRlcnMuCisvLyBDb250cmFjdGlvbnMgYXJlIGFscmVhZHkgaW5jbHVkZWQuIAoraW50MzJfdAorZGV0ZWN0RXhwYW5zaW9ucyhMaW5lICoqZ0xpbmVzLCBpbnQzMl90IHNpemUsIENvbXBhcmVGbiBjb21wYXJlcikgeworICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgLy8gZGV0ZWN0IGV4cGFuc2lvbnMKKworICBVQ29sQXR0cmlidXRlVmFsdWUgc3RhcnRTdHJlbmd0aCA9IFVDT0xfT0ZGLCBlbmRTdHJlbmd0aCA9IFVDT0xfT0ZGLCAKKyAgICBzdHJlbmd0aCA9IFVDT0xfT0ZGLCBwcmV2aW91c1N0cmVuZ3RoID0gVUNPTF9PRkY7CisgIExpbmUgc3RhcnQsIGVuZCwgc3JjOworICBMaW5lICpzdGFydFAgPSAmc3RhcnQsICplbmRQID0gJmVuZCwgKnNyY1AgPSAmc3JjOworICBMaW5lICpjdXJyZW50ID0gTlVMTDsKKyAgbWVtc2V0KHN0YXJ0UCwgMCwgc2l6ZW9mKExpbmUpKTsKKyAgbWVtc2V0KGVuZFAsIDAsIHNpemVvZihMaW5lKSk7CisgIG1lbXNldChzcmNQLCAwLCBzaXplb2YoTGluZSkpOworICBpbnQzMl90IHNyY0xlbjsKKyAgaW50MzJfdCBpID0gMCwgaiA9IDAsIGsgPSAwOworICBmb3IoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICB1X3N0cmNweShzdGFydC5uYW1lLCAoKihnTGluZXMraSkpLT5uYW1lKTsKKyAgICB1X3N0cmNweShlbmQubmFtZSwgKCooZ0xpbmVzK2kpKS0+bmFtZSk7CisgICAgc3JjTGVuID0gKCooZ0xpbmVzK2kpKS0+bGVuOworICAgIHVfc3RyY3B5KHN0YXJ0Lm5hbWUrc3JjTGVuLCAoKihnTGluZXMpKS0+bmFtZSk7CisgICAgc3RhcnQubGVuID0gc3JjTGVuICsgKCooZ0xpbmVzKSktPmxlbjsKKyAgICB1X3N0cmNweShlbmQubmFtZStzcmNMZW4sICgqKGdMaW5lcytzaXplLTEpKS0+bmFtZSk7CisgICAgZW5kLmxlbiA9IHNyY0xlbiArICgqKGdMaW5lcytzaXplLTEpKS0+bGVuOworCisgICAgZm9yKGsgPSAwOyBrIDwgc2l6ZTsgaysrKSB7IC8vIGsgaXMgaW5kZXggb2YgYSB0aGluZyB0aGF0IGlzIG5vdCBkb3VibGVkCisgICAgICBjdXJyZW50ID0gKihnTGluZXMrayk7CisgICAgICAvLyBzZWUgaWYgd2UgaGF2ZSBtb3ZlZCB0byBmcm9udAorICAgICAgLy8gaGFzIGl0IG1vdmVkIHRvIHRoZSB2ZXJ5IGJlZ2dpbmluZworICAgICAgaWYoKHN0YXJ0U3RyZW5ndGggPSBwcm9iZVN0cmVuZ3RoKChnTGluZXMrayksICZzdGFydFAsIGNvbXBhcmVyKSkgIT0gVUNPTF9PRkYpIHsKKyAgICAgICAgY29udGludWU7IC8vIHRoaXMgb25lIGlzIGluIHRoZSBmcm9udAorICAgICAgfQorICAgICAgLy8gaGFzIGl0IG1vdmVkIHRvIHRoZSB2ZXJ5IGVuZD8KKyAgICAgIGlmKChlbmRTdHJlbmd0aCA9IHByb2JlU3RyZW5ndGgoJmVuZFAsIChnTGluZXMrayksIGNvbXBhcmVyKSkgIT0gVUNPTF9PRkYpIHsKKyAgICAgICAgY29udGludWU7IC8vIHRoaXMgb25lIGlzIGluIHRoZSBiYWNrCisgICAgICB9CisgICAgICAvLyBQb3RlbnRpYWwgRXhwYW5zaW9uICAgICAKKyAgICAgIGlmKGdEZWJ1ZykgeyAvL2dWZXJib3NlCisgICAgICAgIHVfZnByaW50Zihsb2csICJQb3NzaWJsZSBleHBhbnNpb246ICIpOworICAgICAgICBlc2NhcGVBTGluZSgqKGdMaW5lcytrKSwgbG9nKTsKKyAgICAgICAgdV9mcHJpbnRmKGxvZywgIiAiKTsKKyAgICAgIH0KKyAgICAgIC8vIE5vdyB3ZSBoYXZlIHRvIG1ha2Ugc3VyZSB0aGF0IHRoaXMgaXMgcmVhbGx5IGFuIGV4cGFuc2lvbgorICAgICAgLy8gRmlyc3QsIHdlIGhhdmUgdG8gZmluZCBpdAorICAgICAgdV9zdHJjcHkoc3JjLm5hbWUsICgqKGdMaW5lcytpKSktPm5hbWUpOworICAgICAgZm9yKGogPSAwOyBqIDwgc2l6ZTsgaisrKSB7CisgICAgICAgIHVfc3RyY3B5KHNyYy5uYW1lK3NyY0xlbiwgKCooZ0xpbmVzK2opKS0+bmFtZSk7CisgICAgICAgIHNyYy5sZW4gPSBzcmNMZW4gKyAoKihnTGluZXMraikpLT5sZW47CisgICAgICAgIGlmKChzdHJlbmd0aCA9IHByb2JlU3RyZW5ndGgoJnNyY1AsIChnTGluZXMrayksIGNvbXBhcmVyKSkgPT0gVUNPTF9PRkYpIHsKKyAgICAgICAgICBzdHJlbmd0aCA9IHByb2JlU3RyZW5ndGgoKGdMaW5lcytrKSwgJnNyY1AsIGNvbXBhcmVyKTsKKyAgICAgICAgICAvLyB3ZSBmb3VuZCBpdCAqKGdMaW5lcytqLTEpIGlzIHRoZSBlbGVtZW50IHRoYXQgaXMgaW50ZXJlc3RpbmcKKyAgICAgICAgICAvLyBzaW5jZSBnTGluZXMrai0xIDwgZ0xpbmVzK2sgPCBnTGluZXMragorICAgICAgICAgIGlmKGdEZWJ1ZykgeyAvL2dWZXJib3NlCisgICAgICAgICAgICB1X2ZwcmludGYobG9nLCAiaSA9ICVpLCBrID0gJWksIGogPSAlaSAiLCBpLCBrLCBqKTsKKyAgICAgICAgICAgIGVzY2FwZUFMaW5lKCooZ0xpbmVzK2kpLCBsb2cpOworICAgICAgICAgICAgZXNjYXBlQUxpbmUoKihnTGluZXMrai0xKSwgbG9nKTsKKyAgICAgICAgICAgIHByaW50U3RyZW5ndGgocHJldmlvdXNTdHJlbmd0aCwgbG9nKTsKKyAgICAgICAgICAgIGVzY2FwZUFMaW5lKGN1cnJlbnQsIGxvZyk7CisgICAgICAgICAgICBwcmludFN0cmVuZ3RoKHN0cmVuZ3RoLCBsb2cpOworICAgICAgICAgICAgZXNjYXBlQUxpbmUoKihnTGluZXMraSksIGxvZyk7CisgICAgICAgICAgICBlc2NhcGVBTGluZSgqKGdMaW5lcytqKSwgbG9nKTsKKyAgICAgICAgICAgIHVfZnByaW50Zihsb2csICJcbiIpOworICAgICAgICAgIH0KKyAgICAgICAgICAvLyBjaGVjayB3aGV0aGVyIGl0IGlzIGEgY29udHJhY3Rpb24gdGhhdCBpcyB0aGUgc2FtZSBhcyBhbiBleHBhbnNpb24KKyAgICAgICAgICAvLyBvciBhIG11bHRpIGNoYXJhY3RlciB0aGF0IGRvZXNuJ3QgZG8gYW55dGhpbmcKKyAgICAgICAgICBjdXJyZW50LT5hZGRFeHBhbnNpb25IaXQoaSwgaik7CisgICAgICAgICAgY3VycmVudC0+aXNFeHBhbnNpb24gPSBUUlVFOworICAgICAgICAgIGN1cnJlbnQtPmV4cEluZGV4ID0gazsKKyAgICAgICAgICAvLyBjYWNoZSBleHBhbnNpb24KKyAgICAgICAgICBnRXhwYW5zaW9ucy5wdXQoVW5pY29kZVN0cmluZyhjdXJyZW50LT5uYW1lLCBjdXJyZW50LT5sZW4pLCBjdXJyZW50LCBzdGF0dXMpOyAvL25ldyBMaW5lKCpjdXJyZW50KQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHByZXZpb3VzU3RyZW5ndGggPSBzdHJlbmd0aDsKKyAgICAgIH0KKyAgICB9CisgICAgaWYoIWdRdWlldCkgeworICAgICAgdV9mcHJpbnRmKGxvZywgIi4iKTsKKyAgICB9CisgIH0gIAorICBpZighZ1F1aWV0KSB7CisgICAgdV9mcHJpbnRmKGxvZywgIlxuIik7CisgIH0KKyAgLy8gbm93IHdlIGhhdmUgaWRlbnRpZmllZCBwb3NzaWJsZSBleHBhbnNpb25zLiBXZSBuZWVkIHRvIGZpbmQgb3V0IGhvdyBkbyB0aGV5IGV4cGFuZC4gCisgIC8vIExldCdzIGl0ZXJhdGUgb3ZlciBleHBhbnNpb25zIGNhY2hlIC0gaXQncyBlYXNpZXIuCisgIGNvbnN0IFVIYXNoRWxlbWVudCAqZWwgPSBOVUxMOworICBpbnQzMl90IGhhc2hJbmRleCA9IC0xOworICBMaW5lICpkb3VibGVzID0gbmV3IExpbmVbc2l6ZSoxMF07IAorICBMaW5lICoqc29ydGVyID0gbmV3IExpbmUqW3NpemUqMTBdOworICBpbnQzMl90IGN1cnJTaXplID0gMDsKKyAgaW50MzJfdCBuZXdTaXplID0gMDsKKyAgTGluZSAqcHJldiA9IE5VTEw7CisgIExpbmUgKm5leHQgPSBOVUxMOworICBMaW5lICpvcmlnaW4gPSBOVUxMOworICBpbnQgcmVzdWx0ID0gMDsKKyAgLy8gTWFrZSBhIGxpc3Qgb2YgdGhpbmdzIGluIHRoZSB2aW5jaW5pdHkgb2YgZXhwYW5zaW9uIGNhbmRpZGF0ZQorICAvLyBpbiBleHBhbnNpb25QcmVmaXhlcyBhbmQgZXhwYW5zaW9uQWZ0ZXIgd2UgaGF2ZSBzdG9yZWQgdGhlCisgIC8vIHByZWZpeGVzIG9mIHN0dWZmIHRoYXQgY2F1c2VkIHRoZSBkZXRlY3Rpb24gb2YgYW4gZXhwYW5zaW9uCisgIC8vIGFuZCBhIHBvc2l0aW9uIHdoZXJlIHRoZSBleHBhbnNpb24gd2FzLiAKKyAgLy8gRm9yIGV4YW1wbGUgKGljdSwgZGVfX1BIT05FQk9PSyksIHdlIGhhZDoKKyAgLy8gYUUgPDw8IFx1MDBFNCA8IGFmCisgIC8vIEFEIDwgXHUwMEU0IDw8PCBBZQorICAvLyBGcm9tIHRoYXQgd2Ugd2lsbCBjb25zdHJ1Y3QgdGhlIGZvbGxvd2luZyBzZXF1ZW5jZToKKyAgLy8gQUQgPCBhRSA8PDwgXHUwMEU0LyA8PDwgQWUgPCBhZgorICAvLyB0aGVuIHdlIHdpbGwgdGFrZSB0aGUgdmluY2luaXR5IG9mIFx1MDBFNDoKKyAgLy8gYUUgPDw8IFx1MDBFNC8gPDw8IEFlCisgIC8vIHRoZW4gd2Ugd2lsbCBjaG9vc2UgdGhlIHNtYWxsZXN0IGV4cGFuc2lvbiB0byBiZSB0aGUgZXhwYW5zaW9uCisgIC8vIHBhcnQ6ICdlJy4KKyAgLy8gaWYgdGhlcmUgaXMgZXF1YWxpdHksIHdlIGNob29zZSB0aGUgZXF1YWwgcGFydDoKKyAgLy8gKHdpbjMyLCBkZV9fUEhPTkVCT09LKToKKyAgLy8gQUQgPCBcdTAwRTQvID0gYWUgPDw8IGFFIDw8PCBBZQorICAvLyB3ZSBjaG9vc2UgJ2UnLgorCisgIHdoaWxlKChlbCA9IGdFeHBhbnNpb25zLm5leHRFbGVtZW50KGhhc2hJbmRleCkpICE9IE5VTEwpIHsKKyAgICBuZXdTaXplID0gMDsKKyAgICBjdXJyZW50ID0gKExpbmUgKillbC0+dmFsdWUucG9pbnRlcjsKKyAgICBjdXJyU2l6ZSA9IHNpemUqY3VycmVudC0+ZXhwYW5zaW9uUHJlZml4ZXNTaXplOworICAgIGlmKGdEZWJ1ZykgeworICAgICAgZXNjYXBlQUxpbmUoY3VycmVudCwgbG9nKTsKKyAgICAgIHVfZnByaW50Zihsb2csICIgTnVtYmVyOiAlaVxuIiwgY3VycmVudC0+ZXhwYW5zaW9uUHJlZml4ZXNTaXplKTsKKyAgICB9CisgICAgLy8gY29uc3RydWN0IHRoZSBkb3VibGVzIAorICAgIGZvcihpID0gMDsgaSA8IGN1cnJlbnQtPmV4cGFuc2lvblByZWZpeGVzU2l6ZTsgaSsrKSB7CisgICAgICBkb3VibGVzW25ld1NpemVdLnN1ZmZpeCA9IGN1cnJlbnQtPmV4cGFuc2lvbkFmdGVyW2ldLTE7CisgICAgICBkb3VibGVzW25ld1NpemUrK10uc2V0VG9Db25jYXQoKihnTGluZXMrY3VycmVudC0+ZXhwYW5zaW9uUHJlZml4ZXNbaV0pLCAqKGdMaW5lcytjdXJyZW50LT5leHBhbnNpb25BZnRlcltpXS0xKSk7CisgICAgICBkb3VibGVzW25ld1NpemVdLnN1ZmZpeCA9IGN1cnJlbnQtPmV4cGFuc2lvbkFmdGVyW2ldOworICAgICAgZG91Ymxlc1tuZXdTaXplKytdLnNldFRvQ29uY2F0KCooZ0xpbmVzK2N1cnJlbnQtPmV4cGFuc2lvblByZWZpeGVzW2ldKSwgKihnTGluZXMrY3VycmVudC0+ZXhwYW5zaW9uQWZ0ZXJbaV0pKTsKKyAgICB9CisgICAgLy8gYWRkIHRoZSBleHBhbnNpb24gd2UncmUgb2JzZXJ2aW5nCisgICAgZG91Ymxlc1tuZXdTaXplKytdID0gKmN1cnJlbnQ7CisgICAgc2V0QXJyYXkoc29ydGVyLCBkb3VibGVzLCBuZXdTaXplKTsKKyAgICBxc29ydChzb3J0ZXIsIG5ld1NpemUsIHNpemVvZihMaW5lKiksIGNvbXBhcmVyKTsKKyAgICBhbmFseXplU3RyZW5ndGgoc29ydGVyLCBuZXdTaXplLCBjb21wYXJlcik7CisgICAgaWYoZ0RlYnVnKSB7CisgICAgICBwcmludE9yZGVyaW5nKHNvcnRlciwgbmV3U2l6ZSwgbG9nKTsKKyAgICB9CisgICAgaSA9IDA7CisgICAgd2hpbGUoKiooc29ydGVyK2kpICE9ICpjdXJyZW50KSB7CisgICAgICBpKys7CisgICAgfQorICAgIC8vIGZpbmQgdGhlIHR3byBhZGRpdGlvbnMKKyAgICBpZigoKihzb3J0ZXIraSkpLT5zdHJlbmd0aCA9PSBVQ09MX0lERU5USUNBTCkgeworICAgICAgLy8gaWYgd2UgYWUgaWQKKyAgICAgIG9yaWdpbiA9ICooZ0xpbmVzKygoKihzb3J0ZXIraS0xKSktPnN1ZmZpeCkpOworICAgICAgdV9zdHJjcHkoY3VycmVudC0+ZXhwYW5zaW9uU3RyaW5nLCBvcmlnaW4tPm5hbWUpOworICAgICAgY3VycmVudC0+ZXhwTGVuID0gb3JpZ2luLT5sZW47CisgICAgfSBlbHNlIGlmKGkgPCBuZXdTaXplLTEgJiYgKCooc29ydGVyK2krMSkpLT5zdHJlbmd0aCA9PSBVQ09MX0lERU5USUNBTCkgeworICAgICAgb3JpZ2luID0gKihnTGluZXMrKCgqKHNvcnRlcitpKzEpKS0+c3VmZml4KSk7CisgICAgICB1X3N0cmNweShjdXJyZW50LT5leHBhbnNpb25TdHJpbmcsIG9yaWdpbi0+bmFtZSk7CisgICAgICBjdXJyZW50LT5leHBMZW4gPSBvcmlnaW4tPmxlbjsKKyAgICB9IGVsc2UgeworICAgICAgaWYoaSA+IDApIHsKKyAgICAgICAgcHJldiA9ICooZ0xpbmVzKygqKHNvcnRlcitpLTEpKS0+c3VmZml4KTsKKyAgICAgICAgaWYoaSA8IG5ld1NpemUtMSkgeworICAgICAgICAgIG5leHQgPSAqKGdMaW5lcysoKihzb3J0ZXIraSsxKSktPnN1ZmZpeCk7CisgICAgICAgICAgcmVzdWx0ID0gY29tcGFyZXIoJnByZXYsICZuZXh0KTsKKyAgICAgICAgICBpZihyZXN1bHQgPD0gMCkgeworICAgICAgICAgICAgdV9zdHJjcHkoY3VycmVudC0+ZXhwYW5zaW9uU3RyaW5nLCBwcmV2LT5uYW1lKTsKKyAgICAgICAgICAgIGN1cnJlbnQtPmV4cExlbiA9IHByZXYtPmxlbjsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdV9zdHJjcHkoY3VycmVudC0+ZXhwYW5zaW9uU3RyaW5nLCBuZXh0LT5uYW1lKTsKKyAgICAgICAgICAgIGN1cnJlbnQtPmV4cExlbiA9IG5leHQtPmxlbjsKKyAgICAgICAgICB9CisgICAgICAgIH0gICAgICAKKyAgICAgIH0KKyAgICAgIGlmKDApIHsgLy9pZihnRGVidWcpCisgICAgICAgIHVfZnByaW50Zihsb2csICJFeHBhbnNpb24gaXM6ICIpOworICAgICAgICBlc2NhcGVBTGluZShjdXJyZW50LCBsb2cpOworICAgICAgICB1X2ZwcmludGYobG9nLCAiLyIpOworICAgICAgICBlc2NhcGVFeHBhbnNpb24oY3VycmVudCwgbG9nKTsKKyAgICAgICAgdV9mcHJpbnRmKGxvZywgIlxuIik7CisgICAgICB9CisgICAgfQorICAgIG5vdGVFeHBhbnNpb24oY3VycmVudCk7CisgICAgLy9ub3RlRXhwYW5zaW9uKGdMaW5lcywgY3VycmVudCwgc2l6ZSwgY29tcGFyZXIpOworICAgIGlmKCFnUXVpZXQpIHsKKyAgICAgIHVfZnByaW50Zihsb2csICIuIik7CisgICAgfQorICB9CisgIGlmKCFnUXVpZXQpIHsKKyAgICB1X2ZwcmludGYobG9nLCAiXG4iKTsKKyAgfQorICBkZWxldGVbXSBkb3VibGVzOworICBkZWxldGVbXSBzb3J0ZXI7CisgIHJldHVybiBnRXhwYW5zaW9ucy5jb3VudCgpOworfQorCitVQm9vbAoraXNUYWlsb3JlZChMaW5lICpsaW5lLCBVRXJyb3JDb2RlICZzdGF0dXMpIHsKKyAgVUJvb2wgcmVzdWx0ID0gRkFMU0U7CisgIFVDb2xsYXRpb25FbGVtZW50cyAqdGFpbG9yaW5nID0gdWNvbF9vcGVuRWxlbWVudHMoZ0NvbCwgbGluZS0+bmFtZSwgbGluZS0+bGVuLCAmc3RhdHVzKTsKKyAgVUNvbGxhdGlvbkVsZW1lbnRzICp1Y2EgPSB1Y29sX29wZW5FbGVtZW50cyhnVUNBLCBsaW5lLT5uYW1lLCBsaW5lLT5sZW4sICZzdGF0dXMpOworCisgIGludDMyX3QgdGFpbEVsZW1lbnQgPSBVQ09MX05VTExPUkRFUjsKKyAgaW50MzJfdCB1Y2FFbGVtZW50ID0gVUNPTF9OVUxMT1JERVI7CisKKyAgZG8geworICAgIGRvIHsKKyAgICAgIHRhaWxFbGVtZW50ID0gdWNvbF9uZXh0KHRhaWxvcmluZywgJnN0YXR1cyk7CisgICAgfSB3aGlsZSh0YWlsRWxlbWVudCA9PSAwKTsKKyAgICBkbyB7CisgICAgICB1Y2FFbGVtZW50ID0gdWNvbF9uZXh0KHVjYSwgJnN0YXR1cyk7CisgICAgfSB3aGlsZSh1Y2FFbGVtZW50ID09IDApOworICAgIGlmKHRhaWxFbGVtZW50ICE9IHVjYUVsZW1lbnQpIHsKKyAgICAgIHJlc3VsdCA9IFRSVUU7CisgICAgICBicmVhazsKKyAgICB9CisgIH0gd2hpbGUgKHRhaWxFbGVtZW50ICE9IFVDT0xfTlVMTE9SREVSICYmIHVjYUVsZW1lbnQgIT0gVUNPTF9OVUxMT1JERVIpOworCisgIHVjb2xfY2xvc2VFbGVtZW50cyh0YWlsb3JpbmcpOworICB1Y29sX2Nsb3NlRWxlbWVudHModWNhKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZAorcmVkdWNlVW50YWlsb3JlZChMaW5lICoqZ0xpbmVzLCBpbnQzMl90IHNpemUpeworICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgTGluZSAqY3VycmVudCA9ICooZ0xpbmVzKTsKKyAgTGluZSAqcHJldmlvdXMgPSBOVUxMOworICB3aGlsZShjdXJyZW50KSB7CisgICAgLy8gaWYgdGhlIGN1cnJlbnQgbGluZSBpcyBub3QgdGFpbG9yZWQgYWNjb3JkaW5nIHRvIHRoZSBVQ0EKKyAgICBpZighaXNUYWlsb3JlZChjdXJyZW50LCBzdGF0dXMpKSB7CisgICAgICAvLyB3ZSByZW1vdmUgaXQKKyAgICAgIGN1cnJlbnQtPmlzUmVtb3ZlZCA9IFRSVUU7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIGlmIGl0J3MgdGFpbG9yZWQgCisgICAgICBpZihjdXJyZW50LT5wcmV2aW91cyAmJiBjdXJyZW50LT5wcmV2aW91cy0+aXNSZW1vdmVkID09IFRSVUUpIHsKKyAgICAgICAgcHJldmlvdXMgPSBjdXJyZW50LT5wcmV2aW91czsKKyAgICAgICAgd2hpbGUocHJldmlvdXMgJiYgKHByZXZpb3VzLT5zdHJlbmd0aCA+IGN1cnJlbnQtPnN0cmVuZ3RoIHx8IHByZXZpb3VzLT5pc0V4cGFuc2lvbiB8fCBwcmV2aW91cy0+aXNDb250cmFjdGlvbikgJiYgcHJldmlvdXMtPmlzUmVtb3ZlZCkgeworICAgICAgICAgIGlmKHByZXZpb3VzLT5wcmV2aW91cyAmJiBwcmV2aW91cy0+cHJldmlvdXMtPmlzUmVtb3ZlZCkgeworICAgICAgICAgICAgcHJldmlvdXMgPSBwcmV2aW91cy0+cHJldmlvdXM7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZihwcmV2aW91cykgeworICAgICAgICAgIHByZXZpb3VzLT5pc1Jlc2V0ID0gVFJVRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAoKihnTGluZXMpKS0+aXNSZXNldCA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHQ7CisgIH0KK30KKwordm9pZAorY29uc3RydWN0QW5kQW5hbHl6ZShMaW5lICoqZ0xpbmVzLCBMaW5lICpsaW5lcywgaW50MzJfdCBzaXplLCBDb21wYXJlRm4gY29tcGFyZXIpIHsKKyAgaW50MzJfdCBpID0gMCwgaiA9IDAsIGsgPSAwOworICAvLyBzZXR1cCBvdXIgY29tcGFyZSBhcnJheXMgdG8gcG9pbnQgdG8gc2luZ2xlIHNldC4KKworICAvLyBGb3IgY29udHJhY3Rpb25zIHdlIG5lZWQgYSBibG9jayBvZiBkYXRhCisgIHNldEFycmF5KGdMaW5lcywgbGluZXMsIHNpemUpOworICAvL3NpemUgPSBzZXRBcnJheShnTGluZXMpOworCisgIHFzb3J0KGdMaW5lcywgc2l6ZSwgc2l6ZW9mKExpbmUgKiksIGNvbXBhcmVyKTsKKworICAvLyBFc3RhYmxpc2ggd2hvIGlzIHByZXZpb3VzIGFjY29yZGluZyB0byB0aGUgc29ydCBvcmRlcgorICAvL3NldEluZGV4ZXMoZ0xpbmVzLCBzaXplKTsKKworICBhbmFseXplU3RyZW5ndGgoZ0xpbmVzLCBzaXplLCBjb21wYXJlcik7CisgIGlmKGdWZXJib3NlKSB7CisgICAgdV9mcHJpbnRmKGxvZywgIk9yZGVyaW5nOlxuIik7CisgICAgcHJpbnRPcmRlcmluZyhnTGluZXMsIHNpemUsIGxvZyk7CisgIH0KKworICAvL3Nob3dEaWZmZXJlbmNlcyhleGVtcGxhclNldFNpemUpOworICAvL2R1bXBEYXRhKGV4ZW1wbGFyU2V0U2l6ZSk7CisKKyAgaWYoIWdRdWlldCkgeworICAgIHVfZnByaW50Zihsb2csICJEZXRlY3RpbmcgY29udHJhY3Rpb25zP1xuIik7CisgIH0KKyAgaW50MzJfdCBub0NvbnRyYWN0aW9ucyA9IDA7CisgIG5vQ29udHJhY3Rpb25zID0gZGV0ZWN0Q29udHJhY3Rpb25zKGdMaW5lcywgbGluZXMsIHNpemUsIGNvbXBhcmVyKTsKKyAgaWYoIWdRdWlldCkgeworICAgIHVfZnByaW50Zihsb2csICJEZXRlY3RlZCAlaSBjb250cmFjdGlvbnNcbiIsIG5vQ29udHJhY3Rpb25zKTsKKyAgfQorCisgIC8vIG5vdyB3ZSBoYXZlIHN1c3BlY3RlZCBjb250cmFjdGlvbnMgaW4gdGhlIHRhYmxlCisgIC8vIHdlIGhhdmUgdG8gcmUtc29ydCB0aGUgdGhpbmdzIAorICBzaXplID0gc2V0QXJyYXkoZ0xpbmVzKTsKKyAgcXNvcnQoZ0xpbmVzLCBzaXplLCBzaXplb2YoTGluZSAqKSwgY29tcGFyZXIpOworICBhbmFseXplU3RyZW5ndGgoZ0xpbmVzLCBzaXplLCBjb21wYXJlcik7CisKKyAgaWYoIWdRdWlldCkgeworICAgIHVfZnByaW50Zihsb2csICJEZXRlY3RpbmcgZXhwYW5zaW9uc1xuIik7CisgIH0KKyAgaW50MzJfdCBub0V4cGFuc2lvbnMgPSBkZXRlY3RFeHBhbnNpb25zKGdMaW5lcywgc2l6ZSwgY29tcGFyZXIpOworICBpZighZ1F1aWV0KSB7CisgICAgdV9mcHJpbnRmKGxvZywgIkRldGVjdGVkICVpIGV4cGFuc2lvbnNcbiIsIG5vRXhwYW5zaW9ucyk7CisgIH0KKworICBwb3NpdGlvbkV4cGFuc2lvbnMoZ0xpbmVzLCBzaXplLCBjb21wYXJlcik7CisKKyAgaWYoZ1ZlcmJvc2UpIHsKKyAgICB1X2ZwcmludGYobG9nLCAiQWZ0ZXIgcG9zaXRpb25pbmcgZXhwYW5zaW9uczpcbiIpOworICAgIHByaW50T3JkZXJpbmcoZ0xpbmVzLCBzaXplLCBsb2csIFRSVUUpOworICB9CisgIC8vcmVkdWNlVW50YWlsb3JlZChnTGluZXMsIHNpemUpOworICBpZighZ1F1aWV0KSB7CisgICAgdV9mcHJpbnRmKG91dCwgIkZpbmFsIHJlc3VsdFxuIik7CisgIH0KKyAgcHJpbnRPcmRlcmluZyhnTGluZXMsIHNpemUsIG91dCwgVFJVRSk7CisgIHByaW50T3JkZXJpbmcoZ0xpbmVzLCBzaXplLCBsb2csIFRSVUUpOworfQorCisvLyBDaGVjayB3aGV0aGVyIHVwcGVyIGNhc2UgY29tZXMgYmVmb3JlIGxvd2VyIGNhc2Ugb3IgdmljZS12ZXJzYQoraW50MzJfdCAKK2NoZWNrQ2FzZU9yZGVyaW5nKHZvaWQpIHsKKyAgVUNoYXIgc3R1ZmZbXVszXSA9IHsKKyAgICB7IDB4MDA2MSwgc2VwYXJhdG9yQ2hhciwgMHgwMDYxfSwgLy8iYWEiLAorICAgIHsgMHgwMDYxLCBzZXBhcmF0b3JDaGFyLCAweDAwNDEgfSwgLy8iYVxcdTAwRTAiLAorICAgIHsgMHgwMDQxLCBzZXBhcmF0b3JDaGFyLCAweDAwNjEgfSwgLy8iXFx1MDBFMGEiLAorICAgIHsgMHgwMDQxLCBzZXBhcmF0b3JDaGFyLCAweDAwNDEgfSwgLy8iXFx1MDBFMGEiLAorICAgIC8veyAweDAwRTAsIHNlcGFyYXRvckNoYXIsIDB4MDBFMCB9ICAvLyJcXHUwMEUwXFx1MDBFMCIKKyAgfTsKKyAgY29uc3QgaW50MzJfdCBzaXplID0gc2l6ZW9mKHN0dWZmKS9zaXplb2Yoc3R1ZmZbMF0pOworCisgIExpbmUgKipzb3J0ZWRMaW5lcyA9IG5ldyBMaW5lKltzaXplXTsKKyAgTGluZSBsaW5lc1tzaXplXTsKKworICBpbnQzMl90IGkgPSAwOworICBpbnQzMl90IG9yZGVyZWQgPSAwLCByZXZlcnNlZCA9IDA7CisKKyAgZm9yKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgbGluZXNbaV0uc2V0TmFtZShzdHVmZltpXSwgMyk7CisgIH0KKyAgc2V0QXJyYXkoc29ydGVkTGluZXMsIGxpbmVzLCBzaXplKTsKKyAgcXNvcnQoc29ydGVkTGluZXMsIHNpemUsIHNpemVvZihMaW5lKiksIGdDb21wYXJlcik7CisKKyAgZm9yKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgaWYoKihzb3J0ZWRMaW5lcytpKSA9PSAmbGluZXNbaV0pIHsKKyAgICAgIG9yZGVyZWQrKzsKKyAgICB9CisgICAgaWYoKihzb3J0ZWRMaW5lcytpKSA9PSAmbGluZXNbc2l6ZS1pLTFdKSB7CisgICAgICByZXZlcnNlZCsrOworICAgIH0KKyAgfQorCisgIGRlbGV0ZVtdIHNvcnRlZExpbmVzOworICBpZihvcmRlcmVkID09IHNpemUpIHsKKyAgICByZXR1cm4gMDsgLy8gaW4gbm9ybWFsIG9yZGVyCisgIH0gZWxzZSBpZihyZXZlcnNlZCA9PSBzaXplKSB7CisgICAgcmV0dXJuIDE7IC8vIGluIHJldmVyc2VkIG9yZGVyCisgIH0gZWxzZSB7CisgICAgcmV0dXJuIC0xOyAvLyB1bmtub3duIG9yZGVyCisgIH0KK30KKworCisvLyBDaGVjayB3aGV0aGVyIHRoZSBzZWNvbmRhcmllcyBhcmUgaW4gdGhlIHN0cmFpZ2h0IG9yIHJldmVyc2VkIG9yZGVyCitpbnQzMl90IAorY2hlY2tTZWNvbmRhcnlPcmRlcmluZyh2b2lkKSB7CisgIFVDaGFyIHN0dWZmW11bNV0gPSB7CisgICAgeyAweDAwNjEsIHNlcGFyYXRvckNoYXIsIDB4MDA2MSwgc2VwYXJhdG9yQ2hhciwgMHgwMEUwIH0sIC8vImFhIiwKKyAgICB7IDB4MDA2MSwgc2VwYXJhdG9yQ2hhciwgMHgwMEUwLCBzZXBhcmF0b3JDaGFyLCAweDAwNjEgfSwgLy8iYVxcdTAwRTAiLAorICAgIHsgMHgwMEUwLCBzZXBhcmF0b3JDaGFyLCAweDAwNjEsIHNlcGFyYXRvckNoYXIsIDB4MDA2MSB9LCAvLyJcXHUwMEUwYSIsCisgICAgLy97IDB4MDBFMCwgc2VwYXJhdG9yQ2hhciwgMHgwMEUwIH0gIC8vIlxcdTAwRTBcXHUwMEUwIgorICB9OworICBjb25zdCBpbnQzMl90IHNpemUgPSBzaXplb2Yoc3R1ZmYpL3NpemVvZihzdHVmZlswXSk7CisKKyAgTGluZSAqKnNvcnRlZExpbmVzID0gbmV3IExpbmUqW3NpemVdOworICBMaW5lIGxpbmVzW3NpemVdOworCisgIGludDMyX3QgaSA9IDA7CisgIGludDMyX3Qgb3JkZXJlZCA9IDAsIHJldmVyc2VkID0gMDsKKworICBmb3IoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICBsaW5lc1tpXS5zZXROYW1lKHN0dWZmW2ldLCA1KTsKKyAgfQorICBzZXRBcnJheShzb3J0ZWRMaW5lcywgbGluZXMsIHNpemUpOworICBxc29ydChzb3J0ZWRMaW5lcywgc2l6ZSwgc2l6ZW9mKExpbmUqKSwgZ0NvbXBhcmVyKTsKKworICBmb3IoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICBpZigqKHNvcnRlZExpbmVzK2kpID09ICZsaW5lc1tpXSkgeworICAgICAgb3JkZXJlZCsrOworICAgIH0KKyAgICBpZigqKHNvcnRlZExpbmVzK2kpID09ICZsaW5lc1tzaXplLWktMV0pIHsKKyAgICAgIHJldmVyc2VkKys7CisgICAgfQorICB9CisKKyAgZGVsZXRlW10gc29ydGVkTGluZXM7CisgIGlmKG9yZGVyZWQgPT0gc2l6ZSkgeworICAgIHJldHVybiAwOyAvLyBpbiBub3JtYWwgb3JkZXIKKyAgfSBlbHNlIGlmKHJldmVyc2VkID09IHNpemUpIHsKKyAgICByZXR1cm4gMTsgLy8gaW4gcmV2ZXJzZWQgb3JkZXIKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gLTE7IC8vIHVua25vd24gb3JkZXIKKyAgfQorfQorCisvLyBXZSBoYXZlIHRvIHJlbW92ZSBpZ25vcmFibGUgY2hhcmFjdGVycyBmcm9tIHRoZSBleGVtcGxhciBzZXQsCisvLyBvdGhlcndpc2UsIHdlIGdldCBtZXNzZWQgdXAgcmVzdWx0cwordm9pZCByZW1vdmVJZ25vcmFibGVDaGFycyhVbmljb2RlU2V0ICZleGVtcGxhclVTZXQsIENvbXBhcmVGbiBjb21wYXJlciwgVUVycm9yQ29kZSAmc3RhdHVzKSB7CisgIFVuaWNvZGVTZXQgaWdub3JhYmxlcywgcHJpbWFyeUlnbm9yYWJsZXM7CisgIFVuaWNvZGVTZXRJdGVyYXRvciBleGVtcGxhclVTZXRJdGVyKGV4ZW1wbGFyVVNldCk7CisgIGV4ZW1wbGFyVVNldEl0ZXIucmVzZXQoKTsKKyAgTGluZSBlbXB0eTsKKyAgTGluZSAqZW1wdHlQID0gJmVtcHR5OworICBMaW5lIGN1cnJlbnQ7CisgIExpbmUgKmN1cnJMaW5lID0gJmN1cnJlbnQ7CisgIFVDb2xBdHRyaWJ1dGVWYWx1ZSBzdHJlbmd0aCA9IFVDT0xfT0ZGOworCisKKyAgd2hpbGUoZXhlbXBsYXJVU2V0SXRlci5uZXh0KCkpIHsKKyAgICBpZihleGVtcGxhclVTZXRJdGVyLmlzU3RyaW5nKCkpIHsgLy8gcHJvY2VzcyBhIHN0cmluZworICAgICAgdV9tZW1jcHkoY3VyckxpbmUtPm5hbWUsIGV4ZW1wbGFyVVNldEl0ZXIuZ2V0U3RyaW5nKCkuZ2V0QnVmZmVyKCksIGV4ZW1wbGFyVVNldEl0ZXIuZ2V0U3RyaW5nKCkubGVuZ3RoKCkpOworICAgICAgY3VyckxpbmUtPmxlbiA9IGV4ZW1wbGFyVVNldEl0ZXIuZ2V0U3RyaW5nKCkubGVuZ3RoKCk7CisgICAgICBzdHJlbmd0aCA9IHByb2JlU3RyZW5ndGgoJmVtcHR5UCwgJmN1cnJMaW5lLCBjb21wYXJlcik7CisgICAgICBpZihzdHJlbmd0aCA9PSBVQ09MX0lERU5USUNBTCkgeworICAgICAgICBpZ25vcmFibGVzLmFkZChleGVtcGxhclVTZXRJdGVyLmdldFN0cmluZygpKTsKKyAgICAgIH0gZWxzZSBpZihzdHJlbmd0aCA+IFVDT0xfUFJJTUFSWSkgeworICAgICAgICBwcmltYXJ5SWdub3JhYmxlcy5hZGQoZXhlbXBsYXJVU2V0SXRlci5nZXRTdHJpbmcoKSk7CisgICAgICB9CisgICAgfSBlbHNlIHsgLy8gcHJvY2VzcyBjb2RlIHBvaW50CisgICAgICBVQm9vbCBpc0Vycm9yID0gRkFMU0U7CisgICAgICBVQ2hhcjMyIGNvZGVQb2ludCA9IGV4ZW1wbGFyVVNldEl0ZXIuZ2V0Q29kZXBvaW50KCk7CisgICAgICBjdXJyTGluZS0+bGVuID0gMDsKKyAgICAgIFUxNl9BUFBFTkQoY3VyckxpbmUtPm5hbWUsIGN1cnJMaW5lLT5sZW4sIDI1LCBjb2RlUG9pbnQsIGlzRXJyb3IpOworICAgICAgc3RyZW5ndGggPSBwcm9iZVN0cmVuZ3RoKCZlbXB0eVAsICZjdXJyTGluZSwgY29tcGFyZXIpOworICAgICAgaWYoc3RyZW5ndGggPT0gVUNPTF9JREVOVElDQUwpIHsKKyAgICAgICAgaWdub3JhYmxlcy5hZGQoY29kZVBvaW50KTsKKyAgICAgIH0gZWxzZSBpZihzdHJlbmd0aCA+IFVDT0xfUFJJTUFSWSkgeworICAgICAgICBwcmltYXJ5SWdub3JhYmxlcy5hZGQoY29kZVBvaW50KTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworCisKKyAgZXhlbXBsYXJVU2V0LnJlbW92ZUFsbChpZ25vcmFibGVzKTsKKyAgZXhlbXBsYXJVU2V0LnJlbW92ZUFsbChwcmltYXJ5SWdub3JhYmxlcyk7CisKKyAgVW5pY29kZVN0cmluZyByZW1vdmVkUGF0dGVybjsKKyAgaWYoaWdub3JhYmxlcy5zaXplKCkpIHsKKyAgICB1X2ZwcmludGYobG9nLCAiSWdub3JhYmxlczpcbiIpOworICAgIGlnbm9yYWJsZXMudG9QYXR0ZXJuKHJlbW92ZWRQYXR0ZXJuLCBUUlVFKTsKKyAgICByZW1vdmVkUGF0dGVybi5zZXRDaGFyQXQocmVtb3ZlZFBhdHRlcm4ubGVuZ3RoKCksIDApOworICAgIGVzY2FwZVN0cmluZyhyZW1vdmVkUGF0dGVybi5nZXRCdWZmZXIoKSwgcmVtb3ZlZFBhdHRlcm4ubGVuZ3RoKCksIGxvZyk7CisgICAgdV9mcHJpbnRmKGxvZywgIlxuIik7CisgIH0KKyAgaWYocHJpbWFyeUlnbm9yYWJsZXMuc2l6ZSgpKSB7CisgICAgdV9mcHJpbnRmKGxvZywgIlByaW1hcnkgaWdub3JhYmxlczpcbiIpOworICAgIHByaW1hcnlJZ25vcmFibGVzLnRvUGF0dGVybihyZW1vdmVkUGF0dGVybiwgVFJVRSk7CisgICAgcmVtb3ZlZFBhdHRlcm4uc2V0Q2hhckF0KHJlbW92ZWRQYXR0ZXJuLmxlbmd0aCgpLCAwKTsKKyAgICBlc2NhcGVTdHJpbmcocmVtb3ZlZFBhdHRlcm4uZ2V0QnVmZmVyKCksIHJlbW92ZWRQYXR0ZXJuLmxlbmd0aCgpLCBsb2cpOworICAgIHVfZnByaW50Zihsb2csICJcbiIpOworICB9CisKK30KKworLy8gVE9ETzogZGV2ZWxvcCBsb2dpYyBmb3IgY2hvb3NpbmcgYm91bmRhcnkgY2hhcmFjdGVycyAtIHJpZ2h0IG5vdyBpdCBpcyBoYXJkY29kZWQKKy8vIEl0IHNob3VsZCBiZSBhIGZ1bmN0aW9uIG9mIHVzZWQgc2NyaXB0cy4gQWxzbywgY2hlY2sgd2hldGhlciB3ZSBuZWVkIHRvIHNhdmUgCisvLyB1c2VkIHNjcmlwdCBuYW1lcwordm9pZCBhZGRVdGlsaXR5Q2hhcnMoVW5pY29kZVNldCAmZXhlbXBsYXJVU2V0LCBVRXJyb3JDb2RlICZzdGF0dXMpIHsKKworICAvLyBpbiBvcmRlciB0byBnZXQgbmljZSBydWxlcywgd2UgbmVlZCB0byBhZGQgc29tZSBjaGFyYWN0ZXJzIHRvIHRoZQorICAvLyBzdGFydGluZyBzZXQuIFRoZXNlIGFyZSBtb3N0bHkgcGFydHMgb2YgY29tcGF0aWJpdHkgY29tcG9zZWQgY2hhcmFjdGVycywKKyAgLy8gc3VjaCBhcyBMLW1pZGRsZSBkb3QgKG1pZGRsZSBkb3QgaXMgMHgwMEI3KS4gSWYgd2UgZG9uJ3QgYWRkIHRoZXNlLCB3ZSB3b3VsZAorICAvLyBnZXQgYSByZXNldCBhdCBhIGZ1bmt5IGNoYXJhY3Rlciwgc3VjaCBhcyBMLW1pZGRsZSBkb3QuIFRoaXMgbGlzdCB3aWxsIHByb2JhYmx5CisgIC8vIGdyb3cuCisgIGV4ZW1wbGFyVVNldC5hZGQoMHgwMEI3KTsKKworICAvLyB0aGVzZSB0aGluZ3MgcmVwcmVzZW50IGEgc2NyaXB0IGJlZm9yZSB0aGUgdGFyZ2V0IHNjcmlwdCBhbmQgCisgIC8vIGEgc2NyaXB0IGFmdGVyLiBNb3JlIGxvZ2ljIHNob3VsZCBiZSBhZGRlZCBzbyB0aGF0IHRoZXNlIGNoYXJhY3RlcnMgYXJlCisgIC8vIGNob3NlbiBhdXRvbWF0aWNhbGx5CisKKyAgZXhlbXBsYXJVU2V0LmFkZCgweDAwMzgpOworICBleGVtcGxhclVTZXQuYWRkKDB4MDAzOSk7CisKKyAgLy9leGVtcGxhclVTZXQuYWRkKDB4MDQzMyk7CisgIC8vZXhlbXBsYXJVU2V0LmFkZCgweDA0MzYpOworICBleGVtcGxhclVTZXQuYWRkKDB4ZmEyOSk7CisgIGV4ZW1wbGFyVVNldC5hZGQoMHhmYTI4KTsKK30KKwordm9pZAorZ2V0RXhlbXBsYXJzKGNvbnN0IGNoYXIgKmxvY2FsZSwgVW5pY29kZVNldCAmZXhlbXBsYXJzLCBVRXJyb3JDb2RlICZzdGF0dXMpIHsKKyAgLy8gZmlyc3Qgd2UgZmlsbCBvdXQgc3RydWN0dXJlcyB3aXRoIGV4ZW1wbGFyIGNoYXJhY3RlcnMuCisgIFVSZXNvdXJjZUJ1bmRsZSAqcmVzID0gdXJlc19vcGVuKE5VTEwsIGxvY2FsZSwgJnN0YXR1cyk7CisgIGludDMyX3QgZXhlbXBsYXJMZW5ndGggPSAwOworICBVbmljb2RlU3RyaW5nIGV4ZW1wbGFyU3RyaW5nID0gdXJlc19nZXRVbmljb2RlU3RyaW5nQnlLZXkocmVzLCAiRXhlbXBsYXJDaGFyYWN0ZXJzIiwgJnN0YXR1cyk7CisgIGV4ZW1wbGFycy5jbGVhcigpOworICBleGVtcGxhcnMuYXBwbHlQYXR0ZXJuKGV4ZW1wbGFyU3RyaW5nLCBzdGF0dXMpOworICB1cmVzX2Nsb3NlKHJlcyk7Cit9CisKK3ZvaWQKK3ByZXBhcmVTdGFydGluZ1NldChVbmljb2RlU2V0ICZleGVtcGxhclVTZXQsIENvbXBhcmVGbiBjb21wYXJlciwgVUVycm9yQ29kZSAmc3RhdHVzKSB7CisgIGludDMyX3QgaSA9IDA7CisgIFVuaWNvZGVTdHJpbmcgZXhlbXBsYXJTdHJpbmc7CisgIGV4ZW1wbGFyVVNldC50b1BhdHRlcm4oZXhlbXBsYXJTdHJpbmcpOworICAvLyBQcm9kdWNlIGNhc2UgY2xvc3VyZSBvZiBleGVtcGxhciBjaGFyYWN0ZXJzCisgIC8vIFRoZW4gd2Ugd2FudCB0byBmaWd1cmUgb3V0IHdoYXQgaXMgdGhlIHNjcmlwdCBvZiB0aGUgZXhlbXBsYXIgY2hhcmFjdGVycworICAvLyBqdXN0IHBpY2sgc2V2ZXJhbCBhbmQgc2VlIHRoZWlyIHNjcmlwdAorICBjb25zdCBjaGFyKiB1c2VkU2NyaXB0TmFtZXNbVVNDUklQVF9DT0RFX0xJTUlUXTsKKyAgaW50MzJfdCBudW1iZXJPZlVzZWRTY3JpcHRzID0gMDsKKyAgY2hhciBzY3JpcHRTZXRQYXR0ZXJuWzI1Nl07CisgIFVuaWNvZGVTdHJpbmcgcGF0dGVybjsgLy8gZm9yIGRlYnVnZ2luZworICBVQ2hhcjMyIGV4Q2hhciA9IC0xOworICB3aGlsZShleGVtcGxhclVTZXQuc2l6ZSgpICE9IDAgJiYgKGV4Q2hhciA9IGV4ZW1wbGFyVVNldC5jaGFyQXQoMCkpICE9IC0xKSB7IAorICAgIGludDMyX3Qgc2NyaXB0Tm8gPSB1X2dldEludFByb3BlcnR5VmFsdWUoZXhDaGFyLCBVQ0hBUl9TQ1JJUFQpOworICAgIHVzZWRTY3JpcHROYW1lc1tudW1iZXJPZlVzZWRTY3JpcHRzXSA9IHVfZ2V0UHJvcGVydHlWYWx1ZU5hbWUoVUNIQVJfU0NSSVBULCBzY3JpcHRObywgVV9TSE9SVF9QUk9QRVJUWV9OQU1FKTsKKyAgICBzcHJpbnRmKHNjcmlwdFNldFBhdHRlcm4sICJbOiVzOl0iLCB1c2VkU2NyaXB0TmFtZXNbbnVtYmVyT2ZVc2VkU2NyaXB0c10pOworICAgIG51bWJlck9mVXNlZFNjcmlwdHMrKzsKKyAgICBVbmljb2RlU2V0IHNjcmlwdFNldChVbmljb2RlU3RyaW5nKHNjcmlwdFNldFBhdHRlcm4sICIiKSwgc3RhdHVzKTsKKyAgICBleGVtcGxhclVTZXQucmVtb3ZlQWxsKHNjcmlwdFNldCk7CisgICAgZXhlbXBsYXJVU2V0LnRvUGF0dGVybihwYXR0ZXJuLCBUUlVFKTsKKyAgfQorICBleGVtcGxhclVTZXQuY2xlYXIoKTsKKworICAvLyBhbHdheXMgYWRkIEFTQ0lJCisgIC8vZXhlbXBsYXJVU2V0LmFkZEFsbChVbmljb2RlU2V0KFVuaWNvZGVTdHJpbmcoIltcXHUwMDIwLVxcdTAwN2ZdIiwgIiIpLCBzdGF0dXMpKTsKKyAgZXhlbXBsYXJVU2V0LmFkZEFsbChVbmljb2RlU2V0KFVuaWNvZGVTdHJpbmcoIltcXHUwMDQxLVxcdTAwNWJdIiwgIiIpLCBzdGF0dXMpKTsKKyAgaWYoZ0V4ZW1wbGFyKSB7CisgICAgZXhlbXBsYXJVU2V0LmFwcGx5UGF0dGVybihleGVtcGxhclN0cmluZywgc3RhdHVzKTsKKyAgICBleGVtcGxhclVTZXQuY2xvc2VPdmVyKFVTRVRfQ0FTRSk7CisgICAgaWYoIWdRdWlldCkgeworICAgICAgdV9mcHJpbnRmKG91dCwgIklDVSBleGVtcGxhciBjaGFyYWN0ZXJzOlxuIik7CisgICAgICBlc2NhcGVTdHJpbmcoZXhlbXBsYXJTdHJpbmcuZ2V0QnVmZmVyKCksIGV4ZW1wbGFyU3RyaW5nLmxlbmd0aCgpLCBvdXQpOworICAgICAgdV9mcHJpbnRmKG91dCwgIlxuIik7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmKCFnUXVpZXQpIHsKKyAgICAgIHVfZnByaW50ZihvdXQsICJVc2luZyBzY3JpcHRzOlxuIik7CisgICAgfQorICAgIC8vIGFkZCBpbnRlcmVzdGluZyBzY3JpcHRzCisgICAgZm9yKGkgPSAwOyBpIDwgbnVtYmVyT2ZVc2VkU2NyaXB0czsgaSsrKSB7CisgICAgICBzcHJpbnRmKHNjcmlwdFNldFBhdHRlcm4sICJbOiVzOl0iLCB1c2VkU2NyaXB0TmFtZXNbaV0pOworICAgICAgZXhlbXBsYXJVU2V0LmFkZEFsbChVbmljb2RlU2V0KFVuaWNvZGVTdHJpbmcoc2NyaXB0U2V0UGF0dGVybiwgIiIpLCBzdGF0dXMpKTsKKyAgICAgIGlmKCFnUXVpZXQpIHsKKyAgICAgICAgdV9mcHJpbnRmKG91dCwgIiVzXG4iLCBzY3JpcHRTZXRQYXR0ZXJuKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworCisgIHJlbW92ZUlnbm9yYWJsZUNoYXJzKGV4ZW1wbGFyVVNldCwgY29tcGFyZXIsIHN0YXR1cyk7CisKKyAgYWRkVXRpbGl0eUNoYXJzKGV4ZW1wbGFyVVNldCwgc3RhdHVzKTsKKworLyoKKyAgLy8gdHJ5IHRvIGNoZWNrIHdoZXRoZXIgdGFpbG9yZWQgc2V0IGFuZCBleGVtcGxhciBjaGFyYWN0ZXJzIG1hdGNoLgorICBVU2V0ICp0YWlsb3JlZCA9IHVjb2xfZ2V0VGFpbG9yZWRTZXQoZ0NvbCwgJnN0YXR1cyk7CisgIFVCb29sIHRhaWxvcmVkQ29udGFpbmVkID0gZXhlbXBsYXJVU2V0LmNvbnRhaW5zQWxsKCooKFVuaWNvZGVTZXQgKil0YWlsb3JlZCkpOworICBpZighdGFpbG9yZWRDb250YWluZWQpIHsKKyAgICAoKFVuaWNvZGVTZXQgKil0YWlsb3JlZCktPnJlbW92ZUFsbChleGVtcGxhclVTZXQpOworICAgIFVuaWNvZGVTdHJpbmcgcGF0dGVybjsKKyAgICAoKFVuaWNvZGVTZXQgKil0YWlsb3JlZCktPnRvUGF0dGVybihwYXR0ZXJuLCBUUlVFKTsKKyAgfQorICB1c2V0X2Nsb3NlKHRhaWxvcmVkKTsKKyovCisKKyAgLy9yZXR1cm4gZXhlbXBsYXJVU2V0OworfQorCit2b2lkIAorc2V0T3V0cHV0RmlsZShjb25zdCBjaGFyICpuYW1lLCBVRXJyb3JDb2RlICZzdGF0dXMpIHsKKyAgaW50MzJfdCBpID0gMDsKKyAgY2hhciBmaWxlbmFtZVsyNTZdOworICBzdHJjcHkoZmlsZW5hbWUsIG5hbWUpOworICBmb3IoaSA9IDA7IGkgPCBnUGxhdGZvcm1ObzsgaSsrKSB7CisgICAgc3RyY2F0KGZpbGVuYW1lLCAiXyIpOworICAgIHN0cmNhdChmaWxlbmFtZSwgcGxhdGZvcm1zW2dQbGF0Zm9ybUluZGV4ZXNbaV1dLm5hbWUpOworICB9CisgIGlmKGdFeGVtcGxhcikgeworICAgIHN0cmNhdChmaWxlbmFtZSwgIl9leGVtcGxhciIpOworICB9IGVsc2UgeworICAgIHN0cmNhdChmaWxlbmFtZSwgIl9zY3JpcHQiKTsKKyAgfQorICBzdHJjYXQoZmlsZW5hbWUsICIudXRmMTYudHh0Iik7CisgIG91dCA9IHVfZm9wZW4oZmlsZW5hbWUsICJ3YiIsICJlbiIsICJ1dGYtMTYiKTsKK30KKwordm9pZAorcHJvY2Vzc0NvbGxhdG9yKFVDb2xsYXRvciAqY29sLCBVRXJyb3JDb2RlICZzdGF0dXMpIHsKKyAgaW50MzJfdCBpID0gMDsKKyAgZ0NvbCA9IGNvbDsKKyAgVUNoYXIgcnVsZVN0cmluZ1sxNjM4NF07CisgIGludDMyX3QgcnVsZVN0cmluZ0xlbmd0aCA9IHVjb2xfZ2V0UnVsZXNFeChnQ29sLCBVQ09MX1RBSUxPUklOR19PTkxZLCBydWxlU3RyaW5nLCAxNjM4NCk7CisgIGlmKCFnUXVpZXQpIHsKKyAgICB1X2ZwcmludGYob3V0LCAiSUNVIHJ1bGVzOlxuIik7CisgICAgcHJpbnRSdWxlcyhydWxlU3RyaW5nLCBydWxlU3RyaW5nTGVuZ3RoLCBvdXQpOworICAgIHByaW50UnVsZXMocnVsZVN0cmluZywgcnVsZVN0cmluZ0xlbmd0aCwgbG9nKTsKKyAgICAvL2VzY2FwZVN0cmluZyhydWxlU3RyaW5nLCBydWxlU3RyaW5nTGVuZ3RoLCBvdXQpOworICAgIHVfZnByaW50ZihvdXQsICJcbiIpOworICB9CisgIGNvbnN0IGNoYXIgKmxvY2FsZSA9IHVjb2xfZ2V0TG9jYWxlKGdDb2wsIFVMT0NfUkVRVUVTVEVEX0xPQ0FMRSwgJnN0YXR1cyk7CisgIFVuaWNvZGVTZXQgZXhlbXBsYXJVU2V0OworICBpZihsb2NhbGUpIHsKKyAgICBnZXRFeGVtcGxhcnMobG9jYWxlLCBleGVtcGxhclVTZXQsIHN0YXR1cyk7CisgIH0gZWxzZSB7CisgICAgZXhlbXBsYXJVU2V0ID0gKigoVW5pY29kZVNldCAqKXVjb2xfZ2V0VGFpbG9yZWRTZXQoZ0NvbCwgJnN0YXR1cykpOworICB9CisKKworICBmb3IoaSA9IDA7IGkgPCBnUGxhdGZvcm1ObzsgaSsrKSB7CisgICAgdV9mcHJpbnRmKG91dCwgIlxuR2VuZXJhdGluZyBvcmRlciBmb3IgcGxhdGZvcm06ICVzXG4iLCBwbGF0Zm9ybXNbZ1BsYXRmb3JtSW5kZXhlc1tpXV0ubmFtZSk7CisgICAgZ0NvbXBhcmVyID0gcGxhdGZvcm1zW2dQbGF0Zm9ybUluZGV4ZXNbaV1dLmNvbXBhcmVyOworCisgICAgcHJlcGFyZVN0YXJ0aW5nU2V0KGV4ZW1wbGFyVVNldCwgZ0NvbXBhcmVyLCBzdGF0dXMpOworICAgIGludDMyX3QgaXRlbUxlbiA9IDA7CisgICAgLy8gZ2V0IHRoZSBudW1iZXIgb2YgYWxsIHRoZSBpdGVtcyBmcm9tIHRoZSBzZXQgKGJvdGggY29kZXBvaW50cyBhbmQgc3RyaW5ncykKKyAgICBpbnQzMl90IGV4ZW1wbGFyU2V0U2l6ZSA9IGV4ZW1wbGFyVVNldC5zaXplKCk7CisgICAgVW5pY29kZVNldEl0ZXJhdG9yIGV4ZW1wbGFyVVNldEl0ZXIoZXhlbXBsYXJVU2V0KTsKKworICAgIC8vIGFsbG9jYXRlIElDVSBsaW5lcworICAgIGdJQ1VMaW5lcyA9IG5ldyBMaW5lKltleGVtcGxhclNldFNpemUqNV07IAorICAgIGludDMyX3QgaiA9IDA7CisgICAgaW50MzJfdCBsaW5lc0NvdW50ID0gMDsKKyAgICBMaW5lICpsaW5lcyA9IG5ldyBMaW5lW2V4ZW1wbGFyU2V0U2l6ZV07IAorCisgICAgaW50MzJfdCByZXZlcnNlZFNlY29uZGFyeSA9IGNoZWNrU2Vjb25kYXJ5T3JkZXJpbmcoKTsKKyAgICBpZihyZXZlcnNlZFNlY29uZGFyeSA9PSAwKSB7CisgICAgICB1X2ZwcmludGYob3V0LCAiU2Vjb25kYXJpZXMgZG8gbm90IHNlZW0gdG8gYmUgcmV2ZXJzZWRcbiIpOworICAgIH0gZWxzZSBpZihyZXZlcnNlZFNlY29uZGFyeSA9PSAxKSB7CisgICAgICB1X2ZwcmludGYob3V0LCAiU2Vjb25kYXJpZXMgYXJlIHJldmVyc2VkXG4iKTsKKyAgICAgIGlmKGdDb21wYXJlciA9PSBJQ1VzdHJjbXApIHsKKyAgICAgICAgdWNvbF9zZXRBdHRyaWJ1dGUoZ0NvbCwgVUNPTF9GUkVOQ0hfQ09MTEFUSU9OLCBVQ09MX09GRiwgJnN0YXR1cyk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHVfZnByaW50ZihvdXQsICJDYW5ub3QgY29uY2x1ZGUgaWYgc2Vjb25kYXJpZXMgYXJlIHJldmVyc2VkXG4iKTsKKyAgICB9CisKKyAgICBpbnQzMl90IHJldmVyc2VkQ2FzZSA9IGNoZWNrQ2FzZU9yZGVyaW5nKCk7CisgICAgaWYocmV2ZXJzZWRDYXNlID09IDApIHsKKyAgICAgIHVfZnByaW50ZihvdXQsICJDYXNlIGRvZXMgbm90IHNlZW0gdG8gYmUgcmV2ZXJzZWRcbiIpOworICAgIH0gZWxzZSBpZihyZXZlcnNlZENhc2UgPT0gMSkgeworICAgICAgdV9mcHJpbnRmKG91dCwgIkNhc2UgaXMgcmV2ZXJzZWRcbiIpOworICAgICAgaWYoZ0NvbXBhcmVyID09IElDVXN0cmNtcCkgeworICAgICAgICB1Y29sX3NldEF0dHJpYnV0ZShnQ29sLCBVQ09MX0NBU0VfRklSU1QsIFVDT0xfT0ZGLCAmc3RhdHVzKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgdV9mcHJpbnRmKG91dCwgIkNhbm5vdCBjb25jbHVkZSBpZiBjYXNlIGlzIHJldmVyc2VkXG4iKTsKKyAgICB9CisgICAgICAKKyAgICBleGVtcGxhclVTZXRJdGVyLnJlc2V0KCk7CisgICAgZ0VsZW1lbnRzLnJlbW92ZUFsbCgpOworICAgIGdFeHBhbnNpb25zLnJlbW92ZUFsbCgpOworICAgIGxpbmVzQ291bnQgPSAwOworCisgICAgd2hpbGUoZXhlbXBsYXJVU2V0SXRlci5uZXh0KCkpIHsKKyAgICAgIExpbmUgKmN1cnJMaW5lID0gbGluZXMrbGluZXNDb3VudDsKKyAgICAgIGlmKGV4ZW1wbGFyVVNldEl0ZXIuaXNTdHJpbmcoKSkgeyAvLyBwcm9jZXNzIGEgc3RyaW5nCisgICAgICAgIHVfbWVtY3B5KGN1cnJMaW5lLT5uYW1lLCBleGVtcGxhclVTZXRJdGVyLmdldFN0cmluZygpLmdldEJ1ZmZlcigpLCBleGVtcGxhclVTZXRJdGVyLmdldFN0cmluZygpLmxlbmd0aCgpKTsKKyAgICAgICAgY3VyckxpbmUtPmxlbiA9IGV4ZW1wbGFyVVNldEl0ZXIuZ2V0U3RyaW5nKCkubGVuZ3RoKCk7CisgICAgICB9IGVsc2UgeyAvLyBwcm9jZXNzIGNvZGUgcG9pbnQKKyAgICAgICAgVUJvb2wgaXNFcnJvciA9IEZBTFNFOworICAgICAgICBjdXJyTGluZS0+bGVuID0gMDsKKyAgICAgICAgVTE2X0FQUEVORChjdXJyTGluZS0+bmFtZSwgY3VyckxpbmUtPmxlbiwgMjUsIGV4ZW1wbGFyVVNldEl0ZXIuZ2V0Q29kZXBvaW50KCksIGlzRXJyb3IpOworICAgICAgfQorICAgICAgY3VyckxpbmUtPm5hbWVbY3VyckxpbmUtPmxlbl0gPSAwOyAvLyB6ZXJvIHRlcm1pbmF0ZSwgZm9yIG91ciBldmlsIHdheXMKKyAgICAgIGN1cnJMaW5lLT5pbmRleCA9IGxpbmVzQ291bnQ7CisgICAgICBsaW5lc0NvdW50Kys7CisgICAgICBub3RlRWxlbWVudChjdXJyTGluZSk7CisgICAgfQorICAgIGNvbnN0cnVjdEFuZEFuYWx5emUoZ0lDVUxpbmVzLCBsaW5lcywgZXhlbXBsYXJTZXRTaXplLCBnQ29tcGFyZXIpOworCisgICAgZGVsZXRlW10gbGluZXM7IAorICB9CisKKworICAvLyBjbGVhbnVwIGdsb2JhbHMKKyAgZGVsZXRlW10gZ0lDVUxpbmVzOyAKKyAgdV9mZmx1c2gob3V0KTsKKyAgdV9mY2xvc2Uob3V0KTsKKyAgdWNvbF9jbG9zZShnQ29sKTsKK30KKwordm9pZAorcHJvY2Vzc0xvY2FsZShjb25zdCBjaGFyICpsb2NhbGUsIFVFcnJvckNvZGUgJnN0YXR1cykgeworICBnV2luTENJRCA9IHVsb2NfZ2V0TENJRChsb2NhbGUpOworCisgIFVDb2xsYXRvciAqY29sID0gdWNvbF9vcGVuKGxvY2FsZSwgJnN0YXR1cyk7CisKKyAgc2V0T3V0cHV0RmlsZShsb2NhbGUsIHN0YXR1cyk7CisKKyAgdV9mcHJpbnRmKG91dCwgIkxvY2FsZSAlcyAoTENJRDolMDZYKVxuIiwgbG9jYWxlLCBnV2luTENJRCk7CisKKyAgcHJvY2Vzc0NvbGxhdG9yKGNvbCwgc3RhdHVzKTsKK30KKworVUJvb2wgCitoYXNDb2xsYXRpb25FbGVtZW50cyhjb25zdCBjaGFyICpsb2NOYW1lKSB7CisKKyAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisgIFVSZXNvdXJjZUJ1bmRsZSAqQ29sRWwgPSBOVUxMOworCisgIFVSZXNvdXJjZUJ1bmRsZSAqbG9jID0gdXJlc19vcGVuKE5VTEwsIGxvY05hbWUsICZzdGF0dXMpOzsKKworICBpZihVX1NVQ0NFU1Moc3RhdHVzKSkgeworICAgIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgICBDb2xFbCA9IHVyZXNfZ2V0QnlLZXkobG9jLCAiQ29sbGF0aW9uRWxlbWVudHMiLCBDb2xFbCwgJnN0YXR1cyk7CisgICAgaWYoc3RhdHVzID09IFVfWkVST19FUlJPUikgeyAvKiBkbyB0aGUgdGVzdCAtIHRoZXJlIGFyZSByZWFsIGVsZW1lbnRzICovCisgICAgICB1cmVzX2Nsb3NlKENvbEVsKTsKKyAgICAgIHVyZXNfY2xvc2UobG9jKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICB1cmVzX2Nsb3NlKENvbEVsKTsKKyAgICB1cmVzX2Nsb3NlKGxvYyk7CisgIH0KKyAgcmV0dXJuIEZBTFNFOworfQorCitpbnQKK21haW4oaW50IGFyZ2MsCisgICAgIGNoYXIqIGFyZ3ZbXSkKK3sKKyAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisgIGVyciA9IHVfZmluaXQoc3RkZXJyLCAiZW4iLCAibGF0aW4tMSIpOworICBsb2cgPSB1X2Zpbml0KHN0ZG91dCwgImVuIiwgImxhdGluLTEiKTsKKworLyoKKyAgVVNldCAqd3NwID0gdXBydl9vcGVuUnVsZVdoaXRlU3BhY2VTZXQoJnN0YXR1cyk7CisgIHVzZXRfYWRkKHdzcCwgMHgwMDQxKTsKKyAgdXNldF9yZW1vdmUod3NwLCAweDAwNDEpOworICBVbmljb2RlU3RyaW5nIHBhdDsKKyAgKChVbmljb2RlU2V0ICopd3NwKS0+dG9QYXR0ZXJuKHBhdCwgVFJVRSk7CisgIHBhdC5zZXRDaGFyQXQocGF0Lmxlbmd0aCgpLCAwKTsKKyAgZXNjYXBlU3RyaW5nKHBhdC5nZXRCdWZmZXIoKSwgcGF0Lmxlbmd0aCgpLCBsb2cpOworICB1X2ZmbHVzaChsb2cpOworKi8KKworICBVVHJhbnNsaXRlcmF0b3IgKmFueUhleCA9IHV0cmFuc19vcGVuKCJbXlxcdTAwMGFcXHUwMDIwLVxcdTAwN2ZdIEFueS1IZXgvSmF2YSIsIFVUUkFOU19GT1JXQVJELCBOVUxMLCAwLCBOVUxMLCAmc3RhdHVzKTsKKyAgdV9mc2V0dHJhbnNsaXRlcmF0b3IobG9nLCBVX1dSSVRFLCBhbnlIZXgsICZzdGF0dXMpOworCisgIHByb2Nlc3NBcmdzKGFyZ2MsIGFyZ3YsIHN0YXR1cyk7CisgIGludDMyX3QgaSA9IDA7CisKKworICBnRWxlbWVudHMuc2V0VmFsdWVEZWxldGVyKGRlbGV0ZUxpbmVFbGVtZW50KTsKKworCisgIGlmKFVfRkFJTFVSRShzdGF0dXMpIHx8IGdQbGF0Zm9ybU5vID09IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBnVUNBID0gdWNvbF9vcGVuKCJyb290IiwgJnN0YXR1cyk7CisKKyAgaWYoZ1J1bGVzU3RkaW4pIHsKKyAgICBjaGFyIGJ1ZmZlclsxMDI0XTsKKyAgICBVQ2hhciBydWxlQnVmZmVyWzE2Mzg0XTsKKyAgICBVQ2hhciAqcnVsZXMgPSBydWxlQnVmZmVyOworICAgIGludDMyX3QgbWF4UnVsZUxlbiA9IDE2Mzg0OworICAgIGludDMyX3QgckxlbiA9IDA7CisgICAgd2hpbGUoZ2V0cyhidWZmZXIpKSB7CisgICAgICBpZihidWZmZXJbMF0gIT0gJy8nICYmIGJ1ZmZlclsxXSAhPSAnLycpIHsKKyAgICAgICAgckxlbiA9IHVfdW5lc2NhcGUoYnVmZmVyLCBydWxlcywgbWF4UnVsZUxlbik7CisgICAgICAgIHJ1bGVzICs9IHJMZW47CisgICAgICAgIG1heFJ1bGVMZW4gLT0gckxlbjsKKyAgICAgIH0KKyAgICB9CisgICAgVVBhcnNlRXJyb3IgcGFyc2VFcnJvcjsKKyAgICAvL2VzY2FwZVN0cmluZyhydWxlQnVmZmVyLCBydWxlcy1ydWxlQnVmZmVyLCBsb2cpOy8vCisgICAgdV9mcHJpbnRmKGxvZywgIiVVXG4iLCBydWxlQnVmZmVyKTsKKworICAgIFVDb2xsYXRvciAqY29sID0gdWNvbF9vcGVuUnVsZXMocnVsZUJ1ZmZlciwgcnVsZXMtcnVsZUJ1ZmZlciwgVUNPTF9ERUZBVUxULCBVQ09MX0RFRkFVTFQsICZwYXJzZUVycm9yLCAmc3RhdHVzKTsKKyAgICBpZihVX1NVQ0NFU1Moc3RhdHVzKSkgeworICAgICAgc2V0T3V0cHV0RmlsZSgic3RkaW5SdWxlcyIsIHN0YXR1cyk7CisgICAgICBwcm9jZXNzQ29sbGF0b3IoY29sLCBzdGF0dXMpOworICAgIH0gZWxzZSB7CisgICAgICB1X2ZwcmludGYoZXJyLCAiRXJyb3IgJXNcbiIsIHVfZXJyb3JOYW1lKHN0YXR1cykpOworICAgIH0KKyAgfSBlbHNlIHsKKworICAgIGlmKGdMb2NhbGUpIHsKKyAgICAgIHByb2Nlc3NMb2NhbGUoZ0xvY2FsZSwgc3RhdHVzKTsKKyAgICB9IGVsc2UgaWYoZ0xvY2FsZU5vKSB7CisgICAgICBmb3IoaSA9IDA7IGkgPCBnTG9jYWxlTm87IGkrKykgeworICAgICAgICBwcm9jZXNzTG9jYWxlKGdMb2NhbGVzW2ldLCBzdGF0dXMpOworICAgICAgfQorICAgIH0gZWxzZSB7IC8vIGRvIHRoZSBsb29wIHRocm91Z2ggYWxsIHRoZSBsb2NhbGVzCisgICAgICBpbnQzMl90IG5vT2ZMb2MgPSB1bG9jX2NvdW50QXZhaWxhYmxlKCk7CisgICAgICBjb25zdCBjaGFyICpsb2NOYW1lID0gTlVMTDsKKyAgICAgIGZvcihpID0gMDsgaTxub09mTG9jOyBpKyspIHsKKyAgICAgICAgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICAgICAgICBsb2NOYW1lID0gdWxvY19nZXRBdmFpbGFibGUoaSk7CisgICAgICAgIGlmKGhhc0NvbGxhdGlvbkVsZW1lbnRzKGxvY05hbWUpKSB7CisgICAgICAgICAgcHJvY2Vzc0xvY2FsZShsb2NOYW1lLCBzdGF0dXMpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKworICB1Y29sX2Nsb3NlKGdVQ0EpOworCisgIHVfZmZsdXNoKGxvZyk7CisgIHVfZmNsb3NlKGxvZyk7CisgIHVfZmZsdXNoKGVycik7CisgIHVfZmNsb3NlKGVycik7CisKKyAgcmV0dXJuIDA7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29scHJvYmUvY29scHJvYmUuZHNwIGIvY29scHJvYmUvY29scHJvYmUuZHNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNzRjODUKLS0tIC9kZXYvbnVsbAorKysgYi9jb2xwcm9iZS9jb2xwcm9iZS5kc3AKQEAgLTAsMCArMSwxNDggQEAKKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0iY29scHJvYmUiIC0gUGFja2FnZSBPd25lcj08ND4KKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gR2VuZXJhdGVkIEJ1aWxkIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDYuMDAKKyMgKiogRE8gTk9UIEVESVQgKioKKworIyBUQVJHVFlQRSAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIgMHgwMTAzCisKK0NGRz1jb2xwcm9iZSAtIFdpbjMyIERlYnVnCishTUVTU0FHRSBUaGlzIGlzIG5vdCBhIHZhbGlkIG1ha2VmaWxlLiBUbyBidWlsZCB0aGlzIHByb2plY3QgdXNpbmcgTk1BS0UsCishTUVTU0FHRSB1c2UgdGhlIEV4cG9ydCBNYWtlZmlsZSBjb21tYW5kIGFuZCBydW4KKyFNRVNTQUdFIAorIU1FU1NBR0UgTk1BS0UgL2YgImNvbHByb2JlLm1hayIuCishTUVTU0FHRSAKKyFNRVNTQUdFIFlvdSBjYW4gc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gd2hlbiBydW5uaW5nIE5NQUtFCishTUVTU0FHRSBieSBkZWZpbmluZyB0aGUgbWFjcm8gQ0ZHIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOgorIU1FU1NBR0UgCishTUVTU0FHRSBOTUFLRSAvZiAiY29scHJvYmUubWFrIiBDRkc9ImNvbHByb2JlIC0gV2luMzIgRGVidWciCishTUVTU0FHRSAKKyFNRVNTQUdFIFBvc3NpYmxlIGNob2ljZXMgZm9yIGNvbmZpZ3VyYXRpb24gYXJlOgorIU1FU1NBR0UgCishTUVTU0FHRSAiY29scHJvYmUgLSBXaW4zMiBSZWxlYXNlIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIENvbnNvbGUgQXBwbGljYXRpb24iKQorIU1FU1NBR0UgImNvbHByb2JlIC0gV2luMzIgRGVidWciIChiYXNlZCBvbiAiV2luMzIgKHg4NikgQ29uc29sZSBBcHBsaWNhdGlvbiIpCishTUVTU0FHRSAKKworIyBCZWdpbiBQcm9qZWN0CisjIFBST1AgQWxsb3dQZXJDb25maWdEZXBlbmRlbmNpZXMgMAorIyBQUk9QIFNjY19Qcm9qTmFtZSAiIgorIyBQUk9QIFNjY19Mb2NhbFBhdGggIiIKK0NQUD1jbC5leGUKK1JTQz1yYy5leGUKKworIUlGICAiJChDRkcpIiA9PSAiY29scHJvYmUgLSBXaW4zMiBSZWxlYXNlIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiUmVsZWFzZSIKKyMgUFJPUCBCQVNFIEludGVybWVkaWF0ZV9EaXIgIlJlbGVhc2UiCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAwCisjIFBST1AgT3V0cHV0X0RpciAiUmVsZWFzZSIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIgorIyBQUk9QIElnbm9yZV9FeHBvcnRfTGliIDAKKyMgUFJPUCBUYXJnZXRfRGlyICIiCitNVEw9bWlkbC5leGUKKyMgQUREIEJBU0UgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0QgIldJTjMyIiAvRCAiTkRFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1lYIC9GRCAvYworIyBBREQgQ1BQIC9ub2xvZ28gL1czIC9HWCAvTzIgL0kgIi4uLy4uLy4uL2luY2x1ZGUiIC9JICIuLi8uLi90b29scy90b29sdXRpbCIgL0kgIi4uLy4uL2NvbW1vbiIgL0kgIi4uLy4uL2kxOG4iIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL2MKKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCisjIEFERCBSU0MgL2wgMHg0MDkgL2QgIk5ERUJVRyIKK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KK0xJTkszMj1saW5rLmV4ZQorIyBBREQgQkFTRSBMSU5LMzIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIga2VybmVsMzIubGliIHVzZXIzMi5saWIgZ2RpMzIubGliIHdpbnNwb29sLmxpYiBjb21kbGczMi5saWIgYWR2YXBpMzIubGliIHNoZWxsMzIubGliIG9sZTMyLmxpYiBvbGVhdXQzMi5saWIgdXVpZC5saWIgb2RiYzMyLmxpYiBvZGJjY3AzMi5saWIgL25vbG9nbyAvc3Vic3lzdGVtOmNvbnNvbGUgL21hY2hpbmU6STM4NgorIyBBREQgTElOSzMyIGljdWlvLmxpYiBpY3V1Yy5saWIgaWN1aW4ubGliIGljdXR1LmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiBrZXJuZWwzMi5saWIgdXNlcjMyLmxpYiBnZGkzMi5saWIgd2luc3Bvb2wubGliIGNvbWRsZzMyLmxpYiBhZHZhcGkzMi5saWIgc2hlbGwzMi5saWIgb2xlMzIubGliIG9sZWF1dDMyLmxpYiB1dWlkLmxpYiBvZGJjMzIubGliIG9kYmNjcDMyLmxpYiAvbm9sb2dvIC9zdWJzeXN0ZW06Y29uc29sZSAvbWFjaGluZTpJMzg2IC9saWJwYXRoOiIuLi8uLi8uLi9saWIiCisKKyFFTFNFSUYgICIkKENGRykiID09ICJjb2xwcm9iZSAtIFdpbjMyIERlYnVnIgorCisjIFBST1AgQkFTRSBVc2VfTUZDIDAKKyMgUFJPUCBCQVNFIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMQorIyBQUk9QIEJBU0UgT3V0cHV0X0RpciAiRGVidWciCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyIKKyMgUFJPUCBCQVNFIFRhcmdldF9EaXIgIiIKKyMgUFJPUCBVc2VfTUZDIDAKKyMgUFJPUCBVc2VfRGVidWdfTGlicmFyaWVzIDEKKyMgUFJPUCBPdXRwdXRfRGlyICJEZWJ1ZyIKKyMgUFJPUCBJbnRlcm1lZGlhdGVfRGlyICJEZWJ1ZyIKKyMgUFJPUCBJZ25vcmVfRXhwb3J0X0xpYiAwCisjIFBST1AgVGFyZ2V0X0RpciAiIgorTVRMPW1pZGwuZXhlCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR20gL0dYIC9aSSAvT2QgL0QgIldJTjMyIiAvRCAiX0RFQlVHIiAvRCAiX0NPTlNPTEUiIC9EICJfTUJDUyIgL1lYIC9GRCAvR1ogL2MKKyMgQUREIENQUCAvbm9sb2dvIC9XMyAvR20gL0dYIC9aSSAvT2QgL0kgIi4uLy4uLy4uL2luY2x1ZGUiIC9JICIuLi8uLi90b29scy90b29sdXRpbCIgL0kgIi4uLy4uL2NvbW1vbiIgL0kgIi4uLy4uL2kxOG4iIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9DT05TT0xFIiAvRCAiX01CQ1MiIC9ZWCAvRkQgL0daIC9jCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiX0RFQlVHIgorIyBBREQgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCitMSU5LMzI9bGluay5leGUKKyMgQUREIEJBU0UgTElOSzMyIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQKKyMgQUREIExJTkszMiBpY3Vpb2QubGliIGljdXVjZC5saWIgaWN1aW5kLmxpYiBpY3V0dWQubGliIGtlcm5lbDMyLmxpYiB1c2VyMzIubGliIGdkaTMyLmxpYiB3aW5zcG9vbC5saWIgY29tZGxnMzIubGliIGFkdmFwaTMyLmxpYiBzaGVsbDMyLmxpYiBvbGUzMi5saWIgb2xlYXV0MzIubGliIHV1aWQubGliIG9kYmMzMi5saWIgb2RiY2NwMzIubGliIC9ub2xvZ28gL3N1YnN5c3RlbTpjb25zb2xlIC9kZWJ1ZyAvbWFjaGluZTpJMzg2IC9wZGJ0eXBlOnNlcHQgL2xpYnBhdGg6Ii4uLy4uLy4uL2xpYiIKKworIUVORElGIAorCisjIEJlZ2luIFRhcmdldAorCisjIE5hbWUgImNvbHByb2JlIC0gV2luMzIgUmVsZWFzZSIKKyMgTmFtZSAiY29scHJvYmUgLSBXaW4zMiBEZWJ1ZyIKKyMgQmVnaW4gR3JvdXAgIlNvdXJjZSBGaWxlcyIKKworIyBQUk9QIERlZmF1bHRfRmlsdGVyICJjcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2lkbDtocGo7YmF0IgorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Llxjb2xwcm9iZU5ldy5jcHAKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGxpbmUuY3BwCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Llxzb3J0ZWRsaW5lcy5jcHAKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXHN0cmVuZ3RocHJvYmUuY3BwCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Llx0YXJnZXRzZXRnZW5lcmF0b3IuY3BwCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Llx1cHJpbnRlci5jcHAKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEVuZCBHcm91cAorIyBCZWdpbiBHcm91cCAiSGVhZGVyIEZpbGVzIgorCisjIFBST1AgRGVmYXVsdF9GaWx0ZXIgImg7aHBwO2h4eDtobTtpbmwiCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGNvbHByb2JlLmgKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uXGxpbmUuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5cc29ydGVkbGluZXMuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5cc3RyZW5ndGhwcm9iZS5oCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Llx0YXJnZXRzZXRnZW5lcmF0b3IuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS5cdXByaW50ZXIuaAorIyBFbmQgU291cmNlIEZpbGUKKyMgRW5kIEdyb3VwCisjIEJlZ2luIEdyb3VwICJSZXNvdXJjZSBGaWxlcyIKKworIyBQUk9QIERlZmF1bHRfRmlsdGVyICJpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47cmdzO2dpZjtqcGc7anBlZztqcGUiCisjIEVuZCBHcm91cAorIyBFbmQgVGFyZ2V0CisjIEVuZCBQcm9qZWN0CmRpZmYgLS1naXQgYS9jb2xwcm9iZS9jb2xwcm9iZS5oIGIvY29scHJvYmUvY29scHJvYmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTEyYzQ0Ci0tLSAvZGV2L251bGwKKysrIGIvY29scHJvYmUvY29scHJvYmUuaApAQCAtMCwwICsxLDE1IEBACisjaWZuZGVmIENPTFBST0JFX0gKKyNkZWZpbmUgQ09MUFJPQkVfSAorCisjaW5jbHVkZSAidW5pY29kZS91bmlzZXQuaCIKKyNpbmNsdWRlICJ1bmljb2RlL25vcm1senIuaCIKKwordHlwZWRlZiBpbnQgKCpDb21wYXJlRm4pIChjb25zdCB2b2lkICplbGVtMSwgY29uc3Qgdm9pZCAqZWxlbTIpOwordHlwZWRlZiBpbnQgKCpHZXRTb3J0S2V5Rm4pIChjb25zdCBVQ2hhciAqc3RyaW5nLCBpbnQzMl90IGxlbiwgdWludDhfdCAqYnVmZmVyLCBpbnQzMl90IGJ1ZmZDYXBhY2l0eSk7CisvL3R5cGVkZWYgaW50IChfX2NkZWNsICpDb21wYXJlRm4pKGNvbnN0IHZvaWQgKmVsZW0xLCBjb25zdCB2b2lkICplbGVtMik7Cit2b2lkIGdlbmVyYXRlUmVwZXJ0b2lyZShjb25zdCBjaGFyICpsb2NhbGUsIFVuaWNvZGVTZXQgJnJlcCwgVUJvb2wgJmhhbkFwcGVhcnMsIFVFcnJvckNvZGUgJnN0YXR1cyk7CitVbmljb2RlU2V0IGZsYXR0ZW4oY29uc3QgVW5pY29kZVNldCAmc291cmNlLCBVRXJyb3JDb2RlICZzdGF0dXMpOworCisvL1VuaWNvZGVTZXQgZ2VuZXJhdGVSZXBlcnRvaXJlKGNvbnN0IGNoYXIgKmxvY2FsZSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29scHJvYmUvY29scHJvYmVOZXcuY3BwIGIvY29scHJvYmUvY29scHJvYmVOZXcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiY2ZjNTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb2xwcm9iZS9jb2xwcm9iZU5ldy5jcHAKQEAgLTAsMCArMSwxMDc4IEBACisvKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIENvcHlyaWdodCAoQykgMjAwMywgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcworKiAgIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBGaWxlIGNvbHByb2JlLmNwcAorKgorKiBNb2RpZmljYXRpb24gSGlzdG9yeToKKyoKKyogICBEYXRlICAgICAgICBOYW1lICAgICAgICBEZXNjcmlwdGlvbgorKiAgIDAzLzE4LzIwMDMgIHdlaXYgICAgICAgIENyZWF0aW9uLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworI2luY2x1ZGUgInVvcHRpb25zLmgiCisjaW5jbHVkZSAidW5pY29kZS91Y29sLmgiCisjaW5jbHVkZSAidW5pY29kZS91Y29sZWl0ci5oIgorI2luY2x1ZGUgInVuaWNvZGUvdXJlcy5oIgorI2luY2x1ZGUgInVuaWNvZGUvdW5pc2V0LmgiCisjaW5jbHVkZSAidW5pY29kZS91c2V0aXRlci5oIgorI2luY2x1ZGUgInVuaWNvZGUvdXN0cmluZy5oIgorI2luY2x1ZGUgInVuaWNvZGUvdWNoYXIuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3VzY3JpcHQuaCIKKyNpbmNsdWRlICJ1bmljb2RlL2xvY2lkLmgiCisjaW5jbHVkZSAidW5pY29kZS91Y252LmgiCisjaW5jbHVkZSAidXByb3BzLmgiCisjaW5jbHVkZSAiaGFzaC5oIgorI2luY2x1ZGUgInVjb2xfaW1wLmgiCisKKyNpbmNsdWRlICJ1bmljb2RlL3VzdGRpby5oIgorI2luY2x1ZGUgInVuaWNvZGUvdXRyYW5zLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKy8vIHVuaXggdG9sb3dlcgorI2luY2x1ZGUgPGN0eXBlLmg+CisvLyB1bml4IHNldGxvY2FsZQorI2luY2x1ZGUgPGxvY2FsZS5oPgorCisjaW5jbHVkZSAiY29scHJvYmUuaCIKKworI2luY2x1ZGUgImxpbmUuaCIKKyNpbmNsdWRlICJzb3J0ZWRsaW5lcy5oIgorI2luY2x1ZGUgInN0cmVuZ3RocHJvYmUuaCIKKwordm9pZCB0ZXN0V2luKFN0cmVuZ3RoUHJvYmUgJnByb2JlLCBVRXJyb3JDb2RlICZzdGF0dXMpIDsKKworI2lmIGRlZmluZWQgV0lOMzIKKyNpbmNsdWRlIDxpby5oPgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGRpcmVjdC5oPgorCitpbnQgY3JlYXRlRGlyKGNvbnN0IGNoYXIqIGRpck5hbWUpIHsKKyAgc3RydWN0IF9zdGF0IG15U3RhdDsKKyAgaW50IHJlc3VsdCA9IF9zdGF0KGRpck5hbWUsICZteVN0YXQpOworIAorICBpZihyZXN1bHQgPT0gLTEpIHsKKyAgICByZXN1bHQgPSBfbWtkaXIoZGlyTmFtZSk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfSBlbHNlIGlmKG15U3RhdC5zdF9tb2RlICYgX1NfSUZESVIpIHsKKyAgICByZXR1cm4gMDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gMTsKKyAgfQorfQorCisvLyNlbGlmIGRlZmluZWQgUE9TSVgKKyNlbHNlCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworaW50IGNyZWF0ZURpcihjb25zdCBjaGFyKiBkaXJOYW1lKSB7CisgIHN0cnVjdCBzdGF0IG15U3RhdDsKKyAgaW50IHJlc3VsdCA9IHN0YXQoZGlyTmFtZSwgJm15U3RhdCk7CisgCisgIGlmKHJlc3VsdCA9PSAtMSkgeworICAgIHJlc3VsdCA9IG1rZGlyKGRpck5hbWUsIFNfSVJVU1J8U19JV1VTUnxTX0lYVVNSfFNfSVJHUlB8U19JV0dSUHxTX0lYR1JQfFNfSVJPVEh8U19JV09USHxTX0lYT1RIKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9IGVsc2UgaWYoU19JU0RJUihteVN0YXQuc3RfbW9kZSkpIHsKKyAgICByZXR1cm4gMDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gMTsKKyAgfQorfQorLy8KKy8vICBTdHVicyBmb3IgV2luZG93cyBBUEkgZnVuY3Rpb25zIHdoZW4gYnVpbGRpbmcgb24gVU5JWGVzLgorLy8KK3R5cGVkZWYgaW50IERXT1JEOworaW5saW5lIGludCBDb21wYXJlU3RyaW5nVyhEV09SRCwgRFdPUkQsIFVDaGFyICosIGludCwgVUNoYXIgKiwgaW50KSB7cmV0dXJuIDA7fTsKKy8vI2Vsc2UKKy8vI2Vycm9yICJOb3QgUE9TSVggb3IgV2luZG93cy4gV29uJ3Qgd29yay4iCisjZW5kaWYKKworI2luY2x1ZGUgImxpbmUuaCIKKworc3RhdGljIFVCb29sIGdWZXJib3NlID0gRkFMU0U7CitzdGF0aWMgVUJvb2wgZ0RlYnVnID0gRkFMU0U7CitzdGF0aWMgVUJvb2wgZ1F1aWV0ID0gRkFMU0U7CitzdGF0aWMgVUJvb2wgZ0V4ZW1wbGFyID0gRkFMU0U7CisKK0RXT1JEICAgICAgICAgIGdXaW5MQ0lEOworaW50ICAgICAgICAgICAgZ0NvdW50OworVUNvbGxhdG9yICAgICAqZ0NvbDsKK1VDb2xsYXRvciAgICAgKmdVQ0E7CitVQ29udmVydGVyICAgICp1dGY4Y252OworQ29tcGFyZUZuIGdDb21wYXJlcjsKK2ludCAgICAgICBnUmVmTnVtOworVW5pY29kZVNldCBnRXhjbHVkZVNldDsKK1VuaWNvZGVTZXQgZ1JlcGVydG9pcmU7CisKK2NvbnN0IFVDaGFyIHNlcGFyYXRvckNoYXIgPSAweDAwMzA7CisKK1VQcmludGVyICpsb2dnZXI7CitVUHJpbnRlciAqZGVidWc7CitVUHJpbnRlciAqdGFpbG9yaW5nQnVuZGxlOworVVByaW50ZXIgKnJlZmVyZW5jZUJ1bmRsZTsKK1VQcmludGVyICpidW5kbGU7CitGSUxFICAgICAqZlRhaWxvcmluZ0R1bXA7CitGSUxFICAgICAqZkRlZmF1bHREdW1wOworCitjb25zdCBjaGFyICpwcm9nTmFtZSA9ICJjb2xwcm9iZSI7CisKK2NvbnN0IGNoYXIgKmdMb2NhbGUgPSBOVUxMOworaW50MzJfdCBwbGF0Zm9ybUluZGV4ID0gLTE7CitpbnQzMl90IGdQbGF0Zm9ybU5vID0gMDsKK2ludDMyX3QgZ1BsYXRmb3JtSW5kZXhlc1sxMF07CitpbnQzMl90IGdMb2NhbGVObyA9IDA7Citjb25zdCBjaGFyKiBnTG9jYWxlc1sxMDBdOworVUJvb2wgZ1J1bGVzU3RkaW4gPSBGQUxTRTsKK2NvbnN0IGNoYXIgKm91dHB1dEZvcm1hdCA9ICJIVE1MIjsKK2NvbnN0IGNoYXIgKm91dEV4dGVuc2lvbiA9ICJodG1sIjsKKworZW51bSB7CisgIEhFTFAxLAorICAgIEhFTFAyLAorICAgIFZFUkJPU0UsCisgICAgUVVJRVQsCisgICAgVkVSU0lPTiwKKyAgICBJQ1VEQVRBRElSLAorICAgIENPUFlSSUdIVCwKKyAgICBMT0NBTEUsCisgICAgUExBVEZPUk0sCisgICAgREVCVUcsIAorICAgIEVYRU1QTEFSLAorICAgIFJVTEVTU1RESU4sCisgICAgUkVGRVJFTkNFLAorICAgIEVYQ0xVREVTRVQsCisgICAgUkVQRVJUT0lSRSwKKyAgSU5URVJBQ1RJVkUsCisgIFBSSU5UUkVGLAorICBESUZGLCAKKyAgT1VUUFVUCit9OworCitVT3B0aW9uIG9wdGlvbnNbXT17CisgIC8qMCovIFVPUFRJT05fSEVMUF9ILAorICAvKjEqLyBVT1BUSU9OX0hFTFBfUVVFU1RJT05fTUFSSywKKyAgLyoyKi8gVU9QVElPTl9WRVJCT1NFLAorICAvKjMqLyBVT1BUSU9OX1FVSUVULAorICAvKjQqLyBVT1BUSU9OX1ZFUlNJT04sCisgIC8qNSovIFVPUFRJT05fSUNVREFUQURJUiwKKyAgLyo2Ki8gVU9QVElPTl9DT1BZUklHSFQsCisgIC8qNyovIFVPUFRJT05fREVGKCJsb2NhbGUiLCAnbCcsIFVPUFRfUkVRVUlSRVNfQVJHKSwKKyAgLyo4Ki8gVU9QVElPTl9ERUYoInBsYXRmb3JtIiwgJ3AnLCBVT1BUX1JFUVVJUkVTX0FSRyksCisgIC8qOSovIFVPUFRJT05fREVGKCJkZWJ1ZyIsICdEJywgVU9QVF9OT19BUkcpLAorICAvKjEwKi8gVU9QVElPTl9ERUYoImV4ZW1wbGFyIiwgJ0UnLCBVT1BUX05PX0FSRyksCisgIC8qMTEqLyBVT1BUSU9OX0RFRigicnVsZXNzdGRpbiIsICdSJywgVU9QVF9OT19BUkcpLAorICAvKjEyKi8gVU9QVElPTl9ERUYoInJlZiIsICdjJywgVU9QVF9SRVFVSVJFU19BUkcpLAorICAvKjEzKi8gVU9QVElPTl9ERUYoImV4Y2x1ZGVzZXQiLCAneCcsIFVPUFRfUkVRVUlSRVNfQVJHKSwKKyAgLyoxNCovIFVPUFRJT05fREVGKCJyZXBlcnRvaXJlIiwgJ3QnLCBVT1BUX1JFUVVJUkVTX0FSRyksCisgIC8qMTUqLyBVT1BUSU9OX0RFRigiaW50ZXJhY3RpdmUiLCAnSScsIFVPUFRfTk9fQVJHKSwKKyAgLyoxNiovIFVPUFRJT05fREVGKCJwcmludHJlZiIsIDAsIFVPUFRfTk9fQVJHKSwKKyAgLyoxNyovIFVPUFRJT05fREVGKCJkaWZmIiwgMCwgVU9QVF9OT19BUkcpLAorICAvKjE4Ki8gVU9QVElPTl9ERUYoIm91dHB1dCIsIDAsIFVPUFRfUkVRVUlSRVNfQVJHKQorfTsKKworVUNoYXIgY29tcEFbMjU2XTsKK1VDaGFyIGNvbXBCWzI1Nl07CitpbnQzMl90IGNvbXBBTGVuID0gMDsKK2ludDMyX3QgY29tcEJMZW4gPSAwOworCitjaGFyIGNvbXBVVEY4QVsyNTZdOworY2hhciBjb21wVVRGOEJbMjU2XTsKK2ludDMyX3QgY29tcFVURjhBTGVuID0gMDsKK2ludDMyX3QgY29tcFVURjhCTGVuID0gMDsKKworaW50IFVOSVhzdHJjbXAoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikgeworICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgICBnQ291bnQrKzsKKyAgICBpbnQgdDsKKyAgICBjb21wQUxlbiA9IHVub3JtX25vcm1hbGl6ZSgoKihMaW5lICoqKWEpLT5uYW1lLCAoKihMaW5lICoqKWEpLT5sZW4sIFVOT1JNX05GQywgMCwgY29tcEEsIDI1NiwgJnN0YXR1cyk7CisgICAgY29tcEJMZW4gPSB1bm9ybV9ub3JtYWxpemUoKCooTGluZSAqKiliKS0+bmFtZSwgKCooTGluZSAqKiliKS0+bGVuLCBVTk9STV9ORkMsIDAsIGNvbXBCLCAyNTYsICZzdGF0dXMpOworICAgIGNvbXBVVEY4QUxlbiA9IHVjbnZfZnJvbVVDaGFycyh1dGY4Y252LCBjb21wVVRGOEEsIDI1NiwgY29tcEEsIGNvbXBBTGVuLCAmc3RhdHVzKTsKKyAgICBjb21wVVRGOEFbY29tcFVURjhBTGVuXSA9IDA7CisgICAgY29tcFVURjhCTGVuID0gdWNudl9mcm9tVUNoYXJzKHV0ZjhjbnYsIGNvbXBVVEY4QiwgMjU2LCBjb21wQiwgY29tcEJMZW4sICZzdGF0dXMpOworICAgIGNvbXBVVEY4Qltjb21wVVRGOEJMZW5dID0gMDsKKyAgICB0ID0gc3RyY29sbChjb21wVVRGOEEsIGNvbXBVVEY4Qik7CisgICAgcmV0dXJuIHQ7Cit9CisKK2ludCBVTklYZ2V0U29ydEtleShjb25zdCBVQ2hhciAqc3RyaW5nLCBpbnQzMl90IGxlbiwgdWludDhfdCAqYnVmZmVyLCBpbnQzMl90IGJ1ZmZDYXBhY2l0eSkgeworICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgY29tcEFMZW4gPSB1bm9ybV9ub3JtYWxpemUoc3RyaW5nLCBsZW4sIFVOT1JNX05GQywgMCwgY29tcEEsIDI1NiwgJnN0YXR1cyk7CisgIGNvbXBVVEY4QUxlbiA9IHVjbnZfZnJvbVVDaGFycyh1dGY4Y252LCBjb21wVVRGOEEsIDI1NiwgY29tcEEsIGNvbXBBTGVuLCAmc3RhdHVzKTsKKyAgY29tcFVURjhBW2NvbXBVVEY4QUxlbl0gPSAwOworICByZXR1cm4gKHN0cnhmcm0oKGNoYXIgKilidWZmZXIsIGNvbXBVVEY4QSwgYnVmZkNhcGFjaXR5KSsxKTsKK30KKworI2lmZGVmIFdJTjMyCitpbnQgV2luc3RyY21wKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpIHsKKyAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisgICAgZ0NvdW50Kys7CisgICAgaW50IHQ7CisgICAgLy9jb21wQUxlbiA9IHVub3JtX2NvbXBvc2UoY29tcEEsIDI1NiwgKCooTGluZSAqKilhKS0+bmFtZSwgKCooTGluZSAqKilhKS0+bGVuLCBGQUxTRSwgMCwgJnN0YXR1cyk7CisgICAgLy9jb21wQkxlbiA9IHVub3JtX2NvbXBvc2UoY29tcEIsIDI1NiwgKCooTGluZSAqKiliKS0+bmFtZSwgKCooTGluZSAqKiliKS0+bGVuLCBGQUxTRSwgMCwgJnN0YXR1cyk7CisgICAgY29tcEFMZW4gPSB1bm9ybV9ub3JtYWxpemUoKCooTGluZSAqKilhKS0+bmFtZSwgKCooTGluZSAqKilhKS0+bGVuLCBVTk9STV9ORkMsIDAsIGNvbXBBLCAyNTYsICZzdGF0dXMpOworICAgIGNvbXBCTGVuID0gdW5vcm1fbm9ybWFsaXplKCgqKExpbmUgKiopYiktPm5hbWUsICgqKExpbmUgKiopYiktPmxlbiwgVU5PUk1fTkZDLCAwLCBjb21wQiwgMjU2LCAmc3RhdHVzKTsKKyAgICB0ID0gQ29tcGFyZVN0cmluZ1coZ1dpbkxDSUQsICBTT1JUX1NUUklOR1NPUlQsIC8vMCwKKyAgICAgIGNvbXBBLCBjb21wQUxlbiwgCisgICAgICBjb21wQiwgY29tcEJMZW4pOworCisvKiAgICAKKyAgICB0ID0gQ29tcGFyZVN0cmluZ1coZ1dpbkxDSUQsIDAsIAorICAgICAgKCooTGluZSAqKilhKS0+bmFtZSwgKCooTGluZSAqKilhKS0+bGVuLCAKKyAgICAgICgqKExpbmUgKiopYiktPm5hbWUsICgqKExpbmUgKiopYiktPmxlbik7CisqLworICAgIHJldHVybiB0LTI7Cit9CisKK2ludCBXaW5nZXRTb3J0S2V5KGNvbnN0IFVDaGFyICpzdHJpbmcsIGludDMyX3QgbGVuLCB1aW50OF90ICpidWZmZXIsIGludDMyX3QgYnVmZkNhcGFjaXR5KSB7CisgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICBjb21wQUxlbiA9IHVub3JtX25vcm1hbGl6ZShzdHJpbmcsIGxlbiwgVU5PUk1fTkZDLCAwLCBjb21wQSwgMjU2LCAmc3RhdHVzKTsKKyAgcmV0dXJuIExDTWFwU3RyaW5nVyhnV2luTENJRCwgTENNQVBfU09SVEtFWSB8IFNPUlRfU1RSSU5HU09SVCwgY29tcEEsIGNvbXBBTGVuLCAodW5zaWduZWQgc2hvcnQgKilidWZmZXIsIGJ1ZmZDYXBhY2l0eSk7Cit9CisKKyNpZiAwCitpbnQgV2luc3RyY21wKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpIHsKKyAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisgIHVpbnQ4X3QgYjFbMjU2XSwgYjJbMjU2XTsKKyAgaW50MzJfdCBiMUxlbiwgYjJMZW47CisgIGIxTGVuID0gV2luZ2V0U29ydEtleSgoKihMaW5lICoqKWEpLT5uYW1lLCAoKihMaW5lICoqKWEpLT5sZW4sIGIxLCAyNTYpOworICBiMkxlbiA9IFdpbmdldFNvcnRLZXkoKCooTGluZSAqKiliKS0+bmFtZSwgKCooTGluZSAqKiliKS0+bGVuLCBiMiwgMjU2KTsKKworICBiMVtiMUxlbl0gPSAwOworICBiMltiMkxlbl0gPSAwOworICAKKyAgcmV0dXJuIHN0cmNtcCgoY29uc3QgY2hhciAqKWIxLCAoY29uc3QgY2hhciAqKWIyKTsKK30KKyNlbmRpZgorCisjZWxzZQoraW50IFdpbnN0cmNtcChjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKSB7CisgIGlmKGEgPT0gYik7CisgIHJldHVybiAwOworfQoraW50IFdpbmdldFNvcnRLZXkoY29uc3QgVUNoYXIgKiwgaW50MzJfdCAsIHVpbnQ4X3QgKiwgaW50MzJfdCApIHsKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworaW50IElDVXN0cmNtcChjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKSB7CisgICAgZ0NvdW50Kys7CisgICAgVUNvbGxhdGlvblJlc3VsdCB0OworICAgIHQgPSB1Y29sX3N0cmNvbGwoZ0NvbCwgCisgICAgICAoKihMaW5lICoqKWEpLT5uYW1lLCAoKihMaW5lICoqKWEpLT5sZW4sICAKKyAgICAgICgqKExpbmUgKiopYiktPm5hbWUsICgqKExpbmUgKiopYiktPmxlbik7CisgICAgaWYgKHQgPT0gVUNPTF9MRVNTKSByZXR1cm4gLTE7CisgICAgaWYgKHQgPT0gVUNPTF9HUkVBVEVSKSByZXR1cm4gKzE7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBJQ1VnZXRTb3J0S2V5KGNvbnN0IFVDaGFyICpzdHJpbmcsIGludDMyX3QgbGVuLCB1aW50OF90ICpidWZmZXIsIGludDMyX3QgYnVmZkNhcGFjaXR5KSB7CisgIHJldHVybiB1Y29sX2dldFNvcnRLZXkoZ0NvbCwgc3RyaW5nLCBsZW4sIGJ1ZmZlciwgYnVmZkNhcGFjaXR5KTsKK30KKworc3RydWN0IHsKKyAgY29uc3QgY2hhciogbmFtZTsKKyAgQ29tcGFyZUZuIGNvbXBhcmVyOworICBHZXRTb3J0S2V5Rm4gc2tnZXR0ZXI7Cit9IHBsYXRmb3Jtc1tdID0geworICB7ICJpY3UiLCBJQ1VzdHJjbXAsIElDVWdldFNvcnRLZXkgfSwKKyAgeyAidzJrIiwgV2luc3RyY21wLCBXaW5nZXRTb3J0S2V5fSwKKyAgeyAid2lueHAiLCBXaW5zdHJjbXAsIFdpbmdldFNvcnRLZXl9LAorICB7ICJhaXgiLCBVTklYc3RyY21wLCBVTklYZ2V0U29ydEtleX0sCisgIHsgImxpbnV4IiwgVU5JWHN0cmNtcCwgVU5JWGdldFNvcnRLZXl9Cit9OworCisKK3ZvaWQgc3RyaW5nVG9Mb3dlcihjaGFyICpzdHJpbmcpIHsKKyAgdWludDMyX3QgaSA9IDA7CisgIGZvcihpID0gMDsgaSA8IHN0cmxlbihzdHJpbmcpOyBpKyspIHsKKyAgICBzdHJpbmdbaV0gPSB0b2xvd2VyKHN0cmluZ1tpXSk7CisgIH0KK30KKwordm9pZCB1c2FnZShjb25zdCBjaGFyICpuYW1lKSB7CisgIGxvZ2dlci0+bG9nKCJVc2FnZTogJXMgLS1sb2NhbGUgbG9jX25hbWUgLS1wbGF0Zm9ybSBwbGF0Zm9ybVxuIiwgbmFtZSk7Cit9CisKK3ZvaWQgbGlzdEtub3duUGxhdGZvcm1zKCkgeworICB1aW50MzJfdCBpID0gMDsKKyAgbG9nZ2VyLT5sb2coIktub3duIHBsYXRmb3JtczpcbiIpOworICBmb3IoaSA9IDA7IGkgPCBzaXplb2YocGxhdGZvcm1zKS9zaXplb2YocGxhdGZvcm1zWzBdKTsgaSsrKSB7CisgICAgbG9nZ2VyLT5sb2coIlx0JXNcbiIsIHBsYXRmb3Jtc1tpXSk7CisgIH0KK30KKwordm9pZCBhZGRQbGF0Zm9ybShjb25zdCBjaGFyICpwbGF0Zm9ybSkgeworICB1aW50MzJfdCBpOworICAvL3N0cmluZ1RvTG93ZXIocGxhdGZvcm0pOworICBpbnQzMl90IG9sZFBsYXRmb3JtTm8gPSBnUGxhdGZvcm1ObzsKKworICBmb3IoaSA9IDA7IGkgPCBzaXplb2YocGxhdGZvcm1zKS9zaXplb2YocGxhdGZvcm1zWzBdKTsgaSsrKSB7CisgICAgaWYoc3RyY21wKHBsYXRmb3JtLCBwbGF0Zm9ybXNbaV0ubmFtZSkgPT0gMCkgeworICAgICAgZ1BsYXRmb3JtSW5kZXhlc1tnUGxhdGZvcm1ObysrXSA9IGk7CisgICAgfQorICB9CisgIGlmKGdQbGF0Zm9ybU5vID09IG9sZFBsYXRmb3JtTm8pIHsKKyAgICBsb2dnZXItPmxvZygiVW5rbm93biBwbGF0Zm9ybSAlc1xuIiwgcGxhdGZvcm0pOworICAgIGxpc3RLbm93blBsYXRmb3JtcygpOworICB9Cit9CisKK3ZvaWQgcHJvY2Vzc0FyZ3MoaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSwgVUVycm9yQ29kZSAmc3RhdHVzKQoreworICBpbnQzMl90IGkgPSAwOworICBVX01BSU5fSU5JVF9BUkdTKGFyZ2MsIGFyZ3YpOworCisgIGFyZ2MgPSB1X3BhcnNlQXJncyhhcmdjLCBhcmd2LCAoaW50MzJfdCkoc2l6ZW9mKG9wdGlvbnMpL3NpemVvZihvcHRpb25zWzBdKSksIG9wdGlvbnMpOworCisgIGlmKGFyZ2MgPCAwKSB7CisgICAgbG9nZ2VyLT5sb2coIlVua25vd24gb3B0aW9uOiAlc1xuIiwgYXJndlstYXJnY10pOworICAgIHVzYWdlKHByb2dOYW1lKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZihvcHRpb25zWzBdLmRvZXNPY2N1ciB8fCBvcHRpb25zWzFdLmRvZXNPY2N1cikgeworICAgIHVzYWdlKHByb2dOYW1lKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYob3B0aW9uc1tWRVJCT1NFXS5kb2VzT2NjdXIpIHsKKyAgICBnVmVyYm9zZSA9IFRSVUU7CisgIH0KKyAgaWYob3B0aW9uc1tERUJVR10uZG9lc09jY3VyKSB7CisgICAgZ0RlYnVnID0gVFJVRTsKKyAgICBnVmVyYm9zZSA9IFRSVUU7CisgIH0KKyAgaWYob3B0aW9uc1tFWEVNUExBUl0uZG9lc09jY3VyKSB7CisgICAgZ0V4ZW1wbGFyID0gVFJVRTsKKyAgfQorICBpZihvcHRpb25zW1FVSUVUXS5kb2VzT2NjdXIpIHsKKyAgICBnUXVpZXQgPSBUUlVFOworICB9CisKKyAgLy8gQVNDSUkgYmFzZWQgb3B0aW9ucyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZQorICAvLyB0aGlzIGlzIGZvciB0ZXN0aW5nIHB1cnBvc2VzLCB3aWxsIGFsbG93IHRvIGxvYWQKKyAgLy8gdXAgSUNVIHJ1bGVzIGFuZCB0aGVuIHBva2UgdGhyb3VnaCB0aGVtLgorICAvLyBJbiB0aGF0IGNhc2UsIHdlIHRlc3Qgb25seSBJQ1UgYW5kIGRvbid0IG5lZWQgCisgIC8vIGEgbG9jYWxlLgorICBpZihvcHRpb25zW1JVTEVTU1RESU5dLmRvZXNPY2N1cikgeworICAgIGdSdWxlc1N0ZGluID0gVFJVRTsKKyAgICBhZGRQbGF0Zm9ybSgiaWN1Iik7CisgICAgcmV0dXJuOworICB9IAorCisgIGlmKG9wdGlvbnNbTE9DQUxFXS5kb2VzT2NjdXIpIHsKKyAgICBnTG9jYWxlID0gb3B0aW9uc1tMT0NBTEVdLnZhbHVlOworICB9IGVsc2UgeworICAgIGdMb2NhbGUgPSBhcmd2WzFdOworICAgIC8vZm9yKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisgICAgLy9nTG9jYWxlc1tnTG9jYWxlTm8rK10gPSBhcmd2W2ldOworICAgIC8vfQorICB9CisKKyAgaWYob3B0aW9uc1tQTEFURk9STV0uZG9lc09jY3VyKSB7CisgICAgYWRkUGxhdGZvcm0ob3B0aW9uc1tQTEFURk9STV0udmFsdWUpOworICB9IGVsc2UgeyAvLyB0aGVyZSBpcyBhIGxpc3Qgb2YgcGxhdGZvcm1zIAorICAgIGFkZFBsYXRmb3JtKCJpY3UiKTsKKyAgfQorCisgIGlmKG9wdGlvbnNbUkVGRVJFTkNFXS5kb2VzT2NjdXIpIHsKKyAgICBmb3IoaSA9IDA7IGkgPCAoaW50MzJfdCkoc2l6ZW9mKHBsYXRmb3Jtcykvc2l6ZW9mKHBsYXRmb3Jtc1swXSkpOyBpKyspIHsKKyAgICAgIGlmKHN0cmNtcChvcHRpb25zW1JFRkVSRU5DRV0udmFsdWUsIHBsYXRmb3Jtc1tpXS5uYW1lKSA9PSAwKSB7CisgICAgICAgIGdSZWZOdW0gPSBpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgaWYoaSA9PSBzaXplb2YocGxhdGZvcm1zKS9zaXplb2YocGxhdGZvcm1zWzBdKSkgeworICAgICAgbG9nZ2VyLT5sb2coIlVua25vd24gcmVmZXJlbmNlICVzIVxuIiwgb3B0aW9uc1tSRUZFUkVOQ0VdLnZhbHVlKTsKKyAgICAgIHN0YXR1cyA9IFVfSUxMRUdBTF9BUkdVTUVOVF9FUlJPUjsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZ1JlZk51bSA9IDA7CisgIH0KKworICBpZihvcHRpb25zW0VYQ0xVREVTRVRdLmRvZXNPY2N1cikgeworICAgIGdFeGNsdWRlU2V0LmFwcGx5UGF0dGVybihVbmljb2RlU3RyaW5nKG9wdGlvbnNbRVhDTFVERVNFVF0udmFsdWUpLCBzdGF0dXMpOworICAgIGlmKFVfRkFJTFVSRShzdGF0dXMpKSB7CisgICAgICBsb2dnZXItPmxvZygiQ2Fubm90IGNvbnN0cnVjdCBleGNsdWRlIHNldCBmcm9tIGFyZ3VtZW50ICVzLiBFcnJvciAlc1xuIiwgb3B0aW9uc1tFWENMVURFU0VUXS52YWx1ZSwgdV9lcnJvck5hbWUoc3RhdHVzKSk7CisgICAgICByZXR1cm47CisgICAgfSBlbHNlIHsKKyAgICAgIFVuaWNvZGVTdHJpbmcgcGF0dGVybjsKKyAgICAgIGxvZ2dlci0+bG9nKGdFeGNsdWRlU2V0LnRvUGF0dGVybihwYXR0ZXJuLCBUUlVFKSwgVFJVRSk7CisgICAgfQorICB9CisKKyAgaWYob3B0aW9uc1tSRVBFUlRPSVJFXS5kb2VzT2NjdXIpICB7CisgICAgZ1JlcGVydG9pcmUuYXBwbHlQYXR0ZXJuKFVuaWNvZGVTdHJpbmcob3B0aW9uc1tSRVBFUlRPSVJFXS52YWx1ZSksIHN0YXR1cyk7CisgICAgaWYoVV9GQUlMVVJFKHN0YXR1cykpIHsKKyAgICAgIGxvZ2dlci0+bG9nKCJDYW5ub3QgY29uc3RydWN0IHJlcGVydG9pcmUgZnJvbSBhcmd1bWVudCAlcy4gRXJyb3IgJXNcbiIsIG9wdGlvbnNbUkVQRVJUT0lSRV0udmFsdWUsIHVfZXJyb3JOYW1lKHN0YXR1cykpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIGlmKG9wdGlvbnNbT1VUUFVUXS5kb2VzT2NjdXIpIHsKKyAgICBvdXRwdXRGb3JtYXQgPSBvcHRpb25zW09VVFBVVF0udmFsdWU7CisgICAgaWYoc3RyY21wKG91dHB1dEZvcm1hdCwgIkhUTUwiKSA9PSAwKSB7CisgICAgICBvdXRFeHRlbnNpb24gPSAiaHRtbCI7CisgICAgfSBlbHNlIGlmKHN0cmNtcChvdXRwdXRGb3JtYXQsICJYTUwiKSA9PSAwKSB7CisgICAgICBvdXRFeHRlbnNpb24gPSAieG1sIjsKKyAgICB9IGVsc2UgeworICAgICAgb3V0RXh0ZW5zaW9uID0gInR4dCI7CisgICAgfQorICB9CisKK30KKworLy8gQ2hlY2sgd2hldGhlciB1cHBlciBjYXNlIGNvbWVzIGJlZm9yZSBsb3dlciBjYXNlIG9yIHZpY2UtdmVyc2EKK2ludDMyX3QgCitjaGVja0Nhc2VPcmRlcmluZyh2b2lkKSB7CisgIFVDaGFyIHN0dWZmW11bM10gPSB7CisgICAgeyAweDAwNjEsIHNlcGFyYXRvckNoYXIsIDB4MDA2MX0sIC8vImFhIiwKKyAgICB7IDB4MDA2MSwgc2VwYXJhdG9yQ2hhciwgMHgwMDQxIH0sIC8vImFcXHUwMEUwIiwKKyAgICB7IDB4MDA0MSwgc2VwYXJhdG9yQ2hhciwgMHgwMDYxIH0sIC8vIlxcdTAwRTBhIiwKKyAgICB7IDB4MDA0MSwgc2VwYXJhdG9yQ2hhciwgMHgwMDQxIH0sIC8vIlxcdTAwRTBhIiwKKyAgICAvL3sgMHgwMEUwLCBzZXBhcmF0b3JDaGFyLCAweDAwRTAgfSAgLy8iXFx1MDBFMFxcdTAwRTAiCisgIH07CisgIGNvbnN0IGludDMyX3Qgc2l6ZSA9IHNpemVvZihzdHVmZikvc2l6ZW9mKHN0dWZmWzBdKTsKKworICBMaW5lICoqc29ydGVkTGluZXMgPSBuZXcgTGluZSpbc2l6ZV07CisgIExpbmUgbGluZXNbc2l6ZV07CisKKyAgaW50MzJfdCBpID0gMDsKKyAgaW50MzJfdCBvcmRlcmVkID0gMCwgcmV2ZXJzZWQgPSAwOworCisgIGZvcihpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgIGxpbmVzW2ldLnNldE5hbWUoc3R1ZmZbaV0sIDMpOworICB9CisgIC8vc2V0QXJyYXkoc29ydGVkTGluZXMsIGxpbmVzLCBzaXplKTsKKyAgcXNvcnQoc29ydGVkTGluZXMsIHNpemUsIHNpemVvZihMaW5lKiksIGdDb21wYXJlcik7CisKKyAgZm9yKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgaWYoKihzb3J0ZWRMaW5lcytpKSA9PSAmbGluZXNbaV0pIHsKKyAgICAgIG9yZGVyZWQrKzsKKyAgICB9CisgICAgaWYoKihzb3J0ZWRMaW5lcytpKSA9PSAmbGluZXNbc2l6ZS1pLTFdKSB7CisgICAgICByZXZlcnNlZCsrOworICAgIH0KKyAgfQorCisgIGRlbGV0ZVtdIHNvcnRlZExpbmVzOworICBpZihvcmRlcmVkID09IHNpemUpIHsKKyAgICByZXR1cm4gMDsgLy8gaW4gbm9ybWFsIG9yZGVyCisgIH0gZWxzZSBpZihyZXZlcnNlZCA9PSBzaXplKSB7CisgICAgcmV0dXJuIDE7IC8vIGluIHJldmVyc2VkIG9yZGVyCisgIH0gZWxzZSB7CisgICAgcmV0dXJuIC0xOyAvLyB1bmtub3duIG9yZGVyCisgIH0KK30KKwordm9pZAorZ2V0RXhlbXBsYXJzKGNvbnN0IGNoYXIgKmxvY2FsZSwgVW5pY29kZVNldCAmZXhlbXBsYXJzLCBVRXJyb3JDb2RlICZzdGF0dXMpIHsKKyAgLy8gZmlyc3Qgd2UgZmlsbCBvdXQgc3RydWN0dXJlcyB3aXRoIGV4ZW1wbGFyIGNoYXJhY3RlcnMuCisgIFVSZXNvdXJjZUJ1bmRsZSAqcmVzID0gdXJlc19vcGVuKE5VTEwsIGxvY2FsZSwgJnN0YXR1cyk7CisgIFVuaWNvZGVTdHJpbmcgZXhlbXBsYXJTdHJpbmcgPSB1cmVzX2dldFVuaWNvZGVTdHJpbmdCeUtleShyZXMsICJFeGVtcGxhckNoYXJhY3RlcnMiLCAmc3RhdHVzKTsKKyAgZXhlbXBsYXJzLmNsZWFyKCk7CisgIGV4ZW1wbGFycy5hcHBseVBhdHRlcm4oZXhlbXBsYXJTdHJpbmcsIHN0YXR1cyk7CisgIHVyZXNfY2xvc2UocmVzKTsKK30KKworCit2b2lkCitnZXRGaWxlTmFtZXMoY29uc3QgY2hhciAqbmFtZSwgY2hhciAqdGFpbG9yaW5nTmFtZSwgY2hhciAqdGFpbG9yaW5nRHVtcE5hbWUsIGNoYXIgKmRlZmF1bHROYW1lLCBjaGFyICpkZWZhdWx0RHVtcE5hbWUsIGNoYXIgKmRpZmZOYW1lKSB7CisgIGlmKHRhaWxvcmluZ05hbWUpIHsKKyAgICBzdHJjcHkodGFpbG9yaW5nTmFtZSwgcGxhdGZvcm1zW2dQbGF0Zm9ybUluZGV4ZXNbMF1dLm5hbWUpOworICAgIHN0cmNhdCh0YWlsb3JpbmdOYW1lLCAiLyIpOworICAgIHN0cmNhdCh0YWlsb3JpbmdOYW1lLCBuYW1lKTsKKyAgICBzdHJjYXQodGFpbG9yaW5nTmFtZSwgIl9yYXcuIik7CisgICAgc3RyY2F0KHRhaWxvcmluZ05hbWUsIG91dEV4dGVuc2lvbik7CisgIH0KKyAgaWYodGFpbG9yaW5nRHVtcE5hbWUpIHsKKyAgICBzdHJjcHkodGFpbG9yaW5nRHVtcE5hbWUsIHBsYXRmb3Jtc1tnUGxhdGZvcm1JbmRleGVzWzBdXS5uYW1lKTsKKyAgICBzdHJjYXQodGFpbG9yaW5nRHVtcE5hbWUsICIvIik7CisgICAgc3RyY2F0KHRhaWxvcmluZ0R1bXBOYW1lLCBuYW1lKTsKKyAgICBzdHJjYXQodGFpbG9yaW5nRHVtcE5hbWUsICIuZHVtcCIpOworICB9CisKKyAgaWYoZGlmZk5hbWUpIHsKKyAgICBzdHJjcHkoZGlmZk5hbWUsIHBsYXRmb3Jtc1tnUGxhdGZvcm1JbmRleGVzWzBdXS5uYW1lKTsKKyAgICBzdHJjYXQoZGlmZk5hbWUsICIvIik7CisgICAgc3RyY2F0KGRpZmZOYW1lLCBuYW1lKTsKKyAgICBzdHJjYXQoZGlmZk5hbWUsICJfY29sbGF0aW9uLiIpOworICAgIHN0cmNhdChkaWZmTmFtZSwgb3V0RXh0ZW5zaW9uKTsKKyAgfQorCisgIGlmKGRlZmF1bHROYW1lKSB7CisgICAgc3RyY3B5KGRlZmF1bHROYW1lLCBwbGF0Zm9ybXNbZ1JlZk51bV0ubmFtZSk7CisgICAgc3RyY2F0KGRlZmF1bHROYW1lLCAiLyIpOworICAgIHN0cmNhdChkZWZhdWx0TmFtZSwgbmFtZSk7CisgICAgc3RyY2F0KGRlZmF1bHROYW1lLCAiX2RlZmF1bHRfcmF3LiIpOworICAgIHN0cmNhdChkZWZhdWx0TmFtZSwgb3V0RXh0ZW5zaW9uKTsKKyAgfQorCisgIGlmKGRlZmF1bHREdW1wTmFtZSkgeworICAgIHN0cmNweShkZWZhdWx0RHVtcE5hbWUsIHBsYXRmb3Jtc1tnUmVmTnVtXS5uYW1lKTsKKyAgICBzdHJjYXQoZGVmYXVsdER1bXBOYW1lLCAiLyIpOworICAgIHN0cmNhdChkZWZhdWx0RHVtcE5hbWUsIG5hbWUpOworICAgIHN0cmNhdChkZWZhdWx0RHVtcE5hbWUsICJfZGVmYXVsdC5kdW1wIik7CisgIH0KK30KKwordm9pZCAKK3NldEZpbGVzKGNvbnN0IGNoYXIgKm5hbWUsIFVFcnJvckNvZGUgJnN0YXR1cykgeworICBpZihVX0ZBSUxVUkUoc3RhdHVzKSkgeworICAgIHJldHVybjsKKyAgfQorICBpbnQzMl90IGkgPSAwOworICBjaGFyIHRhaWxvcmluZ05hbWVbMjU2XTsKKyAgY2hhciB0YWlsb3JpbmdEdW1wTmFtZVsyNTZdOworICBjaGFyIGRlZmF1bHROYW1lWzI1Nl07CisgIGNoYXIgZGVmYXVsdER1bXBOYW1lWzI1Nl07CisgIGNoYXIgZGlmZk5hbWVbMjU2XTsKKworICBnZXRGaWxlTmFtZXMobmFtZSwgdGFpbG9yaW5nTmFtZSwgdGFpbG9yaW5nRHVtcE5hbWUsIGRlZmF1bHROYW1lLCBkZWZhdWx0RHVtcE5hbWUsIGRpZmZOYW1lKTsKKyAgaWYob3B0aW9uc1tQTEFURk9STV0uZG9lc09jY3VyICYmICFvcHRpb25zW0RJRkZdLmRvZXNPY2N1cikgeyAgCisgICAgaWYoY3JlYXRlRGlyKHBsYXRmb3Jtc1tnUGxhdGZvcm1JbmRleGVzWzBdXS5uYW1lKSA9PSAwKSB7CisgICAgICB0YWlsb3JpbmdCdW5kbGUgPSBuZXcgVVByaW50ZXIodGFpbG9yaW5nTmFtZSwgImVuIiwgInV0Zi04IiwgTlVMTCwgRkFMU0UpOworICAgICAgZlRhaWxvcmluZ0R1bXAgPSBmb3Blbih0YWlsb3JpbmdEdW1wTmFtZSwgIndiIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHN0YXR1cyA9IFVfRklMRV9BQ0NFU1NfRVJST1I7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgaWYob3B0aW9uc1tSRUZFUkVOQ0VdLmRvZXNPY2N1ciAmJiAhb3B0aW9uc1tESUZGXS5kb2VzT2NjdXIpIHsKKyAgICBpZihjcmVhdGVEaXIocGxhdGZvcm1zW2dSZWZOdW1dLm5hbWUpID09IDApIHsKKyAgICAgIHJlZmVyZW5jZUJ1bmRsZSA9IG5ldyBVUHJpbnRlcihkZWZhdWx0TmFtZSwgImVuIiwgInV0Zi04IiwgTlVMTCwgRkFMU0UpOworICAgICAgZkRlZmF1bHREdW1wID0gZm9wZW4oZGVmYXVsdER1bXBOYW1lLCAid2IiKTsKKyAgICB9IGVsc2UgeworICAgICAgc3RhdHVzID0gVV9GSUxFX0FDQ0VTU19FUlJPUjsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKworICBpZigob3B0aW9uc1tQTEFURk9STV0uZG9lc09jY3VyICYmIG9wdGlvbnNbUkVGRVJFTkNFXS5kb2VzT2NjdXIpIHx8IG9wdGlvbnNbRElGRl0uZG9lc09jY3VyKSB7CisgICAgaWYoY3JlYXRlRGlyKHBsYXRmb3Jtc1tnUGxhdGZvcm1JbmRleGVzWzBdXS5uYW1lKSA9PSAwKSB7CisgICAgICBidW5kbGUgPSBuZXcgVVByaW50ZXIoZGlmZk5hbWUsICJlbiIsICJ1dGYtOCIsIE5VTEwsIEZBTFNFKTsKKyAgICB9CisgIH0KKyAgaWYob3B0aW9uc1tESUZGXS5kb2VzT2NjdXIpIHsKKyAgICBmVGFpbG9yaW5nRHVtcCA9IGZvcGVuKHRhaWxvcmluZ0R1bXBOYW1lLCAicmIiKTsKKyAgICBmRGVmYXVsdER1bXAgPSBmb3BlbihkZWZhdWx0RHVtcE5hbWUsICJyYiIpOworICB9Cit9CisKKworVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CitzdGF0aWMgVW5pY29kZVNldCBVTkFTU0lHTkVEKFVuaWNvZGVTdHJpbmcoIls6Q246XSIpLCBzdGF0dXMpOworc3RhdGljIFVuaWNvZGVTZXQgR0VORVJBTF9BQ0NFTlRTKFVuaWNvZGVTdHJpbmcoIltbOmJsb2NrPUNvbWJpbmluZyBEaWFjcml0aWNhbCBNYXJrczpdLVs6Q246XV0iKSwgc3RhdHVzKTsKKy8vc3RhdGljIFVuaWNvZGVTZXQgQVNDSUlfQkFTRShVbmljb2RlU3RyaW5nKCJbWzpBU0NJSTpdLVs6TDpdLVs6TjpdXSIpLCBzdGF0dXMpOworc3RhdGljIFVuaWNvZGVTZXQgQVNDSUlfQkFTRShVbmljb2RlU3RyaW5nKCJbWzpBU0NJSTpdXSIpLCBzdGF0dXMpOworc3RhdGljIFVuaWNvZGVTZXQgQUxQSEFCRVRJQyhVbmljb2RlU3RyaW5nKCJbOmFscGhhYmV0aWM6XSIpLCBzdGF0dXMpOworLy9zdGF0aWMgVW5pY29kZVNldCBDT05UUk9MKFVuaWNvZGVTdHJpbmcoIltbOmNvbnRyb2w6XVtcXHUwMDAwLVxcdTAwMkZdXSIpLCBzdGF0dXMpOworc3RhdGljIFVuaWNvZGVTZXQgQk1QKFVuaWNvZGVTdHJpbmcoIltcXHUwMDAwLVxcdUZGRkZdIiksIHN0YXR1cyk7CisKK3N0YXRpYyBVbmljb2RlU2V0IENPTlRST0woVW5pY29kZVN0cmluZygiWzpjb250cm9sOl0iKSwgc3RhdHVzKTsKKworVUNvbGxhdG9yICoKK3NldExvY2FsZShjb25zdCBjaGFyKiBsb2NhbGUsIFVFcnJvckNvZGUgJnN0YXR1cykKK3sKKyAgZ1dpbkxDSUQgPSB1bG9jX2dldExDSUQobG9jYWxlKTsKKyAgc2V0bG9jYWxlKExDX0NPTExBVEUsIGxvY2FsZSk7CisKKyAgaWYoZ0NvbCkgeworICAgIHVjb2xfY2xvc2UoZ0NvbCk7CisgIH0KKyAgZ0NvbCA9IHVjb2xfb3Blbihsb2NhbGUsICZzdGF0dXMpOworICB1Y29sX3NldEF0dHJpYnV0ZShnQ29sLCBVQ09MX05PUk1BTElaQVRJT05fTU9ERSwgVUNPTF9PTiwgJnN0YXR1cyk7CisgIC8vdWNvbF9zZXRBdHRyaWJ1dGUoY29sLCBVQ09MX0FMVEVSTkFURV9IQU5ETElORywgVUNPTF9TSElGVEVELCAmc3RhdHVzKTsKKyAgLy91Y29sX3NldEF0dHJpYnV0ZShjb2wsIFVDT0xfU1RSRU5HVEgsIFVDT0xfUVVBVEVSTkFSWSwgJnN0YXR1cyk7CisKKyAgcmV0dXJuIGdDb2w7Cit9CisKKworCitVQ29sbGF0b3IgKgorc2V0UmVmZXJlbmNlKFVFcnJvckNvZGUgJnN0YXR1cykgCit7CisgIGdXaW5MQ0lEID0gdWxvY19nZXRMQ0lEKCJlbiIpOworICBzZXRsb2NhbGUoTENfQ09MTEFURSwgImVuX1VTLlVURi04Iik7CisgIGlmKGdDb2wpIHsKKyAgICB1Y29sX2Nsb3NlKGdDb2wpOworICB9CisgIGdDb2wgPSB1Y29sX29wZW4oInJvb3QiLCAmc3RhdHVzKTsKKyAgdWNvbF9zZXRBdHRyaWJ1dGUoZ0NvbCwgVUNPTF9OT1JNQUxJWkFUSU9OX01PREUsIFVDT0xfT04sICZzdGF0dXMpOworICByZXR1cm4gZ0NvbDsKK30KKwordm9pZAorcHJvY2Vzc0ludGVyYWN0aXZlKCkgeworICBjaGFyIGNvbW1hbmRbMjU2XTsKKyAgd2hpbGUoZmdldHMoY29tbWFuZCwgMjU2LCBzdGRpbikpIHsKKworICB9Cit9CisKK1VDaGFyIHByb2JlQ2hhcnNbXVs0XSA9IHsKKyAgeyAweDAwNjEsIDB4MDA2MiwgMHgwMEUxLCAweDAwNDEgfSwgLy8gbGF0aW4gd2l0aCBhLWdyYXZlCisgIHsgMHgwMDQxLCAweDAwNDIsIDB4MDBDMSwgMHgwMDYxIH0sIC8vIHVwcGVyIGZpcnN0CisgIHsgMHgwMDZFLCAweDAwNkYsIDB4MDBGMSwgMHgwMDRFIH0sIC8vIGxhdGluIHdpdGggbi10aWxkYQorICB7IDB4MDA0RSwgMHgwMDRGLCAweDAwRDEsIDB4MDA2RSB9LCAvLyB1cHBlciBmaXJzdAorICB7IDB4MDQzMywgMHgwNDkzLCAweDA0OTEsIDB4MDQxMyB9LCAvLyBDeXJpbGxpYworICB7IDB4MDQxMywgMHgwNDkyLCAweDA0OTAsIDB4MDQzMyB9LCAvLyB1cHBlciBmaXJzdAorICB7IDB4MzA0NSwgMHgzMDQ3LCAweDMwOTQsIDB4MzA0NiB9ICAvLyBIaXJhZ2FuYS9LYXRha2FuYSAobGFzdCByZXNvcnQpCisKK307CisKK3ZvaWQKK3Byb2Nlc3NDb2xsYXRvcihVQ29sbGF0b3IgKmNvbCwgVUVycm9yQ29kZSAmc3RhdHVzKSB7CisgIGludDMyX3QgaSA9IDA7CisgIHVpbnQzMl90IGogPSAwOworICBnQ29sID0gY29sOworICBVQ2hhciBydWxlU3RyaW5nWzE2Mzg0XTsKKyAgY2hhciBteUxvY1syNTZdOworCisgIGludDMyX3QgcnVsZVN0cmluZ0xlbmd0aCA9IHVjb2xfZ2V0UnVsZXNFeChnQ29sLCBVQ09MX1RBSUxPUklOR19PTkxZLCBydWxlU3RyaW5nLCAxNjM4NCk7CisgIGxvZ2dlci0+bG9nKFVuaWNvZGVTdHJpbmcocnVsZVN0cmluZywgcnVsZVN0cmluZ0xlbmd0aCksIFRSVUUpOworICBjb25zdCBjaGFyICpsb2NhbGUgPSB1Y29sX2dldExvY2FsZShnQ29sLCBVTE9DX1JFUVVFU1RFRF9MT0NBTEUsICZzdGF0dXMpOworICBpZihsb2NhbGUgPT0gTlVMTCkgeworICAgIGxvY2FsZSA9ICJlbiI7CisgIH0KKyAgc3RyY3B5KG15TG9jLCBsb2NhbGUpOworICBVbmljb2RlU2V0IGV4ZW1wbGFyVVNldDsKKyAgVW5pY29kZVNldCBSZWZSZXBlcnRvaXJlOworCisgIFVuaWNvZGVTZXQgdGFpbG9yZWQ7CisKKyAgdGFpbG9yZWQgPSAqKChVbmljb2RlU2V0ICopdWNvbF9nZXRUYWlsb3JlZFNldChnQ29sLCAmc3RhdHVzKSk7CisgIHRhaWxvcmVkLnJlbW92ZUFsbChDT05UUk9MKTsKKworCisgIFVuaWNvZGVTdHJpbmcgcGF0dGVybjsKKyAgaW50IHNhbml0eVJlc3VsdDsKKworICBVbmljb2RlU2V0IGhhblNldDsKKyAgVUJvb2wgaGFuQXBwZWFycyA9IEZBTFNFOworCisgIGRlYnVnLT5sb2coIlxuR2VuZXJhdGluZyBvcmRlciBmb3IgcGxhdGZvcm06ICVzXG4iLCBwbGF0Zm9ybXNbZ1BsYXRmb3JtSW5kZXhlc1swXV0ubmFtZSk7CisgIGdDb21wYXJlciA9IHBsYXRmb3Jtc1tnUGxhdGZvcm1JbmRleGVzWzBdXS5jb21wYXJlcjsKKworICBTdHJlbmd0aFByb2JlIHByb2JlKHBsYXRmb3Jtc1tnUGxhdGZvcm1JbmRleGVzWzBdXS5jb21wYXJlciwgcGxhdGZvcm1zW2dQbGF0Zm9ybUluZGV4ZXNbMF1dLnNrZ2V0dGVyLCAweDAwMzAsIHByb2JlQ2hhcnNbMF1bMF0sIHByb2JlQ2hhcnNbMF1bMV0sIHByb2JlQ2hhcnNbMF1bMl0sIHByb2JlQ2hhcnNbMF1bM10pOworICBzYW5pdHlSZXN1bHQgPSBwcm9iZS5jaGVja1Nhbml0eSgpOworICBqID0gMDsKKyAgd2hpbGUoc2FuaXR5UmVzdWx0ICYmIGorMSA8IHNpemVvZihwcm9iZUNoYXJzKS9zaXplb2YocHJvYmVDaGFyc1swXSkpIHsKKyAgIGorKzsKKyAgIHNhbml0eVJlc3VsdCA9ICBwcm9iZS5zZXRQcm9iZUNoYXJzKHByb2JlQ2hhcnNbal1bMF0sIHByb2JlQ2hhcnNbal1bMV0sIHByb2JlQ2hhcnNbal1bMl0sIHByb2JlQ2hhcnNbal1bM10pOworICB9CisgIGlmKHNhbml0eVJlc3VsdCkgeworICAgIGxvZ2dlci0+bG9nKCJCYWQgY2hvaWNlIG9mIHByb2JlIGNoYXJhY3RlcnMhIFNhbml0eSByZXR1cm5lZCAlaS4gRXhpdGluZ1xuIiwgc2FuaXR5UmVzdWx0LCBzYW5pdHlSZXN1bHQpOworICAgIHJldHVybjsKKyAgfQorICBsb2dnZXItPmxvZygiUHJvYmUgY2hhcnM6ICVDLCAlQywgJUMsICVDXG4iLCBwcm9iZUNoYXJzW2pdWzBdLCBwcm9iZUNoYXJzW2pdWzFdLCBwcm9iZUNoYXJzW2pdWzJdLCBwcm9iZUNoYXJzW2pdWzNdKTsgCisKKyAgZGVidWctPm9mZigpOworCisgIGlmKGdSZXBlcnRvaXJlLnNpemUoKSkgeworICAgIGV4ZW1wbGFyVVNldCA9IGdSZXBlcnRvaXJlOworICB9IGVsc2UgeworICAgIGdlbmVyYXRlUmVwZXJ0b2lyZShsb2NhbGUsIGV4ZW1wbGFyVVNldCwgaGFuQXBwZWFycywgc3RhdHVzKTsKKyAgfQorICBleGVtcGxhclVTZXQuYWRkQWxsKHRhaWxvcmVkKTsKKyAgaGFuU2V0LmFwcGx5SW50UHJvcGVydHlWYWx1ZShVQ0hBUl9TQ1JJUFQsIFVTQ1JJUFRfSEFOLCBzdGF0dXMpOworICBleGVtcGxhclVTZXQucmVtb3ZlQWxsKGhhblNldCk7CisgIAorICBsb2dnZXItPmxvZyhleGVtcGxhclVTZXQudG9QYXR0ZXJuKHBhdHRlcm4sIFRSVUUpLCBUUlVFKTsKKworICBleGVtcGxhclVTZXQgPSBmbGF0dGVuKGV4ZW1wbGFyVVNldCwgc3RhdHVzKTsKKyAgbG9nZ2VyLT5sb2coZXhlbXBsYXJVU2V0LnRvUGF0dGVybihwYXR0ZXJuLCBUUlVFKSwgVFJVRSk7CisKKyAgaWYoIW9wdGlvbnNbUFJJTlRSRUZdLmRvZXNPY2N1cikgeworCisgICAgbG9nZ2VyLT5sb2coIlxuKioqIERldGVjdGluZyBvcmRlcmluZyBmb3IgdGhlIGxvY2FsZVxuXG4iKTsKKworICAgIGRlYnVnLT5vbigpOworICAgIFNvcnRlZExpbmVzIGxpbmVzKGV4ZW1wbGFyVVNldCwgZ0V4Y2x1ZGVTZXQsIHByb2JlLCBsb2dnZXIsIGRlYnVnKTsKKyAgICBsaW5lcy5hbmFseXNlKHN0YXR1cyk7CisgICAgbGluZXMuY2FsY3VsYXRlU29ydEtleXMoKTsKKyAgICBkZWJ1Zy0+bG9nKCJcbioqKiBGaW5hbCBvcmRlclxuXG4iKTsKKyAgICBkZWJ1Zy0+bG9nKGxpbmVzLnRvUHJldHR5U3RyaW5nKFRSVUUsIFRSVUUpLCBUUlVFKTsKKyAgICBsaW5lcy50b0ZpbGUoZlRhaWxvcmluZ0R1bXAsIFRSVUUsIHN0YXR1cyk7CisgICAgdGFpbG9yaW5nQnVuZGxlLT5sb2cobGluZXMudG9PdXRwdXQob3V0cHV0Rm9ybWF0LCBteUxvYywgcGxhdGZvcm1zW2dQbGF0Zm9ybUluZGV4ZXNbMF1dLm5hbWUsIE5VTEwsIFRSVUUsIFRSVUUsIGhhbkFwcGVhcnMpLCBUUlVFKTsKKyAgICAvL2RlYnVnLT5vZmYoKTsKKworICAgIGlmKG9wdGlvbnNbUkVGRVJFTkNFXS5kb2VzT2NjdXIpIHsKKyAgICAgIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgICAgIGxpbmVzLmdldFJlcGVydG9pcmUoUmVmUmVwZXJ0b2lyZSk7CisgICAgICBzZXRSZWZlcmVuY2Uoc3RhdHVzKTsKKworICAgICAgbG9nZ2VyLT5sb2coZXhlbXBsYXJVU2V0LnRvUGF0dGVybihwYXR0ZXJuLCBUUlVFKSwgVFJVRSk7CisgICAgICBsb2dnZXItPmxvZyhSZWZSZXBlcnRvaXJlLnRvUGF0dGVybihwYXR0ZXJuLCBUUlVFKSwgVFJVRSk7CisKKyAgICAgIFN0cmVuZ3RoUHJvYmUgUmVmUHJvYmUocGxhdGZvcm1zW2dSZWZOdW1dLmNvbXBhcmVyLCBwbGF0Zm9ybXNbZ1JlZk51bV0uc2tnZXR0ZXIpOworICAgICAgbG9nZ2VyLT5sb2coIlxuKioqIERldGVjdGluZyBvcmRlcmluZyBmb3IgcmVmZXJlbmNlXG5cbiIpOworICAgICAgU29ydGVkTGluZXMgUmVmTGluZXMoZXhlbXBsYXJVU2V0LCBnRXhjbHVkZVNldCwgUmVmUHJvYmUsIGxvZ2dlciwgZGVidWcpOworICAgICAgUmVmTGluZXMuYW5hbHlzZShzdGF0dXMpOworICAgICAgcmVmZXJlbmNlQnVuZGxlLT5sb2coUmVmTGluZXMudG9PdXRwdXQob3V0cHV0Rm9ybWF0LCBteUxvYywgcGxhdGZvcm1zW2dSZWZOdW1dLm5hbWUsIE5VTEwsIFRSVUUsIFRSVUUsIEZBTFNFKSwgVFJVRSk7CisgICAgICBSZWZMaW5lcy50b0ZpbGUoZkRlZmF1bHREdW1wLCBUUlVFLCBzdGF0dXMpOworCisgICAgICBsaW5lcy5yZWR1Y2VEaWZmZXJlbmNlKFJlZkxpbmVzKTsKKyAgICAgIGxvZ2dlci0+bG9nKCJcbioqKiBGaW5hbCBydWxlc1xuXG4iKTsKKyAgICAgIGxvZ2dlci0+bG9nKGxpbmVzLnRvUHJldHR5U3RyaW5nKFRSVUUpLCBUUlVFKTsKKyAgICAgIGJ1bmRsZS0+bG9nKGxpbmVzLnRvT3V0cHV0KG91dHB1dEZvcm1hdCwgbXlMb2MsIHBsYXRmb3Jtc1tnUGxhdGZvcm1JbmRleGVzWzBdXS5uYW1lLCBwbGF0Zm9ybXNbZ1JlZk51bV0ubmFtZSwgVFJVRSwgVFJVRSwgaGFuQXBwZWFycyksIFRSVUUpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBzZXRSZWZlcmVuY2Uoc3RhdHVzKTsKKyAgICBTdHJlbmd0aFByb2JlIFJlZlByb2JlKHBsYXRmb3Jtc1tnUmVmTnVtXS5jb21wYXJlciwgcGxhdGZvcm1zW2dSZWZOdW1dLnNrZ2V0dGVyKTsKKyAgICBsb2dnZXItPmxvZygiXG4qKiogRGV0ZWN0aW5nIG9yZGVyaW5nIGZvciByZWZlcmVuY2VcblxuIik7CisgICAgU29ydGVkTGluZXMgUmVmTGluZXMoZXhlbXBsYXJVU2V0LCBnRXhjbHVkZVNldCwgUmVmUHJvYmUsIGxvZ2dlciwgZGVidWcpOworICAgIFJlZkxpbmVzLmFuYWx5c2Uoc3RhdHVzKTsKKyAgICBsb2dnZXItPmxvZyhSZWZMaW5lcy50b1ByZXR0eVN0cmluZyhUUlVFKSwgVFJVRSk7CisgICAgcmVmZXJlbmNlQnVuZGxlLT5sb2coUmVmTGluZXMudG9PdXRwdXQob3V0cHV0Rm9ybWF0LCBteUxvYywgcGxhdGZvcm1zW2dSZWZOdW1dLm5hbWUsIE5VTEwsIFRSVUUsIFRSVUUsIEZBTFNFKSwgVFJVRSk7CisgIH0KKyAgaWYoaGFuQXBwZWFycykgeworICAgIC8vIHRoZXJlIGFyZSBIYW4gY2hhcmFjdGVycy4gVGhpcyBpcyBhIGh1Z2UgYmxvY2suIFRoZSBiZXN0IHdlIGNhbiBkbyBpcyB0byBqdXN0IHNvcnQgaXQsIGNvbXBhcmUgdG8gZW1wdHkKKyAgICAvLyBhbmQgc3BpdCBpdCBvdXQuIEFueXRoaW5nIGVsc2Ugd291bGQgYmUgYSBzdWljaWRlIChhY3R1YWxseSBpcyAtIGtlcm5lbCBqdXN0IGtpbGxzIHlvdSA6KQorICAgIGxvZ2dlci0+bG9nKCJcbioqKiBEZXRlY3Rpbmcgb3JkZXIgZm9yIEhhblxuIik7CisgICAgZGVidWctPm9mZigpOworICAgIHNldExvY2FsZShnTG9jYWxlLCBzdGF0dXMpOworICAgIGV4ZW1wbGFyVVNldC5jbGVhcigpOworICAgIGV4ZW1wbGFyVVNldC5hcHBseUludFByb3BlcnR5VmFsdWUoVUNIQVJfU0NSSVBULCBVU0NSSVBUX0hBTiwgc3RhdHVzKTsKKyAgICBleGVtcGxhclVTZXQgPSBmbGF0dGVuKGV4ZW1wbGFyVVNldCwgc3RhdHVzKTsKKyAgICBTb3J0ZWRMaW5lcyBoYW4oZXhlbXBsYXJVU2V0LCBnRXhjbHVkZVNldCwgcHJvYmUsIGxvZ2dlciwgZGVidWcpOworICAgIGhhbi5zb3J0KFRSVUUsIFRSVUUpOworICAgIGhhbi5jbGFzc2lmeVJlcGVydG9pcmUoKTsKKyAgICBoYW4uZ2V0Qm91bmRzKHN0YXR1cyk7CisgICAgdGFpbG9yaW5nQnVuZGxlLT5sb2coIkhhbiBvcmRlcmluZzo8YnI+XG4iKTsKKyAgICB0YWlsb3JpbmdCdW5kbGUtPmxvZyhoYW4udG9PdXRwdXQob3V0cHV0Rm9ybWF0LCBteUxvYywgcGxhdGZvcm1zW2dQbGF0Zm9ybUluZGV4ZXNbMF1dLm5hbWUsIE5VTEwsIFRSVUUsIEZBTFNFLCBGQUxTRSksIFRSVUUpOworICAgIGJ1bmRsZS0+bG9nKGhhbi50b091dHB1dChvdXRwdXRGb3JtYXQsIG15TG9jLCBwbGF0Zm9ybXNbZ1BsYXRmb3JtSW5kZXhlc1swXV0ubmFtZSwgTlVMTCwgVFJVRSwgRkFMU0UsIEZBTFNFKSwgVFJVRSk7CisgIH0KKyAgdWNvbF9jbG9zZShnQ29sKTsKK30KKwordm9pZAorcHJvY2Vzc0xvY2FsZShjb25zdCBjaGFyICpsb2NhbGUsIFVFcnJvckNvZGUgJnN0YXR1cykgeworICBzZXRMb2NhbGUobG9jYWxlLCBzdGF0dXMpOworICBzZXRGaWxlcyhsb2NhbGUsIHN0YXR1cyk7CisgIGlmKFVfRkFJTFVSRShzdGF0dXMpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgZGVidWctPmxvZygiTG9jYWxlICVzIChMQ0lEOiUwNlgsIHVuaXg6JXMpXG4iLCBsb2NhbGUsIGdXaW5MQ0lELCBzZXRsb2NhbGUoTENfQ09MTEFURSwgTlVMTCkpOworICB0YWlsb3JpbmdCdW5kbGUtPmxvZygiLy8gT3JkZXJpbmcgZm9yIGxvY2FsZSAlcyAoTENJRDolMDZYLCB1bml4OiVzKSwgcGxhdGZvcm0gJXMgcmVmZXJlbmNlICVzPGJyPlxuIiwgCisgICAgbG9jYWxlLCBnV2luTENJRCwgc2V0bG9jYWxlKExDX0NPTExBVEUsIE5VTEwpLCAKKyAgICBwbGF0Zm9ybXNbZ1BsYXRmb3JtSW5kZXhlc1swXV0ubmFtZSwgcGxhdGZvcm1zW2dSZWZOdW1dLm5hbWUpOworICBpZihvcHRpb25zW1JFRkVSRU5DRV0uZG9lc09jY3VyKSB7CisgICAgcmVmZXJlbmNlQnVuZGxlLT5sb2coIi8vIFJlZmVyZW5jZSBmb3IgbG9jYWxlICVzIChMQ0lEOiUwNlgsIHVuaXg6JXMpLCBwbGF0Zm9ybSAlcyByZWZlcmVuY2UgJXM8YnI+XG4iLCAKKyAgICAgIGxvY2FsZSwgZ1dpbkxDSUQsIHNldGxvY2FsZShMQ19DT0xMQVRFLCBOVUxMKSwgCisgICAgICBwbGF0Zm9ybXNbZ1BsYXRmb3JtSW5kZXhlc1swXV0ubmFtZSwgcGxhdGZvcm1zW2dSZWZOdW1dLm5hbWUpOworICB9CisKKworICBwcm9jZXNzQ29sbGF0b3IoZ0NvbCwgc3RhdHVzKTsKK30KKworCisKK1VCb29sIAoraGFzQ29sbGF0aW9uRWxlbWVudHMoY29uc3QgY2hhciAqbG9jTmFtZSkgeworCisgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICBVUmVzb3VyY2VCdW5kbGUgKkNvbEVsID0gTlVMTDsKKworICBVUmVzb3VyY2VCdW5kbGUgKmxvYyA9IHVyZXNfb3BlbihOVUxMLCBsb2NOYW1lLCAmc3RhdHVzKTs7CisKKyAgaWYoVV9TVUNDRVNTKHN0YXR1cykpIHsKKyAgICBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisgICAgQ29sRWwgPSB1cmVzX2dldEJ5S2V5KGxvYywgIkNvbGxhdGlvbkVsZW1lbnRzIiwgQ29sRWwsICZzdGF0dXMpOworICAgIGlmKHN0YXR1cyA9PSBVX1pFUk9fRVJST1IpIHsgLyogZG8gdGhlIHRlc3QgLSB0aGVyZSBhcmUgcmVhbCBlbGVtZW50cyAqLworICAgICAgdXJlc19jbG9zZShDb2xFbCk7CisgICAgICB1cmVzX2Nsb3NlKGxvYyk7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgdXJlc19jbG9zZShDb2xFbCk7CisgICAgdXJlc19jbG9zZShsb2MpOworICB9CisgIHJldHVybiBGQUxTRTsKK30KKworaW50CittYWluKGludCBhcmdjLAorICAgICBjaGFyKiBhcmd2W10pCit7CisgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICBsb2dnZXIgPSBuZXcgVVByaW50ZXIoc3Rkb3V0LCAiZW4iLCAibGF0aW4tMSIpOworICBkZWJ1ZyA9ICBuZXcgVVByaW50ZXIoc3RkZXJyLCAiZW4iLCAibGF0aW4tMSIpOworCisvKgorICBVU2V0ICp3c3AgPSB1cHJ2X29wZW5SdWxlV2hpdGVTcGFjZVNldCgmc3RhdHVzKTsKKyAgdXNldF9hZGQod3NwLCAweDAwNDEpOworICB1c2V0X3JlbW92ZSh3c3AsIDB4MDA0MSk7CisgIFVuaWNvZGVTdHJpbmcgcGF0OworICAoKFVuaWNvZGVTZXQgKil3c3ApLT50b1BhdHRlcm4ocGF0LCBUUlVFKTsKKyAgcGF0LnNldENoYXJBdChwYXQubGVuZ3RoKCksIDApOworICBlc2NhcGVTdHJpbmcocGF0LmdldEJ1ZmZlcigpLCBwYXQubGVuZ3RoKCksIGxvZyk7CisgIHVfZmZsdXNoKGxvZyk7CisqLworCisgIHByb2Nlc3NBcmdzKGFyZ2MsIGFyZ3YsIHN0YXR1cyk7CisgIGludDMyX3QgaSA9IDA7CisKKworCisgIGlmKFVfRkFJTFVSRShzdGF0dXMpIHx8IGdQbGF0Zm9ybU5vID09IDApIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICB1dGY4Y252ID0gdWNudl9vcGVuKCJ1dGYtOCIsICZzdGF0dXMpOyAgICAvLyB3ZSBhcmUganVzdCBkb2luZyBVVEYtOCBsb2NhbGVzIGZvciBub3cuCisgIGdVQ0EgPSB1Y29sX29wZW4oInJvb3QiLCAmc3RhdHVzKTsKKworICBpZihvcHRpb25zW0lOVEVSQUNUSVZFXS5kb2VzT2NjdXIpIHsKKyAgICBwcm9jZXNzSW50ZXJhY3RpdmUoKTsKKyAgfSBlbHNlIHsKKyAgICBpZihnUnVsZXNTdGRpbikgeworICAgICAgY2hhciBidWZmZXJbMTAyNF07CisgICAgICBVQ2hhciBydWxlQnVmZmVyWzE2Mzg0XTsKKyAgICAgIFVDaGFyICpydWxlcyA9IHJ1bGVCdWZmZXI7CisgICAgICBpbnQzMl90IG1heFJ1bGVMZW4gPSAxNjM4NDsKKyAgICAgIGludDMyX3QgckxlbiA9IDA7CisgICAgICB3aGlsZShmZ2V0cyhidWZmZXIsIDEwMjQsIHN0ZGluKSkgeworICAgICAgICBpZihidWZmZXJbMF0gIT0gJy8nICYmIGJ1ZmZlclsxXSAhPSAnLycpIHsKKyAgICAgICAgICByTGVuID0gdV91bmVzY2FwZShidWZmZXIsIHJ1bGVzLCBtYXhSdWxlTGVuKTsKKyAgICAgICAgICBydWxlcyArPSByTGVuOworICAgICAgICAgIG1heFJ1bGVMZW4gLT0gckxlbjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgVVBhcnNlRXJyb3IgcGFyc2VFcnJvcjsKKyAgICAgIC8vZXNjYXBlU3RyaW5nKHJ1bGVCdWZmZXIsIHJ1bGVzLXJ1bGVCdWZmZXIsIGxvZyk7Ly8KKyAgICAgIGRlYnVnLT5sb2coIiVVXG4iLCBydWxlQnVmZmVyKTsKKworICAgICAgVUNvbGxhdG9yICpjb2wgPSB1Y29sX29wZW5SdWxlcyhydWxlQnVmZmVyLCBydWxlcy1ydWxlQnVmZmVyLCBVQ09MX0RFRkFVTFQsIFVDT0xfREVGQVVMVCwgJnBhcnNlRXJyb3IsICZzdGF0dXMpOworICAgICAgaWYoVV9TVUNDRVNTKHN0YXR1cykpIHsKKyAgICAgICAgc2V0RmlsZXMoInN0ZGluUnVsZXMiLCBzdGF0dXMpOworICAgICAgICBwcm9jZXNzQ29sbGF0b3IoY29sLCBzdGF0dXMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbG9nZ2VyLT5sb2coIkVycm9yICVzXG4iLCB1X2Vycm9yTmFtZShzdGF0dXMpKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYob3B0aW9uc1tESUZGXS5kb2VzT2NjdXIpIHsKKyAgICAgIGxvZ2dlci0+bG9nKCJEaWZmaW5nIHR3byBkdW1wc1xuIik7CisgICAgICAvLyBtdXN0IGhhdmUgbG9jYWxlLCBwbGF0Zm9ybSBhbmQgcmVmIGluIG9yZGVyIHRvIGJlIAorICAgICAgLy8gYWJsZSB0byBmaW5kIGR1bXAgZmlsZXMuCisgICAgICBzZXRGaWxlcyhnTG9jYWxlLCBzdGF0dXMpOworICAKKyAgICAgIGlmKGZUYWlsb3JpbmdEdW1wICYmIGZEZWZhdWx0RHVtcCkgeworCSAgICBTb3J0ZWRMaW5lcyB0YWlsb3JpbmcoZlRhaWxvcmluZ0R1bXAsIGxvZ2dlciwgZGVidWcsIHN0YXR1cyk7CisJICAgIGxvZ2dlci0+bG9nKHRhaWxvcmluZy50b1N0cmluZyhUUlVFKSwgVFJVRSk7CisJICAgIFNvcnRlZExpbmVzIHJlZmVyZW5jZShmRGVmYXVsdER1bXAsIGxvZ2dlciwgZGVidWcsIHN0YXR1cyk7CisJICAgIGxvZ2dlci0+bG9nKHJlZmVyZW5jZS50b1N0cmluZyhUUlVFKSwgVFJVRSk7CisJICAgIHRhaWxvcmluZy5yZWR1Y2VEaWZmZXJlbmNlKHJlZmVyZW5jZSk7CisJICAgIGxvZ2dlci0+bG9nKCJcbioqKiBGaW5hbCBydWxlc1xuXG4iKTsKKwkgICAgbG9nZ2VyLT5sb2codGFpbG9yaW5nLnRvUHJldHR5U3RyaW5nKFRSVUUpLCBUUlVFKTsKKwkgICAgLy9yZXN1bHQtPmxvZyhsaW5lcy50b1ByZXR0eVN0cmluZyhUUlVFKSwgVFJVRSk7CisJICAgIGJ1bmRsZS0+bG9nKHRhaWxvcmluZy50b091dHB1dChvdXRwdXRGb3JtYXQsIGdMb2NhbGUsIHBsYXRmb3Jtc1tnUGxhdGZvcm1JbmRleGVzWzBdXS5uYW1lLCBwbGF0Zm9ybXNbZ1JlZk51bV0ubmFtZSwgVFJVRSwgVFJVRSwgRkFMU0UpLCBUUlVFKTsKKyAgICAgIH0KKworICAgIH0gZWxzZSB7CisgICAgICBpZihnTG9jYWxlKSB7CisgICAgICAgIHByb2Nlc3NMb2NhbGUoZ0xvY2FsZSwgc3RhdHVzKTsKKyAgICAgIH0gZWxzZSBpZihnTG9jYWxlTm8pIHsKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgZ0xvY2FsZU5vOyBpKyspIHsKKyAgICAgICAgICBwcm9jZXNzTG9jYWxlKGdMb2NhbGVzW2ldLCBzdGF0dXMpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeyAvLyBkbyB0aGUgbG9vcCB0aHJvdWdoIGFsbCB0aGUgbG9jYWxlcworICAgICAgICBpbnQzMl90IG5vT2ZMb2MgPSB1bG9jX2NvdW50QXZhaWxhYmxlKCk7CisgICAgICAgIGNvbnN0IGNoYXIgKmxvY05hbWUgPSBOVUxMOworICAgICAgICBmb3IoaSA9IDA7IGk8bm9PZkxvYzsgaSsrKSB7CisgICAgICAgICAgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICAgICAgICAgIGxvY05hbWUgPSB1bG9jX2dldEF2YWlsYWJsZShpKTsKKyAgICAgICAgICBpZihoYXNDb2xsYXRpb25FbGVtZW50cyhsb2NOYW1lKSkgeworICAgICAgICAgICAgcHJvY2Vzc0xvY2FsZShsb2NOYW1lLCBzdGF0dXMpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisKKyAgdWNvbF9jbG9zZShnVUNBKTsKKyAgdWNudl9jbG9zZSh1dGY4Y252KTsKKworICBkZWxldGUgbG9nZ2VyOworICBkZWxldGUgZGVidWc7CisgIGlmKHRhaWxvcmluZ0J1bmRsZSkgeworICAgIGRlbGV0ZSB0YWlsb3JpbmdCdW5kbGU7CisgIH0KKyAgaWYocmVmZXJlbmNlQnVuZGxlKSB7CisgICAgZGVsZXRlIHJlZmVyZW5jZUJ1bmRsZTsKKyAgfQorICBpZihidW5kbGUpIHsKKyAgICBkZWxldGUgYnVuZGxlOworICB9CisgIGlmKGZUYWlsb3JpbmdEdW1wKSB7CisgICAgZmNsb3NlKGZUYWlsb3JpbmdEdW1wKTsKKyAgfQorICBpZihmRGVmYXVsdER1bXApIHsKKyAgICBmY2xvc2UoZkRlZmF1bHREdW1wKTsKKyAgfQorICByZXR1cm4gMDsKK30KKworCitVbmljb2RlU3RyaW5nIHByb3BlcnR5QW5kVmFsdWVOYW1lKFVQcm9wZXJ0eSBwcm9wLCBpbnQzMl90IGkpIHsKKyAgVW5pY29kZVN0cmluZyByZXN1bHQ7CisgIHJlc3VsdC5hcHBlbmQodV9nZXRQcm9wZXJ0eU5hbWUocHJvcCwgVV9MT05HX1BST1BFUlRZX05BTUUpKTsKKyAgcmVzdWx0LmFwcGVuZCgiPSIpOworICByZXN1bHQuYXBwZW5kKHVfZ2V0UHJvcGVydHlWYWx1ZU5hbWUocHJvcCwgaSwgVV9MT05HX1BST1BFUlRZX05BTUUpKTsKKworICAgIC8vKyAiKCIgKyBwcm9wICsgIiwiICsgaSArICIpICI7CisgIHJldHVybiByZXN1bHQ7Cit9CisKKwordm9pZCBnZW5lcmF0ZVJlcGVydG9pcmUoY29uc3QgY2hhciAqbG9jYWxlLCBVbmljb2RlU2V0ICZyZXAsIFVCb29sICZoYW5BcHBlYXJzLCBVRXJyb3JDb2RlICZzdGF0dXMpIHsKKyAgICBVbmljb2RlU3RyaW5nIGRpc3BOYW1lOworICAgIGRlYnVnLT5sb2coIkdldHRpbmcgcmVwZXJ0b2lyZSBmb3IgJXNcbiIsIGxvY2FsZSk7CisgICAgdGFpbG9yaW5nQnVuZGxlLT5sb2coIi8vIFNjcmlwdHMgaW4gcmVwZXJ0b2lyZTogIik7CisgICAgaWYob3B0aW9uc1tSRUZFUkVOQ0VdLmRvZXNPY2N1cikgeworICAgICAgcmVmZXJlbmNlQnVuZGxlLT5sb2coIi8vIFNjcmlwdHMgaW4gcmVwZXJ0b2lyZTogIik7CisgICAgfQorCXJlcC5jbGVhcigpOworICAgIFVuaWNvZGVTZXQgZGVsdGE7CisgICAgCisgICAgVVNjcmlwdENvZGUgc2NyaXB0WzI1Nl07CisgICAgaW50MzJfdCBpID0gMDsKKyAgICAvLyBub3cgYWRkIHRoZSBzY3JpcHRzIGZvciB0aGUgbG9jYWxlCisgICAgVVByb3BlcnR5IHByb3AgPSBVQ0hBUl9TQ1JJUFQ7CisJaW50MzJfdCBzY3JpcHRMZW5ndGggPSB1c2NyaXB0X2dldENvZGUobG9jYWxlLCBzY3JpcHQsIDI1NiwgJnN0YXR1cyk7CisgICAgaWYoc2NyaXB0TGVuZ3RoKSB7CisJICBmb3IgKGkgPSAwOyBpIDwgc2NyaXB0TGVuZ3RoOyArK2kpIHsKKyAgICAgICAgaWYoc2NyaXB0W2ldID09IFVTQ1JJUFRfSEFOKSB7CisgICAgICAgICAgaGFuQXBwZWFycyA9IFRSVUU7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgZGVsdGEuYXBwbHlJbnRQcm9wZXJ0eVZhbHVlKHByb3AsIHNjcmlwdFtpXSwgc3RhdHVzKTsKKyAgICAgICAgZGVidWctPmxvZygiQWRkaW5nICIpOworICAgICAgICBkZWJ1Zy0+bG9nKHByb3BlcnR5QW5kVmFsdWVOYW1lKHByb3AsIHNjcmlwdFtpXSksIFRSVUUpOworICAgICAgICB0YWlsb3JpbmdCdW5kbGUtPmxvZygiLy8gIik7CisgICAgICAgIHRhaWxvcmluZ0J1bmRsZS0+bG9nKHByb3BlcnR5QW5kVmFsdWVOYW1lKHByb3AsIHNjcmlwdFtpXSksIFRSVUUpOworICAgICAgICBpZihvcHRpb25zW1JFRkVSRU5DRV0uZG9lc09jY3VyKSB7CisgICAgICAgICAgcmVmZXJlbmNlQnVuZGxlLT5sb2coIi8vICIpOworICAgICAgICAgIHJlZmVyZW5jZUJ1bmRsZS0+bG9nKHByb3BlcnR5QW5kVmFsdWVOYW1lKHByb3AsIHNjcmlwdFtpXSksIFRSVUUpOworICAgICAgICB9CisJCXJlcC5hZGRBbGwoZGVsdGEpOworCSAgfQorICAgIH0gZWxzZSB7CisgICAgICBkZWx0YS5hcHBseUludFByb3BlcnR5VmFsdWUoVUNIQVJfU0NSSVBULCBVU0NSSVBUX0xBVElOLCBzdGF0dXMpOworICAgICAgcmVwLmFkZEFsbChkZWx0YSk7CisgICAgfQorICAgIAorICAgIC8vIG5vdyBzZWUgd2hpY2ggYmxvY2tzIHRob3NlIG92ZXJsYXAsIGFuZCBhZGQKKyAgICBwcm9wID0gVUNIQVJfQkxPQ0s7CisgICAgaW50MzJfdCBtaW4gPSB1X2dldEludFByb3BlcnR5TWluVmFsdWUocHJvcCk7CisgICAgaW50MzJfdCBtYXggPSB1X2dldEludFByb3BlcnR5TWF4VmFsdWUocHJvcCk7CisgICAgVW5pY29kZVNldCBjaGVja0RlbHRhOworICAgIGZvciAoaSA9IG1pbjsgaSA8PSBtYXg7ICsraSkgeworICAgICAgICAvLyBza2lwIGNlcnRhaW4gYmxvY2tzCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSB1X2dldFByb3BlcnR5VmFsdWVOYW1lKHByb3AsIGksIFVfTE9OR19QUk9QRVJUWV9OQU1FKTsKKyAgICAgICAgaWYgKHN0cmNtcChuYW1lLCAiU3VwZXJzY3JpcHRzX2FuZF9TdWJzY3JpcHRzIikgPT0gMAorICAgICAgICB8fCBzdHJjbXAobmFtZSwgIkxldHRlcmxpa2VfU3ltYm9scyIpID09IDAKKyAgICAgICAgfHwgc3RyY21wKG5hbWUsICJBbHBoYWJldGljX1ByZXNlbnRhdGlvbl9Gb3JtcyIpID09IDAKKyAgICAgICAgfHwgc3RyY21wKG5hbWUsICJIYWxmd2lkdGhfYW5kX0Z1bGx3aWR0aF9Gb3JtcyIpID09IDApIGNvbnRpbnVlOworCisgICAgICAgIGRlbHRhLmFwcGx5SW50UHJvcGVydHlWYWx1ZShwcm9wLCBpLCBzdGF0dXMpLnJlbW92ZUFsbChVTkFTU0lHTkVEKTsKKyAgICAgICAgaWYgKCFyZXAuY29udGFpbnNTb21lKGRlbHRhKSkgY29udGludWU7CisgICAgICAgIGlmIChyZXAuY29udGFpbnNBbGwoZGVsdGEpKSBjb250aW51ZTsgLy8ganVzdCB0byBzZWUgd2hhdCB3ZSBhcmUgYWRkaW5nCisgICAgICAgIGRlYnVnLT5sb2coIkFkZGluZyAiKTsKKyAgICAgICAgZGVidWctPmxvZyhwcm9wZXJ0eUFuZFZhbHVlTmFtZShwcm9wLCBpKSwgVFJVRSk7ICAgICAgICAgICAgICAgIAorICAgICAgICB0YWlsb3JpbmdCdW5kbGUtPmxvZygiLy8gIik7CisgICAgICAgIHRhaWxvcmluZ0J1bmRsZS0+bG9nKHByb3BlcnR5QW5kVmFsdWVOYW1lKHByb3AsIGkpLCBUUlVFKTsKKyAgICAgICAgaWYob3B0aW9uc1tSRUZFUkVOQ0VdLmRvZXNPY2N1cikgeworICAgICAgICAgIHJlZmVyZW5jZUJ1bmRsZS0+bG9nKCIvLyAiKTsKKyAgICAgICAgICByZWZlcmVuY2VCdW5kbGUtPmxvZyhwcm9wZXJ0eUFuZFZhbHVlTmFtZShwcm9wLCBpKSwgVFJVRSk7CisgICAgICAgIH0KKyAgICAgICAgcmVwLmFkZEFsbChkZWx0YSk7CisgICAgfQorICAgIAorICAgIC8vIGFkZCBBU0NJSSBhbmQgZ2VuZXJhbCBhY2NlbnRzCisgICAgcmVwLmFkZEFsbChHRU5FUkFMX0FDQ0VOVFMpLmFkZEFsbChBU0NJSV9CQVNFKTsKKyAgICByZXAucmVtb3ZlQWxsKENPTlRST0wpOworICAgIC8vZGVsdGEuYXBwbHlJbnRQcm9wZXJ0eVZhbHVlKFVDSEFSX1NDUklQVCwgVVNDUklQVF9IQU4sIHN0YXR1cyk7CisgICAgLy9yZXAucmVtb3ZlQWxsKGRlbHRhKTsKKworICAgIC8vIG5vdyBhZGQgdGhlIGV4ZW1wbGFyIGNoYXJhY3RlcnMKKyAgICAvLyBjYW4ndCBnZXQgYXQgdGhlbSBmcm9tIEphdmEgcmlnaHQgbm93CisgICAgdGFpbG9yaW5nQnVuZGxlLT5sb2coIjxicj5cbiIpOworICAgIGlmKG9wdGlvbnNbUkVGRVJFTkNFXS5kb2VzT2NjdXIpIHsKKyAgICAgIHJlZmVyZW5jZUJ1bmRsZS0+bG9nKCI8YnI+XG4iKTsKKyAgICB9Cit9CisKK1VuaWNvZGVTZXQgZmxhdHRlbihjb25zdCBVbmljb2RlU2V0ICZzb3VyY2UsIFVFcnJvckNvZGUgJnN0YXR1cykgeworICAgIFVuaWNvZGVTZXQgcmVzdWx0OworICAgIFVuaWNvZGVTZXRJdGVyYXRvciBpdChzb3VyY2UpOworICAgIFVuaWNvZGVTdHJpbmcgaXRlbSwgaXRlbU5GS0QsIHRvTm9ybWFsaXplOworICAgIHdoaWxlIChpdC5uZXh0KCkpIHsKKyAgICAgICAgLy8gd291bGQgYmUgbmljZXIgaWYgVW5pY29kZVNldEl0ZXJhdG9yIGhhZCBhIGdldFN0cmluZyBmdW5jdGlvbgorICAgICAgICBpZiAoaXQuaXNTdHJpbmcoKSkgeworICAgICAgICAgIE5vcm1hbGl6ZXI6Om5vcm1hbGl6ZShpdC5nZXRTdHJpbmcoKSwgVU5PUk1fTkZELCAwLCBpdGVtLCBzdGF0dXMpOworICAgICAgICAgIE5vcm1hbGl6ZXI6Om5vcm1hbGl6ZShpdC5nZXRTdHJpbmcoKSwgVU5PUk1fTkZLRCwgMCwgaXRlbU5GS0QsIHN0YXR1cyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdG9Ob3JtYWxpemUuc2V0VG8oaXQuZ2V0Q29kZXBvaW50KCkpOworICAgICAgICAgIE5vcm1hbGl6ZXI6Om5vcm1hbGl6ZSh0b05vcm1hbGl6ZSwgVU5PUk1fTkZELCAwLCBpdGVtLCBzdGF0dXMpOworICAgICAgICAgIE5vcm1hbGl6ZXI6Om5vcm1hbGl6ZSh0b05vcm1hbGl6ZSwgVU5PUk1fTkZLRCwgMCwgaXRlbU5GS0QsIHN0YXR1cyk7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0LmFkZEFsbChpdGVtKTsKKyAgICAgICAgcmVzdWx0LmFkZEFsbChpdGVtTkZLRCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKwordm9pZCB0ZXN0V2luKFN0cmVuZ3RoUHJvYmUgJnByb2JlLCBVRXJyb3JDb2RlICZzdGF0dXMpIAoreworICBVbmljb2RlU2V0IHRyYWlsaW5ncyhVbmljb2RlU3RyaW5nKCJbXFx1RkU3RFxcdUZFN0NcXHUzMEZEXFx1RkY3MFxcdTMwRkNcXHUzMDlEXFx1MzAzMlxcdTMwMzFcXHUzMDA1XFx1MDY1MV0iKSwgc3RhdHVzKTsKKyAgY2hhciBpbnRDaGFyW10gPSAiXFx1RkU3RFxcdUZFN0NcXHUzMEZEXFx1RkY3MFxcdTMwRkNcXHUzMDlEXFx1MzAzMlxcdTMwMzFcXHUzMDA1XFx1MDY1MSI7CisgIFVDaGFyIGludGVyZXN0aW5nWzI1Nl07CisgIGludDMyX3QgaW50TGVuID0gdV91bmVzY2FwZShpbnRDaGFyLCBpbnRlcmVzdGluZywgMjU2KTsKKyAgVUNoYXIgaSA9IDA7CisgIFVDaGFyIGogPSAwLCAgayA9IDA7CisgIGludDMyX3QgY291bnQ7CisgIExpbmUgbXlDaCwgY29tYm8sIHRyaWFsLCBpbnRlciwga0xpbmU7CisgIGZvcihpID0gMDsgaSA8IGludExlbjsgaSsrKSB7CisgICAgaW50ZXIuc2V0VG8oaW50ZXJlc3RpbmdbaV0pOworICAgIGxvZ2dlci0+bG9nKGludGVyLnRvU3RyaW5nKFRSVUUpLCBUUlVFKTsKKyAgICBsb2dnZXItPmxvZygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisgICAgZm9yKGogPSAwOyBqIDwgMHhGRkZGOyBqKyspIHsKKyAgICAgIG15Q2guc2V0VG8oaik7CisgICAgICBpZihwcm9iZS5kaXN0YW5jZUZyb21FbXB0eVN0cmluZyhteUNoKSA9PSBVQ09MX0lERU5USUNBTCkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGxvZ2dlci0+bG9nKG15Q2gudG9TdHJpbmcoVFJVRSkpOworICAgICAgY29tYm8uc2V0VG8oaik7CisgICAgICBjb21iby5hcHBlbmQoaW50ZXJlc3RpbmdbaV0pOworICAgICAgY291bnQgPSAwOworICAgICAgZm9yKGsgPSAwOyBrIDwgMHhGRkZGOyBrKyspIHsKKyAgICAgICAga0xpbmUuc2V0VG8oayk7CisgICAgICAgIHRyaWFsLnNldFRvKGopOworICAgICAgICB0cmlhbC5hcHBlbmQoayk7CisgICAgICAgIGlmKHByb2JlLmNvbXBhcmUoa0xpbmUsIGludGVyKSA8IDApIHsKKyAgICAgICAgICBpZihwcm9iZS5jb21wYXJlKHRyaWFsLCBjb21ibykgPj0gMCkgeworICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGxvZ2dlci0+bG9nKCIlaSAlaVxuIiwgY291bnQsIGNvdW50KTsKKyAgICB9CisgIH0KK30KKwpkaWZmIC0tZ2l0IGEvY29scHJvYmUvY3JlYXRlQ29tcGFyaXNvblRhYmxlcy5wbCBiL2NvbHByb2JlL2NyZWF0ZUNvbXBhcmlzb25UYWJsZXMucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMThmNmExNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbHByb2JlL2NyZWF0ZUNvbXBhcmlzb25UYWJsZXMucGwKQEAgLTAsMCArMSwxNjQgQEAKKyMhIC91c3IvYmluL3BlcmwgLXcKKwordXNlIHN0cmljdDsKKworCitteSAkbG9jYWxlID0gJEFSR1ZbMF07CisKKworbXkgJGxvbmdfbmFtZSA9IGAvaG9tZS93ZWl2L3NyYy9pY3Uvc291cmNlL2V4dHJhL2NvbHByb2JlL2xvbmduYW1lICRsb2NhbGVgOworbXkgJHBhZ2VUaXRsZSA9ICRsb2NhbGUuIl9jb2xsYXRpb24iOworbXkgJGZpbGVuYW1lID0gJHBhZ2VUaXRsZS4iLmh0bWwiOworCitvcGVuIFRBQkxFLCAiPiRmaWxlbmFtZSI7CisKKworcHJpbnQgVEFCTEUgPDwiRW5kT2ZUZW1wbGF0ZSI7Cis8aHRtbD4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+Cis8dGl0bGU+JHBhZ2VUaXRsZTwvdGl0bGU+Cis8c3R5bGU+CisgICAgICAgICA8IS0tCisgICAgICAgICB0YWJsZSAgICAgICAgeyBib3JkZXItc3BhY2luZzogMDsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgd2lkdGg6IDEwMCU7IAorICAgICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgYmxhY2sgfQordGQsIHRoICAgICAgIHsgd2lkdGg6IDEwJTsgYm9yZGVyLXNwYWNpbmc6IDA7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IGNvbG9yOiBibGFjazsgCisgICAgICAgICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOyBib3JkZXI6IDFweCBzb2xpZCBibGFjayB9CistLT4KKyAgICAgPC9zdHlsZT4KKzwvaGVhZD4KKworPGJvZHkgYmdjb2xvcj0iI0ZGRkZGRiI+CisKKzxwPjxiPjxmb250IGNvbG9yPSIjRkYwMDAwIj5Db2xsYXRpb246PC9mb250PiAkbG9jYWxlICgkbG9uZ19uYW1lKSA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vY2dpLWJpbi9pY3UvbHgvZW4vP189JGxvY2FsZSI+RGVtbzwvYT4sIAorCis8YSBocmVmPSIuLi9hbGxfZGlmZl94bWwvY29tcGFyaXNvbl9jaGFydHMuaHRtbCI+Q292ZXIgCitQYWdlPC9hPiwgPGEgaHJlZj0iLi4vYWxsX2RpZmZfeG1sL2luZGV4Lmh0bWwiPkluZGV4PC9hPjwvYj48L3A+Cis8dGFibGU+CisgIDx0cj4KK0VuZE9mVGVtcGxhdGUKKworbXkgJGRpckNvbW1vbiA9ICJjb21tb24iOworbXkgJHJlZkNvbW1vbiA9ICRkaXJDb21tb24uIi9VQ0FSdWxlcy50eHQiOworbXkgJG5hbWVDb21tb24gPSAkZGlyQ29tbW9uLiIvIi4kbG9jYWxlLiJfY29sbGF0aW9uLmh0bWwiOworbXkgJGNvbG9yQ29tbW9uID0gIiNBRDk4OUQiOworCitteSAkbG9jOworCitpZighKC1lICRuYW1lQ29tbW9uKSkgeworICAkbG9jYWxlID1+IC9fLzsKKyAgJGxvYyA9ICRgOworICAkbmFtZUNvbW1vbiA9ICIkZGlyQ29tbW9uLyRsb2MiLiJfY29sbGF0aW9uLmh0bWwiOworfQorcHJpbnQgVEFCTEUgIiAgICA8dGggYmdjb2xvcj1cIiRjb2xvckNvbW1vblwiPkNPTU1PTiAoPGEgaHJlZj1cIiRyZWZDb21tb25cIj5VQ0E8L2E+IDxhIGhyZWY9XCIuLi8kZGlyQ29tbW9uL3htbC8kbG9jYWxlLnhtbFwiPnhtbDwvYT4pPC90aD5cbiI7CisKK215ICRkaXJMaW51eCA9ICJsaW51eCI7CitteSAkcmVmTGludXggPSAkZGlyTGludXguIi8iLiRsb2NhbGUuIi51dGY4X2RlZmF1bHRfcmF3Lmh0bWwiOworbXkgJHJhd0xpbnV4ID0gJGRpckxpbnV4LiIvIi4kbG9jYWxlLiIudXRmOF9yYXcuaHRtbCI7CitteSAkZGVmTGludXggPSAkZGlyTGludXguIi8iLiRsb2NhbGU7CitteSAkbmFtZUxpbnV4ID0gIiRkaXJMaW51eC8kbG9jYWxlIi4iLnV0ZjhfY29sbGF0aW9uLmh0bWwiOworbXkgJGNvbG9yTGludXggPSAiIzExOTFGMSI7CisKK3ByaW50IFRBQkxFICIgICAgPHRoIGJnY29sb3I9XCIkY29sb3JMaW51eFwiPkxJTlVYICgiOworaWYgKCEoLWUgJG5hbWVMaW51eCkpIHsKKyN0cnkgdGhlIHZhcmlhbnQgdGhhdCBoYXMgQGV1cm8gc3R1Y2sgaW4KKyAgJG5hbWVMaW51eCA9ICIkZGlyTGludXgvJGxvY2FsZSIuJy51dGY4QGV1cm9fY29sbGF0aW9uLmh0bWwnOworICBpZigtZSAkbmFtZUxpbnV4KSB7CisgICAgJHJlZkxpbnV4ID0gJGRpckxpbnV4LiIvIi4kbG9jYWxlLicudXRmOEBldXJvX2RlZmF1bHRfcmF3Lmh0bWwnOworICAgICRyYXdMaW51eCA9ICRkaXJMaW51eC4iLyIuJGxvY2FsZS4nLnV0ZjhAZXVyb19yYXcuaHRtbCc7CisgIH0KK30KK2lmICgtZSAkbmFtZUxpbnV4KSB7CisgICAgcHJpbnQgVEFCTEUgIjxhIGhyZWY9XCIkcmF3TGludXhcIj5PcmRlcmluZzwvYT4gPGEgaHJlZj1cIiRkZWZMaW51eFwiPkRlZmluaXRpb248L2E+IDxhIGhyZWY9XCIkcmVmTGludXhcIj5iYXNlPC9hPiI7Cit9IAorCitwcmludCBUQUJMRSAiIDxhIGhyZWY9XCIuLi8kZGlyTGludXgveG1sLyRsb2NhbGUueG1sXCI+eG1sPC9hPik8L3RoPlxuIjsKKworbXkgJGRpcldpbiA9ICJ3aW54cCI7CitteSAkcmVmV2luID0gJGRpcldpbi4iLyIuJGxvY2FsZS4iX2RlZmF1bHRfcmF3Lmh0bWwiOworbXkgJHJhd1dpbiA9ICRkaXJXaW4uIi8iLiRsb2NhbGUuIl9yYXcuaHRtbCI7CitteSAkbmFtZVdpbiA9ICIkZGlyV2luLyRsb2NhbGUiLiJfY29sbGF0aW9uLmh0bWwiOworbXkgJGNvbG9yV2luID0gIiM5OEZCOTgiOworCitwcmludCBUQUJMRSAiICAgIDx0aCBiZ2NvbG9yPVwiJGNvbG9yV2luXCI+V0lORE9XUyAoIjsgCitpZiAoLWUgJG5hbWVXaW4pIHsKKyAgIHByaW50IFRBQkxFICI8YSBocmVmPVwiJHJhd1dpblwiPk9yZGVyaW5nPC9hPiA8YSBocmVmPVwiJHJlZldpblwiPmJhc2U8L2E+ICI7Cit9IAorcHJpbnQgVEFCTEUgIjxhIGhyZWY9XCIuLi93aW5kb3dzL3htbC8kbG9jYWxlLnhtbFwiPnhtbDwvYT4pPC90aD5cbiI7CisKK3ByaW50IFRBQkxFICIgIDwvdHI+XG4gIDx0cj4iOworCisKK3JlYWRSdWxlcygkbmFtZUNvbW1vbiwgIiNBRDk4OUQiLCAiU2FtZSBhcyB0aGUgVUNBLiIpOworcmVhZFJ1bGVzKCRuYW1lTGludXgsICIjMTE5MUYxIiwgIk5vIGRhdGEgYXZhaWxhYmxlLiIpOyAgICAgIAorcmVhZFJ1bGVzKCRuYW1lV2luLCAiIzk4RkI5OCIsICJObyBkYXRhIGF2YWlsYWJsZS4iKTsKKworCitwcmludCBUQUJMRSA8PCJFbmRPZkZvb3RlciI7CisgIDwvdHI+Cis8L3RhYmxlPgorCis8L2JvZHk+Cis8L2h0bWw+CitFbmRPZkZvb3RlcgorCisKK3N1YiByZWFkUnVsZXMgeworICAjIHJlYWRSdWxlcygkZmlsZSwgJGNvbG9yKQorICBteSAkZmlsZW5hbWUgID0gc2hpZnQ7CisgIG15ICRjb2xvciA9IHNoaWZ0OworICBteSAkY29tbWVudCA9IHNoaWZ0OworICBteSAkbm9MaW5lcyA9IDA7CisgIG15ICRwcmludE91dCA9IDA7CisKKyAgbXkgJGZpbGU7CisKKyAgaWYoLWUgJGZpbGVuYW1lKSB7CisgICAgb3BlbigkZmlsZSwgIjwkZmlsZW5hbWUiKSB8fCBkaWUgInNvbWV0aGluZyB2ZXJ5IHN0cmFuZ2UgaGFwcGVuZWRcbiI7CisgICAgcHJpbnQgVEFCTEUgIjx0ZCBiZ2NvbG9yPVwiJGNvbG9yXCI+XG4iOworICAgIHdoaWxlICg8JGZpbGU+KSB7CisgICAgICBpZiAoL1x9XDxiclw+JC8pIHsKKyAgICAgICAgJHByaW50T3V0ID0gMDsKKworICAgICAgfQorICAgICAgaWYgKCRwcmludE91dCkgeworICAgICAgICBwcmludCBUQUJMRSAkXzsKKyAgICAgICAgJG5vTGluZXMrKzsKKyAgICAgIH0KKyAgICAgIGlmICgvU2VxdWVuY2UvKSB7CisgICAgICAgICRwcmludE91dCA9IDE7CisgICAgICAgIHByaW50ICJmb3VuZCBzZXF1ZW5jZVxuIjsKKyAgICAgICAgJG5vTGluZXMgPSAwOworICAgICAgfQorCisgICAgfQorICAgIGlmICghJG5vTGluZXMpIHsKKyAgICAgIHByaW50IFRBQkxFICJTYW1lIG9yZGVyaW5nIGFzIGJhc2VcbiI7CisgICAgfQorICAgIHByaW50IFRBQkxFICI8L3RkPlxuIjsKKyAgfSBlbHNlIHsKKyAgICBwcmludCBUQUJMRSAiPHRkIGJnY29sb3I9XCIkY29sb3JcIj5cbiRjb21tZW50PC90ZD5cbiI7CisgIH0gICAgCit9CisKKworIyBUYXN0aW5nIG9mIGZvb2QgcHJvZHVjdAorIyA2NTAtNTc0LTQ1NTEgJDUwIDEgaG91cgorCisKKyMgICAgIDx0ZCBiZ2NvbG9yPSIjQUQ5ODlEIj4xLjAtYWxwaGE8L3RkPgorIyAgICAgPHRkIGJnY29sb3I9IiNGRjY2MzMiPjEuMDwvdGQ+CisjICAgICA8dGQgYmdjb2xvcj0iI0ZGNjYzMyI+PTwvdGQ+CisjICAgICA8dGQgYmdjb2xvcj0iI0ZGNjYzMyI+PHNwYW4gdGl0bGU9IjAwNkUge0xBVElOIFNNQUxMIExFVFRFUiBOfSI+JmFtcDtuPC9zcGFuPjxicj4KKyMgICAgICAgPHNwYW4gdGl0bGU9IjAwNkUgMDA3OSB7TEFUSU4gU01BTEwgTEVUVEVSIE59IHtMQVRJTiBTTUFMTCBMRVRURVIgWX0iPiZuYnNwOyZuYnNwOyZsdDsmbmJzcDtueTwvc3Bhbj48YnI+CisKKyMgICAgICAgPHNwYW4gdGl0bGU9IjAwNkUgMDA2RSAwMDc5IHtMQVRJTiBTTUFMTCBMRVRURVIgTn0ge0xBVElOIFNNQUxMIExFVFRFUiBOfSB7TEFUSU4gU01BTEwgTEVUVEVSIFl9IC8gMDA2RSAwMDc5IHtMQVRJTiBTTUFMTCBMRVRURVIgTn0ge0xBVElOIFNNQUxMIExFVFRFUiBZfSI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PSZuYnNwO25ueSZuYnNwOy8mbmJzcDtueTwvc3Bhbj48YnI+CisjICAgICAgIDxzcGFuIHRpdGxlPSIwMDZFIDAwNTkge0xBVElOIFNNQUxMIExFVFRFUiBOfSB7TEFUSU4gQ0FQSVRBTCBMRVRURVIgWX0iPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZsdDsmbHQ7Jmx0OyZuYnNwO25ZPC9zcGFuPjxicj4KKyMgICAgIDwvdGQ+CisjICAgICA8dGQgYmdjb2xvcj0iI0ZGNjYzMyI+PTwvdGQ+CisjICAgICA8dGQgYmdjb2xvcj0iI0ZGRkYzMyI+MS4yPC90ZD4KKworIyAgICAgPHRkIGJnY29sb3I9IiM5OEZCOTgiPldpbmRvd3MgWFA8L3RkPgorIyAgICAgPHRkIGJnY29sb3I9IiNGRjY2MzMiPj08L3RkPgorIyAgICAgPHRkIGJnY29sb3I9IiNGRjY2MzMiPj08L3RkPgpkaWZmIC0tZ2l0IGEvY29scHJvYmUvZG9Db21wYXJpc29uVGFibGUucGwgYi9jb2xwcm9iZS9kb0NvbXBhcmlzb25UYWJsZS5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43YTAyZWYzNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbHByb2JlL2RvQ29tcGFyaXNvblRhYmxlLnBsCkBAIC0wLDAgKzEsMjA5IEBACisjISAvdXNyL2Jpbi9wZXJsIC13CisKK3VzZSBzdHJpY3Q7Cit1c2UgSU86OkZpbGU7CisKKworbXkgJGxvY2FsZSA9ICRBUkdWWzBdOworCisKK215ICRsb25nX25hbWUgPSBgL2hvbWUvd2Vpdi9zcmMvaWN1L3NvdXJjZS9leHRyYS9jb2xwcm9iZS9sb25nbmFtZSAkbG9jYWxlYDsKK3ByaW50ICJMb25nIG5hbWUgaXMgJGxvbmdfbmFtZVxuIjsKK215ICRwYWdlVGl0bGUgPSAkbG9jYWxlLiIgY29sbGF0aW9uIjsKK215ICRmaWxlbmFtZSA9ICRsb2NhbGUuIi5odG1sIjsKKworb3BlbiBUQUJMRSwgIj4kZmlsZW5hbWUiOworCisKK3ByaW50IFRBQkxFIDw8IkVuZE9mVGVtcGxhdGUiOworPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgorPHRpdGxlPiRwYWdlVGl0bGU8L3RpdGxlPgorPHN0eWxlPgorICAgICAgICAgPCEtLQorICAgICAgICAgdGFibGUgICAgICAgIHsgYm9yZGVyLXNwYWNpbmc6IDA7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IHdpZHRoOiAxMDAlOyAKKyAgICAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrIH0KK3RkLCB0aCAgICAgICB7IHdpZHRoOiAxMCU7IGJvcmRlci1zcGFjaW5nOiAwOyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyBjb2xvcjogYmxhY2s7IAorICAgICAgICAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsgYm9yZGVyOiAxcHggc29saWQgYmxhY2sgfQorLS0+CisgICAgIDwvc3R5bGU+Cis8L2hlYWQ+CisKKzxib2R5IGJnY29sb3I9IiNGRkZGRkYiPgorCis8cD48Yj48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+Q29sbGF0aW9uOjwvZm9udD4gJGxvY2FsZSAoJGxvbmdfbmFtZSkgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2NnaS1iaW4vaWN1L2x4L2VuLz9fPSRsb2NhbGUiPkRlbW88L2E+LCAKKworPGEgaHJlZj0iLi4vLi4vY29tcGFyaXNvbl9jaGFydHMuaHRtbCI+Q292ZXIgCitQYWdlPC9hPiwgPGEgaHJlZj0iLi4vbWFpbi9pbmRleC5odG1sIj5Mb2NhbGUgRGlmZnMgSW5kZXg8L2E+LCA8YSBocmVmPSJpbmRleC5odG1sIj5Db2xsYXRpb24gRGlmZnMgSW5kZXg8L2E+PC9iPjwvcD4KKzx0YWJsZT4KKyAgPHRyPgorRW5kT2ZUZW1wbGF0ZQorCitteSAkZGlyQ29tbW9uID0gImljdWNvbGxhdGlvbnMiOworbXkgJHJlZkNvbW1vbiA9ICRkaXJDb21tb24uIi9VQ0FSdWxlcy50eHQiOworbXkgJG5hbWVDb21tb24gPSAkZGlyQ29tbW9uLiIvIi4kbG9jYWxlLiJfY29sbGF0aW9uLmh0bWwiOworbXkgJGNvbG9yQ29tbW9uID0gIiNBRDk4OUQiOworCitteSAkbG9jID0gJGxvY2FsZTsKKworaWYoISgtZSAkbmFtZUNvbW1vbikpIHsKKyAgJGxvY2FsZSA9fiAvXy87CisgICRsb2MgPSAkYDsKKyAgJG5hbWVDb21tb24gPSAiJGRpckNvbW1vbi8kbG9jIi4iX2NvbGxhdGlvbi5odG1sIjsKK30KKworcHJpbnQgIkNvbW1vbiBpcyAkbmFtZUNvbW1vblxuIjsKKworcHJpbnQgVEFCTEUgIiAgICA8dGggYmdjb2xvcj1cIiRjb2xvckNvbW1vblwiPkNPTU1PTiAoIjsKK2lmKC1lICRuYW1lQ29tbW9uKSB7CisgIHByaW50IFRBQkxFICI8YSBocmVmPVwiLi4vLi4vY29tbW9uL2NvbGxhdGlvbi8kbG9jLnhtbFwiPnhtbDwvYT4gIjsKK30KK3ByaW50IFRBQkxFICI8YSBocmVmPVwiLi4vLi4vY29tbW9uL2NvbGxhdGlvbi9yb290LnhtbFwiPlVDQTwvYT4pPC90aD5cbiI7CisKK215ICRkaXJMaW51eCA9ICJsaW51eGNvbGxhdGlvbnMiOworbXkgJHJlZkxpbnV4ID0gJGRpckxpbnV4LiIvIi4kbG9jYWxlLiIudXRmOF9kZWZhdWx0X3Jhdy5odG1sIjsKK215ICRyYXdMaW51eCA9ICRkaXJMaW51eC4iLyIuJGxvY2FsZS4iLnV0ZjhfcmF3Lmh0bWwiOworbXkgJGRlZkxpbnV4ID0gJGRpckxpbnV4LiIvIi4kbG9jYWxlOworbXkgJG5hbWVMaW51eCA9ICIkZGlyTGludXgvJGxvY2FsZSIuIl9jb2xsYXRpb24uaHRtbCI7CitteSAkY29sb3JMaW51eCA9ICIjMTE5MUYxIjsKKworcHJpbnQgVEFCTEUgIiAgICA8dGggYmdjb2xvcj1cIiRjb2xvckxpbnV4XCI+TElOVVgiOworaWYgKCEoLWUgJG5hbWVMaW51eCkpIHsKKyN0cnkgdGhlIHZhcmlhbnQgdGhhdCBoYXMgQGV1cm8gc3R1Y2sgaW4KKyAgJG5hbWVMaW51eCA9ICIkZGlyTGludXgvJGxvY2FsZSIuJy51dGY4QGV1cm9fY29sbGF0aW9uLmh0bWwnOworICBpZigtZSAkbmFtZUxpbnV4KSB7CisgICAgJHJlZkxpbnV4ID0gJGRpckxpbnV4LiIvIi4kbG9jYWxlLicudXRmOEBldXJvX2RlZmF1bHRfcmF3Lmh0bWwnOworICAgICRyYXdMaW51eCA9ICRkaXJMaW51eC4iLyIuJGxvY2FsZS4nLnV0ZjhAZXVyb19yYXcuaHRtbCc7CisgIH0KK30KK2lmICgtZSAkbmFtZUxpbnV4KSB7CisgIHByaW50IFRBQkxFICIgKDxhIGhyZWY9XCIuLi8uLi9saW51eC9jb2xsYXRpb24vJGxvY2FsZS54bWxcIj54bWw8L2E+IjsKKyAgbXkgJGxpbnV4QmFzZSA9ICZnZXRCYXNlTG9jYWxlKCIkZGlyTGludXgvYmFzZSIsICRsb2NhbGUpOworICBpZigkbGludXhCYXNlIG5lICIiKSB7CisgICAgcHJpbnQgVEFCTEUgIiA8YSBocmVmPVwiLi4vLi4vbGludXgvY29sbGF0aW9uLyRsaW51eEJhc2UueG1sXCI+QmFzZSAoJGxpbnV4QmFzZSk8L2E+IjsKKyAgfQorICBwcmludCBUQUJMRSAiKSI7Cit9IAorcHJpbnQgVEFCTEUgIjwvdGg+XG4iOworCisKK215ICRkaXJXaW4gPSAidzJrY29sbGF0aW9ucyI7CitteSAkcmVmV2luID0gJGRpcldpbi4iLyIuJGxvY2FsZS4iX2RlZmF1bHRfcmF3Lmh0bWwiOworbXkgJHJhd1dpbiA9ICRkaXJXaW4uIi8iLiRsb2NhbGUuIl9yYXcuaHRtbCI7CitteSAkbmFtZVdpbiA9ICIkZGlyV2luLyRsb2NhbGUiLiJfY29sbGF0aW9uLmh0bWwiOworbXkgJGNvbG9yV2luID0gIiM5OEZCOTgiOworJGxvYyA9ICRsb2NhbGU7CisjdHJ5IGZhbGxiYWNrIGZvciB3aW5kb3dzCitwcmludCBUQUJMRSAiICAgIDx0aCBiZ2NvbG9yPVwiJGNvbG9yV2luXCI+V0lORE9XUyI7IAoraWYoISgtZSAkbmFtZVdpbikpIHsKKyAgJGxvY2FsZSA9fiAvXy87CisgICRsb2MgPSAkYDsKKyAgJG5hbWVXaW4gPSAiJGRpcldpbi8kbG9jIi4iX2NvbGxhdGlvbi5odG1sIjsKK30KKworcHJpbnQgIldpbmRvd3MgbG9jIGlzICRsb2NcbiI7CisKK2lmICgtZSAkbmFtZVdpbikgeworICBwcmludCBUQUJMRSAiICg8YSBocmVmPVwiLi4vLi4vd2luZG93cy9jb2xsYXRpb24vJGxvYy54bWxcIj54bWw8L2E+IjsKKyAgbXkgJHdpbkJhc2UgPSAmZ2V0QmFzZUxvY2FsZSgiJGRpcldpbi9iYXNlIiwgJGxvY2FsZSk7CisgIGlmKCR3aW5CYXNlIG5lICIiKSB7CisgICAgcHJpbnQgVEFCTEUgIjxhIGhyZWY9XCIuLi8uLi93aW5kb3dzL2NvbGxhdGlvbi8kd2luQmFzZS54bWxcIj5iYXNlICgkd2luQmFzZSk8L2E+IjsKKyAgfQorICBwcmludCBUQUJMRSAiKSI7Cit9IAorcHJpbnQgVEFCTEUgIjwvdGg+XG4iOworcHJpbnQgVEFCTEUgIiAgPC90cj5cbiAgPHRyPiI7CisKKworcmVhZFJ1bGVzKCRuYW1lQ29tbW9uLCAiI0FEOTg5RCIsICJTYW1lIGFzIHRoZSBVQ0EuIik7CityZWFkUnVsZXMoJG5hbWVMaW51eCwgIiMxMTkxRjEiLCAiTm8gZGF0YSBhdmFpbGFibGUuIik7ICAgICAgCityZWFkUnVsZXMoJG5hbWVXaW4sICIjOThGQjk4IiwgIk5vIGRhdGEgYXZhaWxhYmxlLiIpOworCisKK3ByaW50IFRBQkxFIDw8IkVuZE9mRm9vdGVyIjsKKyAgPC90cj4KKzwvdGFibGU+CisKKzwvYm9keT4KKzwvaHRtbD4KK0VuZE9mRm9vdGVyCisKKworc3ViIHJlYWRSdWxlcyB7CisgICMgcmVhZFJ1bGVzKCRmaWxlLCAkY29sb3IpCisgIG15ICRmaWxlbmFtZSAgPSBzaGlmdDsKKyAgbXkgJGNvbG9yID0gc2hpZnQ7CisgIG15ICRjb21tZW50ID0gc2hpZnQ7CisgIG15ICRub0xpbmVzID0gMDsKKyAgbXkgJHByaW50T3V0ID0gMDsKKworICBteSAkZmlsZTsKKworICBpZigtZSAkZmlsZW5hbWUpIHsKKyAgICBvcGVuKCRmaWxlLCAiPCRmaWxlbmFtZSIpIHx8IGRpZSAic29tZXRoaW5nIHZlcnkgc3RyYW5nZSBoYXBwZW5lZFxuIjsKKyAgICBwcmludCBUQUJMRSAiPHRkIGJnY29sb3I9XCIkY29sb3JcIj5cbiI7CisgICAgd2hpbGUgKDwkZmlsZT4pIHsKKyAgICAgIGlmICgvXH1cPGJyXD4kLykgeworICAgICAgICAkcHJpbnRPdXQgPSAwOworCisgICAgICB9CisgICAgICBpZiAoJHByaW50T3V0KSB7CisgICAgICAgIGlmKCEvXiQvICYmICEvJm5ic3A7PGJyPiQvKSB7CisgICAgICAgICAgcHJpbnQgVEFCTEUgJF87CisgICAgICAgICAgJG5vTGluZXMrKzsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKC9TZXF1ZW5jZS8pIHsKKyAgICAgICAgJHByaW50T3V0ID0gMTsKKyAgICAgICAgcHJpbnQgImZvdW5kIHNlcXVlbmNlXG4iOworICAgICAgICAkbm9MaW5lcyA9IDA7CisgICAgICB9CisKKyAgICB9CisgICAgaWYgKCEkbm9MaW5lcykgeworICAgICAgcHJpbnQgVEFCTEUgIlNhbWUgb3JkZXJpbmcgYXMgYmFzZVxuIjsKKyAgICB9CisgICAgcHJpbnQgVEFCTEUgIjwvdGQ+XG4iOworICB9IGVsc2UgeworICAgIHByaW50IFRBQkxFICI8dGQgYmdjb2xvcj1cIiRjb2xvclwiPlxuJGNvbW1lbnQ8L3RkPlxuIjsKKyAgfSAgICAKK30KKworc3ViIGdldEJhc2VMb2NhbGUoKXsKKyAgICBteSAkYmFzZWZpbGUgPSBzaGlmdDsKKyAgICBteSAkbG9jYWxlID0gc2hpZnQ7CisgICAgbXkgJGJhc2VGSCA9IElPOjpGaWxlLT5uZXcoJGJhc2VmaWxlLCJyIikKKyAgICAgICAgICAgIG9yIGRpZSAgImNvdWxkIG5vdCBvcGVuIHRoZSBmaWxlICRiYXNlZmlsZSBmb3IgcmVhZGluZzogJCEgXG4iOworICAgIG15ICRic2U7CisgICAgbXkgJGxvYzsKKyAgICB3aGlsZShkZWZpbmVkICggbXkgJGxpbmUgPSA8JGJhc2VGSD4pKXsKKyAgICAgICAgaWYoICRsaW5lID1+IC9cPCRsb2NhbGVcPi8peworICAgICAgICAgICAgKCRsb2MsJGJzZSkgPSBzcGxpdCAoL1w+LywgJGxpbmUpOworICAgICAgICAgICAgICRic2UgPX4gcy9eXHMrXDwvLzsKKyAgICAgICAgICAgICByZXR1cm4gJGJzZTsKKyAgICAgICAgfQorICAgIH0KK30KKworCisjIFRhc3Rpbmcgb2YgZm9vZCBwcm9kdWN0CisjIDY1MC01NzQtNDU1MSAkNTAgMSBob3VyCisKKworIyAgICAgPHRkIGJnY29sb3I9IiNBRDk4OUQiPjEuMC1hbHBoYTwvdGQ+CisjICAgICA8dGQgYmdjb2xvcj0iI0ZGNjYzMyI+MS4wPC90ZD4KKyMgICAgIDx0ZCBiZ2NvbG9yPSIjRkY2NjMzIj49PC90ZD4KKyMgICAgIDx0ZCBiZ2NvbG9yPSIjRkY2NjMzIj48c3BhbiB0aXRsZT0iMDA2RSB7TEFUSU4gU01BTEwgTEVUVEVSIE59Ij4mYW1wO248L3NwYW4+PGJyPgorIyAgICAgICA8c3BhbiB0aXRsZT0iMDA2RSAwMDc5IHtMQVRJTiBTTUFMTCBMRVRURVIgTn0ge0xBVElOIFNNQUxMIExFVFRFUiBZfSI+Jm5ic3A7Jm5ic3A7Jmx0OyZuYnNwO255PC9zcGFuPjxicj4KKworIyAgICAgICA8c3BhbiB0aXRsZT0iMDA2RSAwMDZFIDAwNzkge0xBVElOIFNNQUxMIExFVFRFUiBOfSB7TEFUSU4gU01BTEwgTEVUVEVSIE59IHtMQVRJTiBTTUFMTCBMRVRURVIgWX0gLyAwMDZFIDAwNzkge0xBVElOIFNNQUxMIExFVFRFUiBOfSB7TEFUSU4gU01BTEwgTEVUVEVSIFl9Ij4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs9Jm5ic3A7bm55Jm5ic3A7LyZuYnNwO255PC9zcGFuPjxicj4KKyMgICAgICAgPHNwYW4gdGl0bGU9IjAwNkUgMDA1OSB7TEFUSU4gU01BTEwgTEVUVEVSIE59IHtMQVRJTiBDQVBJVEFMIExFVFRFUiBZfSI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0OyZsdDsmbHQ7Jm5ic3A7blk8L3NwYW4+PGJyPgorIyAgICAgPC90ZD4KKyMgICAgIDx0ZCBiZ2NvbG9yPSIjRkY2NjMzIj49PC90ZD4KKyMgICAgIDx0ZCBiZ2NvbG9yPSIjRkZGRjMzIj4xLjI8L3RkPgorCisjICAgICA8dGQgYmdjb2xvcj0iIzk4RkI5OCI+V2luZG93cyBYUDwvdGQ+CisjICAgICA8dGQgYmdjb2xvcj0iI0ZGNjYzMyI+PTwvdGQ+CisjICAgICA8dGQgYmdjb2xvcj0iI0ZGNjYzMyI+PTwvdGQ+CmRpZmYgLS1naXQgYS9jb2xwcm9iZS9leHRyYWN0Q29sbGF0aW9uRGF0YS5wbCBiL2NvbHByb2JlL2V4dHJhY3RDb2xsYXRpb25EYXRhLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY3MDc5YmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb2xwcm9iZS9leHRyYWN0Q29sbGF0aW9uRGF0YS5wbApAQCAtMCwwICsxLDI0NiBAQAorIyEvdXNyL2Jpbi9wZXJsCisKK3VzZSBzdHJpY3Q7Cit1c2UgVW5pY29kZTo6VUNEICdjaGFyaW5mbyc7Cit1c2UgVW5pY29kZTo6Tm9ybWFsaXplOwordXNlIHV0Zjg7Cit1c2Ugb3BlbiAnOnV0ZjgnOworCitteSAkcHJpbnRvdXQgPSAwOworbXkgJGJyYWNlcyA9IDA7CitteSAkY29sbHMgPSAwOworbXkgJGFsaWFzZWQgPSAwOworbXkgJG5ld05hbWUgPSAiIjsKK215ICRmaWxlbmFtZTsKK215ICRzdWZmaXg7CitteSAkbG9jYWxlOworCitORVdfRklMRToKK2ZvcmVhY2ggbXkgJGFyZyAoQEFSR1YpIHsKKyAgaWYoJG5ld05hbWUgPX4gL14kLykgeworICAgICRsb2NhbGUgPSAkYXJnOworICAgICRsb2NhbGUgPX4gcyNeLiovIyNnOworICAgICRsb2NhbGUgPX4gcy9cLnR4dC8vOworICB9IGVsc2UgeworICAgICRuZXdOYW1lID0gIiI7CisgIH0KKyAgbXkgJGNvbW1hbmQgPSAiL2hvbWUvd2Vpdi9idWlsZC9jdXJyZW50L2Jpbi91Y29udiAteCBoZXgtYW55L0phdmEgLWYgdXRmOCAtdCB1dGY4ICRhcmciOworICBwcmludCAkY29tbWFuZC4iXG4iOworICBteSBAYnVuZGxlID0gYCRjb21tYW5kYDsKKyAgZm9yZWFjaCAkXyAoQGJ1bmRsZSkgeworICN3aGlsZSg8PikgeworICAgI3ByaW50ICRBUkdWIGlmIGVvZjsKKyAgIGlmKC9eXC9cLy8pIHsKKyAgICAgbmV4dDsKKyAgIH0KKyAgIGlmKC9jb2xsYXRpb25zLykgeworICAgICBwcmludCAiZm91bmQgQ29sbGF0aW9uc1xuIjsKKyAgICAgJGNvbGxzID0gMTsKKyAgICAgaWYoL2FsaWFzLykgeworICAgICAgIHByaW50ICJjb2xsYXRpb25zIGFyZSBhbGlhc2VkXG4iOworICAgICAgICRhbGlhc2VkID0gMTsKKyAgICAgfQorICAgfQorICAgaWYoJGFsaWFzZWQpIHsKKyAgICAgcHJpbnQgInByb2Nlc3NpbmcgYWxpYXNlZCBkYXRhOiAkX1xuIjsKKyAgICAgaWYoL1x7LykgeworICAgICAgIHByaW50ICJCcmFjZXMgb3BlbmVkXG4iOworICAgICAgICRicmFjZXMgPSAxOworICAgICB9CisgICAgIGlmKCRicmFjZXMgJiYgL1wiKC4qKVwiLykgeworICAgICAgICRuZXdOYW1lID0gJDE7CisgICAgICAgcHJpbnQgIkFsaWFzaW5nIHRvICRuZXdOYW1lXG4iOworICAgICB9CisgICAgIGlmKCRicmFjZXMgJiYgL1x9LykgeworICAgICAgICRicmFjZXMgPSAwOworICAgICAgIHByaW50ICJCcmFjZXMgY2xvc2VkXG4iOworICAgICAgICRhbGlhc2VkID0gMDsKKyAgICAgICBwcmludCAiU3dpdGNoaW5nIGZyb20gJGZpbGVuYW1lIHRvICRuZXdOYW1lXG4iOworICAgICAgICRhcmcgPX4gcy8kbG9jYWxlXC50eHQkLyRuZXdOYW1lXC50eHQvOworICAgICAgIHByaW50ICIkYXJnXG4iOworICAgICAgIHJlZG8gTkVXX0ZJTEU7CisgICAgIH0KKworICAgfQorICAgaWYoL3N0YW5kYXJkfHBob25lYm9va3x0cmFkaXRpb25hbHxwaW55aW58c3Ryb2tlfGRpcmVjdC8gJiYgJGNvbGxzKSB7CisgICAgIHByaW50ICJmb3VuZCAkJiBjb2xsYXRpb25cbiI7CisgICAgICRzdWZmaXggPSAiXyIudWMoJCYpOworICAgICBpZigvc3RhbmRhcmQvKSB7CisgICAgICAgJHN1ZmZpeCA9ICIiOworICAgICB9CisgICB9CisgICBpZigvU2VxdWVuY2UvICYmICRjb2xscykgeworICAgICAjYmlubW9kZSBBUkdWLCAiOnV0ZjgiOworICAgICAkcHJpbnRvdXQgPSAxOworICAgICAjJGZpbGVuYW1lID0gJEFSR1Y7CisgICAgICRmaWxlbmFtZSA9ICRsb2NhbGU7CisgICAgIGlmKCRzdWZmaXgpIHsKKyAgICAgICAkZmlsZW5hbWUgLj0gIl8iLiRzdWZmaXg7CisgICAgIH0KKyAgICAgJGZpbGVuYW1lIC49ICJfY29sbGF0aW9uLmh0bWwiOworICAgICBwcmludCAiZmlsZW5hbWUgaXMgJGZpbGVuYW1lXG4iOworICAgICAjb3BlbihPVVQsICI+OnV0ZjgiLCAiJGZpbGVuYW1lIik7CisgICAgIG9wZW4oT1VULCAiPiRmaWxlbmFtZSIpOworICAgICBwcmludEhlYWRpbmcoJGFyZyk7CisgICAgICNuZXh0OworICAgfQorICAgbXkgJGxpbmUgPSAkXzsKKyAgIGlmKCRsaW5lID1+IC9cey8gJiYgJHByaW50b3V0KSB7CisgICAgICRicmFjZXMrKzsKKyAgIH0KKyAgIGlmKCRwcmludG91dCkgeworICAgICBwcmludCBPVVQgcHJvY2Vzc0xpbmUoJGxpbmUpOworICAgICBwcmludCBPVVQgIlxuIjsKKyAgIH0KKyAgIGlmKCAkbGluZSA9fiAvXH0vICYmICRwcmludG91dCkgeworICAgICAkYnJhY2VzLS07CisgICAgIGlmKCRicmFjZXMgPT0gMCkgeworICAgICAgICRwcmludG91dCA9IDA7CisgICAgICAgcHJpbnRGb290aW5nKCk7CisgICAgICAgY2xvc2UoT1VUKTsKKyAgICAgfQorICAgfQorIH0gCit9CisKK3N1YiBwcm9jZXNzTGluZSB7CisgIG15ICRsaW5lID0gc2hpZnQ7CisgICRfID0gJGxpbmU7CisgIG15ICRpID0gMDsKKyAgbXkgJGogPSAwOworICBteSAkcmVzdWx0OworIyByZW1vdmUgY29tbWVudHMKKyAgcyMvLy4qJCMjZzsKKyMgcmVtb3ZlICJTZXF1ZW5jZSIgaWYgcHJlc2VudAorICBzL1NlcXVlbmNlXHMqLy87CisjIHJlbW92ZSBsZWFkaW5nIGJyYWNlIGlmIHByZXNlbnQKKyAgcy9eXHMqey8vOworIyByZW1vdmUgdHJhaWxpbmcgYnJhY2UgaWYgcHJlc2VudAorICBzL31ccyokLy87CisjIHJlbW92ZSB0cmFpbGluZyBxdW90ZQorICBzLyJccyokLy87CisjcmVtb3ZlIGxlYWQgcXVvdGUKKyAgcy9eXHMqIi8vOworI3NlcGFyYXRlIG9wdGlvbnMKKyAgcy8oXFsuKlxdKS9cblwxL2c7Cisjc2VwYXJhdGUgcmVzZXRzCisgIHMvXHMqXCZccyovXG5cJiAvZzsKKyNzZXBhcmF0ZSBzdHJlbmd0aHMgYW5kIGluc2VydCBzcGFjZXMKKyAgcy9ccyooPHsxLDR9KVxzKi9cblwxIC9nOworI3NlcGFyYXRlIGVxdWFscyBhbmQgaW5zZXJ0IHNwYWNlcworICBzL1xzKj1ccyovXG49IC9nOworCisjIGJyZWFrIGludG8gaW5kaXZpZHVhbCByZXNldC9zdHJlbmd0aC9zZXR0aW5nIGxpbmVzCisgIG15IEBsaW5lcyA9IHNwbGl0KC9cbi8pOworCisgIG15ICRsaW5lOworICBteSAkbmFtZTsKKyAgbXkgJHNwYW5FbmQgPSAiIjsKKyAgbXkgJHJlc3VsdCA9ICIiOworICBteSAkbmFtZXMgPSAiIjsKKyAgbXkgJGNvZGVzID0gIiI7CisgIG15ICRscm0gPSAiIjsKKworICBmb3JlYWNoICRsaW5lIChAbGluZXMpIHsKKyAgICAjIHNraXAgZW1wdHkgbGluZXMKKyAgICBpZigkbGluZSA9fiAvXiQvKSB7CisgICAgICBuZXh0OworICAgIH0KKyAgICAkc3BhbkVuZCA9ICIiOworICAgICRuYW1lID0gIiI7CisgICAgJGxybSA9ICIiOworICAgICRsaW5lID0gTkZDKCRsaW5lKTsKKyAgICAjIGZvciByZXNldHMgYW5kIHN0cmVuZ3RocyB3ZSB3aWxsIGdldCBuYW1lIGZvciBlbGVtZW50cworICAgIGlmKCRsaW5lID1+IC88ezEsNH0gfD0gfCYgXFsuKlxdfCYgLykgeworICAgICAgJG5hbWUgPSAiPHNwYW4gdGl0bGU9XCIiOworICAgICAgJG5hbWVzID0gIiI7CisgICAgICAkY29kZXMgPSAiIjsKKyAgICAgIG15ICRzdGFydCA9ICQmOworICAgICAgbXkgJHJlc3QgPSAkJzsKKyAgICAgIGZvciAoJGogPSAwOyAkaiA8IGxlbmd0aCgkcmVzdCk7ICRqKyspIHsKKwlteSAkY2hhciA9IHN1YnN0cigkcmVzdCwgJGosIDEpOworCW15ICRjaGFyVmFsID0gb3JkKCRjaGFyKTsKKwkjIHNvbWUgb2YgZWxlbWVudHMgYXJlIHBhcnQgb2YgdGhlIHN5bnRheCwgc28gdGhleSBhcmUKKwkjIGVudGVyZWQgd2l0aG91dCB0cmFuc2xhdGlvbiB0byB0aGUgbmFtZQorCWlmKCRjaGFyVmFsID09IDB4MDAyRiB8fCAkY2hhclZhbCA9PSAweDAwN0MpIHsKKwkgICRuYW1lIC49ICRjb2Rlcy4kbmFtZXMuIiAkY2hhciAiOworCSAgJGNvZGVzID0gIiI7CisJICAkbmFtZXMgPSAiIjsKKwl9IGVsc2lmKCRjaGFyVmFsID09IDB4MDAyNykgeyAjcXVvdGUgcmVxdWlyZXMgbW9yZSBwcm9jZXNzaW5nCisJICAjJG5hbWUgLj0gIiciOworCX0gZWxzZSB7CisJICBteSAkY2hhcmluZm8gPSBjaGFyaW5mbygkY2hhclZhbCk7CisJICAkY29kZXMgLj0gJGNoYXJpbmZvLT57J2NvZGUnfS4iICI7CisJICAkbmFtZXMgLj0gInsiLiRjaGFyaW5mby0+eyduYW1lJ30uIn0gIjsKKyAgICAgICAgICBpZigkY2hhcmluZm8tPnsnYmlkaSd9IGVxICJSIiB8fCAkY2hhcmluZm8tPnsnYmlkaSd9IGVxICJBTCIpIHsKKyAgICAgICAgICAgICRscm0gPSAiJmxybTsiOworICAgICAgICAgIH0KKwkgICMkbmFtZSAuPSAkY2hhcmluZm8tPnsnY29kZSd9LiIgeyIuJGNoYXJpbmZvLT57J25hbWUnfS4ifSAiOworCX0KKyAgICAgIH0KKyAgICAgICRuYW1lIC49ICRjb2Rlcy4kbmFtZXMuIlwiID4iOworICAgICAgJHNwYW5FbmQgPSAiPC9zcGFuPiI7CisgICAgfQorICAgICNwcmludCAkbmFtZS4iXG4iOworICAgIGlmKCRsaW5lID1+IC9ePDw8PC8pIHsKKyAgICAgICRsaW5lID0gIiAgICAkbGluZSI7CisgICAgfSBlbHNpZigkbGluZSA9fiAvXjw8PC8pIHsKKyAgICAgICRsaW5lID0gIiAgICRsaW5lIjsKKyAgICB9IGVsc2lmKCRsaW5lID1+IC9ePDwvKSB7CisgICAgICAkbGluZSA9ICIgICRsaW5lIjsKKyAgICB9IGVsc2lmKCRsaW5lID1+IC9ePC8pIHsKKyAgICAgICRsaW5lID0gIiAkbGluZSI7CisgICAgfSBlbHNpZigkbGluZSA9fiAvXj0vKSB7CisgICAgICAkbGluZSA9ICIgICAgJGxpbmUiOworICAgIH0KKyAgICAjIGluc2VydCBzcGFjZXMgYXJvdW5kIHZlcnRpY2FsIGJhcnMgKGZpeCBwcmVmaXhlcykKKworICAgICMgaW5zZXJ0IHNwYWNlcyBhcm91bmQgc2xhc2hlcyAoZml4IGV4cGFuc2lvbnMpCisgICAgJGxpbmUgPX4gcyMvIyAvICNnOworICAgICMgcmVwbGFjZSAmCisgICAgJGxpbmUgPX4gcy9cJi8mYW1wOy9nOworICAgICMgcmVwbGFjZSBzcGFjZXMKKyAgICAkbGluZSA9fiBzLyAvJm5ic3A7L2c7CisgICAgIyByZXBsYWNlIDwKKyAgICAkbGluZSA9fiBzLzwvJmx0Oy9nOworICAgICMgcmVwbGFjZSA+CisgICAgJGxpbmUgPX4gcy8+LyZndDsvZzsKKworICAgICMkbGluZXNbJGldID0gJG5hbWUuJGxybS4kbGluZS4iPC9zcGFuPjxicj4iOyAKKyAgICAjJGkrKzsKKyAgICAkcmVzdWx0IC49ICAkbmFtZS4kbHJtLiRsaW5lLiRzcGFuRW5kLiI8YnI+XG4iOworICB9CisKKyAgIyRfID0gam9pbigiXG4iLCBAbGluZXMpOworICByZXR1cm4gJHJlc3VsdDsKKworfQorIAorc3ViIHByaW50SGVhZGluZyB7CitteSAkZmlsZW5hbWUgPSBzaGlmdDsKKyRmaWxlbmFtZSA9fiBzL1wudHh0Ly87CitwcmludCBPVVQgPDwiRW5kT2ZIZWFkaW5nIjsKKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+Cis8L2hlYWQ+CisjIENvbGxhdGlvbiBkYXRhIHJlc291cmNlIGJ1bmRsZSBnZW5lcmF0ZWQgZm9yIGxvY2FsZTogJGZpbGVuYW1lPGJyPgorIyBGb3IgcGxhdGZvcm0gaWN1IHJlZmVyZW5jZSBwbGF0Zm9ybSBVQ0E8YnI+PGJyPgorCisKKyRmaWxlbmFtZSZuYnNwO3s8YnI+CismbmJzcDsmbmJzcDtDb2xsYXRpb25FbGVtZW50cyZuYnNwO3s8YnI+CismbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtTZXF1ZW5jZSZuYnNwO3s8YnI+CitFbmRPZkhlYWRpbmcKK30KKworc3ViIHByaW50Rm9vdGluZyB7CitwcmludCBPVVQgPDwiRW5kT2ZGb290aW5nIjsKKyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO308YnI+CismbmJzcDsmbmJzcDt9PGJyPgorfTxicj4KKworPC9wcmU+Cis8L2h0bWw+CitFbmRPZkZvb3RpbmcKK30KZGlmZiAtLWdpdCBhL2NvbHByb2JlL2djZDIucGwgYi9jb2xwcm9iZS9nY2QyLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmM4ZTVmODcKLS0tIC9kZXYvbnVsbAorKysgYi9jb2xwcm9iZS9nY2QyLnBsCkBAIC0wLDAgKzEsMjQgQEAKKyMhL3Vzci9iaW4vcGVybCAtdworCit1c2Ugc3RyaWN0OworCisjbXkgJGxvY2FsZU1pbnVzQSA9IGBsb2NhbGUgLWFgOworbXkgJGxvY2FsZU1pbnVzQSA9IGBjYXQgfi9zcmMvaWN1L3NvdXJjZS9leHRyYS9jb2xwcm9iZS9sb2NhbGUudHh0YDsKK215IEBsb2NhbGVzID0gc3BsaXQoL1xuLywgJGxvY2FsZU1pbnVzQSk7CitteSAkbG9jYWxlOworbXkgJGNvbW1hbmQ7CisKK215ICRwbGF0Zm9ybSA9ICRBUkdWWzBdOworCitta2RpciAkcGxhdGZvcm0uImxvZ3MyIjsKK21rZGlyICRwbGF0Zm9ybTsKKworZm9yZWFjaCAkbG9jYWxlIChAbG9jYWxlcykgeworICAkY29tbWFuZCA9ICJ+L3NyYy9pY3Uvc291cmNlL2V4dHJhL2NvbHByb2JlL2NvbHByb2JlIC0tcGxhdGZvcm0gJHBsYXRmb3JtIC0tcmVmICRwbGF0Zm9ybSAtLWRpZmYgJGxvY2FsZSA+JHBsYXRmb3JtIi4ibG9nczIvJGxvY2FsZSIuIkxvZy50eHQgMj4mMSI7CisgICgkbG9jYWxlLCAkXykgPSBzcGxpdCgvXC4vLCAkbG9jYWxlKTsKKyAgJGNvbW1hbmQgLj0gIjsgY3AgL3Vzci9zaGFyZS9pMThuL2xvY2FsZXMvJGxvY2FsZSAkcGxhdGZvcm0vIjsKKyAgcHJpbnQgIiRjb21tYW5kXG4iOworICBgJGNvbW1hbmRgOworICAjY2hkaXIgIi4uIjsKKworfQpkaWZmIC0tZ2l0IGEvY29scHJvYmUvZ2VuQ29sbERhdGEucGwgYi9jb2xwcm9iZS9nZW5Db2xsRGF0YS5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yZjQ2MTg0Ci0tLSAvZGV2L251bGwKKysrIGIvY29scHJvYmUvZ2VuQ29sbERhdGEucGwKQEAgLTAsMCArMSwyMyBAQAorIyEvdXNyL2Jpbi9wZXJsIC13CisKK3VzZSBzdHJpY3Q7CisKK215ICRsb2NhbGVNaW51c0EgPSBgbG9jYWxlIC1hYDsKK215IEBsb2NhbGVzID0gc3BsaXQoL1xuLywgJGxvY2FsZU1pbnVzQSk7CitteSAkbG9jYWxlOworbXkgJGNvbW1hbmQ7CisKK215ICRwbGF0Zm9ybSA9ICRBUkdWWzBdOworCitta2RpciAkcGxhdGZvcm0uImxvZ3MiOworbWtkaXIgJHBsYXRmb3JtOworCitmb3JlYWNoICRsb2NhbGUgKEBsb2NhbGVzKSB7CisgICRjb21tYW5kID0gIn4vc3JjL2ljdS9zb3VyY2UvZXh0cmEvY29scHJvYmUvY29scHJvYmUgLS1vdXRwdXQgcmVzYiAtLXBsYXRmb3JtIGxpbnV4IC0tcmVmIGxpbnV4ICRsb2NhbGUgPiRwbGF0Zm9ybSIuImxvZ3MvJGxvY2FsZSIuIkxvZy50eHQgMj4mMSI7CisgICgkbG9jYWxlLCAkXykgPSBzcGxpdCgvXC4vLCAkbG9jYWxlKTsKKyAgJGNvbW1hbmQgLj0gIjsgY3AgL3Vzci9zaGFyZS9pMThuL2xvY2FsZXMvJGxvY2FsZSAkcGxhdGZvcm0vIjsKKyAgcHJpbnQgIiRjb21tYW5kXG4iOworICBgJGNvbW1hbmRgOworICAjY2hkaXIgIi4uIjsKKworfQpkaWZmIC0tZ2l0IGEvY29scHJvYmUvbGluZS5jcHAgYi9jb2xwcm9iZS9saW5lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODgyOWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvY29scHJvYmUvbGluZS5jcHAKQEAgLTAsMCArMSw3MDEgQEAKKy8qCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgQ29weXJpZ2h0IChDKSAyMDAzLCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzCisqICAgQ29ycG9yYXRpb24gYW5kIG90aGVycy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIEZpbGUgbGluZS5jcHAKKyoKKyogTW9kaWZpY2F0aW9uIEhpc3Rvcnk6CisqCisqICAgRGF0ZSAgICAgICAgTmFtZSAgICAgICAgRGVzY3JpcHRpb24KKyogICAwMy8xOC8yMDAzICB3ZWl2ICAgICAgICBDcmVhdGlvbi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKyNpbmNsdWRlICJsaW5lLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKworVW5pY29kZVNldCAqIExpbmU6Om5lZWRzUXVvdGluZyA9IE5VTEw7CisKK3ZvaWQKK0xpbmU6OmluaXQoKQoreworICAgICAgICBsZW4gPSAwOworICAgICAgICBleHBMZW4gPSAwOworICAgICAgICBzdHJlbmd0aCA9IFVDT0xfT0ZGOworICAgICAgICBzdHJlbmd0aEZyb21FbXB0eSA9IFVDT0xfT0ZGOworICAgICAgICBjdW11bGF0aXZlU3RyZW5ndGggPSBVQ09MX09GRjsKKyAgICAgICAgZXhwU3RyZW5ndGggPSBVQ09MX09GRjsKKyAgICAgICAgcHJldmlvdXMgPSBOVUxMOworICAgICAgICBuZXh0ID0gTlVMTDsKKyAgICAgICAgbGVmdCA9IE5VTEw7CisgICAgICAgIHJpZ2h0ID0gTlVMTDsKKyAgICAgICAgaXNDb250cmFjdGlvbiA9IEZBTFNFOworICAgICAgICBpc0V4cGFuc2lvbiA9IEZBTFNFOworICAgICAgICBpc1JlbW92ZWQgPSBGQUxTRTsKKyAgICAgICAgaXNSZXNldCA9IEZBTFNFOworICAgICAgICBleHBJbmRleCA9IDA7CisgICAgICAgIGZpcnN0Q0MgPSAwOworICAgICAgICBsYXN0Q0MgPSAwOworICAgICAgICBzb3J0S2V5ID0gTlVMTDsKK30KKworTGluZTo6TGluZSgpCit7CisgIGluaXQoKTsKKyAgbWVtc2V0KG5hbWUsIDAsIDI1KnNpemVvZihVQ2hhcikpOworICBtZW1zZXQoZXhwYW5zaW9uU3RyaW5nLCAwLCAyNSpzaXplb2YoVUNoYXIpKTsKK30KKworTGluZTo6TGluZShjb25zdCBVQ2hhciogbmFtZSwgaW50MzJfdCBsZW4pCit7CisgIGluaXQoKTsKKyAgdGhpcy0+bGVuID0gbGVuOworICB1X21lbWNweSh0aGlzLT5uYW1lLCBuYW1lLCBsZW4pOworICBtZW1zZXQoZXhwYW5zaW9uU3RyaW5nLCAwLCAyNSpzaXplb2YoVUNoYXIpKTsKKyAgVUNoYXIzMiBjOworICBVMTZfR0VUKG5hbWUsIDAsIDAsIGxlbiwgYyk7CisgIGZpcnN0Q0MgPSB1X2dldENvbWJpbmluZ0NsYXNzKGMpOworICBVMTZfR0VUKG5hbWUsIDAsIGxlbi0xLCBsZW4sIGMpOworICBsYXN0Q0MgPSB1X2dldENvbWJpbmluZ0NsYXNzKGMpOworfQorCitMaW5lOjpMaW5lKGNvbnN0IFVDaGFyIG5hbWUpCit7CisgICAgaW5pdCgpOworICAgIGxlbiA9IDE7CisgICAgdGhpcy0+bmFtZVswXSA9IG5hbWU7CisgICAgdGhpcy0+bmFtZVsxXSA9IDA7CisgIG1lbXNldChleHBhbnNpb25TdHJpbmcsIDAsIDI1KnNpemVvZihVQ2hhcikpOworICBmaXJzdENDID0gdV9nZXRDb21iaW5pbmdDbGFzcyhuYW1lKTsKKyAgbGFzdENDID0gZmlyc3RDQzsKK30KKworTGluZTo6TGluZShjb25zdCBVbmljb2RlU3RyaW5nICZzdHJpbmcpCit7CisgIGluaXQoKTsKKyAgc2V0VG8oc3RyaW5nKTsKK30KKworTGluZTo6TGluZShjb25zdCBjaGFyICpidWZmLCBpbnQzMl90IGJ1ZmZMZW4sIFVFcnJvckNvZGUgJnN0YXR1cykgOgorcHJldmlvdXMoTlVMTCksCituZXh0KE5VTEwpLAorbGVmdChOVUxMKSwKK3JpZ2h0KE5VTEwpCit7CisgIGluaXRGcm9tU3RyaW5nKGJ1ZmYsIGJ1ZmZMZW4sIHN0YXR1cyk7Cit9CisKK0xpbmU6OkxpbmUoY29uc3QgTGluZSAmb3RoZXIpIDoKKyAgcHJldmlvdXMoTlVMTCksCisgIG5leHQoTlVMTCksCitsZWZ0KE5VTEwpLAorcmlnaHQoTlVMTCkKK3sKKyAgKnRoaXMgPSBvdGhlcjsKK30KKyAgICAgICAgIAorTGluZSAmCitMaW5lOjpvcGVyYXRvcj0oY29uc3QgTGluZSAmb3RoZXIpIHsKKyAgbGVuID0gb3RoZXIubGVuOworICBleHBMZW4gPSBvdGhlci5leHBMZW47CisgIHN0cmVuZ3RoID0gb3RoZXIuc3RyZW5ndGg7CisgIHN0cmVuZ3RoRnJvbUVtcHR5ID0gb3RoZXIuc3RyZW5ndGhGcm9tRW1wdHk7CisgIGN1bXVsYXRpdmVTdHJlbmd0aCA9IG90aGVyLmN1bXVsYXRpdmVTdHJlbmd0aDsKKyAgZXhwU3RyZW5ndGggPSBvdGhlci5leHBTdHJlbmd0aDsKKyAgaXNDb250cmFjdGlvbiA9IG90aGVyLmlzQ29udHJhY3Rpb247CisgIGlzRXhwYW5zaW9uID0gb3RoZXIuaXNFeHBhbnNpb247CisgIGlzUmVtb3ZlZCA9IG90aGVyLmlzUmVtb3ZlZDsKKyAgaXNSZXNldCA9IG90aGVyLmlzUmVzZXQ7CisgIGV4cEluZGV4ID0gb3RoZXIuZXhwSW5kZXg7CisgIGZpcnN0Q0MgPSBvdGhlci5maXJzdENDOworICBsYXN0Q0MgPSBvdGhlci5sYXN0Q0M7CisgIHVfc3RyY3B5KG5hbWUsIG90aGVyLm5hbWUpOworICB1X3N0cmNweShleHBhbnNpb25TdHJpbmcsIG90aGVyLmV4cGFuc2lvblN0cmluZyk7CisgIHNvcnRLZXkgPSBvdGhlci5zb3J0S2V5OworICBsZWZ0ID0gb3RoZXIubGVmdDsKKyAgcmlnaHQgPSBvdGhlci5yaWdodDsKKyAgcmV0dXJuICp0aGlzOworfQorCitVQm9vbCAKK0xpbmU6Om9wZXJhdG9yPT0oY29uc3QgTGluZSAmb3RoZXIpIGNvbnN0IHsKKyAgaWYodGhpcyA9PSAmb3RoZXIpIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBpZihsZW4gIT0gb3RoZXIubGVuKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmKHVfc3RyY21wKG5hbWUsIG90aGVyLm5hbWUpICE9IDApIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK1VCb29sIAorTGluZTo6ZXF1YWxzKGNvbnN0IExpbmUgJm90aGVyKSBjb25zdCB7CisgIGlmKHRoaXMgPT0gJm90aGVyKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYobGVuICE9IG90aGVyLmxlbikgeworICAgIHJldHVybiBGQUxTRTsKKyAgfQorICBpZih1X3N0cmNtcChuYW1lLCBvdGhlci5uYW1lKSAhPSAwKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmKHN0cmVuZ3RoICE9IG90aGVyLnN0cmVuZ3RoKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGlmKGV4cExlbiAhPSBvdGhlci5leHBMZW4pIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgaWYodV9zdHJjbXAoZXhwYW5zaW9uU3RyaW5nLCBvdGhlci5leHBhbnNpb25TdHJpbmcpKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIHJldHVybiBUUlVFOworfQorCitVQm9vbAorTGluZTo6b3BlcmF0b3IhPShjb25zdCBMaW5lICZvdGhlcikgY29uc3QgeworICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7Cit9CisKKworTGluZTo6fkxpbmUoKSB7Cit9CisKK3ZvaWQKK0xpbmU6OmNvcHlBcnJheShMaW5lICpkZXN0LCBjb25zdCBMaW5lICpzcmMsIGludDMyX3Qgc2l6ZSkgeworICBpbnQzMl90IGkgPSAwOworICBmb3IoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICBkZXN0W2ldID0gc3JjW2ldOworICB9Cit9CisKK3ZvaWQKK0xpbmU6OnNldE5hbWUoY29uc3QgVUNoYXIqIG5hbWUsIGludDMyX3QgbGVuKSB7CisgIHRoaXMtPmxlbiA9IGxlbjsKKyAgdV9tZW1jcHkodGhpcy0+bmFtZSwgbmFtZSwgbGVuKTsKKyAgVUNoYXIzMiBjOworICBVMTZfR0VUKG5hbWUsIDAsIDAsIGxlbiwgYyk7CisgIGZpcnN0Q0MgPSB1X2dldENvbWJpbmluZ0NsYXNzKGMpOworICBVMTZfR0VUKG5hbWUsIDAsIGxlbi0xLCBsZW4sIGMpOworICBsYXN0Q0MgPSB1X2dldENvbWJpbmluZ0NsYXNzKGMpOworfQorCit2b2lkIAorTGluZTo6c2V0VG9Db25jYXQoY29uc3QgTGluZSAqZmlyc3QsIGNvbnN0IExpbmUgKnNlY29uZCkgeworICB1X3N0cmNweShuYW1lLCBmaXJzdC0+bmFtZSk7CisgIHVfc3RyY2F0KG5hbWUsIHNlY29uZC0+bmFtZSk7CisgIGxlbiA9IGZpcnN0LT5sZW4gKyBzZWNvbmQtPmxlbjsKKyAgZmlyc3RDQyA9IGZpcnN0LT5maXJzdENDOworICBsYXN0Q0MgPSBzZWNvbmQtPmxhc3RDQzsKK30KKworVW5pY29kZVN0cmluZworTGluZTo6c3RyaW5nVG9OYW1lKFVDaGFyICpzdHJpbmcsIGludDMyX3QgbGVuKSB7CisgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICBVbmljb2RlU3RyaW5nIHJlc3VsdDsKKyAgY2hhciBidWZmZXJbMjU2XTsKKyAgaW50MzJfdCBpID0gMDsKKyAgVUNoYXIzMiBjOyAKKyAgd2hpbGUoaSA8IGxlbikgeworICAgIFUxNl9ORVhUKHN0cmluZywgaSwgbGVuLCBjKTsKKyAgICBpZihjIDwgMHgxMDAwMCkgeworICAgICAgc3ByaW50ZihidWZmZXIsICIlMDRYICIsIGMpOworICAgIH0gZWxzZSB7CisgICAgICBzcHJpbnRmKGJ1ZmZlciwgIiUwNlggIiwgYyk7CisgICAgfQorICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgfQorICBpID0gMDsKKyAgd2hpbGUoaSA8IGxlbikgeworICAgIFUxNl9ORVhUKHN0cmluZywgaSwgbGVuLCBjKTsKKyAgICB1X2NoYXJOYW1lKGMsIFVfRVhURU5ERURfQ0hBUl9OQU1FLCBidWZmZXIsIDI1NiwgJnN0YXR1cyk7CisgICAgcmVzdWx0LmFwcGVuZCgieyIpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICByZXN1bHQuYXBwZW5kKCJ9ICIpOworICB9CisvKgorICBmb3IoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgIHNwcmludGYoYnVmZmVyLCAiJTA0WCAiLCBzdHJpbmdbaV0pOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgfQorICBmb3IoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgIHVfY2hhck5hbWUoc3RyaW5nW2ldLCBVX0VYVEVOREVEX0NIQVJfTkFNRSwgYnVmZmVyLCAyNTYsICZzdGF0dXMpOworICAgIHJlc3VsdC5hcHBlbmQoInsiKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgcmVzdWx0LmFwcGVuZCgifSAiKTsKKyAgfQorKi8gIAorICByZXR1cm4gcmVzdWx0OworfQorCitVbmljb2RlU3RyaW5nCitMaW5lOjp0b0J1bmRsZVN0cmluZygpIAoreworCisgIFVuaWNvZGVTdHJpbmcgcmVzdWx0OworICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgaWYoIW5lZWRzUXVvdGluZykgeworICAgIG5lZWRzUXVvdGluZyA9IG5ldyBVbmljb2RlU2V0KCJbWzp3aGl0ZXNwYWNlOl1bOmM6XVs6ejpdW1s6YXNjaWk6XS1bYS16QS1aMC05XV1dIiwgc3RhdHVzKTsKKyAgfQorICBVQ2hhciBORkNbNTBdOworICBpbnQzMl90IE5GQ0xlbiA9IHVub3JtX25vcm1hbGl6ZShuYW1lLCBsZW4sIFVOT1JNX05GQywgMCwgTkZDLCA1MCwgJnN0YXR1cyk7CisgIHJlc3VsdC5hcHBlbmQoIlwiIik7CisgIGlmKGlzUmVzZXQpIHsKKyAgICByZXN1bHQuYXBwZW5kKCImIik7CisgIH0gZWxzZSB7CisgICAgcmVzdWx0LmFwcGVuZChzdHJlbmd0aFRvU3RyaW5nKHN0cmVuZ3RoLCBGQUxTRSwgRkFMU0UpKTsKKyAgfQorICBVQm9vbCBxdW90ZSA9IG5lZWRzUXVvdGluZy0+Y29udGFpbnNTb21lKG5hbWUpIHx8IG5lZWRzUXVvdGluZy0+Y29udGFpbnNTb21lKE5GQyk7CisgIGlmKHF1b3RlKSB7CisgICAgcmVzdWx0LmFwcGVuZCgiJyIpOworICB9CisgIGlmKE5GQ1swXSA9PSAweDIyKSB7CisgICAgcmVzdWx0LmFwcGVuZCgiXFx1MDAyMiIpOworICB9IGVsc2UgeworICAgIHJlc3VsdC5hcHBlbmQoTkZDLCBORkNMZW4pOworICB9CisgIGlmKHF1b3RlICYmIE5GQ1swXSAhPSAweDAwMjcpIHsKKyAgICByZXN1bHQuYXBwZW5kKCInIik7CisgIH0KKyAgaWYoZXhwTGVuICYmICFpc1Jlc2V0KSB7CisgICAgcXVvdGUgPSBuZWVkc1F1b3RpbmctPmNvbnRhaW5zU29tZShleHBhbnNpb25TdHJpbmcpOworICAgIHJlc3VsdC5hcHBlbmQoIiAvICIpOworICAgIGlmKHF1b3RlKSB7CisgICAgICByZXN1bHQuYXBwZW5kKCInIik7CisgICAgfQorICAgIHJlc3VsdC5hcHBlbmQoZXhwYW5zaW9uU3RyaW5nKTsKKyAgICBpZihxdW90ZSkgeworICAgICAgcmVzdWx0LmFwcGVuZCgiJyIpOworICAgIH0KKyAgfQorICByZXN1bHQuYXBwZW5kKCJcIiAvLyIpOworCisgIHJlc3VsdC5hcHBlbmQoc3RyaW5nVG9OYW1lKE5GQywgTkZDTGVuKSk7CisgIGlmKGV4cExlbiAmJiAhaXNSZXNldCkgeworICAgIHJlc3VsdC5hcHBlbmQoIiAvICIpOworICAgIHJlc3VsdC5hcHBlbmQoc3RyaW5nVG9OYW1lKGV4cGFuc2lvblN0cmluZywgZXhwTGVuKSk7CisgIH0KKyAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworVW5pY29kZVN0cmluZworTGluZTo6dG9IVE1MU3RyaW5nKCkgCit7CisgIFVuaWNvZGVTdHJpbmcgcmVzdWx0OworICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgVUNoYXIgTkZDWzUwXTsKKyAgaW50MzJfdCBORkNMZW4gPSB1bm9ybV9ub3JtYWxpemUobmFtZSwgbGVuLCBVTk9STV9ORkMsIDAsIE5GQywgNTAsICZzdGF0dXMpOworICByZXN1bHQuYXBwZW5kKCI8c3BhbiB0aXRsZT1cIiIpOworICByZXN1bHQuYXBwZW5kKHN0cmluZ1RvTmFtZShORkMsIE5GQ0xlbikpOworICBpZihleHBMZW4gJiYgIWlzUmVzZXQpIHsKKyAgICByZXN1bHQuYXBwZW5kKCIgLyAiKTsKKyAgICByZXN1bHQuYXBwZW5kKHN0cmluZ1RvTmFtZShleHBhbnNpb25TdHJpbmcsIGV4cExlbikpOworICB9CisgIHJlc3VsdC5hcHBlbmQoIlwiPiIpOworICBpZihpc1Jlc2V0KSB7CisgICAgcmVzdWx0LmFwcGVuZCgiJmFtcDsiKTsKKyAgfSBlbHNlIHsKKyAgICByZXN1bHQuYXBwZW5kKHN0cmVuZ3RoVG9TdHJpbmcoc3RyZW5ndGgsIEZBTFNFLCBUUlVFKSk7CisgIH0KKyAgcmVzdWx0LmFwcGVuZChORkMsIE5GQ0xlbik7CisgIGlmKGV4cExlbiAmJiAhaXNSZXNldCkgeworICAgIHJlc3VsdC5hcHBlbmQoIiZuYnNwOy8mbmJzcDsiKTsKKyAgICByZXN1bHQuYXBwZW5kKGV4cGFuc2lvblN0cmluZyk7CisgIH0KKyAgcmVzdWx0LmFwcGVuZCgiPC9zcGFuPjxicj5cbiIpOworICByZXR1cm4gcmVzdWx0OworfQorCitVbmljb2RlU3RyaW5nCitMaW5lOjp0b1N0cmluZyhVQm9vbCBwcmV0dHkpIHsKKyAgVW5pY29kZVN0cmluZyByZXN1bHQ7CisgIGlmKCFwcmV0dHkpIHsKKyAgICByZXN1bHQuc2V0VG8obmFtZSk7CisgICAgaWYoZXhwTGVuKSB7CisgICAgICByZXN1bHQuYXBwZW5kKCIvIik7CisgICAgICByZXN1bHQuYXBwZW5kKGV4cGFuc2lvblN0cmluZyk7CisgICAgfQorICB9IGVsc2UgeworICAgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICAgIFVDaGFyIE5GQ1s1MF07CisgICAgaW50MzJfdCBORkNMZW4gPSB1bm9ybV9ub3JtYWxpemUobmFtZSwgbGVuLCBVTk9STV9ORkMsIDAsIE5GQywgNTAsICZzdGF0dXMpOworICAgIHJlc3VsdC5zZXRUbyhORkMsIE5GQ0xlbik7CisgICAgaWYoZXhwTGVuKSB7CisgICAgICByZXN1bHQuYXBwZW5kKCIvIik7CisgICAgICByZXN1bHQuYXBwZW5kKGV4cGFuc2lvblN0cmluZyk7CisgICAgfQorICAgIC8qCisgICAgaWYoTkZDTGVuICE9IGxlbiB8fCB1X3N0cm5jbXAobmFtZSwgTkZDLCBsZW4pICE9IDApIHsKKyAgICAgIHJlc3VsdC5hcHBlbmQoIihORkM6ICIpOworICAgICAgcmVzdWx0LmFwcGVuZChORkMsIE5GQ0xlbik7CisgICAgICByZXN1bHQuYXBwZW5kKHN0cmluZ1RvTmFtZShORkMsIE5GQ0xlbikpOworICAgICAgcmVzdWx0LmFwcGVuZCgiKSIpOworICAgIH0KKyAgICAqLworICAgIHJlc3VsdC5hcHBlbmQoIiAgICAjICIpOworICAgIHJlc3VsdC5hcHBlbmQoc3RyaW5nVG9OYW1lKE5GQywgTkZDTGVuKSk7CisgICAgaWYoZXhwTGVuKSB7CisgICAgICByZXN1bHQuYXBwZW5kKCIvICIpOworICAgICAgcmVzdWx0LmFwcGVuZChzdHJpbmdUb05hbWUoZXhwYW5zaW9uU3RyaW5nLCBleHBMZW4pKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworCit2b2lkCitMaW5lOjpzZXRUbyhjb25zdCBVbmljb2RlU3RyaW5nICZzdHJpbmcpIHsKKyAgaW50MzJfdCBsZW4gPSBzdHJpbmcubGVuZ3RoKCk7CisgIHVfc3RybmNweShuYW1lLCBzdHJpbmcuZ2V0QnVmZmVyKCksIGxlbik7CisgIG5hbWVbbGVuXSA9IDA7CisgIHRoaXMtPmxlbiA9IGxlbjsKKyAgVUNoYXIzMiBjOworICBVMTZfR0VUKG5hbWUsIDAsIDAsIGxlbiwgYyk7CisgIGZpcnN0Q0MgPSB1X2dldENvbWJpbmluZ0NsYXNzKGMpOworICBVMTZfR0VUKG5hbWUsIDAsIGxlbi0xLCBsZW4sIGMpOworICBsYXN0Q0MgPSB1X2dldENvbWJpbmluZ0NsYXNzKGMpOworfQorCit2b2lkIAorTGluZTo6c2V0VG8oY29uc3QgVUNoYXIzMiBuKSB7CisgIFVCb29sIGlzRXJyb3IgPSBGQUxTRTsKKyAgbGVuID0gMDsgLy8gd2UgYXJlIHNldHRpbmcgdGhlIGxpbmUgdG8gY2hhciwgbm90IGFwcGVuZGluZworICBVMTZfQVBQRU5EKG5hbWUsIGxlbiwgMjUsIG4sIGlzRXJyb3IpOworICBuYW1lW2xlbl0gPSAwOworICBmaXJzdENDID0gdV9nZXRDb21iaW5pbmdDbGFzcyhuKTsKKyAgbGFzdENDID0gZmlyc3RDQzsKK30KKworCitVbmljb2RlU3RyaW5nCitMaW5lOjpzdHJlbmd0aEluZGVudChVQ29sQXR0cmlidXRlVmFsdWUgc3RyZW5ndGgsIGludCBpbmRlbnRTaXplLCBVbmljb2RlU3RyaW5nICZyZXN1bHQpIAoreworICBpbnQgaTsKKyAgaW50IG51bUluZGVudHMgPSBzdHJlbmd0aCsxOworICBpZihzdHJlbmd0aCA+IFVDT0xfSURFTlRJQ0FMKSB7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfSBlbHNlIGlmKHN0cmVuZ3RoID09IFVDT0xfSURFTlRJQ0FMKSB7CisgICAgbnVtSW5kZW50cyA9IDU7CisgIH0KKyAgZm9yKGkgPSAwOyBpIDwgbnVtSW5kZW50cyppbmRlbnRTaXplOyBpKyspIHsKKyAgICByZXN1bHQuYXBwZW5kKCIgIik7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworVW5pY29kZVN0cmluZyAKK0xpbmU6OnN0cmVuZ3RoVG9TdHJpbmcoVUNvbEF0dHJpYnV0ZVZhbHVlIHN0cmVuZ3RoLCBVQm9vbCBwcmV0dHksIFVCb29sIGh0bWwpIHsKKyAgVW5pY29kZVN0cmluZyByZXN1bHQ7CisgIGlmKGh0bWwpIHsKKyAgICBzd2l0Y2goc3RyZW5ndGgpIHsKKyAgICBjYXNlIFVDT0xfSURFTlRJQ0FMOgorICAgICAgcmVzdWx0LmFwcGVuZCgiJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PSZuYnNwOyIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBVQ09MX1FVQVRFUk5BUlk6CisgICAgICByZXN1bHQuYXBwZW5kKCImbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7Jmx0OyZsdDsmbHQ7Jm5ic3A7Iik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFVDT0xfVEVSVElBUlk6CisgICAgICByZXN1bHQuYXBwZW5kKCImbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7Jmx0OyZsdDsmbmJzcDsiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVUNPTF9TRUNPTkRBUlk6CisgICAgICByZXN1bHQuYXBwZW5kKCImbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbHQ7Jmx0OyZuYnNwOyIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBVQ09MX1BSSU1BUlk6CisgICAgICByZXN1bHQuYXBwZW5kKCImbmJzcDsmbmJzcDsmbHQ7Jm5ic3A7Iik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFVDT0xfT0ZGOgorICAgICAgcmVzdWx0LmFwcGVuZCgiJm5ic3A7Jmd0Oz8mbmJzcDsiKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXN1bHQuYXBwZW5kKCImbmJzcDs/ISZuYnNwOyIpOworICAgICAgYnJlYWs7CisgICAgfQorICB9IGVsc2UgeworICAgIHN3aXRjaChzdHJlbmd0aCkgeworICAgIGNhc2UgVUNPTF9JREVOVElDQUw6CisgICAgICBpZihwcmV0dHkpIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiICAgICAgICAiKTsKKyAgICAgIH0KKyAgICAgIHJlc3VsdC5hcHBlbmQoIiA9ICIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBVQ09MX1FVQVRFUk5BUlk6CisgICAgICBpZihwcmV0dHkpIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiICAgICAgICAiKTsKKyAgICAgIH0KKyAgICAgIHJlc3VsdC5hcHBlbmQoIiA8PDw8ICIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBVQ09MX1RFUlRJQVJZOgorICAgICAgLy91X2ZwcmludGYoZmlsZSwgIjwzIik7CisgICAgICBpZihwcmV0dHkpIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiICAgICAgIik7CisgICAgICB9CisgICAgICByZXN1bHQuYXBwZW5kKCIgPDw8ICIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBVQ09MX1NFQ09OREFSWToKKyAgICAgIC8vdV9mcHJpbnRmKGZpbGUsICI8MiIpOworICAgICAgaWYocHJldHR5KSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAgICAiKTsKKyAgICAgIH0KKyAgICAgIHJlc3VsdC5hcHBlbmQoIiA8PCAiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVUNPTF9QUklNQVJZOgorICAgICAgLy91X2ZwcmludGYoZmlsZSwgIjwxIik7CisgICAgICBpZihwcmV0dHkpIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiICAiKTsKKyAgICAgIH0KKyAgICAgIHJlc3VsdC5hcHBlbmQoIiA8ICIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBVQ09MX09GRjoKKyAgICAgIHJlc3VsdC5hcHBlbmQoIiA+PyAiKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXN1bHQuYXBwZW5kKCIgPyEgIik7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworTGluZSAqCitMaW5lOjpuZXh0SW50ZXJlc3RpbmcoKSB7CisgIExpbmUgKnJlc3VsdCA9IHRoaXMtPm5leHQ7CisgIHdoaWxlKHJlc3VsdCAmJiByZXN1bHQtPnN0cmVuZ3RoICE9IFVDT0xfSURFTlRJQ0FMKSB7CisgICAgcmVzdWx0ID0gcmVzdWx0LT5uZXh0OworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQKK0xpbmU6OmFwcGVuZChjb25zdCBVQ2hhciogbiwgaW50MzJfdCBsZW5ndGgpIAoreworICB1X3N0cm5jYXQobmFtZSwgbiwgbGVuZ3RoKTsKKyAgbmFtZVtsZW4rbGVuZ3RoXSA9IDA7CisgIGxlbiArPSBsZW5ndGg7CisgIFVDaGFyMzIgZW5kOworICBVMTZfR0VUKG4sIDAsIGxlbmd0aC0xLCBsZW5ndGgsIGVuZCk7CisgIGxhc3RDQyA9IHVfZ2V0Q29tYmluaW5nQ2xhc3MoZW5kKTsKK30KKwordm9pZAorTGluZTo6YXBwZW5kKGNvbnN0IFVDaGFyIG4pIAoreworICBuYW1lW2xlbl0gPSBuOworICBuYW1lW2xlbisxXSA9IDA7CisgIGxlbisrOworICBsYXN0Q0MgPSB1X2dldENvbWJpbmluZ0NsYXNzKG4pOworfQorCit2b2lkCitMaW5lOjphcHBlbmQoY29uc3QgTGluZSAmbCkKK3sKKyAgYXBwZW5kKGwubmFtZSwgbC5sZW4pOworICBsYXN0Q0MgPSBsLmxhc3RDQzsKK30KKwordm9pZAorTGluZTo6Y2xlYXIoKQoreworICBuYW1lWzBdID0gMDsKKyAgbGVuID0gMDsKK30KKworaW50MzJfdAorTGluZTo6d3JpdGUoY2hhciAqYnVmZiwgaW50MzJfdCwgVUVycm9yQ29kZSAmKSAKK3sKKyAgLyoKKyAgICBVQ2hhciAgICAgbmFtZVsyNV07CisgICAgaW50MzJfdCAgIGxlbjsKKyAgICBVQ2hhciAgICAgZXhwYW5zaW9uU3RyaW5nWzI1XTsKKyAgICBpbnQzMl90ICAgZXhwTGVuOworCisgICAgVUNvbEF0dHJpYnV0ZVZhbHVlIHN0cmVuZ3RoOworICAgIFVDb2xBdHRyaWJ1dGVWYWx1ZSBzdHJlbmd0aEZyb21FbXB0eTsKKyAgICBVQ29sQXR0cmlidXRlVmFsdWUgY3VtdWxhdGl2ZVN0cmVuZ3RoOworICAgIFVDb2xBdHRyaWJ1dGVWYWx1ZSBleHBTdHJlbmd0aDsKKworICAgIExpbmUgKnByZXZpb3VzOworICAgIExpbmUgKm5leHQ7CisKKyAgICBVQm9vbCAgIGlzQ29udHJhY3Rpb247CisgICAgVUJvb2wgICBpc0V4cGFuc2lvbjsKKyAgICBVQm9vbCAgIGlzUmVtb3ZlZDsKKyAgICBVQm9vbCAgIGlzUmVzZXQ7CisKKyAgICBpbnQzMl90IGV4cEluZGV4OworICAgIHVpbnQ4X3QgZmlyc3RDQzsKKyAgICB1aW50OF90IGxhc3RDQzsKKyovCisgIGludDMyX3QgcmVzTGVuID0gMDsKKyAgaW50MzJfdCBpID0gMDsKKyAgc3ByaW50ZihidWZmK3Jlc0xlbiwgIiUwNFgiLCBuYW1lWzBdKTsKKyAgcmVzTGVuICs9IDQ7CisgIGZvcihpID0gMTsgaSA8IGxlbjsgaSsrKSB7CisgICAgc3ByaW50ZihidWZmK3Jlc0xlbiwgIiAlMDRYIiwgbmFtZVtpXSk7CisgICAgcmVzTGVuICs9IDU7CisgIH0KKyAgc3ByaW50ZihidWZmK3Jlc0xlbiwgIi8iKTsKKyAgcmVzTGVuICs9IDE7CisKKyAgaSA9IDA7CisgIGlmKGV4cExlbikgeworICAgIHNwcmludGYoYnVmZityZXNMZW4sICIlMDRYIiwgZXhwYW5zaW9uU3RyaW5nWzBdKTsKKyAgICByZXNMZW4gKz0gNDsKKyAgICBmb3IoaSA9IDE7IGkgPCBleHBMZW47IGkrKykgeworICAgICAgc3ByaW50ZihidWZmK3Jlc0xlbiwgIiAlMDRYIiwgZXhwYW5zaW9uU3RyaW5nW2ldKTsKKyAgICAgIHJlc0xlbiArPSA1OworICAgIH0KKyAgfQorICBzcHJpbnRmKGJ1ZmYrcmVzTGVuLCAiOyAiKTsKKyAgcmVzTGVuICs9IDI7CisKKyAgc3ByaW50ZihidWZmK3Jlc0xlbiwgIiUwMmkgIiwgc3RyZW5ndGgpOworICByZXNMZW4gKz0gMzsKKyAgc3ByaW50ZihidWZmK3Jlc0xlbiwgIiUwMmkiLCBzdHJlbmd0aEZyb21FbXB0eSk7CisgIHJlc0xlbiArPSAyOworICBzcHJpbnRmKGJ1ZmYrcmVzTGVuLCAiJTAyaSIsIGN1bXVsYXRpdmVTdHJlbmd0aCk7CisgIHJlc0xlbiArPSAyOworICBzcHJpbnRmKGJ1ZmYrcmVzTGVuLCAiJTAyaSIsIGV4cFN0cmVuZ3RoKTsKKyAgcmVzTGVuICs9IDI7CisKKyAgLy8gVmFyaW91cyBmbGFncy4gVGhlIG9ubHkgaW50ZXJlc3Rpbmcgb25lcyBhcmUgaXNSZXNldCBhbmQgaXNSZW1vdmVkLiBXZSB3aWxsIG5vdCBvdXRwdXQgcmVtb3ZlZCBsaW5lcworICAvL3NwcmludGYoYnVmZityZXNMZW4sICIlMWklMWklMWklMWkgIiwgaXNDb250cmFjdGlvbiwgaXNFeHBhbnNpb24sIGlzUmVtb3ZlZCwgaXNSZXNldCk7CisgIC8vcmVzTGVuICs9IDU7CisgIHNwcmludGYoYnVmZityZXNMZW4sICIlMWklMWkgIiwgaXNSZW1vdmVkLCBpc1Jlc2V0KTsKKyAgcmVzTGVuICs9IDM7CisKKyAgLy8gZmlyc3QgYW5kIGxhc3QgQ0MKKyAgLy8gY2FuIGJlIGNhbGN1bGF0ZWQgb24gcmVhZGluZworICAvL3NwcmludGYoYnVmZityZXNMZW4sICIlMDNpICUwM2kgIiwgZmlyc3RDQywgbGFzdENDKTsKKyAgLy9yZXNMZW4gKz0gODsKKworICBzcHJpbnRmKGJ1ZmYrcmVzTGVuLCAiJTA4WCIsIGV4cEluZGV4KTsKKyAgcmVzTGVuICs9IDg7CisKKyAgYnVmZltyZXNMZW5dID0gMDsKKworICByZXR1cm4gcmVzTGVuOworfQorCit2b2lkCitMaW5lOjppbml0RnJvbVN0cmluZyhjb25zdCBjaGFyICpidWZmLCBpbnQzMl90LCBVRXJyb3JDb2RlICYpCit7CisgIGludDMyX3QgYnVmSW5kZXggPSAwOworICBpbnQzMl90IGkgPSAwOworCisgIHNzY2FuZihidWZmK2J1ZkluZGV4LCAiJTA0WCIsICZuYW1lW2ldKTsKKyAgaSsrOworICBidWZJbmRleCArPSA0OworICB3aGlsZShidWZmW2J1ZkluZGV4XSAhPSAnLycpIHsKKyAgICBzc2NhbmYoYnVmZitidWZJbmRleCwgIiAlMDRYIiwgJm5hbWVbaV0pOworICAgIGkrKzsKKyAgICBidWZJbmRleCArPSA1OworICB9CisgIGxlbiA9IGk7CisgIG5hbWVbbGVuXSA9IDA7CisgIGJ1ZkluZGV4Kys7CisKKyAgaWYoaSA+IDEpIHsKKyAgICBpc0NvbnRyYWN0aW9uID0gVFJVRTsKKyAgfSBlbHNlIHsKKyAgICBpc0NvbnRyYWN0aW9uID0gRkFMU0U7CisgIH0KKworICBpZihidWZmW2J1ZkluZGV4XSA9PSAnOycpIHsKKyAgICBpc0V4cGFuc2lvbiA9IEZBTFNFOworICAgIGJ1ZkluZGV4ICs9IDI7CisgICAgZXhwYW5zaW9uU3RyaW5nWzBdID0gMDsKKyAgICBleHBMZW4gPSAwOworICB9IGVsc2UgeworICAgIGkgPSAwOworICAgIHNzY2FuZihidWZmK2J1ZkluZGV4LCAiJTA0WCIsICZleHBhbnNpb25TdHJpbmdbaV0pOworICAgIGkrKzsKKyAgICBidWZJbmRleCArPSA0OworICAgIHdoaWxlKGJ1ZmZbYnVmSW5kZXhdICE9ICc7JykgeworICAgICAgc3NjYW5mKGJ1ZmYrYnVmSW5kZXgsICIgJTA0WCIsICZleHBhbnNpb25TdHJpbmdbaV0pOworICAgICAgaSsrOworICAgICAgYnVmSW5kZXggKz0gNTsKKyAgICB9CisgICAgZXhwTGVuID0gaTsKKyAgICBleHBhbnNpb25TdHJpbmdbZXhwTGVuXSA9IDA7CisgICAgYnVmSW5kZXggKz0gMjsKKyAgfQorICBzc2NhbmYoYnVmZitidWZJbmRleCwgIiUwMmkgIiwgJnN0cmVuZ3RoKTsKKyAgYnVmSW5kZXggKz0gMzsKKyAgc3NjYW5mKGJ1ZmYrYnVmSW5kZXgsICIlMDJpIiwgJnN0cmVuZ3RoRnJvbUVtcHR5KTsKKyAgYnVmSW5kZXggKz0gMjsKKyAgc3NjYW5mKGJ1ZmYrYnVmSW5kZXgsICIlMDJpIiwgJmN1bXVsYXRpdmVTdHJlbmd0aCk7CisgIGJ1ZkluZGV4ICs9IDI7CisgIHNzY2FuZihidWZmK2J1ZkluZGV4LCAiJTAyaSIsICZleHBTdHJlbmd0aCk7CisgIGJ1ZkluZGV4ICs9IDI7CisKKyAgc3NjYW5mKGJ1ZmYrYnVmSW5kZXgsICIlMWklMWkgIiwgJmlzUmVtb3ZlZCwgJmlzUmVzZXQpOworICBidWZJbmRleCArPSAzOworCisgIHNzY2FuZihidWZmK2J1ZkluZGV4LCAiJTA4WCIsICZleHBJbmRleCk7CisgIGJ1ZkluZGV4ICs9IDg7CisKKyAgLy8gY2FsY3VsYXRlIGZpcnN0IGFuZCBsYXN0IENDCisgIFVDaGFyMzIgYzsKKyAgVTE2X0dFVChuYW1lLCAwLCAwLCBsZW4sIGMpOworICBmaXJzdENDID0gdV9nZXRDb21iaW5pbmdDbGFzcyhjKTsKKyAgVTE2X0dFVChuYW1lLCAwLCBsZW4tMSwgbGVuLCBjKTsKKyAgbGFzdENDID0gdV9nZXRDb21iaW5pbmdDbGFzcyhjKTsKK30KKwordm9pZAorTGluZTo6c3dhcENhc2UoVUNoYXIgKnN0cmluZywgaW50MzJfdCAmc0xlbikKK3sKKyAgVUNoYXIzMiBjID0gMDsKKyAgaW50MzJfdCBpID0gMCwgaiA9IDA7CisgIFVDaGFyIGJ1ZmZbMjU2XTsKKyAgVUJvb2wgaXNFcnJvciA9IEZBTFNFOworICB3aGlsZShpIDwgc0xlbikgeworICAgIFUxNl9ORVhUKHN0cmluZywgaSwgc0xlbiwgYyk7CisgICAgaWYodV9pc1VVcHBlcmNhc2UoYykpIHsKKyAgICAgIGMgPSB1X3RvbG93ZXIoYyk7CisgICAgfSBlbHNlIGlmKHVfaXNVTG93ZXJjYXNlKGMpKSB7CisgICAgICBjID0gdV90b3VwcGVyKGMpOworICAgIH0KKyAgICBVMTZfQVBQRU5EKGJ1ZmYsIGosIDI1NiwgYywgaXNFcnJvcik7CisgIH0KKyAgYnVmZltqXSA9IDA7CisgIHVfc3RyY3B5KHN0cmluZywgYnVmZik7CisgIHNMZW4gPSBqOworfQorCisKK3ZvaWQKK0xpbmU6OnN3YXBDYXNlKCkKK3sKKyAgc3dhcENhc2UobmFtZSwgbGVuKTsKKyAgc3dhcENhc2UoZXhwYW5zaW9uU3RyaW5nLCBleHBMZW4pOworfQorCitVbmljb2RlU3RyaW5nCitMaW5lOjpkdW1wU29ydGtleSgpIAoreworCisgIGNoYXIgYnVmZmVyWzI1Nl07CisgIGNoYXIgKmJ1ZmYgPSBidWZmZXI7CisgICpidWZmID0gMDsKKyAgdWludDhfdCAqa2V5ID0gc29ydEtleTsKKyAgaWYoc29ydEtleSkgeworICAgIHdoaWxlKCprZXkpIHsKKyAgICAgIHNwcmludGYoYnVmZiwgIiUwMlggIiwgKmtleSk7CisgICAgICBrZXkrKzsKKyAgICAgIGJ1ZmYgKz0gMzsKKyAgICAgIGlmKGJ1ZmYgLSBidWZmZXIgPiAyNTIpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBVbmljb2RlU3RyaW5nKGJ1ZmZlcik7Cit9CisKZGlmZiAtLWdpdCBhL2NvbHByb2JlL2xpbmUuaCBiL2NvbHByb2JlL2xpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWNlMjA0Ci0tLSAvZGV2L251bGwKKysrIGIvY29scHJvYmUvbGluZS5oCkBAIC0wLDAgKzEsMTEzIEBACisvKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIENvcHlyaWdodCAoQykgMjAwMywgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcworKiAgIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBGaWxlIGxpbmUuaAorKgorKiBNb2RpZmljYXRpb24gSGlzdG9yeToKKyoKKyogICBEYXRlICAgICAgICBOYW1lICAgICAgICBEZXNjcmlwdGlvbgorKiAgIDAzLzE4LzIwMDMgIHdlaXYgICAgICAgIENyZWF0aW9uLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworLy8KKy8vICAgY2xhc3MgTGluZQorLy8KKy8vICAgICAgRWFjaCBsaW5lIGZyb20gdGhlIHNvdXJjZSBmaWxlIChjb250YWluaW5nIGEgbmFtZSwgcHJlc3VtYWJseSkgZ2V0cworLy8gICAgICBvbmUgb2YgdGhlc2Ugc3RydWN0cy4KKy8vCisKKyNpZm5kZWYgQ09MUFJPQkVfTElORV9ICisjZGVmaW5lIENPTFBST0JFX0xJTkVfSAorI2luY2x1ZGUgInVuaWNvZGUvdXR5cGVzLmgiCisjaW5jbHVkZSAidW5pY29kZS91Y29sLmgiCisjaW5jbHVkZSAidW5pY29kZS91c3RyaW5nLmgiCisjaW5jbHVkZSAidW5pY29kZS91bmlzdHIuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3VjaGFyLmgiCisjaW5jbHVkZSAidW5pY29kZS91bmlzZXQuaCIKKyNpbmNsdWRlICJjb2xwcm9iZS5oIgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3N0YXRpYyBjb25zdCBpbnQgTUFYX0VYUEFOU0lPTl9QUkVGSVhFUyA9IDEwOworCitjbGFzcyAgTGluZSB7CitwdWJsaWM6CisgIHN0YXRpYyB2b2lkIGNvcHlBcnJheShMaW5lICpkZXN0LCBjb25zdCBMaW5lICpzcmMsIGludDMyX3Qgc2l6ZSk7CisgIExpbmUoKTsKKyAgTGluZShjb25zdCBMaW5lICZvdGhlcik7CisgIExpbmUoY29uc3QgVUNoYXIqIG5hbWUsIGludDMyX3QgbGVuKTsKKyAgTGluZShjb25zdCBVbmljb2RlU3RyaW5nICZzdHJpbmcpOworICBMaW5lKGNvbnN0IFVDaGFyIG5hbWUpOworICBMaW5lKGNvbnN0IGNoYXIgKmJ1ZmYsIGludDMyX3QgYnVmZkxlbiwgVUVycm9yQ29kZSAmc3RhdHVzKTsKKyAgfkxpbmUoKTsKKyAgTGluZSAmIG9wZXJhdG9yPShjb25zdCBMaW5lICZvdGhlcik7CisgIFVCb29sIG9wZXJhdG9yPT0oY29uc3QgTGluZSAmb3RoZXIpIGNvbnN0OworICBVQm9vbCBvcGVyYXRvciE9KGNvbnN0IExpbmUgJm90aGVyKSBjb25zdDsKKyAgdm9pZCBzZXRUb0NvbmNhdChjb25zdCBMaW5lICpmaXJzdCwgY29uc3QgTGluZSAqc2Vjb25kKTsKKyAgdm9pZCBzZXROYW1lKGNvbnN0IFVDaGFyKiBuYW1lLCBpbnQzMl90IGxlbik7CisgIFVuaWNvZGVTdHJpbmcgdG9TdHJpbmcoVUJvb2wgcHJldHR5ID0gRkFMU0UpOworICBVbmljb2RlU3RyaW5nIHRvQnVuZGxlU3RyaW5nKCk7CisgIFVuaWNvZGVTdHJpbmcgdG9IVE1MU3RyaW5nKCk7CisgIGludDMyX3Qgd3JpdGUoY2hhciAqYnVmZiwgaW50MzJfdCBidWZmTGVuLCBVRXJyb3JDb2RlICZzdGF0dXMpOworICB2b2lkIGluaXRGcm9tU3RyaW5nKGNvbnN0IGNoYXIgKmJ1ZmYsIGludDMyX3QgYnVmZkxlbiwgVUVycm9yQ29kZSAmc3RhdHVzKTsKKyAgCisKKyAgVW5pY29kZVN0cmluZyBzdHJlbmd0aEluZGVudChVQ29sQXR0cmlidXRlVmFsdWUgc3RyZW5ndGgsIGludCBpbmRlbnRTaXplLCBVbmljb2RlU3RyaW5nICZyZXN1bHQpOworICBVbmljb2RlU3RyaW5nIHN0cmVuZ3RoVG9TdHJpbmcoVUNvbEF0dHJpYnV0ZVZhbHVlIHN0cmVuZ3RoLCBVQm9vbCBwcmV0dHksIFVCb29sIGh0bWwgPSBGQUxTRSk7CisgIFVuaWNvZGVTdHJpbmcgc3RyaW5nVG9OYW1lKFVDaGFyICpzdHJpbmcsIGludDMyX3QgbGVuKTsKKyAgdm9pZCBzZXRUbyhjb25zdCBVbmljb2RlU3RyaW5nICZzdHJpbmcpOworICB2b2lkIHNldFRvKGNvbnN0IFVDaGFyMzIgbik7CisgIFVCb29sIGVxdWFscyhjb25zdCBMaW5lICZvdGhlcikgY29uc3Q7CisgIExpbmUgKm5leHRJbnRlcmVzdGluZygpOworICB2b2lkIGFwcGVuZChjb25zdCBVQ2hhciBuKTsKKyAgdm9pZCBhcHBlbmQoY29uc3QgVUNoYXIqIG4sIGludDMyX3QgbGVuZ3RoKTsKKyAgdm9pZCBhcHBlbmQoY29uc3QgTGluZSAmbCk7CisgIHZvaWQgY2xlYXIoKTsKKyAgdm9pZCBzd2FwQ2FzZSgpOworICB2b2lkIHN3YXBDYXNlKFVDaGFyICpzdHJpbmcsIGludDMyX3QgJnNMZW4pOworICBVbmljb2RlU3RyaW5nIGR1bXBTb3J0a2V5KCk7CisgIHZvaWQgaW5pdCgpOworCisgIAorcHVibGljOgorICAgIFVDaGFyICAgICBuYW1lWzI1XTsKKyAgICBpbnQzMl90ICAgbGVuOworICAgIFVDaGFyICAgICBleHBhbnNpb25TdHJpbmdbMjVdOworICAgIGludDMyX3QgICBleHBMZW47CisKKyAgICBVQ29sQXR0cmlidXRlVmFsdWUgc3RyZW5ndGg7CisgICAgVUNvbEF0dHJpYnV0ZVZhbHVlIHN0cmVuZ3RoRnJvbUVtcHR5OworICAgIFVDb2xBdHRyaWJ1dGVWYWx1ZSBjdW11bGF0aXZlU3RyZW5ndGg7CisgICAgVUNvbEF0dHJpYnV0ZVZhbHVlIGV4cFN0cmVuZ3RoOworCisgICAgTGluZSAqcHJldmlvdXM7CisgICAgTGluZSAqbmV4dDsKKworICAgIC8vIEluIGNhc2UgdGhpcyBlbGVtZW50IGlzIGEgY29udHJhY3Rpb24KKyAgICAvLyB3ZSBrZWVwIGEgcG9pbnRlciBhdCB3aGljaCBsaW5lcyB3ZXJlIGNvbXBvbmVudHMKKyAgICBMaW5lICpsZWZ0OworICAgIExpbmUgKnJpZ2h0OworCisgICAgVUJvb2wgICBpc0NvbnRyYWN0aW9uOworICAgIFVCb29sICAgaXNFeHBhbnNpb247CisgICAgVUJvb2wgICBpc1JlbW92ZWQ7CisgICAgVUJvb2wgICBpc1Jlc2V0OworCisgICAgaW50MzJfdCBleHBJbmRleDsKKyAgICB1aW50OF90IGZpcnN0Q0M7CisgICAgdWludDhfdCBsYXN0Q0M7CisKKyAgICB1aW50OF90ICAgKnNvcnRLZXk7CitwdWJsaWM6CisgIHN0YXRpYyBVbmljb2RlU2V0ICpuZWVkc1F1b3Rpbmc7Cit9OworCisKKyNlbmRpZiAvL0NPTFBST0JFX0xJTkVfSApkaWZmIC0tZ2l0IGEvY29scHJvYmUvbG9jYWxlLnR4dCBiL2NvbHByb2JlL2xvY2FsZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI0YWI1NgotLS0gL2Rldi9udWxsCisrKyBiL2NvbHByb2JlL2xvY2FsZS50eHQKQEAgLTAsMCArMSwyNDEgQEAKK2FmCithZl9aQQorYW0KK2FtX0VUCithcgorYXJfQUUKK2FyX0JICithcl9EWgorYXJfRUcKK2FyX0lOCithcl9JUQorYXJfSk8KK2FyX0tXCithcl9MQgorYXJfTFkKK2FyX01BCithcl9PTQorYXJfUUEKK2FyX1NBCithcl9TRAorYXJfU1kKK2FyX1ROCithcl9ZRQorYmUKK2JlX0JZCitiZworYmdfQkcKK2JuCitibl9JTgorY2EKK2NhX0VTCisjY2FfRVNfUFJFRVVSTworY3MKK2NzX0NaCitkYQorZGFfREsKK2RlCitkZV9BVAorI2RlX0FUX1BSRUVVUk8KK2RlX0JFCitkZV9DSAorZGVfREUKKyNkZV9ERV9QUkVFVVJPCitkZV9MVQorI2RlX0xVX1BSRUVVUk8KK2RlX19QSE9ORUJPT0sKK2VsCitlbF9HUgorI2VsX0dSX1BSRUVVUk8KK2VuCitlbl9BVQorZW5fQkUKKyNlbl9CRV9QUkVFVVJPCitlbl9CVworZW5fQ0EKK2VuX0dCCisjZW5fR0JfRVVSTworZW5fSEsKK2VuX0lFCisjZW5fSUVfUFJFRVVSTworZW5fSU4KK2VuX01UCitlbl9OWgorZW5fUEgKK2VuX1NHCitlbl9VUworZW5fVVNfUE9TSVgKK2VuX1ZJCitlbl9aQQorZW5fWlcKK2VvCitlcworZXNfQVIKK2VzX0JPCitlc19DTAorZXNfQ08KK2VzX0NSCitlc19ETworZXNfRUMKK2VzX0VTCisjZXNfRVNfUFJFRVVSTworZXNfR1QKK2VzX0hOCitlc19NWAorZXNfTkkKK2VzX1BBCitlc19QRQorZXNfUFIKK2VzX1BZCitlc19TVgorZXNfVVMKK2VzX1VZCitlc19WRQorZXNfX1RSQURJVElPTkFMCitldAorZXRfRUUKK2V1CitldV9FUworI2V1X0VTX1BSRUVVUk8KK2ZhCitmYV9BRgorZmFfSVIKK2ZpCitmaV9GSQorI2ZpX0ZJX1BSRUVVUk8KK2ZvCitmb19GTworZnIKK2ZyX0JFCisjZnJfQkVfUFJFRVVSTworZnJfQ0EKK2ZyX0NICitmcl9GUgorI2ZyX0ZSX1BSRUVVUk8KK2ZyX0xVCisjZnJfTFVfUFJFRVVSTworZ2EKK2dhX0lFCisjZ2FfSUVfUFJFRVVSTworZ2wKK2dsX0VTCisjZ2xfRVNfUFJFRVVSTworZ3UKK2d1X0lOCitndgorZ3ZfR0IKK2hlCitoZV9JTAoraGkKK2hpX0lOCitoaV9fRElSRUNUCitocgoraHJfSFIKK2h1CitodV9IVQoraHkKK2h5X0FNCitoeV9BTV9SRVZJU0VECitpZAoraWRfSUQKK2lzCitpc19JUworaXQKK2l0X0NICitpdF9JVAorI2l0X0lUX1BSRUVVUk8KK2phCitqYV9KUAorI2phX0pQX1RSQURJVElPTkFMCitra19LWgora2wKK2tsX0dMCitrbgora25fSU4KK2tvCitrb19LUgora29rCitrb2tfSU4KK2t3Citrd19HQgorbHQKK2x0X0xUCitsdgorbHZfTFYKK21rCitta19NSworbXIKK21yX0lOCittc19NWQorbXQKK210X01UCituYgorbmJfTk8KK25sCitubF9CRQorI25sX0JFX1BSRUVVUk8KK25sX05MCisjbmxfTkxfUFJFRVVSTworbm4KK25uX05PCitvbQorb21fRVQKK29tX0tFCitwbAorcGxfUEwKK3BzCitwc19BRgorcHQKK3B0X0JSCitwdF9QVAorI3B0X1BUX1BSRUVVUk8KK3JvCityb19STworcnUKK3J1X1JVCitydV9VQQorc2gKK3NoX1lVCitzaworc2tfU0sKK3NsCitzbF9TSQorc28KK3NvX0RKCitzb19FVAorc29fS0UKK3NvX1NPCitzcQorc3FfQUwKK3NyCitzcl9ZVQorc3YKK3N2X0ZJCitzdl9TRQorc3cKK3N3X0tFCitzd19UWgordGEKK3RhX0lOCit0ZQordGVfSU4KK3RoCit0aF9USAorI3RoX1RIX1RSQURJVElPTkFMCit0aQordGlfRVIKK3RpX0VUCit0cgordHJfVFIKK3VrCit1a19VQQordmkKK3ZpX1ZOCit6aAoremhfQ04KK3poX0hLCit6aF9NTworemhfU0cKK3poX1RXCit6aF9UV19TVFJPS0UKK3poX19QSU5ZSU4KZGlmZiAtLWdpdCBhL2NvbHByb2JlL2xvbmduYW1lLmNwcCBiL2NvbHByb2JlL2xvbmduYW1lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWJhNDVkCi0tLSAvZGV2L251bGwKKysrIGIvY29scHJvYmUvbG9uZ25hbWUuY3BwCkBAIC0wLDAgKzEsNDggQEAKKyNpbmNsdWRlICJ1bmljb2RlL3VuaXN0ci5oIgorI2luY2x1ZGUgInVuaWNvZGUvbG9jaWQuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3VjbnYuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorCitpbnQgbWFpbihpbnQgYXJnYywKKyAgICAgY2hhciogYXJndltdKQoreworICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgY29uc3QgY2hhciAqbG9jID0gYXJndlsxXTsKKyAgaW50MzJfdCBoYXNDb3VudHJ5OworICBVQ29udmVydGVyICpjb252ID0gdWNudl9vcGVuKCJ1dGY4IiwgJnN0YXR1cyk7CisKKyAgCisgIFVDaGFyIFVCdWZmZXJbMjU2XTsKKyAgaW50MzJfdCB1QnVmTGVuID0gMDsKKyAgY2hhciBidWZmZXJbMjU2XTsKKyAgaW50MzJfdCBidWZMZW4gPSAwOworCisgIHVCdWZMZW4gPSB1bG9jX2dldERpc3BsYXlMYW5ndWFnZShsb2MsICJlbiIsIFVCdWZmZXIsIDI1NiwgJnN0YXR1cyk7CisgIGJ1ZkxlbiA9IHVjbnZfZnJvbVVDaGFycyhjb252LCBidWZmZXIsIDI1NiwgVUJ1ZmZlciwgdUJ1ZkxlbiwgJnN0YXR1cyk7CisgIC8vdV9VQ2hhcnNUb0NoYXJzKFVCdWZmZXIsICBidWZmZXIsIHVCdWZMZW4pOworICBidWZmZXJbYnVmTGVuXSA9IDA7CisgIHByaW50ZigiJXMiLCBidWZmZXIpOworCisgIGlmKGhhc0NvdW50cnkgPSB1bG9jX2dldENvdW50cnkobG9jLCBidWZmZXIsIDI1NiwgJnN0YXR1cykpIHsKKyAgICB1QnVmTGVuID0gdWxvY19nZXREaXNwbGF5Q291bnRyeShsb2MsICJlbiIsIFVCdWZmZXIsIDI1NiwgJnN0YXR1cyk7CisgICAgYnVmTGVuID0gdWNudl9mcm9tVUNoYXJzKGNvbnYsIGJ1ZmZlciwgMjU2LCBVQnVmZmVyLCB1QnVmTGVuLCAmc3RhdHVzKTsKKyAgICAvL3VfVUNoYXJzVG9DaGFycyhVQnVmZmVyLCAgYnVmZmVyLCB1QnVmTGVuKTsKKyAgICBidWZmZXJbYnVmTGVuXSA9IDA7CisgICAgcHJpbnRmKCJfJXMiLCBidWZmZXIpOworICB9CisKKyAgaWYodWxvY19nZXRWYXJpYW50KGxvYywgYnVmZmVyLCAyNTYsICZzdGF0dXMpKSB7CisgICAgdUJ1ZkxlbiA9IHVsb2NfZ2V0RGlzcGxheVZhcmlhbnQobG9jLCAiZW4iLCBVQnVmZmVyLCAyNTYsICZzdGF0dXMpOworICAgIGJ1ZkxlbiA9IHVjbnZfZnJvbVVDaGFycyhjb252LCBidWZmZXIsIDI1NiwgVUJ1ZmZlciwgdUJ1ZkxlbiwgJnN0YXR1cyk7CisgICAgLy91X1VDaGFyc1RvQ2hhcnMoVUJ1ZmZlciwgIGJ1ZmZlciwgdUJ1Zkxlbik7CisgICAgYnVmZmVyW2J1Zkxlbl0gPSAwOworICAgIGlmKCFoYXNDb3VudHJ5KSB7CisgICAgICBwcmludGYoIl8iKTsKKyAgICB9CisgICAgcHJpbnRmKCJfJXMiLCBidWZmZXIpOworICB9CisgIHByaW50ZigiXG4iKTsKKworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvY29scHJvYmUvcmVhZG1lLnR4dCBiL2NvbHByb2JlL3JlYWRtZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQyOTE0YQotLS0gL2Rldi9udWxsCisrKyBiL2NvbHByb2JlL3JlYWRtZS50eHQKQEAgLTAsMCArMSw0IEBACitUaGVyZSBhcmUgc2V2ZXJhbCB0b29scyBpbiB0aGlzIGRpcmVjdG9yeSB0aGF0IHNob3VsZCBtYWtlIGl0IGVhc2llciB0byBnZW5lcmF0ZSBjb2xsYXRpb24gZGF0YToKK2V4dHJhY3RDb2xsYXRpb25EYXRhLnBsIC0gcGVybCBzY3JpcHQgdGhhdCByZWFkcyBJQ1UgcmVzb3VyY2UgYnVuZGxlIGZpbGVzIGFuZCBvdXRwdXRzIGEgbG9jYWxlX2NvbGxhdGlvbi5odG1sIGZpbGUgaWYgY29sbGF0aW9uIGVsZW1lbnRzIGFyZSBwcmVzZW50IGluIHRoZSBsb2NhbGUuIEFyZ3VtZW50cyBhcmUgdGhlIGxpc3Qgb2YgbG9jYWxlIHNvdXJjZSBmaWxlcyAoKi50eHQpIHRoYXQgbmVlZCB0byBiZSBwcm9jZXNzZWQuCitjcmVhdGVDb21wYXJpc29uVGFibGVzLnBsIC0gdGFrZXMgYSBsb2NhbGUgbmFtZS4gTG9va3MgaW4gZGlyZWN0b3JpZXMgdGhhdCBzaG91bGQgY29udGFpbiB0aGUgaHRtbCBkYXRhIHByb2R1Y2VkIGJ5IGNvbHByb2JlIG9yIGV4dHJhY3RDb2xsYXRpb25EYXRhLgordGFibGVTdGFydGVyLnBsIC0gaW52b2tlcyBjcmVhdGVDb21wYXJpc29uVGFibGVzLnBsIHdpdGggYSBsaXN0IG9mIGxvY2FsZXMuIApkaWZmIC0tZ2l0IGEvY29scHJvYmUvc29ydGVkbGluZXMuY3BwIGIvY29scHJvYmUvc29ydGVkbGluZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZjNkZmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb2xwcm9iZS9zb3J0ZWRsaW5lcy5jcHAKQEAgLTAsMCArMSwyMDY3IEBACisjaW5jbHVkZSAic29ydGVkbGluZXMuaCIKKworc3RhdGljIGludCBjb2RlUG9pbnRDbXAoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikgeworICByZXR1cm4gdV9zdHJjbXAoKCooTGluZSAqKilhKS0+bmFtZSwgKCooTGluZSAqKiliKS0+bmFtZSk7Cit9CisKK1NvcnRlZExpbmVzOjpTb3J0ZWRMaW5lcyhjb25zdCBVbmljb2RlU2V0ICZzZXQsIGNvbnN0IFVuaWNvZGVTZXQgJmV4Y2x1ZGVCb3VuZHMsIGNvbnN0IFN0cmVuZ3RoUHJvYmUgJnByb2JlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBVUHJpbnRlciAqbG9nZ2VyLCBVUHJpbnRlciAqZGVidWcpIDoKK3RvU29ydChOVUxMKSwKK3RvU29ydENhcGFjaXR5KDApLAorbGluZXMoTlVMTCksCitzaXplKDApLAorY2FwYWNpdHkoMCksCityZXBlcnRvaXJlKHNldCksCitleGNsdWRlQm91bmRzKGV4Y2x1ZGVCb3VuZHMpLAorcHJvYmUocHJvYmUpLAorZmlyc3QoTlVMTCksCitsYXN0KE5VTEwpLAorbG9nZ2VyKGxvZ2dlciksCitkZWJ1ZyhkZWJ1ZyksCitjb250cmFjdGlvbnNUYWJsZShOVUxMKSwKK2R1cGxpY2F0b3JzKE5VTEwpLAorbWF4RXhwYW5zaW9uUHJlZml4U2l6ZSgwKSwKK3dvcmRTb3J0KEZBTFNFKSwKK2ZyZW5jaFNlY29uZGFyeShGQUxTRSksCit1cHBlckZpcnN0KEZBTFNFKSwKK3NvcnRrZXlzKE5VTEwpLAorc29ydGtleU9mZnNldCgwKQoreworICBtZW1zZXQoVUIsIDAsIHNpemVvZihVQikpOworICBpbnQzMl90IGkgPSAwOworICBmb3IoaSA9IDA7IGkgPCBVQ09MX09GRjsgaSsrKSB7CisgICAgVUJbaV0gPSAmZW1wdHk7CisgIH0KKyAgaW5pdCgpOworfQorCitTb3J0ZWRMaW5lczo6flNvcnRlZExpbmVzKCkKK3sKKyAgZGVsZXRlW10gbGluZXM7CisgIGlmKHNvcnRrZXlzKSB7CisgICAgZGVsZXRlW10gc29ydGtleXM7CisgIH0KKyAgaWYodG9Tb3J0KSB7CisgICAgZGVsZXRlW10gdG9Tb3J0OworICB9CisgIGlmKGNvbnRyYWN0aW9uc1RhYmxlKSB7CisgICAgZGVsZXRlIGNvbnRyYWN0aW9uc1RhYmxlOworICB9CisgIGlmKGR1cGxpY2F0b3JzKSB7CisgICAgZGVsZXRlIGR1cGxpY2F0b3JzOworICB9Cit9CisKK3ZvaWQKK1NvcnRlZExpbmVzOjpnZXRCb3VuZHMoVUVycm9yQ29kZSAmc3RhdHVzKSB7CisgIC8vIGZpcnN0IHNvcnQgdGhyb3VnaCB0aGUgc2V0CisgIGRlYnVnLT5sb2codG9TdHJpbmcoKSwgVFJVRSk7CisgIGludDMyX3QgaSA9IDAsIGogPSAwOworICBVQ29sQXR0cmlidXRlVmFsdWUgc3RyZW5ndGggPSBVQ09MX09GRjsKKyAgZm9yKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgaWYodG9Tb3J0W2ldLT5zdHJlbmd0aEZyb21FbXB0eSA8IHN0cmVuZ3RoKSB7CisgICAgICBpZihpICYmIHN0cmVuZ3RoIDwgVUNPTF9PRkYpIHsKKyAgICAgICAgLy91X3N0cmNweShVQltzdHJlbmd0aF0sIHRvU29ydFtpLTFdLT5uYW1lKTsKKyAgICAgICAgaiA9IDE7CisgICAgICAgIHdoaWxlKGV4Y2x1ZGVCb3VuZHMuY29udGFpbnMoVW5pY29kZVN0cmluZyh0b1NvcnRbaS1qXS0+bmFtZSwgdG9Tb3J0W2ktal0tPmxlbikpKSB7CisgICAgICAgICAgaisrOworICAgICAgICB9CisgICAgICAgIFVCW3N0cmVuZ3RoXSA9IHRvU29ydFtpLWpdOworICAgICAgfQorICAgICAgc3RyZW5ndGggPSB0b1NvcnRbaV0tPnN0cmVuZ3RoRnJvbUVtcHR5OworICAgICAgaWYoc3RyZW5ndGggPT0gVUNPTF9QUklNQVJZKSB7CisgICAgICAgIHByb2JlLlNFID0gdG9Tb3J0W2ldLT5uYW1lWzBdOworICAgICAgfQorICAgIH0KKyAgfQorICAvL3Vfc3RyY3B5KFVCW3N0cmVuZ3RoXSwgdG9Tb3J0W3NpemUtMV0tPm5hbWUpOworICAvLyBhIGRpZmZlcmVudCBzb2x1dGlvbiBmb3IgYm91bmRzOiBnbyBmcm9tIGVuZCBhbmQgc2VlIGlmIHRoZSBndXlzIG9uIHRoZSB0b3AKKyAgLy8gY2F1c2UgZHVwbGljYXRpb24gZm9yIHRoaW5ncworICBVQ2hhciBkdXBjaFtdID0geyAweDAwMjAsIDB4MDAzMCwgMHgwMDQyLCAweDAwNTEsIDB4MDA2MiwgMHgwMDcxLCAweDAzOTEsIDB4MDM5NiwgMHgwM2IxLCAweDAzYjYgfTsKKyAgaiA9IDE7CisgIExpbmUgZHVwOworICBMaW5lIGJvdW5kOworICBpbnQzMl90IGR1cHMgPSAwOworICB3aGlsZShqIDwgc2l6ZSkgeworICAgIGR1cHMgPSAwOworICAgIGZvcihpID0gMDsgaSA8IHNpemVvZihkdXBjaCkvc2l6ZW9mKGR1cGNoWzBdKTsgaSsrKSB7CisgICAgICBkdXAuc2V0VG8oZHVwY2hbaV0pOworICAgICAgZHVwLmFwcGVuZChkdXBjaFtpXSk7CisgICAgICBib3VuZC5zZXRUbyhkdXBjaFtpXSk7CisgICAgICBib3VuZC5hcHBlbmQodG9Tb3J0W3NpemUtal0tPm5hbWUsIHRvU29ydFtzaXplLWpdLT5sZW4pOworICAgICAgaWYocHJvYmUuZ2V0U3RyZW5ndGgoZHVwLCBib3VuZCkgPj0gVUNPTF9JREVOVElDQUwpIHsKKyAgICAgICAgZHVwcysrOworICAgICAgfQorICAgIH0KKyAgICBpZihkdXBzID09IDApIHsKKyAgICAgIGJyZWFrOworICAgIH0gZWxzZSB7CisgICAgICBpZighZHVwbGljYXRvcnMpIHsKKyAgICAgICAgZHVwbGljYXRvcnMgPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgICB9CisgICAgICBkdXBsaWNhdG9ycy0+cHV0KFVuaWNvZGVTdHJpbmcodG9Tb3J0W3NpemUtal0tPm5hbWUsIHRvU29ydFtzaXplLWpdLT5sZW4pLCAmdG9Tb3J0W3NpemUtal0sIHN0YXR1cyk7CisgICAgICBkZWJ1Zy0+bG9nKHRvU29ydFtzaXplLWpdLT50b1N0cmluZygpKTsKKyAgICAgIGRlYnVnLT5sb2coIiBpcyBub3QgZ29vZCBlbm91Z2ggdG8gYmUgYW4gdXBwZXIgYm91bmRcbiIpOworICAgICAgaisrOworICAgIH0KKyAgfQorICBpZihqID09IHNpemUpIHsKKyAgICBkZWJ1Zy0+bG9nKCJPaSEgSSdtIGhhbGx1Y2luYXRpbmcuIFdpbGwgdXNlIHRoZSBmaXJzdCB1cHBlciBib3VuZCIpOworICAgIGRlbGV0ZSBkdXBsaWNhdG9yczsKKyAgICBkdXBsaWNhdG9ycyA9IE5VTEw7CisgICAgaiA9IDE7CisgIH0KKy8qCisgIGogPSAxOworICB3aGlsZShleGNsdWRlQm91bmRzLmNvbnRhaW5zKFVuaWNvZGVTdHJpbmcodG9Tb3J0W3NpemUtal0tPm5hbWUsIHRvU29ydFtzaXplLWpdLT5sZW4pKSkgeworICAgIGorKzsKKyAgfQorKi8KKyAgVUJbc3RyZW5ndGhdID0gdG9Tb3J0W3NpemUtal07CisgIGZvcihpID0gMDsgaSA8IFVDT0xfT0ZGOyBpKyspIHsKKyAgICBpZihVQltpXSkgeworICAgICAgLy9kZWJ1Zy0+bG9nKFVCW2ldLCBUUlVFKTsKKyAgICAgIGRlYnVnLT5sb2coVUJbaV0tPnRvU3RyaW5nKFRSVUUpLCBUUlVFKTsKKyAgICB9CisgIH0KK30KKworLy8gY2xhc3NpZmllcyByZXBlcnRvaXJlIGFjY29yZGluZyB0byB0aGUgc3RyZW5ndGggb2YgdGhlaXIgZGlmZmVyZW5jZQorLy8gZnJvbSB0aGUgZW1wdHkgc3RyaW5nCit2b2lkCitTb3J0ZWRMaW5lczo6Y2xhc3NpZnlSZXBlcnRvaXJlKCkgeworICBVQ29sQXR0cmlidXRlVmFsdWUgc3Ryb25nZXN0U3RyZW5ndGhGcm9tRW1wdHkgPSBVQ09MX09GRjsKKyAgaW50MzJfdCBsYXN0Q2hhbmdlID0gMDsKKyAgaW50MzJfdCBpID0gMCwgaiA9IDA7CisgIHdoaWxlKGkgPCBzaXplKSAvLyAmJiBwcm9iZS5kaXN0YW5jZUZyb21FbXB0eVN0cmluZygqdG9Tb3J0W2ldKSA+IFVDT0xfUFJJTUFSWSkgCisgIHsKKyAgICB0b1NvcnRbaV0tPnN0cmVuZ3RoRnJvbUVtcHR5ID0gcHJvYmUuZGlzdGFuY2VGcm9tRW1wdHlTdHJpbmcoKnRvU29ydFtpXSk7CisgICAgaWYodG9Tb3J0W2ldLT5zdHJlbmd0aEZyb21FbXB0eSA8IHN0cm9uZ2VzdFN0cmVuZ3RoRnJvbUVtcHR5KSB7CisgICAgICBzdHJvbmdlc3RTdHJlbmd0aEZyb21FbXB0eSA9IHRvU29ydFtpXS0+c3RyZW5ndGhGcm9tRW1wdHk7CisgICAgICBsYXN0Q2hhbmdlID0gaTsKKyAgICB9IGVsc2UgaWYgKHRvU29ydFtpXS0+c3RyZW5ndGhGcm9tRW1wdHkgPiBzdHJvbmdlc3RTdHJlbmd0aEZyb21FbXB0eSkgeyAKKyAgICAgIC8vIHRoZXJlIGlzIGEgcHJvYmxlbSBpbiBkZXRlY3Rpb24uIE1vc3QgcHJvYmFibHkgYSBxdWF0ZXJuYXJ5LgorICAgICAgLy8gd2h5IGRvbid0IHdlIHRyeSB0byBpbnRlcnBvbGF0ZQorICAgICAgVUNvbEF0dHJpYnV0ZVZhbHVlIG5leHRTdHJlbmd0aCA9IFVDT0xfT0ZGOworICAgICAgVUNvbEF0dHJpYnV0ZVZhbHVlIHByZXZTdHJlbmd0aCA9IFVDT0xfT0ZGOworICAgICAgVUNvbEF0dHJpYnV0ZVZhbHVlIHN0ID0gVUNPTF9PRkY7CisKKyAgICAgIGxvZ2dlci0+bG9nKCJJbnRlcnBvbGF0aW5nIHRvIGdldCB0aGUgZGlzdGFuY2UgZnJvbSBlbXB0eSBmb3IgTGluZSAiKTsKKyAgICAgIGxvZ2dlci0+bG9nKHRvU29ydFtpXS0+dG9TdHJpbmcoVFJVRSksIFRSVUUpOworCisgICAgICBpZihpKSB7CisgICAgICAgIHN0ID0gcHJvYmUuZ2V0U3RyZW5ndGgoKnRvU29ydFtpLTFdLCAqdG9Tb3J0W2ldKTsKKyAgICAgICAgaWYoc3QgPT0gVUNPTF9PRkYpIHsKKyAgICAgICAgICBsb2dnZXItPmxvZygiQ2Fubm90IGRlZHVjZSBkaXN0YW5jZSBmcm9tIGVtcHR5IHVzaW5nIHByZXZpb3VzIGVsZW1lbnQuIFNvbWV0aGluZyBpcyB2ZXJ5IHdyb25nISBMaW5lOiIpOworICAgICAgICAgIGxvZ2dlci0+bG9nKHRvU29ydFtpXS0+dG9TdHJpbmcoVFJVRSksIFRSVUUpOworICAgICAgICB9IGVsc2UgaWYoc3QgPT0gVUNPTF9JREVOVElDQUwgfHwgc3QgPj0gdG9Tb3J0W2ktMV0tPnN0cmVuZ3RoRnJvbUVtcHR5KSB7CisgICAgICAgICAgcHJldlN0cmVuZ3RoICA9IHRvU29ydFtpLTFdLT5zdHJlbmd0aEZyb21FbXB0eTsKKyAgICAgICAgfSBlbHNlIGlmKHN0IDwgdG9Tb3J0W2ktMV0tPnN0cmVuZ3RoRnJvbUVtcHR5KSB7IAorICAgICAgICAgIHByZXZTdHJlbmd0aCA9IHN0OworICAgICAgICB9CisgICAgICAgIHRvU29ydFtpXS0+c3RyZW5ndGhGcm9tRW1wdHkgPSBwcmV2U3RyZW5ndGg7CisgICAgICB9CisgICAgICBpZihpIDwgc2l6ZS0yKSB7CisgICAgICAgIHRvU29ydFtpKzFdLT5zdHJlbmd0aEZyb21FbXB0eSA9IHByb2JlLmRpc3RhbmNlRnJvbUVtcHR5U3RyaW5nKCp0b1NvcnRbaSsxXSk7CisgICAgICAgIHN0ID0gcHJvYmUuZ2V0U3RyZW5ndGgoKnRvU29ydFtpKzFdLCAqdG9Tb3J0W2ldKTsKKyAgICAgICAgaWYoc3QgPT0gVUNPTF9PRkYpIHsKKyAgICAgICAgICBsb2dnZXItPmxvZygiQ2Fubm90IGRlZHVjZSBkaXN0YW5jZSBmcm9tIGVtcHR5IHVzaW5nIG5leHQgZWxlbWVudC4gU29tZXRoaW5nIGlzIHZlcnkgd3JvbmchIExpbmU6Iik7CisgICAgICAgICAgbG9nZ2VyLT5sb2codG9Tb3J0W2ldLT50b1N0cmluZyhUUlVFKSwgVFJVRSk7CisgICAgICAgIH0gZWxzZSBpZihzdCA9PSBVQ09MX0lERU5USUNBTCB8fCBzdCA8IHRvU29ydFtpKzFdLT5zdHJlbmd0aEZyb21FbXB0eSkgeworICAgICAgICAgIG5leHRTdHJlbmd0aCA9IHRvU29ydFtpKzFdLT5zdHJlbmd0aEZyb21FbXB0eTsKKyAgICAgICAgfSBlbHNlIGlmKHN0ID49IHRvU29ydFtpKzFdLT5zdHJlbmd0aEZyb21FbXB0eSkgeyAKKyAgICAgICAgICBuZXh0U3RyZW5ndGggPSBzdDsKKyAgICAgICAgfSAgICAgICAgCisgICAgICAgIGlmKGkpIHsKKyAgICAgICAgICBpZihwcmV2U3RyZW5ndGggIT0gbmV4dFN0cmVuZ3RoKSB7CisgICAgICAgICAgICBsb2dnZXItPmxvZygiSW5jb25zaXN0ZW50IHJlc3VsdHMgZnJvbSBpbnRlcnBvbGF0aW9uISBSZXN1bHRzIHdpbGwgbW9zdCBsaWtlbHkgYmUgd3JvbmdcbiIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0b1NvcnRbaV0tPnN0cmVuZ3RoRnJvbUVtcHR5ID0gbmV4dFN0cmVuZ3RoOworICAgICAgfQorICAgICAgLyoKKyAgICAgIFVDb2xBdHRyaWJ1dGVWYWx1ZSBwcm9ibGVtU3RyZW5ndGggPSBVQ09MX1BSSU1BUlk7CisgICAgICBmb3IoaiA9IGxhc3RDaGFuZ2U7IGogPCBpIDsgaisrKSB7CisgICAgICAgIGlmKHRvU29ydFtqXS0+c3RyZW5ndGggPiBwcm9ibGVtU3RyZW5ndGgpIHsKKyAgICAgICAgICBwcm9ibGVtU3RyZW5ndGggPSB0b1NvcnRbal0tPnN0cmVuZ3RoOworICAgICAgICB9CisgICAgICB9CisgICAgICBmb3IoaiA9IGxhc3RDaGFuZ2U7IGogPCBpIDsgaisrKSB7CisgICAgICAgIHRvU29ydFtqXS0+c3RyZW5ndGhGcm9tRW1wdHkgPSBwcm9ibGVtU3RyZW5ndGg7CisgICAgICB9CisgICAgICBzdHJvbmdlc3RTdHJlbmd0aEZyb21FbXB0eSA9IHRvU29ydFtpXS0+c3RyZW5ndGhGcm9tRW1wdHk7CisgICAgICBsYXN0Q2hhbmdlID0gaTsKKyAgICAgIGRlYnVnLT5sb2coIlByb2JsZW0gZGV0ZWN0ZWQgaW4gZGlzdGFuY2VzIGZyb20gZW1wdHkuIE1vc3QgcHJvYmFibHkgd29yZCBzb3J0IGlzIG9uXG4iKTsKKyAgICAgICovCisgICAgICB3b3JkU29ydCA9IFRSVUU7CisgICAgfQorICAgIGkrKzsKKyAgfQorICBkZWJ1Zy0+bG9nKCJEaXN0YW5jZXMgZnJvbSBlbXB0eSBzdHJpbmdcbiIpOworICBkZWJ1Zy0+bG9nKHRvU3RyaW5nRnJvbUVtcHR5KCksIFRSVUUpOworfQorCit2b2lkCitTb3J0ZWRMaW5lczo6YW5hbHlzZShVRXJyb3JDb2RlICZzdGF0dXMpIHsKKyAgZnJlbmNoU2Vjb25kYXJ5ID0gcHJvYmUuaXNGcmVuY2hTZWNvbmRhcnkoc3RhdHVzKTsKKyAgaWYoVV9GQUlMVVJFKHN0YXR1cykpIHsKKyAgICBsb2dnZXItPmxvZygiVGVzdCBmb3IgRnJlbmNoIHNlY29uZGFyeSBmYWlsZWQuIEJhaWxpbmcgb3V0IVxuIik7CisgICAgcmV0dXJuOworICB9CisgIGxvZ2dlci0+bG9nKCJGcmVuY2ggc2Vjb25kYXJ5IHZhbHVlIGlzICVpXG4iLCBmcmVuY2hTZWNvbmRhcnksIGZyZW5jaFNlY29uZGFyeSk7CisgIHVwcGVyRmlyc3QgPSBwcm9iZS5pc1VwcGVyRmlyc3Qoc3RhdHVzKTsKKyAgaWYoVV9GQUlMVVJFKHN0YXR1cykpIHsKKyAgICBsb2dnZXItPmxvZygiVGVzdCBmb3IgdXBwZXIgZmlyc3QgZmFpbGVkLiBCYWlsaW5nIG91dCFcbiIpOworICAgIHJldHVybjsKKyAgfQorICBsb2dnZXItPmxvZygidXBwZXIgZmlyc3QgdmFsdWUgaXMgJWlcbiIsIHVwcGVyRmlyc3QsIHVwcGVyRmlyc3QpOworICBzb3J0KFRSVUUsIFRSVUUpOworICBjbGFzc2lmeVJlcGVydG9pcmUoKTsKKyAgZ2V0Qm91bmRzKHN0YXR1cyk7CisgIC8vc29ydChUUlVFLCBUUlVFKTsKKyAgYWRkQ29udHJhY3Rpb25zVG9SZXBlcnRvaXJlKHN0YXR1cyk7CisgIC8vc29ydChUUlVFLCBUUlVFKTsKKyAgZGVidWctPmxvZygiXG4qKiogT3JkZXIgYWZ0ZXIgZGV0ZWN0aW5nIGNvbnRyYWN0aW9uc1xuXG4iKTsKKyAgY2FsY3VsYXRlU29ydEtleXMoKTsKKyAgZGVidWctPmxvZyh0b1ByZXR0eVN0cmluZyhGQUxTRSwgVFJVRSksIFRSVUUpOworICBkZXRlY3RFeHBhbnNpb25zKCk7Cit9CisKK3ZvaWQgU29ydGVkTGluZXM6OmluaXQoKSAKK3sKKyAgc2l6ZSA9IHJlcGVydG9pcmUuc2l6ZSgpOworICBjYXBhY2l0eSA9IDUqc2l6ZTsKKyAgbGluZXMgPSBuZXcgTGluZVtjYXBhY2l0eV07CisgIGluaXQocmVwZXJ0b2lyZSwgbGluZXMpOworfQorCit2b2lkIFNvcnRlZExpbmVzOjppbml0KFVuaWNvZGVTZXQgJnJlcCwgTGluZSAqbGluKQoreworCisgIFVuaWNvZGVTZXRJdGVyYXRvciBleGVtcGxhclVTZXRJdGVyKHJlcCk7CisgIGludDMyX3Qgc2l6ZSA9IDA7CisKKyAgd2hpbGUoZXhlbXBsYXJVU2V0SXRlci5uZXh0KCkpIHsKKyAgICBMaW5lICpjdXJyTGluZSA9IGxpbitzaXplOworICAgIGlmKGV4ZW1wbGFyVVNldEl0ZXIuaXNTdHJpbmcoKSkgeyAvLyBwcm9jZXNzIGEgc3RyaW5nCisgICAgICBjdXJyTGluZS0+c2V0VG8oZXhlbXBsYXJVU2V0SXRlci5nZXRTdHJpbmcoKSk7CisgICAgfSBlbHNlIHsgLy8gcHJvY2VzcyBjb2RlIHBvaW50CisgICAgICBjdXJyTGluZS0+c2V0VG8oZXhlbXBsYXJVU2V0SXRlci5nZXRDb2RlcG9pbnQoKSk7CisgICAgfQorICAgIGN1cnJMaW5lLT5uYW1lW2N1cnJMaW5lLT5sZW5dID0gMDsgLy8gemVybyB0ZXJtaW5hdGUsIGZvciBvdXIgZXZpbCB3YXlzCisgICAgLy9jdXJyTGluZS0+aW5kZXggPSBzaXplOworICAgIHNpemUrKzsKKyAgfQorfQorCit2b2lkIAorU29ydGVkTGluZXM6OnNldFNvcnRpbmdBcnJheShMaW5lICoqc29ydGluZ0FycmF5LCBMaW5lICplbGVtZW50cywgaW50MzJfdCBzaXplVG9Tb3J0KSB7CisgIGludDMyX3QgaSA9IDA7CisgIGZvcihpID0gMDsgaSA8IHNpemVUb1NvcnQ7IGkrKykgeworICAgIHNvcnRpbmdBcnJheVtpXSA9ICZlbGVtZW50c1tpXTsKKyAgfQorfQorCitpbnQzMl90CitTb3J0ZWRMaW5lczo6c2V0U29ydGluZ0FycmF5KExpbmUgKipzb3J0aW5nQXJyYXksIEhhc2h0YWJsZSAqdGFibGUpIHsKKyAgaW50MzJfdCBzaXplID0gdGFibGUtPmNvdW50KCk7CisgIGludDMyX3QgaGFzaEluZGV4ID0gLTE7CisgIGNvbnN0IFVIYXNoRWxlbWVudCAqaGFzaEVsZW1lbnQgPSBOVUxMOworICBpbnQzMl90IGNvdW50ID0gMDsKKyAgd2hpbGUoKGhhc2hFbGVtZW50ID0gdGFibGUtPm5leHRFbGVtZW50KGhhc2hJbmRleCkpICE9IE5VTEwpIHsKKyAgICBzb3J0aW5nQXJyYXlbY291bnQrK10gPSAoTGluZSAqKWhhc2hFbGVtZW50LT52YWx1ZS5wb2ludGVyOworICB9CisgIHJldHVybiBzaXplOworfQorCit2b2lkCitTb3J0ZWRMaW5lczo6c29ydChMaW5lICoqc29ydGluZ0FycmF5LCBpbnQzMl90IHNpemVUb1NvcnQsIFVCb29sIHNldFN0cmVuZ3RocywgVUJvb2wgbGluaykgeworICBpbnQzMl90IGkgPSAwOworICBpbnQzMl90IGVxdWFsU3RhcnQgPSAwOworICBVQ29sQXR0cmlidXRlVmFsdWUgZXF1YWxTdHJlbmd0aCA9IFVDT0xfT0ZGOworCisgIHFzb3J0KHNvcnRpbmdBcnJheSwgc2l6ZVRvU29ydCwgc2l6ZW9mKExpbmUgKiksIHByb2JlLmNvbXBhcmVyKTsKKworICBpZihzZXRTdHJlbmd0aHMpIHsgLy8gYW5hbHl6ZSBzdHJlbmd0aHMKKyAgICBmb3IoaSA9IDE7IGkgPCBzaXplVG9Tb3J0OyBpKyspIHsKKyAgICAgIHNvcnRpbmdBcnJheVtpXS0+c3RyZW5ndGggPSBwcm9iZS5nZXRTdHJlbmd0aCgqc29ydGluZ0FycmF5W2ktMV0sICpzb3J0aW5nQXJyYXlbaV0pOworICAgIH0KKyAgICAvLyBmb3IgZXF1YWwgZ3V5cywgZG8gdGhlIGNvZGUgcG9pbnQgb3JkZXJpbmcKKyAgICAKKyAgICBpID0gMTsKKyAgICB3aGlsZShpIDwgc2l6ZVRvU29ydCkgCisgICAgeworICAgICAgaWYoc29ydGluZ0FycmF5W2ldLT5zdHJlbmd0aCA9PSBVQ09MX0lERU5USUNBTCkgeworICAgICAgICBlcXVhbFN0YXJ0ID0gaSAtIDE7CisgICAgICAgIGVxdWFsU3RyZW5ndGggPSBzb3J0aW5nQXJyYXlbZXF1YWxTdGFydF0tPnN0cmVuZ3RoOworICAgICAgICBzb3J0aW5nQXJyYXlbZXF1YWxTdGFydF0tPnN0cmVuZ3RoID0gVUNPTF9JREVOVElDQUw7CisgICAgICAgIHdoaWxlKGkgPCBzaXplVG9Tb3J0ICYmIHNvcnRpbmdBcnJheVtpXS0+c3RyZW5ndGggPT0gVUNPTF9JREVOVElDQUwpIHsKKyAgICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICAgICAgcXNvcnQoc29ydGluZ0FycmF5K2VxdWFsU3RhcnQsIGktZXF1YWxTdGFydCwgc2l6ZW9mKExpbmUgKiksIGNvZGVQb2ludENtcCk7CisgICAgICAgIHNvcnRpbmdBcnJheVtlcXVhbFN0YXJ0XS0+c3RyZW5ndGggPSBlcXVhbFN0cmVuZ3RoOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaSsrOworICAgICAgfQorICAgIH0KKyAgICAKKyAgfQorCisKKworICBpZihsaW5rKSB7IC8vIGRvIHRoZSBsaW5raW5nCisgICAgZm9yKGkgPSAwOyBpIDwgc2l6ZVRvU29ydCAtIDE7IGkrKykgeworICAgICAgTGluZSAqY3VyciA9ICooc29ydGluZ0FycmF5K2kpOworICAgICAgY3Vyci0+bmV4dCA9ICooc29ydGluZ0FycmF5K2krMSk7CisgICAgICAoKihzb3J0aW5nQXJyYXkraSsxKSktPnByZXZpb3VzID0gY3VycjsKKyAgICB9CisgIH0KK30KKwordm9pZAorU29ydGVkTGluZXM6OnNvcnQoVUJvb2wgc2V0U3RyZW5ndGhzLCBVQm9vbCBsaW5rKSB7CisgIGlmKHRvU29ydENhcGFjaXR5IDwgc2l6ZSB8fCAhdG9Tb3J0KSB7CisgICAgaWYodG9Tb3J0KSB7CisgICAgICBkZWxldGVbXSB0b1NvcnQ7CisgICAgfQorICAgIHRvU29ydCA9IG5ldyBMaW5lKltzaXplKjJdOworICAgIHRvU29ydENhcGFjaXR5ID0gc2l6ZSoyOworICB9CisKKyAgc2V0U29ydGluZ0FycmF5KHRvU29ydCwgbGluZXMsIHNpemUpOworICBzb3J0KHRvU29ydCwgc2l6ZSwgc2V0U3RyZW5ndGhzLCBsaW5rKTsKKworICBmaXJzdCA9IGxhc3QgPSBOVUxMOworCisgIGlmKGxpbmspIHsgLy8gZG8gdGhlIGxpbmtpbmcKKyAgICBmaXJzdCA9ICp0b1NvcnQ7CisgICAgbGFzdCA9ICoodG9Tb3J0K3NpemUtMSk7CisgIH0KK30KKwordm9pZAorU29ydGVkTGluZXM6OnVwZGF0ZUJvdW5kcyhVbmljb2RlU2V0ICZzZXQpIHsKKyAgTGluZSBsaW5lOworICBVbmljb2RlU3RyaW5nIHMxOworICBVbmljb2RlU2V0SXRlcmF0b3IgaXQxKHNldCk7IAorICB3aGlsZShpdDEubmV4dCgpKSB7CisgICAgaWYoIWRlYnVnLT5pc09uKCkpIHsKKyAgICAgIGxvZ2dlci0+bG9nKCIuIik7CisgICAgfQorICAgIGlmKGl0MS5pc1N0cmluZygpKSB7IC8vIHByb2Nlc3MgYSBzdHJpbmcKKyAgICAgIHMxLnNldFRvKGl0MS5nZXRTdHJpbmcoKSk7CisgICAgfSBlbHNlIHsgLy8gcHJvY2VzcyBjb2RlIHBvaW50CisgICAgICBzMS5zZXRUbyhpdDEuZ2V0Q29kZXBvaW50KCkpOworICAgIH0KKyAgICAvL2xpbmUuc2V0VG8oczEpOworICAgIFVDb2xBdHRyaWJ1dGVWYWx1ZSBzdHJlbmd0aCA9IHByb2JlLmRpc3RhbmNlRnJvbUVtcHR5U3RyaW5nKHMxKTsKKyAgICBpZihwcm9iZS5jb21wYXJlKFVuaWNvZGVTdHJpbmcoVUJbc3RyZW5ndGhdLT5uYW1lKSwgczEpIDwgMCkgeworICAgICAgLy8gVE9ETzogbGVhayBoZXJlIC0gZml4aXQhCisgICAgICBVQltzdHJlbmd0aF0gPSBuZXcgTGluZShzMSk7CisgICAgICAvL3Vfc3RyY3B5KFVCW3N0cmVuZ3RoXSwgczEuZ2V0VGVybWluYXRlZEJ1ZmZlcigpKTsKKyAgICB9CisgIH0KKworCisKK30KKwordm9pZCBTb3J0ZWRMaW5lczo6YWRkQWxsKExpbmUqIHRvQWRkLCBpbnQzMl90IHRvQWRkU2l6ZSkgCit7CisgIGlmKHNpemUrdG9BZGRTaXplID4gY2FwYWNpdHkpIHsKKyAgICBpbnQzMl90IGRvR3Jvd2luZ0JyZWFrcG9pbnQgPSAwOworICAgIC8vIHdlIG5lZWQgdG8gZG8gZ3Jvd2luZyBoZXJlCisgIH0KKyAgaW50MzJfdCBpID0gMDsKKworICBmb3IoaSA9IDA7IGkgPCB0b0FkZFNpemU7IGkrKykgeworICAgIGxpbmVzW3NpemUraV0gPSB0b0FkZFtpXTsKKyAgfQorICBzaXplICs9IHRvQWRkU2l6ZTsKK30KKwordm9pZCBTb3J0ZWRMaW5lczo6c2V0RGlzdGFuY2VzRnJvbUVtcHR5KExpbmUqIGFycmF5LCBpbnQzMl90IGFycmF5U2l6ZSkKK3sKKyAgaW50MzJfdCBpID0gMDsKKyAgZm9yKGkgPSAwOyBpIDwgYXJyYXlTaXplOyBpKyspIHsKKyAgICBhcnJheVtpXS5zdHJlbmd0aEZyb21FbXB0eSA9IHByb2JlLmRpc3RhbmNlRnJvbUVtcHR5U3RyaW5nKGFycmF5W2ldKTsKKyAgfQorfQorCisKKy8vIGFkZHMgY29udHJhY3Rpb25zIGluIHRvIHJlcGVydG9pcmUKK2ludDMyX3QgU29ydGVkTGluZXM6OmFkZENvbnRyYWN0aW9uc1RvUmVwZXJ0b2lyZShVRXJyb3JDb2RlICZzdGF0dXMpIAoreworICBsb2dnZXItPmxvZygiXG4qKiogRGV0ZWN0aW5nIGNvbnRyYWN0aW9uc1xuXG4iKTsKKyAgY29udHJhY3Rpb25zVGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7CisgIGludDMyX3Qgbm9Db250cyA9IDA7CisgIGludDMyX3QgYWxsb2NhdGVTaXplID0gNTAqc2l6ZTsKKyAgLy8gZmlyc3QgY2hlY2sgZm9yIHNpbXBsZSBjb250cmFjdGlvbnMKKyAgTGluZSogZGVsdGEgPSBuZXcgTGluZVthbGxvY2F0ZVNpemVdOworICBMaW5lKiogZGVsdGFTb3J0ZWQgPSBuZXcgTGluZSpbYWxsb2NhdGVTaXplXTsKKyAgTGluZSogbGVzc2VyVG9BZGRUbyA9IG5ldyBMaW5lW2FsbG9jYXRlU2l6ZV07CisgIExpbmUqIG5ld0RlbHRhID0gbmV3IExpbmVbYWxsb2NhdGVTaXplXTsKKyAgTGluZSoqIG5ld0RlbHRhU29ydGVkID0gbmV3IExpbmUqW2FsbG9jYXRlU2l6ZV07CisgIExpbmUqIGRlbHRhUCA9IGRlbHRhOyAKKyAgTGluZSoqIGRlbHRhUFAgPSBkZWx0YVNvcnRlZDsKKyAgTGluZSogbmV3RGVsdGFQID0gbmV3RGVsdGE7CisgIGludDMyX3QgZGVsdGFTaXplID0gMCwgbGVzc2VyVG9BZGRUb1NpemUgPSAwLCBuZXdEZWx0YVNpemUgPSAwOworICBsb2dnZXItPmxvZygiKysgQ29udHJhY3Rpb24gZGV0ZWN0aW9uIGdlbmVyYXRpb24gMFxuIik7CisgIG5vQ29udHMgPSBkZXRlY3RDb250cmFjdGlvbnModG9Tb3J0LCBzaXplLCB0b1NvcnQsIHNpemUsIAorCQkJICAgICAgIGRlbHRhLCBkZWx0YVNpemUsIGxlc3NlclRvQWRkVG8sIGxlc3NlclRvQWRkVG9TaXplLCAzKnNpemUsIHN0YXR1cyk7CisgIHNldFNvcnRpbmdBcnJheShkZWx0YVNvcnRlZCwgZGVsdGEsIGRlbHRhU2l6ZSk7CisgIHNvcnQoZGVsdGFTb3J0ZWQsIGRlbHRhU2l6ZSwgVFJVRSk7CisKKyAgc2V0RGlzdGFuY2VzRnJvbUVtcHR5KGRlbHRhLCBkZWx0YVNpemUpOworICBpbnQzMl90IGRlbHRhUFNpemUgPSBkZWx0YVNpemU7CisgIC8vdXBkYXRlQm91bmRzKGRlbHRhKTsKKworICBpbnQzMl90IGdlbmVyYXRpb24gPSAwOworICAvLyBpZiB3ZSBmb3VuZCBhbnksIHdlIGhhdmUgdG8gdHJ5IG11bHRpcGxlIGNvbnRyYWN0aW9ucworICAvLyBIb3dldmVyLCB3ZSB3YW50IHRvIHByZXZlbnQgdGhlIGNvbnRyYWN0aW9ucyBleHBsb3Npb24KKyAgLy8gaWYgdGhlIG51bWJlciBvZiBzaW1wbGUgY29udHJhY3Rpb25zIGlzIGdyZWF0ZXIgdGhhbiB0aGUKKyAgLy8gc3RhcnRpbmcgc2l6ZSwgY2hhbmNlcyBhcmUgdGhhdCB3ZSBlaXRoZXIgaGF2ZSBhbiBhbGdvcml0aG1pYworICAvLyBjb250cmFjdGlvbiAobGlrZSBpdGVyYXRpb24gbWFya3Mgb24gdzJrKSBvciBzb21ldGhpbmcKKyAgLy8gaXMgc2VyaW9zbHkgd3JvbmcuCisgIGlmKGRlbHRhUFNpemUgPCBzaXplLzIpIHsKKyAgICB3aGlsZSAoZGVsdGFQU2l6ZSAmJiBnZW5lcmF0aW9uIDwgMSkgeworICAgICAgZ2VuZXJhdGlvbisrOworICAgICAgbG9nZ2VyLT5sb2coIlxuKysgQ29udHJhY3Rpb24gZGV0ZWN0aW9uIGdlbmVyYXRpb24gJWlcbiIsIGdlbmVyYXRpb24sIGdlbmVyYXRpb24pOworICAgICAgLy8gZmluZCBtb3JlLCBidXQgYXZvaWQgdGVzdGluZyB0aGUgY29tYmluYXRpb25zIHdlIGFscmVhZHkgaGF2ZQorICAgICAgbm9Db250cyArPSBkZXRlY3RDb250cmFjdGlvbnModG9Tb3J0LCBzaXplLCBkZWx0YVBQLCBkZWx0YVBTaXplLAorCQkJCSAgICBuZXdEZWx0YVAsIG5ld0RlbHRhU2l6ZSwgbGVzc2VyVG9BZGRUbywgbGVzc2VyVG9BZGRUb1NpemUsIDMqc2l6ZSwgc3RhdHVzKTsKKyAgICAgIG5vQ29udHMgKz0gZGV0ZWN0Q29udHJhY3Rpb25zKGRlbHRhUFAsIGRlbHRhUFNpemUsIHRvU29ydCwgc2l6ZSwgCisJCQkJICAgIG5ld0RlbHRhUCwgbmV3RGVsdGFTaXplLCBsZXNzZXJUb0FkZFRvLCBsZXNzZXJUb0FkZFRvU2l6ZSwgMypzaXplLCBzdGF0dXMpOworICAgICAgY2FsY3VsYXRlU29ydEtleXMoKTsKKworICAgICAgYWRkQWxsKGRlbHRhUCwgZGVsdGFQU2l6ZSk7CisgICAgICBzZXRTb3J0aW5nQXJyYXkodG9Tb3J0LCBsaW5lcywgc2l6ZSk7CisgICAgICBzb3J0KFRSVUUsIFRSVUUpOworICAgICAgc2V0U29ydGluZ0FycmF5KG5ld0RlbHRhU29ydGVkLCBuZXdEZWx0YVAsIG5ld0RlbHRhU2l6ZSk7CisgICAgICBzb3J0KG5ld0RlbHRhU29ydGVkLCBuZXdEZWx0YVNpemUsIFRSVUUpOworCSAgCisgICAgICAvLyBpZiBubyBuZXcgb25lcywgYmFpbAorICAgICAgLy9pZiAobmV3RGVsdGFTaXplID09IDApIGJyZWFrOworCisgICAgICBkZWx0YVBTaXplID0gbmV3RGVsdGFTaXplOworICAgICAgbmV3RGVsdGFTaXplID0gMDsKKyAgICAgIGlmKGRlbHRhUCA9PSBkZWx0YSkgeworICAgICAgICBkZWx0YVAgPSBuZXdEZWx0YTsKKyAgICAgICAgZGVsdGFQUCA9IG5ld0RlbHRhU29ydGVkOworICAgICAgICBuZXdEZWx0YVAgPSBkZWx0YTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRlbHRhUCA9IGRlbHRhOworICAgICAgICBkZWx0YVBQID0gZGVsdGFTb3J0ZWQ7CisgICAgICAgIG5ld0RlbHRhUCA9IG5ld0RlbHRhOworICAgICAgfQorICAgICAgc2V0RGlzdGFuY2VzRnJvbUVtcHR5KGRlbHRhUCwgZGVsdGFQU2l6ZSk7CisgICAgfQorICB9CisgIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgLy8gYWRkIHN0dWZmIGZyb20gdGhlIGxhc3QgYmF0Y2gKKyAgYWRkQWxsKGRlbHRhUCwgZGVsdGFQU2l6ZSk7CisKKyAgLy8gd2FybmluZzogd2UgZG9uJ3QgYWRkIHRoZSBsZXNzZXIgb25lcyBpbiByZWN1cnNpdmVseSwgc2luY2UgdGhleSB3aWxsCisgIC8vIGluZmluaXRlbHkgbG9vcAorICBzZXREaXN0YW5jZXNGcm9tRW1wdHkobGVzc2VyVG9BZGRUbywgbGVzc2VyVG9BZGRUb1NpemUpOworICBhZGRBbGwobGVzc2VyVG9BZGRUbywgbGVzc2VyVG9BZGRUb1NpemUpOworICBzZXRTb3J0aW5nQXJyYXkodG9Tb3J0LCBsaW5lcywgc2l6ZSk7CisgIHNvcnQoVFJVRSwgVFJVRSk7CisKKyAgZGVsZXRlW10gZGVsdGFTb3J0ZWQ7CisgIGRlbGV0ZVtdIGRlbHRhOworICBkZWxldGVbXSBsZXNzZXJUb0FkZFRvOworICBkZWxldGVbXSBuZXdEZWx0YVNvcnRlZDsKKyAgZGVsZXRlW10gbmV3RGVsdGE7CisgIHJldHVybiBub0NvbnRzOworfQorCisKK2ludDMyX3QgU29ydGVkTGluZXM6OmRldGVjdENvbnRyYWN0aW9ucyhMaW5lICoqZmlyc3RSZXAsIGludDMyX3QgZmlyc3RTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpbmUgKipzZWNvbmRSZXAsIGludDMyX3Qgc2Vjb25kU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaW5lICp0b0FkZFRvLCBpbnQzMl90ICZ0b0FkZFRvU2l6ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGluZSAqbGVzc2VyVG9BZGRUbywgaW50MzJfdCAmbGVzc2VyVG9BZGRUb1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjYXBhY2l0eSwgVUVycm9yQ29kZSAmc3RhdHVzKSAKK3sKKyAgaW50MzJfdCBub0NvbnRzID0gMDsKKyAgaW50IGkgPSAwLCBqID0gMCwgayA9IDA7CisgIExpbmUgbG93ZXIsIHVwcGVyLCB0cmlhbCwgdG9BZGQsIGhlbHBlcjsKKyAgVUNoYXIzMiBmaXJzdFN0YXJ0LCBmaXJzdEVuZCwgc2Vjb25kU3RhcnQ7CisgIFVDaGFyIE5GQ1RyaWFsWzI1Nl07CisgIGludDMyX3QgTkZDVHJpYWxMZW4gPSAwOworICBVQm9vbCB0aGFpOworICBpID0gLTE7CisgIHdoaWxlKGkgPCBmaXJzdFNpemUtMSAmJiBVX1NVQ0NFU1Moc3RhdHVzKSkgeworICAgIGkrKzsKKyAgICBpZighZGVidWctPmlzT24oKSkgeworICAgICAgbG9nZ2VyLT5sb2coIlxyVGVzdGluZyAlMDVpLyUwNWkuIEZvdW5kICUwNWkgY29udHMuIiwgaSwgZmlyc3RTaXplLCBub0NvbnRzKTsKKyAgICB9CisgICAgVTE2X0dFVChmaXJzdFJlcFtpXS0+bmFtZSwgMCwgMCwgZmlyc3RSZXBbaV0tPmxlbiwgZmlyc3RTdGFydCk7CisgICAgaWYodXNjcmlwdF9nZXRTY3JpcHQoZmlyc3RTdGFydCwgJnN0YXR1cykgPT0gVVNDUklQVF9IQU4gfHwgZmlyc3RSZXBbaV0tPnN0cmVuZ3RoRnJvbUVtcHR5ID4gVUNPTF9QUklNQVJZKSAvL1VDT0xfVEVSVElBUlkpIAorICAgICAgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICBsb3dlciA9ICpmaXJzdFJlcFtpXTsKKyAgICBmb3IoaiA9IDA7IGogPCBzZWNvbmRTaXplOyBqKyspIHsKKyAgICAgIGlmKG5vQ29udHMgPT0gY2FwYWNpdHkpIHsKKyAgICAgICAgcmV0dXJuIG5vQ29udHM7CisgICAgICB9CisgICAgICBVMTZfR0VUKHNlY29uZFJlcFtqXS0+bmFtZSwgMCwgMCwgc2Vjb25kUmVwW2pdLT5sZW4sIHNlY29uZFN0YXJ0KTsKKyAgICAgIGlmKGZpcnN0U3RhcnQgPT0gMHg0MSAmJiBzZWNvbmRTdGFydCA9PSAweDMwOCkgeworICAgICAgaW50MzJfdCBwdXRCcmVha1BvaW50SGVyZSA9IDA7CisgICAgfQorICAgICAgaWYodXNjcmlwdF9nZXRTY3JpcHQoc2Vjb25kU3RhcnQsICZzdGF0dXMpID09IFVTQ1JJUFRfSEFOKSAvLyB8fCBzZWNvbmRSZXBbal0tPnN0cmVuZ3RoRnJvbUVtcHR5ID4gVUNPTF9URVJUSUFSWSkgCisJeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAJaWYoZHVwbGljYXRvcnMgJiYgZHVwbGljYXRvcnMtPmdldChVbmljb2RlU3RyaW5nKHNlY29uZFJlcFtqXS0+bmFtZSwgc2Vjb25kUmVwW2pdLT5sZW4pKSAhPSBOVUxMKSB7CisgICAgICAgICAgZGVidWctPmxvZygiU2tpcHBpbmcgZHVwbGljYXRvciAiKTsKKyAgICAgICAgICBkZWJ1Zy0+bG9nKHNlY29uZFJlcFtqXS0+dG9TdHJpbmcoKSwgVFJVRSk7CisJCSAgY29udGludWU7CisJCX0KKworICAgICAgaWYoZmlyc3RSZXBbaV0tPm5hbWVbMF0gPT0gMHg2MSAmJiBzZWNvbmRSZXBbal0tPm5hbWVbMF0gPT0gMHgzMDgpIHsKKwkgICAgaW50MzJfdCBwdXRCcmVha3BvaW50aGVyZSA9IDA7CisgICAgICB9CisgICAgICB1cHBlci5zZXRUb0NvbmNhdChmaXJzdFJlcFtpXSwgVUJbVUNPTF9QUklNQVJZXSk7CisgICAgICAvL3VwcGVyLnNldFRvQ29uY2F0KGZpcnN0UmVwW2ldLCBVQltzZWNvbmRSZXBbal0tPnN0cmVuZ3RoRnJvbUVtcHR5XSk7CisgICAgICB0b0FkZC5zZXRUb0NvbmNhdChmaXJzdFJlcFtpXSwgc2Vjb25kUmVwW2pdKTsgICAgICAgICAgCisgICAgICBVMTZfR0VUKGZpcnN0UmVwW2ldLT5uYW1lLCAwLCBmaXJzdFJlcFtpXS0+bGVuLTEsIGZpcnN0UmVwW2ldLT5sZW4sIGZpcnN0RW5kKTsKKyAgICAgIGlmKCh0aGFpID0gdV9oYXNCaW5hcnlQcm9wZXJ0eShmaXJzdEVuZCwgVUNIQVJfTE9HSUNBTF9PUkRFUl9FWENFUFRJT04pKSkgeworCS8vIHRoaXMgbWVhbnMgdGhhdCB0aGUgbG93ZXIgaXMgc2luZ2xlIHJlb3JkZXJpbmcgY2hhcmFjdGVyCisJLy8gaWYgd2UgZG8gdGhlIGxvd2VyIHRlc3Qgd2l0aG91dCB0YWtpbmcgdGhpcyBpbnRvIGFjY291bnQsCisJLy8gd2UnbGwgY29tcGFyaW5nIHRoZSBzZWNvbmRSZXAgZGlyZWN0bHkgdG8gVGhhaS4gV2UgYWRkIFVCW1VDT0xfUFJJTUFSWV0gdG8KKwkvLyBlbmQgb2YgbG93ZXIgYW5kIGluIHRoZSBtaWRkbGUgb2YgdHJpYWwsIHNvIHdlIHdpbGwgaGF2ZSAKKwkvLyBsb3dlciA9IFRoYWkgKyBVQiwgdHJpYWwgVGhhaSArIFVCICsgeCwgcmVzb2x2aW5nIHRvCisJLy8gVUIgKyBUaGFpIHZzIFVCICsgVGhhaSArIHguCisJLy8gZm9yIHVwcGVyIGJvdW5kLCB3ZSBkbyB0aGUgc2ltaWxhciwgc28gd2UgaGF2ZQorCS8vIHVwcGVyID0gVGhhaSArIFVCICsgVUIsIHRyaWFsID0gVGhhaSArIFVCICsgeCwKKwkvLyByZXNvbHZpbmcgdG8gVUIgKyBUaGFpICsgVUIgdnMgVUIgKyBUaGFpICsgeAorCWlmKHNlY29uZFJlcFtqXS0+Zmlyc3RDQykgeworCSAgVUNoYXIzMiBVQkNoYXI7CisJICBVMTZfR0VUKFVCW1VDT0xfU0VDT05EQVJZXS0+bmFtZSwgMCwgMCwgVUJbVUNPTF9TRUNPTkRBUlldLT5sZW4sIFVCQ2hhcik7CisJICBpZihzZWNvbmRSZXBbal0tPmZpcnN0Q0MgPiB1X2dldENvbWJpbmluZ0NsYXNzKFVCQ2hhcikpIHsKKwkgICAgY29udGludWU7CisJICB9CisJfSAKKwl1cHBlciA9ICpmaXJzdFJlcFtpXTsKKwl1cHBlci5hcHBlbmQoKlVCW1VDT0xfUFJJTUFSWV0pOworCS8vdXBwZXIuYXBwZW5kKCpVQltzZWNvbmRSZXBbal0tPnN0cmVuZ3RoRnJvbUVtcHR5XSk7CisJdXBwZXIuYXBwZW5kKCpVQltVQ09MX1BSSU1BUlldKTsKKwlsb3dlci5hcHBlbmQoKlVCW1VDT0xfUFJJTUFSWV0pOworCXRyaWFsID0gKmZpcnN0UmVwW2ldOworCXRyaWFsLmFwcGVuZCgqVUJbVUNPTF9QUklNQVJZXSk7CisJdHJpYWwuYXBwZW5kKCpzZWNvbmRSZXBbal0pOworICAgICAgfSBlbHNlIGlmKChmaXJzdFJlcFtpXS0+bGFzdENDID4gc2Vjb25kUmVwW2pdLT5maXJzdENDICYmIHNlY29uZFJlcFtqXS0+Zmlyc3RDQyAmJiAhZnJlbmNoU2Vjb25kYXJ5KSAKKwkJfHwgKGZpcnN0UmVwW2ldLT5maXJzdENDIDwgc2Vjb25kUmVwW2pdLT5sYXN0Q0MgJiYgZmlyc3RSZXBbaV0tPmZpcnN0Q0MgJiYgZnJlbmNoU2Vjb25kYXJ5KSkgeworCS8vIFNraXAgYmVjYXVzZSBub3JtYWxpemF0aW9uIHdpbGwgcmVvcmRlcgorCS8vIHRoZXJlIHdpbGwgYmUgYSBjaGFuY2UgdG8gY2hlY2sgdGhpcyBhZ2Fpbiwgc2luY2UgaWYgd2UKKwkvLyB0cnkgYStiLCB3ZSB3aWxsIGFsc28gdHJ5IGIrYQorCSAgICBjb250aW51ZTsKKyAgICAgIH0gZWxzZSBpZihmcmVuY2hTZWNvbmRhcnkgJiYgKGZpcnN0UmVwW2ldLT5zdHJlbmd0aEZyb21FbXB0eSA+IFVDT0xfUFJJTUFSWSAmJiBzZWNvbmRSZXBbal0tPnN0cmVuZ3RoRnJvbUVtcHR5ID4gVUNPTF9QUklNQVJZKSkgeworCSAgICBjb250aW51ZTsKKyAgICAgIH1lbHNlIGlmKGZpcnN0UmVwW2ldLT5sYXN0Q0MgJiYgc2Vjb25kUmVwW2pdLT5maXJzdENDICYmIGZyZW5jaFNlY29uZGFyeSkgeworCSAgICB0cmlhbC5zZXRUb0NvbmNhdChzZWNvbmRSZXBbal0sIGZpcnN0UmVwW2ldKTsKKyAgICAgIH0gZWxzZSB7CisgICAgCXRyaWFsLnNldFRvQ29uY2F0KGZpcnN0UmVwW2ldLCBzZWNvbmRSZXBbal0pOyAgICAgICAgICAKKyAgICAgIH0KKyAgICAgIC8vIE5vdyBsZXQncyBjaGVjayB0aGUgdHJpYWwuIFRoZSBwcm9ibGVtIGlzIHRoYXQgd2hlbiB5b3UgY29tYmluZSBjaGFyYWN0ZXJzLCAKKyAgICAgIC8vIHlvdSBjYW4gZW5kIHVwIHdpdGggY29uY2F0ZW5hdGlvbiB0aGF0IGlzIHVua25vd24gZm9yIHRoZSBleGFtaW5lZCBBUEkuCisgICAgICBORkNUcmlhbExlbiA9IHVub3JtX25vcm1hbGl6ZSh0cmlhbC5uYW1lLCB0cmlhbC5sZW4sIFVOT1JNX05GQywgMCwgTkZDVHJpYWwsIDI1NiwgJnN0YXR1cyk7CisgICAgICBpZigodV9zdHJjbXAodHJpYWwubmFtZSwgTkZDVHJpYWwpID09IDApIHx8IHVfc3RyRmluZExhc3QoTkZDVHJpYWwsIE5GQ1RyaWFsTGVuLCBzZWNvbmRSZXBbal0tPm5hbWUsIHNlY29uZFJlcFtqXS0+bGVuKSkgeworCSAgIGlmKHNlY29uZFJlcFtqXS0+c3RyZW5ndGhGcm9tRW1wdHkgPiBVQ09MX1RFUlRJQVJZKSB7CisJICAgICBjb250aW51ZTsKKwkgICB9CisJIH0KKyAgICAgIFVDaGFyMzIgYzsKKyAgICAgIFUxNl9HRVQoTkZDVHJpYWwsIDAsIDAsIE5GQ1RyaWFsTGVuLCBjKTsKKyAgICAgIGhlbHBlci5zZXRUbyhjKTsKKyAgICAgIGlmKHByb2JlLmRpc3RhbmNlRnJvbUVtcHR5U3RyaW5nKGhlbHBlcikgPiBVQ09MX1RFUlRJQVJZKSB7CisJICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYoTkZDVHJpYWxMZW4gPiAxKSB7CisJICAgIFUxNl9HRVQoTkZDVHJpYWwsIDAsIE5GQ1RyaWFsTGVuLTEsIE5GQ1RyaWFsTGVuLCBjKTsKKwkgICAgaGVscGVyLnNldFRvKGMpOworICAgICAgICBpZihwcm9iZS5kaXN0YW5jZUZyb21FbXB0eVN0cmluZyhoZWxwZXIpID4gVUNPTF9URVJUSUFSWSkgeworCSAgICAgIGNvbnRpbnVlOworCSAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChwcm9iZS5jb21wYXJlKGxvd2VyLCB0cmlhbCkgPj0gMCkgeyAvLyBpZiBsb3dlciBpcyBiaWdnZXIgdGhhbiB0cmlhbAorICAgICAgICAvLyB0aGlzIG1pZ2h0IGJlIG9rLCBidXQgSSdtIGhhdmluZyBkb3VidHMuIEhlcmUgaXMgYW4gYWRkaXRpb25hbCBjaGVjazoKKyAgICAgICAgaWYoZmlyc3RSZXBbaV0tPmxlbiA9PSAxIHx8IHNlY29uZFJlcFtqXS0+c3RyZW5ndGhGcm9tRW1wdHkgPT0gVUNPTF9QUklNQVJZKSB7CisgICAgICAgICAgLy8gSSdtIGJhc2ljYWxseSBzYXlpbmcgdGhhdCBJJ2xsIGFkZCB0aGlzIGtpbmQgb2YgY29udHJhY3Rpb24gZm9yIGNhc2VzIHdoZXJlIEkgY29tYmluZQorICAgICAgICAgIC8vIG9uZSBsZXR0ZXIgd2l0aCBhbiBhY2NlbnQgT1Igd2hlbiBJJ20gY29tYmluaW5nIG1vcmUgdGhhbiBvbmUgc3ltYm9sIHdpdGggYSBsZXR0ZXIuCisgICAgICAgICAgbm90ZUNvbnRyYWN0aW9uKCJMIiwgbGVzc2VyVG9BZGRUbywgbGVzc2VyVG9BZGRUb1NpemUsIGZpcnN0UmVwW2ldLCBzZWNvbmRSZXBbal0sIG5vQ29udHMsIHN0YXR1cyk7CisgICAgICAgIH0KKyAgICAgIH0gCisgICAgICBlbHNlIGlmIChwcm9iZS5jb21wYXJlKHRyaWFsLCB1cHBlcikgPiAwKSB7IC8vIHRyaWFsIGlzIGJpZ2dlciB0aGFuIHVwcGVyPz8KKyAgICAgICAgbm90ZUNvbnRyYWN0aW9uKCJVIiwgdG9BZGRUbywgdG9BZGRUb1NpemUsIGZpcnN0UmVwW2ldLCBzZWNvbmRSZXBbal0sIG5vQ29udHMsIHN0YXR1cyk7CisgICAgICB9IAorI2lmIDAKKyAgICAgIGVsc2UgaWYoZmlyc3RSZXBbaV0tPnN0cmVuZ3RoRnJvbUVtcHR5ID09IFVDT0xfUFJJTUFSWSkKKyAgICAgIHsKKyAgICAgICAgTGluZSBleHBhbnNpb25MaW5lOworICAgICAgICBpZihnZXRFeHBhbnNpb25MaW5lKHRyaWFsLCAqZmlyc3RSZXBbaV0sICpzZWNvbmRSZXBbal0sIGV4cGFuc2lvbkxpbmUpICYmCisgICAgICAgIGV4cGFuc2lvbkxpbmUubGVuICYmICEoZXhwYW5zaW9uTGluZSA9PSAqc2Vjb25kUmVwW2pdKSkgeworICAgICAgICAgIG5vdGVDb250cmFjdGlvbigiRCIsIHRvQWRkVG8sIHRvQWRkVG9TaXplLCBmaXJzdFJlcFtpXSwgc2Vjb25kUmVwW2pdLCBub0NvbnRzLCBzdGF0dXMpOworICAgICAgICB9ICAgICAgICAgICAgCisgICAgICB9CisjZW5kaWYKKyAgICAgIGVsc2UgaWYoZmlyc3RSZXBbaV0tPnN0cmVuZ3RoRnJvbUVtcHR5ID09IFVDT0xfUFJJTUFSWSAmJiBwcm9iZS5nZXRTdHJlbmd0aChsb3dlciwgdHJpYWwpIDwgc2Vjb25kUmVwW2pdLT5zdHJlbmd0aEZyb21FbXB0eSkgeworICAgICAgICBub3RlQ29udHJhY3Rpb24oIkQxIiwgdG9BZGRUbywgdG9BZGRUb1NpemUsIGZpcnN0UmVwW2ldLCBzZWNvbmRSZXBbal0sIG5vQ29udHMsIHN0YXR1cyk7CisgICAgICB9IAorICAgICAgZWxzZSBpZiAoZmlyc3RSZXBbaV0tPnN0cmVuZ3RoRnJvbUVtcHR5ID09IFVDT0xfUFJJTUFSWSAmJiBzZWNvbmRSZXBbal0tPnN0cmVuZ3RoRnJvbUVtcHR5ID09IFVDT0xfUFJJTUFSWSkgCisgICAgICB7CisgICAgICAgIC8vIEkgaGF2ZSBhZGRlZCBhbiBhZGRpdGlvbmFsIGNoZWNrLiBUaGUgY2hlY2tzIHZlcnN1cyB1cHBlciBhbmQgbG93ZXIgYm91bmQgc2hvdWxkIGJlIHN1ZmZpY2llbnQKKyAgICAgICAgLy8gd2hlbiB0aGUgcmlnaHQgc2lkZSBpcyBhIGNvbWJpbmluZyBtYXJrLiBUaGVyZSBtaWdodCBiZSBhIHJlb3JkZXJpbmcgb2YgY29tYmluaW5nIG1hcmtzLCBidXQKKyAgICAgICAgLy8gdGhhdCBzaG91bGQgYmUgYWxyZWFkeSB2aXNpYmxlIGluIHRoZWlyIG9yZGVyLgorCS8vIGNvbXBhcmUgdGhlIHNlcXVlbmNlIAorCS8vIFktIDw/IFkgPD8gWSsKKwkvLyBhbmQgCisJLy8gWFktIDw/IFhZIDw/IFhZKworCUxpbmUgeHltLCB4eXAsIHh5OworCVVCb29sIHh5bUlzQ29udHJhY3Rpb24gPSBGQUxTRSwgdG9BZGRJc0NvbnRyYWN0aW9uID0gRkFMU0U7CisgICAgaWYoaikgeworCSAgaWYoKCghc2Vjb25kUmVwW2otMV0tPmZpcnN0Q0MgfHwgZmlyc3RSZXBbaV0tPmxhc3RDQyA8IHNlY29uZFJlcFtqLTFdLT5maXJzdENDKSAmJiAhZnJlbmNoU2Vjb25kYXJ5KSAKKyAgICAgICAgICAgICB8fCgoIWZpcnN0UmVwW2ldLT5maXJzdENDIHx8IGZpcnN0UmVwW2ldLT5maXJzdENDID4gc2Vjb25kUmVwW2otMV0tPmxhc3RDQykgJiYgZnJlbmNoU2Vjb25kYXJ5KSkgeworCSAgICB4eW0uc2V0VG9Db25jYXQoZmlyc3RSZXBbaV0sIHNlY29uZFJlcFtqLTFdKTsKKwkgICAgdG9BZGQuc3RyZW5ndGggPSBwcm9iZS5nZXRTdHJlbmd0aCh4eW0sIHRvQWRkKTsKKwkgICAgaWYoc2Vjb25kUmVwW2pdLT5zdHJlbmd0aCAhPSB0b0FkZC5zdHJlbmd0aCkgeworCSAgICAgIC8vIHRoZXJlIGlzIHBvc3NpYmlsaXR5IHRoYXQgZWl0aGVyIHh5bSBvciB4eSBhcmUgY29udHJhY3Rpb25zCisJICAgICAgLy8gVGhlcmUgYXJlIHR3byBzaXR1YXRpb25zOgorCSAgICAgIC8vIHh5bSA+IHh5IG9yIHh5bSA8biB4eSBhbmQgeW0gPGsgeSBidXQgbiAhPSBrCisJICAgICAgLy8gaWYgdGhleSBhcmUgcmVvcmRlcmVkLCB3ZSBhcmUgZ29pbmcgdG8gc2VlIGlmIGVhY2ggb2YgdGhlbSAKKwkgICAgICAvLyBpcyBmdXJ0aGVyIHJlb3JkZXJlZAorCSAgICAgIGlmKHRvQWRkLnN0cmVuZ3RoID09IFVDT0xfT0ZGKSB7CisJCS8vIGNoZWNrIHdoZXRoZXIgdG9BZGQgc2hpZnRlZCBtb3JlIGRvd24KKwkJayA9IGogLSAyOworCQl3aGlsZShrPj0wICYmIHNlY29uZFJlcFtrXS0+c3RyZW5ndGggPiBzZWNvbmRSZXBbal0tPnN0cmVuZ3RoKSB7CisJCSAgay0tOworCQl9CisJCXdoaWxlKCF0b0FkZElzQ29udHJhY3Rpb24gJiYgaz49MCkgeworCQkgIHh5cC5zZXRUb0NvbmNhdChmaXJzdFJlcFtpXSwgc2Vjb25kUmVwW2tdKTsKKwkJICBpZihjb250cmFjdGlvbnNUYWJsZS0+Z2V0KFVuaWNvZGVTdHJpbmcoeHlwLm5hbWUsIHh5cC5sZW4pKSAhPSBOVUxMKSB7CisJCSAgICBrLS07CisJCSAgICBjb250aW51ZTsKKwkJICB9CisJCSAgaWYocHJvYmUuY29tcGFyZSh4eXAsIHh5bSkgPj0gMCkgeworCQkgICAgLy8geHlwIGxvb2tzIGxpa2UgYSBjb250cmFjdGlvbgorCQkgICAgbm90ZUNvbnRyYWN0aW9uKCIhMSIsIHRvQWRkVG8sIHRvQWRkVG9TaXplLCBmaXJzdFJlcFtpXSwgc2Vjb25kUmVwW2pdLCBub0NvbnRzLCBzdGF0dXMpOworCQkgICAgdG9BZGRJc0NvbnRyYWN0aW9uID0gVFJVRTsKKwkJICB9IGVsc2UgeworCQkgICAgYnJlYWs7CisJCSAgfQorCQl9CisgICAgICAgICAgLy8gZmlyc3QgbGV0J3Mgc2VlIGlmIHh5bSBoYXMgbW92ZWQgYmV5b25kCisgICAgICAgICAgaWYoY29udHJhY3Rpb25zVGFibGUtPmdldChVbmljb2RlU3RyaW5nKHh5bS5uYW1lLCB4eW0ubGVuKSkgPT0gTlVMTCkgeworICAgICAgICAgICAgayA9IGorMTsKKyAgICAgICAgICAgIC8vIGlnbm9yZSB3ZWFrZXIgc3RyZW5ndGhzCisgICAgICAgICAgICB3aGlsZShrIDwgc2Vjb25kU2l6ZSAmJiBzZWNvbmRSZXBba10tPnN0cmVuZ3RoID4gc2Vjb25kUmVwW2pdLT5zdHJlbmd0aCkgeworICAgICAgICAgICAgICBrKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBjaGVjayBpZiB3ZSBza2lwcGVkIHRoZSBmb2xsb3dpbmcgZ3V5CisgICAgICAgICAgICBpZihrIDwgc2Vjb25kU2l6ZSkgeworICAgICAgICAgICAgICB4eXAuc2V0VG9Db25jYXQoZmlyc3RSZXBbaV0sIHNlY29uZFJlcFtrXSk7CisgICAgICAgICAgICAgIGlmKHByb2JlLmNvbXBhcmUoeHlwLCB4eW0pIDw9IDApIHsKKwkgICAgICAgICAgICAvLyB4eXAgbG9va3MgbGlrZSBhIGNvbnRyYWN0aW9uCisJICAgICAgICAgICAgbm90ZUNvbnRyYWN0aW9uKCIhMiIsIHRvQWRkVG8sIHRvQWRkVG9TaXplLCBmaXJzdFJlcFtpXSwgc2Vjb25kUmVwW2otMV0sIG5vQ29udHMsIHN0YXR1cyk7CisJICAgICAgICAgICAgeHltSXNDb250cmFjdGlvbiA9IFRSVUU7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgeHltSXNDb250cmFjdGlvbiA9IFRSVUU7CisgICAgICAgICAgfQorICAgICAgICAgIC8vIGlmIHRoZXkgaGF2ZSByZW9yZGVyZWQsIGJ1dCBub25lIGhhcyBtb3ZlZCwgdGhlbiB3ZSBhZGQgdGhlbSBib3RoCisgICAgICAgICAgLy8gYW5kIGhvcGUgZm9yIHRoZSBiZXN0CisgICAgICAgICAgaWYoIXh5bUlzQ29udHJhY3Rpb24gJiYgIXRvQWRkSXNDb250cmFjdGlvbikgeworICAgICAgICAgICAgICAvLyBpdCBpcyBwb3NzaWJsZSB0aGF0IHRoZXJlIGlzIGFuIE5GQyB2ZXJzaW9uIHZlcnNpb24gb2Ygb25lIG9mIHRoZSAKKyAgICAgICAgICAgICAgLy8gc3RyaW5ncy4gSWYgd2UgaGF2ZSBYWSA+IFhaLCBidXQgTkZDKFhaKSA9IFcgYW5kIFggPCBXLCB3ZSBtaWdodCBoYXZlCisgICAgICAgICAgICAgIC8vIGhhdmUgYSBmYWxzZSBjb250cmFjdGlvbi4KKyAgICAgICAgICAgICAgdHJpYWwubGVuID0gdW5vcm1fbm9ybWFsaXplKHRvQWRkLm5hbWUsIHRvQWRkLmxlbiwgVU5PUk1fTkZDLCAwLCB0cmlhbC5uYW1lLCAyNSwgJnN0YXR1cyk7CisgICAgICAgICAgICAgIC8vVUNvbEF0dHJpYnV0ZVZhbHVlIHN0cmVuZ3RoID0gcHJvYmUuZ2V0U3RyZW5ndGgoKmZpcnN0UmVwW2ldLCB0cmlhbCk7CisgICAgICAgICAgICAgIGlmKHRyaWFsID09IHRvQWRkKSB7CisgICAgICAgICAgICAgICAgbm90ZUNvbnRyYWN0aW9uKCIhMyIsIHRvQWRkVG8sIHRvQWRkVG9TaXplLCBmaXJzdFJlcFtpXSwgc2Vjb25kUmVwW2otMV0sIG5vQ29udHMsIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgbm90ZUNvbnRyYWN0aW9uKCIhMyIsIHRvQWRkVG8sIHRvQWRkVG9TaXplLCBmaXJzdFJlcFtpXSwgc2Vjb25kUmVwW2pdLCBub0NvbnRzLCBzdGF0dXMpOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG5vdGVDb250cmFjdGlvbigiITQiLCB0b0FkZFRvLCB0b0FkZFRvU2l6ZSwgZmlyc3RSZXBbaV0sIHNlY29uZFJlcFtqXSwgbm9Db250cywgc3RhdHVzKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCSAgICAgIH0gZWxzZSB7IC8vIG9ubHkgdGhlIHN0cmVuZ3RoIGhhcyBjaGFuZ2VkCisgICAgICAgICAgICAvLyBjaGVjayB3aGV0aGVyIHRoZSBwcmV2aW91cyBpcyBjb250cmFjdGlvbiBhbmQgaWYgbm90LCBhZGQgdGhlIGN1cnJlbnQKKyAgICAgICAgICAgIGlmKGNvbnRyYWN0aW9uc1RhYmxlLT5nZXQoVW5pY29kZVN0cmluZyh4eW0ubmFtZSwgeHltLmxlbikpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgbm90ZUNvbnRyYWN0aW9uKCIhNSIsIHRvQWRkVG8sIHRvQWRkVG9TaXplLCBmaXJzdFJlcFtpXSwgc2Vjb25kUmVwW2pdLCBub0NvbnRzLCBzdGF0dXMpOworICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgIAorCSAgICAgIH0KKwkgICAgfQorCSAgfQorCX0KKyAgICAgIH0KKyAgICAgIGlmKHRoYWkpIHsgLy8gcmVzdG9yZSBsb3dlcgorICAgICAgICBsb3dlciA9ICpmaXJzdFJlcFtpXTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIG5vQ29udHM7Cit9CisKK3ZvaWQKK1NvcnRlZExpbmVzOjpub3RlQ29udHJhY3Rpb24oY29uc3QgY2hhciogbXNnLCBMaW5lICp0b0FkZFRvLCBpbnQzMl90ICZ0b0FkZFRvU2l6ZSwgTGluZSAqbGVmdCwgTGluZSAqcmlnaHQsIGludDMyX3QgJm5vQ29udHMsIFVFcnJvckNvZGUgJnN0YXR1cykgCit7CisgIExpbmUgdG9BZGQ7CisgIHRvQWRkLnNldFRvQ29uY2F0KGxlZnQsIHJpZ2h0KTsKKyAgdG9BZGQubGVmdCA9IGxlZnQ7CisgIHRvQWRkLnJpZ2h0ID0gcmlnaHQ7CisgIC8vIGlmIHdlJ3JlIGFkZGluZyBhbiBhY2NlbnQgdG8gYW4gZXhpc3RpbmcgY29udHJhY3Rpb24sIHdlIHdhbnQgdG8gY2hlY2sKKyNpZiAwCisgIExpbmUgdGVzdCwgdHJpYWwxLCB0cmlhbDI7CisgIGlmKHJpZ2h0LT5zdHJlbmd0aEZyb21FbXB0eSA+IFVDT0xfUFJJTUFSWSkgeworICAgIGlmKGxlZnQtPnJpZ2h0ICYmIGxlZnQtPnJpZ2h0LT5wcmV2aW91cyAmJiBsZWZ0LT5yaWdodC0+bmV4dCkgeworICAgICAgdGVzdC5zZXRUb0NvbmNhdChsZWZ0LT5sZWZ0LCBsZWZ0LT5yaWdodC0+cHJldmlvdXMpOworICAgICAgdHJpYWwxLnNldFRvQ29uY2F0KCZ0ZXN0LCByaWdodCk7CisKKyAgICAgIHRlc3Quc2V0VG9Db25jYXQobGVmdC0+bGVmdCwgbGVmdC0+cmlnaHQtPm5leHQpOworICAgICAgdHJpYWwyLnNldFRvQ29uY2F0KCZ0ZXN0LCByaWdodCk7CisgICAgICBpZihwcm9iZS5jb21wYXJlKHRyaWFsMSwgdG9BZGQpIDwgMCAmJiBwcm9iZS5jb21wYXJlKHRvQWRkLCB0cmlhbDIpIDwgMCkgeworICAgICAgICAvLyB0aGlzIG1lYW5zIHRoYXQgdGhlIGNvbnRyYWN0aW9uIGhhcyBiZWVuIGJyb2tlbiBieSB0aGUgbmV3bHkgYWRkZWQgYWNjZW50CisgICAgICAgIC8vIHNvIHdoaWxlICdjaCcgaXMgY29udHJhY3Rpb24sICdjaCcrZG90X2Fib3ZlIHNvcnRzIGJldHdlZW4gJ2NnJytkb3RfYWJvdmUgYW5kICdjaScrZG90X2Fib3ZlCisgICAgICAgIGRlYnVnLT5sb2coIkNvbiAtIik7CisgICAgICAgIGRlYnVnLT5sb2cobXNnKTsKKyAgICAgICAgZGVidWctPmxvZyh0b0FkZC50b1N0cmluZyhGQUxTRSksIFRSVUUpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmKHJpZ2h0LT5wcmV2aW91cyAmJiByaWdodC0+bmV4dCkgeworICAgICAgICB0cmlhbDEuc2V0VG9Db25jYXQobGVmdCwgcmlnaHQtPnByZXZpb3VzKTsKKyAgICAgICAgdHJpYWwyLnNldFRvQ29uY2F0KGxlZnQsIHJpZ2h0LT5uZXh0KTsKKyAgICAgICAgaWYocHJvYmUuY29tcGFyZSh0cmlhbDEsIHRvQWRkKSA8IDAgJiYgcHJvYmUuY29tcGFyZSh0b0FkZCwgdHJpYWwyKSA8IDApIHsKKyAgICAgICAgICAvLyB0aGlzIG1lYW5zIHRoYXQgdGhlIGNvbnRyYWN0aW9uIGhhcyBiZWVuIGJyb2tlbiBieSB0aGUgbmV3bHkgYWRkZWQgYWNjZW50CisgICAgICAgICAgLy8gc28gd2hpbGUgJ2NoJyBpcyBjb250cmFjdGlvbiwgJ2NoJytkb3RfYWJvdmUgc29ydHMgYmV0d2VlbiAnY2cnK2RvdF9hYm92ZSBhbmQgJ2NpJytkb3RfYWJvdmUKKyAgICAgICAgICBkZWJ1Zy0+bG9nKCJDb24gLSIpOworICAgICAgICAgIGRlYnVnLT5sb2cobXNnKTsKKyAgICAgICAgICBkZWJ1Zy0+bG9nKHRvQWRkLnRvU3RyaW5nKEZBTFNFKSwgVFJVRSk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZihsZWZ0LT5wcmV2aW91cyAmJiBsZWZ0LT5uZXh0KSB7CisgICAgICAgIHRyaWFsMS5zZXRUb0NvbmNhdChsZWZ0LT5wcmV2aW91cywgcmlnaHQpOworICAgICAgICB0cmlhbDIuc2V0VG9Db25jYXQobGVmdC0+bmV4dCwgcmlnaHQpOworICAgICAgICBpZihwcm9iZS5jb21wYXJlKHRyaWFsMSwgdG9BZGQpIDwgMCAmJiBwcm9iZS5jb21wYXJlKHRvQWRkLCB0cmlhbDIpIDwgMCkgeworICAgICAgICAgIC8vIHRoaXMgbWVhbnMgdGhhdCB0aGUgY29udHJhY3Rpb24gaGFzIGJlZW4gYnJva2VuIGJ5IHRoZSBuZXdseSBhZGRlZCBhY2NlbnQKKyAgICAgICAgICAvLyBzbyB3aGlsZSAnY2gnIGlzIGNvbnRyYWN0aW9uLCAnY2gnK2RvdF9hYm92ZSBzb3J0cyBiZXR3ZWVuICdjZycrZG90X2Fib3ZlIGFuZCAnY2knK2RvdF9hYm92ZQorICAgICAgICAgIGRlYnVnLT5sb2coIkNvbiAtIik7CisgICAgICAgICAgZGVidWctPmxvZyhtc2cpOworICAgICAgICAgIGRlYnVnLT5sb2codG9BZGQudG9TdHJpbmcoRkFMU0UpLCBUUlVFKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0KKworICAgIH0KKyAgfQorICBpZihyaWdodC0+cmlnaHQgJiYgcmlnaHQtPnJpZ2h0LT5zdHJlbmd0aEZyb21FbXB0eSA+IFVDT0xfUFJJTUFSWSAmJiByaWdodC0+bGVmdC0+cHJldmlvdXMgJiYgcmlnaHQtPmxlZnQtPm5leHQpIHsgLy8gbWF5YmUgd2UgYWxyZWFkeSBoYWQgYSBjb250cmFjdGlvbiB3aXRoIGFuIGFjY2VudAorICAgIHRlc3Quc2V0VG9Db25jYXQocmlnaHQtPmxlZnQtPnByZXZpb3VzLCByaWdodC0+cmlnaHQpOworICAgIHRyaWFsMS5zZXRUb0NvbmNhdChsZWZ0LCAmdGVzdCk7CisgICAgdGVzdC5zZXRUb0NvbmNhdChyaWdodC0+bGVmdC0+bmV4dCwgcmlnaHQtPnJpZ2h0KTsKKyAgICB0cmlhbDIuc2V0VG9Db25jYXQobGVmdCwgJnRlc3QpOworICAgIGlmKHByb2JlLmNvbXBhcmUodHJpYWwxLCB0b0FkZCkgPCAwICYmIHByb2JlLmNvbXBhcmUodG9BZGQsIHRyaWFsMikgPCAwKSB7CisgICAgICAvLyB0aGlzIG1lYW5zIHRoYXQgdGhlIGNvbnRyYWN0aW9uIGhhcyBiZWVuIGJyb2tlbiBieSB0aGUgbmV3bHkgYWRkZWQgYWNjZW50CisgICAgICAvLyBzbyB3aGlsZSAnY2gnIGlzIGNvbnRyYWN0aW9uLCAnY2gnK2RvdF9hYm92ZSBzb3J0cyBiZXR3ZWVuICdjZycrZG90X2Fib3ZlIGFuZCAnY2knK2RvdF9hYm92ZQorICAgICAgZGVidWctPmxvZygiQ29uIC0iKTsKKyAgICAgIGRlYnVnLT5sb2cobXNnKTsKKyAgICAgIGRlYnVnLT5sb2codG9BZGQudG9TdHJpbmcoRkFMU0UpLCBUUlVFKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyNlbmRpZgorICBpZihjb250cmFjdGlvbnNUYWJsZS0+Z2V0KFVuaWNvZGVTdHJpbmcodG9BZGQubmFtZSwgdG9BZGQubGVuKSkgPT0gTlVMTCkgeworICAgIGlmKHByb2JlLmRpc3RhbmNlRnJvbUVtcHR5U3RyaW5nKHRvQWRkKSA8PSBVQ09MX1RFUlRJQVJZKSB7CisgICAgICB0b0FkZFRvW3RvQWRkVG9TaXplKytdID0gdG9BZGQ7CisgICAgICBjb250cmFjdGlvbnNUYWJsZS0+cHV0KFVuaWNvZGVTdHJpbmcodG9BZGQubmFtZSwgdG9BZGQubGVuKSwgJnRvQWRkLCBzdGF0dXMpOworICAgICAgbm9Db250cysrOworICAgICAgZGVidWctPmxvZyhtc2cpOworICAgICAgZGVidWctPmxvZygiIENvbiArICIpOworICAgICAgZGVidWctPmxvZyh0b0FkZC50b1N0cmluZyhGQUxTRSksIFRSVUUpOworCisgICAgICBpZighbGVmdC0+c29ydEtleSkgeworICAgICAgICBjYWxjdWxhdGVTb3J0S2V5KCpsZWZ0KTsKKyAgICAgIH0KKyAgICAgIGRlYnVnLT5sb2cobGVmdC0+ZHVtcFNvcnRrZXkoKSk7CisgICAgICBkZWJ1Zy0+bG9nKCIgKyAiKTsKKworICAgICAgaWYoIXJpZ2h0LT5zb3J0S2V5KSB7CisgICAgICAgIGNhbGN1bGF0ZVNvcnRLZXkoKnJpZ2h0KTsKKyAgICAgIH0KKyAgICAgIGRlYnVnLT5sb2cocmlnaHQtPmR1bXBTb3J0a2V5KCkpOworICAgICAgZGVidWctPmxvZygiID0gIik7CisKKyAgICAgIGNhbGN1bGF0ZVNvcnRLZXkodG9BZGQpOworICAgICAgZGVidWctPmxvZyh0b0FkZC5kdW1wU29ydGtleSgpLCBUUlVFKTsKKyAgICAgIGlmKG5vQ29udHMgPiBzaXplLzIpIHsKKyAgICAgICAgc3RhdHVzID0gVV9CVUZGRVJfT1ZFUkZMT1dfRVJST1I7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKworVUJvb2wKK1NvcnRlZExpbmVzOjpnZXRFeHBhbnNpb25MaW5lKGNvbnN0IExpbmUgJmV4cGFuc2lvbiwgY29uc3QgTGluZSAmcHJldmlvdXMsIGNvbnN0IExpbmUgJmV4cCwgTGluZSAmZXhwYW5zaW9uTGluZSkgCit7CisgIGludCBleHBJbmRleFNpemUgPSAwOworICBVQ29sQXR0cmlidXRlVmFsdWUgZXhwU3RyZW5ndGggPSBVQ09MX09GRjsKKyAgaW50MzJfdCBjb21wYXJpc29uUmVzdWx0ID0gMDsKKyAgaW50MzJfdCBpID0gMCwgayA9IDAsIHByZXZLID0gMDsKKyAgTGluZSB0cmlhbDsKKyAgVUJvb2wgc2VxdWVuY2VDb21wbGV0ZWQgPSBGQUxTRTsKKyAgaW50MzJfdCBleHBJbmRleGVzWzI1Nl07CisgIGludDMyX3QgZXhwSW5kZXhlc1NpemUgPSAwOworCisgIGlmKCFzZXF1ZW5jZUNvbXBsZXRlZCkgeworICAgIGV4cEluZGV4U2l6ZSA9IDA7CisgICAgZXhwYW5zaW9uTGluZS5jbGVhcigpOworCisgICAgLy8gd2Ugd2lsbCBzdGFydCBmcm9tIHN0cmVuZ3RoIGJldHdlZW4gdGhlIGV4cGFuc2lvbgorICAgIC8vIGFuZCB0aGUgdGFyZ2V0ICh0b1NvcnRbaV0gYW5kIHRvU29ydFtqXS4gRmlyc3Qgd2UKKyAgICAvLyB3aWxsIGFkZCBhcyBtYW55IHByaW1hcmllcyBhcyBwb3NzaWJsZS4gVGhlbiB3ZSB3aWxsCisgICAgLy8gdHJ5IHRvIGFkZCBzZWNvbmRhcnkgcGllY2VzIGFuZCB0aGVuIHRlcnRpYXJ5LiAKKyAgICAvLyBmb3VuZCBhbiBleHBhbnNpb24gLSB3aGF0IGlzIHRoZSBleHBhbmRpbmcgc2VxdWVuY2U/CisgIAorICAgIGV4cFN0cmVuZ3RoID0gVUNPTF9QUklNQVJZOworICAgIHdoaWxlKCFzZXF1ZW5jZUNvbXBsZXRlZCkgeworICAgICAgayA9IDA7CisgICAgICBwcmV2SyA9IDA7CisgICAgICB3aGlsZShrIDwgc2l6ZSkgeworICAgICAgICBpZihleHBhbnNpb25MaW5lLmxlbiA+IDE1KSB7CisgICAgICAgICAgc2VxdWVuY2VDb21wbGV0ZWQgPSBUUlVFOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHdoaWxlKGsgPCBzaXplICYmIHRvU29ydFtrXS0+c3RyZW5ndGggIT0gVUNPTF9QUklNQVJZKSAKKyAgICAgICAgeworICAgICAgICAgIGsrKzsKKyAgICAgICAgfQorICAgICAgICAvLyBub3RoaW5nIGZvdW5kCisgICAgICAgIGlmKGsgPT0gc2l6ZSkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8vIHdlIG5lZWQgdG8gc2tpcCBvdmVyIHJlb3JkZXJpbmcgdGhpbmdzLiBJZiB0aGV5IHdlcmUgd29ydGh5LCB0aGV5IHdvdWxkCisgICAgICAgIC8vIGhhdmUgYmVlbiBkZXRlY3RlZCBpbiB0aGUgcHJldmlvdXMgaXRlcmF0aW9uLgorICAgICAgICAvL2lmKGV4cGFuc2lvbkxpbmUubGFzdENDICYmIHRvU29ydFtrXS0+Zmlyc3RDQyAmJiBleHBhbnNpb25MaW5lLmxhc3RDQyA+IHRvU29ydFtrXS0+Zmlyc3RDQykgeworICAgICAgICAgIC8vaysrOworICAgICAgICAgIC8vY29udGludWU7CisgICAgICAgIC8vfQorICAgICAgICB0cmlhbCA9IHByZXZpb3VzOworICAgICAgICB0cmlhbC5hcHBlbmQoZXhwYW5zaW9uTGluZSk7CisgICAgICAgIHRyaWFsLmFwcGVuZCgqdG9Tb3J0W2tdKTsgICAgICAgIAorICAgICAgICBpZih0b1NvcnRba10tPm5hbWVbMF0gPT0gMHgwMDY3KSB7CisgICAgICAgICAgaW50MzJfdCBwdXRCcmVha1BvaW50SGVyZSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgY29tcGFyaXNvblJlc3VsdCA9IHByb2JlLmNvbXBhcmUodHJpYWwsIGV4cGFuc2lvbik7CisgICAgICAgIGlmKGNvbXBhcmlzb25SZXN1bHQgPT0gMCkgeworICAgICAgICAgIGV4cGFuc2lvbkxpbmUgPSAqdG9Tb3J0W2tdOworICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICB9IGVsc2UgaWYgKGNvbXBhcmlzb25SZXN1bHQgPiAwKSB7CisgICAgICAgICAgaWYocHJldkspIHsKKyAgICAgICAgICAgIGlmKGV4cCA9PSAqdG9Tb3J0W3ByZXZLXSkgeworICAgICAgICAgICAgICBleHBhbnNpb25MaW5lID0gZXhwOworICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGkgPSBwcmV2SzsKKyAgICAgICAgICAgIHdoaWxlKGkgPCBrLTEpIHsKKyAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICBpZih0b1NvcnRbaV0tPnN0cmVuZ3RoID4gZXhwLnN0cmVuZ3RoKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgdHJpYWwgPSBwcmV2aW91czsKKyAgICAgICAgICAgICAgdHJpYWwuYXBwZW5kKGV4cGFuc2lvbkxpbmUpOworICAgICAgICAgICAgICB0cmlhbC5hcHBlbmQoKnRvU29ydFtpXSk7CisgICAgICAgICAgICAgIGlmKHByb2JlLmNvbXBhcmUodHJpYWwsIGV4cGFuc2lvbikgPiAwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHdlIGdvdCBpbnRvIHNpdHVhdGlvbiB3aGVyZSB3ZSBoYXZlIGNoID4gY2grZG90LWJlbG93CisgICAgICAgICAgICAvLyBob3dldmVyLCBjaCBpcyBhIGNvbnRyYWN0aW9uIGFuZCB0aGVyZWZvcmUgd2UgY2Fubm90IHVzZQorICAgICAgICAgICAgLy8gaXQgcHJvcGVybHkuIElmIHdlIGhhdmUgaGl0IG9uIGEgY29udHJhY3Rpb24sIHdlJ2xsIGp1c3QgdHJ5CisgICAgICAgICAgICAvLyB0byBjb250aW51ZS4gUHJvYmFibHkgbmVlZCBtb3JlIGxvZ2ljIGhlcmUuCisgICAgICAgICAgICBpZihjb250cmFjdGlvbnNUYWJsZS0+Z2V0KFVuaWNvZGVTdHJpbmcodHJpYWwubmFtZSwgdHJpYWwubGVuKSkgPT0gTlVMTCkgeworICAgICAgICAgICAgICBleHBhbnNpb25MaW5lLmFwcGVuZCgqdG9Tb3J0W2ktMV0pOworICAgICAgICAgICAgICBleHBJbmRleGVzW2V4cEluZGV4U2l6ZSsrXSA9IGktMTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBpbnQzMl90IHB1dEJyZWFrUG9pbnRIZXJlID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VxdWVuY2VDb21wbGV0ZWQgPSBUUlVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIC8vYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcHJldksgPSBrOworICAgICAgICBrKys7CisgICAgICB9CisgICAgICBpZighcHJldksgfHwgayA9PSBzaXplKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gZXhwSW5kZXhTaXplID4gMDsKK30KKworaW50MzJfdAorU29ydGVkTGluZXM6Omdvb3NlVXAoaW50MzJfdCByZXNldEluZGV4LCBpbnQzMl90IGV4cGFuc2lvbkluZGV4LCBMaW5lICZleHBMaW5lLCBpbnQzMl90ICpleHBJbmRleGVzLCBpbnQzMl90ICZleHBJbmRleFNpemUsIFVDb2xBdHRyaWJ1dGVWYWx1ZSBzdHJlbmd0aCkgCit7CisgIGludDMyX3QgaSA9IGV4cGFuc2lvbkluZGV4LCBrID0gcmVzZXRJbmRleCsxLCBuID0gMCwgbSA9IDAsIHN0YXJ0ID0gMDsKKyAgVUJvb2wgaGF2ZUNoYW5nZXMgPSBGQUxTRTsKKyAgTGluZSB0cmlhbCwgcHJlZml4LCBzdWZmaXg7CisgIC8vIHdlIHdpbGwgZmlyc3QgdHJ5IGdvb3NpbmcgdXAgdGhlIHJlc2V0IGluZGV4CisgIC8vd2hpbGUodG9Tb3J0W2tdLT5zdHJlbmd0aCA+PSBzdHJlbmd0aCkKKyAgZm9yKCA7IHRvU29ydFtrXS0+c3RyZW5ndGggPT0gc3RyZW5ndGg7IGsrKykgCisgIHsKKyAgICAvL2lmKHRvU29ydFtrXS0+c3RyZW5ndGggPiBzdHJlbmd0aCkgeworICAgICAgLy9jb250aW51ZTsKKyAgICAvL30KKyAgICB0cmlhbC5zZXRUb0NvbmNhdCh0b1NvcnRba10sICZleHBMaW5lKTsKKyAgICBpZihwcm9iZS5jb21wYXJlKHRyaWFsLCAqdG9Tb3J0W2ldKSA+IDApIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXNldEluZGV4ID0gay0xOworCisgIC8vIGdvb3NlIHVwIGluZGl2aWR1YWwgY2hhcmFjdGVycworICBwcmVmaXggPSAqdG9Tb3J0W3Jlc2V0SW5kZXhdOworICBmb3IobiA9IDA7IG4gPCBleHBJbmRleFNpemU7IG4rKykgeworICAgIHN1ZmZpeC5jbGVhcigpOworICAgIGZvcihtID0gbisxOyBtIDwgZXhwSW5kZXhTaXplOyBtKyspIHsKKyAgICAgIHN1ZmZpeC5hcHBlbmQoKnRvU29ydFtleHBJbmRleGVzW21dXSk7CisgICAgfQorICAgIGsgPSBleHBJbmRleGVzW25dKzE7CisgICAgLy93aGlsZSh0b1NvcnRba10tPnN0cmVuZ3RoID49IHN0cmVuZ3RoKQorICAgIGZvciggOyB0b1NvcnRba10tPnN0cmVuZ3RoID09IHN0cmVuZ3RoOyBrKyspIAorICAgIHsKKyAgICAgIC8vaWYodG9Tb3J0W2tdLT5zdHJlbmd0aCA+IHN0cmVuZ3RoKSB7CisgICAgICAgIC8vY29udGludWU7CisgICAgICAvL30KKyAgICAgIHRyaWFsLnNldFRvQ29uY2F0KCZwcmVmaXgsIHRvU29ydFtrXSk7CisgICAgICB0cmlhbC5hcHBlbmQoc3VmZml4KTsKKyAgICAgIGlmKHByb2JlLmNvbXBhcmUodHJpYWwsICp0b1NvcnRbaV0pID4gMCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgaWYoayA+IGV4cEluZGV4ZXNbbl0rMSkgeworICAgICAgaGF2ZUNoYW5nZXMgPSBUUlVFOworICAgICAgZXhwSW5kZXhlc1tuXSA9IGstMTsKKyAgICB9CisgICAgcHJlZml4LmFwcGVuZCgqdG9Tb3J0W2V4cEluZGV4ZXNbbl1dKTsKKyAgfQorCisgIC8vIHRyeSBpbnNlcnRpbmcgaW5nb3JhYmxlcworICBVQ29sQXR0cmlidXRlVmFsdWUgbGFzdFN0ciA9IFVDT0xfT0ZGOworICBrID0gMDsKKyAgd2hpbGUodG9Tb3J0W2tdLT5zdHJlbmd0aEZyb21FbXB0eSA+IHN0cmVuZ3RoKSB7CisgICAgaysrOworICB9CisgIGlmKHRvU29ydFtrXS0+c3RyZW5ndGhGcm9tRW1wdHkgPT0gc3RyZW5ndGgpIHsKKyAgICBzdGFydCA9IGs7CisgICAgcHJlZml4ID0gKnRvU29ydFtyZXNldEluZGV4XTsKKyAgICBuID0gMDsKKyAgICB3aGlsZShuIDw9IGV4cEluZGV4U2l6ZSkgeworICAgICAgc3VmZml4LmNsZWFyKCk7CisgICAgICBmb3IobSA9IG47IG0gPCBleHBJbmRleFNpemU7IG0rKykgeworICAgICAgICBzdWZmaXguYXBwZW5kKCp0b1NvcnRbZXhwSW5kZXhlc1ttXV0pOworICAgICAgfQorICAgICAgayA9IHN0YXJ0OworICAgICAgd2hpbGUodG9Tb3J0W2tdLT5zdHJlbmd0aEZyb21FbXB0eSA9PSBzdHJlbmd0aCkgeworICAgICAgICB0cmlhbC5zZXRUb0NvbmNhdCgmcHJlZml4LCB0b1NvcnRba10pOworICAgICAgICB0cmlhbC5hcHBlbmQoc3VmZml4KTsKKyAgICAgICAgbGFzdFN0ciA9IHByb2JlLmdldFN0cmVuZ3RoKHRyaWFsLCAqdG9Tb3J0W2ldKTsKKyAgICAgICAgaWYobGFzdFN0ciA9PSBVQ09MX09GRikgeyAvLyBzaG90IG92ZXIgLSB3ZSB3b24ndCBmaW5kIGFueXRoaW5nIGhlcmUKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmKGxhc3RTdHIgPiBzdHJlbmd0aCkgeworICAgICAgICAgIGZvcihtID0gZXhwSW5kZXhTaXplOyBtID4gbjsgbS0tKSB7CisgICAgICAgICAgICBleHBJbmRleGVzW21dID0gZXhwSW5kZXhlc1ttLTFdOworICAgICAgICAgIH0KKyAgICAgICAgICBleHBJbmRleGVzW25dID0gazsKKyAgICAgICAgICBleHBJbmRleFNpemUrKzsKKyAgICAgICAgICBoYXZlQ2hhbmdlcyA9IFRSVUU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyNpZiAwCisgICAgICAgIGlmKHByb2JlLmNvbXBhcmUodHJpYWwsICp0b1NvcnRbaV0pID4gMCkgeworICAgICAgICAgIC8vIGlmIHRoZSBmaXJzdCBvbmUgc2tpcHMsIHRoYXQgbWVhbnMgdGhhdAorICAgICAgICAgIC8vIHRoaXMgcG9zaXRpb24gZG9lc24ndCB3b3JrCisgICAgICAgICAgaWYoayA+IHN0YXJ0KSB7CisgICAgICAgICAgICAvLyBpbnNlcnQgYW4gaWdub3JhYmxlIG9uIHBvc2l0aW9uIG4KKyAgICAgICAgICAgIGZvcihtID0gZXhwSW5kZXhTaXplOyBtID4gbjsgbS0tKSB7CisgICAgICAgICAgICAgIGV4cEluZGV4ZXNbbV0gPSBleHBJbmRleGVzW20tMV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBleHBJbmRleGVzW25dID0gay0xOworICAgICAgICAgICAgZXhwSW5kZXhTaXplKys7CisgICAgICAgICAgICBoYXZlQ2hhbmdlcyA9IFRSVUU7CisgICAgICAgICAgICBpZihuID09IGV4cEluZGV4U2l6ZS0xKSB7IC8vIGFkZGVkIHRvIHRoZSBlbmQgb2YgdGhlIHN0cmluZworICAgICAgICAgICAgICBVQ29sQXR0cmlidXRlVmFsdWUgc3RyID0gcHJvYmUuZ2V0U3RyZW5ndGgodHJpYWwsICp0b1NvcnRbaV0pOworICAgICAgICAgICAgICBpbnQzMl90IHB1dEJyZWFrSGVyZSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGxhc3RTdHIgPSBwcm9iZS5nZXRTdHJlbmd0aCh0cmlhbCwgKnRvU29ydFtpXSk7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBrKys7CisgICAgICB9CisgICAgICBwcmVmaXguYXBwZW5kKCp0b1NvcnRbZXhwSW5kZXhlc1tuXV0pOworICAgICAgbisrOworICAgIH0KKyAgfQorCisgIGlmKGhhdmVDaGFuZ2VzKSB7CisgICAgZXhwTGluZS5jbGVhcigpOworICAgIGZvcihtID0gMDsgbSA8IGV4cEluZGV4U2l6ZTsgbSsrKSB7CisgICAgICBleHBMaW5lLmFwcGVuZCgqdG9Tb3J0W2V4cEluZGV4ZXNbbV1dKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc2V0SW5kZXg7Cit9CisKK2ludDMyX3QgCitTb3J0ZWRMaW5lczo6ZGV0ZWN0RXhwYW5zaW9ucygpIAoreworICBsb2dnZXItPmxvZygiXG4qKiogRGV0ZWN0aW5nIGV4cGFuc2lvbnNcblxuIik7CisgIGludDMyX3QgZXhDb3VudCA9IDA7CisgIGludDMyX3QgaSA9IDAsIGogPSAwLCBrID0gMCwgcHJldksgPSAwOworICBMaW5lICpwcmV2aW91cywgdHJpYWwsIGV4cGFuc2lvbkxpbmU7CisgIFVCb29sIGZvdW5kRXhwID0gRkFMU0UsIHNlcXVlbmNlQ29tcGxldGVkID0gRkFMU0U7CisgIFVDb2xBdHRyaWJ1dGVWYWx1ZSBzdHJlbmd0aCA9IFVDT0xfT0ZGOworICBVQ29sQXR0cmlidXRlVmFsdWUgbWF4U3RyZW5ndGggPSBVQ09MX0lERU5USUNBTDsKKyAgVUNvbEF0dHJpYnV0ZVZhbHVlIGV4cFN0cmVuZ3RoID0gVUNPTF9PRkY7CisgIGludDMyX3QgZXhwSW5kZXhlc1syNTZdOworICBpbnQzMl90IGV4cEluZGV4U2l6ZSA9IDA7CisgIG1lbXNldChleHBJbmRleGVzLCAwLCBzaXplb2YoZXhwSW5kZXhlcykpOworCisgIC8vIGZvciBlYWNoIGVsZW1lbnQsIHdlIGxvb2sgYmFjayB0byBmaW5kIHdoZXRoZXIgdGhlcmUgaXMgc3VjaCBhIHEgZm9yIHdoaWNoCisgIC8vIHEgPG4geCA8IHFVQm4uIFRoZXNlIGFyZSBwb3NzaWJsZSBleHBhbnNpb25zLiBXaGVuIGdvaW5nIGJhY2t3YXJkcyB3ZSBza2lwIAorICAvLyBvdmVyIGFscmVhZHkgZGV0ZWN0ZWQgZXhwYW5zaW9ucy4KKyAgaSA9IDA7CisgIC8vIGl0IHR1cm5zIG91dCB0aGF0IGxvb2tpbmcgYXQgYWNjZW50cyBhcyBwb3NzaWJsZSBleHBhbnNpb25zIGlzCisgIC8vIHF1aXRlIGEgc3R1cGlkIHRoaW5nIHRvIGRvLCBlc3BlY2lhbGx5IG9uIG5vbiBJQ1UgcGxhdGZvcm1zLgorICAvLyBQcmV2aW91c2x5IHRoaXMgbGluZSBza2lwcGVkIG92ZXIgaWRlbnRpY2FscyBvbmx5LCBidXQgCisgIC8vIG5vdyB3ZSBhcmUgZ29pbmcgdG8gc2tpcCBhbGwgdGhlIHdheSB0byBub24taWdub3JhYmxlcy4KKyAgd2hpbGUodG9Tb3J0W2ldLT5zdHJlbmd0aEZyb21FbXB0eSA+IFVDT0xfUFJJTUFSWSkgeworICAgIGkrKzsKKyAgfQorICBpKys7CisgIGZvciggOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgaWYodG9Tb3J0W2ldLT5uYW1lWzBdPT0weDAwNjMgJiYgdG9Tb3J0W2ldLT5uYW1lWzFdID09IDB4NjgpIC8vICYmIHRvU29ydFtpXS0+bmFtZVsxXSA9PSAweDMwOCkwMDQzIDAwNDMgMDIxOQorICAgIHsgCisgICAgICBpbnQzMl90IHB1dEJyZWFrcG9pbnRoZXJlID0gMDsKKyAgICB9CisgICAgZm91bmRFeHAgPSBGQUxTRTsKKyAgICBzZXF1ZW5jZUNvbXBsZXRlZCA9IEZBTFNFOworICAgIHN0cmVuZ3RoID0gdG9Tb3J0W2ldLT5zdHJlbmd0aDsKKyAgICBpZihzdHJlbmd0aCA9PSBVQ09MX0lERU5USUNBTCAmJiB0b1NvcnRbaS0xXS0+aXNFeHBhbnNpb24gPT0gVFJVRSkgeworICAgICAgdV9zdHJjcHkodG9Tb3J0W2ldLT5leHBhbnNpb25TdHJpbmcsIHRvU29ydFtpLTFdLT5leHBhbnNpb25TdHJpbmcpOworICAgICAgdG9Tb3J0W2ldLT5leHBMZW4gPSB0b1NvcnRbaS0xXS0+ZXhwTGVuOworICAgICAgdG9Tb3J0W2ldLT5pc0V4cGFuc2lvbiA9IFRSVUU7CisgICAgICB0b1NvcnRbaV0tPmV4cEluZGV4ID0gdG9Tb3J0W2ktMV0tPmV4cEluZGV4OworICAgICAgdG9Tb3J0W2ldLT5leHBTdHJlbmd0aCA9IFVDT0xfSURFTlRJQ0FMOworICAgICAgLy90b1NvcnRbaV0tPmV4cFN0cmVuZ3RoID0gdG9Tb3J0W2ktMV0tPmV4cFN0cmVuZ3RoOworICAgICAgZm91bmRFeHAgPSBUUlVFOworICAgICAgc2VxdWVuY2VDb21wbGV0ZWQgPSBUUlVFOworICAgIH0KKyAgICAvL2xvZ2dlci0+bG9nKCIlaSAlaVxuIiwgaSwgaik7CisgICAgd2hpbGUoIWZvdW5kRXhwICYmIHN0cmVuZ3RoIDw9IG1heFN0cmVuZ3RoKSB7CisgICAgICBqID0gaS0xOworICAgICAgd2hpbGUoaiAmJiAodG9Tb3J0W2pdLT5pc0V4cGFuc2lvbiA9PSBUUlVFIHx8IHRvU29ydFtqXS0+aXNSZW1vdmVkID09IFRSVUUpKSB7CisgICAgICAgIC8vaWYodG9Tb3J0W2pdLT5zdHJlbmd0aCA8IHN0cmVuZ3RoKSB7CisgICAgICAgICAgLy9zdHJlbmd0aCA9IHRvU29ydFtqXS0+c3RyZW5ndGg7CisgICAgICAgIC8vfQorICAgICAgICBqLS07CisgICAgICB9CisKKyAgICAgIC8vd2hpbGUoaiAmJiB0b1NvcnRbal0tPnN0cmVuZ3RoID4gc3RyZW5ndGgpCisgICAgICB3aGlsZShqICYmIHRvU29ydFtqXS0+c3RyZW5ndGggPiBwcm9iZS5nZXRTdHJlbmd0aCgqdG9Tb3J0W2pdLCAqdG9Tb3J0W2ldKSkKKyAgICAgIHsKKyAgICAgICAgai0tOworICAgICAgfQorICAgICAgLy9pZih0b1NvcnRbal0tPnN0cmVuZ3RoID09IHN0cmVuZ3RoKSB7CisgICAgICAgIHByZXZpb3VzID0gdG9Tb3J0W2pdOworICAgICAgICBpZihwcmV2aW91cy0+c3RyZW5ndGhGcm9tRW1wdHkgPj0gVUNPTF9JREVOVElDQUwgfHwKKyAgICAgICAgICAocHJldmlvdXMtPnN0cmVuZ3RoRnJvbUVtcHR5ID09IFVDT0xfU0VDT05EQVJZCisgICAgICAgICAgJiYgc3RyZW5ndGggPT0gVUNPTF9TRUNPTkRBUlkKKyAgICAgICAgICAmJiBwcmV2aW91cy0+bGFzdENDID4gVUJbc3RyZW5ndGhdLT5maXJzdENDKSkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICAgIC8vY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgLy90cmlhbC5zZXRUb0NvbmNhdChwcmV2aW91cywgVUJbc3RyZW5ndGhdKTsKKyAgICAgICAgdHJpYWwuc2V0VG9Db25jYXQocHJldmlvdXMsIFVCW3Byb2JlLmdldFN0cmVuZ3RoKCp0b1NvcnRbal0sICp0b1NvcnRbaV0pXSk7CisgICAgICAgIGlmKHByb2JlLmNvbXBhcmUodHJpYWwsICp0b1NvcnRbaV0pID4gMCkgeworICAgICAgICAgIGZvdW5kRXhwID0gVFJVRTsKKyAgICAgICAgfQorICAgICAgLy99CisgICAgICBpZihzdHJlbmd0aCA9PSBVQ09MX1FVQVRFUk5BUlkpIHsKKyAgICAgICAgc3RyZW5ndGggPSBVQ09MX0lERU5USUNBTDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN0cmVuZ3RoID0gKFVDb2xBdHRyaWJ1dGVWYWx1ZSkoc3RyZW5ndGggKyAxKTsKKyAgICAgIH0KKyAgICB9CisgICAgLy8gY2FsY3VsYXRlIHRoZSBleHBhbmRpbmcgc2VxdWVuY2UKKyAgICBpZihmb3VuZEV4cCAmJiAhc2VxdWVuY2VDb21wbGV0ZWQpIHsKKyAgICAgIGV4cEluZGV4U2l6ZSA9IDA7CisgICAgICBleHBhbnNpb25MaW5lLmNsZWFyKCk7CisgICAgICBleENvdW50Kys7CisgICAgICAvLyB3ZSB3aWxsIHN0YXJ0IGZyb20gc3RyZW5ndGggYmV0d2VlbiB0aGUgZXhwYW5zaW9uCisgICAgICAvLyBhbmQgdGhlIHRhcmdldCAodG9Tb3J0W2ldIGFuZCB0b1NvcnRbal0uIEZpcnN0IHdlCisgICAgICAvLyB3aWxsIGFkZCBhcyBtYW55IHByaW1hcmllcyBhcyBwb3NzaWJsZS4gVGhlbiB3ZSB3aWxsCisgICAgICAvLyB0cnkgdG8gYWRkIHNlY29uZGFyeSBwaWVjZXMgYW5kIHRoZW4gdGVydGlhcnkuIAorICAgICAgLy8gZm91bmQgYW4gZXhwYW5zaW9uIC0gd2hhdCBpcyB0aGUgZXhwYW5kaW5nIHNlcXVlbmNlPworICAgICAgCisgICAgICBleHBTdHJlbmd0aCA9IFVDT0xfUFJJTUFSWTsKKyAgICAgIHdoaWxlKCFzZXF1ZW5jZUNvbXBsZXRlZCkgeworICAgICAgICBrID0gMDsKKyAgICAgICAgcHJldksgPSAwOworICAgICAgICB3aGlsZShrIDwgc2l6ZSkgeworICAgICAgICAgIGlmKGV4cGFuc2lvbkxpbmUubGVuID4gMTUpIHsKKyAgICAgICAgICAgIHNlcXVlbmNlQ29tcGxldGVkID0gVFJVRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICB3aGlsZShrIDwgc2l6ZSAmJiB0b1NvcnRba10tPnN0cmVuZ3RoICE9IFVDT0xfUFJJTUFSWSkgeworICAgICAgICAgICAgaysrOworICAgICAgICAgIH0KKyAgICAgICAgICAvLyBub3RoaW5nIGZvdW5kCisgICAgICAgICAgaWYoayA9PSBzaXplKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgLy8gd2UgbmVlZCB0byBza2lwIG92ZXIgcmVvcmRlcmluZyB0aGluZ3MuIElmIHRoZXkgd2VyZSB3b3J0aHksIHRoZXkgd291bGQKKyAgICAgICAgICAvLyBoYXZlIGJlZW4gZGV0ZWN0ZWQgaW4gdGhlIHByZXZpb3VzIGl0ZXJhdGlvbi4KKyAgICAgICAgICAvL2lmKGV4cGFuc2lvbkxpbmUubGFzdENDICYmIHRvU29ydFtrXS0+Zmlyc3RDQyAmJiBleHBhbnNpb25MaW5lLmxhc3RDQyA+IHRvU29ydFtrXS0+Zmlyc3RDQykgeworICAgICAgICAgICAgLy9rKys7CisgICAgICAgICAgICAvL2NvbnRpbnVlOworICAgICAgICAgIC8vfQorICAgICAgICAgIHRyaWFsID0gKnByZXZpb3VzOworICAgICAgICAgIHRyaWFsLmFwcGVuZChleHBhbnNpb25MaW5lKTsKKyAgICAgICAgICB0cmlhbC5hcHBlbmQoKnRvU29ydFtrXSk7ICAgICAgICAKKyAgICAgICAgICBpZih0b1NvcnRba10tPm5hbWVbMF0gPT0gMHgwMDY3KSB7CisgICAgICAgICAgICBpbnQzMl90IHB1dEJyZWFrUG9pbnRIZXJlID0gMDsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYocHJvYmUuY29tcGFyZSh0cmlhbCwgKnRvU29ydFtpXSkgPiAwKSB7CisgICAgICAgICAgICBpZihwcmV2SykgeworICAgICAgICAgICAgICAvLyB3ZSBnb3QgaW50byBzaXR1YXRpb24gd2hlcmUgd2UgaGF2ZSBjaCA+IGNoK2RvdC1iZWxvdworICAgICAgICAgICAgICAvLyBob3dldmVyLCBjaCBpcyBhIGNvbnRyYWN0aW9uIGFuZCB0aGVyZWZvcmUgd2UgY2Fubm90IHVzZQorICAgICAgICAgICAgICAvLyBpdCBwcm9wZXJseS4gSWYgd2UgaGF2ZSBoaXQgb24gYSBjb250cmFjdGlvbiwgd2UnbGwganVzdCB0cnkKKyAgICAgICAgICAgICAgLy8gdG8gY29udGludWUuIFByb2JhYmx5IG5lZWQgbW9yZSBsb2dpYyBoZXJlLgorICAgICAgICAgICAgICBpZihjb250cmFjdGlvbnNUYWJsZS0+Z2V0KFVuaWNvZGVTdHJpbmcodHJpYWwubmFtZSwgdHJpYWwubGVuKSkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGV4cGFuc2lvbkxpbmUuYXBwZW5kKCp0b1NvcnRbcHJldktdKTsKKyAgICAgICAgICAgICAgICBleHBJbmRleGVzW2V4cEluZGV4U2l6ZSsrXSA9IHByZXZLOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludDMyX3QgcHV0QnJlYWtQb2ludEhlcmUgPSAwOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBzZXF1ZW5jZUNvbXBsZXRlZCA9IFRSVUU7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy9icmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgcHJldksgPSBrOworICAgICAgICAgIGsrKzsKKyAgICAgICAgfQorICAgICAgICBpZighcHJldksgfHwgayA9PSBzaXplKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8vIGFmdGVyIHRoaXMgd2UgaGF2ZSBwcmltYXJpZXMgbGluZWQgdXAuCisgICAgICAvLyB3ZSBhcmUgZ29pbmcgdG8gZ29vc2UgdXAgd2l0aCBzZWNvbmRhcmllcyBhbmQgCisgICAgICAvLyB0ZXJ0aWFyaWVzCisgICAgICB0cmlhbC5zZXRUb0NvbmNhdCh0b1NvcnRbal0sICZleHBhbnNpb25MaW5lKTsKKyAgICAgIGV4cFN0cmVuZ3RoID0gcHJvYmUuZ2V0U3RyZW5ndGgodHJpYWwsICp0b1NvcnRbaV0pOworICAgICAgaWYoZXhwU3RyZW5ndGggPiBVQ09MX1BSSU1BUlkpIHsKKyAgICAgICAgaWYoZXhwU3RyZW5ndGggPT0gVUNPTF9TRUNPTkRBUlkgfHwgZXhwU3RyZW5ndGggPT0gVUNPTF9PRkYpIHsKKyAgICAgICAgICBqID0gZ29vc2VVcChqLCBpLCBleHBhbnNpb25MaW5lLCBleHBJbmRleGVzLCBleHBJbmRleFNpemUsIFVDT0xfU0VDT05EQVJZKTsKKyAgICAgICAgICB0cmlhbC5zZXRUb0NvbmNhdCh0b1NvcnRbal0sICZleHBhbnNpb25MaW5lKTsKKyAgICAgICAgICBleHBTdHJlbmd0aCA9IHByb2JlLmdldFN0cmVuZ3RoKHRyaWFsLCAqdG9Tb3J0W2ldKTsKKyAgICAgICAgICBpZihleHBTdHJlbmd0aCA9PSBVQ09MX1RFUlRJQVJZKSB7CisgICAgICAgICAgICBqID0gZ29vc2VVcChqLCBpLCBleHBhbnNpb25MaW5lLCBleHBJbmRleGVzLCBleHBJbmRleFNpemUsIFVDT0xfVEVSVElBUlkpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmKGV4cFN0cmVuZ3RoID09IFVDT0xfVEVSVElBUlkpIHsKKyAgICAgICAgICBqID0gZ29vc2VVcChqLCBpLCBleHBhbnNpb25MaW5lLCBleHBJbmRleGVzLCBleHBJbmRleFNpemUsIFVDT0xfVEVSVElBUlkpOworICAgICAgICB9CisgICAgICB9CisgICAgICB0cmlhbC5zZXRUb0NvbmNhdCh0b1NvcnRbal0sICZleHBhbnNpb25MaW5lKTsKKyAgICAgIGV4cFN0cmVuZ3RoID0gcHJvYmUuZ2V0U3RyZW5ndGgodHJpYWwsICp0b1NvcnRbaV0pOworICAgICAgaWYoZXhwYW5zaW9uTGluZS5sZW4pIHsKKyAgICAgICAgaWYoZXhwYW5zaW9uTGluZS5uYW1lWzBdID09IDB4NzMgJiYgZXhwYW5zaW9uTGluZS5uYW1lWzFdID09IDB4N2EpIHsKKyAgICAgICAgICBpbnQzMl90IHB1dEJyZWFrcG9pbnRoZXJlID0gMDsKKyAgICAgICAgfQorICAgICAgICBVQm9vbCBpc0V4cGFuc2lvbkxpbmVBQ29udHJhY3Rpb24gPSAoY29udHJhY3Rpb25zVGFibGUtPmdldChVbmljb2RlU3RyaW5nKGV4cGFuc2lvbkxpbmUubmFtZSwgZXhwYW5zaW9uTGluZS5sZW4pKSAhPSBOVUxMKTsKKyAgICAgICAgLy8gd2UgaGF2ZSBhbiBleHBhbnNpb24gbGluZSBhbmQgYW4gZXhwYW5zaW9uLiBUaGVyZSBjb3VsZCBiZSBzb21lIGV4cGFuc2lvbnMgd2hlcmUgCisgICAgICAgIC8vIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gZXhwYW5zaW9uIGxpbmUgYW5kIHRoZSBlbmQgb2YgZXhwYW5zaW9uIHNlcXVlbmNlIGlzIGxlc3Mgb3IgCisgICAgICAgIC8vIGVxdWFsIHRoYW4gdGhlIGV4cGFuc2lvbiBzdHJlbmd0aC4gVGhlc2Ugc2hvdWxkIHByb2JhYmx5IGJlIHJlbW92ZWQuCisgICAgICAgIGludDMyX3QgZGlmZkxlbiA9IHRvU29ydFtpXS0+bGVuIC0gZXhwYW5zaW9uTGluZS5sZW47CisgICAgICAgIGlmKGRpZmZMZW4gPiAwKSB7CisgICAgICAgICAgdHJpYWwuc2V0VG8oVW5pY29kZVN0cmluZyh0b1NvcnRbaV0tPm5hbWUgKyBkaWZmTGVuLCB0b1NvcnRbaV0tPmxlbiAtIGRpZmZMZW4pKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0cmlhbCA9ICp0b1NvcnRbaV07CisgICAgICAgIH0KKyAgICAgICAgVUNvbEF0dHJpYnV0ZVZhbHVlIHMxID0gcHJvYmUuZ2V0U3RyZW5ndGgodHJpYWwsIGV4cGFuc2lvbkxpbmUpOworICAgICAgICBpZihzMSA9PSBVQ09MX09GRikgeworICAgICAgICAgIHMxID0gcHJvYmUuZ2V0U3RyZW5ndGgoZXhwYW5zaW9uTGluZSwgdHJpYWwpOworICAgICAgICB9CisgICAgICAgIGlmKCghaXNFeHBhbnNpb25MaW5lQUNvbnRyYWN0aW9uICYmIHMxID49IGV4cFN0cmVuZ3RoKSB8fCAoZGlmZkxlbiA8PSAwICYmIHMxID09IFVDT0xfSURFTlRJQ0FMKSkgeworICAgICAgICAgIGNvbnRyYWN0aW9uc1RhYmxlLT5yZW1vdmUoVW5pY29kZVN0cmluZyh0b1NvcnRbaV0tPm5hbWUsIHRvU29ydFtpXS0+bGVuKSk7CisgICAgICAgICAgdG9Tb3J0W2ldLT5pc1JlbW92ZWQgPSBUUlVFOworICAgICAgICAgIGlmKHRvU29ydFtpXS0+bmV4dCAmJiB0b1NvcnRbaV0tPnByZXZpb3VzKSB7CisgICAgICAgICAgICB0b1NvcnRbaV0tPnByZXZpb3VzLT5uZXh0ID0gdG9Tb3J0W2ldLT5uZXh0OworICAgICAgICAgIH0KKyAgICAgICAgICBpZih0b1NvcnRbaV0tPnByZXZpb3VzICYmIHRvU29ydFtpXS0+bmV4dCkgeworICAgICAgICAgICAgdG9Tb3J0W2ldLT5uZXh0LT5wcmV2aW91cyA9IHRvU29ydFtpXS0+cHJldmlvdXM7CisgICAgICAgICAgfQorCSAgICAgIGRlYnVnLT5sb2coIkV4cCAtTjogIik7CisJICAgICAgZGVidWctPmxvZyh0b1NvcnRbaV0tPnRvU3RyaW5nKEZBTFNFKSk7CisJICAgICAgZGVidWctPmxvZygiIC8gIik7CisJICAgICAgZGVidWctPmxvZyhleHBhbnNpb25MaW5lLnRvU3RyaW5nKEZBTFNFKSwgVFJVRSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7ICAgICAgICAgCisgICAgICAgICAgdV9zdHJuY2F0KHRvU29ydFtpXS0+ZXhwYW5zaW9uU3RyaW5nLCBleHBhbnNpb25MaW5lLm5hbWUsIGV4cGFuc2lvbkxpbmUubGVuKTsKKyAgICAgICAgICB0b1NvcnRbaV0tPmlzRXhwYW5zaW9uID0gVFJVRTsKKyAgICAgICAgICB0b1NvcnRbaV0tPmV4cFN0cmVuZ3RoID0gZXhwU3RyZW5ndGg7CisgICAgICAgICAgdG9Tb3J0W2ldLT5leHBMZW4gPSBleHBhbnNpb25MaW5lLmxlbjsKKyAgICAgICAgICB0b1NvcnRbaV0tPmV4cGFuc2lvblN0cmluZ1t0b1NvcnRbaV0tPmV4cExlbl0gPSAwOworICAgICAgICAgIHRvU29ydFtpXS0+ZXhwSW5kZXggPSBqOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGlmKHRvU29ydFtpXS0+aXNFeHBhbnNpb24gPT0gVFJVRSkgeworICAgICAgaWYoZGVidWctPmlzT24oKSkgeworICAgICAgICBkZWJ1Zy0+bG9nKCJFeHAgKyA6ICYiKTsKKyAgICAgICAgZGVidWctPmxvZyh0b1NvcnRbal0tPnRvU3RyaW5nKEZBTFNFKSk7CisgICAgICAgIGRlYnVnLT5sb2codG9Tb3J0W2ldLT5zdHJlbmd0aFRvU3RyaW5nKHRvU29ydFtpXS0+ZXhwU3RyZW5ndGgsIFRSVUUpKTsKKyAgICAgICAgZGVidWctPmxvZyh0b1NvcnRbaV0tPnRvU3RyaW5nKEZBTFNFKSk7CisgICAgICAgIGRlYnVnLT5sb2coIiAiKTsKKyAgICAgICAgaWYoIXRvU29ydFtqXS0+c29ydEtleSkgeworICAgICAgICAgIGNhbGN1bGF0ZVNvcnRLZXkoKnRvU29ydFtqXSk7CisgICAgICAgIH0KKyAgICAgICAgZGVidWctPmxvZyh0b1NvcnRbal0tPmR1bXBTb3J0a2V5KCkpOworICAgICAgICBkZWJ1Zy0+bG9nKCIgLi4uICIpOworICAgICAgICBpZighdG9Tb3J0W2ldLT5zb3J0S2V5KSB7CisgICAgICAgICAgY2FsY3VsYXRlU29ydEtleSgqdG9Tb3J0W2ldKTsKKyAgICAgICAgfQorICAgICAgICBkZWJ1Zy0+bG9nKHRvU29ydFtpXS0+ZHVtcFNvcnRrZXkoKSk7CisgICAgICAgIGNhbGN1bGF0ZVNvcnRLZXkoZXhwYW5zaW9uTGluZSk7CisgICAgICAgIGRlYnVnLT5sb2coIi8iKTsKKyAgICAgICAgZGVidWctPmxvZyhleHBhbnNpb25MaW5lLmR1bXBTb3J0a2V5KCksIFRSVUUpOworICAgICAgfQorICAgICAgCisgICAgfQorICB9CisgIC8vIGFmdGVyIGRldGVjdGluZyBleHBhbnNpb25zLCB3ZSB3YW50IHRvIHBvc2l0aW9uIHRoZW0uIAorICAvLyBpdCBpcyBiZXR0ZXIgdG8gcG9zaXRpb24gZXhwYW5zaW9ucyBhZnRlciBhbGwgaGF2ZSBiZWVuIGRldGVjdGVkLAorICAvLyBzaW5jZSBvdGhlcndpc2Ugd2Ugd2lsbCBjaGFuZ2UgdGhlIG9yZGVyaW5nLgorICBmb3IoaSA9IHNpemUtMTsgaSA+PSAwOyBpLS0pIHsKKyAgICBpZih0b1NvcnRbaV0tPmlzRXhwYW5zaW9uKSB7CisgICAgICBpZih0b1NvcnRbaV0tPm5hbWVbMF0gPT0gMHgyQTMpIHsKKyAgICAgICAgaW50MzJfdCBwdXRCcmVha1BvaW50SGVyZSA9IDA7CisgICAgICB9CisgICAgICBpZihpKSB7CisgICAgICAgIGlmKHRvU29ydFtpXS0+cHJldmlvdXMpIHsKKyAgICAgICAgICB0b1NvcnRbaV0tPnByZXZpb3VzLT5uZXh0ID0gdG9Tb3J0W2ldLT5uZXh0OworICAgICAgICB9CisgICAgICB9CisgICAgICBpZihpIDwgc2l6ZS0xKSB7CisgICAgICAgIGlmKHRvU29ydFtpXS0+bmV4dCkgeworICAgICAgICAgIHRvU29ydFtpXS0+bmV4dC0+cHJldmlvdXMgPSB0b1NvcnRbaV0tPnByZXZpb3VzOworICAgICAgICB9CisgICAgICB9CisgICAgICBqID0gdG9Tb3J0W2ldLT5leHBJbmRleDsKKyAgICAgIHRvU29ydFtpXS0+bmV4dCA9IHRvU29ydFtqXS0+bmV4dDsKKyAgICAgIHRvU29ydFtpXS0+cHJldmlvdXMgPSB0b1NvcnRbal07CisgICAgICB0b1NvcnRbal0tPm5leHQgPSB0b1NvcnRbaV07CisgICAgICBpZih0b1NvcnRbaV0tPm5leHQpIHsKKyAgICAgICAgdG9Tb3J0W2ldLT5uZXh0LT5wcmV2aW91cyA9IHRvU29ydFtpXTsKKyAgICAgIH0KKyAgICAgIHRvU29ydFtpXS0+c3RyZW5ndGggPSB0b1NvcnRbaV0tPmV4cFN0cmVuZ3RoOworICAgIH0KKyAgfQorICByZXR1cm4gZXhDb3VudDsKK30KKworCitMaW5lICoKK1NvcnRlZExpbmVzOjpnZXRGaXJzdCgpIHsKKyAgY3VycmVudCA9IGZpcnN0OworICByZXR1cm4gY3VycmVudDsKK30KKworTGluZSAqCitTb3J0ZWRMaW5lczo6Z2V0TGFzdCgpIHsKKyAgY3VycmVudCA9IGxhc3Q7CisgIHJldHVybiBjdXJyZW50OworfQorCit2b2lkIAorU29ydGVkTGluZXM6OmFkZChMaW5lICpsaW5lLCBVQm9vbCBsaW5rSW4pIHsKKyAgaWYoc2l6ZSsrID09IGNhcGFjaXR5KSB7CisgICAgLy8gZ3JvdworICB9CisgIGxpbmVzW3NpemVdID0gKmxpbmU7CisgIExpbmUgKnRvQWRkID0gJmxpbmVzW3NpemVdOworICBpZihsaW5rSW4gJiYgZmlyc3QpIHsKKyAgICBMaW5lICpjdXJyZW50ID0gZmlyc3Q7CisgICAgd2hpbGUoY3VycmVudCAhPSBOVUxMICYmIHByb2JlLmNvbXBhcmVyKCZjdXJyZW50LCAmdG9BZGQpIDwgMCkgeworICAgICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHQ7CisgICAgfQorICAgIGlmKGN1cnJlbnQgPT0gTlVMTCkgeworICAgICAgdG9BZGQtPnByZXZpb3VzID0gbGFzdDsKKyAgICAgIHRvQWRkLT5uZXh0ID0gTlVMTDsKKyAgICAgIGlmKGxhc3QgIT0gTlVMTCkgeworICAgICAgICBsYXN0LT5uZXh0ID0gdG9BZGQ7CisgICAgICB9CisgICAgICBsYXN0ID0gdG9BZGQ7CisgICAgICBpZihmaXJzdCA9PSBOVUxMKSB7CisgICAgICAgIGZpcnN0ID0gdG9BZGQ7CisgICAgICB9CisgICAgfSBlbHNlIHsgLy8gY3VycmVudCAhPSBOVUxMCisgICAgICB0b0FkZC0+bmV4dCA9IGN1cnJlbnQ7CisgICAgICB0b0FkZC0+cHJldmlvdXMgPSBjdXJyZW50LT5wcmV2aW91czsKKyAgICAgIGlmKGN1cnJlbnQtPnByZXZpb3VzKSB7CisgICAgICAgIGN1cnJlbnQtPnByZXZpb3VzLT5uZXh0ID0gdG9BZGQ7CisgICAgICB9IGVsc2UgeworICAgICAgICBmaXJzdCA9IHRvQWRkOworICAgICAgfQorICAgICAgY3VycmVudC0+cHJldmlvdXMgPSB0b0FkZDsKKyAgICB9CisgIH0KK30KKworCitMaW5lICoKK1NvcnRlZExpbmVzOjpnZXROZXh0KCkKK3sKKyAgaWYoY3VycmVudCAhPSBOVUxMKSB7CisgICAgY3VycmVudD1jdXJyZW50LT5uZXh0OworICB9CisgIHJldHVybiBjdXJyZW50OworfQorCitMaW5lICoKK1NvcnRlZExpbmVzOjpnZXRQcmV2aW91cygpCit7CisgIGlmKGN1cnJlbnQgIT0gTlVMTCkgeworICAgIGN1cnJlbnQ9Y3VycmVudC0+cHJldmlvdXM7CisgIH0KKyAgcmV0dXJuIGN1cnJlbnQ7Cit9CisKK0xpbmUgKgorU29ydGVkTGluZXM6Om9wZXJhdG9yW10oaW50MzJfdCBpbmRleCkKK3sKKyAgaW50MzJfdCBpID0gMDsKKyAgTGluZSAqYyA9IGZpcnN0OworICBmb3IoaSA9IDA7IGkgPCBpbmRleDsgaSsrKSB7CisgICAgaWYoYyAhPSBOVUxMKSB7CisgICAgICBjID0gYy0+bmV4dDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGM7Cit9CisKK1VuaWNvZGVTdHJpbmcKK1NvcnRlZExpbmVzOjphcnJheVRvU3RyaW5nKExpbmUqKiBzb3J0ZWRMaW5lcywgaW50MzJfdCBsaW5lc1NpemUsIFVCb29sIHByZXR0eSwgVUJvb2wgdXNlTGlua3MsIFVCb29sIHByaW50U29ydEtleXMpIHsKKyAgVW5pY29kZVN0cmluZyByZXN1bHQ7CisgIGludDMyX3QgaSA9IDA7CisKKyAgTGluZSAqbGluZSA9IE5VTEw7CisgIExpbmUgKnByZXZpb3VzID0gc29ydGVkTGluZXNbMF07CisgIGlmKHByaW50U29ydEtleXMgJiYgIXNvcnRrZXlzKSB7CisgICAgcHJpbnRTb3J0S2V5cyA9IEZBTFNFOworICB9CisgIGlmKHByZXZpb3VzLT5pc1Jlc2V0KSB7CisgICAgcmVzdWx0LmFwcGVuZCgiICYgIik7CisgICAgcmVzdWx0LmFwcGVuZChwcmV2aW91cy0+bmFtZSwgcHJldmlvdXMtPmxlbik7CisgICAgaWYocHJldHR5KSB7CisgICAgICByZXN1bHQuYXBwZW5kKCIgICAgICAgICMgIik7CisgICAgICByZXN1bHQuYXBwZW5kKHByZXZpb3VzLT5zdHJpbmdUb05hbWUocHJldmlvdXMtPm5hbWUsIHByZXZpb3VzLT5sZW4pKTsKKyAgICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7CisgICAgfQorICB9IGVsc2UgaWYoIXByZXZpb3VzLT5pc1JlbW92ZWQpIHsKKyAgICByZXN1bHQuYXBwZW5kKHByZXZpb3VzLT50b1N0cmluZyhwcmV0dHkpKTsKKyAgICBpZihwcmV0dHkpIHsKKyAgICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7CisgICAgfQorICB9CisgIGkgPSAxOworICB3aGlsZSgoaSA8IGxpbmVzU2l6ZSAmJiAhdXNlTGlua3MpIHx8IChwcmV2aW91cy0+bmV4dCAmJiB1c2VMaW5rcykpIHsKKyAgICBpZih1c2VMaW5rcykgeworICAgICAgbGluZSA9IHByZXZpb3VzLT5uZXh0OworICAgIH0gZWxzZSB7CisgICAgICBsaW5lID0gc29ydGVkTGluZXNbaV07CisgICAgfQorICAgIGlmKGxpbmUtPmlzUmVzZXQpIHsKKyAgICAgIHJlc3VsdC5hcHBlbmQoIiAmIik7CisgICAgICByZXN1bHQuYXBwZW5kKGxpbmUtPm5hbWUsIGxpbmUtPmxlbik7CisgICAgICBpZihwcmV0dHkpIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiICAgICAgICAjICIpOworICAgICAgICByZXN1bHQuYXBwZW5kKGxpbmUtPnN0cmluZ1RvTmFtZShsaW5lLT5uYW1lLCBsaW5lLT5sZW4pKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYoIWxpbmUtPmlzUmVtb3ZlZCkgeworICAgICAgaWYoaSA+IDApIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChsaW5lLT5zdHJlbmd0aFRvU3RyaW5nKGxpbmUtPnN0cmVuZ3RoLCBwcmV0dHkpKTsKKyAgICAgIH0KKyAgICAgIHJlc3VsdC5hcHBlbmQobGluZS0+dG9TdHJpbmcocHJldHR5KSk7CisgICAgICBpZihwcmludFNvcnRLZXlzKSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQobGluZS0+ZHVtcFNvcnRrZXkoKSk7CisgICAgICB9CisgICAgICBpZihwcmV0dHkpIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKKyAgICAgIH0KKyAgICB9CisgICAgcHJldmlvdXMgPSBsaW5lOworICAgIGkrKzsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitTb3J0ZWRMaW5lczo6U29ydGVkTGluZXMoRklMRSAqZmlsZSwgVVByaW50ZXIgKmxvZ2dlciwgVVByaW50ZXIgKmRlYnVnLCBVRXJyb3JDb2RlICZzdGF0dXMpIDoKK3RvU29ydChOVUxMKSwKK3RvU29ydENhcGFjaXR5KDApLAorbGluZXMoTlVMTCksCitzaXplKDApLAorY2FwYWNpdHkoMCksCitmaXJzdChOVUxMKSwKK2xhc3QoTlVMTCksCitsb2dnZXIobG9nZ2VyKSwKK2RlYnVnKGRlYnVnKSwKK2NvbnRyYWN0aW9uc1RhYmxlKE5VTEwpLAorZHVwbGljYXRvcnMoTlVMTCksCittYXhFeHBhbnNpb25QcmVmaXhTaXplKDApLAord29yZFNvcnQoRkFMU0UpLAorZnJlbmNoU2Vjb25kYXJ5KEZBTFNFKSwKK3VwcGVyRmlyc3QoRkFMU0UpLAorc29ydGtleXMoTlVMTCksCitzb3J0a2V5T2Zmc2V0KDApCit7CisgIGRlYnVnLT5sb2coIioqKiBsb2FkaW5nIGEgZHVtcFxuIik7CisgIG1lbXNldChVQiwgMCwgc2l6ZW9mKFVCKSk7CisgIGludDMyX3QgaSA9IDA7CisgIGZvcihpID0gMDsgaSA8IFVDT0xfT0ZGOyBpKyspIHsKKyAgICBVQltpXSA9ICZlbXB0eTsKKyAgfQorCisgIGludDMyX3QgbmV3RnJlbmNoLCBuZXdVcHBlckZpcnN0OworICBmc2NhbmYoZmlsZSwgIiVpLCVpLCVpXG4iLCAmc2l6ZSwgJm5ld0ZyZW5jaCwgJm5ld1VwcGVyRmlyc3QpOworICBkZWJ1Zy0+bG9nKCJSZWFkIHNpemUgJWksIGZyZW5jaFNlY29uZGFyeSAlaSBhbmQgdXBwZXJGaXJzdCAlaVxuIiwgc2l6ZSwgbmV3RnJlbmNoLCBuZXdVcHBlckZpcnN0KTsKKyAgZnJlbmNoU2Vjb25kYXJ5ID0gKFVCb29sKW5ld0ZyZW5jaDsKKyAgdXBwZXJGaXJzdCA9IChVQm9vbCluZXdVcHBlckZpcnN0OworICBjYXBhY2l0eSA9IHNpemU7CisgIGxpbmVzID0gbmV3IExpbmVbY2FwYWNpdHldOworICBpID0gMDsKKworICBjaGFyIGJ1ZmZbMjU2XTsKKworICB3aGlsZShmZ2V0cyhidWZmLCAyNTYsIGZpbGUpKSB7CisgICAgaWYoaSAlIDIwID09IDApIHsKKyAgICAgIGxvZ2dlci0+bG9nKCJcckxpbmU6ICUwNGkiLCBpLCBidWZmKTsKKyAgICB9CisgICAgbGluZXNbaV0uaW5pdEZyb21TdHJpbmcoYnVmZiwgMjU2LCBzdGF0dXMpOworICAgIGlmKGkpIHsKKyAgICAgIGxpbmVzW2ldLnByZXZpb3VzID0gJmxpbmVzW2ktMV07CisgICAgICBsaW5lc1tpLTFdLm5leHQgPSAmbGluZXNbaV07CisgICAgfQorICAgIGkrKzsKKyAgfQorICBzaXplID0gaTsKKyAgdG9Tb3J0ID0gbmV3IExpbmUqW3NpemVdOworICBzZXRTb3J0aW5nQXJyYXkodG9Tb3J0LCBsaW5lcywgc2l6ZSk7CisgIGZpcnN0ID0gJmxpbmVzWzBdOworICBsYXN0ID0gJmxpbmVzW3NpemUtMV07Cit9CisKK3ZvaWQKK1NvcnRlZExpbmVzOjp0b0ZpbGUoRklMRSAqZmlsZSwgVUJvb2wgdXNlTGlua3MsIFVFcnJvckNvZGUgJnN0YXR1cykgCit7CisgIGZwcmludGYoZmlsZSwgIiVpLCVpLCVpXG4iLCBzaXplLCBmcmVuY2hTZWNvbmRhcnksIHVwcGVyRmlyc3QpOworICBpbnQzMl90IGkgPSAxOworICBMaW5lICpwcmV2aW91cyA9IHRvU29ydFswXTsKKyAgTGluZSAqbGluZSA9IE5VTEw7CisgIGNoYXIgYnVmZlsyNTZdOworICBwcmV2aW91cy0+d3JpdGUoYnVmZiwgMjU2LCBzdGF0dXMpOworICBmcHJpbnRmKGZpbGUsICIlc1xuIiwgYnVmZik7CisgIGZmbHVzaChmaWxlKTsKKyAgd2hpbGUocHJldmlvdXMtPm5leHQpIHsKKyAgICBpZih1c2VMaW5rcykgeworICAgICAgbGluZSA9IHByZXZpb3VzLT5uZXh0OworICAgIH0gZWxzZSB7CisgICAgICBsaW5lID0gdG9Tb3J0W2ldOworICAgIH0KKyAgICBsaW5lLT53cml0ZShidWZmLCAyNTYsIHN0YXR1cyk7CisgICAgZnByaW50ZihmaWxlLCAiJXNcbiIsIGJ1ZmYpOworICAgIGkrKzsKKyAgICBwcmV2aW91cyA9IGxpbmU7CisgIH0KK30KKworCisKK1VuaWNvZGVTdHJpbmcgCitTb3J0ZWRMaW5lczo6dG9TdHJpbmdGcm9tRW1wdHkoKSB7CisgIFVCb29sIHVzZUxpbmtzID0gRkFMU0U7CisgIFVCb29sIHByZXR0eSA9IEZBTFNFOworICBVbmljb2RlU3RyaW5nIHJlc3VsdDsKKyAgaW50MzJfdCBpID0gMDsKKworICBMaW5lICpsaW5lID0gTlVMTDsKKyAgTGluZSAqcHJldmlvdXMgPSB0b1NvcnRbMF07CisgIGlmKHByZXZpb3VzLT5pc1Jlc2V0KSB7CisgICAgcmVzdWx0LmFwcGVuZCgiICYgIik7CisgICAgaWYocHJldHR5KSB7CisgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOworICAgIH0KKyAgICByZXN1bHQuYXBwZW5kKHByZXZpb3VzLT5uYW1lLCBwcmV2aW91cy0+bGVuKTsKKyAgfSBlbHNlIGlmKCFwcmV2aW91cy0+aXNSZW1vdmVkKSB7CisgICAgcmVzdWx0LmFwcGVuZChwcmV2aW91cy0+dG9TdHJpbmcocHJldHR5KSk7CisgICAgaWYocHJldHR5KSB7CisgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOworICAgIH0KKyAgfQorICBpID0gMTsKKyAgd2hpbGUoaSA8IHNpemUgfHwgcHJldmlvdXMtPm5leHQpIHsKKyAgICBpZih1c2VMaW5rcykgeworICAgICAgbGluZSA9IHByZXZpb3VzLT5uZXh0OworICAgIH0gZWxzZSB7CisgICAgICBsaW5lID0gdG9Tb3J0W2ldOworICAgIH0KKyAgICBpZihsaW5lLT5pc1Jlc2V0KSB7CisgICAgICByZXN1bHQuYXBwZW5kKCIgJiIpOworICAgICAgcmVzdWx0LmFwcGVuZChsaW5lLT5uYW1lLCBsaW5lLT5sZW4pOworICAgICAgaWYocHJldHR5KSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAgICAgICAgIyAiKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChsaW5lLT5zdHJpbmdUb05hbWUobGluZS0+bmFtZSwgbGluZS0+bGVuKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7CisgICAgICB9CisgICAgfSBlbHNlIGlmKCFsaW5lLT5pc1JlbW92ZWQpIHsKKyAgICAgIGlmKGkgPiAwKSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQobGluZS0+c3RyZW5ndGhUb1N0cmluZyhsaW5lLT5zdHJlbmd0aEZyb21FbXB0eSwgcHJldHR5KSk7CisgICAgICB9CisgICAgICByZXN1bHQuYXBwZW5kKGxpbmUtPnRvU3RyaW5nKHByZXR0eSkpOworICAgICAgaWYocHJldHR5KSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7CisgICAgICB9CisgICAgfQorICAgIHByZXZpb3VzID0gbGluZTsKKyAgICBpKys7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworVW5pY29kZVN0cmluZyAKK1NvcnRlZExpbmVzOjp0b1N0cmluZyhVQm9vbCB1c2VMaW5rcykgCit7CisgIHJldHVybiBhcnJheVRvU3RyaW5nKHRvU29ydCwgc2l6ZSwgRkFMU0UsIHVzZUxpbmtzLCBGQUxTRSk7Cit9CisKKworVW5pY29kZVN0cmluZyAKK1NvcnRlZExpbmVzOjp0b1ByZXR0eVN0cmluZyhVQm9vbCB1c2VMaW5rcywgVUJvb2wgcHJpbnRTb3J0S2V5cykgCit7CisgIHJldHVybiBhcnJheVRvU3RyaW5nKHRvU29ydCwgc2l6ZSwgVFJVRSwgdXNlTGlua3MsIHByaW50U29ydEtleXMpOworfQorCitVbmljb2RlU3RyaW5nIAorU29ydGVkTGluZXM6OnRvT3V0cHV0KGNvbnN0IGNoYXIgKmZvcm1hdCwgCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmxvY2FsZSwgY29uc3QgY2hhciAqcGxhdGZvcm0sIGNvbnN0IGNoYXIgKnJlZmVyZW5jZSwgCisgICAgICAgICAgICAgICAgICAgICAgIFVCb29sIHVzZUxpbmtzLCBVQm9vbCBpbml0aWFsaXplLCBVQm9vbCBtb3JlVG9Db21lKSB7CisgIGlmKHN0cmNtcChmb3JtYXQsICJIVE1MIikgPT0gMCkgeworICAgIHJldHVybiB0b0hUTUwobG9jYWxlLCBwbGF0Zm9ybSwgcmVmZXJlbmNlLCB1c2VMaW5rcywgaW5pdGlhbGl6ZSwgbW9yZVRvQ29tZSk7CisgIH0gZWxzZSBpZihzdHJjbXAoZm9ybWF0LCAiWE1MIikgPT0gMCkgeworICAgIHJldHVybiB0b1hNTChsb2NhbGUsIHBsYXRmb3JtLCByZWZlcmVuY2UsIHVzZUxpbmtzLCBpbml0aWFsaXplLCBtb3JlVG9Db21lKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gdG9CdW5kbGUobG9jYWxlLCBwbGF0Zm9ybSwgcmVmZXJlbmNlLCB1c2VMaW5rcywgaW5pdGlhbGl6ZSwgbW9yZVRvQ29tZSk7CisgIH0KK30KKworCitVbmljb2RlU3RyaW5nIAorU29ydGVkTGluZXM6OnRvSFRNTChjb25zdCBjaGFyICpsb2NhbGUsIAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwbGF0Zm9ybSwgY29uc3QgY2hhciAqcmVmZXJlbmNlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgVUJvb2wgdXNlTGlua3MsIFVCb29sIGluaXRpYWxpemUsIFVCb29sIG1vcmVUb0NvbWUpCit7CisgIFVuaWNvZGVTdHJpbmcgcmVzdWx0OworICBpbnQzMl90IGkgPSAwOworICBpZihpbml0aWFsaXplKSB7CisgICAgcmVzdWx0LmFwcGVuZCgiPGh0bWw+XG48aGVhZD5cbjxtZXRhIGh0dHAtZXF1aXY9XCJjb250ZW50LXR5cGVcIiBjb250ZW50PVwidGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04XCI+XG48L2hlYWQ+XG4iKTsKKyAgICByZXN1bHQuYXBwZW5kKCIjIENvbGxhdGlvbiBkYXRhIHJlc291cmNlIGJ1bmRsZSBnZW5lcmF0ZWQgZm9yIGxvY2FsZTogIik7CisgICAgcmVzdWx0LmFwcGVuZChsb2NhbGUpOworICAgIHJlc3VsdC5hcHBlbmQoIjxicj5cbiMgRm9yIHBsYXRmb3JtICIpOworICAgIHJlc3VsdC5hcHBlbmQocGxhdGZvcm0pOworICAgIHJlc3VsdC5hcHBlbmQoIiByZWZlcmVuY2UgcGxhdGZvcm0gIik7CisgICAgcmVzdWx0LmFwcGVuZChyZWZlcmVuY2UpOworICAgIHJlc3VsdC5hcHBlbmQoIjxicj48YnI+XG5cblxuIik7CisKKyAgICByZXN1bHQuYXBwZW5kKGxvY2FsZSk7CisgICAgaWYocGxhdGZvcm0pIHsKKyAgICAgIHJlc3VsdC5hcHBlbmQoIl8iKTsKKyAgICAgIHJlc3VsdC5hcHBlbmQocGxhdGZvcm0pOworICAgIH0KKyAgICBpZihyZWZlcmVuY2UpIHsKKyAgICAgIHJlc3VsdC5hcHBlbmQoIl92c18iKTsKKyAgICAgIHJlc3VsdC5hcHBlbmQocmVmZXJlbmNlKTsKKyAgICB9CisgICAgcmVzdWx0LmFwcGVuZCgiJm5ic3A7ezxicj5cbiIpOworCisgICAgcmVzdWx0LmFwcGVuZCgiJm5ic3A7Jm5ic3A7Y29sbGF0aW9ucyZuYnNwO3s8YnI+XG4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtzdGFuZGFyZCZuYnNwO3s8YnI+XG4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtTZXF1ZW5jZSZuYnNwO3s8YnI+XG4iKTsKKyAgfQorCisgIGlmKGZyZW5jaFNlY29uZGFyeSkgeworICAgIHJlc3VsdC5hcHBlbmQoIltiYWNrd2FyZHMgMl08YnI+XG4iKTsKKyAgfQorICBpZih1cHBlckZpcnN0KSB7CisgICAgcmVzdWx0LmFwcGVuZCgiW2Nhc2VmaXJzdCB1cHBlcl08YnI+XG4iKTsKKyAgfQorCisgIExpbmUgKmxpbmUgPSB0b1NvcnRbMF07CisKKyAgaSA9IDA7CisgIHdoaWxlKChpIDwgc2l6ZSAmJiAhdXNlTGlua3MpIHx8IChsaW5lLT5uZXh0ICYmIHVzZUxpbmtzKSkgeworICAgIGlmKGxpbmUtPmlzUmVzZXQgfHwgIWxpbmUtPmlzUmVtb3ZlZCkgeworICAgICAgcmVzdWx0LmFwcGVuZChsaW5lLT50b0hUTUxTdHJpbmcoKSk7CisgICAgfQorICAgIGkrKzsKKyAgICBpZih1c2VMaW5rcykgeworICAgICAgbGluZSA9IGxpbmUtPm5leHQ7CisgICAgfSBlbHNlIHsKKyAgICAgIGxpbmUgPSB0b1NvcnRbaV07CisgICAgfQorICB9CisgIGlmKCFtb3JlVG9Db21lKSB7CisgICAgcmVzdWx0LmFwcGVuZCgiJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7fTxicj5cbiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO308YnI+XG4mbmJzcDsmbmJzcDt9PGJyPlxufTxicj5cbiIpOworCisgICAgcmVzdWx0LmFwcGVuZCgiPC9odG1sPlxuIik7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCitVbmljb2RlU3RyaW5nIAorU29ydGVkTGluZXM6OnRvWE1MKGNvbnN0IGNoYXIgKmxvY2FsZSwgCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBsYXRmb3JtLCBjb25zdCBjaGFyICpyZWZlcmVuY2UsIAorICAgICAgICAgICAgICAgICAgICAgICBVQm9vbCB1c2VMaW5rcywgVUJvb2wgaW5pdGlhbGl6ZSwgVUJvb2wgbW9yZVRvQ29tZSkKK3sKKyAgVW5pY29kZVN0cmluZyByZXN1bHQ7CisgIGludDMyX3QgaSA9IDA7CisgIGlmKGluaXRpYWxpemUpIHsKKyAgICByZXN1bHQuYXBwZW5kKCI8aHRtbD5cbjxoZWFkPlxuPG1ldGEgaHR0cC1lcXVpdj1cImNvbnRlbnQtdHlwZVwiIGNvbnRlbnQ9XCJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLThcIj5cbjwvaGVhZD5cbiIpOworICAgIHJlc3VsdC5hcHBlbmQoIiMgQ29sbGF0aW9uIGRhdGEgcmVzb3VyY2UgYnVuZGxlIGdlbmVyYXRlZCBmb3IgbG9jYWxlOiAiKTsKKyAgICByZXN1bHQuYXBwZW5kKGxvY2FsZSk7CisgICAgcmVzdWx0LmFwcGVuZCgiPGJyPlxuIyBGb3IgcGxhdGZvcm0gIik7CisgICAgcmVzdWx0LmFwcGVuZChwbGF0Zm9ybSk7CisgICAgcmVzdWx0LmFwcGVuZCgiIHJlZmVyZW5jZSBwbGF0Zm9ybSAiKTsKKyAgICByZXN1bHQuYXBwZW5kKHJlZmVyZW5jZSk7CisgICAgcmVzdWx0LmFwcGVuZCgiPGJyPjxicj5cblxuXG4iKTsKKworICAgIHJlc3VsdC5hcHBlbmQobG9jYWxlKTsKKyAgICBpZihwbGF0Zm9ybSkgeworICAgICAgcmVzdWx0LmFwcGVuZCgiXyIpOworICAgICAgcmVzdWx0LmFwcGVuZChwbGF0Zm9ybSk7CisgICAgfQorICAgIGlmKHJlZmVyZW5jZSkgeworICAgICAgcmVzdWx0LmFwcGVuZCgiX3ZzXyIpOworICAgICAgcmVzdWx0LmFwcGVuZChyZWZlcmVuY2UpOworICAgIH0KKyAgICByZXN1bHQuYXBwZW5kKCImbmJzcDt7PGJyPlxuIik7CisKKyAgICByZXN1bHQuYXBwZW5kKCImbmJzcDsmbmJzcDtjb2xsYXRpb25zJm5ic3A7ezxicj5cbiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO3N0YW5kYXJkJm5ic3A7ezxicj5cbiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO1NlcXVlbmNlJm5ic3A7ezxicj5cbiIpOworICB9CisKKyAgaWYoZnJlbmNoU2Vjb25kYXJ5KSB7CisgICAgcmVzdWx0LmFwcGVuZCgiW2JhY2t3YXJkcyAyXTxicj5cbiIpOworICB9CisgIGlmKHVwcGVyRmlyc3QpIHsKKyAgICByZXN1bHQuYXBwZW5kKCJbY2FzZWZpcnN0IHVwcGVyXTxicj5cbiIpOworICB9CisKKyAgTGluZSAqbGluZSA9IHRvU29ydFswXTsKKworICBpID0gMDsKKyAgd2hpbGUoKGkgPCBzaXplICYmICF1c2VMaW5rcykgfHwgKGxpbmUtPm5leHQgJiYgdXNlTGlua3MpKSB7CisgICAgaWYobGluZS0+aXNSZXNldCB8fCAhbGluZS0+aXNSZW1vdmVkKSB7CisgICAgICByZXN1bHQuYXBwZW5kKGxpbmUtPnRvSFRNTFN0cmluZygpKTsKKyAgICB9CisgICAgaSsrOworICAgIGlmKHVzZUxpbmtzKSB7CisgICAgICBsaW5lID0gbGluZS0+bmV4dDsKKyAgICB9IGVsc2UgeworICAgICAgbGluZSA9IHRvU29ydFtpXTsKKyAgICB9CisgIH0KKyAgaWYoIW1vcmVUb0NvbWUpIHsKKyAgICByZXN1bHQuYXBwZW5kKCImbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDt9PGJyPlxuJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7fTxicj5cbiZuYnNwOyZuYnNwO308YnI+XG59PGJyPlxuIik7CisKKyAgICByZXN1bHQuYXBwZW5kKCI8L2h0bWw+XG4iKTsKKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9CisKK1VuaWNvZGVTdHJpbmcgCitTb3J0ZWRMaW5lczo6dG9CdW5kbGUoY29uc3QgY2hhciAqbG9jYWxlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcGxhdGZvcm0sIGNvbnN0IGNoYXIgKnJlZmVyZW5jZSwgCisgICAgICAgICAgICAgICAgICAgICAgIFVCb29sIHVzZUxpbmtzLCBVQm9vbCBpbml0aWFsaXplLCBVQm9vbCBtb3JlVG9Db21lKQoreworICBVbmljb2RlU3RyaW5nIHJlc3VsdDsKKyAgaW50MzJfdCBpID0gMDsKKworICBpZihpbml0aWFsaXplKSB7CisgICAgcmVzdWx0LmFwcGVuZCgiLy8gQ29sbGF0aW9uIGRhdGEgcmVzb3VyY2UgYnVuZGxlIGdlbmVyYXRlZCBmb3IgbG9jYWxlOiAiKTsKKyAgICByZXN1bHQuYXBwZW5kKGxvY2FsZSk7CisgICAgcmVzdWx0LmFwcGVuZCgiXG4vLyBGb3IgcGxhdGZvcm0gIik7CisgICAgcmVzdWx0LmFwcGVuZChwbGF0Zm9ybSk7CisgICAgcmVzdWx0LmFwcGVuZCgiIHJlZmVyZW5jZSBwbGF0Zm9ybSAiKTsKKyAgICByZXN1bHQuYXBwZW5kKHJlZmVyZW5jZSk7CisgICAgcmVzdWx0LmFwcGVuZCgiXG5cblxuIik7CisKKyAgICByZXN1bHQuYXBwZW5kKGxvY2FsZSk7CisgICAgLyoKKyAgICBpZihwbGF0Zm9ybSkgeworICAgICAgcmVzdWx0LmFwcGVuZCgiXyIpOworICAgICAgcmVzdWx0LmFwcGVuZChwbGF0Zm9ybSk7CisgICAgfQorICAgIGlmKHJlZmVyZW5jZSkgeworICAgICAgcmVzdWx0LmFwcGVuZCgiX3ZzXyIpOworICAgICAgcmVzdWx0LmFwcGVuZChyZWZlcmVuY2UpOworICAgIH0KKyAgICAqLworICAgIHJlc3VsdC5hcHBlbmQoIiB7XG4iKTsKKworICAgIHJlc3VsdC5hcHBlbmQoIiAgY29sbGF0aW9ucyB7XG4gICBzdGFuZGFyZCB7XG4gICAgU2VxdWVuY2Uge1xuIik7CisgIH0KKworICBpZihmcmVuY2hTZWNvbmRhcnkpIHsKKyAgICByZXN1bHQuYXBwZW5kKCJbYmFja3dhcmRzIDJdXG4iKTsKKyAgfQorICBpZih1cHBlckZpcnN0KSB7CisgICAgcmVzdWx0LmFwcGVuZCgiW2Nhc2VmaXJzdCB1cHBlcl1cbiIpOworICB9CisKKyAgTGluZSAqbGluZSA9IHRvU29ydFswXTsKKworICBpID0gMDsKKyAgd2hpbGUoKGkgPCBzaXplICYmICF1c2VMaW5rcykgfHwgKGxpbmUtPm5leHQgJiYgdXNlTGlua3MpKSB7CisgICAgaWYobGluZS0+aXNSZXNldCB8fCAhbGluZS0+aXNSZW1vdmVkKSB7CisgICAgICByZXN1bHQuYXBwZW5kKGxpbmUtPnRvQnVuZGxlU3RyaW5nKCkpOworICAgIH0KKyAgICBpKys7CisgICAgaWYodXNlTGlua3MpIHsKKyAgICAgIGxpbmUgPSBsaW5lLT5uZXh0OworICAgIH0gZWxzZSB7CisgICAgICBsaW5lID0gdG9Tb3J0W2ldOworICAgIH0KKyAgfQorCisgIGlmKCFtb3JlVG9Db21lKSB7CisgICAgcmVzdWx0LmFwcGVuZCgiICAgIH1cbiAgIH1cbiAgfVxufVxuIik7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCisKK2ludDMyX3QgCitTb3J0ZWRMaW5lczo6Z2V0U2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIHJlcGVydG9pcmUuc2l6ZSgpOworfQorCit2b2lkCitTb3J0ZWRMaW5lczo6cmVkdWNlRGlmZmVyZW5jZShTb3J0ZWRMaW5lcyYgcmVmZXJlbmNlKSB7CisgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICBpZih1cHBlckZpcnN0KSB7CisgICAgc3dhcENhc2UoKTsKKyAgfQorICAvLyBib3RoIHNvcnRlZCBsaW5lcyBzdHJ1Y3R1cmVzIG5lZWQgdG8gaGF2ZSBlc3RhYmxpc2hlZCBsaW5rcyBhbmQgc3RyZW5ndGhzCisgIC8vIFdlIHdhbGsgZG93biBib3RoIHN0cnVjdHVyZXMgYW5kIG5vdGUgZGlmZmVyZW5jZXMuIFRoZXNlCisgIC8vIGRpZmZlcmVuY2VzIHdpbGwgbW9kaWZ5IHRoaXMgYnkgcmVtb3ZuZyBlbGVtZW50cywgc2V0dGluZyByZXNldHMKKyAgLy8gZXRjLi4uCisgIC8vIHdlIHdpbGwgcHJlZmVyIGluc2VydGlvbnMgZnJvbSB0YWlsb3JpbmcgdG8gcmVmZXJlbmNlLCB0aGVuIGRlbGV0aW9ucworICAvLyB0aGVyZSBhcmUgdHdvIHRhYmxlcyB0aGF0IGtlZXAgc2VlbiBlbGVtZW50cy4KKyAgSGFzaHRhYmxlICpzZWVuVGhpcyA9IG5ldyBIYXNodGFibGUoKTsKKyAgSGFzaHRhYmxlICpzZWVuUmVmZXJlbmNlID0gbmV3IEhhc2h0YWJsZSgpOworCisKKyAgVUJvb2wgZm91bmQgPSBGQUxTRTsKKyAgVUJvb2wgZmluaXNoZWQgPSBGQUxTRTsKKyAgY29uc3QgaW50MzJfdCBsb29rRm9yd2FyZCA9IDIwOworICBpbnQzMl90IHRhaWxvcmluZ01vdmUgPSAwOworICAvL2ludDMyX3QgcmVmZXJlbmNlU2l6ZSA9IHJlZmVyZW5jZS5nZXRTaXplKCk7CisgIExpbmUgKnJlZkxpbmUgPSByZWZlcmVuY2UuZ2V0Rmlyc3QoKTsKKyAgTGluZSAqcmVmTGF0ZXN0RXF1YWwgPSByZWZMaW5lOworICByZWZMaW5lID0gcmVmTGluZS0+bmV4dDsKKyAgTGluZSAqbXlMaW5lID0gZ2V0Rmlyc3QoKTsKKyAgTGluZSAqbXlMYXRlc3RFcXVhbCA9IG15TGluZTsKKyAgbXlMYXRlc3RFcXVhbC0+aXNSZW1vdmVkID0gVFJVRTsKKyAgbXlMaW5lID0gbXlMaW5lLT5uZXh0OworICB3aGlsZShteUxpbmUgJiYgcmVmTGluZSkgeworICAgIGZvdW5kID0gRkFMU0U7CisgICAgd2hpbGUobXlMaW5lICYmIHJlZkxpbmUgJiYgbXlMaW5lLT5lcXVhbHMoKnJlZkxpbmUpKSB7CisgICAgICBteUxhdGVzdEVxdWFsID0gbXlMaW5lOworICAgICAgbXlMYXRlc3RFcXVhbC0+aXNSZW1vdmVkID0gVFJVRTsKKyAgICAgIG15TGluZSA9IG15TGluZS0+bmV4dDsKKyAgICAgIHJlZkxhdGVzdEVxdWFsID0gcmVmTGluZTsKKyAgICAgIHJlZkxpbmUgPSByZWZMaW5lLT5uZXh0OworICAgICAgaWYocmVmTGluZSA9PSBOVUxMICYmIG15TGluZSA9PSBOVUxMKSB7CisgICAgICAgIGZpbmlzaGVkID0gVFJVRTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYobXlMaW5lKSB7CisgICAgICBteUxpbmUtPmN1bXVsYXRpdmVTdHJlbmd0aCA9IG15TGluZS0+c3RyZW5ndGg7ICAKKyAgICB9CisgICAgaWYocmVmTGluZSkgeworICAgICAgcmVmTGluZS0+Y3VtdWxhdGl2ZVN0cmVuZ3RoID0gcmVmTGluZS0+c3RyZW5ndGg7CisgICAgfQorIAorICAgIC8vIGhlcmUgaXMgdGhlIGRpZmZlcmVuY2UKKyAgICB3aGlsZSghZm91bmQgJiYgIWZpbmlzaGVkKSB7CisgICAgICB0YWlsb3JpbmdNb3ZlID0gMDsKKyAgICAgIGlmKG15TGluZSAmJiByZWZMaW5lKSB7CisgICAgICAgIGlmKG15TGluZS0+Y3VtdWxhdGl2ZVN0cmVuZ3RoID4gcmVmTGluZS0+Y3VtdWxhdGl2ZVN0cmVuZ3RoKSB7IAorICAgICAgICAgIC8vIHRhaWxvcmluZyB6IDw8PCB4LCBVQ0EgeiA8IHkKKyAgICAgICAgICB3aGlsZShteUxpbmUtPmN1bXVsYXRpdmVTdHJlbmd0aCA+IHJlZkxpbmUtPmN1bXVsYXRpdmVTdHJlbmd0aCkgeworICAgICAgICAgICAgbXlMaW5lID0gbXlMaW5lLT5uZXh0OworICAgICAgICAgICAgaWYobXlMaW5lKSB7CisgICAgICAgICAgICAgIHRyYW5zZmVyQ3VtdWxhdGl2ZVN0cmVuZ3RoKG15TGluZS0+cHJldmlvdXMsIG15TGluZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZihteUxpbmUtPmN1bXVsYXRpdmVTdHJlbmd0aCA8IHJlZkxpbmUtPmN1bXVsYXRpdmVTdHJlbmd0aCkgeyAgCisgICAgICAgICAgLy8gdGFpbG9yaW5nIHogPCB4LCBVQ0EgeiA8PDwgeQorICAgICAgICAgIHdoaWxlKG15TGluZS0+Y3VtdWxhdGl2ZVN0cmVuZ3RoIDwgcmVmTGluZS0+Y3VtdWxhdGl2ZVN0cmVuZ3RoKSB7CisgICAgICAgICAgICBzZWVuUmVmZXJlbmNlLT5wdXQoVW5pY29kZVN0cmluZyhyZWZMaW5lLT5uYW1lLCByZWZMaW5lLT5sZW4pLCByZWZMaW5lLCBzdGF0dXMpOworICAgICAgICAgICAgcmVmTGluZSA9IHJlZkxpbmUtPm5leHQ7CisgICAgICAgICAgICBpZihyZWZMaW5lKSB7CisgICAgICAgICAgICAgIHRyYW5zZmVyQ3VtdWxhdGl2ZVN0cmVuZ3RoKHJlZkxpbmUtPnByZXZpb3VzLCByZWZMaW5lKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyB0aGlzIGlzIHRoZSBpbnRlcmVzdGluZyBwb2ludC4gTm93IHdlIHNlYXJjaCBmb3IgY2hhcmFjdGVyIG1hdGNoCisgICAgICAgIHdoaWxlKG15TGluZSAmJiByZWZMaW5lICYmICghbXlMaW5lLT5lcXVhbHMoKnJlZkxpbmUpIHx8IG15TGluZS0+c3RyZW5ndGggPT0gVUNPTF9JREVOVElDQUwpCisgICAgICAgICAgJiYgdGFpbG9yaW5nTW92ZSA8IGxvb2tGb3J3YXJkKSB7CisgICAgICAgICAgaWYoc2VlblRoaXMtPmdldChVbmljb2RlU3RyaW5nKHJlZkxpbmUtPm5hbWUsIHJlZkxpbmUtPmxlbikpKSB7CisgICAgICAgICAgICAvLyB3ZSBhcmUgbm90IGludGVyZXN0ZWQgaW4gc3R1ZmYgZnJvbSB0aGUgcmVmZXJlbmNlIHRoYXQgaXMgYWxyZWFkeSBhY2NvdW50ZWQKKyAgICAgICAgICAgIC8vIGZvciBpbiB0aGUgdGFpbG9yaW5nLgorICAgICAgICAgICAgcmVmTGluZSA9IHJlZkxpbmUtPm5leHQ7CisgICAgICAgICAgICBpZihyZWZMaW5lKSB7CisgICAgICAgICAgICAgIHRyYW5zZmVyQ3VtdWxhdGl2ZVN0cmVuZ3RoKHJlZkxpbmUtPnByZXZpb3VzLCByZWZMaW5lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbXlMaW5lID0gbXlMaW5lLT5uZXh0OworICAgICAgICAgICAgaWYobXlMaW5lKSB7CisgICAgICAgICAgICAgIHRyYW5zZmVyQ3VtdWxhdGl2ZVN0cmVuZ3RoKG15TGluZS0+cHJldmlvdXMsIG15TGluZSk7CisgICAgICAgICAgICAgIGlmKCFzZWVuUmVmZXJlbmNlLT5nZXQoVW5pY29kZVN0cmluZyhteUxpbmUtPm5hbWUsIG15TGluZS0+bGVuKSkpIHsKKyAgICAgICAgICAgICAgICB0YWlsb3JpbmdNb3ZlKys7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmKHJlZkxpbmUgPT0gTlVMTCkgeyAvLyByYW4gb3V0IG9mIHJlZmVyZW5jZQorICAgICAgICAvLyB0aGlzIGlzIHRoZSB0YWlsIG9mIHRhaWxvcmluZyAtIHRoZSBsYXN0IGluc2VydGlvbgorICAgICAgICBteUxpbmUgID0gTlVMTDsKKyAgICAgICAgZm91bmQgPSBUUlVFOworICAgICAgfSBlbHNlIGlmKHRhaWxvcmluZ01vdmUgPT0gbG9va0ZvcndhcmQgfHwgbXlMaW5lID09IE5VTEwpIHsgLy8gcnVuIG92ZXIgdHJlc2hvbGQgb3Igb3V0IG9mIHRhaWxvcmluZworICAgICAgICB0YWlsb3JpbmdNb3ZlID0gMDsKKyAgICAgICAgLy8gd2UgZGlkbid0IGZpbmQgaW5zZXJ0aW9uIGFmdGVyIGFsbAorICAgICAgICAvLyB3ZSB3aWxsIHRyeSBzdWJzdGl0dXRpb24gbmV4dAorICAgICAgICAvLyByZXNldCB0aGUgdGFpbG9yaW5nIHBvaW50ZXIKKyAgICAgICAgbXlMaW5lID0gbXlMYXRlc3RFcXVhbC0+bmV4dDsKKyAgICAgICAgLy8gbW92ZSB0aGUgcmVmZXJlbmNlCisgICAgICAgIHJlZkxpbmUgPSByZWZMaW5lLT5uZXh0OworICAgICAgICBpZihyZWZMaW5lKSB7CisgICAgICAgICAgdHJhbnNmZXJDdW11bGF0aXZlU3RyZW5ndGgocmVmTGluZS0+cHJldmlvdXMsIHJlZkxpbmUpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeyAvLyB3ZSBmb3VuZCBhbiBpbnNlcnRpb24KKyAgICAgICAgdGFpbG9yaW5nTW92ZSA9IDA7CisgICAgICAgIGlmKG15TGluZS0+c3RyZW5ndGggIT0gcmVmTGluZS0+c3RyZW5ndGgpIHsKKyAgICAgICAgICB3aGlsZShteUxpbmUgJiYgcmVmTGluZSAmJiAqbXlMaW5lID09ICpyZWZMaW5lIAorICAgICAgICAgICAgJiYgKG15TGluZS0+c3RyZW5ndGggIT0gcmVmTGluZS0+c3RyZW5ndGggCisgICAgICAgICAgICB8fCBteUxpbmUtPnN0cmVuZ3RoID09IFVDT0xfSURFTlRJQ0FMKSkgeworICAgICAgICAgICAgbXlMaW5lID0gbXlMaW5lLT5uZXh0OworICAgICAgICAgICAgcmVmTGluZSA9IHJlZkxpbmUtPm5leHQ7CisgICAgICAgICAgfQorICAgICAgICAgIGlmKCpteUxpbmUgIT0gKnJlZkxpbmUpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZihteUxpbmUgJiYgcmVmTGluZSAmJiBteUxpbmUtPnByZXZpb3VzLT5zdHJlbmd0aCA8IG15TGluZS0+c3RyZW5ndGgpIHsKKyAgICAgICAgICBteUxpbmUgPSBteUxpbmUtPm5leHQ7CisgICAgICAgICAgcmVmTGluZSA9IHJlZkxpbmUtPm5leHQ7CisgICAgICAgICAgaWYoKm15TGluZSAhPSAqcmVmTGluZSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvdW5kID0gVFJVRTsKKyAgICAgIH0KKyAgICAgIGlmKGZvdW5kKSB7CisgICAgICAgIGlmKG15TGF0ZXN0RXF1YWwtPm5leHQgIT0gbXlMaW5lIHx8IHJlZkxpbmUgPT0gTlVMTCkgeworICAgICAgICAgIExpbmUgKm15U3RhcnQgPSBOVUxMOworICAgICAgICAgIC8vIHRoaXMgaXMgYSByZXNldCBhbmQgYSBzZXF1ZW5jZQorICAgICAgICAgIC8vIG15TGF0ZXN0RXF1YWwgcG9pbnRzIGF0IHRoZSBsYXN0IHBvaW50IHRoYXQgd2FzIHRoZSBzYW1lCisgICAgICAgICAgLy8gVGhpcyBwb2ludCB3aWxsIGJlIGEgcmVzZXQKKyAgICAgICAgICBpZihteUxpbmUgJiYgcmVmTGluZSkgeyAvLyBpZiB0aGVyZSBpcyBhbnl0aGluZyBtb3JlIHRvIGRvIC0gaXQgbWlnaHQgYmUgd29ydGggc2F2aW5nIGl0CisgICAgICAgICAgICBteVN0YXJ0ID0gbXlMYXRlc3RFcXVhbDsKKyAgICAgICAgICAgIHdoaWxlKG15U3RhcnQgIT0gbXlMaW5lKSB7CisgICAgICAgICAgICAgIHNlZW5UaGlzLT5wdXQoVW5pY29kZVN0cmluZyhteVN0YXJ0LT5uYW1lLCBteVN0YXJ0LT5sZW4pLCBteVN0YXJ0LCBzdGF0dXMpOworICAgICAgICAgICAgICBteVN0YXJ0ID0gbXlTdGFydC0+bmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgLy8gVHJ5IHRvIHdlZWQgb3V0IHN0dWZmIHRoYXQgaXMgbm90IGFmZmVjdGVkLCBsaWtlOgorICAgICAgICAgIC8vIFRhaWxvcmluZzoKKyAgICAgICAgICAvLyA8PDxTPDxcdTAxN0Y8XHUwMTYxPDw8XHUwMTYwPHQKKyAgICAgICAgICAvLyBVQ0E6CisgICAgICAgICAgLy8gPDw8Uzw8XHUwMTYxPDw8XHUwMTYwPDxcdTAxN0Y8dAorICAgICAgICAgIC8vIFJlc3VsdDoKKyAgICAgICAgICAvLyAmUzw8XHUwMTdGPFx1MDE2MTw8PFx1MDE2MAorICAgICAgICAgIC8vIHdlIGhhdmUgYSBzZXF1ZW5jZSB0aGF0IHNwYW5zIGZyb20gbXlMYXRlc3RFcXVhbCB0byBteUxpbmUgKHRoYXQgb25lIGNvdWxkIGJlIE5VTEwsIAorICAgICAgICAgIC8vIHNvIHdlIGhhdmUgdG8gZ28gZG93biBmcm9tIG15TGF0ZXN0RXF1YWwuIAorICAgICAgICAgIC8vIEJhc2ljYWxseSwgZm9yIGV2ZXJ5IGVsZW1lbnQsIHdlIHdhbnQgdG8gc2VlIHRoZSBzdHJvbmdlc3QgY3VtdWxhdGl2ZSBkaWZmZXJlbmNlIAorICAgICAgICAgIC8vIGZyb20gdGhlIHJlc2V0IHBvaW50LiBJZiB0aGUgY3VtdWxhdGl2ZSBkaWZmZXJlbmNlIGlzIHRoZSBzYW1lIGluIGJvdGggdGhlIHJlZmVyZW5jZSBhbmQKKyAgICAgICAgICAvLyB0YWlsb3JpbmcsIHRoYXQgZWxlbWVudCBjb3VsZCBiZSByZW1vdmVkLgorICAgICAgICAgIGNhbGN1bGF0ZUN1bXVsYXRpdmVTdHJlbmd0aHMobXlMYXRlc3RFcXVhbCwgbXlMaW5lKTsKKyAgICAgICAgICBjYWxjdWxhdGVDdW11bGF0aXZlU3RyZW5ndGhzKHJlZkxhdGVzdEVxdWFsLCByZWZMaW5lKTsKKyAgICAgICAgICBteVN0YXJ0ID0gbXlMYXRlc3RFcXVhbDsKKyAgICAgICAgICBpbnQzMl90IHJlbW92ZWQgPSAwOworICAgICAgICAgIGludDMyX3QgdHJhdmVyc2VkID0gMDsKKyAgICAgICAgICB3aGlsZShteVN0YXJ0ICYmIG15U3RhcnQgIT0gbXlMaW5lKSB7CisgICAgICAgICAgICBMaW5lICpyZWZTdGFydCA9IHJlZkxhdGVzdEVxdWFsOworICAgICAgICAgICAgd2hpbGUocmVmU3RhcnQgJiYgcmVmU3RhcnQgIT0gcmVmTGluZSkgeworICAgICAgICAgICAgICBpZigqbXlTdGFydCA9PSAqcmVmU3RhcnQpIHsKKyAgICAgICAgICAgICAgICBpZihteVN0YXJ0LT5jdW11bGF0aXZlU3RyZW5ndGggPT0gcmVmU3RhcnQtPmN1bXVsYXRpdmVTdHJlbmd0aCkgeworICAgICAgICAgICAgICAgICAgbXlTdGFydC0+aXNSZW1vdmVkID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgIHJlbW92ZWQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgcmVmU3RhcnQgPSByZWZTdGFydC0+bmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG15U3RhcnQgPSBteVN0YXJ0LT5uZXh0OworICAgICAgICAgICAgdHJhdmVyc2VkKys7CisgICAgICAgICAgfQorICAgICAgICAgIGlmKHJlbW92ZWQgPCB0cmF2ZXJzZWQpIHsKKyAgICAgICAgICAgIG15TGF0ZXN0RXF1YWwtPmlzUmVzZXQgPSBUUlVFOworICAgICAgICAgICAgbXlMYXRlc3RFcXVhbC0+aXNSZW1vdmVkID0gRkFMU0U7CisgICAgICAgICAgfQorCisgICAgICAgICAgbXlMYXRlc3RFcXVhbCA9IG15TGluZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmKHVwcGVyRmlyc3QpIHsKKyAgICAvL3N3YXBDYXNlKCk7CisgIH0KKworICBkZWxldGUgc2VlblRoaXM7CisgIGRlbGV0ZSBzZWVuUmVmZXJlbmNlOworCit9CisKK3ZvaWQKK1NvcnRlZExpbmVzOjp0cmFuc2ZlckN1bXVsYXRpdmVTdHJlbmd0aChMaW5lICpwcmV2aW91cywgTGluZSAqdGhhdCkgeworICBpZih0aGF0LT5zdHJlbmd0aCA+IHByZXZpb3VzLT5jdW11bGF0aXZlU3RyZW5ndGgpIHsKKyAgICB0aGF0LT5jdW11bGF0aXZlU3RyZW5ndGggPSBwcmV2aW91cy0+Y3VtdWxhdGl2ZVN0cmVuZ3RoOworICB9IGVsc2UgeworICAgIHRoYXQtPmN1bXVsYXRpdmVTdHJlbmd0aCA9IHRoYXQtPnN0cmVuZ3RoOworICB9Cit9CisKK3ZvaWQKK1NvcnRlZExpbmVzOjpjYWxjdWxhdGVDdW11bGF0aXZlU3RyZW5ndGhzKExpbmUgKnN0YXJ0LCBMaW5lICplbmQpIHsKKyAgLy8gc3RhcnQgaXMgYSByZXNldCAtIGVuZCBtYXkgYmUgTlVMTAorICBzdGFydCA9IHN0YXJ0LT5uZXh0OworICBVQ29sQXR0cmlidXRlVmFsdWUgY3VtdWxhdGl2ZVN0cmVuZ3RoID0gVUNPTF9PRkY7CisgIHdoaWxlKHN0YXJ0ICYmIHN0YXJ0ICE9IGVuZCkgeworICAgIGlmKHN0YXJ0LT5zdHJlbmd0aCA8IGN1bXVsYXRpdmVTdHJlbmd0aCkgeworICAgICAgY3VtdWxhdGl2ZVN0cmVuZ3RoID0gc3RhcnQtPnN0cmVuZ3RoOworICAgIH0KKyAgICBzdGFydC0+Y3VtdWxhdGl2ZVN0cmVuZ3RoID0gY3VtdWxhdGl2ZVN0cmVuZ3RoOworICAgIHN0YXJ0ID0gc3RhcnQtPm5leHQ7CisgIH0KK30KKworCit2b2lkIAorU29ydGVkTGluZXM6OmdldFJlcGVydG9pcmUoVW5pY29kZVNldCAmZmlsbEluKSB7CisgIGZpbGxJbi5jbGVhcigpOworICBmaWxsSW4uYWRkQWxsKHJlcGVydG9pcmUpOworfQorCisKK3ZvaWQKK1NvcnRlZExpbmVzOjpyZW1vdmVEZWNvbXBvc2l0aW9uc0Zyb21SZXBlcnRvaXJlKCkgeworICBVbmljb2RlU2V0SXRlcmF0b3IgcmVwZXJ0b2lyZUl0ZXIocmVwZXJ0b2lyZSk7CisgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICBVQ2hhciBzdHJpbmdbMjU2XTsKKyAgVUNoYXIgY29tcG9zZWRbMjU2XTsKKyAgaW50MzJfdCBsZW4gPSAwLCBjb21wTGVuID0gMDsKKyAgVW5pY29kZVN0cmluZyBjb21wU3RyaW5nOworICBVbmljb2RlU2V0IHRvUmVtb3ZlOworCisgIHdoaWxlKHJlcGVydG9pcmVJdGVyLm5leHQoKSkgeworICAgIGxlbiA9IDA7CisgICAgaWYocmVwZXJ0b2lyZUl0ZXIuaXNTdHJpbmcoKSkgeyAvLyBwcm9jZXNzIGEgc3RyaW5nCisgICAgICBsZW4gPSByZXBlcnRvaXJlSXRlci5nZXRTdHJpbmcoKS5sZW5ndGgoKTsKKyAgICAgIHVfbWVtY3B5KHN0cmluZywgcmVwZXJ0b2lyZUl0ZXIuZ2V0U3RyaW5nKCkuZ2V0QnVmZmVyKCksIGxlbik7CisgICAgfSBlbHNlIHsgLy8gcHJvY2VzcyBjb2RlIHBvaW50CisgICAgICBVQm9vbCBpc0Vycm9yID0gRkFMU0U7CisgICAgICBVMTZfQVBQRU5EKHN0cmluZywgbGVuLCAyNSwgcmVwZXJ0b2lyZUl0ZXIuZ2V0Q29kZXBvaW50KCksIGlzRXJyb3IpOworICAgIH0KKyAgICBzdHJpbmdbbGVuXSA9IDA7IC8vIHplcm8gdGVybWluYXRlLCBmb3Igb3VyIGV2aWwgd2F5cworICAgIGNvbXBMZW4gPSB1bm9ybV9ub3JtYWxpemUoc3RyaW5nLCBsZW4sIFVOT1JNX05GQywgMCwgY29tcG9zZWQsIDI1NiwgJnN0YXR1cyk7CisgICAgaWYoY29tcExlbiAhPSBsZW4gfHwgdV9zdHJjbXAoc3RyaW5nLCBjb21wb3NlZCkgIT0gMCkgeworICAgICAgY29tcFN0cmluZy5zZXRUbyhjb21wb3NlZCwgY29tcExlbik7CisgICAgICBpZihyZXBlcnRvaXJlLmNvbnRhaW5zKGNvbXBTdHJpbmcpKSB7CisgICAgICAgIHRvUmVtb3ZlLmFkZChVbmljb2RlU3RyaW5nKHN0cmluZywgbGVuKSk7CisgICAgICB9CisgICAgfQorICB9CisgIGRlYnVnLT5sb2coIlxuUmVtb3ZpbmdcbiIpOworICBkZWJ1Zy0+bG9nKHRvUmVtb3ZlLnRvUGF0dGVybihjb21wU3RyaW5nLCBUUlVFKSwgVFJVRSk7CisgIHJlcGVydG9pcmUucmVtb3ZlQWxsKHRvUmVtb3ZlKTsKK30KKworCit2b2lkCitTb3J0ZWRMaW5lczo6c3dhcENhc2UoKSAKK3sKKyAgaW50MzJfdCBpID0gMDsKKyAgZm9yKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgdG9Tb3J0W2ldLT5zd2FwQ2FzZSgpOworICB9Cit9CisKK3ZvaWQKK1NvcnRlZExpbmVzOjpjYWxjdWxhdGVTb3J0S2V5KExpbmUgJmxpbmUpIAoreworICBpZighc29ydGtleXMpIHsKKyAgICBzb3J0a2V5cyA9IG5ldyB1aW50OF90W3NpemUqMTAyNF07CisgICAgbWVtc2V0KHNvcnRrZXlzLCAwLCBzaXplKjEwMjQpOworICB9CisgIGxpbmUuc29ydEtleSA9IHNvcnRrZXlzK3NvcnRrZXlPZmZzZXQ7CisgIHNvcnRrZXlPZmZzZXQgKz0gcHJvYmUuZ2V0U29ydEtleShsaW5lLCBzb3J0a2V5cytzb3J0a2V5T2Zmc2V0LCBzaXplKjI1Ni1zb3J0a2V5T2Zmc2V0KTsKK30KKworCit2b2lkIAorU29ydGVkTGluZXM6OmNhbGN1bGF0ZVNvcnRLZXlzKCkKK3sKKyAgaWYoc29ydGtleXMpIHsKKyAgICBkZWxldGVbXSBzb3J0a2V5czsKKyAgfQorICBzb3J0a2V5T2Zmc2V0ID0gMDsKKyAgc29ydGtleXMgPSBuZXcgdWludDhfdFtzaXplKjI1Nl07CisgIG1lbXNldChzb3J0a2V5cywgMCwgc2l6ZSoyNTYpOworICBpbnQzMl90IGkgPSAwOworICBmb3IoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICBjYWxjdWxhdGVTb3J0S2V5KCp0b1NvcnRbaV0pOworICB9Cit9CmRpZmYgLS1naXQgYS9jb2xwcm9iZS9zb3J0ZWRsaW5lcy5oIGIvY29scHJvYmUvc29ydGVkbGluZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjM3MDA2Ci0tLSAvZGV2L251bGwKKysrIGIvY29scHJvYmUvc29ydGVkbGluZXMuaApAQCAtMCwwICsxLDEyMCBAQAorI2lmbmRlZiBDT0xQUk9CRV9TT1JURURMSU5FU19ICisjZGVmaW5lIENPTFBST0JFX1NPUlRFRExJTkVTX0gKKworLy8gY29scHJvYmUgaW5jbHVkZXMKKyNpbmNsdWRlICJjb2xwcm9iZS5oIgorI2luY2x1ZGUgImxpbmUuaCIKKyNpbmNsdWRlICJ1cHJpbnRlci5oIgorI2luY2x1ZGUgInN0cmVuZ3RocHJvYmUuaCIKKworCisvLyBJQ1UgaW5jbHVkZXMKKyNpbmNsdWRlICJ1bmljb2RlL3VuaXNldC5oIgorI2luY2x1ZGUgInVuaWNvZGUvdXNldGl0ZXIuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3VzY3JpcHQuaCIKKyNpbmNsdWRlICJoYXNoLmgiCisKK2NsYXNzIFNvcnRlZExpbmVzIHsKKyAgTGluZSBlbXB0eTsKKyAgTGluZSAqVUJbVUNPTF9PRkZdOworICBVbmljb2RlU2V0IGlnbm9yYWJsZXNbVUNPTF9PRkZdOworCisgIExpbmUgKip0b1NvcnQ7CisgIGludDMyX3QgdG9Tb3J0Q2FwYWNpdHk7CisgIExpbmUgKmxpbmVzOworICBpbnQzMl90IHNpemU7CisgIGludDMyX3QgY2FwYWNpdHk7CisKKyAgVW5pY29kZVNldCByZXBlcnRvaXJlOworICBVbmljb2RlU2V0IGV4Y2x1ZGVCb3VuZHM7CisKKyAgU3RyZW5ndGhQcm9iZSBwcm9iZTsKKworICBMaW5lICpmaXJzdDsKKyAgTGluZSAqbGFzdDsKKyAgTGluZSAqY3VycmVudDsKKyAgU29ydGVkTGluZXMoKSB7fTsKKworICBVUHJpbnRlciAqbG9nZ2VyOworICBVUHJpbnRlciAqZGVidWc7CisKKyAgSGFzaHRhYmxlICpjb250cmFjdGlvbnNUYWJsZTsKKyAgSGFzaHRhYmxlICpkdXBsaWNhdG9yczsgLy8gZWxlbWVudHMgdGhhdCBkdXBsaWNhdGUgcHJlY2VkaW5nIGNoYXJhY3RlcnMKKyAgaW50MzJfdCBtYXhFeHBhbnNpb25QcmVmaXhTaXplOworCisgIC8vIFByb3BlcnRpZXMgb2YgdGhlIHNvcnQKKyAgVUJvb2wgd29yZFNvcnQ7CisgIFVCb29sIGZyZW5jaFNlY29uZGFyeTsKKyAgVUJvb2wgdXBwZXJGaXJzdDsKKworICB1aW50OF90ICpzb3J0a2V5czsKKyAgaW50MzJfdCBzb3J0a2V5T2Zmc2V0OworcHVibGljOgorICBTb3J0ZWRMaW5lcyhjb25zdCBVbmljb2RlU2V0ICZzZXQsIGNvbnN0IFVuaWNvZGVTZXQgJmV4Y2x1ZGVCb3VuZHMsIGNvbnN0IFN0cmVuZ3RoUHJvYmUgJnByb2JlLCBVUHJpbnRlciAqbG9nZ2VyLCBVUHJpbnRlciAqZGVidWcpOworICBTb3J0ZWRMaW5lcyhGSUxFICpmaWxlLCBVUHJpbnRlciAqbG9nZ2VyLCBVUHJpbnRlciAqZGVidWcsIFVFcnJvckNvZGUgJnN0YXR1cyk7CisgIH5Tb3J0ZWRMaW5lcygpOworICB2b2lkIGFuYWx5c2UoVUVycm9yQ29kZSAmc3RhdHVzKTsKKworICB2b2lkIHNvcnQoVUJvb2wgc2V0U3RyZW5ndGhzID0gVFJVRSwgVUJvb2wgbGluayA9IEZBTFNFKTsKKyAgdm9pZCBzb3J0KExpbmUgKipzb3J0aW5nQXJyYXksIGludDMyX3Qgc2l6ZVRvU29ydCwgVUJvb2wgc2V0U3RyZW5ndGhzID0gVFJVRSwgVUJvb2wgbGluayA9IEZBTFNFKTsKKworICBMaW5lICpnZXRGaXJzdCgpOworICBMaW5lICpnZXRMYXN0KCk7CisgIHZvaWQgYWRkKExpbmUgKmxpbmUsIFVCb29sIGxpbmtJbiA9IEZBTFNFKTsKKyAgdm9pZCBpbnNlcnQoTGluZSAqbGluZSwgaW50MzJfdCBpbmRleCk7CisgIExpbmUgKmdldE5leHQoKTsKKyAgTGluZSAqZ2V0UHJldmlvdXMoKTsKKyAgTGluZSAqb3BlcmF0b3JbXShpbnQzMl90IGluZGV4KTsKKyAgaW50MzJfdCBhZGRDb250cmFjdGlvbnNUb1JlcGVydG9pcmUoVUVycm9yQ29kZSAmc3RhdHVzKTsKKworICBpbnQzMl90IGdldFNpemUoKSBjb25zdDsKKworICBpbnQzMl90IGRldGVjdEV4cGFuc2lvbnMoKTsKKyAgCisgIFVuaWNvZGVTdHJpbmcgdG9TdHJpbmcoVUJvb2wgdXNlTGlua3MgPSBGQUxTRSk7CisgIFVuaWNvZGVTdHJpbmcgdG9TdHJpbmdGcm9tRW1wdHkoKTsKKyAgVW5pY29kZVN0cmluZyB0b1ByZXR0eVN0cmluZyhVQm9vbCB1c2VMaW5rcywgVUJvb2wgcHJpbnRTb3J0S2V5cyA9IEZBTFNFKTsKKyAgVW5pY29kZVN0cmluZyB0b091dHB1dChjb25zdCBjaGFyICpmb3JtYXQsIAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmxvY2FsZSwgY29uc3QgY2hhciAqcGxhdGZvcm0sIGNvbnN0IGNoYXIgKnJlZmVyZW5jZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgVUJvb2wgdXNlTGlua3MsIFVCb29sIGluaXRpYWxpemUsIFVCb29sIG1vcmVUb0NvbWUpOworICBVbmljb2RlU3RyaW5nIHRvQnVuZGxlKGNvbnN0IGNoYXIgKmxvY2FsZSwgY29uc3QgY2hhciAqcGxhdGZvcm0sIGNvbnN0IGNoYXIgKnJlZmVyZW5jZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgVUJvb2wgdXNlTGlua3MsIFVCb29sIGluaXRpYWxpemUsIFVCb29sIG1vcmVUb0NvbWUpOworICBVbmljb2RlU3RyaW5nIHRvSFRNTChjb25zdCBjaGFyICpsb2NhbGUsIGNvbnN0IGNoYXIgKnBsYXRmb3JtLCBjb25zdCBjaGFyICpyZWZlcmVuY2UsIAorICAgICAgICAgICAgICAgICAgICAgICBVQm9vbCB1c2VMaW5rcywgVUJvb2wgaW5pdGlhbGl6ZSwgVUJvb2wgbW9yZVRvQ29tZSk7CisgIFVuaWNvZGVTdHJpbmcgdG9YTUwoY29uc3QgY2hhciAqbG9jYWxlLCBjb25zdCBjaGFyICpwbGF0Zm9ybSwgY29uc3QgY2hhciAqcmVmZXJlbmNlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgVUJvb2wgdXNlTGlua3MsIFVCb29sIGluaXRpYWxpemUsIFVCb29sIG1vcmVUb0NvbWUpOworICBVbmljb2RlU3RyaW5nIGFycmF5VG9TdHJpbmcoTGluZSoqIHNvcnRlZExpbmVzLCBpbnQzMl90IGxpbmVzU2l6ZSwgVUJvb2wgcHJldHR5LCBVQm9vbCB1c2VMaW5rcywgVUJvb2wgcHJpbnRTb3J0S2V5cyk7CisgIHZvaWQgc2V0U29ydGluZ0FycmF5KExpbmUgKipzb3J0aW5nQXJyYXksIExpbmUgKmVsZW1lbnRzLCBpbnQzMl90IHNpemVUb1NvcnQpOworICBpbnQzMl90IHNldFNvcnRpbmdBcnJheShMaW5lICoqc29ydGluZ0FycmF5LCBIYXNodGFibGUgKnRhYmxlKTsKKworICB2b2lkIHJlZHVjZURpZmZlcmVuY2UoU29ydGVkTGluZXMmIHJlZmVyZW5jZSk7CisgIHZvaWQgZ2V0UmVwZXJ0b2lyZShVbmljb2RlU2V0ICZmaWxsSW4pOworICB2b2lkIHJlbW92ZURlY29tcG9zaXRpb25zRnJvbVJlcGVydG9pcmUoKTsKKyAgdm9pZCBnZXRCb3VuZHMoVUVycm9yQ29kZSAmc3RhdHVzKTsKKyAgdm9pZCBjbGFzc2lmeVJlcGVydG9pcmUoKTsKKyAgdm9pZCB0b0ZpbGUoRklMRSAqZmlsZSwgVUJvb2wgdXNlTGlua3MsIFVFcnJvckNvZGUgJnN0YXR1cyk7CisgIHZvaWQgc3dhcENhc2UoKTsKKyAgdm9pZCBjYWxjdWxhdGVTb3J0S2V5cygpOworICB2b2lkIGNhbGN1bGF0ZVNvcnRLZXkoTGluZSAmbGluZSk7Citwcml2YXRlOgorICB2b2lkIGluaXQoKTsKKyAgdm9pZCBpbml0KFVuaWNvZGVTZXQgJnJlcCwgTGluZSAqbGluKTsKKyAgaW50MzJfdCBkZXRlY3RDb250cmFjdGlvbnMoTGluZSAqKmZpcnN0UmVwLCBpbnQzMl90IGZpcnN0U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaW5lICoqc2Vjb25kUmVwLCBpbnQzMl90IHNlY29uZFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGluZSAqdG9BZGRUbywgaW50MzJfdCAmdG9BZGRUb1NpemUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpbmUgKmxlc3NlclRvQWRkVG8sIGludDMyX3QgJmxlc3NlclRvQWRkVG9TaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2FwYWNpdHksIFVFcnJvckNvZGUgJnN0YXR1cyk7CisKKyAgdm9pZCBjYWxjdWxhdGVDdW11bGF0aXZlU3RyZW5ndGhzKExpbmUgKnN0YXJ0LCBMaW5lICplbmQpOworICB2b2lkIHRyYW5zZmVyQ3VtdWxhdGl2ZVN0cmVuZ3RoKExpbmUgKnByZXZpb3VzLCBMaW5lICp0aGF0KTsKKyAgdm9pZCB1cGRhdGVCb3VuZHMoVW5pY29kZVNldCAmc2V0KTsKKyAgdm9pZCBhZGRBbGwoTGluZSogdG9BZGQsIGludDMyX3QgdG9BZGRTaXplKTsKKyAgdm9pZCBzZXREaXN0YW5jZXNGcm9tRW1wdHkoTGluZSogYXJyYXksIGludDMyX3QgYXJyYXlTaXplKTsKKyAgdm9pZCBub3RlQ29udHJhY3Rpb24oY29uc3QgY2hhciogbXNnLCBMaW5lICp0b0FkZFRvLCBpbnQzMl90ICZ0b0FkZFRvU2l6ZSwgTGluZSAqbGVmdCwgTGluZSAqcmlnaHQsIGludDMyX3QgJm5vQ29udHMsIFVFcnJvckNvZGUgJnN0YXR1cyk7CisgIGludDMyX3QgZ29vc2VVcChpbnQzMl90IHJlc2V0SW5kZXgsIGludDMyX3QgZXhwYW5zaW9uSW5kZXgsIExpbmUgJmV4cExpbmUsIGludDMyX3QgKmV4cEluZGV4ZXMsIGludDMyX3QgJmV4cEluZGV4U2l6ZSwgVUNvbEF0dHJpYnV0ZVZhbHVlIHN0cmVuZ3RoKTsKKyAgVUJvb2wgZ2V0RXhwYW5zaW9uTGluZShjb25zdCBMaW5lICZleHBhbnNpb24sIGNvbnN0IExpbmUgJnByZXZpb3VzLCBjb25zdCBMaW5lICZleHAsIExpbmUgJmV4cGFuc2lvbkxpbmUpOworCisKK307CisKKyNlbmRpZiAgLy8gI2lmbmRlZiBDT0xQUk9CRV9TT1JURURMSU5FU19ICmRpZmYgLS1naXQgYS9jb2xwcm9iZS9zdHJlbmd0aHByb2JlLmNwcCBiL2NvbHByb2JlL3N0cmVuZ3RocHJvYmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmYTk0YjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb2xwcm9iZS9zdHJlbmd0aHByb2JlLmNwcApAQCAtMCwwICsxLDQwMiBAQAorLyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICBDb3B5cmlnaHQgKEMpIDIwMDMsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMKKyogICBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogRmlsZSBsaW5lLmgKKyoKKyogTW9kaWZpY2F0aW9uIEhpc3Rvcnk6CisqCisqICAgRGF0ZSAgICAgICAgTmFtZSAgICAgICAgRGVzY3JpcHRpb24KKyogICAwNy8wNy8yMDAzICB3ZWl2ICAgICAgICBDcmVhdGlvbi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKy8vCisvLyAgIGNsYXNzIExpbmUKKy8vCisvLyAgICAgIEVhY2ggbGluZSBmcm9tIHRoZSBzb3VyY2UgZmlsZSAoY29udGFpbmluZyBhIG5hbWUsIHByZXN1bWFibHkpIGdldHMKKy8vICAgICAgb25lIG9mIHRoZXNlIHN0cnVjdHMuCisvLworCisjaW5jbHVkZSAic3RyZW5ndGhwcm9iZS5oIgorCitTdHJlbmd0aFByb2JlOjpTdHJlbmd0aFByb2JlKENvbXBhcmVGbiBjb21wYXJlciwgR2V0U29ydEtleUZuIGdldHRlciwgVUNoYXIgU0UsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ2hhciBCMCwgVUNoYXIgQjEsIFVDaGFyIEIyLCBVQ2hhciBCMykgOgorU0UoU0UpLAorQjAoQjApLCBCMShCMSksIEIyKEIyKSwgQjMoQjMpLAordXRpbEZpcnN0UCgmdXRpbEZpcnN0KSwgdXRpbFNlY29uZFAoJnV0aWxTZWNvbmQpLAorZnJlbmNoU2Vjb25kYXJ5KEZBTFNFKSwKK2NvbXBhcmVyKGNvbXBhcmVyKSwgc2tnZXR0ZXIoZ2V0dGVyKQoreworfQorCitpbnQKK1N0cmVuZ3RoUHJvYmU6OnNldFByb2JlQ2hhcnMoVUNoYXIgQjAsIFVDaGFyIEIxLCBVQ2hhciBCMiwgVUNoYXIgQjMpCit7CisgIHRoaXMtPkIwID0gQjA7CisgIHRoaXMtPkIxID0gQjE7CisgIHRoaXMtPkIyID0gQjI7CisgIHRoaXMtPgorQjMgPSBCMzsKKyAgcmV0dXJuIGNoZWNrU2FuaXR5KCk7Cit9CisKK2ludAorU3RyZW5ndGhQcm9iZTo6Y2hlY2tTYW5pdHkoKSAKK3sKKyAgaW50IHNhbml0eVJlczsKKyAgdXRpbEZpcnN0LnNldFRvKEIwKTsKKyAgdXRpbFNlY29uZC5zZXRUbyhCMyk7CisgIGlmKChzYW5pdHlSZXMgPSBjb21wYXJlcigmdXRpbEZpcnN0UCwgJnV0aWxTZWNvbmRQKSkgPj0gMCkgeworICAgIHJldHVybiBzYW5pdHlSZXMqMTAgKyAzOworICB9CisgIHV0aWxTZWNvbmQuc2V0VG8oQjIpOworICBpZigoc2FuaXR5UmVzID0gY29tcGFyZXIoJnV0aWxGaXJzdFAsICZ1dGlsU2Vjb25kUCkpID49IDApIHsKKyAgICByZXR1cm4gc2FuaXR5UmVzKjEwICsgMjsKKyAgfQorICB1dGlsU2Vjb25kLnNldFRvKEIxKTsKKyAgaWYoKHNhbml0eVJlcyA9IGNvbXBhcmVyKCZ1dGlsRmlyc3RQLCAmdXRpbFNlY29uZFApKSA+PSAwKSB7CisgICAgcmV0dXJuIHNhbml0eVJlcyoxMCArIDE7CisgIH0KKyAgdXRpbEZpcnN0LnNldFRvKEIzKTsKKyAgdXRpbFNlY29uZC5zZXRUbyhCMik7CisgIGlmKChzYW5pdHlSZXMgPSBjb21wYXJlcigmdXRpbEZpcnN0UCwgJnV0aWxTZWNvbmRQKSkgPj0gMCkgeworICAgIHJldHVybiBzYW5pdHlSZXMqMTAgKyA1OworICB9CisgIHV0aWxTZWNvbmQuc2V0VG8oQjEpOworICBpZigoc2FuaXR5UmVzID0gY29tcGFyZXIoJnV0aWxGaXJzdFAsICZ1dGlsU2Vjb25kUCkpID49IDApIHsKKyAgICByZXR1cm4gc2FuaXR5UmVzKjEwICsgNDsKKyAgfQorICB1dGlsRmlyc3Quc2V0VG8oQjIpOworICBpZigoc2FuaXR5UmVzID0gY29tcGFyZXIoJnV0aWxGaXJzdFAsICZ1dGlsU2Vjb25kUCkpID49IDApIHsKKyAgICByZXR1cm4gc2FuaXR5UmVzKjEwICsgNjsKKyAgfQorICB1dGlsRmlyc3Quc2V0VG8oQjApOworICBpZihkaXN0YW5jZUZyb21FbXB0eVN0cmluZyh1dGlsRmlyc3QpID4gVUNPTF9QUklNQVJZKSB7CisgICAgcmV0dXJuIDEwMDA7CisgIH0KKyAgdXRpbEZpcnN0LnNldFRvKEIxKTsKKyAgaWYoZGlzdGFuY2VGcm9tRW1wdHlTdHJpbmcodXRpbEZpcnN0KSA+IFVDT0xfUFJJTUFSWSkgeworICAgIHJldHVybiAxMDAxOworICB9CisgIHV0aWxGaXJzdC5zZXRUbyhCMik7CisgIGlmKGRpc3RhbmNlRnJvbUVtcHR5U3RyaW5nKHV0aWxGaXJzdCkgPiBVQ09MX1BSSU1BUlkpIHsKKyAgICByZXR1cm4gMTAwMjsKKyAgfQorICB1dGlsRmlyc3Quc2V0VG8oQjMpOworICBpZihkaXN0YW5jZUZyb21FbXB0eVN0cmluZyh1dGlsRmlyc3QpID4gVUNPTF9QUklNQVJZKSB7CisgICAgcmV0dXJuIDEwMDM7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK1VCb29sIAorU3RyZW5ndGhQcm9iZTo6cHJvYmVQcmVmaXgoY29uc3QgTGluZSAmeCwgY29uc3QgTGluZSAmeSwgVUNoYXIgZmlyc3QsIFVDaGFyIHNlY29uZCkgeworICB1dGlsRmlyc3QubmFtZVswXSA9IGZpcnN0OworICB1dGlsRmlyc3QubmFtZVsxXSA9IFNFOworICB1X3N0cmNweSh1dGlsRmlyc3QubmFtZSsyLCB4Lm5hbWUpOworICB1dGlsRmlyc3QubmFtZVt4LmxlbisyXSA9IDA7CisgIHV0aWxGaXJzdC5sZW4gPSB4LmxlbisyOworCisgIHV0aWxTZWNvbmQubmFtZVswXSA9IHNlY29uZDsKKyAgdXRpbFNlY29uZC5uYW1lWzFdID0gU0U7CisgIHVfc3RyY3B5KHV0aWxTZWNvbmQubmFtZSsyLCB5Lm5hbWUpOworICB1dGlsU2Vjb25kLm5hbWVbeS5sZW4rMl0gPSAwOworICB1dGlsU2Vjb25kLmxlbiA9IHkubGVuKzI7CisKKyAgaWYoY29tcGFyZXIoJnV0aWxGaXJzdFAsICZ1dGlsU2Vjb25kUCkgPCAwKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK1VCb29sIAorU3RyZW5ndGhQcm9iZTo6cHJvYmVTdWZmaXgoY29uc3QgTGluZSAmeCwgY29uc3QgTGluZSAmeSwgVUNoYXIgZmlyc3QsIFVDaGFyIHNlY29uZCkgeworICB1X3N0cmNweSh1dGlsRmlyc3QubmFtZSwgeC5uYW1lKTsKKyAgdXRpbEZpcnN0Lm5hbWVbeC5sZW5dID0gU0U7CisgIHV0aWxGaXJzdC5uYW1lW3gubGVuKzFdID0gZmlyc3Q7CisgIHV0aWxGaXJzdC5uYW1lW3gubGVuKzJdID0gMDsKKyAgdXRpbEZpcnN0LmxlbiA9IHgubGVuICsgMjsKKyAgdV9zdHJjcHkodXRpbFNlY29uZC5uYW1lLCB5Lm5hbWUpOworICB1dGlsU2Vjb25kLm5hbWVbeS5sZW5dID0gU0U7CisgIHV0aWxTZWNvbmQubmFtZVt5LmxlbisxXSA9IHNlY29uZDsKKyAgdXRpbFNlY29uZC5uYW1lW3kubGVuKzJdID0gMDsKKyAgdXRpbFNlY29uZC5sZW4gPSB5LmxlbiArIDI7CisKKyAgaWYoY29tcGFyZXIoJnV0aWxGaXJzdFAsICZ1dGlsU2Vjb25kUCkgPCAwKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK1VCb29sIAorU3RyZW5ndGhQcm9iZTo6cHJvYmVQcmVmaXhOb1NlcChjb25zdCBMaW5lICZ4LCBjb25zdCBMaW5lICZ5LCBVQ2hhciBmaXJzdCwgVUNoYXIgc2Vjb25kKSB7CisgIHV0aWxGaXJzdC5uYW1lWzBdID0gZmlyc3Q7CisgIHVfc3RyY3B5KHV0aWxGaXJzdC5uYW1lKzEsIHgubmFtZSk7CisgIHV0aWxGaXJzdC5uYW1lW3gubGVuKzFdID0gMDsKKyAgdXRpbEZpcnN0LmxlbiA9IHgubGVuICsgMTsKKworICB1dGlsU2Vjb25kLm5hbWVbMF0gPSBzZWNvbmQ7CisgIHVfc3RyY3B5KHV0aWxTZWNvbmQubmFtZSsxLCB5Lm5hbWUpOworICB1dGlsU2Vjb25kLm5hbWVbeS5sZW4rMV0gPSAwOworICB1dGlsU2Vjb25kLmxlbiA9IHkubGVuICsgMTsKKworICBpZihjb21wYXJlcigmdXRpbEZpcnN0UCwgJnV0aWxTZWNvbmRQKSA8IDApIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KK30KKworVUJvb2wgCitTdHJlbmd0aFByb2JlOjpwcm9iZVN1ZmZpeE5vU2VwKGNvbnN0IExpbmUgJngsIGNvbnN0IExpbmUgJnksIFVDaGFyIGZpcnN0LCBVQ2hhciBzZWNvbmQpIHsKKyAgdV9zdHJjcHkodXRpbEZpcnN0Lm5hbWUsIHgubmFtZSk7CisgIHV0aWxGaXJzdC5uYW1lW3gubGVuXSA9IGZpcnN0OworICB1dGlsRmlyc3QubmFtZVt4LmxlbisxXSA9IDA7CisgIHV0aWxGaXJzdC5sZW4gPSB4LmxlbiArIDE7CisgIHVfc3RyY3B5KHV0aWxTZWNvbmQubmFtZSwgeS5uYW1lKTsKKyAgdXRpbFNlY29uZC5uYW1lW3kubGVuXSA9IHNlY29uZDsKKyAgdXRpbFNlY29uZC5uYW1lW3kubGVuKzFdID0gMDsKKyAgdXRpbFNlY29uZC5sZW4gPSB5LmxlbiArIDE7CisKKyAgaWYoY29tcGFyZXIoJnV0aWxGaXJzdFAsICZ1dGlsU2Vjb25kUCkgPCAwKSB7CisgICAgcmV0dXJuIFRSVUU7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9Cit9CisKK1VDb2xBdHRyaWJ1dGVWYWx1ZSAKK1N0cmVuZ3RoUHJvYmU6OmdldFN0cmVuZ3RoKGNvbnN0IExpbmUgJngsIGNvbnN0IExpbmUgJnkpIHsKKyAgY29uc3QgTGluZSAqeHAgPSAmeDsKKyAgY29uc3QgTGluZSAqeXAgPSAmeTsKKworICBMaW5lIGVtcHR5OworICBMaW5lICplbXB0eVAgPSAmZW1wdHk7CisgIGlmKGNvbXBhcmVyKCZlbXB0eVAsICZ4cCkgPT0gMCkgeworICAgIHJldHVybiBkaXN0YW5jZUZyb21FbXB0eVN0cmluZyh5KTsKKyAgfQorCisgIGludDMyX3QgcmVzdWx0ID0gY29tcGFyZXIoJnhwLCAmeXApOworCisgIGlmKHJlc3VsdCA9PSAwKSB7CisgICAgcmV0dXJuIFVDT0xfSURFTlRJQ0FMOworICB9IGVsc2UgaWYocmVzdWx0ID4gMCkgeworICAgIHJldHVybiBVQ09MX09GRjsgLy8gYmFkIHNpdHVhdGlvbgorICB9IGVsc2UgeyAvLyB3ZSBuZWVkIHRvIHByb2JlIHN0cmVuZ3RoCisgICAgaWYocHJvYmVTdWZmaXgoeCwgeSwgQjEsIEIwKSkgeworICAgIC8vaWYocHJvYmVQcmVmaXgoeCwgeSwgQjIsIEIwKSkgeyAvLyBzd2FtcHMgc2Vjb25kYXJ5IGRpZmZlcmVuY2UKKyAgICAgIHJldHVybiBVQ09MX1BSSU1BUlk7CisgICAgfSBlbHNlIGlmKHByb2JlUHJlZml4KHgsIHksIEIzLCBCMCkpIHsgLy8gc3dhbXBzIHRlcnRpYXJ5IGRpZmZlcmVuY2UKKyAgICAgIHJldHVybiBVQ09MX1NFQ09OREFSWTsKKyAgICB9IGVsc2UgaWYocHJvYmVTdWZmaXgoeCwgeSwgQjMsIEIwKSkgeyAvLyBzd2FtcGVkIGJ5IHRlcnRpYXJ5IGRpZmZlcmVuY2UKKyAgICAgIHJldHVybiBVQ09MX1RFUlRJQVJZOworICAgIH0gZWxzZSBpZighcHJvYmVQcmVmaXgoeCwgeSwgQjMsIEIwKSkgeworICAgICAgcmV0dXJuIFVDT0xfUVVBVEVSTkFSWTsKKyAgICB9CisgICAgLyoKKyAgICAvL2lmKHByb2JlU3VmZml4KHgsIHksIEIxLCBCMCkpIHsKKyAgICBpZihwcm9iZVByZWZpeCh4LCB5LCBCMiwgQjApKSB7IC8vIHN3YW1wcyBzZWNvbmRhcnkgZGlmZmVyZW5jZQorICAgICAgcmV0dXJuIFVDT0xfUFJJTUFSWTsKKyAgICB9IGVsc2UgaWYocHJvYmVQcmVmaXgoeCwgeSwgQjMsIEIwKSkgeyAvLyBzd2FtcHMgdGVydGlhcnkgZGlmZmVyZW5jZQorICAgICAgcmV0dXJuIFVDT0xfU0VDT05EQVJZOworICAgIH0gZWxzZSBpZihwcm9iZVN1ZmZpeCh4LCB5LCBCMywgQjApKSB7IC8vIHN3YW1wZWQgYnkgdGVydGlhcnkgZGlmZmVyZW5jZQorICAgICAgcmV0dXJuIFVDT0xfVEVSVElBUlk7CisgICAgfSBlbHNlIGlmKCFwcm9iZVByZWZpeCh4LCB5LCBCMywgQjApKSB7CisgICAgICByZXR1cm4gVUNPTF9RVUFURVJOQVJZOworICAgIH0KKyAgICAqLworICB9CisgIHJldHVybiBVQ09MX09GRjsgLy8gYmFkCit9CisKK1VDb2xBdHRyaWJ1dGVWYWx1ZSAKK1N0cmVuZ3RoUHJvYmU6OmdldFN0cmVuZ3RoKGNvbnN0IFVuaWNvZGVTdHJpbmcgJnN4LCBjb25zdCBVbmljb2RlU3RyaW5nICZzeSkgeworICBMaW5lIHgoc3gpOworICBMaW5lIHkoc3kpOworICByZXR1cm4gZ2V0U3RyZW5ndGgoeCwgeSk7Cit9CisKK2ludDMyX3QgCitTdHJlbmd0aFByb2JlOjpjb21wYXJlKGNvbnN0IFVuaWNvZGVTdHJpbmcgJnN4LCBjb25zdCBVbmljb2RlU3RyaW5nICZzeSkgeworICBMaW5lIHgoc3gpOworICBMaW5lIHkoc3kpOworICBjb25zdCBMaW5lICp4cCA9ICZ4OworICBjb25zdCBMaW5lICp5cCA9ICZ5OworICByZXR1cm4gY29tcGFyZXIoJnhwLCAmeXApOworfQorCitpbnQzMl90IAorU3RyZW5ndGhQcm9iZTo6Y29tcGFyZShjb25zdCBMaW5lICZ4LCBjb25zdCBMaW5lICZ5KSB7CisgIGNvbnN0IExpbmUgKnhwID0gJng7CisgIGNvbnN0IExpbmUgKnlwID0gJnk7CisgIHJldHVybiBjb21wYXJlcigmeHAsICZ5cCk7Cit9CisKK1VDb2xBdHRyaWJ1dGVWYWx1ZSAKK1N0cmVuZ3RoUHJvYmU6OmRpc3RhbmNlRnJvbUVtcHR5U3RyaW5nKGNvbnN0IExpbmUgJngpIHsKKyAgaWYoeC5uYW1lWzBdID09IDB4MzBEKSB7CisgICAgaW50MzJfdCBwdXRCcmVha1BvaW50SGVyZSA9IDA7CisgIH0KKyAgTGluZSBlbXB0eTsKKyAgTGluZSAqZW1wdHlQID0gJmVtcHR5OworICB1aW50OF90IGJ1ZmZbMjU2XTsKKyAgZ2V0U29ydEtleShlbXB0eS5uYW1lLCBlbXB0eS5sZW4sIGJ1ZmYsIDI1Nik7CisgIExpbmUgQjBMaW5lKEIwKTsKKyAgTGluZSAqQjBMaW5lUCA9ICZCMExpbmU7CisgIGNvbnN0IExpbmUgKnhwID0gJng7CisgIGludDMyX3QgcmVzdWx0ID0gY29tcGFyZXIoJmVtcHR5UCwgJnhwKTsKKyAgaWYocmVzdWx0ID09IDApIHsKKyAgICByZXR1cm4gVUNPTF9JREVOVElDQUw7CisgIH0gZWxzZSBpZihyZXN1bHQgPiAwKSB7CisgICAgcmV0dXJuIFVDT0xfT0ZGOworICB9CisgIHJlc3VsdCA9IGNvbXBhcmVyKCZCMExpbmVQLCAmeHApOworICBpZihyZXN1bHQgPD0gMCkgeworICAgIHJldHVybiBVQ09MX1BSSU1BUlk7CisgIH0KKyAgTGluZSBzZXhiMChTRSk7CisgIHNleGIwLmFwcGVuZCh4Lm5hbWUsIHgubGVuKTsKKyAgc2V4YjAuYXBwZW5kKEIwKTsKKworICBMaW5lIHNlYjAoU0UpOworICBzZWIwLmFwcGVuZChCMCk7CisgIHVpbnQ4X3Qgc2ViMEtbMjU2XTsKKyAgdWludDhfdCBzZXhiMEtbMjU2XTsKKyAgdWludDhfdCBzZWIyS1syNTZdOworICB1aW50OF90IHNlYjNLWzI1Nl07CisgIG1lbXNldChzZWIwSywgMCwgMjU2KTsKKyAgbWVtc2V0KHNleGIwSywgMCwgMjU2KTsKKyAgbWVtc2V0KHNlYjJLLCAwLCAyNTYpOworICBtZW1zZXQoc2ViM0ssIDAsIDI1Nik7CisKKyAgZ2V0U29ydEtleShzZWIwLCBzZWIwSywgMjU2KTsKKyAgZ2V0U29ydEtleShzZXhiMCwgc2V4YjBLLCAyNTYpOworCisgIGlmKGNvbXBhcmUoc2ViMCwgc2V4YjApIDw9IDApIHsKKyAgICBMaW5lIHNlYjIoU0UpOworICAgIHNlYjIuYXBwZW5kKEIyKTsKKyAgICBnZXRTb3J0S2V5KHNlYjIsIHNlYjJLLCAyNTYpOworICAgIHJlc3VsdCA9IGNvbXBhcmUoc2ViMiwgc2V4YjApOworICAgIGlmKChyZXN1bHQgPD0gMCAmJiAhZnJlbmNoU2Vjb25kYXJ5KSB8fCAocmVzdWx0ID49IDAgJiYgZnJlbmNoU2Vjb25kYXJ5KSkgeyAvLyBzd2FtcHMgdGVydGlhcnkgZGlmZmVyZW5jZQorICAgICAgcmV0dXJuIFVDT0xfU0VDT05EQVJZOworICAgIH0KKyAgICBMaW5lIHNlYjMoU0UpOworICAgIHNlYjMuYXBwZW5kKEIzKTsKKyAgICBnZXRTb3J0S2V5KHNlYjMsIHNlYjNLLCAyNTYpOworICAgIGlmKGNvbXBhcmUoc2ViMywgc2V4YjApIDwgMCkgeworICAgICAgcmV0dXJuIFVDT0xfVEVSVElBUlk7CisgICAgfQorICAgIHJldHVybiBVQ09MX1FVQVRFUk5BUlk7CisgIH0gZWxzZSB7CisgICAgLy8gaWYgdGhpcyB3YXMgVUNBLCB3ZSB3b3VsZCBoYXZlIGEgcHJpbWFyeSBkaWZmZXJlbmNlLgorICAgIC8vIGhvd2V2ZXIsIHRoaXMgbWlnaHQgbm90IGJlIHNvLCBzaW5jZSBub3QgZXZlcnlib2R5IAorICAgIC8vIG1ha2VzIHdlbGwgZm9ybWVkIENFcy4KKyAgICAvLyBpbiBjc19DWiBvbiBsaW51eCwgc3BhY2UgaXMgdGVydGlhcnkgaWdub3JhYmxlLCBidXQKKyAgICAvLyBpdHMgcXVhdGVybmFyeSBsZXZlbCBzdHJlbmd0aCBpcyBsb3dlciB0aGFuIHF1YWQgCisgICAgLy8gc3RyZW5ndGhzIGZvciBub24taWdub3JhYmxlcy4gb2ggd2VsbCwgbW9yZSB0ZXN0aW5nCisgICAgLy8gcmVxdWlyZWQKKyAgICAvLyBJIHRoaW5rIHRoYXQgd2UgY2FuIG9ubHkgaGF2ZSBxdWF0ZXJuYXJ5IGRpZmZlcmVuY2UKKyAgICAvLyBoZXJlIChpbiBhZGRpdGlvbiB0byBwcmltYXJ5IGRpZmZlcmVuY2UpLgorICAgIC8vaWYoIXByb2JlUHJlZml4KHgsIGVtcHR5LCBCMywgQjApKSB7CisgICAgICAvL3JldHVybiBVQ09MX1FVQVRFUk5BUlk7CisgICAgLy99IGVsc2UgeworICAgICAgcmV0dXJuIFVDT0xfUFJJTUFSWTsKKyAgICAvL30KKyAgfQorfQorCitVQ29sQXR0cmlidXRlVmFsdWUgCitTdHJlbmd0aFByb2JlOjpkaXN0YW5jZUZyb21FbXB0eVN0cmluZyhjb25zdCBVbmljb2RlU3RyaW5nICZ4KSB7CisgIGNvbnN0IExpbmUgeHAoeCk7CisgIHJldHVybiBkaXN0YW5jZUZyb21FbXB0eVN0cmluZyh4cCk7Cit9CisKKworVUNvbEF0dHJpYnV0ZVZhbHVlIAorU3RyZW5ndGhQcm9iZTo6Z2V0UHJlZml4ZWRTdHJlbmd0aChjb25zdCBMaW5lICZwcmVmaXgsIGNvbnN0IExpbmUgJngsIGNvbnN0IExpbmUgJnkpIHsKKyAgY29udHJhY3Rpb25VdGlsRmlyc3Quc2V0VG9Db25jYXQoJnByZWZpeCwgJngpOworICBjb250cmFjdGlvblV0aWxTZWNvbmQuc2V0VG9Db25jYXQoJnByZWZpeCwgJnkpOworICByZXR1cm4gZ2V0U3RyZW5ndGgoY29udHJhY3Rpb25VdGlsRmlyc3QsIGNvbnRyYWN0aW9uVXRpbFNlY29uZCk7Cit9CisKKworU3RyZW5ndGhQcm9iZTo6U3RyZW5ndGhQcm9iZShjb25zdCBTdHJlbmd0aFByb2JlICZ0aGF0KSB7CisgICp0aGlzID0gdGhhdDsKK30KKworU3RyZW5ndGhQcm9iZSAmCitTdHJlbmd0aFByb2JlOjpvcGVyYXRvcj0oY29uc3QgU3RyZW5ndGhQcm9iZSAmdGhhdCkgeworICBpZih0aGlzICE9ICZ0aGF0KSB7CisgICAgQjAgPSB0aGF0LkIwOworICAgIEIxID0gdGhhdC5CMTsKKyAgICBCMiA9IHRoYXQuQjI7CisgICAgQjMgPSB0aGF0LkIzOworICAgIFNFID0gdGhhdC5TRTsKKyAgICBmcmVuY2hTZWNvbmRhcnkgPSB0aGF0LmZyZW5jaFNlY29uZGFyeTsKKyAgICBjb21wYXJlciA9IHRoYXQuY29tcGFyZXI7CisgICAgc2tnZXR0ZXIgPSB0aGF0LnNrZ2V0dGVyOworCisgICAgdXRpbEZpcnN0UCA9ICZ1dGlsRmlyc3Q7CisgICAgdXRpbFNlY29uZFAgPSAmdXRpbFNlY29uZDsKKyAgfQorCisgIHJldHVybiAqdGhpczsKK30KKworVUJvb2wKK1N0cmVuZ3RoUHJvYmU6OmlzRnJlbmNoU2Vjb25kYXJ5KFVFcnJvckNvZGUgJnN0YXR1cykgeworICB1dGlsRmlyc3Quc2V0VG8oQjApOworICB1dGlsRmlyc3QuYXBwZW5kKFNFKTsKKyAgdXRpbEZpcnN0LmFwcGVuZChCMik7CisgIHV0aWxTZWNvbmQuc2V0VG8oQjIpOworICB1dGlsU2Vjb25kLmFwcGVuZChTRSk7CisgIHV0aWxTZWNvbmQuYXBwZW5kKEIwKTsKKworICBpbnQzMl90IHJlc3VsdCA9IGNvbXBhcmUodXRpbEZpcnN0LCB1dGlsU2Vjb25kKTsKKworICBpZihyZXN1bHQgPCAwKSB7CisgICAgcmV0dXJuIEZBTFNFOworICB9IGVsc2UgaWYocmVzdWx0ID4gMCkgeworICAgIGZyZW5jaFNlY29uZGFyeSA9IFRSVUU7CisgICAgcmV0dXJuIFRSVUU7CisgIH0gZWxzZSB7CisgICAgc3RhdHVzID0gVV9JTlRFUk5BTF9QUk9HUkFNX0VSUk9SOworICAgIHJldHVybiBGQUxTRTsKKyAgfQorfQorCitVQm9vbAorU3RyZW5ndGhQcm9iZTo6aXNVcHBlckZpcnN0KFVFcnJvckNvZGUgJnN0YXR1cykgeworICBVQ2hhciBpID0gMDsKKyAgaW50MzJfdCByZXN1bHQgPSAwOworICBpbnQzMl90IHVwcGVyID0gMCwgbG93ZXIgPSAwLCBlcXVhbCA9IDA7CisgIGZvcihpID0gMHg0MTsgaSA8IDB4NUI7IGkrKykgeworICAgIHV0aWxGaXJzdC5zZXRUbyhpKTsKKyAgICB1dGlsU2Vjb25kLnNldFRvKGkrMHgyMCk7CisgICAgcmVzdWx0ID0gY29tcGFyZSh1dGlsRmlyc3QsIHV0aWxTZWNvbmQpOworICAgIGlmKHJlc3VsdCA8IDApIHsKKyAgICAgIHVwcGVyKys7CisgICAgfSBlbHNlIGlmKHJlc3VsdCA+IDApIHsKKyAgICAgIGxvd2VyKys7CisgICAgfSBlbHNlIHsKKyAgICAgIGVxdWFsKys7CisgICAgfQorICB9CisgIAorICBpZihsb3dlciA9PSAwICYmIGVxdWFsID09IDApIHsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBpZih1cHBlciA9PSAwICYmIGVxdWFsID09IDApIHsKKyAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgc3RhdHVzID0gVV9JTlRFUk5BTF9QUk9HUkFNX0VSUk9SOworICByZXR1cm4gRkFMU0U7Cit9CisKZGlmZiAtLWdpdCBhL2NvbHByb2JlL3N0cmVuZ3RocHJvYmUuaCBiL2NvbHByb2JlL3N0cmVuZ3RocHJvYmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzkyNWIyCi0tLSAvZGV2L251bGwKKysrIGIvY29scHJvYmUvc3RyZW5ndGhwcm9iZS5oCkBAIC0wLDAgKzEsODUgQEAKKy8qCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgQ29weXJpZ2h0IChDKSAyMDAzLCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzCisqICAgQ29ycG9yYXRpb24gYW5kIG90aGVycy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIEZpbGUgbGluZS5oCisqCisqIE1vZGlmaWNhdGlvbiBIaXN0b3J5OgorKgorKiAgIERhdGUgICAgICAgIE5hbWUgICAgICAgIERlc2NyaXB0aW9uCisqICAgMDcvMDcvMjAwMyAgd2VpdiAgICAgICAgQ3JlYXRpb24uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisvLworLy8gICBjbGFzcyBMaW5lCisvLworLy8gICAgICBFYWNoIGxpbmUgZnJvbSB0aGUgc291cmNlIGZpbGUgKGNvbnRhaW5pbmcgYSBuYW1lLCBwcmVzdW1hYmx5KSBnZXRzCisvLyAgICAgIG9uZSBvZiB0aGVzZSBzdHJ1Y3RzLgorLy8KKworI2lmbmRlZiBDT0xQUk9CRV9TVFJFTkdUSFBST0JFX0gKKyNkZWZpbmUgQ09MUFJPQkVfU1RSRU5HVEhQUk9CRV9ICisKKyNpbmNsdWRlICJjb2xwcm9iZS5oIgorI2luY2x1ZGUgImxpbmUuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3VuaXNldC5oIgorI2luY2x1ZGUgInVuaWNvZGUvdXNldGl0ZXIuaCIKKworY2xhc3MgU3RyZW5ndGhQcm9iZSB7CitwdWJsaWM6CisgIFVDaGFyIFNFOworICBVQ2hhciBCMDsKKyAgVUNoYXIgQjE7CisgIFVDaGFyIEIyOworICBVQ2hhciBCMzsKK3ByaXZhdGU6CisgIExpbmUgdXRpbEZpcnN0OworICBMaW5lIHV0aWxTZWNvbmQ7CisgIExpbmUgKnV0aWxGaXJzdFA7CisgIExpbmUgKnV0aWxTZWNvbmRQOworICBMaW5lIGNvbnRyYWN0aW9uVXRpbEZpcnN0OworICBMaW5lIGNvbnRyYWN0aW9uVXRpbFNlY29uZDsKKyAgVUJvb2wgcHJvYmVQcmVmaXgoY29uc3QgTGluZSAmeCwgY29uc3QgTGluZSAmeSwgVUNoYXIgZmlyc3QsIFVDaGFyIHNlY29uZCk7CisgIFVCb29sIHByb2JlU3VmZml4KGNvbnN0IExpbmUgJngsIGNvbnN0IExpbmUgJnksIFVDaGFyIGZpcnN0LCBVQ2hhciBzZWNvbmQpOworICBVQm9vbCBwcm9iZVByZWZpeE5vU2VwKGNvbnN0IExpbmUgJngsIGNvbnN0IExpbmUgJnksIFVDaGFyIGZpcnN0LCBVQ2hhciBzZWNvbmQpOworICBVQm9vbCBwcm9iZVN1ZmZpeE5vU2VwKGNvbnN0IExpbmUgJngsIGNvbnN0IExpbmUgJnksIFVDaGFyIGZpcnN0LCBVQ2hhciBzZWNvbmQpOworCisgIFVCb29sIGZyZW5jaFNlY29uZGFyeTsKKworcHVibGljOgorICBDb21wYXJlRm4gY29tcGFyZXI7CisgIEdldFNvcnRLZXlGbiBza2dldHRlcjsKKyAgCisgIFN0cmVuZ3RoUHJvYmUoKSB7fTsKKyAgU3RyZW5ndGhQcm9iZShDb21wYXJlRm4gY29tcGFyZXIsIEdldFNvcnRLZXlGbiBnZXR0ZXIsIFVDaGFyIFNFID0gMHgwMDMwLCBVQ2hhciBCMCA9IDB4MDA2MSwgVUNoYXIgQjEgPSAweDAwNjIsIFVDaGFyIEIyID0gMHgwMEUxLCBVQ2hhciBCMyA9IDB4MDA0MSk7IC8vLCBVQ2hhciBMQiA9IDB4MDAzOSwgVUNoYXIgVUIgPSAweGZhMjkpOworICBpbnQgc2V0UHJvYmVDaGFycyhVQ2hhciBCMCwgVUNoYXIgQjEsIFVDaGFyIEIyLCBVQ2hhciBCMyk7CisgIGludCBjaGVja1Nhbml0eSgpOworICBTdHJlbmd0aFByb2JlKGNvbnN0IFN0cmVuZ3RoUHJvYmUgJnRoYXQpOworICBTdHJlbmd0aFByb2JlICZvcGVyYXRvcj0oY29uc3QgU3RyZW5ndGhQcm9iZSAmdGhhdCk7CisgIFVDb2xBdHRyaWJ1dGVWYWx1ZSBnZXRTdHJlbmd0aChjb25zdCBMaW5lICZ4LCBjb25zdCBMaW5lICZ5KTsKKyAgVUNvbEF0dHJpYnV0ZVZhbHVlIGdldFN0cmVuZ3RoKGNvbnN0IFVuaWNvZGVTdHJpbmcgJngsIGNvbnN0IFVuaWNvZGVTdHJpbmcgJnkpOworICBVQ29sQXR0cmlidXRlVmFsdWUgZ2V0UHJlZml4ZWRTdHJlbmd0aChjb25zdCBMaW5lICZwcmVmaXgsIGNvbnN0IExpbmUgJngsIGNvbnN0IExpbmUgJnkpOworICBpbnQzMl90IGNvbXBhcmUoY29uc3QgVW5pY29kZVN0cmluZyAmeCwgY29uc3QgVW5pY29kZVN0cmluZyAmeSk7CisgIGludDMyX3QgY29tcGFyZShjb25zdCBMaW5lICZ4LCBjb25zdCBMaW5lICZ5KTsKKyAgVUNvbEF0dHJpYnV0ZVZhbHVlIGRpc3RhbmNlRnJvbUVtcHR5U3RyaW5nKGNvbnN0IExpbmUgJngpOworICBVQ29sQXR0cmlidXRlVmFsdWUgZGlzdGFuY2VGcm9tRW1wdHlTdHJpbmcoY29uc3QgVW5pY29kZVN0cmluZyAmeCk7CisgIFVCb29sIGlzRnJlbmNoU2Vjb25kYXJ5KFVFcnJvckNvZGUgJnN0YXR1cyk7CisgIFVCb29sIGlzVXBwZXJGaXJzdChVRXJyb3JDb2RlICZzdGF0dXMpOworICBpbnQgZ2V0U29ydEtleShjb25zdCBMaW5lICZsLCB1aW50OF90ICpidWZmZXIsIGludDMyX3QgYnVmZkNhcCkgeworICAgIHJldHVybiBza2dldHRlcihsLm5hbWUsIGwubGVuLCBidWZmZXIsIGJ1ZmZDYXApOworICB9OworCisgIGludCBnZXRTb3J0S2V5KFVDaGFyICpzdHJpbmcsIGludDMyX3Qgc0xlbiwgdWludDhfdCAqYnVmZmVyLCBpbnQzMl90IGJ1ZmZDYXApIHsKKyAgICByZXR1cm4gc2tnZXR0ZXIoc3RyaW5nLCBzTGVuLCBidWZmZXIsIGJ1ZmZDYXApOworICB9OworIAorfTsKKworCisjZW5kaWYgLy8jaWZuZGVmIENPTFBST0JFX1NUUkVOR1RIUFJPQkVfSAorCmRpZmYgLS1naXQgYS9jb2xwcm9iZS90YWJsZVN0YXJ0ZXIucGwgYi9jb2xwcm9iZS90YWJsZVN0YXJ0ZXIucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDFiN2ZiYgotLS0gL2Rldi9udWxsCisrKyBiL2NvbHByb2JlL3RhYmxlU3RhcnRlci5wbApAQCAtMCwwICsxLDE2IEBACisjIS91c3IvYmluL3BlcmwgLXcKKwordXNlIHN0cmljdDsKKworbXkgJGxvY2FsZU1pbnVzQSA9IGBjYXQgL2hvbWUvd2Vpdi9zcmMvaWN1L3NvdXJjZS9leHRyYS9jb2xwcm9iZS9sb2NhbGUudHh0YDsKK215IEBsb2NhbGVzID0gc3BsaXQoL1xuLywgJGxvY2FsZU1pbnVzQSk7CitteSAkbG9jYWxlOworbXkgJGNvbW1hbmQ7CisKK2ZvcmVhY2ggJGxvY2FsZSAoQGxvY2FsZXMpIHsKKyAgaWYoJGxvY2FsZSA9fiAvXy8gJiYgISgkbG9jYWxlID1+IC9eIy8pKSB7CisgICAgJGNvbW1hbmQgPSAiL2hvbWUvd2Vpdi9zcmMvaWN1L3NvdXJjZS9leHRyYS9jb2xwcm9iZS9kb0NvbXBhcmlzb25UYWJsZS5wbCAkbG9jYWxlIjsKKyAgICBwcmludCAiJGNvbW1hbmRcbiI7CisgICAgYCRjb21tYW5kYDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvY29scHJvYmUvdGFyZ2V0c2V0Z2VuZXJhdG9yLmNwcCBiL2NvbHByb2JlL3RhcmdldHNldGdlbmVyYXRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNkY2JlOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbHByb2JlL3RhcmdldHNldGdlbmVyYXRvci5jcHAKQEAgLTAsMCArMSw4IEBACisjaW5jbHVkZSAidGFyZ2V0c2V0Z2VuZXJhdG9yLmgiCisKK1RhcmdldFNldEdlbmVyYXRvcjo6VGFyZ2V0U2V0R2VuZXJhdG9yKFVuaWNvZGVTZXQgJnN0YXJ0aW5nU2V0LCBDb21wYXJlRm4gY29tcGFyZXIpIDoKKyBjb21wYXJlcihjb21wYXJlciksCisgc2V0KHN0YXJ0aW5nU2V0KQoreworICAgYWRkQWxsKHN0YXJ0aW5nU2V0KTsKK30KZGlmZiAtLWdpdCBhL2NvbHByb2JlL3RhcmdldHNldGdlbmVyYXRvci5oIGIvY29scHJvYmUvdGFyZ2V0c2V0Z2VuZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q4OTczNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbHByb2JlL3RhcmdldHNldGdlbmVyYXRvci5oCkBAIC0wLDAgKzEsMTUgQEAKKyNpZm5kZWYgVEFSR0VUU0VUR0VORVJBVE9SX0gKKyNkZWZpbmUgVEFSR0VUU0VUR0VORVJBVE9SX0gKKworI2luY2x1ZGUgImNvbHByb2JlLmgiCisjaW5jbHVkZSAidW5pY29kZS91bmlzZXQuaCIKKworY2xhc3MgVGFyZ2V0U2V0R2VuZXJhdG9yIDogcHVibGljIFVuaWNvZGVTZXQgeworcHVibGljOgorICBUYXJnZXRTZXRHZW5lcmF0b3IoVW5pY29kZVNldCAmc3RhcnRpbmdTZXQsIENvbXBhcmVGbiBjb21wYXJlcik7Citwcml2YXRlOgorICBDb21wYXJlRm4gY29tcGFyZXI7CisgIFVuaWNvZGVTZXQgc2V0OworfTsKKworI2VuZGlmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29scHJvYmUvdGVtcGxhdGUgYi9jb2xwcm9iZS90ZW1wbGF0ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTFhYTkxCi0tLSAvZGV2L251bGwKKysrIGIvY29scHJvYmUvdGVtcGxhdGUKQEAgLTAsMCArMSw0OCBAQAorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPgorPHRpdGxlPiRsb2NhbGU8L3RpdGxlPgorPHN0eWxlPgorICAgICAgICAgPCEtLQorICAgICAgICAgdGFibGUgICAgICAgIHsgYm9yZGVyLXNwYWNpbmc6IDA7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IHdpZHRoOiAxMDAlOyAKKyAgICAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrIH0KK3RkLCB0aCAgICAgICB7IHdpZHRoOiAxMCU7IGJvcmRlci1zcGFjaW5nOiAwOyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyBjb2xvcjogYmxhY2s7IAorICAgICAgICAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsgYm9yZGVyOiAxcHggc29saWQgYmxhY2sgfQorLS0+CisgICAgIDwvc3R5bGU+Cis8L2hlYWQ+CisKKzxib2R5IGJnY29sb3I9IiNGRkZGRkYiPgorCis8cD48Yj48Zm9udCBjb2xvcj0iI0ZGMDAwMCI+Q29sbGF0aW9uOjwvZm9udD4gJGxvY2FsZSA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vY2dpLWJpbi9pY3UvbHgvZW4vP189JGxvY2FsZSI+RGVtbzwvYT4sIAorCis8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vY3ZzL2ljdS9+Y2hlY2tvdXR+L2xvY2FsZS9hbGxfZGlmZl94bWwvY29tcGFyaXNvbl9jaGFydHMuaHRtbCI+Q292ZXIgCitQYWdlPC9hPiwgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2N2cy9pY3UvfmNoZWNrb3V0fi9sb2NhbGUvYWxsX2RpZmZfeG1sL2luZGV4Lmh0bWwiPkluZGV4PC9hPjwvYj48L3A+Cis8dGFibGU+CisgIDx0cj4KKyAgICA8dGggYmdjb2xvcj0iI0FEOTg5RCI+Q09NTU9OICg8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vY3ZzL2ljdS9+Y2hlY2tvdXR+L2xvY2FsZS9jb21tb24veG1sLyRsb2NhbGUueG1sIj54bWw8L2E+KTwvdGg+CisgICAgPHRoIGJnY29sb3I9IiMxMTkxRjEiPkxJTlVYICg8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vY3ZzL2ljdS9+Y2hlY2tvdXR+L2xvY2FsZS9saW51eC94bWwvJGxvY2FsZS54bWwiPnhtbDwvYT4pPC90aD4KKyAgICA8dGggYmdjb2xvcj0iIzk4RkI5OCI+V0lORE9XUyAoPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2N2cy9pY3UvfmNoZWNrb3V0fi9sb2NhbGUvd2luZG93cy94bWwvJGxvY2FsZS54bWwiPnhtbDwvYT4pPC90aD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkIGJnY29sb3I9IiNBRDk4OUQiPjEuMC1hbHBoYTwvdGQ+CisgICAgPHRkIGJnY29sb3I9IiNGRjY2MzMiPjEuMDwvdGQ+CisgICAgPHRkIGJnY29sb3I9IiNGRjY2MzMiPj08L3RkPgorICAgIDx0ZCBiZ2NvbG9yPSIjRkY2NjMzIj48c3BhbiB0aXRsZT0iMDA2RSB7TEFUSU4gU01BTEwgTEVUVEVSIE59Ij4mYW1wO248L3NwYW4+PGJyPgorICAgICAgPHNwYW4gdGl0bGU9IjAwNkUgMDA3OSB7TEFUSU4gU01BTEwgTEVUVEVSIE59IHtMQVRJTiBTTUFMTCBMRVRURVIgWX0iPiZuYnNwOyZuYnNwOyZsdDsmbmJzcDtueTwvc3Bhbj48YnI+CisKKyAgICAgIDxzcGFuIHRpdGxlPSIwMDZFIDAwNkUgMDA3OSB7TEFUSU4gU01BTEwgTEVUVEVSIE59IHtMQVRJTiBTTUFMTCBMRVRURVIgTn0ge0xBVElOIFNNQUxMIExFVFRFUiBZfSAvIDAwNkUgMDA3OSB7TEFUSU4gU01BTEwgTEVUVEVSIE59IHtMQVRJTiBTTUFMTCBMRVRURVIgWX0iPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOz0mbmJzcDtubnkmbmJzcDsvJm5ic3A7bnk8L3NwYW4+PGJyPgorICAgICAgPHNwYW4gdGl0bGU9IjAwNkUgMDA1OSB7TEFUSU4gU01BTEwgTEVUVEVSIE59IHtMQVRJTiBDQVBJVEFMIExFVFRFUiBZfSI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jmx0OyZsdDsmbHQ7Jm5ic3A7blk8L3NwYW4+PGJyPgorICAgIDwvdGQ+CisgICAgPHRkIGJnY29sb3I9IiNGRjY2MzMiPj08L3RkPgorICAgIDx0ZCBiZ2NvbG9yPSIjRkZGRjMzIj4xLjI8L3RkPgorCisgICAgPHRkIGJnY29sb3I9IiM5OEZCOTgiPldpbmRvd3MgWFA8L3RkPgorICAgIDx0ZCBiZ2NvbG9yPSIjRkY2NjMzIj49PC90ZD4KKyAgICA8dGQgYmdjb2xvcj0iI0ZGNjYzMyI+PTwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8L2JvZHk+CmRpZmYgLS1naXQgYS9jb2xwcm9iZS91bmlxdWVGaWxlcy5wbCBiL2NvbHByb2JlL3VuaXF1ZUZpbGVzLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY3ZGE1NGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb2xwcm9iZS91bmlxdWVGaWxlcy5wbApAQCAtMCwwICsxLDQ5IEBACisjIS91c3IvYmluL3BlcmwKKwordXNlIHN0cmljdDsKKworbXkgJGZpbGU7CitteSAkc2Vjb25kZmlsZTsKK215ICVzZWNvbmRmaWxlbGlzdDsKK215IEBzYW1lOworbXkgJWxpc3Q7CitteSAkc2FtZWZpbGU7CisKK2ZvcmVhY2ggJHNlY29uZGZpbGUgKEBBUkdWKSB7CisgICRzZWNvbmRmaWxlbGlzdHskc2Vjb25kZmlsZX0gPSAiIjsKK30KKworZm9yZWFjaCAkZmlsZSAoc29ydCBrZXlzKCVzZWNvbmRmaWxlbGlzdCkpIHsKKyAgaWYoZXhpc3RzICRzZWNvbmRmaWxlbGlzdHskZmlsZX0pIHsKKyAgICBkZWxldGUgJHNlY29uZGZpbGVsaXN0eyRmaWxlfTsKKyAgICBmb3JlYWNoICRzZWNvbmRmaWxlIChzb3J0KGtleXMgJXNlY29uZGZpbGVsaXN0KSkgeworICAgICAgI3ByaW50ICJkaWZmaW5nOiAkZmlsZSBhbmQgJHNlY29uZGZpbGVcbiI7CisgICAgICBpZiAoIWBkaWZmICRmaWxlICRzZWNvbmRmaWxlYCkgeworICAgICAgICAjcHJpbnQgIiRmaWxlIGFuZCAkc2Vjb25kZmlsZSBhcmUgdGhlIHNhbWVcbiI7CisgICAgICAgIHB1c2ggQHNhbWUsICRzZWNvbmRmaWxlOworICAgICAgfQorICAgIH0KKyMgICAgaWYgKCQjc2FtZSA+IC0xKSB7CisgICAgICBwcmludCAiQWRkaW5nIEBzYW1lIHRvICRmaWxlXG4iOworICAgICAgJGxpc3R7JGZpbGV9ID0gIFtAc2FtZV0gOworICAgICAgZm9yZWFjaCAkc2FtZWZpbGUgKEBzYW1lKSB7CisgICAgICAgIGRlbGV0ZSAkc2Vjb25kZmlsZWxpc3R7JHNhbWVmaWxlfTsKKyAgICAgIH0KKyAgICAgIGRlbGV0ZSBAc2FtZVswLi4kI3NhbWVdOworIyAgICB9CisgIH0KK30KKworCitteSAkaSA9IDA7CitteSAkaiA9IDA7CisgZm9yZWFjaCAkZmlsZSAoc29ydCgga2V5cyAlbGlzdCkpIHsKKyAgICNwcmludCAiJGZpbGUgLT4gIjsgI0B7bGlzdHskZmlsZX19XG4iOworICAgcHJpbnQgIjwkZmlsZT4gPCRqPlxuIjsKKyAgIGZvcmVhY2ggJGkgKCAwIC4uICQjeyAkbGlzdHskZmlsZX0gfSApIHsKKyAgICAgI3ByaW50ICIkbGlzdHskZmlsZX1bJGldICI7CisgICAgIHByaW50ICI8JGxpc3R7JGZpbGV9WyRpXT4gPCRqPlxuICI7CisgICB9CisgICAkaisrOworIH0KKwpkaWZmIC0tZ2l0IGEvY29scHJvYmUvdXByaW50ZXIuY3BwIGIvY29scHJvYmUvdXByaW50ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkOWFiOWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb2xwcm9iZS91cHJpbnRlci5jcHAKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgQ29weXJpZ2h0IChDKSAyMDAzLCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzCisqICAgQ29ycG9yYXRpb24gYW5kIG90aGVycy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIEZpbGUgdXByaW50ZXIuY3BwCisqCisqIE1vZGlmaWNhdGlvbiBIaXN0b3J5OgorKgorKiAgIERhdGUgICAgICAgIE5hbWUgICAgICAgIERlc2NyaXB0aW9uCisqICAgMDMvMTgvMjAwMyAgd2VpdiAgICAgICAgQ3JlYXRpb24uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisjaW5jbHVkZSAidXByaW50ZXIuaCIKKworVVByaW50ZXI6OlVQcmludGVyKEZJTEUgKmZpbGUsIGNvbnN0IGNoYXIgKmxvY2FsZSwgY29uc3QgY2hhciAqZW5jb2RpbmcsIFVCb29sIHRyYW5zbGl0ZXJhdGVOb25QcmludGFibGUpIHsKKyAgX29uID0gVFJVRTsKKyAgb3V0ID0gdV9maW5pdChmaWxlLCBsb2NhbGUsIGVuY29kaW5nKTsKKyAgc3RyY3B5KF9sb2NhbGUsIGxvY2FsZSk7CisgIGlmKHRyYW5zbGl0ZXJhdGVOb25QcmludGFibGUpIHsKKyAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgICBVVHJhbnNsaXRlcmF0b3IgKmFueUhleCA9IHV0cmFuc19vcGVuKCJbXlxcdTAwMGRcXHUwMDBhXFx1MDAwOVxcdTAwMjAtXFx1MDA3Zl0gQW55LUhleC9KYXZhIiwgVVRSQU5TX0ZPUldBUkQsIE5VTEwsIDAsIE5VTEwsICZzdGF0dXMpOworICAgIHVfZnNldHRyYW5zbGl0ZXJhdG9yKG91dCwgVV9XUklURSwgYW55SGV4LCAmc3RhdHVzKTsKKyAgfQorfTsKKworVVByaW50ZXI6OlVQcmludGVyKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmxvY2FsZSwgY29uc3QgY2hhciAqZW5jb2RpbmcsIFVUcmFuc2xpdGVyYXRvciAqdHJhbnMsIFVCb29sIHRyYW5zbGl0ZXJhdGVOb25QcmludGFibGUpIHsKKyAgX29uID0gVFJVRTsKKyAgb3V0ID0gdV9mb3BlbihuYW1lLCAid2IiLCBsb2NhbGUsIGVuY29kaW5nKTsKKyAgdV9mcHV0YygweEZFRkYsIG91dCk7IC8vIGVtaXQgYSBCT00KKyAgc3RyY3B5KF9sb2NhbGUsIGxvY2FsZSk7CisgIGlmKHRyYW5zbGl0ZXJhdGVOb25QcmludGFibGUpIHsKKyAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgICBpZih0cmFucyA9PSBOVUxMKSB7CisgICAgICBVVHJhbnNsaXRlcmF0b3IgKmFueUhleCA9IHV0cmFuc19vcGVuKCJbXlxcdTAwMGRcXHUwMDBhXFx1MDAwOVxcdTAwMjAtXFx1MDA3Zl0gQW55LUhleC9KYXZhIiwgVVRSQU5TX0ZPUldBUkQsIE5VTEwsIDAsIE5VTEwsICZzdGF0dXMpOworICAgICAgdV9mc2V0dHJhbnNsaXRlcmF0b3Iob3V0LCBVX1dSSVRFLCBhbnlIZXgsICZzdGF0dXMpOworICAgIH0gZWxzZSB7CisgICAgICB1X2ZzZXR0cmFuc2xpdGVyYXRvcihvdXQsIFVfV1JJVEUsIHRyYW5zLCAmc3RhdHVzKTsKKyAgICB9CisgIH0KK307CisKK1VQcmludGVyOjp+VVByaW50ZXIoKSB7CisgIHVfZmNsb3NlKG91dCk7Cit9CisKK3ZvaWQgCitVUHJpbnRlcjo6bG9nKGNvbnN0IFVuaWNvZGVTdHJpbmcgJnN0cmluZywgVUJvb2wgbmwpIHsKKyAgaWYoX29uKSB7CisgICAgbG9nKCgoVW5pY29kZVN0cmluZylzdHJpbmcpLmdldFRlcm1pbmF0ZWRCdWZmZXIoKSwgbmwpOworICB9Cit9CisKK3ZvaWQgCitVUHJpbnRlcjo6bG9nKGNvbnN0IFVDaGFyICpzdHJpbmcsIFVCb29sIG5sKSB7CisgIGlmKF9vbikgeworICAgIHVfZnByaW50ZihvdXQsICIlUyIsIHN0cmluZyk7CisgICAgaWYobmwpIHsKKyAgICAgIHVfZnByaW50ZihvdXQsICJcbiIpOworICAgIH0KKyAgICB1X2ZmbHVzaChvdXQpOworICB9Cit9CisvKgordm9pZCAKK1VQcmludGVyOjpsb2coY29uc3QgY2hhciAqc3RyaW5nLCBVQm9vbCBubCkgeworICBpZihfb24pIHsKKyAgICB1X2ZwcmludGYob3V0LCAiJXMiLCBzdHJpbmcpOworICAgIGlmKG5sKSB7CisgICAgICB1X2ZwcmludGYob3V0LCAiXG4iKTsKKyAgICB9CisgIH0KK30KKyovCit2b2lkIAorVVByaW50ZXI6OmxvZyhjb25zdCBMaW5lICpsaW5lLCBVQm9vbCBubCkgeworICBpZihfb24pIHsKKyAgICBsb2cobGluZS0+bmFtZSk7CisgICAgaWYobGluZS0+ZXhwTGVuKSB7CisgICAgICBsb2coIi8iKTsKKyAgICAgIGxvZyhsaW5lLT5leHBhbnNpb25TdHJpbmcpOworICAgIH0KKyAgICBpZihubCkgeworICAgICAgdV9mcHJpbnRmKG91dCwgIlxuIik7CisgICAgICB1X2ZmbHVzaChvdXQpOworICAgIH0KKyAgfQorfQorCit2b2lkIFVQcmludGVyOjpsb2coY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisgICAgVUNoYXIgYnVmZmVyWzQwMDBdOworICAgIHZhX2xpc3QgYXA7CisKKyAgICB2YV9zdGFydChhcCwgZm10KTsKKyAgICAvKiBzcHJpbnRmIGl0IGp1c3QgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGluZm9ybWF0aW9uIGlzIHZhbGlkICovCisgICAgdV92c3ByaW50ZihidWZmZXIsIF9sb2NhbGUsIGZtdCwgYXApOworICAgIHZhX2VuZChhcCk7CisgICAgaWYoIF9vbiApIHsKKyAgICAgICAgbG9nKGJ1ZmZlcik7CisgICAgfQorfQorCit2b2lkCitVUHJpbnRlcjo6b24odm9pZCkgeworICBfb24gPSBUUlVFOworfQorCit2b2lkCitVUHJpbnRlcjo6b2ZmKHZvaWQpIHsKKyAgX29uID0gRkFMU0U7Cit9CmRpZmYgLS1naXQgYS9jb2xwcm9iZS91cHJpbnRlci5oIGIvY29scHJvYmUvdXByaW50ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjQyMTA0Ci0tLSAvZGV2L251bGwKKysrIGIvY29scHJvYmUvdXByaW50ZXIuaApAQCAtMCwwICsxLDUxIEBACisvKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIENvcHlyaWdodCAoQykgMjAwMywgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcworKiAgIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBGaWxlIHVwcmludGVyLmgKKyoKKyogTW9kaWZpY2F0aW9uIEhpc3Rvcnk6CisqCisqICAgRGF0ZSAgICAgICAgTmFtZSAgICAgICAgRGVzY3JpcHRpb24KKyogICAwMy8xOC8yMDAzICB3ZWl2ICAgICAgICBDcmVhdGlvbi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKyNpZm5kZWYgQ09MUFJPQkVfVVBSSU5URVJfSAorI2RlZmluZSBDT0xQUk9CRV9VUFJJTlRFUl9ICisKKyNpbmNsdWRlICJsaW5lLmgiCisKKyNpbmNsdWRlICJ1bmljb2RlL3VzdGRpby5oIgorI2luY2x1ZGUgInVuaWNvZGUvdW5pc3RyLmgiCisjaW5jbHVkZSAidW5pY29kZS91c3RyaW5nLmgiCisKKworY2xhc3MgVVByaW50ZXIgeworICBVRklMRSAqb3V0OworICBVQ2hhciBidWZmZXJbMjU2XTsKKyAgVUJvb2wgX29uOworICBjaGFyIF9sb2NhbGVbMjU2XTsKK3B1YmxpYzoKKyAgVVByaW50ZXIoRklMRSAqZmlsZSwgY29uc3QgY2hhciAqbG9jYWxlLCBjb25zdCBjaGFyICplbmNvZGluZywgVUJvb2wgdHJhbnNsaXRlcmF0ZU5vblByaW50YWJsZT1UUlVFKTsKKyAgVVByaW50ZXIoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqbG9jYWxlLCBjb25zdCBjaGFyICplbmNvZGluZywgVVRyYW5zbGl0ZXJhdG9yICp0cmFucywgVUJvb2wgdHJhbnNsaXRlcmF0ZU5vblByaW50YWJsZSk7CisgIH5VUHJpbnRlcigpOworICB2b2lkIGxvZyhjb25zdCBVbmljb2RlU3RyaW5nICZzdHJpbmcsIFVCb29sIG5sID0gRkFMU0UpOworICB2b2lkIGxvZyhjb25zdCBVQ2hhciAqc3RyaW5nLCBVQm9vbCBubCA9IEZBTFNFKTsKKyAgLy92b2lkIGxvZyhjb25zdCBjaGFyICpzdHJpbmcsIFVCb29sIG5sID0gRkFMU0UpOworICB2b2lkIGxvZyhjb25zdCBMaW5lICpsaW5lLCBVQm9vbCBubCA9IEZBTFNFKTsKKyAgdm9pZCBsb2coY29uc3QgY2hhciAqZm10LCAuLi4pOworICB2b2lkIG9mZih2b2lkKTsKKyAgdm9pZCBvbih2b2lkKTsKKyAgVUJvb2wgaXNPbih2b2lkKSB7CisgICAgcmV0dXJuIF9vbjsKKyAgfTsKK307CisKKworCisjZW5kaWYgLy8gI2lmbmRlZiBDT0xQUk9CRV9VUFJJTlRFUl9ICmRpZmYgLS1naXQgYS9jb2xwcm9iZS93aW5HZW5Db2xsRGF0YS5wbCBiL2NvbHByb2JlL3dpbkdlbkNvbGxEYXRhLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU3NzQ2NGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb2xwcm9iZS93aW5HZW5Db2xsRGF0YS5wbApAQCAtMCwwICsxLDMwIEBACisjIS91c3IvYmluL3BlcmwgLXcKKwordXNlIHN0cmljdDsKKworI215ICRsb2NhbGVNaW51c0EgPSBgbG9jYWxlIC1hYDsKK215ICRsb2NhbGVNaW51c0EgPSBgY2F0IGxvY2FsZS50eHRgOworCitteSBAbG9jYWxlcyA9IHNwbGl0KC9cclxuLywgJGxvY2FsZU1pbnVzQSk7CitteSAkbG9jYWxlOworbXkgJGNvbW1hbmQ7CisKKyNteSAkY29tbWFuZFBhdGggPSAifi9zcmMvaWN1L3NvdXJjZS9leHRyYS9jb2xwcm9iZS8iOworbXkgJGNvbW1hbmRQYXRoID0gImM6L2Rldi8wX2ljdS9zb3VyY2UvZXh0cmEvY29scHJvYmUvcmVsZWFzZS8iOworCisKK215ICRwbGF0Zm9ybSA9ICRBUkdWWzBdOworCitta2RpciAkcGxhdGZvcm0uImxvZ3MiOworbWtkaXIgJHBsYXRmb3JtOworCitmb3JlYWNoICRsb2NhbGUgKEBsb2NhbGVzKSB7CisgICRfID0gJGxvY2FsZTsKKyAgY2hvbXA7CisgIGlmKCEvXlwjLykgeyAjICYmIC9cXy8pIHsKKyAgICAkY29tbWFuZCA9ICRjb21tYW5kUGF0aC4iY29scHJvYmUgLS1wbGF0Zm9ybSAkcGxhdGZvcm0gLS1yZWYgJHBsYXRmb3JtIC0tb3V0cHV0IHJlc2IgJGxvY2FsZSA+JHBsYXRmb3JtIi4ibG9ncy8kbG9jYWxlIi4iX2xvZy50eHQgMj4mMSI7CisgCisgICAgcHJpbnQgIiRjb21tYW5kXG4iOworICAgIGAkY29tbWFuZGA7CisgIH0KK30KZGlmZiAtLWdpdCBhL211bHRpL01ha2VmaWxlIGIvbXVsdGkvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU3ZGJlNgotLS0gL2Rldi9udWxsCisrKyBiL211bHRpL01ha2VmaWxlCkBAIC0wLDAgKzEsMyBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBJQk0gQ29ycC4gYW5kIE90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZAorY2xlYW46CisJLXJtIC1yZiAuL3RtcApkaWZmIC0tZ2l0IGEvbXVsdGkvYy9NYWtlZmlsZSBiL211bHRpL2MvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIxZThlNgotLS0gL2Rldi9udWxsCisrKyBiL211bHRpL2MvTWFrZWZpbGUKQEAgLTAsMCArMSwxMDIgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDA5LTIwMTAgSUJNIENvcnAuIGFuZCBPdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyMgbXVsdGljdS9jIG1ha2VmaWxlCisKK2FsbDoKKwlAZWNobyBUbyBidWlsZCBhbGwgSUNVczogICQoTUFLRSkgYWxsLWljdXMKKwlAZWNobyAiVXNpbmcgdGhlIC1rIG9wdGlvbiBtYXkgYmUgYSBnb29kIGlkZWEgaWYgc29tZSBhcmUgbm90IGJ1aWxkaW5nIHByb3Blcmx5LiIKKwlAZWNobyBJQ1VWRVJTOiAkKElDVVZFUlMpCisKK2luZm86CisKKyNJQ1VDT05GPXNoIC4vY29uZmlndXJlCitJQ1VDT05GPSQoTVVMVElDVV9ST09UKS9jL3N1cGVyY29uZi5zaAorRE9UPSQoc2hlbGwgcHdkKQorTVVMVElDVV9ST09UPSQoRE9UKS8uLgoraW5jbHVkZSAkKE1VTFRJQ1VfUk9PVCkvY29tbW9uL01ha2VmaWxlLW11bHRpLmluYworLWluY2x1ZGUgTWFrZWZpbGUubG9jYWwKKworSUNVVkVSUzo9JChzaGVsbCBjZCAkKElDVVMpOyBscyBpY3U0YyoudGd6IHwgY3V0IC1kLSAtZjIgfCBzb3J0IHwgdW5pcSB8IGZncmVwIC12IC1mICQoTVVMVElDVV9ST09UKS9jL29sZC1pY3UudHh0KQorSUNVNEpWRVJTOj0kKHNoZWxsIGNkICQoSUNVUyk7IGxzIGljdTRqKi5qYXIgfCBjdXQgLWQtIC1mMiB8IGN1dCAtZC4gLWYxIHwgIHNvcnQgfCB1bmlxIHwgZmdyZXAgLXYgLWYgJChNVUxUSUNVX1JPT1QpL2ovb2xkLWljdTRqLnR4dCkKKworQkxEPSQoQ19CTEQpCitJTlM9JChDX0lOUykKK1NSQz0kKENfU1JDKQorCitBTExJQ1VTPSQoSUNVVkVSUzolPSQoQkxEKS8lLyQoU19CTEQpKSAkKElDVVZFUlM6JT0kKEJMRCkvciUvJChTX0JMRCkpCitSSUNVUz0kKElDVVZFUlM6JT0kKElOUykvciUvJChTX0lOUykpCitJSUNVUz0kKElDVVZFUlM6JT0kKElOUykvJS8kKFNfSU5TKSkgJChSSUNVUykKKworCitBUFJFQ0lPVVM9JChJQ1VWRVJTOiU9JChCTEQpLyUvJChTX1NSQykpICQoSUNVVkVSUzolPSQoQkxEKS9yJS8kKFNfU1JDKSkgJChJQ1VWRVJTOiU9JChCTEQpLyUvJChTX0JMRCkpICQoSUNVVkVSUzolPSQoSU5TKS8lLyQoU19JTlMpKSAkKElDVVZFUlM6JT0kKEJMRCkvciUvJChTX0JMRCkpICQoSUNVVkVSUzolPSQoSU5TKS9yJS8kKFNfSU5TKSkKKworLlBSRUNJT1VTOiAkKEFQUkVDSU9VUykKKwordGVocHJlY2lvdXM6CisJZWNobyAkKEFQUkVDSU9VUykKKworJChNX1RNUCkgJChCTEQpICQoSU5TKToKKwlta2RpciAkKE1fVE1QKQorCW1rZGlyICQoQkxEKSAkKFNSQykgICQoSU5TKQorCiskKElOUykvJS8kKFNfSU5TKTogJChCTEQpLyUvJChTX0JMRCkKKwlAaWYgWyAtZiAkKEJMRCkvJCovYnVpbGQuZXJyIF07IHRoZW4gZWNobyAnIyMjJyBFcnJvciBmb3IgJCogc3RvcmVkIGluICQoQkxEKS8kKi9idWlsZC5lcnIgLSByZW1vdmUgaWYgeW91IHdhbnQgbWUgdG8gcmV0cnk7IGZhbHNlOyAgZmkKKwkoIG1ha2UgJChNQUtFX09QVFMpIC1DICQoQkxEKS8kKi9pY3Uvc291cmNlIDI+JjEgYWxsIGluc3RhbGwgfCB0ZWUgJChCTEQpLyQqL2J1aWxkLmxvZyApIHx8ICggbXYgJChCTEQpLyQqL2J1aWxkLmxvZyAkKEJMRCkvJCovYnVpbGQuZXJyIDsgZmFsc2UgKQorCXRvdWNoIC1jICRACisKKyQoSU5TKS9yJS8kKFNfSU5TKTogJChCTEQpL3IlLyQoU19CTEQpCisJQGlmIFsgLWYgJChCTEQpL3IkKi9idWlsZC5lcnIgXTsgdGhlbiBlY2hvICcjIyMnIEVycm9yIGZvciAkKiBzdG9yZWQgaW4gJChCTEQpL3IkKi9idWlsZC5lcnIgLSByZW1vdmUgaWYgeW91IHdhbnQgbWUgdG8gcmV0cnk7IGZhbHNlOyAgZmkKKwkoIG1ha2UgJChNQUtFX09QVFMpIC1DICQoQkxEKS9yJCovaWN1L3NvdXJjZSAyPiYxIGFsbCBpbnN0YWxsIHwgdGVlICQoQkxEKS9yJCovYnVpbGQubG9nICkgfHwgKCBtdiAkKEJMRCkvciQqL2J1aWxkLmxvZyAkKEJMRCkvciQqL2J1aWxkLmVyciA7IGZhbHNlICkKKwl0b3VjaCAtYyAkQAorCiskKEJMRCkvciUvJChTX1NSQyk6ICQoSUNVUykvaWN1NGMtJS1zcmMudGd6CisJLW12ICQoQkxEKS9yJCogJChCTEQpL3IkKi5vbGQKKwktKCBybSAtcmYgLi8kKEJMRCkvciQqLm9sZCYgKQorCW1rZGlyIC1wICQoQkxEKS9yJCoKKwkoIGNkICQoQkxEKS9yJCogOyBndW56aXAgLWQgPCAkXiB8IHRhciB4ZnAgLSApCisJKFsgLWYgJChET1QpL3BhdGNoLyQqIF0gJiYgcGF0Y2ggLWQgJChCTEQpL3IkKiAtcDEgPCAkKERPVCkvcGF0Y2gvJCopIHx8IHRydWUKKwl0b3VjaCAtYyAkQAorCiskKEJMRCkvJS8kKFNfU1JDKTogJChJQ1VTKS9pY3U0Yy0lLXNyYy50Z3oKKwktbXYgJChCTEQpLyQqICQoQkxEKS8kKi5vbGQKKwktKCBybSAtcmYgLi8kKEJMRCkvJCoub2xkJiApCisJbWtkaXIgLXAgJChCTEQpLyQqCisJKCBjZCAkKEJMRCkvJCogOyBndW56aXAgLWQgPCAkXiB8IHRhciB4ZnAgLSApCisJKFsgLWYgJChET1QpL3BhdGNoLyQqIF0gJiYgcGF0Y2ggLWQgJChCTEQpLyQqIC1wMSA8ICQoRE9UKS9wYXRjaC8kKikgfHwgdHJ1ZQorCXRvdWNoIC1jICRACisKKworJChCTEQpL3IlLyQoU19CTEQpOiAkKEJMRCkvciUvJChTX1NSQykKKwktbWtkaXIgLXAgJChJTlMpCisJLWNobW9kIGErcnggJChCTEQpL3IkKi9pY3Uvc291cmNlL2NvbmZpZ3VyZSAkKEJMRCkvciQqL2ljdS9zb3VyY2UvcnVuQ29uZmlndXJlSUNVCisJKCBjZCAkKEJMRCkvciQqL2ljdS9zb3VyY2UgOyBgJChJQ1VDT05GKSAiJChCTEQpL3IkKi9pY3Uvc291cmNlIiAiJCoiYCAtLWVuYWJsZS1yZW5hbWluZyAtLWVuYWJsZS1zaGFyZWQgLS1kaXNhYmxlLXN0YXRpYyAtLWVuYWJsZS1yZWxlYXNlIC0tZGlzYWJsZS1kZWJ1ZyAtLXByZWZpeD0kKElOUykvciQqICkKKwl0b3VjaCAtYyAkQAorCiskKEJMRCkvJS8kKFNfQkxEKTogJChCTEQpLyUvJChTX1NSQykKKwktbWtkaXIgLXAgJChJTlMpCisJLWNobW9kIGErcnggJChCTEQpLyQqL2ljdS9zb3VyY2UvY29uZmlndXJlICQoQkxEKS8kKi9pY3Uvc291cmNlL3J1bkNvbmZpZ3VyZUlDVQorCSggY2QgJChCTEQpLyQqL2ljdS9zb3VyY2UgOyBgJChJQ1VDT05GKSAiJChCTEQpLyQqL2ljdS9zb3VyY2UiICIkKiJgIC0tZGlzYWJsZS1yZW5hbWluZyAtLWVuYWJsZS1zaGFyZWQgLS1kaXNhYmxlLXN0YXRpYyAtLWVuYWJsZS1yZWxlYXNlIC0tZGlzYWJsZS1kZWJ1ZyAtLXByZWZpeD0kKElOUykvJCogKQorCXRvdWNoIC1jICRACisKKworJChJTlMpLyUvYmluLyQoVEFSR0VUKTogJChJTlMpLyUvJChTX0lOUykgJChTUkNTKQorCS1ybSAtcmYgLi8kKEJMRCkvJCovdG1wCisJbWtkaXIgLi8kKEJMRCkvJCovdG1wCisJQGZvciBmaWxlIGluICQoT0JKRUNUUyk7IFwKKwlkbyBcCisJCXdoYXQ9YGJhc2VuYW1lICQkZmlsZSAub2AgOyBcCisJCWVjaG8gY29tcGlsaW5nICQqLyQkd2hhdCA7IFwKKwkJJChDWFgpIC1jIC1vIC4vJChCTEQpLyQqL3RtcC8kJHdoYXQubyAkJHdoYXQuY3BwIC1JICQoSU5TKS8kKi9pbmNsdWRlIC1JICQoQkxEKS8kKi9pY3Uvc291cmNlL3Rvb2xzL3Rvb2x1dGlsIDsgXAorCWRvbmUKKwkkKENYWCkgLW8gJEAgJChPQkpFQ1RTOiUubz0uLyQoQkxEKS8kKi90bXAvJS5vKSAgLWxpY3VkYXRhIC1saWN1dWMgLWxpY3V0dSAtbGljdWkxOG4gLUwkKElOUykvJCovbGliIAorCitmb286CisJZWNobyAkKEFMTElDVVMpCisKK2FsbGljdXM6ICQoQkxEKSAkKEFMTElDVVMpCisKKworYWxsLWljdXM6IGlpY3VzCisKK2lpY3VzOiAkKEJMRCkgJChJSUNVUykKKworcmljdXM6ICQoUklDVVMpCmRpZmYgLS1naXQgYS9tdWx0aS9jL01ha2VmaWxlLWMuaW5jIGIvbXVsdGkvYy9NYWtlZmlsZS1jLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGU3NzU1Ci0tLSAvZGV2L251bGwKKysrIGIvbXVsdGkvYy9NYWtlZmlsZS1jLmluYwpAQCAtMCwwICsxLDQ1IEBACisjIENvcHlyaWdodCAoYykgMjAwOC0yMDEwIElCTSBDb3JwLiBhbmQgT3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkCisKK2luY2x1ZGUgJChNVUxUSUNVX1JPT1QpL2NvbW1vbi9NYWtlZmlsZS1tdWx0aS5pbmMKKworQ19HT09EOj0kKHNoZWxsIFsgLWQgJChDX0lOUykgXSAmJiAoY2QgJChDX0lOUykgOyBscyAtZCAqLyQoU19JTlMpIDI+L2Rldi9udWxsIHwgY3V0IC1kLyAtZjEpKQorCitDX0NMRUFOX1RBUkdFVD0kKENfR09PRDolPSQoQ19JTlMpLyUvYmluLyQoVEFSR0VUKSkKKworU09VUkNFUz0kKENfU09VUkNFUykgJChDWFhfU09VUkNFUykKK0NfT0JKRUNUUz0kKENfU09VUkNFUzolLmM9JS5vKQorQ1hYX09CSkVDVFM9JChDWFhfU09VUkNFUzolLmNwcD0lLm8pCitPQkpFQ1RTPSQoQ19PQkpFQ1RTKSAkKENYWF9PQkpFQ1RTKQorREVCVUdPUFQ9LWcKKworIyBsaXN0IG9mIElDVXMgdG8gYmUgYnVpbHQJCitJQ1VfVEFSQkFMTFM9JChzaGVsbCBjZCAkKElDVVMpIDsgbHMgaWN1NGMtKi1zcmMudGd6KQorIyBsaXN0IG9mIHZlcnNpb25zICggZm9ybSAiM184ICA0XzAiIGV0Yy4gKQorSUNVX1RBUkJBTExTX1ZFUlM9JChJQ1VfVEFSQkFMTFM6aWN1NGMtJS1zcmMudGd6PSUpCisKKworJChDX0lOUykvJS9iaW4vJChUQVJHRVQpOgkkKFNPVVJDRVMpICQoSEVBREVSUykKKwktcm0gLXJmICQoQ19JTlMpLyQqL3RtcAorCW1rZGlyICQoQ19JTlMpLyQqL3RtcAoraWZuZXEgKCwkKENYWF9PQkpFQ1RTKSkKKwlAZm9yIGZpbGUgaW4gJChDWFhfT0JKRUNUUyk7IFwKKwlkbyBcCisJCXdoYXQ9YGJhc2VuYW1lICQkZmlsZSAub2AgOyBcCisJCWVjaG8gY29tcGlsaW5nICcoQysrKScgJCovJCR3aGF0IDsgXAorCQlgJChDX0lOUykvJCovYmluL2ljdS1jb25maWcgLS1jeHhgIGAkKENfSU5TKS8kKi9iaW4vaWN1LWNvbmZpZyAtLWN4eGZsYWdzYCAkKERFQlVHT1BUKSAgLWMgLW8gJChDX0lOUykvJCovdG1wLyQkd2hhdC5vICQkd2hhdC5jcHAgLUkgJChDX0lOUykvJCovaW5jbHVkZSAtSSAkKENfQkxEKS8kKi9pY3Uvc291cmNlL3Rvb2xzL3Rvb2x1dGlsICB8fCBcCisJCSQoQ1hYKSAkKERFQlVHT1BUKSAtYyAtbyAkKENfSU5TKS8kKi90bXAvJCR3aGF0Lm8gJCR7d2hhdH0uY3BwIC1JICQoQ19JTlMpLyQqL2luY2x1ZGUgLUkgJChDX0JMRCkvJCovaWN1L3NvdXJjZS90b29scy90b29sdXRpbCA7IFwKKwlkb25lCitlbmRpZgoraWZuZXEgKCwkKENfT0JKRUNUUykpCisJQGZvciBmaWxlIGluICQoQ19PQkpFQ1RTKTsgXAorCWRvIFwKKwkJd2hhdD1gYmFzZW5hbWUgJCRmaWxlIC5vYCA7IFwKKwkJZWNobyBjb21waWxpbmcgJyhDICApJyAkKi8kJHdoYXQgOyBcCisJCSQoQ0MpICQoREVCVUdPUFQpIC1jIC1vICQoQ19JTlMpLyQqL3RtcC8kJHdoYXQubyAkJHt3aGF0fS5jIC1JICQoQ19JTlMpLyQqL2luY2x1ZGUgLUkgJChDX0JMRCkvJCovaWN1L3NvdXJjZS90b29scy90b29sdXRpbCA7IFwKKwlkb25lCitlbmRpZgorCUBlY2hvIGxpbmtpbmcgJCovJCR3aGF0CisJQGAkKENfSU5TKS8kKi9iaW4vaWN1LWNvbmZpZyAtLWN4eGAgYCQoQ19JTlMpLyQqL2Jpbi9pY3UtY29uZmlnIC0tbGRmbGFncyBgICAkKERFQlVHT1BUKSAtbyAkQCAkKE9CSkVDVFM6JS5vPSQoQ19JTlMpLyQqL3RtcC8lLm8pICAtbGljdWRhdGEgLWxpY3V1YyAtbGljdXR1IC1saWN1aTE4biAtbGljdWlvIC1MJChDX0lOUykvJCovbGliIHx8IFwKKwkgJChDWFgpICQoREVCVUdPUFQpIC1vICRAICQoT0JKRUNUUzolLm89JChDX0lOUykvJCovdG1wLyUubykgIC1saWN1ZGF0YSAtbGljdXVjIC1saWN1dHUgLWxpY3VpMThuIC1saWN1aW8gLUwkKENfSU5TKS8kKi9saWIgCisKKwpkaWZmIC0tZ2l0IGEvbXVsdGkvYy9vbGQtaWN1LnR4dCBiL211bHRpL2Mvb2xkLWljdS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg2N2U3ZAotLS0gL2Rldi9udWxsCisrKyBiL211bHRpL2Mvb2xkLWljdS50eHQKQEAgLTAsMCArMSwyIEBACisjIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycC4gYW5kIE90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZAorIyBhIGxpc3Qgb2YgSUNVNENzIHRvbyBvbGQgdG8gYnVpbGQgd2l0aCB0aGUgY3VycmVudCBwYXRjaHNldC4KZGlmZiAtLWdpdCBhL211bHRpL2MvcGF0Y2gvM18wIGIvbXVsdGkvYy9wYXRjaC8zXzAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEzMzgwMQotLS0gL2Rldi9udWxsCisrKyBiL211bHRpL2MvcGF0Y2gvM18wCkBAIC0wLDAgKzEsMTI3NzUgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgSUJNIENvcnAuIGFuZCBPdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKK09ubHkgaW4gM18wL2ljdS9zb3VyY2U6IGJpbgorT25seSBpbiAzXzAub3JpZy9pY3Uvc291cmNlOiBjb25mZGVmcy5oCitkaWZmIC1ydSAzXzAub3JpZy9pY3Uvc291cmNlL2NvbmZpZy9taC1kYXJ3aW4gM18wL2ljdS9zb3VyY2UvY29uZmlnL21oLWRhcndpbgorLS0tIDNfMC5vcmlnL2ljdS9zb3VyY2UvY29uZmlnL21oLWRhcndpbgkyMDA4LTEwLTIwIDE0OjU3OjUyLjAwMDAwMDAwMCAtMDcwMAorKysrIDNfMC9pY3Uvc291cmNlL2NvbmZpZy9taC1kYXJ3aW4JMjAwOC0xMC0yMCAxNTo1NzoyOC4wMDAwMDAwMDAgLTA3MDAKK0BAIC0xNSw2ICsxNSw4IEBACisgIyMgQ29tbWFuZHMgdG8gZ2VuZXJhdGUgZGVwZW5kZW5jeSBmaWxlcworIEdFTl9ERVBTLmM9CSQoQ0MpIC1FIC1NTUQgICQoREVGUykgJChDUFBGTEFHUykKKyBHRU5fREVQUy5jYz0JJChDWFgpIC1FIC1NTUQgICQoREVGUykgJChDUFBGTEFHUykKKytHRU5fREVQUy5jPQllY2hvCisrR0VOX0RFUFMuY2M9CWVjaG8KKyAKKyAjIyBDb21tYW5kcyB0byBjb21waWxlCisgQ09NUElMRS5jPQkkKENDKSAkKERFRlMpICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAtZm5vLWNvbW1vbiAtYworT25seSBpbiAzXzAub3JpZy9pY3Uvc291cmNlOiBjb25maWcuY2FjaGUKK09ubHkgaW4gM18wLm9yaWcvaWN1L3NvdXJjZTogY29uZmlnLmxvZworZGlmZiAtcnUgM18wLm9yaWcvaWN1L3NvdXJjZS9jb25maWd1cmUgM18wL2ljdS9zb3VyY2UvY29uZmlndXJlCistLS0gM18wLm9yaWcvaWN1L3NvdXJjZS9jb25maWd1cmUJMjAwOC0xMC0yMCAxNDo1ODoxMC4wMDAwMDAwMDAgLTA3MDAKKysrKyAzXzAvaWN1L3NvdXJjZS9jb25maWd1cmUJMjAwOC0xMC0yMCAxNTo1NDo0Ni4wMDAwMDAwMDAgLTA3MDAKK0BAIC0xLDY1ICsxLDgyMiBAQAorICMhIC9iaW4vc2gKKy0KKyAjIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCistIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTMgCistIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorKyMgR2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjYzLgorICMKKysjIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwKKysjIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgorKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworKyMjIE00c2ggSW5pdGlhbGl6YXRpb24uICAjIworKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworKworKyMgQmUgbW9yZSBCb3VybmUgY29tcGF0aWJsZQorK0RVQUxDQVNFPTE7IGV4cG9ydCBEVUFMQ0FTRSAjIGZvciBNS1Mgc2gKKytpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKysgIGVtdWxhdGUgc2gKKysgIE5VTExDTUQ9OgorKyAgIyBQcmUtNC4yIHZlcnNpb25zIG9mIFpzaCBkbyB3b3JkIHNwbGl0dGluZyBvbiAkezErIiRAIn0sIHdoaWNoCisrICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgorKyAgYWxpYXMgLWcgJyR7MSsiJEAifSc9JyIkQCInCisrICBzZXRvcHQgTk9fR0xPQl9TVUJTVAorK2Vsc2UKKysgIGNhc2UgYChzZXQgLW8pIDI+L2Rldi9udWxsYCBpbgorKyAgKnBvc2l4Kikgc2V0IC1vIHBvc2l4IDs7CisrZXNhYworKworK2ZpCisrCisrCisrCisrCisrIyBQQVRIIG5lZWRzIENSCisrIyBBdm9pZCBkZXBlbmRpbmcgdXBvbiBDaGFyYWN0ZXIgUmFuZ2VzLgorK2FzX2NyX2xldHRlcnM9J2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JworK2FzX2NyX0xFVFRFUlM9J0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJworK2FzX2NyX0xldHRlcnM9JGFzX2NyX2xldHRlcnMkYXNfY3JfTEVUVEVSUworK2FzX2NyX2RpZ2l0cz0nMDEyMzQ1Njc4OScKKythc19jcl9hbG51bT0kYXNfY3JfTGV0dGVycyRhc19jcl9kaWdpdHMKKysKKythc19ubD0nCisrJworK2V4cG9ydCBhc19ubAorKyMgUHJpbnRpbmcgYSBsb25nIHN0cmluZyBjcmFzaGVzIFNvbGFyaXMgNyAvdXNyL2Jpbi9wcmludGYuCisrYXNfZWNobz0nXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXCcKKythc19lY2hvPSRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8KKythc19lY2hvPSRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobworK2lmICh0ZXN0ICJYYHByaW50ZiAlcyAkYXNfZWNob2AiID0gIlgkYXNfZWNobyIpIDI+L2Rldi9udWxsOyB0aGVuCisrICBhc19lY2hvPSdwcmludGYgJXNcbicKKysgIGFzX2VjaG9fbj0ncHJpbnRmICVzJworK2Vsc2UKKysgIGlmIHRlc3QgIlhgKC91c3IvdWNiL2VjaG8gLW4gLW4gJGFzX2VjaG8pIDI+L2Rldi9udWxsYCIgPSAiWC1uICRhc19lY2hvIjsgdGhlbgorKyAgICBhc19lY2hvX2JvZHk9J2V2YWwgL3Vzci91Y2IvZWNobyAtbiAiJDEkYXNfbmwiJworKyAgICBhc19lY2hvX249Jy91c3IvdWNiL2VjaG8gLW4nCisrICBlbHNlCisrICAgIGFzX2VjaG9fYm9keT0nZXZhbCBleHByICJYJDEiIDogIlhcXCguKlxcKSInCisrICAgIGFzX2VjaG9fbl9ib2R5PSdldmFsCisrICAgICAgYXJnPSQxOworKyAgICAgIGNhc2UgJGFyZyBpbgorKyAgICAgICoiJGFzX25sIiopCisrCWV4cHIgIlgkYXJnIiA6ICJYXFwoLipcXCkkYXNfbmwiOworKwlhcmc9YGV4cHIgIlgkYXJnIiA6ICIuKiRhc19ubFxcKC4qXFwpImA7OworKyAgICAgIGVzYWM7CisrICAgICAgZXhwciAiWCRhcmciIDogIlhcXCguKlxcKSIgfCB0ciAtZCAiJGFzX25sIgorKyAgICAnCisrICAgIGV4cG9ydCBhc19lY2hvX25fYm9keQorKyAgICBhc19lY2hvX249J3NoIC1jICRhc19lY2hvX25fYm9keSBhc19lY2hvJworKyAgZmkKKysgIGV4cG9ydCBhc19lY2hvX2JvZHkKKysgIGFzX2VjaG89J3NoIC1jICRhc19lY2hvX2JvZHkgYXNfZWNobycKKytmaQorKworKyMgVGhlIHVzZXIgaXMgYWx3YXlzIHJpZ2h0LgorK2lmIHRlc3QgIiR7UEFUSF9TRVBBUkFUT1Irc2V0fSIgIT0gc2V0OyB0aGVuCisrICBQQVRIX1NFUEFSQVRPUj06CisrICAoUEFUSD0nL2JpbjsvYmluJzsgRlBBVEg9JFBBVEg7IHNoIC1jIDopID4vZGV2L251bGwgMj4mMSAmJiB7CisrICAgIChQQVRIPScvYmluOi9iaW4nOyBGUEFUSD0kUEFUSDsgc2ggLWMgOikgPi9kZXYvbnVsbCAyPiYxIHx8CisrICAgICAgUEFUSF9TRVBBUkFUT1I9JzsnCisrICB9CisrZmkKKysKKysjIFN1cHBvcnQgdW5zZXQgd2hlbiBwb3NzaWJsZS4KKytpZiAoIChNQUlMPTYwOyB1bnNldCBNQUlMKSB8fCBleGl0KSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKysgIGFzX3Vuc2V0PXVuc2V0CisrZWxzZQorKyAgYXNfdW5zZXQ9ZmFsc2UKKytmaQorKworKworKyMgSUZTCisrIyBXZSBuZWVkIHNwYWNlLCB0YWIgYW5kIG5ldyBsaW5lLCBpbiBwcmVjaXNlbHkgdGhhdCBvcmRlci4gIFF1b3RpbmcgaXMKKysjIHRoZXJlIHRvIHByZXZlbnQgZWRpdG9ycyBmcm9tIGNvbXBsYWluaW5nIGFib3V0IHNwYWNlLXRhYi4KKysjIChJZiBfQVNfUEFUSF9XQUxLIHdlcmUgY2FsbGVkIHdpdGggSUZTIHVuc2V0LCBpdCB3b3VsZCBkaXNhYmxlIHdvcmQKKysjIHNwbGl0dGluZyBieSBzZXR0aW5nIElGUyB0byBlbXB0eSB2YWx1ZS4pCisrSUZTPSIgIiIJJGFzX25sIgorKworKyMgRmluZCB3aG8gd2UgYXJlLiAgTG9vayBpbiB0aGUgcGF0aCBpZiB3ZSBjb250YWluIG5vIGRpcmVjdG9yeSBzZXBhcmF0b3IuCisrY2FzZSAkMCBpbgorKyAgKltcXC9dKiApIGFzX215c2VsZj0kMCA7OworKyAgKikgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorK2ZvciBhc19kaXIgaW4gJFBBVEgKKytkbworKyAgSUZTPSRhc19zYXZlX0lGUworKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKysgIHRlc3QgLXIgIiRhc19kaXIvJDAiICYmIGFzX215c2VsZj0kYXNfZGlyLyQwICYmIGJyZWFrCisrZG9uZQorK0lGUz0kYXNfc2F2ZV9JRlMKKysKKysgICAgIDs7CisrZXNhYworKyMgV2UgZGlkIG5vdCBmaW5kIG91cnNlbHZlcywgbW9zdCBwcm9iYWJseSB3ZSB3ZXJlIHJ1biBhcyBgc2ggQ09NTUFORCcKKysjIGluIHdoaWNoIGNhc2Ugd2UgYXJlIG5vdCB0byBiZSBmb3VuZCBpbiB0aGUgcGF0aC4KKytpZiB0ZXN0ICJ4JGFzX215c2VsZiIgPSB4OyB0aGVuCisrICBhc19teXNlbGY9JDAKKytmaQorK2lmIHRlc3QgISAtZiAiJGFzX215c2VsZiI7IHRoZW4KKysgICRhc19lY2hvICIkYXNfbXlzZWxmOiBlcnJvcjogY2Fubm90IGZpbmQgbXlzZWxmOyByZXJ1biB3aXRoIGFuIGFic29sdXRlIGZpbGUgbmFtZSIgPiYyCisrICB7IChleGl0IDEpOyBleGl0IDE7IH0KKytmaQorKworKyMgV29yayBhcm91bmQgYnVncyBpbiBwcmUtMy4wIFVXSU4ga3NoLgorK2ZvciBhc192YXIgaW4gRU5WIE1BSUwgTUFJTFBBVEgKKytkbyAoJGFzX3Vuc2V0ICRhc192YXIpID4vZGV2L251bGwgMj4mMSAmJiAkYXNfdW5zZXQgJGFzX3ZhcgorK2RvbmUKKytQUzE9JyQgJworK1BTMj0nPiAnCisrUFM0PScrICcKKysKKysjIE5MUyBudWlzYW5jZXMuCisrTENfQUxMPUMKKytleHBvcnQgTENfQUxMCisrTEFOR1VBR0U9QworK2V4cG9ydCBMQU5HVUFHRQorKworKyMgUmVxdWlyZWQgdG8gdXNlIGJhc2VuYW1lLgorK2lmIGV4cHIgYSA6ICdcKGFcKScgPi9kZXYvbnVsbCAyPiYxICYmCisrICAgdGVzdCAiWGBleHByIDAwMDAxIDogJy4qXCguLi5cKSdgIiA9IFgwMDE7IHRoZW4KKysgIGFzX2V4cHI9ZXhwcgorK2Vsc2UKKysgIGFzX2V4cHI9ZmFsc2UKKytmaQorKworK2lmIChiYXNlbmFtZSAtLSAvKSA+L2Rldi9udWxsIDI+JjEgJiYgdGVzdCAiWGBiYXNlbmFtZSAtLSAvIDI+JjFgIiA9ICJYLyI7IHRoZW4KKysgIGFzX2Jhc2VuYW1lPWJhc2VuYW1lCisrZWxzZQorKyAgYXNfYmFzZW5hbWU9ZmFsc2UKKytmaQorKworKworKyMgTmFtZSBvZiB0aGUgZXhlY3V0YWJsZS4KKythc19tZT1gJGFzX2Jhc2VuYW1lIC0tICIkMCIgfHwKKyskYXNfZXhwciBYLyIkMCIgOiAnLiovXChbXi9dW14vXSpcKS8qJCcgXHwgXAorKwkgWCIkMCIgOiAnWFwoLy9cKSQnIFx8IFwKKysJIFgiJDAiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorKyRhc19lY2hvIFgvIiQwIiB8CisrICAgIHNlZCAnL14uKlwvXChbXi9dW14vXSpcKVwvKiQveworKwkgICAgcy8vXDEvCisrCSAgICBxCisrCSAgfQorKwkgIC9eWFwvXChcL1wvXCkkL3sKKysJICAgIHMvL1wxLworKwkgICAgcQorKwkgIH0KKysJICAvXlhcL1woXC9cKS4qL3sKKysJICAgIHMvL1wxLworKwkgICAgcQorKwkgIH0KKysJICBzLy4qLy4vOyBxJ2AKKysKKysjIENEUEFUSC4KKyskYXNfdW5zZXQgQ0RQQVRICisrCisrCisraWYgdGVzdCAieCRDT05GSUdfU0hFTEwiID0geDsgdGhlbgorKyAgaWYgKGV2YWwgIjoiKSAyPi9kZXYvbnVsbDsgdGhlbgorKyAgYXNfaGF2ZV9yZXF1aXJlZD15ZXMKKytlbHNlCisrICBhc19oYXZlX3JlcXVpcmVkPW5vCisrZmkKKysKKysgIGlmIHRlc3QgJGFzX2hhdmVfcmVxdWlyZWQgPSB5ZXMgJiYJIChldmFsICI6CisrKGFzX2Z1bmNfcmV0dXJuICgpIHsKKysgIChleGl0IFwkMSkKKyt9CisrYXNfZnVuY19zdWNjZXNzICgpIHsKKysgIGFzX2Z1bmNfcmV0dXJuIDAKKyt9CisrYXNfZnVuY19mYWlsdXJlICgpIHsKKysgIGFzX2Z1bmNfcmV0dXJuIDEKKyt9CisrYXNfZnVuY19yZXRfc3VjY2VzcyAoKSB7CisrICByZXR1cm4gMAorK30KKythc19mdW5jX3JldF9mYWlsdXJlICgpIHsKKysgIHJldHVybiAxCisrfQorKworK2V4aXRjb2RlPTAKKytpZiBhc19mdW5jX3N1Y2Nlc3M7IHRoZW4KKysgIDoKKytlbHNlCisrICBleGl0Y29kZT0xCisrICBlY2hvIGFzX2Z1bmNfc3VjY2VzcyBmYWlsZWQuCisrZmkKKysKKytpZiBhc19mdW5jX2ZhaWx1cmU7IHRoZW4KKysgIGV4aXRjb2RlPTEKKysgIGVjaG8gYXNfZnVuY19mYWlsdXJlIHN1Y2NlZWRlZC4KKytmaQorKworK2lmIGFzX2Z1bmNfcmV0X3N1Y2Nlc3M7IHRoZW4KKysgIDoKKytlbHNlCisrICBleGl0Y29kZT0xCisrICBlY2hvIGFzX2Z1bmNfcmV0X3N1Y2Nlc3MgZmFpbGVkLgorK2ZpCisrCisraWYgYXNfZnVuY19yZXRfZmFpbHVyZTsgdGhlbgorKyAgZXhpdGNvZGU9MQorKyAgZWNobyBhc19mdW5jX3JldF9mYWlsdXJlIHN1Y2NlZWRlZC4KKytmaQorKworK2lmICggc2V0IHg7IGFzX2Z1bmNfcmV0X3N1Y2Nlc3MgeSAmJiB0ZXN0IHggPSBcIlwkMVwiICk7IHRoZW4KKysgIDoKKytlbHNlCisrICBleGl0Y29kZT0xCisrICBlY2hvIHBvc2l0aW9uYWwgcGFyYW1ldGVycyB3ZXJlIG5vdCBzYXZlZC4KKytmaQorKworK3Rlc3QgXCRleGl0Y29kZSA9IDApIHx8IHsgKGV4aXQgMSk7IGV4aXQgMTsgfQorKworKygKKysgIGFzX2xpbmVub18xPVwkTElORU5PCisrICBhc19saW5lbm9fMj1cJExJTkVOTworKyAgdGVzdCBcInhcJGFzX2xpbmVub18xXCIgIT0gXCJ4XCRhc19saW5lbm9fMlwiICYmCisrICB0ZXN0IFwieFxgZXhwciBcJGFzX2xpbmVub18xICsgMVxgXCIgPSBcInhcJGFzX2xpbmVub18yXCIpIHx8IHsgKGV4aXQgMSk7IGV4aXQgMTsgfQorKyIpIDI+IC9kZXYvbnVsbDsgdGhlbgorKyAgOgorK2Vsc2UKKysgIGFzX2NhbmRpZGF0ZV9zaGVsbHM9CisrICAgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKKytmb3IgYXNfZGlyIGluIC9iaW4kUEFUSF9TRVBBUkFUT1IvdXNyL2JpbiRQQVRIX1NFUEFSQVRPUiRQQVRICisrZG8KKysgIElGUz0kYXNfc2F2ZV9JRlMKKysgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisrICBjYXNlICRhc19kaXIgaW4KKysJIC8qKQorKwkgICBmb3IgYXNfYmFzZSBpbiBzaCBiYXNoIGtzaCBzaDU7IGRvCisrCSAgICAgYXNfY2FuZGlkYXRlX3NoZWxscz0iJGFzX2NhbmRpZGF0ZV9zaGVsbHMgJGFzX2Rpci8kYXNfYmFzZSIKKysJICAgZG9uZTs7CisrICAgICAgIGVzYWMKKytkb25lCisrSUZTPSRhc19zYXZlX0lGUworKworKworKyAgICAgIGZvciBhc19zaGVsbCBpbiAkYXNfY2FuZGlkYXRlX3NoZWxscyAkU0hFTEw7IGRvCisrCSAjIFRyeSBvbmx5IHNoZWxscyB0aGF0IGV4aXN0LCB0byBzYXZlIHNldmVyYWwgZm9ya3MuCisrCSBpZiB7IHRlc3QgLWYgIiRhc19zaGVsbCIgfHwgdGVzdCAtZiAiJGFzX3NoZWxsLmV4ZSI7IH0gJiYKKysJCXsgKCIkYXNfc2hlbGwiKSAyPiAvZGV2L251bGwgPDxcX0FTRU9GCisraWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisrICBlbXVsYXRlIHNoCisrICBOVUxMQ01EPToKKysgICMgUHJlLTQuMiB2ZXJzaW9ucyBvZiBac2ggZG8gd29yZCBzcGxpdHRpbmcgb24gJHsxKyIkQCJ9LCB3aGljaAorKyAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KKysgIGFsaWFzIC1nICckezErIiRAIn0nPSciJEAiJworKyAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKKytlbHNlCisrICBjYXNlIGAoc2V0IC1vKSAyPi9kZXYvbnVsbGAgaW4KKysgICpwb3NpeCopIHNldCAtbyBwb3NpeCA7OworK2VzYWMKKysKKytmaQorKworKworKzoKKytfQVNFT0YKKyt9OyB0aGVuCisrICBDT05GSUdfU0hFTEw9JGFzX3NoZWxsCisrCSAgICAgICBhc19oYXZlX3JlcXVpcmVkPXllcworKwkgICAgICAgaWYgeyAiJGFzX3NoZWxsIiAyPiAvZGV2L251bGwgPDxcX0FTRU9GCisraWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisrICBlbXVsYXRlIHNoCisrICBOVUxMQ01EPToKKysgICMgUHJlLTQuMiB2ZXJzaW9ucyBvZiBac2ggZG8gd29yZCBzcGxpdHRpbmcgb24gJHsxKyIkQCJ9LCB3aGljaAorKyAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KKysgIGFsaWFzIC1nICckezErIiRAIn0nPSciJEAiJworKyAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKKytlbHNlCisrICBjYXNlIGAoc2V0IC1vKSAyPi9kZXYvbnVsbGAgaW4KKysgICpwb3NpeCopIHNldCAtbyBwb3NpeCA7OworK2VzYWMKKysKKytmaQorKworKworKzoKKysoYXNfZnVuY19yZXR1cm4gKCkgeworKyAgKGV4aXQgJDEpCisrfQorK2FzX2Z1bmNfc3VjY2VzcyAoKSB7CisrICBhc19mdW5jX3JldHVybiAwCisrfQorK2FzX2Z1bmNfZmFpbHVyZSAoKSB7CisrICBhc19mdW5jX3JldHVybiAxCisrfQorK2FzX2Z1bmNfcmV0X3N1Y2Nlc3MgKCkgeworKyAgcmV0dXJuIDAKKyt9CisrYXNfZnVuY19yZXRfZmFpbHVyZSAoKSB7CisrICByZXR1cm4gMQorK30KKysKKytleGl0Y29kZT0wCisraWYgYXNfZnVuY19zdWNjZXNzOyB0aGVuCisrICA6CisrZWxzZQorKyAgZXhpdGNvZGU9MQorKyAgZWNobyBhc19mdW5jX3N1Y2Nlc3MgZmFpbGVkLgorK2ZpCisrCisraWYgYXNfZnVuY19mYWlsdXJlOyB0aGVuCisrICBleGl0Y29kZT0xCisrICBlY2hvIGFzX2Z1bmNfZmFpbHVyZSBzdWNjZWVkZWQuCisrZmkKKysKKytpZiBhc19mdW5jX3JldF9zdWNjZXNzOyB0aGVuCisrICA6CisrZWxzZQorKyAgZXhpdGNvZGU9MQorKyAgZWNobyBhc19mdW5jX3JldF9zdWNjZXNzIGZhaWxlZC4KKytmaQorKworK2lmIGFzX2Z1bmNfcmV0X2ZhaWx1cmU7IHRoZW4KKysgIGV4aXRjb2RlPTEKKysgIGVjaG8gYXNfZnVuY19yZXRfZmFpbHVyZSBzdWNjZWVkZWQuCisrZmkKKysKKytpZiAoIHNldCB4OyBhc19mdW5jX3JldF9zdWNjZXNzIHkgJiYgdGVzdCB4ID0gIiQxIiApOyB0aGVuCisrICA6CisrZWxzZQorKyAgZXhpdGNvZGU9MQorKyAgZWNobyBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgd2VyZSBub3Qgc2F2ZWQuCisrZmkKKysKKyt0ZXN0ICRleGl0Y29kZSA9IDApIHx8IHsgKGV4aXQgMSk7IGV4aXQgMTsgfQorKworKygKKysgIGFzX2xpbmVub18xPSRMSU5FTk8KKysgIGFzX2xpbmVub18yPSRMSU5FTk8KKysgIHRlc3QgIngkYXNfbGluZW5vXzEiICE9ICJ4JGFzX2xpbmVub18yIiAmJgorKyAgdGVzdCAieGBleHByICRhc19saW5lbm9fMSArIDFgIiA9ICJ4JGFzX2xpbmVub18yIikgfHwgeyAoZXhpdCAxKTsgZXhpdCAxOyB9CisrCisrX0FTRU9GCisrfTsgdGhlbgorKyAgYnJlYWsKKytmaQorKworK2ZpCisrCisrICAgICAgZG9uZQorKworKyAgICAgIGlmIHRlc3QgIngkQ09ORklHX1NIRUxMIiAhPSB4OyB0aGVuCisrICBmb3IgYXNfdmFyIGluIEJBU0hfRU5WIEVOVgorKwlkbyAoJGFzX3Vuc2V0ICRhc192YXIpID4vZGV2L251bGwgMj4mMSAmJiAkYXNfdW5zZXQgJGFzX3ZhcgorKwlkb25lCisrCWV4cG9ydCBDT05GSUdfU0hFTEwKKysJZXhlYyAiJENPTkZJR19TSEVMTCIgIiRhc19teXNlbGYiICR7MSsiJEAifQorK2ZpCisrCisrCisrICAgIGlmIHRlc3QgJGFzX2hhdmVfcmVxdWlyZWQgPSBubzsgdGhlbgorKyAgZWNobyBUaGlzIHNjcmlwdCByZXF1aXJlcyBhIHNoZWxsIG1vcmUgbW9kZXJuIHRoYW4gYWxsIHRoZQorKyAgICAgIGVjaG8gc2hlbGxzIHRoYXQgSSBmb3VuZCBvbiB5b3VyIHN5c3RlbS4gIFBsZWFzZSBpbnN0YWxsIGEKKysgICAgICBlY2hvIG1vZGVybiBzaGVsbCwgb3IgbWFudWFsbHkgcnVuIHRoZSBzY3JpcHQgdW5kZXIgc3VjaCBhCisrICAgICAgZWNobyBzaGVsbCBpZiB5b3UgZG8gaGF2ZSBvbmUuCisrICAgICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9CisrZmkKKysKKysKKytmaQorKworK2ZpCisrCisrCisrCisrKGV2YWwgImFzX2Z1bmNfcmV0dXJuICgpIHsKKysgIChleGl0IFwkMSkKKyt9CisrYXNfZnVuY19zdWNjZXNzICgpIHsKKysgIGFzX2Z1bmNfcmV0dXJuIDAKKyt9CisrYXNfZnVuY19mYWlsdXJlICgpIHsKKysgIGFzX2Z1bmNfcmV0dXJuIDEKKyt9CisrYXNfZnVuY19yZXRfc3VjY2VzcyAoKSB7CisrICByZXR1cm4gMAorK30KKythc19mdW5jX3JldF9mYWlsdXJlICgpIHsKKysgIHJldHVybiAxCisrfQorKworK2V4aXRjb2RlPTAKKytpZiBhc19mdW5jX3N1Y2Nlc3M7IHRoZW4KKysgIDoKKytlbHNlCisrICBleGl0Y29kZT0xCisrICBlY2hvIGFzX2Z1bmNfc3VjY2VzcyBmYWlsZWQuCisrZmkKKysKKytpZiBhc19mdW5jX2ZhaWx1cmU7IHRoZW4KKysgIGV4aXRjb2RlPTEKKysgIGVjaG8gYXNfZnVuY19mYWlsdXJlIHN1Y2NlZWRlZC4KKytmaQorKworK2lmIGFzX2Z1bmNfcmV0X3N1Y2Nlc3M7IHRoZW4KKysgIDoKKytlbHNlCisrICBleGl0Y29kZT0xCisrICBlY2hvIGFzX2Z1bmNfcmV0X3N1Y2Nlc3MgZmFpbGVkLgorK2ZpCisrCisraWYgYXNfZnVuY19yZXRfZmFpbHVyZTsgdGhlbgorKyAgZXhpdGNvZGU9MQorKyAgZWNobyBhc19mdW5jX3JldF9mYWlsdXJlIHN1Y2NlZWRlZC4KKytmaQorKworK2lmICggc2V0IHg7IGFzX2Z1bmNfcmV0X3N1Y2Nlc3MgeSAmJiB0ZXN0IHggPSBcIlwkMVwiICk7IHRoZW4KKysgIDoKKytlbHNlCisrICBleGl0Y29kZT0xCisrICBlY2hvIHBvc2l0aW9uYWwgcGFyYW1ldGVycyB3ZXJlIG5vdCBzYXZlZC4KKytmaQorKworK3Rlc3QgXCRleGl0Y29kZSA9IDAiKSB8fCB7CisrICBlY2hvIE5vIHNoZWxsIGZvdW5kIHRoYXQgc3VwcG9ydHMgc2hlbGwgZnVuY3Rpb25zLgorKyAgZWNobyBQbGVhc2UgdGVsbCBidWctYXV0b2NvbmZAZ251Lm9yZyBhYm91dCB5b3VyIHN5c3RlbSwKKysgIGVjaG8gaW5jbHVkaW5nIGFueSBlcnJvciBwb3NzaWJseSBvdXRwdXQgYmVmb3JlIHRoaXMgbWVzc2FnZS4KKysgIGVjaG8gVGhpcyBjYW4gaGVscCB1cyBpbXByb3ZlIGZ1dHVyZSBhdXRvY29uZiB2ZXJzaW9ucy4KKysgIGVjaG8gQ29uZmlndXJhdGlvbiB3aWxsIG5vdyBwcm9jZWVkIHdpdGhvdXQgc2hlbGwgZnVuY3Rpb25zLgorK30KKysKKysKKysKKysgIGFzX2xpbmVub18xPSRMSU5FTk8KKysgIGFzX2xpbmVub18yPSRMSU5FTk8KKysgIHRlc3QgIngkYXNfbGluZW5vXzEiICE9ICJ4JGFzX2xpbmVub18yIiAmJgorKyAgdGVzdCAieGBleHByICRhc19saW5lbm9fMSArIDFgIiA9ICJ4JGFzX2xpbmVub18yIiB8fCB7CisrCisrICAjIENyZWF0ZSAkYXNfbWUubGluZW5vIGFzIGEgY29weSBvZiAkYXNfbXlzZWxmLCBidXQgd2l0aCAkTElORU5PCisrICAjIHVuaWZvcm1seSByZXBsYWNlZCBieSB0aGUgbGluZSBudW1iZXIuICBUaGUgZmlyc3QgJ3NlZCcgaW5zZXJ0cyBhCisrICAjIGxpbmUtbnVtYmVyIGxpbmUgYWZ0ZXIgZWFjaCBsaW5lIHVzaW5nICRMSU5FTk87IHRoZSBzZWNvbmQgJ3NlZCcKKysgICMgZG9lcyB0aGUgcmVhbCB3b3JrLiAgVGhlIHNlY29uZCBzY3JpcHQgdXNlcyAnTicgdG8gcGFpciBlYWNoCisrICAjIGxpbmUtbnVtYmVyIGxpbmUgd2l0aCB0aGUgbGluZSBjb250YWluaW5nICRMSU5FTk8sIGFuZCBhcHBlbmRzCisrICAjIHRyYWlsaW5nICctJyBkdXJpbmcgc3Vic3RpdHV0aW9uIHNvIHRoYXQgJExJTkVOTyBpcyBub3QgYSBzcGVjaWFsCisrICAjIGNhc2UgYXQgbGluZSBlbmQuCisrICAjIChSYWphIFIgSGFyaW5hdGggc3VnZ2VzdGVkIHNlZCAnPScsIGFuZCBQYXVsIEVnZ2VydCB3cm90ZSB0aGUKKysgICMgc2NyaXB0cyB3aXRoIG9wdGltaXphdGlvbiBoZWxwIGZyb20gUGFvbG8gQm9uemluaS4gIEJsYW1lIExlZQorKyAgIyBFLiBNY01haG9uICgxOTMxLTE5ODkpIGZvciBzZWQncyBzeW50YXguICA6LSkKKysgIHNlZCAtbiAnCisrICAgIHAKKysgICAgL1skXUxJTkVOTy89CisrICAnIDwkYXNfbXlzZWxmIHwKKysgICAgc2VkICcKKysgICAgICBzL1skXUxJTkVOTy4qLyYtLworKyAgICAgIHQgbGluZW5vCisrICAgICAgYgorKyAgICAgIDpsaW5lbm8KKysgICAgICBOCisrICAgICAgOmxvb3AKKysgICAgICBzL1skXUxJTkVOT1woW14nJGFzX2NyX2FsbnVtJ19dLipcblwpXCguKlwpL1wyXDFcMi8KKysgICAgICB0IGxvb3AKKysgICAgICBzLy1cbi4qLy8KKysgICAgJyA+JGFzX21lLmxpbmVubyAmJgorKyAgY2htb2QgK3ggIiRhc19tZS5saW5lbm8iIHx8CisrICAgIHsgJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjcmVhdGUgJGFzX21lLmxpbmVubzsgcmVydW4gd2l0aCBhIFBPU0lYIHNoZWxsIiA+JjIKKysgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKysKKysgICMgRG9uJ3QgdHJ5IHRvIGV4ZWMgYXMgaXQgY2hhbmdlcyAkWzBdLCBjYXVzaW5nIGFsbCBzb3J0IG9mIHByb2JsZW1zCisrICAjICh0aGUgZGlybmFtZSBvZiAkWzBdIGlzIG5vdCB0aGUgcGxhY2Ugd2hlcmUgd2UgbWlnaHQgZmluZCB0aGUKKysgICMgb3JpZ2luYWwgYW5kIHNvIG9uLiAgQXV0b2NvbmYgaXMgZXNwZWNpYWxseSBzZW5zaXRpdmUgdG8gdGhpcykuCisrICAuICIuLyRhc19tZS5saW5lbm8iCisrICAjIEV4aXQgc3RhdHVzIGlzIHRoYXQgb2YgdGhlIGxhc3QgY29tbWFuZC4KKysgIGV4aXQKKyt9CisrCisrCisraWYgKGFzX2Rpcj1gZGlybmFtZSAtLSAvYCAmJiB0ZXN0ICJYJGFzX2RpciIgPSBYLykgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisrICBhc19kaXJuYW1lPWRpcm5hbWUKKytlbHNlCisrICBhc19kaXJuYW1lPWZhbHNlCisrZmkKKysKKytFQ0hPX0M9IEVDSE9fTj0gRUNIT19UPQorK2Nhc2UgYGVjaG8gLW4geGAgaW4KKystbiopCisrICBjYXNlIGBlY2hvICd4XGMnYCBpbgorKyAgKmMqKSBFQ0hPX1Q9JwknOzsJIyBFQ0hPX1QgaXMgc2luZ2xlIHRhYiBjaGFyYWN0ZXIuCisrICAqKSAgIEVDSE9fQz0nXGMnOzsKKysgIGVzYWM7OworKyopCisrICBFQ0hPX049Jy1uJzs7CisrZXNhYworK2lmIGV4cHIgYSA6ICdcKGFcKScgPi9kZXYvbnVsbCAyPiYxICYmCisrICAgdGVzdCAiWGBleHByIDAwMDAxIDogJy4qXCguLi5cKSdgIiA9IFgwMDE7IHRoZW4KKysgIGFzX2V4cHI9ZXhwcgorK2Vsc2UKKysgIGFzX2V4cHI9ZmFsc2UKKytmaQorKworK3JtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5maWxlCisraWYgdGVzdCAtZCBjb25mJCQuZGlyOyB0aGVuCisrICBybSAtZiBjb25mJCQuZGlyL2NvbmYkJC5maWxlCisrZWxzZQorKyAgcm0gLWYgY29uZiQkLmRpcgorKyAgbWtkaXIgY29uZiQkLmRpciAyPi9kZXYvbnVsbAorK2ZpCisraWYgKGVjaG8gPmNvbmYkJC5maWxlKSAyPi9kZXYvbnVsbDsgdGhlbgorKyAgaWYgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCisrICAgIGFzX2xuX3M9J2xuIC1zJworKyAgICAjIC4uLiBidXQgdGhlcmUgYXJlIHR3byBnb3RjaGFzOgorKyAgICAjIDEpIE9uIE1TWVMsIGJvdGggYGxuIC1zIGZpbGUgZGlyJyBhbmQgYGxuIGZpbGUgZGlyJyBmYWlsLgorKyAgICAjIDIpIERKR1BQIDwgMi4wNCBoYXMgbm8gc3ltbGlua3M7IGBsbiAtcycgY3JlYXRlcyBhIHdyYXBwZXIgZXhlY3V0YWJsZS4KKysgICAgIyBJbiBib3RoIGNhc2VzLCB3ZSBoYXZlIHRvIGRlZmF1bHQgdG8gYGNwIC1wJy4KKysgICAgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkLmRpciAyPi9kZXYvbnVsbCAmJiB0ZXN0ICEgLWYgY29uZiQkLmV4ZSB8fAorKyAgICAgIGFzX2xuX3M9J2NwIC1wJworKyAgZWxpZiBsbiBjb25mJCQuZmlsZSBjb25mJCQgMj4vZGV2L251bGw7IHRoZW4KKysgICAgYXNfbG5fcz1sbgorKyAgZWxzZQorKyAgICBhc19sbl9zPSdjcCAtcCcKKysgIGZpCisrZWxzZQorKyAgYXNfbG5fcz0nY3AgLXAnCisrZmkKKytybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZGlyL2NvbmYkJC5maWxlIGNvbmYkJC5maWxlCisrcm1kaXIgY29uZiQkLmRpciAyPi9kZXYvbnVsbAorKworK2lmIG1rZGlyIC1wIC4gMj4vZGV2L251bGw7IHRoZW4KKysgIGFzX21rZGlyX3A9OgorK2Vsc2UKKysgIHRlc3QgLWQgLi8tcCAmJiBybWRpciAuLy1wCisrICBhc19ta2Rpcl9wPWZhbHNlCisrZmkKKyAKKy0jIERlZmF1bHRzOgorLWFjX2hlbHA9CisraWYgdGVzdCAteCAvID4vZGV2L251bGwgMj4mMTsgdGhlbgorKyAgYXNfdGVzdF94PSd0ZXN0IC14JworK2Vsc2UKKysgIGlmIGxzIC1kTCAvID4vZGV2L251bGwgMj4mMTsgdGhlbgorKyAgICBhc19sc19MX29wdGlvbj1MCisrICBlbHNlCisrICAgIGFzX2xzX0xfb3B0aW9uPQorKyAgZmkKKysgIGFzX3Rlc3RfeD0nCisrICAgIGV2YWwgc2ggLWMgJ1wnJworKyAgICAgIGlmIHRlc3QgLWQgIiQxIjsgdGhlbgorKwl0ZXN0IC1kICIkMS8uIjsKKysgICAgICBlbHNlCisrCWNhc2UgJDEgaW4KKysJLSopc2V0ICIuLyQxIjs7CisrCWVzYWM7CisrCWNhc2UgYGxzIC1sZCckYXNfbHNfTF9vcHRpb24nICIkMSIgMj4vZGV2L251bGxgIGluCisrCT8/P1tzeF0qKTo7OyopZmFsc2U7O2VzYWM7ZmkKKysgICAgJ1wnJyBzaAorKyAgJworK2ZpCisrYXNfZXhlY3V0YWJsZV9wPSRhc190ZXN0X3gKKysKKysjIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgQ1BQIG5hbWUuCisrYXNfdHJfY3BwPSJldmFsIHNlZCAneSUqJGFzX2NyX2xldHRlcnMlUCRhc19jcl9MRVRURVJTJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKKysKKysjIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgdmFyaWFibGUgbmFtZS4KKythc190cl9zaD0iZXZhbCBzZWQgJ3klKislcHAlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgorKworKworKworK2V4ZWMgNzwmMCA8L2Rldi9udWxsIDY+JjEKKysKKysjIE5hbWUgb2YgdGhlIGhvc3QuCisrIyBob3N0bmFtZSBvbiBzb21lIHN5c3RlbXMgKFNWUjMuMiwgTGludXgpIHJldHVybnMgYSBib2d1cyBleGl0IHN0YXR1cywKKysjIHNvIHVuYW1lIGdldHMgcnVuIHRvby4KKythY19ob3N0bmFtZT1gKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWAKKysKKysjCisrIyBJbml0aWFsaXphdGlvbnMuCisrIworIGFjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKKy0jIEFueSBhZGRpdGlvbnMgZnJvbSBjb25maWd1cmUuaW46CistYWNfaGVscD0iJGFjX2hlbHAKKy0gIC0tZW5hYmxlLXN0cmljdCAgICAgICAgIGNvbXBpbGUgd2l0aCBzdHJpY3QgY29tcGlsZXIgb3B0aW9ucyBbZGVmYXVsdD1ub10iCistYWNfaGVscD0iJGFjX2hlbHAKKy0gIC0tZW5hYmxlLTY0Yml0LWxpYnMgICAgIGJ1aWxkIDY0LWJpdCBsaWJyYXJpZXMgW2RlZmF1bHQ9eWVzXSIKKy1hY19oZWxwPSIkYWNfaGVscAorLSAgLS1lbmFibGUtc2hhcmVkICAgICAgICAgYnVpbGQgc2hhcmVkIGxpYnJhcmllcyBbZGVmYXVsdD15ZXNdIgorLWFjX2hlbHA9IiRhY19oZWxwCistICAtLWVuYWJsZS1zdGF0aWMgICAgICAgICBidWlsZCBzdGF0aWMgbGlicmFyaWVzIFtkZWZhdWx0PW5vXSIKKy1hY19oZWxwPSIkYWNfaGVscAorLSAgLS1lbmFibGUtZGVidWcgICAgICAgICAgYnVpbGQgZGVidWcgbGlicmFyaWVzIFtkZWZhdWx0PW5vXSIKKy1hY19oZWxwPSIkYWNfaGVscAorLSAgLS1lbmFibGUtcmVsZWFzZSAgICAgICAgYnVpbGQgcmVsZWFzZSBsaWJyYXJpZXMgW2RlZmF1bHQ9eWVzXSIKKy1hY19oZWxwPSIkYWNfaGVscAorLSAgLS1lbmFibGUtcmVuYW1pbmcgICAgICAgYWRkIGEgdmVyc2lvbiBzdWZmaXggdG8gc3ltYm9scyBbZGVmYXVsdD15ZXNdIgorLWFjX2hlbHA9IiRhY19oZWxwCistICAtLWVuYWJsZS10cmFjaW5nICAgICAgICBlbmFibGUgZnVuY3Rpb24gYW5kIGRhdGEgdHJhY2luZyBbZGVmYXVsdD15ZXNdIgorLWFjX2hlbHA9IiRhY19oZWxwCistICAtLWVuYWJsZS1ycGF0aCAgICAgICAgICB1c2UgcnBhdGggd2hlbiBsaW5raW5nIFtkZWZhdWx0IGlzIG9ubHkgaWYgbmVjZXNzYXJ5XSIKKy1hY19oZWxwPSIkYWNfaGVscAorLSAgLS1lbmFibGUtdGhyZWFkcyAgICAgICAgYnVpbGQgSUNVIHdpdGggdGhyZWFkIHNhZmV0eSBbZGVmYXVsdD15ZXNdIgorLWFjX2hlbHA9IiRhY19oZWxwCistICAtLXdpdGgtaW9zdHJlYW09dmVyc2lvbiBzcGVjaWZ5IHRoZSB2ZXJzaW9uIG9mIGlvc3RyZWFtIHRvIHVzZSAobm9uZSwgb2xkLCBzdGQsIGF1dG8pIFtkZWZhdWx0PWF1dG9dIgorLWFjX2hlbHA9IiRhY19oZWxwCistICAtLWVuYWJsZS1leHRyYXMgICAgICAgICBidWlsZCBJQ1UgZXh0cmFzIFtkZWZhdWx0PXllc10iCistYWNfaGVscD0iJGFjX2hlbHAKKy0gIC0tZW5hYmxlLWljdWlvICAgICAgICAgIGJ1aWxkIElDVSdzIGljdWlvIGxpYnJhcnkgW2RlZmF1bHQ9eWVzXSIKKy1hY19oZWxwPSIkYWNfaGVscAorLSAgLS1lbmFibGUtbGF5b3V0ICAgICAgICAgYnVpbGQgSUNVJ3MgbGF5b3V0IGxpYnJhcnkgW2RlZmF1bHQ9eWVzXSIKKy1hY19oZWxwPSIkYWNfaGVscAorLSAgLS13aXRoLWRhdGEtcGFja2FnaW5nPXR5cGUgc3BlY2lmeSBob3cgdG8gcGFja2FnZSBJQ1UgZGF0YSAoZmlsZXMsIGFyY2hpdmUsIGxpYnJhcnksIGF1dG8pIFtkZWZhdWx0PWF1dG9dIgorLWFjX2hlbHA9IiRhY19oZWxwCistIgorLWFjX2hlbHA9IiRhY19oZWxwCistICAtLXdpdGgtbGlicmFyeS1zdWZmaXg9c3VmZml4ICAgIHRhZyBhIHN1ZmZpeCB0byB0aGUgbGlicmFyeSBuYW1lcyBbZGVmYXVsdD1dIgorLWFjX2hlbHA9IiRhY19oZWxwCistICAtLWVuYWJsZS10ZXN0cyAgICAgICAgICBidWlsZCBJQ1UgdGVzdHMgW2RlZmF1bHQ9eWVzXSIKKy1hY19oZWxwPSIkYWNfaGVscAorLSAgLS1lbmFibGUtc2FtcGxlcyAgICAgICAgYnVpbGQgSUNVIHNhbXBsZXMgW2RlZmF1bHQ9eWVzXSAgCistQWRkaXRpb25hbGx5LCB0aGUgdmFyaWFibGUgRk9SQ0VfTElCUyBtYXkgYmUgc2V0IGJlZm9yZSBjYWxsaW5nIGNvbmZpZ3VyZS4gSWYgc2V0LCBpdCB3aWxsIFJFUExBQ0UgYW55IGF1dG9tYXRpYyBsaXN0IG9mIGxpYnJhcmllcy4iCisrYWNfY2xlYW5fZmlsZXM9CisrYWNfY29uZmlnX2xpYm9ial9kaXI9LgorK0xJQk9CSlM9CisrY3Jvc3NfY29tcGlsaW5nPW5vCisrc3ViZGlycz0KKytNRkxBR1M9CisrTUFLRUZMQUdTPQorK1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9CisrCisrIyBJZGVudGl0eSBvZiB0aGlzIHBhY2thZ2UuCisrUEFDS0FHRV9OQU1FPQorK1BBQ0tBR0VfVEFSTkFNRT0KKytQQUNLQUdFX1ZFUlNJT049CisrUEFDS0FHRV9TVFJJTkc9CisrUEFDS0FHRV9CVUdSRVBPUlQ9CisrCisrYWNfdW5pcXVlX2ZpbGU9ImNvbW1vbi91bmljb2RlL3V0eXBlcy5oIgorKyMgRmFjdG9yaW5nIGRlZmF1bHQgaGVhZGVycyBmb3IgbW9zdCB0ZXN0cy4KKythY19pbmNsdWRlc19kZWZhdWx0PSJcCisrI2luY2x1ZGUgPHN0ZGlvLmg+CisrI2lmZGVmIEhBVkVfU1lTX1RZUEVTX0gKKysjIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorKyNlbmRpZgorKyNpZmRlZiBIQVZFX1NZU19TVEFUX0gKKysjIGluY2x1ZGUgPHN5cy9zdGF0Lmg+CisrI2VuZGlmCisrI2lmZGVmIFNURENfSEVBREVSUworKyMgaW5jbHVkZSA8c3RkbGliLmg+CisrIyBpbmNsdWRlIDxzdGRkZWYuaD4KKysjZWxzZQorKyMgaWZkZWYgSEFWRV9TVERMSUJfSAorKyMgIGluY2x1ZGUgPHN0ZGxpYi5oPgorKyMgZW5kaWYKKysjZW5kaWYKKysjaWZkZWYgSEFWRV9TVFJJTkdfSAorKyMgaWYgIWRlZmluZWQgU1REQ19IRUFERVJTICYmIGRlZmluZWQgSEFWRV9NRU1PUllfSAorKyMgIGluY2x1ZGUgPG1lbW9yeS5oPgorKyMgZW5kaWYKKysjIGluY2x1ZGUgPHN0cmluZy5oPgorKyNlbmRpZgorKyNpZmRlZiBIQVZFX1NUUklOR1NfSAorKyMgaW5jbHVkZSA8c3RyaW5ncy5oPgorKyNlbmRpZgorKyNpZmRlZiBIQVZFX0lOVFRZUEVTX0gKKysjIGluY2x1ZGUgPGludHR5cGVzLmg+CisrI2VuZGlmCisrI2lmZGVmIEhBVkVfU1RESU5UX0gKKysjIGluY2x1ZGUgPHN0ZGludC5oPgorKyNlbmRpZgorKyNpZmRlZiBIQVZFX1VOSVNURF9ICisrIyBpbmNsdWRlIDx1bmlzdGQuaD4KKysjZW5kaWYiCisrCisrYWNfc3Vic3RfdmFycz0nTFRMSUJPQkpTCisrTElCT0JKUworK0FJWF9TSExJQgorK2xkX3JwYXRoX3N1ZgorK3BsYXRmb3JtX21ha2VfZnJhZ21lbnQKKytwbGF0Zm9ybV9tYWtlX2ZyYWdtZW50X25hbWUKKytwbGF0Zm9ybQorK0lDVURBVEFfQ0hBUgorK1NBTVBMRVNfVFJVRQorK1RFU1RTX1RSVUUKKytJQ1VMSUJTVUZGSVhDTkFNRQorK1VfSEFWRV9MSUJfU1VGRklYCisrSUNVTElCU1VGRklYCisrREFUQV9QQUNLQUdJTkdfTU9ERQorK0RBVEFfUEFDS0FHSU5HX0NQUEZMQUdTCisrdGhlcGtnaWN1ZGF0YWRpcgorK3BrZ2ljdWRhdGFkaXIKKyt0aGVsaWJkaXIKKyt0aGVkYXRhZGlyCisrdGhlc3lzY29uZmRpcgorK0xBWU9VVF9UUlVFCisrSUNVSU9fVFJVRQorK0VYVFJBU19UUlVFCisrVV9TSVpFT0ZfV0NIQVJfVAorK1VfSEFWRV9XQ1NDUFkKKytVX0hBVkVfV0NIQVJfSAorK0hBVkVfVUlOVDY0X1QKKytIQVZFX0lOVDY0X1QKKytIQVZFX1VJTlQzMl9UCisrSEFWRV9JTlQzMl9UCisrSEFWRV9VSU5UMTZfVAorK0hBVkVfSU5UMTZfVAorK0hBVkVfVUlOVDhfVAorK0hBVkVfSU5UOF9UCisrVV9USU1FWk9ORQorK1VfSEFWRV9USU1FWk9ORQorK1VfVFpOQU1FCisrVV9UWlNFVAorK1VfSEFWRV9QT1BFTgorK1VfSEFWRV9QTEFDRU1FTlRfTkVXCisrVV9PVkVSUklERV9DWFhfQUxMT0NBVElPTgorK1VfSEFWRV9OQU1FU1BBQ0UKKytVX05MX0xBTkdJTkZPX0NPREVTRVQKKytVX0hBVkVfTkxfTEFOR0lORk9fQ09ERVNFVAorK1VfSEFWRV9OTF9MQU5HSU5GTworK1VfSVNfQklHX0VORElBTgorK1VfSU9TVFJFQU1fU09VUkNFCisrQ1hYQ1BQCisrVV9IQVZFX0lOVFRZUEVTX0gKKytFR1JFUAorK0dSRVAKKytDUFAKKytHRU5DQ09ERV9BU1NFTUJMWQorK0hBVkVfTU1BUAorK0lDVV9VU0VfVEhSRUFEUworK1RIUkVBRFNfVFJVRQorK1VfSU5MSU5FCisrRU5BQkxFX1JQQVRICisrVV9FTkFCTEVfVFJBQ0lORworK1VfRElTQUJMRV9SRU5BTUlORworK0FSCisrUkFOTElCCisrRU5BQkxFX1JFTEVBU0UKKytFTkFCTEVfREVCVUcKKytFTkFCTEVfU1RBVElDCisrRU5BQkxFX1NIQVJFRAorK0xJQl9NCisrQ09NUElMRV9MSU5LX0VOVlZBUgorK0FSRkxBR1MKKytob3N0X29zCisraG9zdF92ZW5kb3IKKytob3N0X2NwdQorK2hvc3QKKytidWlsZF9vcworK2J1aWxkX3ZlbmRvcgorK2J1aWxkX2NwdQorK2J1aWxkCisrRE9YWUdFTgorK1VfTUFLRQorK1NUUklQCisrSU5TVEFMTF9EQVRBCisrSU5TVEFMTF9TQ1JJUFQKKytJTlNUQUxMX1BST0dSQU0KKythY19jdF9DWFgKKytDWFhGTEFHUworK0NYWAorK09CSkVYVAorK0VYRUVYVAorK2FjX2N0X0NDCisrTERGTEFHUworK0NGTEFHUworK0NDCisrQ1BQRkxBR1MKKytVTklDT0RFX1ZFUlNJT04KKytMSUJfVkVSU0lPTl9NQUpPUgorK0xJQl9WRVJTSU9OCisrVkVSU0lPTgorK1BBQ0tBR0UKKyt0YXJnZXRfYWxpYXMKKytob3N0X2FsaWFzCisrYnVpbGRfYWxpYXMKKytMSUJTCisrRUNIT19UCisrRUNIT19OCisrRUNIT19DCisrREVGUworK21hbmRpcgorK2xvY2FsZWRpcgorK2xpYmRpcgorK3BzZGlyCisrcGRmZGlyCisrZHZpZGlyCisraHRtbGRpcgorK2luZm9kaXIKKytkb2NkaXIKKytvbGRpbmNsdWRlZGlyCisraW5jbHVkZWRpcgorK2xvY2Fsc3RhdGVkaXIKKytzaGFyZWRzdGF0ZWRpcgorK3N5c2NvbmZkaXIKKytkYXRhZGlyCisrZGF0YXJvb3RkaXIKKytsaWJleGVjZGlyCisrc2JpbmRpcgorK2JpbmRpcgorK3Byb2dyYW1fdHJhbnNmb3JtX25hbWUKKytwcmVmaXgKKytleGVjX3ByZWZpeAorK1BBQ0tBR0VfQlVHUkVQT1JUCisrUEFDS0FHRV9TVFJJTkcKKytQQUNLQUdFX1ZFUlNJT04KKytQQUNLQUdFX1RBUk5BTUUKKytQQUNLQUdFX05BTUUKKytQQVRIX1NFUEFSQVRPUgorK1NIRUxMJworK2FjX3N1YnN0X2ZpbGVzPScnCisrYWNfdXNlcl9vcHRzPScKKytlbmFibGVfb3B0aW9uX2NoZWNraW5nCisrZW5hYmxlX3N0cmljdAorK2VuYWJsZV82NGJpdF9saWJzCisrZW5hYmxlX3NoYXJlZAorK2VuYWJsZV9zdGF0aWMKKytlbmFibGVfZGVidWcKKytlbmFibGVfcmVsZWFzZQorK2VuYWJsZV9yZW5hbWluZworK2VuYWJsZV90cmFjaW5nCisrZW5hYmxlX3JwYXRoCisrZW5hYmxlX3RocmVhZHMKKyt3aXRoX2lvc3RyZWFtCisrZW5hYmxlX2V4dHJhcworK2VuYWJsZV9sYXlvdXQKKyt3aXRoX2RhdGFfcGFja2FnaW5nCisrZW5hYmxlX21hcHBlZAorK3dpdGhfbGlicmFyeV9zdWZmaXgKKytlbmFibGVfdGVzdHMKKytlbmFibGVfc2FtcGxlcworKycKKysgICAgICBhY19wcmVjaW91c192YXJzPSdidWlsZF9hbGlhcworK2hvc3RfYWxpYXMKKyt0YXJnZXRfYWxpYXMKKytDQworK0NGTEFHUworK0xERkxBR1MKKytMSUJTCisrQ1BQRkxBR1MKKytDWFgKKytDWFhGTEFHUworK0NDQworK0NQUAorK0NYWENQUCcKKysKKyAKKyAjIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCisrYWNfaW5pdF9oZWxwPQorK2FjX2luaXRfdmVyc2lvbj1mYWxzZQorK2FjX3VucmVjb2duaXplZF9vcHRzPQorK2FjX3VucmVjb2duaXplZF9zZXA9CisgIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKKyAjIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCistYnVpbGQ9Tk9ORQorLWNhY2hlX2ZpbGU9Li9jb25maWcuY2FjaGUKKytjYWNoZV9maWxlPS9kZXYvbnVsbAorIGV4ZWNfcHJlZml4PU5PTkUKKy1ob3N0PU5PTkUKKyBub19jcmVhdGU9Cistbm9ub3B0PU5PTkUKKyBub19yZWN1cnNpb249CisgcHJlZml4PU5PTkUKKyBwcm9ncmFtX3ByZWZpeD1OT05FCitAQCAtNjgsOTQgKzgyNSwxMzMgQEAKKyBzaWxlbnQ9Cisgc2l0ZT0KKyBzcmNkaXI9CistdGFyZ2V0PU5PTkUKKyB2ZXJib3NlPQorIHhfaW5jbHVkZXM9Tk9ORQorIHhfbGlicmFyaWVzPU5PTkUKKysKKysjIEluc3RhbGxhdGlvbiBkaXJlY3Rvcnkgb3B0aW9ucy4KKysjIFRoZXNlIGFyZSBsZWZ0IHVuZXhwYW5kZWQgc28gdXNlcnMgY2FuICJtYWtlIGluc3RhbGwgZXhlY19wcmVmaXg9L2ZvbyIKKysjIGFuZCBhbGwgdGhlIHZhcmlhYmxlcyB0aGF0IGFyZSBzdXBwb3NlZCB0byBiZSBiYXNlZCBvbiBleGVjX3ByZWZpeAorKyMgYnkgZGVmYXVsdCB3aWxsIGFjdHVhbGx5IGNoYW5nZS4KKysjIFVzZSBicmFjZXMgaW5zdGVhZCBvZiBwYXJlbnMgYmVjYXVzZSBzaCwgcGVybCwgZXRjLiBhbHNvIGFjY2VwdCB0aGVtLgorKyMgKFRoZSBsaXN0IGZvbGxvd3MgdGhlIHNhbWUgb3JkZXIgYXMgdGhlIEdOVSBDb2RpbmcgU3RhbmRhcmRzLikKKyBiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKKyBzYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJworIGxpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCistZGF0YWRpcj0nJHtwcmVmaXh9L3NoYXJlJworK2RhdGFyb290ZGlyPScke3ByZWZpeH0vc2hhcmUnCisrZGF0YWRpcj0nJHtkYXRhcm9vdGRpcn0nCisgc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKKyBzaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKKyBsb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJworLWxpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJworIGluY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJworIG9sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKKy1pbmZvZGlyPScke3ByZWZpeH0vaW5mbycKKy1tYW5kaXI9JyR7cHJlZml4fS9tYW4nCistCistIyBJbml0aWFsaXplIHNvbWUgb3RoZXIgdmFyaWFibGVzLgorLXN1YmRpcnM9CistTUZMQUdTPSBNQUtFRkxBR1M9CistU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KKy0jIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNoZWxsIGhlcmUgZG9jdW1lbnQuCistYWNfbWF4X2hlcmVfbGluZXM9MTIKKytkb2NkaXI9JyR7ZGF0YXJvb3RkaXJ9L2RvYy8ke1BBQ0tBR0V9JworK2luZm9kaXI9JyR7ZGF0YXJvb3RkaXJ9L2luZm8nCisraHRtbGRpcj0nJHtkb2NkaXJ9JworK2R2aWRpcj0nJHtkb2NkaXJ9JworK3BkZmRpcj0nJHtkb2NkaXJ9JworK3BzZGlyPScke2RvY2Rpcn0nCisrbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCisrbG9jYWxlZGlyPScke2RhdGFyb290ZGlyfS9sb2NhbGUnCisrbWFuZGlyPScke2RhdGFyb290ZGlyfS9tYW4nCisgCisgYWNfcHJldj0KKythY19kYXNoZGFzaD0KKyBmb3IgYWNfb3B0aW9uCisgZG8KKy0KKyAgICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgorICAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCistICAgIGV2YWwgIiRhY19wcmV2PVwkYWNfb3B0aW9uIgorKyAgICBldmFsICRhY19wcmV2PVwkYWNfb3B0aW9uCisgICAgIGFjX3ByZXY9CisgICAgIGNvbnRpbnVlCisgICBmaQorIAorLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKy0gIC0qPSopIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGlvbiIgfCBzZWQgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OworLSAgKikgYWNfb3B0YXJnPSA7OworKyAgY2FzZSAkYWNfb3B0aW9uIGluCisrICAqPSopCWFjX29wdGFyZz1gZXhwciAiWCRhY19vcHRpb24iIDogJ1tePV0qPVwoLipcKSdgIDs7CisrICAqKQlhY19vcHRhcmc9eWVzIDs7CisgICBlc2FjCisgCisgICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgorIAorLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KKysgIGNhc2UgJGFjX2Rhc2hkYXNoJGFjX29wdGlvbiBpbgorKyAgLS0pCisrICAgIGFjX2Rhc2hkYXNoPXllcyA7OworIAorICAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKKyAgICAgYWNfcHJldj1iaW5kaXIgOzsKKyAgIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCistICAgIGJpbmRpcj0iJGFjX29wdGFyZyIgOzsKKysgICAgYmluZGlyPSRhY19vcHRhcmcgOzsKKyAKKyAgIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCistICAgIGFjX3ByZXY9YnVpbGQgOzsKKysgICAgYWNfcHJldj1idWlsZF9hbGlhcyA7OworICAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCistICAgIGJ1aWxkPSIkYWNfb3B0YXJnIiA7OworKyAgICBidWlsZF9hbGlhcz0kYWNfb3B0YXJnIDs7CisgCisgICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCisgICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKKyAgICAgYWNfcHJldj1jYWNoZV9maWxlIDs7CisgICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKKyAgIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCistICAgIGNhY2hlX2ZpbGU9IiRhY19vcHRhcmciIDs7CisrICAgIGNhY2hlX2ZpbGU9JGFjX29wdGFyZyA7OworIAorLSAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQgfCAtLWRhdGEgfCAtLWRhdCB8IC0tZGEpCisrICAtLWNvbmZpZy1jYWNoZSB8IC1DKQorKyAgICBjYWNoZV9maWxlPWNvbmZpZy5jYWNoZSA7OworKworKyAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQpCisgICAgIGFjX3ByZXY9ZGF0YWRpciA7OworLSAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCistICB8IC0tZGE9KikKKy0gICAgZGF0YWRpcj0iJGFjX29wdGFyZyIgOzsKKysgIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSopCisrICAgIGRhdGFkaXI9JGFjX29wdGFyZyA7OworKworKyAgLWRhdGFyb290ZGlyIHwgLS1kYXRhcm9vdGRpciB8IC0tZGF0YXJvb3RkaSB8IC0tZGF0YXJvb3RkIHwgLS1kYXRhcm9vdCBcCisrICB8IC0tZGF0YXJvbyB8IC0tZGF0YXJvIHwgLS1kYXRhcikKKysgICAgYWNfcHJldj1kYXRhcm9vdGRpciA7OworKyAgLWRhdGFyb290ZGlyPSogfCAtLWRhdGFyb290ZGlyPSogfCAtLWRhdGFyb290ZGk9KiB8IC0tZGF0YXJvb3RkPSogXAorKyAgfCAtLWRhdGFyb290PSogfCAtLWRhdGFyb289KiB8IC0tZGF0YXJvPSogfCAtLWRhdGFyPSopCisrICAgIGRhdGFyb290ZGlyPSRhY19vcHRhcmcgOzsKKyAKKyAgIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKKy0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmRpc2FibGUtLy8nYAorKyAgICBhY191c2Vyb3B0PWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qZGlzYWJsZS1cKC4qXCknYAorICAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCistICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgorLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KKy0gICAgZmkKKy0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKKy0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09bm8iIDs7CisrICAgIGV4cHIgIngkYWNfdXNlcm9wdCIgOiAiLipbXi0rLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCisrICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCBmZWF0dXJlIG5hbWU6ICRhY191c2Vyb3B0IiA+JjIKKysgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKysgICAgYWNfdXNlcm9wdF9vcmlnPSRhY191c2Vyb3B0CisrICAgIGFjX3VzZXJvcHQ9YCRhc19lY2hvICIkYWNfdXNlcm9wdCIgfCBzZWQgJ3MvWy0rLl0vXy9nJ2AKKysgICAgY2FzZSAkYWNfdXNlcl9vcHRzIGluCisrICAgICAgKiIKKysiZW5hYmxlXyRhY191c2Vyb3B0IgorKyIqKSA7OworKyAgICAgICopIGFjX3VucmVjb2duaXplZF9vcHRzPSIkYWNfdW5yZWNvZ25pemVkX29wdHMkYWNfdW5yZWNvZ25pemVkX3NlcC0tZGlzYWJsZS0kYWNfdXNlcm9wdF9vcmlnIgorKwkgYWNfdW5yZWNvZ25pemVkX3NlcD0nLCAnOzsKKysgICAgZXNhYworKyAgICBldmFsIGVuYWJsZV8kYWNfdXNlcm9wdD1ubyA7OworKworKyAgLWRvY2RpciB8IC0tZG9jZGlyIHwgLS1kb2NkaSB8IC0tZG9jIHwgLS1kbykKKysgICAgYWNfcHJldj1kb2NkaXIgOzsKKysgIC1kb2NkaXI9KiB8IC0tZG9jZGlyPSogfCAtLWRvY2RpPSogfCAtLWRvYz0qIHwgLS1kbz0qKQorKyAgICBkb2NkaXI9JGFjX29wdGFyZyA7OworKworKyAgLWR2aWRpciB8IC0tZHZpZGlyIHwgLS1kdmlkaSB8IC0tZHZpZCB8IC0tZHZpIHwgLS1kdikKKysgICAgYWNfcHJldj1kdmlkaXIgOzsKKysgIC1kdmlkaXI9KiB8IC0tZHZpZGlyPSogfCAtLWR2aWRpPSogfCAtLWR2aWQ9KiB8IC0tZHZpPSogfCAtLWR2PSopCisrICAgIGR2aWRpcj0kYWNfb3B0YXJnIDs7CisgCisgICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQorLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZW5hYmxlLS8vJyAtZSAncy89LiovLydgCisrICAgIGFjX3VzZXJvcHQ9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSplbmFibGUtXChbXj1dKlwpJ2AKKyAgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KKy0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CistICAgIGZpCistICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCistICAgIGNhc2UgIiRhY19vcHRpb24iIGluCistICAgICAgKj0qKSA7OworLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKKysgICAgZXhwciAieCRhY191c2Vyb3B0IiA6ICIuKlteLSsuXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKysgICAgICB7ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIGZlYXR1cmUgbmFtZTogJGFjX3VzZXJvcHQiID4mMgorKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorKyAgICBhY191c2Vyb3B0X29yaWc9JGFjX3VzZXJvcHQKKysgICAgYWNfdXNlcm9wdD1gJGFzX2VjaG8gIiRhY191c2Vyb3B0IiB8IHNlZCAncy9bLSsuXS9fL2cnYAorKyAgICBjYXNlICRhY191c2VyX29wdHMgaW4KKysgICAgICAqIgorKyJlbmFibGVfJGFjX3VzZXJvcHQiCisrIiopIDs7CisrICAgICAgKikgYWNfdW5yZWNvZ25pemVkX29wdHM9IiRhY191bnJlY29nbml6ZWRfb3B0cyRhY191bnJlY29nbml6ZWRfc2VwLS1lbmFibGUtJGFjX3VzZXJvcHRfb3JpZyIKKysJIGFjX3VucmVjb2duaXplZF9zZXA9JywgJzs7CisgICAgIGVzYWMKKy0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09JyRhY19vcHRhcmcnIiA7OworKyAgICBldmFsIGVuYWJsZV8kYWNfdXNlcm9wdD1cJGFjX29wdGFyZyA7OworIAorICAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAorICAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAorQEAgLTE2NCwxMTYgKzk2MCw3NyBAQAorICAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCisgICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAorICAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCistICAgIGV4ZWNfcHJlZml4PSIkYWNfb3B0YXJnIiA7OworKyAgICBleGVjX3ByZWZpeD0kYWNfb3B0YXJnIDs7CisgCisgICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQorICAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KKyAgICAgd2l0aF9nYXM9eWVzIDs7CisgCistICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSkKKy0gICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCistICAgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KKy0gICAgY2F0IDw8IEVPRgorLVVzYWdlOiBjb25maWd1cmUgW29wdGlvbnNdIFtob3N0XQorLU9wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0cyBhZnRlciBkZXNjcmlwdGlvbnNdCistQ29uZmlndXJhdGlvbjoKKy0gIC0tY2FjaGUtZmlsZT1GSUxFICAgICAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFCistICAtLWhlbHAgICAgICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UKKy0gIC0tbm8tY3JlYXRlICAgICAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCistICAtLXF1aWV0LCAtLXNpbGVudCAgICAgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKKy0gIC0tdmVyc2lvbiAgICAgICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIG9mIGF1dG9jb25mIHRoYXQgY3JlYXRlZCBjb25maWd1cmUKKy1EaXJlY3RvcnkgYW5kIGZpbGUgbmFtZXM6CistICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKKy0gICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCistICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAorLSAgICAgICAgICAgICAgICAgICAgICAgICAgW3NhbWUgYXMgcHJlZml4XQorLSAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvYmluXQorLSAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9zYmluXQorLSAgLS1saWJleGVjZGlyPURJUiAgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvbGliZXhlY10KKy0gIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKKy0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvc2hhcmVdCistICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC9ldGNdCistICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgorLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9jb21dCistICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvdmFyXQorLSAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIGluIERJUiBbRVBSRUZJWC9saWJdCistICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBpbiBESVIgW1BSRUZJWC9pbmNsdWRlXQorLSAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgaW4gRElSIFsvdXNyL2luY2x1ZGVdCistICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvaW5mb10KKy0gIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL21hbl0KKy0gIC0tc3JjZGlyPURJUiAgICAgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIC4uXQorLSAgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVggcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKKy0gIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYIGFwcGVuZCBTVUZGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKKy0gIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNCistICAgICAgICAgICAgICAgICAgICAgICAgICBydW4gc2VkIFBST0dSQU0gb24gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKKy1FT0YKKy0gICAgY2F0IDw8IEVPRgorLUhvc3QgdHlwZToKKy0gIC0tYnVpbGQ9QlVJTEQgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW0JVSUxEPUhPU1RdCistICAtLWhvc3Q9SE9TVCAgICAgICAgICAgICBjb25maWd1cmUgZm9yIEhPU1QgW2d1ZXNzZWRdCistICAtLXRhcmdldD1UQVJHRVQgICAgICAgICBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdCistRmVhdHVyZXMgYW5kIHBhY2thZ2VzOgorLSAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQorLSAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQorLSAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCistICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCistICAtLXgtaW5jbHVkZXM9RElSICAgICAgICBYIGluY2x1ZGUgZmlsZXMgYXJlIGluIERJUgorLSAgLS14LWxpYnJhcmllcz1ESVIgICAgICAgWCBsaWJyYXJ5IGZpbGVzIGFyZSBpbiBESVIKKy1FT0YKKy0gICAgaWYgdGVzdCAtbiAiJGFjX2hlbHAiOyB0aGVuCistICAgICAgZWNobyAiLS1lbmFibGUgYW5kIC0td2l0aCBvcHRpb25zIHJlY29nbml6ZWQ6JGFjX2hlbHAiCistICAgIGZpCistICAgIGV4aXQgMCA7OworKyAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtaCkKKysgICAgYWNfaW5pdF9oZWxwPWxvbmcgOzsKKysgIC1oZWxwPXIqIHwgLS1oZWxwPXIqIHwgLS1oZWw9ciogfCAtLWhlPXIqIHwgLWhyKikKKysgICAgYWNfaW5pdF9oZWxwPXJlY3Vyc2l2ZSA7OworKyAgLWhlbHA9cyogfCAtLWhlbHA9cyogfCAtLWhlbD1zKiB8IC0taGU9cyogfCAtaHMqKQorKyAgICBhY19pbml0X2hlbHA9c2hvcnQgOzsKKyAKKyAgIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQorLSAgICBhY19wcmV2PWhvc3QgOzsKKysgICAgYWNfcHJldj1ob3N0X2FsaWFzIDs7CisgICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQorLSAgICBob3N0PSIkYWNfb3B0YXJnIiA7OworKyAgICBob3N0X2FsaWFzPSRhY19vcHRhcmcgOzsKKysKKysgIC1odG1sZGlyIHwgLS1odG1sZGlyIHwgLS1odG1sZGkgfCAtLWh0bWxkIHwgLS1odG1sIHwgLS1odG0gfCAtLWh0KQorKyAgICBhY19wcmV2PWh0bWxkaXIgOzsKKysgIC1odG1sZGlyPSogfCAtLWh0bWxkaXI9KiB8IC0taHRtbGRpPSogfCAtLWh0bWxkPSogfCAtLWh0bWw9KiB8IC0taHRtPSogXAorKyAgfCAtLWh0PSopCisrICAgIGh0bWxkaXI9JGFjX29wdGFyZyA7OworIAorICAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAorICAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKKyAgICAgYWNfcHJldj1pbmNsdWRlZGlyIDs7CisgICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAorICAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQorLSAgICBpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OworKyAgICBpbmNsdWRlZGlyPSRhY19vcHRhcmcgOzsKKyAKKyAgIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCisgICAgIGFjX3ByZXY9aW5mb2RpciA7OworICAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKKy0gICAgaW5mb2Rpcj0iJGFjX29wdGFyZyIgOzsKKysgICAgaW5mb2Rpcj0kYWNfb3B0YXJnIDs7CisgCisgICAtbGliZGlyIHwgLS1saWJkaXIgfCAtLWxpYmRpIHwgLS1saWJkKQorICAgICBhY19wcmV2PWxpYmRpciA7OworICAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQorLSAgICBsaWJkaXI9IiRhY19vcHRhcmciIDs7CisrICAgIGxpYmRpcj0kYWNfb3B0YXJnIDs7CisgCisgICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCisgICB8IC0tbGliZXhlIHwgLS1saWJleCB8IC0tbGliZSkKKyAgICAgYWNfcHJldj1saWJleGVjZGlyIDs7CisgICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAorICAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCistICAgIGxpYmV4ZWNkaXI9IiRhY19vcHRhcmciIDs7CisrICAgIGxpYmV4ZWNkaXI9JGFjX29wdGFyZyA7OworKworKyAgLWxvY2FsZWRpciB8IC0tbG9jYWxlZGlyIHwgLS1sb2NhbGVkaSB8IC0tbG9jYWxlZCB8IC0tbG9jYWxlKQorKyAgICBhY19wcmV2PWxvY2FsZWRpciA7OworKyAgLWxvY2FsZWRpcj0qIHwgLS1sb2NhbGVkaXI9KiB8IC0tbG9jYWxlZGk9KiB8IC0tbG9jYWxlZD0qIHwgLS1sb2NhbGU9KikKKysgICAgbG9jYWxlZGlyPSRhY19vcHRhcmcgOzsKKyAKKyAgIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKKy0gIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IFwKKy0gIHwgLS1sb2NhbHMgfCAtLWxvY2FsIHwgLS1sb2NhIHwgLS1sb2MgfCAtLWxvKQorKyAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgfCAtLWxvY2FscykKKyAgICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7CisgICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKKy0gIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogXAorLSAgfCAtLWxvY2Fscz0qIHwgLS1sb2NhbD0qIHwgLS1sb2NhPSogfCAtLWxvYz0qIHwgLS1sbz0qKQorLSAgICBsb2NhbHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OworKyAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiB8IC0tbG9jYWxzPSopCisrICAgIGxvY2Fsc3RhdGVkaXI9JGFjX29wdGFyZyA7OworIAorICAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKKyAgICAgYWNfcHJldj1tYW5kaXIgOzsKKyAgIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKKy0gICAgbWFuZGlyPSIkYWNfb3B0YXJnIiA7OworKyAgICBtYW5kaXI9JGFjX29wdGFyZyA7OworIAorICAgLW5mcCB8IC0tbmZwIHwgLS1uZikKKyAgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aG91dC1mcC4KKyAgICAgd2l0aF9mcD1ubyA7OworIAorICAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKKy0gIHwgLS1uby1jciB8IC0tbm8tYykKKysgIHwgLS1uby1jciB8IC0tbm8tYyB8IC1uKQorICAgICBub19jcmVhdGU9eWVzIDs7CisgCisgICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKK0BAIC0yODcsMjYgKzEwNDQsMjYgQEAKKyAgIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAorICAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAorICAgfCAtLW9sZGluPSogfCAtLW9sZGk9KiB8IC0tb2xkPSogfCAtLW9sPSogfCAtLW89KikKKy0gICAgb2xkaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKKysgICAgb2xkaW5jbHVkZWRpcj0kYWNfb3B0YXJnIDs7CisgCisgICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQorICAgICBhY19wcmV2PXByZWZpeCA7OworICAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQorLSAgICBwcmVmaXg9IiRhY19vcHRhcmciIDs7CisrICAgIHByZWZpeD0kYWNfb3B0YXJnIDs7CisgCisgICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAorICAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCisgICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKKyAgIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAorICAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQorLSAgICBwcm9ncmFtX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKKysgICAgcHJvZ3JhbV9wcmVmaXg9JGFjX29wdGFyZyA7OworIAorICAgLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaSB8IC0tcHJvZ3JhbS1zdWZmIFwKKyAgIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQorICAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7CisgICAtcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaT0qIFwKKyAgIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKKy0gICAgcHJvZ3JhbV9zdWZmaXg9IiRhY19vcHRhcmciIDs7CisrICAgIHByb2dyYW1fc3VmZml4PSRhY19vcHRhcmcgOzsKKyAKKyAgIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIFwKKyAgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKK0BAIC0zMjMsNyArMTA4MCwxNyBAQAorICAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKKyAgIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKKyAgIHwgLS1wcm9nci10cmE9KiB8IC0tcHJvZ3JhbS10cj0qIHwgLS1wcm9ncmFtLXQ9KikKKy0gICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iJGFjX29wdGFyZyIgOzsKKysgICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0kYWNfb3B0YXJnIDs7CisrCisrICAtcGRmZGlyIHwgLS1wZGZkaXIgfCAtLXBkZmRpIHwgLS1wZGZkIHwgLS1wZGYgfCAtLXBkKQorKyAgICBhY19wcmV2PXBkZmRpciA7OworKyAgLXBkZmRpcj0qIHwgLS1wZGZkaXI9KiB8IC0tcGRmZGk9KiB8IC0tcGRmZD0qIHwgLS1wZGY9KiB8IC0tcGQ9KikKKysgICAgcGRmZGlyPSRhY19vcHRhcmcgOzsKKysKKysgIC1wc2RpciB8IC0tcHNkaXIgfCAtLXBzZGkgfCAtLXBzZCB8IC0tcHMpCisrICAgIGFjX3ByZXY9cHNkaXIgOzsKKysgIC1wc2Rpcj0qIHwgLS1wc2Rpcj0qIHwgLS1wc2RpPSogfCAtLXBzZD0qIHwgLS1wcz0qKQorKyAgICBwc2Rpcj0kYWNfb3B0YXJnIDs7CisgCisgICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAorICAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCitAQCAtMzMzLDcgKzExMDAsNyBAQAorICAgICBhY19wcmV2PXNiaW5kaXIgOzsKKyAgIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCisgICB8IC0tc2JpPSogfCAtLXNiPSopCistICAgIHNiaW5kaXI9IiRhY19vcHRhcmciIDs7CisrICAgIHNiaW5kaXI9JGFjX29wdGFyZyA7OworIAorICAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCisgICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKK0BAIC0zNDQsNTggKzExMTEsNjkgQEAKKyAgIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCisgICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKKyAgIHwgLS1zaGE9KiB8IC0tc2g9KikKKy0gICAgc2hhcmVkc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7CisrICAgIHNoYXJlZHN0YXRlZGlyPSRhY19vcHRhcmcgOzsKKyAKKyAgIC1zaXRlIHwgLS1zaXRlIHwgLS1zaXQpCisgICAgIGFjX3ByZXY9c2l0ZSA7OworICAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKKy0gICAgc2l0ZT0iJGFjX29wdGFyZyIgOzsKKysgICAgc2l0ZT0kYWNfb3B0YXJnIDs7CisgCisgICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQorICAgICBhY19wcmV2PXNyY2RpciA7OworICAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKKy0gICAgc3JjZGlyPSIkYWNfb3B0YXJnIiA7OworKyAgICBzcmNkaXI9JGFjX29wdGFyZyA7OworIAorICAgLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaSB8IC0tc3lzY29uZmQgfCAtLXN5c2NvbmYgXAorICAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCisgICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OworICAgLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGk9KiB8IC0tc3lzY29uZmQ9KiB8IC0tc3lzY29uZj0qIFwKKyAgIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKKy0gICAgc3lzY29uZmRpcj0iJGFjX29wdGFyZyIgOzsKKysgICAgc3lzY29uZmRpcj0kYWNfb3B0YXJnIDs7CisgCisgICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQorLSAgICBhY19wcmV2PXRhcmdldCA7OworKyAgICBhY19wcmV2PXRhcmdldF9hbGlhcyA7OworICAgLXRhcmdldD0qIHwgLS10YXJnZXQ9KiB8IC0tdGFyZ2U9KiB8IC0tdGFyZz0qIHwgLS10YXI9KiB8IC0tdGE9KiB8IC0tdD0qKQorLSAgICB0YXJnZXQ9IiRhY19vcHRhcmciIDs7CisrICAgIHRhcmdldF9hbGlhcz0kYWNfb3B0YXJnIDs7CisgCisgICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQorICAgICB2ZXJib3NlPXllcyA7OworIAorLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMpCistICAgIGVjaG8gImNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgorLSAgICBleGl0IDAgOzsKKysgIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLVYpCisrICAgIGFjX2luaXRfdmVyc2lvbj06IDs7CisgCisgICAtd2l0aC0qIHwgLS13aXRoLSopCistICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRoLS8vJyAtZSAncy89LiovLydgCisrICAgIGFjX3VzZXJvcHQ9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSp3aXRoLVwoW149XSpcKSdgCisgICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKy0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCistICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorLSAgICBmaQorLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAorLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgorLSAgICAgICo9KikgOzsKKy0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7CisrICAgIGV4cHIgIngkYWNfdXNlcm9wdCIgOiAiLipbXi0rLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCisrICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCBwYWNrYWdlIG5hbWU6ICRhY191c2Vyb3B0IiA+JjIKKysgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKysgICAgYWNfdXNlcm9wdF9vcmlnPSRhY191c2Vyb3B0CisrICAgIGFjX3VzZXJvcHQ9YCRhc19lY2hvICIkYWNfdXNlcm9wdCIgfCBzZWQgJ3MvWy0rLl0vXy9nJ2AKKysgICAgY2FzZSAkYWNfdXNlcl9vcHRzIGluCisrICAgICAgKiIKKysid2l0aF8kYWNfdXNlcm9wdCIKKysiKikgOzsKKysgICAgICAqKSBhY191bnJlY29nbml6ZWRfb3B0cz0iJGFjX3VucmVjb2duaXplZF9vcHRzJGFjX3VucmVjb2duaXplZF9zZXAtLXdpdGgtJGFjX3VzZXJvcHRfb3JpZyIKKysJIGFjX3VucmVjb2duaXplZF9zZXA9JywgJzs7CisgICAgIGVzYWMKKy0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PSckYWNfb3B0YXJnJyIgOzsKKysgICAgZXZhbCB3aXRoXyRhY191c2Vyb3B0PVwkYWNfb3B0YXJnIDs7CisgCisgICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCistICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRob3V0LS8vJ2AKKysgICAgYWNfdXNlcm9wdD1gZXhwciAieCRhY19vcHRpb24iIDogJ3gtKndpdGhvdXQtXCguKlwpJ2AKKyAgICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgorLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KKy0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9CistICAgIGZpCistICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCistICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT1ubyIgOzsKKysgICAgZXhwciAieCRhY191c2Vyb3B0IiA6ICIuKlteLSsuXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKysgICAgICB7ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIHBhY2thZ2UgbmFtZTogJGFjX3VzZXJvcHQiID4mMgorKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorKyAgICBhY191c2Vyb3B0X29yaWc9JGFjX3VzZXJvcHQKKysgICAgYWNfdXNlcm9wdD1gJGFzX2VjaG8gIiRhY191c2Vyb3B0IiB8IHNlZCAncy9bLSsuXS9fL2cnYAorKyAgICBjYXNlICRhY191c2VyX29wdHMgaW4KKysgICAgICAqIgorKyJ3aXRoXyRhY191c2Vyb3B0IgorKyIqKSA7OworKyAgICAgICopIGFjX3VucmVjb2duaXplZF9vcHRzPSIkYWNfdW5yZWNvZ25pemVkX29wdHMkYWNfdW5yZWNvZ25pemVkX3NlcC0td2l0aG91dC0kYWNfdXNlcm9wdF9vcmlnIgorKwkgYWNfdW5yZWNvZ25pemVkX3NlcD0nLCAnOzsKKysgICAgZXNhYworKyAgICBldmFsIHdpdGhfJGFjX3VzZXJvcHQ9bm8gOzsKKyAKKyAgIC0teCkKKyAgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgorQEAgLTQwNiwxNjcgKzExODQsNzM1IEBACisgICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OworICAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKKyAgIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKKy0gICAgeF9pbmNsdWRlcz0iJGFjX29wdGFyZyIgOzsKKysgICAgeF9pbmNsdWRlcz0kYWNfb3B0YXJnIDs7CisgCisgICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAorICAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCisgICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKKyAgIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKKyAgIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQorLSAgICB4X2xpYnJhcmllcz0iJGFjX29wdGFyZyIgOzsKKysgICAgeF9saWJyYXJpZXM9JGFjX29wdGFyZyA7OworIAorLSAgLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX29wdGlvbjogaW52YWxpZCBvcHRpb247IHVzZSAtLWhlbHAgdG8gc2hvdyB1c2FnZSIgMT4mMjsgZXhpdCAxOyB9CisrICAtKikgeyAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogdW5yZWNvZ25pemVkIG9wdGlvbjogJGFjX29wdGlvbgorK1RyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiA+JjIKKysgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyAgICAgOzsKKyAKKysgICo9KikKKysgICAgYWNfZW52dmFyPWBleHByICJ4JGFjX29wdGlvbiIgOiAneFwoW149XSpcKT0nYAorKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisrICAgIGV4cHIgIngkYWNfZW52dmFyIiA6ICIuKlteXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKysgICAgICB7ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIHZhcmlhYmxlIG5hbWU6ICRhY19lbnZ2YXIiID4mMgorKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorKyAgICBldmFsICRhY19lbnZ2YXI9XCRhY19vcHRhcmcKKysgICAgZXhwb3J0ICRhY19lbnZ2YXIgOzsKKysKKyAgICopCistICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19vcHRpb258IHNlZCAncy9bLWEtejAtOS5dLy9nJ2AiOyB0aGVuCistICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiAkYWNfb3B0aW9uOiBpbnZhbGlkIGhvc3QgdHlwZSIgMT4mMgorLSAgICBmaQorLSAgICBpZiB0ZXN0ICJ4JG5vbm9wdCIgIT0geE5PTkU7IHRoZW4KKy0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0KKy0gICAgZmkKKy0gICAgbm9ub3B0PSIkYWNfb3B0aW9uIgorKyAgICAjIEZJWE1FOiBzaG91bGQgYmUgcmVtb3ZlZCBpbiBhdXRvY29uZiAzLjAuCisrICAgICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHlvdSBzaG91bGQgdXNlIC0tYnVpbGQsIC0taG9zdCwgLS10YXJnZXQiID4mMgorKyAgICBleHByICJ4JGFjX29wdGlvbiIgOiAiLipbXi0uXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKysgICAgICAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBpbnZhbGlkIGhvc3QgdHlwZTogJGFjX29wdGlvbiIgPiYyCisrICAgIDogJHtidWlsZF9hbGlhcz0kYWNfb3B0aW9ufSAke2hvc3RfYWxpYXM9JGFjX29wdGlvbn0gJHt0YXJnZXRfYWxpYXM9JGFjX29wdGlvbn0KKyAgICAgOzsKKyAKKyAgIGVzYWMKKyBkb25lCisgCisgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCistICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gLS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgIiAxPiYyOyBleGl0IDE7IH0KKysgIGFjX29wdGlvbj0tLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AKKysgIHsgJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gJGFjX29wdGlvbiIgPiYyCisrICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgZmkKKyAKKy10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQorLQorLSMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgorLSMgMCBzdGFuZGFyZCBpbnB1dAorLSMgMSBmaWxlIGNyZWF0aW9uCistIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKKy0jIDMgc29tZSBzeXN0ZW1zIG1heSBvcGVuIGl0IHRvIC9kZXYvdHR5CistIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgorLSMgNiBjaGVja2luZyBmb3IuLi4gbWVzc2FnZXMgYW5kIHJlc3VsdHMKKy0jIDUgY29tcGlsZXIgbWVzc2FnZXMgc2F2ZWQgaW4gY29uZmlnLmxvZworLWlmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCistICBleGVjIDY+L2Rldi9udWxsCistZWxzZQorLSAgZXhlYyA2PiYxCisraWYgdGVzdCAtbiAiJGFjX3VucmVjb2duaXplZF9vcHRzIjsgdGhlbgorKyAgY2FzZSAkZW5hYmxlX29wdGlvbl9jaGVja2luZyBpbgorKyAgICBubykgOzsKKysgICAgZmF0YWwpIHsgJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IHVucmVjb2duaXplZCBvcHRpb25zOiAkYWNfdW5yZWNvZ25pemVkX29wdHMiID4mMgorKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfSA7OworKyAgICAqKSAgICAgJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdW5yZWNvZ25pemVkIG9wdGlvbnM6ICRhY191bnJlY29nbml6ZWRfb3B0cyIgPiYyIDs7CisrICBlc2FjCisgZmkKKy1leGVjIDU+Li9jb25maWcubG9nCistCistZWNobyAiXAorLVRoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCistcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KKy0iIDE+JjUKKyAKKy0jIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KKy0jIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycy4KKy1hY19jb25maWd1cmVfYXJncz0KKy1mb3IgYWNfYXJnCisrIyBDaGVjayBhbGwgZGlyZWN0b3J5IGFyZ3VtZW50cyBmb3IgY29uc2lzdGVuY3kuCisrZm9yIGFjX3ZhciBpbglleGVjX3ByZWZpeCBwcmVmaXggYmluZGlyIHNiaW5kaXIgbGliZXhlY2RpciBkYXRhcm9vdGRpciBcCisrCQlkYXRhZGlyIHN5c2NvbmZkaXIgc2hhcmVkc3RhdGVkaXIgbG9jYWxzdGF0ZWRpciBpbmNsdWRlZGlyIFwKKysJCW9sZGluY2x1ZGVkaXIgZG9jZGlyIGluZm9kaXIgaHRtbGRpciBkdmlkaXIgcGRmZGlyIHBzZGlyIFwKKysJCWxpYmRpciBsb2NhbGVkaXIgbWFuZGlyCisgZG8KKy0gIGNhc2UgIiRhY19hcmciIGluCistICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAorLSAgfCAtLW5vLWNyIHwgLS1uby1jKSA7OworLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCistICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikgOzsKKy0gICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XSopCistICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIgOzsKKy0gICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKKysgIGV2YWwgYWNfdmFsPVwkJGFjX3ZhcgorKyAgIyBSZW1vdmUgdHJhaWxpbmcgc2xhc2hlcy4KKysgIGNhc2UgJGFjX3ZhbCBpbgorKyAgICAqLyApCisrICAgICAgYWNfdmFsPWBleHByICJYJGFjX3ZhbCIgOiAnWFwoLipbXi9dXCknIFx8ICJYJGFjX3ZhbCIgOiAnWFwoLipcKSdgCisrICAgICAgZXZhbCAkYWNfdmFyPVwkYWNfdmFsOzsKKyAgIGVzYWMKKysgICMgQmUgc3VyZSB0byBoYXZlIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lcy4KKysgIGNhc2UgJGFjX3ZhbCBpbgorKyAgICBbXFwvJF0qIHwgPzpbXFwvXSogKSAgY29udGludWU7OworKyAgICBOT05FIHwgJycgKSBjYXNlICRhY192YXIgaW4gKnByZWZpeCApIGNvbnRpbnVlOzsgZXNhYzs7CisrICBlc2FjCisrICB7ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBleHBlY3RlZCBhbiBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSBmb3IgLS0kYWNfdmFyOiAkYWNfdmFsIiA+JjIKKysgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyBkb25lCisgCistIyBOTFMgbnVpc2FuY2VzLgorLSMgT25seSBzZXQgdGhlc2UgdG8gQyBpZiBhbHJlYWR5IHNldC4gIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkKKy0jIGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KKy0jIEZpeGluZyBMQ19NRVNTQUdFUyBwcmV2ZW50cyBTb2xhcmlzIHNoIGZyb20gdHJhbnNsYXRpbmcgdmFyIHZhbHVlcyBpbiBgc2V0JyEKKy0jIE5vbi1DIExDX0NUWVBFIHZhbHVlcyBicmVhayB0aGUgY3R5cGUgY2hlY2suCistaWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCistaWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4gTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IGZpCistaWYgdGVzdCAiJHtMQ19NRVNTQUdFUytzZXR9IiA9IHNldDsgdGhlbiBMQ19NRVNTQUdFUz1DOyBleHBvcnQgTENfTUVTU0FHRVM7IGZpCistaWYgdGVzdCAiJHtMQ19DVFlQRStzZXR9IiAgICA9IHNldDsgdGhlbiBMQ19DVFlQRT1DOyAgICBleHBvcnQgTENfQ1RZUEU7ICAgIGZpCisrIyBUaGVyZSBtaWdodCBiZSBwZW9wbGUgd2hvIGRlcGVuZCBvbiB0aGUgb2xkIGJyb2tlbiBiZWhhdmlvcjogYCRob3N0JworKyMgdXNlZCB0byBob2xkIHRoZSBhcmd1bWVudCBvZiAtLWhvc3QgZXRjLgorKyMgRklYTUU6IFRvIHJlbW92ZSBzb21lIGRheS4KKytidWlsZD0kYnVpbGRfYWxpYXMKKytob3N0PSRob3N0X2FsaWFzCisrdGFyZ2V0PSR0YXJnZXRfYWxpYXMKKysKKysjIEZJWE1FOiBUbyByZW1vdmUgc29tZSBkYXkuCisraWYgdGVzdCAieCRob3N0X2FsaWFzIiAhPSB4OyB0aGVuCisrICBpZiB0ZXN0ICJ4JGJ1aWxkX2FsaWFzIiA9IHg7IHRoZW4KKysgICAgY3Jvc3NfY29tcGlsaW5nPW1heWJlCisrICAgICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IElmIHlvdSB3YW50ZWQgdG8gc2V0IHRoZSAtLWJ1aWxkIHR5cGUsIGRvbid0IHVzZSAtLWhvc3QuCisrICAgIElmIGEgY3Jvc3MgY29tcGlsZXIgaXMgZGV0ZWN0ZWQgdGhlbiBjcm9zcyBjb21waWxlIG1vZGUgd2lsbCBiZSB1c2VkLiIgPiYyCisrICBlbGlmIHRlc3QgIngkYnVpbGRfYWxpYXMiICE9ICJ4JGhvc3RfYWxpYXMiOyB0aGVuCisrICAgIGNyb3NzX2NvbXBpbGluZz15ZXMKKysgIGZpCisrZmkKKysKKythY190b29sX3ByZWZpeD0KKyt0ZXN0IC1uICIkaG9zdF9hbGlhcyIgJiYgYWNfdG9vbF9wcmVmaXg9JGhvc3RfYWxpYXMtCisrCisrdGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYgZXhlYyA2Pi9kZXYvbnVsbAorKworKworK2FjX3B3ZD1gcHdkYCAmJiB0ZXN0IC1uICIkYWNfcHdkIiAmJgorK2FjX2xzX2RpPWBscyAtZGkgLmAgJiYKKythY19wd2RfbHNfZGk9YGNkICIkYWNfcHdkIiAmJiBscyAtZGkgLmAgfHwKKysgIHsgJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IHdvcmtpbmcgZGlyZWN0b3J5IGNhbm5vdCBiZSBkZXRlcm1pbmVkIiA+JjIKKysgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyt0ZXN0ICJYJGFjX2xzX2RpIiA9ICJYJGFjX3B3ZF9sc19kaSIgfHwKKysgIHsgJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IHB3ZCBkb2VzIG5vdCByZXBvcnQgbmFtZSBvZiB3b3JraW5nIGRpcmVjdG9yeSIgPiYyCisrICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgCistIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4KKy1ybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzLmgKKy0jIEFJWCBjcHAgbG9zZXMgb24gYW4gZW1wdHkgZmlsZSwgc28gbWFrZSBzdXJlIGl0IGNvbnRhaW5zIGF0IGxlYXN0IGEgbmV3bGluZS4KKy1lY2hvID4gY29uZmRlZnMuaAorLQorLSMgQSBmaWxlbmFtZSB1bmlxdWUgdG8gdGhpcyBwYWNrYWdlLCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHRoYXQKKy0jIGNvbmZpZ3VyZSBpcyBpbiwgd2hpY2ggd2UgY2FuIGxvb2sgZm9yIHRvIGZpbmQgb3V0IGlmIHNyY2RpciBpcyBjb3JyZWN0LgorLWFjX3VuaXF1ZV9maWxlPWNvbW1vbi91bmljb2RlL3V0eXBlcy5oCisgCisgIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgorIGlmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCisgICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcworLSAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIGl0cyBwYXJlbnQuCistICBhY19wcm9nPSQwCistICBhY19jb25mZGlyPWBlY2hvICRhY19wcm9nfHNlZCAncyUvW14vXVteL10qJCUlJ2AKKy0gIHRlc3QgIngkYWNfY29uZmRpciIgPSAieCRhY19wcm9nIiAmJiBhY19jb25mZGlyPS4KKysgICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiB0aGUgcGFyZW50IGRpcmVjdG9yeS4KKysgIGFjX2NvbmZkaXI9YCRhc19kaXJuYW1lIC0tICIkYXNfbXlzZWxmIiB8fAorKyRhc19leHByIFgiJGFzX215c2VsZiIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKKysJIFgiJGFzX215c2VsZiIgOiAnWFwoLy9cKVteL10nIFx8IFwKKysJIFgiJGFzX215c2VsZiIgOiAnWFwoLy9cKSQnIFx8IFwKKysJIFgiJGFzX215c2VsZiIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8CisrJGFzX2VjaG8gWCIkYXNfbXlzZWxmIiB8CisrICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97CisrCSAgICBzLy9cMS8KKysJICAgIHEKKysJICB9CisrCSAgL15YXChcL1wvXClbXi9dLioveworKwkgICAgcy8vXDEvCisrCSAgICBxCisrCSAgfQorKwkgIC9eWFwoXC9cL1wpJC97CisrCSAgICBzLy9cMS8KKysJICAgIHEKKysJICB9CisrCSAgL15YXChcL1wpLioveworKwkgICAgcy8vXDEvCisrCSAgICBxCisrCSAgfQorKwkgIHMvLiovLi87IHEnYAorICAgc3JjZGlyPSRhY19jb25mZGlyCistICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KKysgIGlmIHRlc3QgISAtciAiJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGUiOyB0aGVuCisgICAgIHNyY2Rpcj0uLgorICAgZmkKKyBlbHNlCisgICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCisgZmkKKy1pZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KKy0gIGlmIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllczsgdGhlbgorLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRhY19jb25mZGlyIG9yIC4uIiAxPiYyOyBleGl0IDE7IH0KKy0gIGVsc2UKKy0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkc3JjZGlyIiAxPiYyOyBleGl0IDE7IH0KKy0gIGZpCistZmkKKy1zcmNkaXI9YGVjaG8gIiR7c3JjZGlyfSIgfCBzZWQgJ3MlXChbXi9dXCkvKiQlXDElJ2AKKy0KKy0jIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgorLWlmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KKy0gIGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgorLSAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKKy0gIGVsc2UKKy0gICAgQ09ORklHX1NJVEU9IiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgorLSAgZmkKKy1maQorLWZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbworLSAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KKy0gICAgZWNobyAibG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIgorLSAgICAuICIkYWNfc2l0ZV9maWxlIgorLSAgZmkKKytpZiB0ZXN0ICEgLXIgIiRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlIjsgdGhlbgorKyAgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzICYmIHNyY2Rpcj0iJGFjX2NvbmZkaXIgb3IgLi4iCisrICB7ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgZmluZCBzb3VyY2VzICgkYWNfdW5pcXVlX2ZpbGUpIGluICRzcmNkaXIiID4mMgorKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorK2ZpCisrYWNfbXNnPSJzb3VyY2VzIGFyZSBpbiAkc3JjZGlyLCBidXQgXGBjZCAkc3JjZGlyJyBkb2VzIG5vdCB3b3JrIgorK2FjX2Fic19jb25mZGlyPWAoCisrCWNkICIkc3JjZGlyIiAmJiB0ZXN0IC1yICIuLyRhY191bmlxdWVfZmlsZSIgfHwgeyAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogJGFjX21zZyIgPiYyCisrICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisrCXB3ZClgCisrIyBXaGVuIGJ1aWxkaW5nIGluIHBsYWNlLCBzZXQgc3JjZGlyPS4KKytpZiB0ZXN0ICIkYWNfYWJzX2NvbmZkaXIiID0gIiRhY19wd2QiOyB0aGVuCisrICBzcmNkaXI9LgorK2ZpCisrIyBSZW1vdmUgdW5uZWNlc3NhcnkgdHJhaWxpbmcgc2xhc2hlcyBmcm9tIHNyY2Rpci4KKysjIERvdWJsZSBzbGFzaGVzIGluIGZpbGUgbmFtZXMgaW4gb2JqZWN0IGZpbGUgZGVidWdnaW5nIGluZm8KKysjIG1lc3MgdXAgTS14IGdkYiBpbiBFbWFjcy4KKytjYXNlICRzcmNkaXIgaW4KKysqLykgc3JjZGlyPWBleHByICJYJHNyY2RpciIgOiAnWFwoLipbXi9dXCknIFx8ICJYJHNyY2RpciIgOiAnWFwoLipcKSdgOzsKKytlc2FjCisrZm9yIGFjX3ZhciBpbiAkYWNfcHJlY2lvdXNfdmFyczsgZG8KKysgIGV2YWwgYWNfZW52XyR7YWNfdmFyfV9zZXQ9XCR7JHthY192YXJ9K3NldH0KKysgIGV2YWwgYWNfZW52XyR7YWNfdmFyfV92YWx1ZT1cJCR7YWNfdmFyfQorKyAgZXZhbCBhY19jdl9lbnZfJHthY192YXJ9X3NldD1cJHske2FjX3Zhcn0rc2V0fQorKyAgZXZhbCBhY19jdl9lbnZfJHthY192YXJ9X3ZhbHVlPVwkJHthY192YXJ9CisgZG9uZQorIAorLWlmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgorLSAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKy0gIC4gJGNhY2hlX2ZpbGUKKy1lbHNlCistICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKy0gID4gJGNhY2hlX2ZpbGUKKysjCisrIyBSZXBvcnQgdGhlIC0taGVscCBtZXNzYWdlLgorKyMKKytpZiB0ZXN0ICIkYWNfaW5pdF9oZWxwIiA9ICJsb25nIjsgdGhlbgorKyAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCisrICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCisrICBjYXQgPDxfQUNFT0YKKytcYGNvbmZpZ3VyZScgY29uZmlndXJlcyB0aGlzIHBhY2thZ2UgdG8gYWRhcHQgdG8gbWFueSBraW5kcyBvZiBzeXN0ZW1zLgorKworK1VzYWdlOiAkMCBbT1BUSU9OXS4uLiBbVkFSPVZBTFVFXS4uLgorKworK1RvIGFzc2lnbiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKGUuZy4sIENDLCBDRkxBR1MuLi4pLCBzcGVjaWZ5IHRoZW0gYXMKKytWQVI9VkFMVUUuICBTZWUgYmVsb3cgZm9yIGRlc2NyaXB0aW9ucyBvZiBzb21lIG9mIHRoZSB1c2VmdWwgdmFyaWFibGVzLgorKworK0RlZmF1bHRzIGZvciB0aGUgb3B0aW9ucyBhcmUgc3BlY2lmaWVkIGluIGJyYWNrZXRzLgorKworK0NvbmZpZ3VyYXRpb246CisrICAtaCwgLS1oZWxwICAgICAgICAgICAgICBkaXNwbGF5IHRoaXMgaGVscCBhbmQgZXhpdAorKyAgICAgIC0taGVscD1zaG9ydCAgICAgICAgZGlzcGxheSBvcHRpb25zIHNwZWNpZmljIHRvIHRoaXMgcGFja2FnZQorKyAgICAgIC0taGVscD1yZWN1cnNpdmUgICAgZGlzcGxheSB0aGUgc2hvcnQgaGVscCBvZiBhbGwgdGhlIGluY2x1ZGVkIHBhY2thZ2VzCisrICAtViwgLS12ZXJzaW9uICAgICAgICAgICBkaXNwbGF5IHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQKKysgIC1xLCAtLXF1aWV0LCAtLXNpbGVudCAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcworKyAgICAgIC0tY2FjaGUtZmlsZT1GSUxFICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUgW2Rpc2FibGVkXQorKyAgLUMsIC0tY29uZmlnLWNhY2hlICAgICAgYWxpYXMgZm9yIFxgLS1jYWNoZS1maWxlPWNvbmZpZy5jYWNoZScKKysgIC1uLCAtLW5vLWNyZWF0ZSAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCisrICAgICAgLS1zcmNkaXI9RElSICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciBcYC4uJ10KKysKKytJbnN0YWxsYXRpb24gZGlyZWN0b3JpZXM6CisrICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKKysgICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCisrICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAorKyAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWF0KKysKKytCeSBkZWZhdWx0LCBcYG1ha2UgaW5zdGFsbCcgd2lsbCBpbnN0YWxsIGFsbCB0aGUgZmlsZXMgaW4KKytcYCRhY19kZWZhdWx0X3ByZWZpeC9iaW4nLCBcYCRhY19kZWZhdWx0X3ByZWZpeC9saWInIGV0Yy4gIFlvdSBjYW4gc3BlY2lmeQorK2FuIGluc3RhbGxhdGlvbiBwcmVmaXggb3RoZXIgdGhhbiBcYCRhY19kZWZhdWx0X3ByZWZpeCcgdXNpbmcgXGAtLXByZWZpeCcsCisrZm9yIGluc3RhbmNlIFxgLS1wcmVmaXg9XCRIT01FJy4KKysKKytGb3IgYmV0dGVyIGNvbnRyb2wsIHVzZSB0aGUgb3B0aW9ucyBiZWxvdy4KKysKKytGaW5lIHR1bmluZyBvZiB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzOgorKyAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBbRVBSRUZJWC9iaW5dCisrICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgW0VQUkVGSVgvc2Jpbl0KKysgIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgW0VQUkVGSVgvbGliZXhlY10KKysgIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIFtQUkVGSVgvZXRjXQorKyAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBbUFJFRklYL2NvbV0KKysgIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBbUFJFRklYL3Zhcl0KKysgIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBbRVBSRUZJWC9saWJdCisrICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBbUFJFRklYL2luY2x1ZGVdCisrICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBbL3Vzci9pbmNsdWRlXQorKyAgLS1kYXRhcm9vdGRpcj1ESVIgICAgICAgcmVhZC1vbmx5IGFyY2guLWluZGVwZW5kZW50IGRhdGEgcm9vdCBbUFJFRklYL3NoYXJlXQorKyAgLS1kYXRhZGlyPURJUiAgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIFtEQVRBUk9PVERJUl0KKysgIC0taW5mb2Rpcj1ESVIgICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBbREFUQVJPT1RESVIvaW5mb10KKysgIC0tbG9jYWxlZGlyPURJUiAgICAgICAgIGxvY2FsZS1kZXBlbmRlbnQgZGF0YSBbREFUQVJPT1RESVIvbG9jYWxlXQorKyAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gW0RBVEFST09URElSL21hbl0KKysgIC0tZG9jZGlyPURJUiAgICAgICAgICAgIGRvY3VtZW50YXRpb24gcm9vdCBbREFUQVJPT1RESVIvZG9jL1BBQ0tBR0VdCisrICAtLWh0bWxkaXI9RElSICAgICAgICAgICBodG1sIGRvY3VtZW50YXRpb24gW0RPQ0RJUl0KKysgIC0tZHZpZGlyPURJUiAgICAgICAgICAgIGR2aSBkb2N1bWVudGF0aW9uIFtET0NESVJdCisrICAtLXBkZmRpcj1ESVIgICAgICAgICAgICBwZGYgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQorKyAgLS1wc2Rpcj1ESVIgICAgICAgICAgICAgcHMgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQorK19BQ0VPRgorKworKyAgY2F0IDw8XF9BQ0VPRgorKworK1N5c3RlbSB0eXBlczoKKysgIC0tYnVpbGQ9QlVJTEQgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW2d1ZXNzZWRdCisrICAtLWhvc3Q9SE9TVCAgICAgICBjcm9zcy1jb21waWxlIHRvIGJ1aWxkIHByb2dyYW1zIHRvIHJ1biBvbiBIT1NUIFtCVUlMRF0KKytfQUNFT0YKKyBmaQorIAorLWFjX2V4dD1jCistIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgorLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCistYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKKy1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKKy0KKy1hY19leGVleHQ9CistYWNfb2JqZXh0PW8KKy1pZiAoZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsMykgfCBncmVwIGMgPi9kZXYvbnVsbDsgdGhlbgorLSAgIyBTdGFyZGVudCBWaXN0cmEgU1ZSNCBncmVwIGxhY2tzIC1lLCBzYXlzIGdoYXppQGNhaXAucnV0Z2Vycy5lZHUuCistICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgorLSAgICBhY19uPSBhY19jPScKKy0nIGFjX3Q9JwknCistICBlbHNlCistICAgIGFjX249LW4gYWNfYz0gYWNfdD0KKytpZiB0ZXN0IC1uICIkYWNfaW5pdF9oZWxwIjsgdGhlbgorKworKyAgY2F0IDw8XF9BQ0VPRgorKworK09wdGlvbmFsIEZlYXR1cmVzOgorKyAgLS1kaXNhYmxlLW9wdGlvbi1jaGVja2luZyAgaWdub3JlIHVucmVjb2duaXplZCAtLWVuYWJsZS8tLXdpdGggb3B0aW9ucworKyAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQorKyAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQorKyAgLS1lbmFibGUtc3RyaWN0ICAgICAgICAgY29tcGlsZSB3aXRoIHN0cmljdCBjb21waWxlciBvcHRpb25zIGRlZmF1bHQ9bm8KKysgIC0tZW5hYmxlLTY0Yml0LWxpYnMgICAgIGJ1aWxkIDY0LWJpdCBsaWJyYXJpZXMgZGVmYXVsdD15ZXMKKysgIC0tZW5hYmxlLXNoYXJlZCAgICAgICAgIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMgZGVmYXVsdD15ZXMKKysgIC0tZW5hYmxlLXN0YXRpYyAgICAgICAgIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMgZGVmYXVsdD1ubworKyAgLS1lbmFibGUtZGVidWcgICAgICAgICAgYnVpbGQgZGVidWcgbGlicmFyaWVzIGRlZmF1bHQ9bm8KKysgIC0tZW5hYmxlLXJlbGVhc2UgICAgICAgIGJ1aWxkIHJlbGVhc2UgbGlicmFyaWVzIGRlZmF1bHQ9eWVzCisrICAtLWVuYWJsZS1yZW5hbWluZyAgICAgICBhZGQgYSB2ZXJzaW9uIHN1ZmZpeCB0byBzeW1ib2xzIGRlZmF1bHQ9eWVzCisrICAtLWVuYWJsZS10cmFjaW5nICAgICAgICBlbmFibGUgZnVuY3Rpb24gYW5kIGRhdGEgdHJhY2luZyBkZWZhdWx0PXllcworKyAgLS1lbmFibGUtcnBhdGggICAgICAgICAgdXNlIHJwYXRoIHdoZW4gbGlua2luZyBkZWZhdWx0IGlzIG9ubHkgaWYgbmVjZXNzYXJ5CisrICAtLWVuYWJsZS10aHJlYWRzICAgICAgICBidWlsZCBJQ1Ugd2l0aCB0aHJlYWQgc2FmZXR5IGRlZmF1bHQ9eWVzCisrICAtLWVuYWJsZS1leHRyYXMgICAgICAgICBidWlsZCBJQ1UgZXh0cmFzIGRlZmF1bHQ9eWVzCisrICAtLWVuYWJsZS1pY3VpbyAgICAgICAgICBidWlsZCBJQ1UncyBpY3VpbyBsaWJyYXJ5IGRlZmF1bHQ9eWVzCisrICAtLWVuYWJsZS1sYXlvdXQgICAgICAgICBidWlsZCBJQ1UncyBsYXlvdXQgbGlicmFyeSBkZWZhdWx0PXllcworKworKyAgLS1lbmFibGUtdGVzdHMgICAgICAgICAgYnVpbGQgSUNVIHRlc3RzIGRlZmF1bHQ9eWVzCisrICAtLWVuYWJsZS1zYW1wbGVzICAgICAgICBidWlsZCBJQ1Ugc2FtcGxlcyBkZWZhdWx0PXllcworK0FkZGl0aW9uYWxseSwgdGhlIHZhcmlhYmxlIEZPUkNFX0xJQlMgbWF5IGJlIHNldCBiZWZvcmUgY2FsbGluZyBjb25maWd1cmUuIElmIHNldCwgaXQgd2lsbCBSRVBMQUNFIGFueSBhdXRvbWF0aWMgbGlzdCBvZiBsaWJyYXJpZXMuCisrCisrT3B0aW9uYWwgUGFja2FnZXM6CisrICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KKysgIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKKysgIC0td2l0aC1pb3N0cmVhbT12ZXJzaW9uIHNwZWNpZnkgdGhlIHZlcnNpb24gb2YgaW9zdHJlYW0gdG8gdXNlIChub25lLCBvbGQsIHN0ZCwgYXV0bykgZGVmYXVsdD1hdXRvCisrICAtLXdpdGgtZGF0YS1wYWNrYWdpbmc9dHlwZSBzcGVjaWZ5IGhvdyB0byBwYWNrYWdlIElDVSBkYXRhIChmaWxlcywgYXJjaGl2ZSwgbGlicmFyeSwgYXV0bykgZGVmYXVsdD1hdXRvCisrICAtLXdpdGgtbGlicmFyeS1zdWZmaXg9c3VmZml4ICAgIHRhZyBhIHN1ZmZpeCB0byB0aGUgbGlicmFyeSBuYW1lcyBkZWZhdWx0PQorKworK1NvbWUgaW5mbHVlbnRpYWwgZW52aXJvbm1lbnQgdmFyaWFibGVzOgorKyAgQ0MgICAgICAgICAgQyBjb21waWxlciBjb21tYW5kCisrICBDRkxBR1MgICAgICBDIGNvbXBpbGVyIGZsYWdzCisrICBMREZMQUdTICAgICBsaW5rZXIgZmxhZ3MsIGUuZy4gLUw8bGliIGRpcj4gaWYgeW91IGhhdmUgbGlicmFyaWVzIGluIGEKKysgICAgICAgICAgICAgIG5vbnN0YW5kYXJkIGRpcmVjdG9yeSA8bGliIGRpcj4KKysgIExJQlMgICAgICAgIGxpYnJhcmllcyB0byBwYXNzIHRvIHRoZSBsaW5rZXIsIGUuZy4gLWw8bGlicmFyeT4KKysgIENQUEZMQUdTICAgIEMvQysrL09iamVjdGl2ZSBDIHByZXByb2Nlc3NvciBmbGFncywgZS5nLiAtSTxpbmNsdWRlIGRpcj4gaWYKKysgICAgICAgICAgICAgIHlvdSBoYXZlIGhlYWRlcnMgaW4gYSBub25zdGFuZGFyZCBkaXJlY3RvcnkgPGluY2x1ZGUgZGlyPgorKyAgQ1hYICAgICAgICAgQysrIGNvbXBpbGVyIGNvbW1hbmQKKysgIENYWEZMQUdTICAgIEMrKyBjb21waWxlciBmbGFncworKyAgQ1BQICAgICAgICAgQyBwcmVwcm9jZXNzb3IKKysgIENYWENQUCAgICAgIEMrKyBwcmVwcm9jZXNzb3IKKysKKytVc2UgdGhlc2UgdmFyaWFibGVzIHRvIG92ZXJyaWRlIHRoZSBjaG9pY2VzIG1hZGUgYnkgYGNvbmZpZ3VyZScgb3IgdG8gaGVscAorK2l0IHRvIGZpbmQgbGlicmFyaWVzIGFuZCBwcm9ncmFtcyB3aXRoIG5vbnN0YW5kYXJkIG5hbWVzL2xvY2F0aW9ucy4KKysKKytfQUNFT0YKKythY19zdGF0dXM9JD8KKytmaQorKworK2lmIHRlc3QgIiRhY19pbml0X2hlbHAiID0gInJlY3Vyc2l2ZSI7IHRoZW4KKysgICMgSWYgdGhlcmUgYXJlIHN1YmRpcnMsIHJlcG9ydCB0aGVpciBzcGVjaWZpYyAtLWhlbHAuCisrICBmb3IgYWNfZGlyIGluIDogJGFjX3N1YmRpcnNfYWxsOyBkbyB0ZXN0ICJ4JGFjX2RpciIgPSB4OiAmJiBjb250aW51ZQorKyAgICB0ZXN0IC1kICIkYWNfZGlyIiB8fAorKyAgICAgIHsgY2QgIiRzcmNkaXIiICYmIGFjX3B3ZD1gcHdkYCAmJiBzcmNkaXI9LiAmJiB0ZXN0IC1kICIkYWNfZGlyIjsgfSB8fAorKyAgICAgIGNvbnRpbnVlCisrICAgIGFjX2J1aWxkZGlyPS4KKysKKytjYXNlICIkYWNfZGlyIiBpbgorKy4pIGFjX2Rpcl9zdWZmaXg9IGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OworKyopCisrICBhY19kaXJfc3VmZml4PS9gJGFzX2VjaG8gIiRhY19kaXIiIHwgc2VkICdzfF5cLltcXC9dfHwnYAorKyAgIyBBICIuLiIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgorKyAgYWNfdG9wX2J1aWxkZGlyX3N1Yj1gJGFzX2VjaG8gIiRhY19kaXJfc3VmZml4IiB8IHNlZCAnc3wvW15cXC9dKnwvLi58ZztzfC98fCdgCisrICBjYXNlICRhY190b3BfYnVpbGRkaXJfc3ViIGluCisrICAiIikgYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7CisrICAqKSAgYWNfdG9wX2J1aWxkX3ByZWZpeD0kYWNfdG9wX2J1aWxkZGlyX3N1Yi8gOzsKKysgIGVzYWMgOzsKKytlc2FjCisrYWNfYWJzX3RvcF9idWlsZGRpcj0kYWNfcHdkCisrYWNfYWJzX2J1aWxkZGlyPSRhY19wd2QkYWNfZGlyX3N1ZmZpeAorKyMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6CisrYWNfdG9wX2J1aWxkZGlyPSRhY190b3BfYnVpbGRfcHJlZml4CisrCisrY2FzZSAkc3JjZGlyIGluCisrICAuKSAgIyBXZSBhcmUgYnVpbGRpbmcgaW4gcGxhY2UuCisrICAgIGFjX3NyY2Rpcj0uCisrICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZGRpcl9zdWIKKysgICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZCA7OworKyAgW1xcL10qIHwgPzpbXFwvXSogKSAgIyBBYnNvbHV0ZSBuYW1lLgorKyAgICBhY19zcmNkaXI9JHNyY2RpciRhY19kaXJfc3VmZml4OworKyAgICBhY190b3Bfc3JjZGlyPSRzcmNkaXIKKysgICAgYWNfYWJzX3RvcF9zcmNkaXI9JHNyY2RpciA7OworKyAgKikgIyBSZWxhdGl2ZSBuYW1lLgorKyAgICBhY19zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyJGFjX2Rpcl9zdWZmaXgKKysgICAgYWNfdG9wX3NyY2Rpcj0kYWNfdG9wX2J1aWxkX3ByZWZpeCRzcmNkaXIKKysgICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZC8kc3JjZGlyIDs7CisrZXNhYworK2FjX2Fic19zcmNkaXI9JGFjX2Fic190b3Bfc3JjZGlyJGFjX2Rpcl9zdWZmaXgKKysKKysgICAgY2QgIiRhY19kaXIiIHx8IHsgYWNfc3RhdHVzPSQ/OyBjb250aW51ZTsgfQorKyAgICAjIENoZWNrIGZvciBndWVzdGVkIGNvbmZpZ3VyZS4KKysgICAgaWYgdGVzdCAtZiAiJGFjX3NyY2Rpci9jb25maWd1cmUuZ251IjsgdGhlbgorKyAgICAgIGVjaG8gJiYKKysgICAgICAkU0hFTEwgIiRhY19zcmNkaXIvY29uZmlndXJlLmdudSIgLS1oZWxwPXJlY3Vyc2l2ZQorKyAgICBlbGlmIHRlc3QgLWYgIiRhY19zcmNkaXIvY29uZmlndXJlIjsgdGhlbgorKyAgICAgIGVjaG8gJiYKKysgICAgICAkU0hFTEwgIiRhY19zcmNkaXIvY29uZmlndXJlIiAtLWhlbHA9cmVjdXJzaXZlCisrICAgIGVsc2UKKysgICAgICAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBubyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGlzIGluICRhY19kaXIiID4mMgorKyAgICBmaSB8fCBhY19zdGF0dXM9JD8KKysgICAgY2QgIiRhY19wd2QiIHx8IHsgYWNfc3RhdHVzPSQ/OyBicmVhazsgfQorKyAgZG9uZQorK2ZpCisrCisrdGVzdCAtbiAiJGFjX2luaXRfaGVscCIgJiYgZXhpdCAkYWNfc3RhdHVzCisraWYgJGFjX2luaXRfdmVyc2lvbjsgdGhlbgorKyAgY2F0IDw8XF9BQ0VPRgorK2NvbmZpZ3VyZQorK2dlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42MworKworK0NvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwKKysyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorK1RoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisrZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgorK19BQ0VPRgorKyAgZXhpdAorK2ZpCisrY2F0ID5jb25maWcubG9nIDw8X0FDRU9GCisrVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKKytydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgorKworK0l0IHdhcyBjcmVhdGVkIGJ5ICRhc19tZSwgd2hpY2ggd2FzCisrZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjYzLiAgSW52b2NhdGlvbiBjb21tYW5kIGxpbmUgd2FzCisrCisrICAkICQwICRACisrCisrX0FDRU9GCisrZXhlYyA1Pj5jb25maWcubG9nCisreworK2NhdCA8PF9BU1VOQU1FCisrIyMgLS0tLS0tLS0tICMjCisrIyMgUGxhdGZvcm0uICMjCisrIyMgLS0tLS0tLS0tICMjCisrCisraG9zdG5hbWUgPSBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWAKKyt1bmFtZSAtbSA9IGAodW5hbWUgLW0pIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKKyt1bmFtZSAtciA9IGAodW5hbWUgLXIpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKKyt1bmFtZSAtcyA9IGAodW5hbWUgLXMpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKKyt1bmFtZSAtdiA9IGAodW5hbWUgLXYpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKKysKKysvdXNyL2Jpbi91bmFtZSAtcCA9IGAoL3Vzci9iaW4vdW5hbWUgLXApIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKKysvYmluL3VuYW1lIC1YICAgICA9IGAoL2Jpbi91bmFtZSAtWCkgMj4vZGV2L251bGwgICAgIHx8IGVjaG8gdW5rbm93bmAKKysKKysvYmluL2FyY2ggICAgICAgICAgICAgID0gYCgvYmluL2FyY2gpIDI+L2Rldi9udWxsICAgICAgICAgICAgICB8fCBlY2hvIHVua25vd25gCisrL3Vzci9iaW4vYXJjaCAtayAgICAgICA9IGAoL3Vzci9iaW4vYXJjaCAtaykgMj4vZGV2L251bGwgICAgICAgfHwgZWNobyB1bmtub3duYAorKy91c3IvY29udmV4L2dldHN5c2luZm8gPSBgKC91c3IvY29udmV4L2dldHN5c2luZm8pIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKKysvdXNyL2Jpbi9ob3N0aW5mbyAgICAgID0gYCgvdXNyL2Jpbi9ob3N0aW5mbykgMj4vZGV2L251bGwgICAgICB8fCBlY2hvIHVua25vd25gCisrL2Jpbi9tYWNoaW5lICAgICAgICAgICA9IGAoL2Jpbi9tYWNoaW5lKSAyPi9kZXYvbnVsbCAgICAgICAgICAgfHwgZWNobyB1bmtub3duYAorKy91c3IvYmluL29zbGV2ZWwgICAgICAgPSBgKC91c3IvYmluL29zbGV2ZWwpIDI+L2Rldi9udWxsICAgICAgIHx8IGVjaG8gdW5rbm93bmAKKysvYmluL3VuaXZlcnNlICAgICAgICAgID0gYCgvYmluL3VuaXZlcnNlKSAyPi9kZXYvbnVsbCAgICAgICAgICB8fCBlY2hvIHVua25vd25gCisrCisrX0FTVU5BTUUKKysKKythc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCisrZm9yIGFzX2RpciBpbiAkUEFUSAorK2RvCisrICBJRlM9JGFzX3NhdmVfSUZTCisrICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorKyAgJGFzX2VjaG8gIlBBVEg6ICRhc19kaXIiCisrZG9uZQorK0lGUz0kYXNfc2F2ZV9JRlMKKysKKyt9ID4mNQorKworK2NhdCA+JjUgPDxfQUNFT0YKKysKKysKKysjIyAtLS0tLS0tLS0tLSAjIworKyMjIENvcmUgdGVzdHMuICMjCisrIyMgLS0tLS0tLS0tLS0gIyMKKysKKytfQUNFT0YKKysKKysKKysjIEtlZXAgYSB0cmFjZSBvZiB0aGUgY29tbWFuZCBsaW5lLgorKyMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgorKyMgU3RyaXAgb3V0IC0tc2lsZW50IGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byByZWNvcmQgaXQgZm9yIGZ1dHVyZSBydW5zLgorKyMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGEtY2hhcmFjdGVycy4KKysjIE1ha2UgdHdvIHBhc3NlcyB0byBhbGxvdyBmb3IgcHJvcGVyIGR1cGxpY2F0ZS1hcmd1bWVudCBzdXBwcmVzc2lvbi4KKythY19jb25maWd1cmVfYXJncz0KKythY19jb25maWd1cmVfYXJnczA9CisrYWNfY29uZmlndXJlX2FyZ3MxPQorK2FjX211c3Rfa2VlcF9uZXh0PWZhbHNlCisrZm9yIGFjX3Bhc3MgaW4gMSAyCisrZG8KKysgIGZvciBhY19hcmcKKysgIGRvCisrICAgIGNhc2UgJGFjX2FyZyBpbgorKyAgICAtbm8tY3JlYXRlIHwgLS1uby1jKiB8IC1uIHwgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tciopIGNvbnRpbnVlIDs7CisrICAgIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCisrICAgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQorKyAgICAgIGNvbnRpbnVlIDs7CisrICAgICpcJyopCisrICAgICAgYWNfYXJnPWAkYXNfZWNobyAiJGFjX2FyZyIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAgOzsKKysgICAgZXNhYworKyAgICBjYXNlICRhY19wYXNzIGluCisrICAgIDEpIGFjX2NvbmZpZ3VyZV9hcmdzMD0iJGFjX2NvbmZpZ3VyZV9hcmdzMCAnJGFjX2FyZyciIDs7CisrICAgIDIpCisrICAgICAgYWNfY29uZmlndXJlX2FyZ3MxPSIkYWNfY29uZmlndXJlX2FyZ3MxICckYWNfYXJnJyIKKysgICAgICBpZiB0ZXN0ICRhY19tdXN0X2tlZXBfbmV4dCA9IHRydWU7IHRoZW4KKysJYWNfbXVzdF9rZWVwX25leHQ9ZmFsc2UgIyBHb3QgdmFsdWUsIGJhY2sgdG8gbm9ybWFsLgorKyAgICAgIGVsc2UKKysJY2FzZSAkYWNfYXJnIGluCisrCSAgKj0qIHwgLS1jb25maWctY2FjaGUgfCAtQyB8IC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKiBcCisrCSAgfCAtZW5hYmxlLSogfCAtLWVuYWJsZS0qIHwgLWdhcyB8IC0tZyogfCAtbmZwIHwgLS1uZiogXAorKwkgIHwgLXEgfCAtcXVpZXQgfCAtLXEqIHwgLXNpbGVudCB8IC0tc2lsKiB8IC12IHwgLXZlcmIqIFwKKysJICB8IC13aXRoLSogfCAtLXdpdGgtKiB8IC13aXRob3V0LSogfCAtLXdpdGhvdXQtKiB8IC0teCkKKysJICAgIGNhc2UgIiRhY19jb25maWd1cmVfYXJnczAgIiBpbgorKwkgICAgICAiJGFjX2NvbmZpZ3VyZV9hcmdzMSIqIiAnJGFjX2FyZycgIiogKSBjb250aW51ZSA7OworKwkgICAgZXNhYworKwkgICAgOzsKKysJICAtKiApIGFjX211c3Rfa2VlcF9uZXh0PXRydWUgOzsKKysJZXNhYworKyAgICAgIGZpCisrICAgICAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciCisrICAgICAgOzsKKysgICAgZXNhYworKyAgZG9uZQorK2RvbmUKKyskYXNfdW5zZXQgYWNfY29uZmlndXJlX2FyZ3MwIHx8IHRlc3QgIiR7YWNfY29uZmlndXJlX2FyZ3MwK3NldH0iICE9IHNldCB8fCB7IGFjX2NvbmZpZ3VyZV9hcmdzMD07IGV4cG9ydCBhY19jb25maWd1cmVfYXJnczA7IH0KKyskYXNfdW5zZXQgYWNfY29uZmlndXJlX2FyZ3MxIHx8IHRlc3QgIiR7YWNfY29uZmlndXJlX2FyZ3MxK3NldH0iICE9IHNldCB8fCB7IGFjX2NvbmZpZ3VyZV9hcmdzMT07IGV4cG9ydCBhY19jb25maWd1cmVfYXJnczE7IH0KKysKKysjIFdoZW4gaW50ZXJydXB0ZWQgb3IgZXhpdCdkLCBjbGVhbnVwIHRlbXBvcmFyeSBmaWxlcywgYW5kIGNvbXBsZXRlCisrIyBjb25maWcubG9nLiAgV2UgcmVtb3ZlIGNvbW1lbnRzIGJlY2F1c2UgYW55d2F5IHRoZSBxdW90ZXMgaW4gdGhlcmUKKysjIHdvdWxkIGNhdXNlIHByb2JsZW1zIG9yIGxvb2sgdWdseS4KKysjIFdBUk5JTkc6IFVzZSAnXCcnIHRvIHJlcHJlc2VudCBhbiBhcG9zdHJvcGhlIHdpdGhpbiB0aGUgdHJhcC4KKysjIFdBUk5JTkc6IERvIG5vdCBzdGFydCB0aGUgdHJhcCBjb2RlIHdpdGggYSBuZXdsaW5lLCBkdWUgdG8gYSBGcmVlQlNEIDQuMCBidWcuCisrdHJhcCAnZXhpdF9zdGF0dXM9JD8KKysgICMgU2F2ZSBpbnRvIGNvbmZpZy5sb2cgc29tZSBpbmZvcm1hdGlvbiB0aGF0IG1pZ2h0IGhlbHAgaW4gZGVidWdnaW5nLgorKyAgeworKyAgICBlY2hvCisrCisrICAgIGNhdCA8PFxfQVNCT1gKKysjIyAtLS0tLS0tLS0tLS0tLS0tICMjCisrIyMgQ2FjaGUgdmFyaWFibGVzLiAjIworKyMjIC0tLS0tLS0tLS0tLS0tLS0gIyMKKytfQVNCT1gKKysgICAgZWNobworKyAgICAjIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAorKygKKysgIGZvciBhY192YXIgaW4gYChzZXQpIDI+JjEgfCBzZWQgLW4gJ1wnJ3MvXlwoW2EtekEtWl9dW2EtekEtWjAtOV9dKlwpPS4qL1wxL3AnXCcnYDsgZG8KKysgICAgZXZhbCBhY192YWw9XCQkYWNfdmFyCisrICAgIGNhc2UgJGFjX3ZhbCBpbiAjKAorKyAgICAqJHthc19ubH0qKQorKyAgICAgIGNhc2UgJGFjX3ZhciBpbiAjKAorKyAgICAgICpfY3ZfKikgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IGNhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lIiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBjYWNoZSB2YXJpYWJsZSAkYWNfdmFyIGNvbnRhaW5zIGEgbmV3bGluZSIgPiYyO30gOzsKKysgICAgICBlc2FjCisrICAgICAgY2FzZSAkYWNfdmFyIGluICMoCisrICAgICAgXyB8IElGUyB8IGFzX25sKSA7OyAjKAorKyAgICAgIEJBU0hfQVJHViB8IEJBU0hfU09VUkNFKSBldmFsICRhY192YXI9IDs7ICMoCisrICAgICAgKikgJGFzX3Vuc2V0ICRhY192YXIgOzsKKysgICAgICBlc2FjIDs7CisrICAgIGVzYWMKKysgIGRvbmUKKysgIChzZXQpIDI+JjEgfAorKyAgICBjYXNlICRhc19ubGAoYWNfc3BhY2U9J1wnJyAnXCcnOyBzZXQpIDI+JjFgIGluICMoCisrICAgICoke2FzX25sfWFjX3NwYWNlPVwgKikKKysgICAgICBzZWQgLW4gXAorKwkicy8nXCcnLydcJydcXFxcJ1wnJydcJycvZzsKKysJICBzL15cXChbXyRhc19jcl9hbG51bV0qX2N2X1tfJGFzX2NyX2FsbnVtXSpcXCk9XFwoLipcXCkvXFwxPSdcJydcXDInXCcnL3AiCisrICAgICAgOzsgIygKKysgICAgKikKKysgICAgICBzZWQgLW4gIi9eW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qPS9wIgorKyAgICAgIDs7CisrICAgIGVzYWMgfAorKyAgICBzb3J0CisrKQorKyAgICBlY2hvCisrCisrICAgIGNhdCA8PFxfQVNCT1gKKysjIyAtLS0tLS0tLS0tLS0tLS0tLSAjIworKyMjIE91dHB1dCB2YXJpYWJsZXMuICMjCisrIyMgLS0tLS0tLS0tLS0tLS0tLS0gIyMKKytfQVNCT1gKKysgICAgZWNobworKyAgICBmb3IgYWNfdmFyIGluICRhY19zdWJzdF92YXJzCisrICAgIGRvCisrICAgICAgZXZhbCBhY192YWw9XCQkYWNfdmFyCisrICAgICAgY2FzZSAkYWNfdmFsIGluCisrICAgICAgKlwnXCcnKikgYWNfdmFsPWAkYXNfZWNobyAiJGFjX3ZhbCIgfCBzZWQgInMvJ1wnJy8nXCcnXFxcXFxcXFwnXCcnJ1wnJy9nImA7OworKyAgICAgIGVzYWMKKysgICAgICAkYXNfZWNobyAiJGFjX3Zhcj0nXCcnJGFjX3ZhbCdcJyciCisrICAgIGRvbmUgfCBzb3J0CisrICAgIGVjaG8KKysKKysgICAgaWYgdGVzdCAtbiAiJGFjX3N1YnN0X2ZpbGVzIjsgdGhlbgorKyAgICAgIGNhdCA8PFxfQVNCT1gKKysjIyAtLS0tLS0tLS0tLS0tLS0tLS0tICMjCisrIyMgRmlsZSBzdWJzdGl0dXRpb25zLiAjIworKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKytfQVNCT1gKKysgICAgICBlY2hvCisrICAgICAgZm9yIGFjX3ZhciBpbiAkYWNfc3Vic3RfZmlsZXMKKysgICAgICBkbworKwlldmFsIGFjX3ZhbD1cJCRhY192YXIKKysJY2FzZSAkYWNfdmFsIGluCisrCSpcJ1wnJyopIGFjX3ZhbD1gJGFzX2VjaG8gIiRhY192YWwiIHwgc2VkICJzLydcJycvJ1wnJ1xcXFxcXFxcJ1wnJydcJycvZyJgOzsKKysJZXNhYworKwkkYXNfZWNobyAiJGFjX3Zhcj0nXCcnJGFjX3ZhbCdcJyciCisrICAgICAgZG9uZSB8IHNvcnQKKysgICAgICBlY2hvCisrICAgIGZpCisrCisrICAgIGlmIHRlc3QgLXMgY29uZmRlZnMuaDsgdGhlbgorKyAgICAgIGNhdCA8PFxfQVNCT1gKKysjIyAtLS0tLS0tLS0tLSAjIworKyMjIGNvbmZkZWZzLmguICMjCisrIyMgLS0tLS0tLS0tLS0gIyMKKytfQVNCT1gKKysgICAgICBlY2hvCisrICAgICAgY2F0IGNvbmZkZWZzLmgKKysgICAgICBlY2hvCisrICAgIGZpCisrICAgIHRlc3QgIiRhY19zaWduYWwiICE9IDAgJiYKKysgICAgICAkYXNfZWNobyAiJGFzX21lOiBjYXVnaHQgc2lnbmFsICRhY19zaWduYWwiCisrICAgICRhc19lY2hvICIkYXNfbWU6IGV4aXQgJGV4aXRfc3RhdHVzIgorKyAgfSA+JjUKKysgIHJtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiAmJgorKyAgICBybSAtZiAtciBjb25mdGVzdCogY29uZmRlZnMqIGNvbmYkJCogJGFjX2NsZWFuX2ZpbGVzICYmCisrICAgIGV4aXQgJGV4aXRfc3RhdHVzCisrJyAwCisrZm9yIGFjX3NpZ25hbCBpbiAxIDIgMTMgMTU7IGRvCisrICB0cmFwICdhY19zaWduYWw9JyRhY19zaWduYWwnOyB7IChleGl0IDEpOyBleGl0IDE7IH0nICRhY19zaWduYWwKKytkb25lCisrYWNfc2lnbmFsPTAKKysKKysjIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgorK3JtIC1mIC1yIGNvbmZ0ZXN0KiBjb25mZGVmcy5oCisrCisrIyBQcmVkZWZpbmVkIHByZXByb2Nlc3NvciB2YXJpYWJsZXMuCisrCisrY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorKyNkZWZpbmUgUEFDS0FHRV9OQU1FICIkUEFDS0FHRV9OQU1FIgorK19BQ0VPRgorKworKworK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKysjZGVmaW5lIFBBQ0tBR0VfVEFSTkFNRSAiJFBBQ0tBR0VfVEFSTkFNRSIKKytfQUNFT0YKKysKKysKKytjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisrI2RlZmluZSBQQUNLQUdFX1ZFUlNJT04gIiRQQUNLQUdFX1ZFUlNJT04iCisrX0FDRU9GCisrCisrCisrY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorKyNkZWZpbmUgUEFDS0FHRV9TVFJJTkcgIiRQQUNLQUdFX1NUUklORyIKKytfQUNFT0YKKysKKysKKytjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisrI2RlZmluZSBQQUNLQUdFX0JVR1JFUE9SVCAiJFBBQ0tBR0VfQlVHUkVQT1JUIgorK19BQ0VPRgorKworKworKyMgTGV0IHRoZSBzaXRlIGZpbGUgc2VsZWN0IGFuIGFsdGVybmF0ZSBjYWNoZSBmaWxlIGlmIGl0IHdhbnRzIHRvLgorKyMgUHJlZmVyIGFuIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCisrYWNfc2l0ZV9maWxlMT1OT05FCisrYWNfc2l0ZV9maWxlMj1OT05FCisraWYgdGVzdCAtbiAiJENPTkZJR19TSVRFIjsgdGhlbgorKyAgYWNfc2l0ZV9maWxlMT0kQ09ORklHX1NJVEUKKytlbGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgorKyAgYWNfc2l0ZV9maWxlMT0kcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlCisrICBhY19zaXRlX2ZpbGUyPSRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlCisrZWxzZQorKyAgYWNfc2l0ZV9maWxlMT0kYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUKKysgIGFjX3NpdGVfZmlsZTI9JGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZQorK2ZpCisrZm9yIGFjX3NpdGVfZmlsZSBpbiAiJGFjX3NpdGVfZmlsZTEiICIkYWNfc2l0ZV9maWxlMiIKKytkbworKyAgdGVzdCAieCRhY19zaXRlX2ZpbGUiID0geE5PTkUgJiYgY29udGludWUKKysgIGlmIHRlc3QgLXIgIiRhY19zaXRlX2ZpbGUiOyB0aGVuCisrICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIgPiY2O30KKysgICAgc2VkICdzL14vfCAvJyAiJGFjX3NpdGVfZmlsZSIgPiY1CisrICAgIC4gIiRhY19zaXRlX2ZpbGUiCisrICBmaQorK2RvbmUKKysKKytpZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KKysgICMgU29tZSB2ZXJzaW9ucyBvZiBiYXNoIHdpbGwgZmFpbCB0byBzb3VyY2UgL2Rldi9udWxsIChzcGVjaWFsCisrICAjIGZpbGVzIGFjdHVhbGx5KSwgc28gd2UgYXZvaWQgZG9pbmcgdGhhdC4KKysgIGlmIHRlc3QgLWYgIiRjYWNoZV9maWxlIjsgdGhlbgorKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogbG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogbG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KKysgICAgY2FzZSAkY2FjaGVfZmlsZSBpbgorKyAgICAgIFtcXC9dKiB8ID86W1xcL10qICkgLiAiJGNhY2hlX2ZpbGUiOzsKKysgICAgICAqKSAgICAgICAgICAgICAgICAgICAgICAuICIuLyRjYWNoZV9maWxlIjs7CisrICAgIGVzYWMKKyAgIGZpCisgZWxzZQorLSAgYWNfbj0gYWNfYz0nXGMnIGFjX3Q9CisrICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQorKyAgPiRjYWNoZV9maWxlCisrZmkKKysKKysjIENoZWNrIHRoYXQgdGhlIHByZWNpb3VzIHZhcmlhYmxlcyBzYXZlZCBpbiB0aGUgY2FjaGUgaGF2ZSBrZXB0IHRoZSBzYW1lCisrIyB2YWx1ZS4KKythY19jYWNoZV9jb3JydXB0ZWQ9ZmFsc2UKKytmb3IgYWNfdmFyIGluICRhY19wcmVjaW91c192YXJzOyBkbworKyAgZXZhbCBhY19vbGRfc2V0PVwkYWNfY3ZfZW52XyR7YWNfdmFyfV9zZXQKKysgIGV2YWwgYWNfbmV3X3NldD1cJGFjX2Vudl8ke2FjX3Zhcn1fc2V0CisrICBldmFsIGFjX29sZF92YWw9XCRhY19jdl9lbnZfJHthY192YXJ9X3ZhbHVlCisrICBldmFsIGFjX25ld192YWw9XCRhY19lbnZfJHthY192YXJ9X3ZhbHVlCisrICBjYXNlICRhY19vbGRfc2V0LCRhY19uZXdfc2V0IGluCisrICAgIHNldCwpCisrICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBcYCRhY192YXInIHdhcyBzZXQgdG8gXGAkYWNfb2xkX3ZhbCcgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIHNldCB0byBcYCRhY19vbGRfdmFsJyBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjI7fQorKyAgICAgIGFjX2NhY2hlX2NvcnJ1cHRlZD06IDs7CisrICAgICxzZXQpCisrICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBcYCRhY192YXInIHdhcyBub3Qgc2V0IGluIHRoZSBwcmV2aW91cyBydW4iID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBcYCRhY192YXInIHdhcyBub3Qgc2V0IGluIHRoZSBwcmV2aW91cyBydW4iID4mMjt9CisrICAgICAgYWNfY2FjaGVfY29ycnVwdGVkPTogOzsKKysgICAgLCk7OworKyAgICAqKQorKyAgICAgIGlmIHRlc3QgIngkYWNfb2xkX3ZhbCIgIT0gIngkYWNfbmV3X3ZhbCI7IHRoZW4KKysJIyBkaWZmZXJlbmNlcyBpbiB3aGl0ZXNwYWNlIGRvIG5vdCBsZWFkIHRvIGZhaWx1cmUuCisrCWFjX29sZF92YWxfdz1gZWNobyB4ICRhY19vbGRfdmFsYAorKwlhY19uZXdfdmFsX3c9YGVjaG8geCAkYWNfbmV3X3ZhbGAKKysJaWYgdGVzdCAiJGFjX29sZF92YWxfdyIgIT0gIiRhY19uZXdfdmFsX3ciOyB0aGVuCisrCSAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBcYCRhY192YXInIGhhcyBjaGFuZ2VkIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogXGAkYWNfdmFyJyBoYXMgY2hhbmdlZCBzaW5jZSB0aGUgcHJldmlvdXMgcnVuOiIgPiYyO30KKysJICBhY19jYWNoZV9jb3JydXB0ZWQ9OgorKwllbHNlCisrCSAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHdhcm5pbmc6IGlnbm9yaW5nIHdoaXRlc3BhY2UgY2hhbmdlcyBpbiBcYCRhY192YXInIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiB3YXJuaW5nOiBpZ25vcmluZyB3aGl0ZXNwYWNlIGNoYW5nZXMgaW4gXGAkYWNfdmFyJyBzaW5jZSB0aGUgcHJldmlvdXMgcnVuOiIgPiYyO30KKysJICBldmFsICRhY192YXI9XCRhY19vbGRfdmFsCisrCWZpCisrCXsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiAgIGZvcm1lciB2YWx1ZTogIFxgJGFjX29sZF92YWwnIiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiAgIGZvcm1lciB2YWx1ZTogIFxgJGFjX29sZF92YWwnIiA+JjI7fQorKwl7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogICBjdXJyZW50IHZhbHVlOiBcYCRhY19uZXdfdmFsJyIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogICBjdXJyZW50IHZhbHVlOiBcYCRhY19uZXdfdmFsJyIgPiYyO30KKysgICAgICBmaTs7CisrICBlc2FjCisrICAjIFBhc3MgcHJlY2lvdXMgdmFyaWFibGVzIHRvIGNvbmZpZy5zdGF0dXMuCisrICBpZiB0ZXN0ICIkYWNfbmV3X3NldCIgPSBzZXQ7IHRoZW4KKysgICAgY2FzZSAkYWNfbmV3X3ZhbCBpbgorKyAgICAqXCcqKSBhY19hcmc9JGFjX3Zhcj1gJGFzX2VjaG8gIiRhY19uZXdfdmFsIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYCA7OworKyAgICAqKSBhY19hcmc9JGFjX3Zhcj0kYWNfbmV3X3ZhbCA7OworKyAgICBlc2FjCisrICAgIGNhc2UgIiAkYWNfY29uZmlndXJlX2FyZ3MgIiBpbgorKyAgICAgICoiICckYWNfYXJnJyAiKikgOzsgIyBBdm9pZCBkdXBzLiAgVXNlIG9mIHF1b3RlcyBlbnN1cmVzIGFjY3VyYWN5LgorKyAgICAgICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OworKyAgICBlc2FjCisrICBmaQorK2RvbmUKKytpZiAkYWNfY2FjaGVfY29ycnVwdGVkOyB0aGVuCisrICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9CisrICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNoYW5nZXMgaW4gdGhlIGVudmlyb25tZW50IGNhbiBjb21wcm9taXNlIHRoZSBidWlsZCIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGNoYW5nZXMgaW4gdGhlIGVudmlyb25tZW50IGNhbiBjb21wcm9taXNlIHRoZSBidWlsZCIgPiYyO30KKysgIHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBydW4gXGBtYWtlIGRpc3RjbGVhbicgYW5kL29yIFxgcm0gJGNhY2hlX2ZpbGUnIGFuZCBzdGFydCBvdmVyIiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogcnVuIFxgbWFrZSBkaXN0Y2xlYW4nIGFuZC9vciBcYHJtICRjYWNoZV9maWxlJyBhbmQgc3RhcnQgb3ZlciIgPiYyO30KKysgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyBmaQorIAorIAorIAorIAorKworKworKworKworKworKworKworKworKworKworKworKworKworK2FjX2V4dD1jCisrYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKKythY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCisrYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKKythY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisrCisrCisrCisrYWNfY29uZmlnX2hlYWRlcnM9IiRhY19jb25maWdfaGVhZGVycyBjb21tb24vaWN1Y2ZnLmgiCisrCisgUEFDS0FHRT0iaWN1IgorIAorIAorLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBJQ1UgdmVyc2lvbiBudW1iZXJzIiIuLi4gJGFjX2MiIDE+JjYKKy1lY2hvICJjb25maWd1cmU6NTcwOiBjaGVja2luZyBmb3IgSUNVIHZlcnNpb24gbnVtYmVycyIgPiY1CisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBJQ1UgdmVyc2lvbiBudW1iZXJzIiA+JjUKKyskYXNfZWNob19uICJjaGVja2luZyBmb3IgSUNVIHZlcnNpb24gbnVtYmVycy4uLiAiID4mNjsgfQorIAorIGdldGljdXZlcnNpb24oKSB7CisgICAgIHNlZCAtbiAncy9eWyAJXSojWyAJXSpkZWZpbmVbIAldKlVfSUNVX1ZFUlNJT05bIAldKiJcKFteIl0qXCkiLiovXDEvcCcgIiRAIgorQEAgLTU3NSw3ICsxOTIxLDkgQEAKKyBpZiB0ZXN0IHgiJFZFUlNJT04iID0geDsgdGhlbgorICAgICBWRVJTSU9OPWBnZXRpY3V2ZXJzaW9uICRzcmNkaXIvY29tbW9uL3VuaWNvZGUvKi5oYAorICAgICBpZiB0ZXN0IHgiJFZFUlNJT04iID0geDsgdGhlbgorLSAgICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBDYW5ub3QgZGV0ZXJtaW5lIElDVSB2ZXJzaW9uIG51bWJlciBmcm9tIGhlYWRlciBmaWxlcyIgMT4mMjsgZXhpdCAxOyB9CisrICAgICAgICB7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogQ2Fubm90IGRldGVybWluZSBJQ1UgdmVyc2lvbiBudW1iZXIgZnJvbSBoZWFkZXIgZmlsZXMiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBDYW5ub3QgZGV0ZXJtaW5lIElDVSB2ZXJzaW9uIG51bWJlciBmcm9tIGhlYWRlciBmaWxlcyIgPiYyO30KKysgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyAgICAgZmkKKyBmaQorIExJQl9WRVJTSU9OPWBlY2hvICRWRVJTSU9OIHwgc2VkIC1lICdzL1wuLy8nIC1lICdzL15cKFteLl0qXCkkL1wxLjAvJ2AKK0BAIC01ODMsNyArMTkzMSw4IEBACisgCisgCisgCistZWNobyAiJGFjX3QiInJlbGVhc2UgJFZFUlNJT04sIGxpYnJhcnkgJExJQl9WRVJTSU9OIiAxPiY2CisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogcmVsZWFzZSAkVkVSU0lPTiwgbGlicmFyeSAkTElCX1ZFUlNJT04iID4mNQorKyRhc19lY2hvICJyZWxlYXNlICRWRVJTSU9OLCBsaWJyYXJ5ICRMSUJfVkVSU0lPTiIgPiY2OyB9CisgCisgVU5JQ09ERV9WRVJTSU9OPSI0LjAuMSIKKyAKK0BAIC01OTEsMjE0ICsxOTQwLDgwNCBAQAorIAorICNBQ19TVUJTVChDSU5UTFRTVF9DUFBGTEFHUykKKyAKKy0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCisrYWNfZXh0PWMKKythY19jcHA9JyRDUFAgJENQUEZMQUdTJworK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKKythY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKytpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisrICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9Z2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KKytzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1nY2M7IGFjX3dvcmQ9JDIKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KKytpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KKysgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisrZWxzZQorKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KKytlbHNlCisrYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorK2ZvciBhc19kaXIgaW4gJFBBVEgKKytkbworKyAgSUZTPSRhc19zYXZlX0lGUworKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKysgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorKyAgICBhY19jdl9wcm9nX0NDPSIke2FjX3Rvb2xfcHJlZml4fWdjYyIKKysgICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKysgICAgYnJlYWsgMgorKyAgZmkKKytkb25lCisrZG9uZQorK0lGUz0kYXNfc2F2ZV9JRlMKKysKKytmaQorK2ZpCisrQ0M9JGFjX2N2X3Byb2dfQ0MKKytpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisrICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQ0MiID4mNQorKyRhc19lY2hvICIkQ0MiID4mNjsgfQorK2Vsc2UKKysgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKKyskYXNfZWNobyAibm8iID4mNjsgfQorK2ZpCisrCisrCisrZmkKKytpZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19DQyI7IHRoZW4KKysgIGFjX2N0X0NDPSRDQworKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorIHNldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKKy1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZTo1OTg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CistaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KKytpZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KKysgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisrZWxzZQorKyAgaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgorKyAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX2N0X0NDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KKytlbHNlCisrYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorK2ZvciBhc19kaXIgaW4gJFBBVEgKKytkbworKyAgSUZTPSRhc19zYXZlX0lGUworKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKysgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorKyAgICBhY19jdl9wcm9nX2FjX2N0X0NDPSJnY2MiCisrICAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisrICAgIGJyZWFrIDIKKysgIGZpCisrZG9uZQorK2RvbmUKKytJRlM9JGFzX3NhdmVfSUZTCisrCisrZmkKKytmaQorK2FjX2N0X0NDPSRhY19jdl9wcm9nX2FjX2N0X0NDCisraWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgorKyAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N0X0NDIiA+JjUKKyskYXNfZWNobyAiJGFjX2N0X0NDIiA+JjY7IH0KKytlbHNlCisrICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CisrJGFzX2VjaG8gIm5vIiA+JjY7IH0KKytmaQorKworKyAgaWYgdGVzdCAieCRhY19jdF9DQyIgPSB4OyB0aGVuCisrICAgIENDPSIiCisrICBlbHNlCisrICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KKyt5ZXM6KQorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KKythY190b29sX3dhcm5lZD15ZXMgOzsKKytlc2FjCisrICAgIENDPSRhY19jdF9DQworKyAgZmkKKytlbHNlCisrICBDQz0iJGFjX2N2X3Byb2dfQ0MiCisrZmkKKysKKytpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisrICAgICAgICAgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKysgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KKytzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1jYzsgYWNfd29yZD0kMgorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQorK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DQytzZXR9IiA9IHNldDsgdGhlbgorKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKyBlbHNlCisgICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorIGVsc2UKKy0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCistICBhY19kdW1teT0iJFBBVEgiCistICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKy0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKy0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCistICAgICAgYWNfY3ZfcHJvZ19DQz0iZ2NjIgorLSAgICAgIGJyZWFrCistICAgIGZpCistICBkb25lCistICBJRlM9IiRhY19zYXZlX2lmcyIKKythc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCisrZm9yIGFzX2RpciBpbiAkUEFUSAorK2RvCisrICBJRlM9JGFzX3NhdmVfSUZTCisrICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorKyAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisrICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisrICAgIGFjX2N2X3Byb2dfQ0M9IiR7YWNfdG9vbF9wcmVmaXh9Y2MiCisrICAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisrICAgIGJyZWFrIDIKKysgIGZpCisrZG9uZQorK2RvbmUKKytJRlM9JGFzX3NhdmVfSUZTCisrCisgZmkKKyBmaQorLUNDPSIkYWNfY3ZfcHJvZ19DQyIKKytDQz0kYWNfY3ZfcHJvZ19DQworIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKy0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKKysgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRDQyIgPiY1CisrJGFzX2VjaG8gIiRDQyIgPiY2OyB9CisgZWxzZQorLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CisrICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CisrJGFzX2VjaG8gIm5vIiA+JjY7IH0KKyBmaQorIAorKworKyAgZmkKKytmaQorIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorIHNldCBkdW1teSBjYzsgYWNfd29yZD0kMgorLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CistZWNobyAiY29uZmlndXJlOjYyODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKy1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCistICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQorK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DQytzZXR9IiA9IHNldDsgdGhlbgorKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKyBlbHNlCisgICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorIGVsc2UKKy0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCisgICBhY19wcm9nX3JlamVjdGVkPW5vCistICBhY19kdW1teT0iJFBBVEgiCistICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKy0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKy0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCistICAgICAgaWYgdGVzdCAiJGFjX2Rpci8kYWNfd29yZCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCistICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcworLQljb250aW51ZQorLSAgICAgIGZpCistICAgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCistICAgICAgYnJlYWsKKy0gICAgZmkKKy0gIGRvbmUKKy0gIElGUz0iJGFjX3NhdmVfaWZzIgorK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKKytmb3IgYXNfZGlyIGluICRQQVRICisrZG8KKysgIElGUz0kYXNfc2F2ZV9JRlMKKysgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisrICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKysgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKysgICAgaWYgdGVzdCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCisrICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCisrICAgICAgIGNvbnRpbnVlCisrICAgICBmaQorKyAgICBhY19jdl9wcm9nX0NDPSJjYyIKKysgICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKysgICAgYnJlYWsgMgorKyAgZmkKKytkb25lCisrZG9uZQorK0lGUz0kYXNfc2F2ZV9JRlMKKysKKyBpZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCisgICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCisgICBzZXQgZHVtbXkgJGFjX2N2X3Byb2dfQ0MKKyAgIHNoaWZ0CistICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCisrICBpZiB0ZXN0ICQjICE9IDA7IHRoZW4KKyAgICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCisgICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KKyAgICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCisgICAgIHNoaWZ0CistICAgIHNldCBkdW1teSAiJGFjX2Rpci8kYWNfd29yZCIgIiRAIgorLSAgICBzaGlmdAorLSAgICBhY19jdl9wcm9nX0NDPSIkQCIKKysgICAgYWNfY3ZfcHJvZ19DQz0iJGFzX2Rpci8kYWNfd29yZCR7MSsnICd9JEAiCisgICBmaQorIGZpCisgZmkKKyBmaQorLUNDPSIkYWNfY3ZfcHJvZ19DQyIKKytDQz0kYWNfY3ZfcHJvZ19DQworIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKy0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKKysgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRDQyIgPiY1CisrJGFzX2VjaG8gIiRDQyIgPiY2OyB9CisgZWxzZQorLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CisrICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CisrJGFzX2VjaG8gIm5vIiA+JjY7IH0KKyBmaQorIAorLSAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgorLSAgICBjYXNlICJgdW5hbWUgLXNgIiBpbgorLSAgICAqd2luMzIqIHwgKldJTjMyKikKKy0gICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KKy1zZXQgZHVtbXkgY2w7IGFjX3dvcmQ9JDIKKy1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZTo2Nzk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CistaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKysKKytmaQorK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KKysgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKysgIGZvciBhY19wcm9nIGluIGNsLmV4ZQorKyAgZG8KKysgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCisrc2V0IGR1bW15ICRhY190b29sX3ByZWZpeCRhY19wcm9nOyBhY193b3JkPSQyCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CisraWYgdGVzdCAiJHthY19jdl9wcm9nX0NDK3NldH0iID0gc2V0OyB0aGVuCisrICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorIGVsc2UKKyAgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCisgZWxzZQorLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKy0gIGFjX2R1bW15PSIkUEFUSCIKKy0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKy0gICAgICBhY19jdl9wcm9nX0NDPSJjbCIKKy0gICAgICBicmVhaworLSAgICBmaQorLSAgZG9uZQorLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCisrYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorK2ZvciBhc19kaXIgaW4gJFBBVEgKKytkbworKyAgSUZTPSRhc19zYXZlX0lGUworKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKysgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorKyAgICBhY19jdl9wcm9nX0NDPSIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIKKysgICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKysgICAgYnJlYWsgMgorKyAgZmkKKytkb25lCisrZG9uZQorK0lGUz0kYXNfc2F2ZV9JRlMKKysKKyBmaQorIGZpCistQ0M9IiRhY19jdl9wcm9nX0NDIgorK0NDPSRhY19jdl9wcm9nX0NDCisgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorKyAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENDIiA+JjUKKyskYXNfZWNobyAiJENDIiA+JjY7IH0KKyBlbHNlCistICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKysgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKKyskYXNfZWNobyAibm8iID4mNjsgfQorIGZpCistIDs7CistICAgIGVzYWMKKysKKysKKysgICAgdGVzdCAtbiAiJENDIiAmJiBicmVhaworKyAgZG9uZQorK2ZpCisraWYgdGVzdCAteiAiJENDIjsgdGhlbgorKyAgYWNfY3RfQ0M9JENDCisrICBmb3IgYWNfcHJvZyBpbiBjbC5leGUKKytkbworKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCisrc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CisraWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X0NDK3NldH0iID0gc2V0OyB0aGVuCisrICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorK2Vsc2UKKysgIGlmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKysgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19jdF9DQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCisrZWxzZQorK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKKytmb3IgYXNfZGlyIGluICRQQVRICisrZG8KKysgIElGUz0kYXNfc2F2ZV9JRlMKKysgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisrICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKysgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKysgICAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX3Byb2ciCisrICAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisrICAgIGJyZWFrIDIKKyAgIGZpCistICB0ZXN0IC16ICIkQ0MiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQorK2RvbmUKKytkb25lCisrSUZTPSRhc19zYXZlX0lGUworKworK2ZpCisrZmkKKythY19jdF9DQz0kYWNfY3ZfcHJvZ19hY19jdF9DQworK2lmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKysgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdF9DQyIgPiY1CisrJGFzX2VjaG8gIiRhY19jdF9DQyIgPiY2OyB9CisrZWxzZQorKyAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorKyRhc19lY2hvICJubyIgPiY2OyB9CisgZmkKKyAKKy1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZTo3MTE6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1CisgCistYWNfZXh0PWMKKy0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCistYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKKy1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCistYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworLQorLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDwgRU9GCistCistI2xpbmUgNzIyICJjb25maWd1cmUiCistI2luY2x1ZGUgImNvbmZkZWZzLmgiCistCistbWFpbigpe3JldHVybigwKTt9CistRU9GCistaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3Mjc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKKy0gICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KKy0gIGlmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbDsgdGhlbgorLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCisrICB0ZXN0IC1uICIkYWNfY3RfQ0MiICYmIGJyZWFrCisrZG9uZQorKworKyAgaWYgdGVzdCAieCRhY19jdF9DQyIgPSB4OyB0aGVuCisrICAgIENDPSIiCisgICBlbHNlCistICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9eWVzCisrICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KKyt5ZXM6KQorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KKythY190b29sX3dhcm5lZD15ZXMgOzsKKytlc2FjCisrICAgIENDPSRhY19jdF9DQworICAgZmkKKy1lbHNlCistICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CistICBhY19jdl9wcm9nX2NjX3dvcmtzPW5vCisgZmkKKy1ybSAtZnIgY29uZnRlc3QqCistYWNfZXh0PWMKKy0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCistYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKKy1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCistYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworIAorLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgorLWlmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgorLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KKyBmaQorLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKKy1lY2hvICJjb25maWd1cmU6NzUzOiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1CistZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2Nyb3NzIiAxPiY2CistY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisgCistZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZTo3NTg6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiA+JjUKKy1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nY2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKy1lbHNlCistICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCistI2lmZGVmIF9fR05VQ19fCistICB5ZXM7CistI2VuZGlmCistRU9GCistaWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gY29uZmlndXJlOjc2NzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCistICBhY19jdl9wcm9nX2djYz15ZXMKKysKKyt0ZXN0IC16ICIkQ0MiICYmIHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorK3sgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBubyBhY2NlcHRhYmxlIEMgY29tcGlsZXIgZm91bmQgaW4gXCRQQVRICisrU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBubyBhY2NlcHRhYmxlIEMgY29tcGlsZXIgZm91bmQgaW4gXCRQQVRICisrU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9CisrICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OyB9CisrCisrIyBQcm92aWRlIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbXBpbGVyLgorKyRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIEMgY29tcGlsZXIgdmVyc2lvbiIgPiY1Cisrc2V0IFggJGFjX2NvbXBpbGUKKythY19jb21waWxlcj0kMgorK3sgKGFjX3RyeT0iJGFjX2NvbXBpbGVyIC0tdmVyc2lvbiA+JjUiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfY29tcGlsZXIgLS12ZXJzaW9uID4mNSIpIDI+JjUKKysgIGFjX3N0YXR1cz0kPworKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9CisreyAoYWNfdHJ5PSIkYWNfY29tcGlsZXIgLXYgPiY1IgorK2Nhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX2NvbXBpbGVyIC12ID4mNSIpIDI+JjUKKysgIGFjX3N0YXR1cz0kPworKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9CisreyAoYWNfdHJ5PSIkYWNfY29tcGlsZXIgLVYgPiY1IgorK2Nhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX2NvbXBpbGVyIC1WID4mNSIpIDI+JjUKKysgIGFjX3N0YXR1cz0kPworKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9CisrCisrY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKysKKytpbnQKKyttYWluICgpCisreworKworKyAgOworKyAgcmV0dXJuIDA7CisrfQorK19BQ0VPRgorK2FjX2NsZWFuX2ZpbGVzX3NhdmU9JGFjX2NsZWFuX2ZpbGVzCisrYWNfY2xlYW5fZmlsZXM9IiRhY19jbGVhbl9maWxlcyBhLm91dCBhLm91dC5kU1lNIGEuZXhlIGIub3V0IgorKyMgVHJ5IHRvIGNyZWF0ZSBhbiBleGVjdXRhYmxlIHdpdGhvdXQgLW8gZmlyc3QsIGRpc3JlZ2FyZCBhLm91dC4KKysjIEl0IHdpbGwgaGVscCB1cyBkaWFnbm9zZSBicm9rZW4gY29tcGlsZXJzLCBhbmQgZmluZGluZyBvdXQgYW4gaW50dWl0aW9uCisrIyBvZiBleGVleHQuCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBDIGNvbXBpbGVyIGRlZmF1bHQgb3V0cHV0IGZpbGUgbmFtZSIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEMgY29tcGlsZXIgZGVmYXVsdCBvdXRwdXQgZmlsZSBuYW1lLi4uICIgPiY2OyB9CisrYWNfbGlua19kZWZhdWx0PWAkYXNfZWNobyAiJGFjX2xpbmsiIHwgc2VkICdzLyAtbyAqY29uZnRlc3RbXiBdKi8vJ2AKKysKKysjIFRoZSBwb3NzaWJsZSBvdXRwdXQgZmlsZXM6CisrYWNfZmlsZXM9ImEub3V0IGNvbmZ0ZXN0LmV4ZSBjb25mdGVzdCBhLmV4ZSBhX291dC5leGUgYi5vdXQgY29uZnRlc3QuKiIKKysKKythY19ybWZpbGVzPQorK2ZvciBhY19maWxlIGluICRhY19maWxlcworK2RvCisrICBjYXNlICRhY19maWxlIGluCisrICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiB8ICouZFNZTSB8ICoubyB8ICoub2JqICkgOzsKKysgICAgKiApIGFjX3JtZmlsZXM9IiRhY19ybWZpbGVzICRhY19maWxlIjs7CisrICBlc2FjCisrZG9uZQorK3JtIC1mICRhY19ybWZpbGVzCisrCisraWYgeyAoYWNfdHJ5PSIkYWNfbGlua19kZWZhdWx0IgorK2Nhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX2xpbmtfZGVmYXVsdCIpIDI+JjUKKysgIGFjX3N0YXR1cz0kPworKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9OyB0aGVuCisrICAjIEF1dG9jb25mLTIuMTMgY291bGQgc2V0IHRoZSBhY19jdl9leGVleHQgdmFyaWFibGUgdG8gYG5vJy4KKysjIFNvIGlnbm9yZSBhIHZhbHVlIG9mIGBubycsIG90aGVyd2lzZSB0aGlzIHdvdWxkIGxlYWQgdG8gYEVYRUVYVCA9IG5vJworKyMgaW4gYSBNYWtlZmlsZS4gIFdlIHNob3VsZCBub3Qgb3ZlcnJpZGUgYWNfY3ZfZXhlZXh0IGlmIGl0IHdhcyBjYWNoZWQsCisrIyBzbyB0aGF0IHRoZSB1c2VyIGNhbiBzaG9ydC1jaXJjdWl0IHRoaXMgdGVzdCBmb3IgY29tcGlsZXJzIHVua25vd24gdG8KKysjIEF1dG9jb25mLgorK2ZvciBhY19maWxlIGluICRhY19maWxlcyAnJworK2RvCisrICB0ZXN0IC1mICIkYWNfZmlsZSIgfHwgY29udGludWUKKysgIGNhc2UgJGFjX2ZpbGUgaW4KKysgICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm1hcCB8ICouaW5mIHwgKi5kU1lNIHwgKi5vIHwgKi5vYmogKQorKwk7OworKyAgICBbYWJdLm91dCApCisrCSMgV2UgZm91bmQgdGhlIGRlZmF1bHQgZXhlY3V0YWJsZSwgYnV0IGV4ZWV4dD0nJyBpcyBtb3N0CisrCSMgY2VydGFpbmx5IHJpZ2h0LgorKwlicmVhazs7CisrICAgICouKiApCisrICAgICAgICBpZiB0ZXN0ICIke2FjX2N2X2V4ZWV4dCtzZXR9IiA9IHNldCAmJiB0ZXN0ICIkYWNfY3ZfZXhlZXh0IiAhPSBubzsKKysJdGhlbiA6OyBlbHNlCisrCSAgIGFjX2N2X2V4ZWV4dD1gZXhwciAiJGFjX2ZpbGUiIDogJ1teLl0qXChcLi4qXCknYAorKwlmaQorKwkjIFdlIHNldCBhY19jdl9leGVleHQgaGVyZSBiZWNhdXNlIHRoZSBsYXRlciB0ZXN0IGZvciBpdCBpcyBub3QKKysJIyBzYWZlOiBjcm9zcyBjb21waWxlcnMgbWF5IG5vdCBhZGQgdGhlIHN1ZmZpeCBpZiBnaXZlbiBhbiBgLW8nCisrCSMgYXJndW1lbnQsIHNvIHdlIG1heSBuZWVkIHRvIGtub3cgaXQgYXQgdGhhdCBwb2ludCBhbHJlYWR5LgorKwkjIEV2ZW4gaWYgdGhpcyBzZWN0aW9uIGxvb2tzIGNydWZ0eTogaXQgaGFzIHRoZSBhZHZhbnRhZ2Ugb2YKKysJIyBhY3R1YWxseSB3b3JraW5nLgorKwlicmVhazs7CisrICAgICogKQorKwlicmVhazs7CisrICBlc2FjCisrZG9uZQorK3Rlc3QgIiRhY19jdl9leGVleHQiID0gbm8gJiYgYWNfY3ZfZXhlZXh0PQorKworIGVsc2UKKy0gIGFjX2N2X3Byb2dfZ2NjPW5vCisrICBhY19maWxlPScnCisgZmkKKysKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfZmlsZSIgPiY1CisrJGFzX2VjaG8gIiRhY19maWxlIiA+JjY7IH0KKytpZiB0ZXN0IC16ICIkYWNfZmlsZSI7IHRoZW4KKysgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKysKKyt7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KKyt7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzCisrU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMKKytTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KKysgICB7IChleGl0IDc3KTsgZXhpdCA3NzsgfTsgfTsgfQorK2ZpCisrCisrYWNfZXhlZXh0PSRhY19jdl9leGVleHQKKysKKysjIENoZWNrIHRoYXQgdGhlIGNvbXBpbGVyIHByb2R1Y2VzIGV4ZWN1dGFibGVzIHdlIGNhbiBydW4uICBJZiBub3QsIGVpdGhlcgorKyMgdGhlIGNvbXBpbGVyIGlzIGJyb2tlbiwgb3Igd2UgY3Jvc3MgY29tcGlsZS4KKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciB3b3JrcyIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciB3b3Jrcy4uLiAiID4mNjsgfQorKyMgRklYTUU6IFRoZXNlIGNyb3NzIGNvbXBpbGVyIGhhY2tzIHNob3VsZCBiZSByZW1vdmVkIGZvciBBdXRvY29uZiAzLjAKKysjIElmIG5vdCBjcm9zcyBjb21waWxpbmcsIGNoZWNrIHRoYXQgd2UgY2FuIHJ1biBhIHNpbXBsZSBwcm9ncmFtLgorK2lmIHRlc3QgIiRjcm9zc19jb21waWxpbmciICE9IHllczsgdGhlbgorKyAgaWYgeyBhY190cnk9Jy4vJGFjX2ZpbGUnCisrICB7IChjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY190cnkiKSAyPiY1CisrICBhY19zdGF0dXM9JD8KKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorKyAgICBjcm9zc19jb21waWxpbmc9bm8KKysgIGVsc2UKKysgICAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSBtYXliZTsgdGhlbgorKwljcm9zc19jb21waWxpbmc9eWVzCisrICAgIGVsc2UKKysJeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9CisreyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBydW4gQyBjb21waWxlZCBwcm9ncmFtcy4KKytJZiB5b3UgbWVhbnQgdG8gY3Jvc3MgY29tcGlsZSwgdXNlIFxgLS1ob3N0Jy4KKytTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBydW4gQyBjb21waWxlZCBwcm9ncmFtcy4KKytJZiB5b3UgbWVhbnQgdG8gY3Jvc3MgY29tcGlsZSwgdXNlIFxgLS1ob3N0Jy4KKytTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KKysgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07IH0KKysgICAgZmkKKysgIGZpCisgZmkKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQorKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorKworK3JtIC1mIC1yIGEub3V0IGEub3V0LmRTWU0gYS5leGUgY29uZnRlc3QkYWNfY3ZfZXhlZXh0IGIub3V0CisrYWNfY2xlYW5fZmlsZXM9JGFjX2NsZWFuX2ZpbGVzX3NhdmUKKysjIENoZWNrIHRoYXQgdGhlIGNvbXBpbGVyIHByb2R1Y2VzIGV4ZWN1dGFibGVzIHdlIGNhbiBydW4uICBJZiBub3QsIGVpdGhlcgorKyMgdGhlIGNvbXBpbGVyIGlzIGJyb2tlbiwgb3Igd2UgY3Jvc3MgY29tcGlsZS4KKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgY3Jvc3MgY29tcGlsaW5nIiA+JjUKKyskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSBjcm9zcyBjb21waWxpbmcuLi4gIiA+JjY7IH0KKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkY3Jvc3NfY29tcGlsaW5nIiA+JjUKKyskYXNfZWNobyAiJGNyb3NzX2NvbXBpbGluZyIgPiY2OyB9CisrCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBzdWZmaXggb2YgZXhlY3V0YWJsZXMiID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBzdWZmaXggb2YgZXhlY3V0YWJsZXMuLi4gIiA+JjY7IH0KKytpZiB7IChhY190cnk9IiRhY19saW5rIgorK2Nhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX2xpbmsiKSAyPiY1CisrICBhY19zdGF0dXM9JD8KKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgdGhlbgorKyAgIyBJZiBib3RoIGBjb25mdGVzdC5leGUnIGFuZCBgY29uZnRlc3QnIGFyZSBgcHJlc2VudCcgKHdlbGwsIG9ic2VydmFibGUpCisrIyBjYXRjaCBgY29uZnRlc3QuZXhlJy4gIEZvciBpbnN0YW5jZSB3aXRoIEN5Z3dpbiwgYGxzIGNvbmZ0ZXN0JyB3aWxsCisrIyB3b3JrIHByb3Blcmx5IChpLmUuLCByZWZlciB0byBgY29uZnRlc3QuZXhlJyksIHdoaWxlIGl0IHdvbid0IHdpdGgKKysjIGBybScuCisrZm9yIGFjX2ZpbGUgaW4gY29uZnRlc3QuZXhlIGNvbmZ0ZXN0IGNvbmZ0ZXN0Lio7IGRvCisrICB0ZXN0IC1mICIkYWNfZmlsZSIgfHwgY29udGludWUKKysgIGNhc2UgJGFjX2ZpbGUgaW4KKysgICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm1hcCB8ICouaW5mIHwgKi5kU1lNIHwgKi5vIHwgKi5vYmogKSA7OworKyAgICAqLiogKSBhY19jdl9leGVleHQ9YGV4cHIgIiRhY19maWxlIiA6ICdbXi5dKlwoXC4uKlwpJ2AKKysJICBicmVhazs7CisrICAgICogKSBicmVhazs7CisrICBlc2FjCisrZG9uZQorK2Vsc2UKKysgIHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorK3sgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzdWZmaXggb2YgZXhlY3V0YWJsZXM6IGNhbm5vdCBjb21waWxlIGFuZCBsaW5rCisrU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzdWZmaXggb2YgZXhlY3V0YWJsZXM6IGNhbm5vdCBjb21waWxlIGFuZCBsaW5rCisrU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9CisrICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OyB9CisrZmkKKysKKytybSAtZiBjb25mdGVzdCRhY19jdl9leGVleHQKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfZXhlZXh0IiA+JjUKKyskYXNfZWNobyAiJGFjX2N2X2V4ZWV4dCIgPiY2OyB9CisrCisrcm0gLWYgY29uZnRlc3QuJGFjX2V4dAorK0VYRUVYVD0kYWNfY3ZfZXhlZXh0CisrYWNfZXhlZXh0PSRFWEVFWFQKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXMiID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzLi4uICIgPiY2OyB9CisraWYgdGVzdCAiJHthY19jdl9vYmpleHQrc2V0fSIgPSBzZXQ7IHRoZW4KKysgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisrZWxzZQorKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyAKKy1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ2NjIiAxPiY2CisraW50CisrbWFpbiAoKQorK3sKKysKKysgIDsKKysgIHJldHVybiAwOworK30KKytfQUNFT0YKKytybSAtZiBjb25mdGVzdC5vIGNvbmZ0ZXN0Lm9iagorK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfY29tcGlsZSIpIDI+JjUKKysgIGFjX3N0YXR1cz0kPworKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9OyB0aGVuCisrICBmb3IgYWNfZmlsZSBpbiBjb25mdGVzdC5vIGNvbmZ0ZXN0Lm9iaiBjb25mdGVzdC4qOyBkbworKyAgdGVzdCAtZiAiJGFjX2ZpbGUiIHx8IGNvbnRpbnVlOworKyAgY2FzZSAkYWNfZmlsZSBpbgorKyAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubWFwIHwgKi5pbmYgfCAqLmRTWU0gKSA7OworKyAgICAqKSBhY19jdl9vYmpleHQ9YGV4cHIgIiRhY19maWxlIiA6ICcuKlwuXCguKlwpJ2AKKysgICAgICAgYnJlYWs7OworKyAgZXNhYworK2RvbmUKKytlbHNlCisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisreyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9CisreyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXM6IGNhbm5vdCBjb21waWxlCisrU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzOiBjYW5ub3QgY29tcGlsZQorK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQorKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTsgfQorK2ZpCisrCisrcm0gLWYgY29uZnRlc3QuJGFjX2N2X29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisrZmkKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfb2JqZXh0IiA+JjUKKyskYXNfZWNobyAiJGFjX2N2X29iamV4dCIgPiY2OyB9CisrT0JKRVhUPSRhY19jdl9vYmpleHQKKythY19vYmpleHQ9JE9CSkVYVAorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMgY29tcGlsZXIiID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQyBjb21waWxlci4uLiAiID4mNjsgfQorK2lmIHRlc3QgIiR7YWNfY3ZfY19jb21waWxlcl9nbnUrc2V0fSIgPSBzZXQ7IHRoZW4KKysgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisrZWxzZQorKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyAKKy1pZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgorK2ludAorK21haW4gKCkKKyt7CisrI2lmbmRlZiBfX0dOVUNfXworKyAgICAgICBjaG9rZSBtZQorKyNlbmRpZgorKworKyAgOworKyAgcmV0dXJuIDA7CisrfQorK19BQ0VPRgorK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKKytpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorK2Nhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorKyAgYWNfc3RhdHVzPSQ/CisrICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorKyAgcm0gLWYgY29uZnRlc3QuZXIxCisrICBjYXQgY29uZnRlc3QuZXJyID4mNQorKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKysJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorKyAgYWNfY29tcGlsZXJfZ251PXllcworK2Vsc2UKKysgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKysKKysJYWNfY29tcGlsZXJfZ251PW5vCisrZmkKKysKKytybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKythY19jdl9jX2NvbXBpbGVyX2dudT0kYWNfY29tcGlsZXJfZ251CisrCisrZmkKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfY19jb21waWxlcl9nbnUiID4mNQorKyRhc19lY2hvICIkYWNfY3ZfY19jb21waWxlcl9nbnUiID4mNjsgfQorK2lmIHRlc3QgJGFjX2NvbXBpbGVyX2dudSA9IHllczsgdGhlbgorICAgR0NDPXllcworIGVsc2UKKyAgIEdDQz0KKyBmaQorK2FjX3Rlc3RfQ0ZMQUdTPSR7Q0ZMQUdTK3NldH0KKythY19zYXZlX0NGTEFHUz0kQ0ZMQUdTCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLWciID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLWcuLi4gIiA+JjY7IH0KKytpZiB0ZXN0ICIke2FjX2N2X3Byb2dfY2NfZytzZXR9IiA9IHNldDsgdGhlbgorKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKytlbHNlCisrICBhY19zYXZlX2Nfd2Vycm9yX2ZsYWc9JGFjX2Nfd2Vycm9yX2ZsYWcKKysgICBhY19jX3dlcnJvcl9mbGFnPXllcworKyAgIGFjX2N2X3Byb2dfY2NfZz1ubworKyAgIENGTEFHUz0iLWciCisrICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKysKKytpbnQKKyttYWluICgpCisreworKworKyAgOworKyAgcmV0dXJuIDA7CisrfQorK19BQ0VPRgorK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKKytpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorK2Nhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorKyAgYWNfc3RhdHVzPSQ/CisrICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorKyAgcm0gLWYgY29uZnRlc3QuZXIxCisrICBjYXQgY29uZnRlc3QuZXJyID4mNQorKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKysJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorKyAgYWNfY3ZfcHJvZ19jY19nPXllcworK2Vsc2UKKysgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAKKy1hY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKKy1hY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKKy1DRkxBR1M9CistZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKKy1lY2hvICJjb25maWd1cmU6Nzg2OiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQorLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2NjX2cnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKysJQ0ZMQUdTPSIiCisrICAgICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKysKKytpbnQKKyttYWluICgpCisreworKworKyAgOworKyAgcmV0dXJuIDA7CisrfQorK19BQ0VPRgorK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKKytpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorK2Nhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorKyAgYWNfc3RhdHVzPSQ/CisrICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorKyAgcm0gLWYgY29uZnRlc3QuZXIxCisrICBjYXQgY29uZnRlc3QuZXJyID4mNQorKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKysJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorKyAgOgorIGVsc2UKKy0gIGVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuYworLWlmIHRlc3QgLXogImAke0NDLWNjfSAtZyAtYyBjb25mdGVzdC5jIDI+JjFgIjsgdGhlbgorKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cisrc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorKworKwlhY19jX3dlcnJvcl9mbGFnPSRhY19zYXZlX2Nfd2Vycm9yX2ZsYWcKKysJIENGTEFHUz0iLWciCisrCSBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworKworK2ludAorK21haW4gKCkKKyt7CisrCisrICA7CisrICByZXR1cm4gMDsKKyt9CisrX0FDRU9GCisrcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisrCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisrICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgICBhY19jdl9wcm9nX2NjX2c9eWVzCisgZWxzZQorLSAgYWNfY3ZfcHJvZ19jY19nPW5vCisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrCisrZmkKKysKKytybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyBmaQorLXJtIC1mIGNvbmZ0ZXN0KgorIAorK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorIGZpCisgCistZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2ciIDE+JjYKKytybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKysgICBhY19jX3dlcnJvcl9mbGFnPSRhY19zYXZlX2Nfd2Vycm9yX2ZsYWcKKytmaQorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9wcm9nX2NjX2ciID4mNQorKyRhc19lY2hvICIkYWNfY3ZfcHJvZ19jY19nIiA+JjY7IH0KKyBpZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCistICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKKysgIENGTEFHUz0kYWNfc2F2ZV9DRkxBR1MKKyBlbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgorICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICAgQ0ZMQUdTPSItZyAtTzIiCitAQCAtODEyLDEzNiArMjc1MSw0ODEgQEAKKyAgICAgQ0ZMQUdTPQorICAgZmkKKyBmaQorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJENDIG9wdGlvbiB0byBhY2NlcHQgSVNPIEM4OSIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRDQyBvcHRpb24gdG8gYWNjZXB0IElTTyBDODkuLi4gIiA+JjY7IH0KKytpZiB0ZXN0ICIke2FjX2N2X3Byb2dfY2NfYzg5K3NldH0iID0gc2V0OyB0aGVuCisrICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorK2Vsc2UKKysgIGFjX2N2X3Byb2dfY2NfYzg5PW5vCisrYWNfc2F2ZV9DQz0kQ0MKKytjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworKyNpbmNsdWRlIDxzdGRhcmcuaD4KKysjaW5jbHVkZSA8c3RkaW8uaD4KKysjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisrI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisrLyogTW9zdCBvZiB0aGUgZm9sbG93aW5nIHRlc3RzIGFyZSBzdG9sZW4gZnJvbSBSQ1MgNS43J3Mgc3JjL2NvbmYuc2guICAqLworK3N0cnVjdCBidWYgeyBpbnQgeDsgfTsKKytGSUxFICogKCpyY3NvcGVuKSAoc3RydWN0IGJ1ZiAqLCBzdHJ1Y3Qgc3RhdCAqLCBpbnQpOworK3N0YXRpYyBjaGFyICplIChwLCBpKQorKyAgICAgY2hhciAqKnA7CisrICAgICBpbnQgaTsKKyt7CisrICByZXR1cm4gcFtpXTsKKyt9Cisrc3RhdGljIGNoYXIgKmYgKGNoYXIgKiAoKmcpIChjaGFyICoqLCBpbnQpLCBjaGFyICoqcCwgLi4uKQorK3sKKysgIGNoYXIgKnM7CisrICB2YV9saXN0IHY7CisrICB2YV9zdGFydCAodixwKTsKKysgIHMgPSBnIChwLCB2YV9hcmcgKHYsaW50KSk7CisrICB2YV9lbmQgKHYpOworKyAgcmV0dXJuIHM7CisrfQorIAorLWZvciBhY19wcm9nIGluICRDQ0MgYysrIGcrKyBnY2MgQ0MgY3h4IGNjKysgY2wKKysvKiBPU0YgNC4wIENvbXBhcSBjYyBpcyBzb21lIHNvcnQgb2YgYWxtb3N0LUFOU0kgYnkgZGVmYXVsdC4gIEl0IGhhcworKyAgIGZ1bmN0aW9uIHByb3RvdHlwZXMgYW5kIHN0dWZmLCBidXQgbm90ICdceEhIJyBoZXggY2hhcmFjdGVyIGNvbnN0YW50cy4KKysgICBUaGVzZSBkb24ndCBwcm92b2tlIGFuIGVycm9yIHVuZm9ydHVuYXRlbHksIGluc3RlYWQgYXJlIHNpbGVudGx5IHRyZWF0ZWQKKysgICBhcyAneCcuICBUaGUgZm9sbG93aW5nIGluZHVjZXMgYW4gZXJyb3IsIHVudGlsIC1zdGQgaXMgYWRkZWQgdG8gZ2V0CisrICAgcHJvcGVyIEFOU0kgbW9kZS4gIEN1cmlvdXNseSAnXHgwMCchPSd4JyBhbHdheXMgY29tZXMgb3V0IHRydWUsIGZvciBhbgorKyAgIGFycmF5IHNpemUgYXQgbGVhc3QuICBJdCdzIG5lY2Vzc2FyeSB0byB3cml0ZSAnXHgwMCc9PTAgdG8gZ2V0IHNvbWV0aGluZworKyAgIHRoYXQncyB0cnVlIG9ubHkgd2l0aCAtc3RkLiAgKi8KKytpbnQgb3NmNF9jY19hcnJheSBbJ1x4MDAnID09IDAgPyAxIDogLTFdOworKworKy8qIElCTSBDIDYgZm9yIEFJWCBpcyBhbG1vc3QtQU5TSSBieSBkZWZhdWx0LCBidXQgaXQgcmVwbGFjZXMgbWFjcm8gcGFyYW1ldGVycworKyAgIGluc2lkZSBzdHJpbmdzIGFuZCBjaGFyYWN0ZXIgY29uc3RhbnRzLiAgKi8KKysjZGVmaW5lIEZPTyh4KSAneCcKKytpbnQgeGxjNl9jY19hcnJheVtGT08oYSkgPT0gJ3gnID8gMSA6IC0xXTsKKysKKytpbnQgdGVzdCAoaW50IGksIGRvdWJsZSB4KTsKKytzdHJ1Y3QgczEge2ludCAoKmYpIChpbnQgYSk7fTsKKytzdHJ1Y3QgczIge2ludCAoKmYpIChkb3VibGUgYSk7fTsKKytpbnQgcGFpcm5hbWVzIChpbnQsIGNoYXIgKiosIEZJTEUgKigqKShzdHJ1Y3QgYnVmICosIHN0cnVjdCBzdGF0ICosIGludCksIGludCwgaW50KTsKKytpbnQgYXJnYzsKKytjaGFyICoqYXJndjsKKytpbnQKKyttYWluICgpCisreworK3JldHVybiBmIChlLCBhcmd2LCAwKSAhPSBhcmd2WzBdICB8fCAgZiAoZSwgYXJndiwgMSkgIT0gYXJndlsxXTsKKysgIDsKKysgIHJldHVybiAwOworK30KKytfQUNFT0YKKytmb3IgYWNfYXJnIGluICcnIC1xbGFuZ2x2bD1leHRjODkgLXFsYW5nbHZsPWFuc2kgLXN0ZCBcCisrCS1BZSAiLUFhIC1EX0hQVVhfU09VUkNFIiAiLVhjIC1EX19FWFRFTlNJT05TX18iCisgZG8KKy0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KKy1zZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKKy1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZTo4MjI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CistaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ1hYJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKy0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CisrICBDQz0iJGFjX3NhdmVfQ0MgJGFjX2FyZyIKKysgIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKKytpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorK2Nhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorKyAgYWNfc3RhdHVzPSQ/CisrICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorKyAgcm0gLWYgY29uZnRlc3QuZXIxCisrICBjYXQgY29uZnRlc3QuZXJyID4mNQorKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKysJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorKyAgYWNfY3ZfcHJvZ19jY19jODk9JGFjX2FyZworK2Vsc2UKKysgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKysKKysKKytmaQorKworK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQKKysgIHRlc3QgIngkYWNfY3ZfcHJvZ19jY19jODkiICE9ICJ4bm8iICYmIGJyZWFrCisrZG9uZQorK3JtIC1mIGNvbmZ0ZXN0LiRhY19leHQKKytDQz0kYWNfc2F2ZV9DQworKworK2ZpCisrIyBBQ19DQUNIRV9WQUwKKytjYXNlICJ4JGFjX2N2X3Byb2dfY2NfYzg5IiBpbgorKyAgeCkKKysgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm9uZSBuZWVkZWQiID4mNQorKyRhc19lY2hvICJub25lIG5lZWRlZCIgPiY2OyB9IDs7CisrICB4bm8pCisrICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHVuc3VwcG9ydGVkIiA+JjUKKyskYXNfZWNobyAidW5zdXBwb3J0ZWQiID4mNjsgfSA7OworKyAgKikKKysgICAgQ0M9IiRDQyAkYWNfY3ZfcHJvZ19jY19jODkiCisrICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9wcm9nX2NjX2M4OSIgPiY1CisrJGFzX2VjaG8gIiRhY19jdl9wcm9nX2NjX2M4OSIgPiY2OyB9IDs7CisrZXNhYworKworKworK2FjX2V4dD1jCisrYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKKythY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCisrYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKKythY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisrCisrYWNfZXh0PWNwcAorK2FjX2NwcD0nJENYWENQUCAkQ1BQRkxBR1MnCisrYWNfY29tcGlsZT0nJENYWCAtYyAkQ1hYRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworK2FjX2xpbms9JyRDWFggLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDWFhGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCisrYWNfY29tcGlsZXJfZ251PSRhY19jdl9jeHhfY29tcGlsZXJfZ251CisraWYgdGVzdCAteiAiJENYWCI7IHRoZW4KKysgIGlmIHRlc3QgLW4gIiRDQ0MiOyB0aGVuCisrICAgIENYWD0kQ0NDCisrICBlbHNlCisrICAgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKysgIGZvciBhY19wcm9nIGluIGcrKyBjKysgZ3BwIGFDQyBDQyBjeHggY2MrKyBjbC5leGUgRkNDIEtDQyBSQ0MgeGxDX3IgeGxDCisrICBkbworKyAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY190b29sX3ByZWZpeCRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KKytzZXQgZHVtbXkgJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2c7IGFjX3dvcmQ9JDIKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KKytpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ1hYK3NldH0iID0gc2V0OyB0aGVuCisrICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorIGVsc2UKKyAgIGlmIHRlc3QgLW4gIiRDWFgiOyB0aGVuCisgICBhY19jdl9wcm9nX0NYWD0iJENYWCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCisgZWxzZQorLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKy0gIGFjX2R1bW15PSIkUEFUSCIKKy0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKy0gICAgICBhY19jdl9wcm9nX0NYWD0iJGFjX3Byb2ciCistICAgICAgYnJlYWsKKy0gICAgZmkKKy0gIGRvbmUKKy0gIElGUz0iJGFjX3NhdmVfaWZzIgorK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKKytmb3IgYXNfZGlyIGluICRQQVRICisrZG8KKysgIElGUz0kYXNfc2F2ZV9JRlMKKysgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisrICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKysgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKysgICAgYWNfY3ZfcHJvZ19DWFg9IiRhY190b29sX3ByZWZpeCRhY19wcm9nIgorKyAgICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorKyAgICBicmVhayAyCisrICBmaQorK2RvbmUKKytkb25lCisrSUZTPSRhc19zYXZlX0lGUworKworIGZpCisgZmkKKy1DWFg9IiRhY19jdl9wcm9nX0NYWCIKKytDWFg9JGFjX2N2X3Byb2dfQ1hYCisgaWYgdGVzdCAtbiAiJENYWCI7IHRoZW4KKy0gIGVjaG8gIiRhY190IiIkQ1hYIiAxPiY2CisrICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQ1hYIiA+JjUKKyskYXNfZWNobyAiJENYWCIgPiY2OyB9CisgZWxzZQorLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CisrICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CisrJGFzX2VjaG8gIm5vIiA+JjY7IH0KKyBmaQorIAorLXRlc3QgLW4gIiRDWFgiICYmIGJyZWFrCisrCisrICAgIHRlc3QgLW4gIiRDWFgiICYmIGJyZWFrCisrICBkb25lCisrZmkKKytpZiB0ZXN0IC16ICIkQ1hYIjsgdGhlbgorKyAgYWNfY3RfQ1hYPSRDWFgKKysgIGZvciBhY19wcm9nIGluIGcrKyBjKysgZ3BwIGFDQyBDQyBjeHggY2MrKyBjbC5leGUgRkNDIEtDQyBSQ0MgeGxDX3IgeGxDCisrZG8KKysgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorK3NldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQorK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9DWFgrc2V0fSIgPSBzZXQ7IHRoZW4KKysgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisrZWxzZQorKyAgaWYgdGVzdCAtbiAiJGFjX2N0X0NYWCI7IHRoZW4KKysgIGFjX2N2X3Byb2dfYWNfY3RfQ1hYPSIkYWNfY3RfQ1hYIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KKytlbHNlCisrYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorK2ZvciBhc19kaXIgaW4gJFBBVEgKKytkbworKyAgSUZTPSRhc19zYXZlX0lGUworKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKysgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorKyAgICBhY19jdl9wcm9nX2FjX2N0X0NYWD0iJGFjX3Byb2ciCisrICAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisrICAgIGJyZWFrIDIKKysgIGZpCisrZG9uZQorIGRvbmUKKy10ZXN0IC1uICIkQ1hYIiB8fCBDWFg9ImdjYyIKKytJRlM9JGFzX3NhdmVfSUZTCisrCisrZmkKKytmaQorK2FjX2N0X0NYWD0kYWNfY3ZfcHJvZ19hY19jdF9DWFgKKytpZiB0ZXN0IC1uICIkYWNfY3RfQ1hYIjsgdGhlbgorKyAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N0X0NYWCIgPiY1CisrJGFzX2VjaG8gIiRhY19jdF9DWFgiID4mNjsgfQorK2Vsc2UKKysgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKKyskYXNfZWNobyAibm8iID4mNjsgfQorK2ZpCisgCisgCistZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQysrIGNvbXBpbGVyICgkQ1hYICRDWFhGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZTo4NTQ6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMrKyBjb21waWxlciAoJENYWCAkQ1hYRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKKysgIHRlc3QgLW4gIiRhY19jdF9DWFgiICYmIGJyZWFrCisrZG9uZQorIAorLWFjX2V4dD1DCistIyBDWFhGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCistYWNfY3BwPSckQ1hYQ1BQICRDUFBGTEFHUycKKy1hY19jb21waWxlPScke0NYWC1nKyt9IC1jICRDWFhGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworLWFjX2xpbms9JyR7Q1hYLWcrK30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENYWEZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCistY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2N4eF9jcm9zcworLQorLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDwgRU9GCistCistI2xpbmUgODY1ICJjb25maWd1cmUiCistI2luY2x1ZGUgImNvbmZkZWZzLmgiCistCistaW50IG1haW4oKXtyZXR1cm4oMCk7fQorLUVPRgorLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6ODcwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKy0gIGFjX2N2X3Byb2dfY3h4X3dvcmtzPXllcworLSAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgorLSAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCistICAgIGFjX2N2X3Byb2dfY3h4X2Nyb3NzPW5vCisrICBpZiB0ZXN0ICJ4JGFjX2N0X0NYWCIgPSB4OyB0aGVuCisrICAgIENYWD0iZysrIgorICAgZWxzZQorLSAgICBhY19jdl9wcm9nX2N4eF9jcm9zcz15ZXMKKysgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgorK3llczopCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorK2FjX3Rvb2xfd2FybmVkPXllcyA7OworK2VzYWMKKysgICAgQ1hYPSRhY19jdF9DWFgKKyAgIGZpCistZWxzZQorLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKy0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorLSAgYWNfY3ZfcHJvZ19jeHhfd29ya3M9bm8KKyBmaQorLXJtIC1mciBjb25mdGVzdCoKKy1hY19leHQ9YworLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KKy1hY19jcHA9JyRDUFAgJENQUEZMQUdTJworLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKKy1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCistY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCisgCistZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2N4eF93b3JrcyIgMT4mNgorLWlmIHRlc3QgJGFjX2N2X3Byb2dfY3h4X3dvcmtzID0gbm87IHRoZW4KKy0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQysrIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KKysgIGZpCisgZmkKKy1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDKysgY29tcGlsZXIgKCRDWFggJENYWEZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKKy1lY2hvICJjb25maWd1cmU6ODk2OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDKysgY29tcGlsZXIgKCRDWFggJENYWEZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKKy1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY3h4X2Nyb3NzIiAxPiY2CistY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2N4eF9jcm9zcworKyMgUHJvdmlkZSBzb21lIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21waWxlci4KKyskYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBDKysgY29tcGlsZXIgdmVyc2lvbiIgPiY1Cisrc2V0IFggJGFjX2NvbXBpbGUKKythY19jb21waWxlcj0kMgorK3sgKGFjX3RyeT0iJGFjX2NvbXBpbGVyIC0tdmVyc2lvbiA+JjUiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfY29tcGlsZXIgLS12ZXJzaW9uID4mNSIpIDI+JjUKKysgIGFjX3N0YXR1cz0kPworKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9CisreyAoYWNfdHJ5PSIkYWNfY29tcGlsZXIgLXYgPiY1IgorK2Nhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX2NvbXBpbGVyIC12ID4mNSIpIDI+JjUKKysgIGFjX3N0YXR1cz0kPworKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9CisreyAoYWNfdHJ5PSIkYWNfY29tcGlsZXIgLVYgPiY1IgorK2Nhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX2NvbXBpbGVyIC1WID4mNSIpIDI+JjUKKysgIGFjX3N0YXR1cz0kPworKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9CisrCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQysrIGNvbXBpbGVyIiA+JjUKKyskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyB0aGUgR05VIEMrKyBjb21waWxlci4uLiAiID4mNjsgfQorK2lmIHRlc3QgIiR7YWNfY3ZfY3h4X2NvbXBpbGVyX2dudStzZXR9IiA9IHNldDsgdGhlbgorKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKytlbHNlCisrICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworIAorLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDKysiIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZTo5MDE6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDKysiID4mNQorLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2d4eCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCistICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorLWVsc2UKKy0gIGNhdCA+IGNvbmZ0ZXN0LkMgPDxFT0YKKy0jaWZkZWYgX19HTlVDX18KKy0gIHllczsKKytpbnQKKyttYWluICgpCisreworKyNpZm5kZWYgX19HTlVDX18KKysgICAgICAgY2hva2UgbWUKKyAjZW5kaWYKKy1FT0YKKy1pZiB7IGFjX3RyeT0nJHtDWFgtZysrfSAtRSBjb25mdGVzdC5DJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo5MTA6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9OyB9IHwgZWdyZXAgeWVzID4vZGV2L251bGwgMj4mMTsgdGhlbgorLSAgYWNfY3ZfcHJvZ19neHg9eWVzCistZWxzZQorLSAgYWNfY3ZfcHJvZ19neHg9bm8KKy1maQorLWZpCisgCistZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2d4eCIgMT4mNgorLQorLWlmIHRlc3QgJGFjX2N2X3Byb2dfZ3h4ID0geWVzOyB0aGVuCisrICA7CisrICByZXR1cm4gMDsKKyt9CisrX0FDRU9GCisrcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworKwkgdGVzdCAteiAiJGFjX2N4eF93ZXJyb3JfZmxhZyIgfHwKKysJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKysgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKysgIGFjX2NvbXBpbGVyX2dudT15ZXMKKytlbHNlCisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrCWFjX2NvbXBpbGVyX2dudT1ubworK2ZpCisrCisrcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisrYWNfY3ZfY3h4X2NvbXBpbGVyX2dudT0kYWNfY29tcGlsZXJfZ251CisrCisrZmkKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfY3h4X2NvbXBpbGVyX2dudSIgPiY1CisrJGFzX2VjaG8gIiRhY19jdl9jeHhfY29tcGlsZXJfZ251IiA+JjY7IH0KKytpZiB0ZXN0ICRhY19jb21waWxlcl9nbnUgPSB5ZXM7IHRoZW4KKyAgIEdYWD15ZXMKKyBlbHNlCisgICBHWFg9CisgZmkKKythY190ZXN0X0NYWEZMQUdTPSR7Q1hYRkxBR1Mrc2V0fQorK2FjX3NhdmVfQ1hYRkxBR1M9JENYWEZMQUdTCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgJENYWCBhY2NlcHRzIC1nIiA+JjUKKyskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyICRDWFggYWNjZXB0cyAtZy4uLiAiID4mNjsgfQorK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19jeHhfZytzZXR9IiA9IHNldDsgdGhlbgorKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKytlbHNlCisrICBhY19zYXZlX2N4eF93ZXJyb3JfZmxhZz0kYWNfY3h4X3dlcnJvcl9mbGFnCisrICAgYWNfY3h4X3dlcnJvcl9mbGFnPXllcworKyAgIGFjX2N2X3Byb2dfY3h4X2c9bm8KKysgICBDWFhGTEFHUz0iLWciCisrICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKysKKytpbnQKKyttYWluICgpCisreworKworKyAgOworKyAgcmV0dXJuIDA7CisrfQorK19BQ0VPRgorK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKKytpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorK2Nhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorKyAgYWNfc3RhdHVzPSQ/CisrICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorKyAgcm0gLWYgY29uZnRlc3QuZXIxCisrICBjYXQgY29uZnRlc3QuZXJyID4mNQorKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKysJIHRlc3QgLXogIiRhY19jeHhfd2Vycm9yX2ZsYWciIHx8CisrCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisrICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisrICBhY19jdl9wcm9nX2N4eF9nPXllcworK2Vsc2UKKysgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKysKKysJQ1hYRkxBR1M9IiIKKysgICAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworKworK2ludAorK21haW4gKCkKKyt7CisgCistYWNfdGVzdF9DWFhGTEFHUz0iJHtDWFhGTEFHUytzZXR9IgorLWFjX3NhdmVfQ1hYRkxBR1M9IiRDWFhGTEFHUyIKKy1DWFhGTEFHUz0KKy1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q1hYLWcrK30gYWNjZXB0cyAtZyIiLi4uICRhY19jIiAxPiY2CistZWNobyAiY29uZmlndXJlOjkyOTogY2hlY2tpbmcgd2hldGhlciAke0NYWC1nKyt9IGFjY2VwdHMgLWciID4mNQorLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2N4eF9nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKy0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CisrICA7CisrICByZXR1cm4gMDsKKyt9CisrX0FDRU9GCisrcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworKwkgdGVzdCAteiAiJGFjX2N4eF93ZXJyb3JfZmxhZyIgfHwKKysJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKysgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKysgIDoKKyBlbHNlCistICBlY2hvICd2b2lkIGYoKXt9JyA+IGNvbmZ0ZXN0LmNjCistaWYgdGVzdCAteiAiYCR7Q1hYLWcrK30gLWcgLWMgY29uZnRlc3QuY2MgMj4mMWAiOyB0aGVuCisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrCWFjX2N4eF93ZXJyb3JfZmxhZz0kYWNfc2F2ZV9jeHhfd2Vycm9yX2ZsYWcKKysJIENYWEZMQUdTPSItZyIKKysJIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGNvbmZkZWZzLmguICAqLworK19BQ0VPRgorK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBlbmQgY29uZmRlZnMuaC4gICovCisrCisraW50CisrbWFpbiAoKQorK3sKKysKKysgIDsKKysgIHJldHVybiAwOworK30KKytfQUNFT0YKKytybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CisraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKKytjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKysgIGFjX3N0YXR1cz0kPworKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKysgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisrCSB0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIiB8fAorKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICAgYWNfY3ZfcHJvZ19jeHhfZz15ZXMKKyBlbHNlCistICBhY19jdl9wcm9nX2N4eF9nPW5vCisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrCisrZmkKKysKKytybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyBmaQorLXJtIC1mIGNvbmZ0ZXN0KgorIAorK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorIGZpCisgCistZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2N4eF9nIiAxPiY2Cisrcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisrICAgYWNfY3h4X3dlcnJvcl9mbGFnPSRhY19zYXZlX2N4eF93ZXJyb3JfZmxhZworK2ZpCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3Byb2dfY3h4X2ciID4mNQorKyRhc19lY2hvICIkYWNfY3ZfcHJvZ19jeHhfZyIgPiY2OyB9CisgaWYgdGVzdCAiJGFjX3Rlc3RfQ1hYRkxBR1MiID0gc2V0OyB0aGVuCistICBDWFhGTEFHUz0iJGFjX3NhdmVfQ1hYRkxBR1MiCisrICBDWFhGTEFHUz0kYWNfc2F2ZV9DWFhGTEFHUworIGVsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jeHhfZyA9IHllczsgdGhlbgorICAgaWYgdGVzdCAiJEdYWCIgPSB5ZXM7IHRoZW4KKyAgICAgQ1hYRkxBR1M9Ii1nIC1PMiIKK0BAIC05NTUsNzYgKzMyMzksNDIgQEAKKyAgICAgQ1hYRkxBR1M9CisgICBmaQorIGZpCistCistZm9yIGFjX2RlY2xhcmF0aW9uIGluIFwKKy0gICAnJ1wKKy0gICAnI2luY2x1ZGUgPHN0ZGxpYi5oPicgXAorLSAgICdleHRlcm4gIkMiIHZvaWQgc3RkOjpleGl0IChpbnQpIHRocm93ICgpOyB1c2luZyBzdGQ6OmV4aXQ7JyBcCistICAgJ2V4dGVybiAiQyIgdm9pZCBzdGQ6OmV4aXQgKGludCk7IHVzaW5nIHN0ZDo6ZXhpdDsnIFwKKy0gICAnZXh0ZXJuICJDIiB2b2lkIGV4aXQgKGludCkgdGhyb3cgKCk7JyBcCistICAgJ2V4dGVybiAiQyIgdm9pZCBleGl0IChpbnQpOycgXAorLSAgICd2b2lkIGV4aXQgKGludCk7JworLWRvCistICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCistI2xpbmUgOTcwICJjb25maWd1cmUiCistI2luY2x1ZGUgImNvbmZkZWZzLmgiCistI2luY2x1ZGUgPHN0ZGxpYi5oPgorLSRhY19kZWNsYXJhdGlvbgorLWludCBtYWluKCkgeworLWV4aXQgKDQyKTsKKy07IHJldHVybiAwOyB9CistRU9GCistaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo5Nzg6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKy0gIDoKKy1lbHNlCistICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CistICBybSAtcmYgY29uZnRlc3QqCistICBjb250aW51ZQorLWZpCistcm0gLWYgY29uZnRlc3QqCistICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCistI2xpbmUgOTg4ICJjb25maWd1cmUiCistI2luY2x1ZGUgImNvbmZkZWZzLmgiCistJGFjX2RlY2xhcmF0aW9uCistaW50IG1haW4oKSB7CistZXhpdCAoNDIpOworLTsgcmV0dXJuIDA7IH0KKy1FT0YKKy1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjk5NTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorLSAgYnJlYWsKKy1lbHNlCistICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CistZmkKKy1ybSAtZiBjb25mdGVzdCoKKy1kb25lCistaWYgdGVzdCAtbiAiJGFjX2RlY2xhcmF0aW9uIjsgdGhlbgorLSAgZWNobyAnI2lmZGVmIF9fY3BsdXNwbHVzJyA+PmNvbmZkZWZzLmgKKy0gIGVjaG8gJGFjX2RlY2xhcmF0aW9uICAgICAgPj5jb25mZGVmcy5oCistICBlY2hvICcjZW5kaWYnICAgICAgICAgICAgID4+Y29uZmRlZnMuaAorLWZpCistCisrYWNfZXh0PWMKKythY19jcHA9JyRDUFAgJENQUEZMQUdTJworK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKKythY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKyAKKyBhY19hdXhfZGlyPQorLWZvciBhY19kaXIgaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi47IGRvCistICBpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC1zaDsgdGhlbgorK2ZvciBhY19kaXIgaW4gIiRzcmNkaXIiICIkc3JjZGlyLy4uIiAiJHNyY2Rpci8uLi8uLiI7IGRvCisrICBpZiB0ZXN0IC1mICIkYWNfZGlyL2luc3RhbGwtc2giOyB0aGVuCisgICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgorICAgICBicmVhaworLSAgZWxpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC5zaDsgdGhlbgorKyAgZWxpZiB0ZXN0IC1mICIkYWNfZGlyL2luc3RhbGwuc2giOyB0aGVuCisgICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgorICAgICBicmVhaworKyAgZWxpZiB0ZXN0IC1mICIkYWNfZGlyL3NodG9vbCI7IHRoZW4KKysgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCisrICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL3NodG9vbCBpbnN0YWxsIC1jIgorKyAgICBicmVhaworICAgZmkKKyBkb25lCisgaWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCistICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi4iIDE+JjI7IGV4aXQgMTsgfQorKyAgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiBcIiRzcmNkaXJcIiBcIiRzcmNkaXIvLi5cIiBcIiRzcmNkaXIvLi4vLi5cIiIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiBcIiRzcmNkaXJcIiBcIiRzcmNkaXIvLi5cIiBcIiRzcmNkaXIvLi4vLi5cIiIgPiYyO30KKysgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyBmaQorLWFjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKKy1hY19jb25maWdfc3ViPSRhY19hdXhfZGlyL2NvbmZpZy5zdWIKKy1hY19jb25maWd1cmU9JGFjX2F1eF9kaXIvY29uZmlndXJlICMgVGhpcyBzaG91bGQgYmUgQ3lnbnVzIGNvbmZpZ3VyZS4KKysKKysjIFRoZXNlIHRocmVlIHZhcmlhYmxlcyBhcmUgdW5kb2N1bWVudGVkIGFuZCB1bnN1cHBvcnRlZCwKKysjIGFuZCBhcmUgaW50ZW5kZWQgdG8gYmUgd2l0aGRyYXduIGluIGEgZnV0dXJlIEF1dG9jb25mIHJlbGVhc2UuCisrIyBUaGV5IGNhbiBjYXVzZSBzZXJpb3VzIHByb2JsZW1zIGlmIGEgYnVpbGRlcidzIHNvdXJjZSB0cmVlIGlzIGluIGEgZGlyZWN0b3J5CisrIyB3aG9zZSBmdWxsIG5hbWUgY29udGFpbnMgdW51c3VhbCBjaGFyYWN0ZXJzLgorK2FjX2NvbmZpZ19ndWVzcz0iJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcyIgICMgUGxlYXNlIGRvbid0IHVzZSB0aGlzIHZhci4KKythY19jb25maWdfc3ViPSIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgICMgUGxlYXNlIGRvbid0IHVzZSB0aGlzIHZhci4KKythY19jb25maWd1cmU9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWd1cmUiICAjIFBsZWFzZSBkb24ndCB1c2UgdGhpcyB2YXIuCisrCisgCisgIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCisgIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCitAQCAtMTAzMyw2MCArMzI4Myw4OSBAQAorICMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAorICMgSVJJWCAvc2Jpbi9pbnN0YWxsCisgIyBBSVggL2Jpbi9pbnN0YWxsCisrIyBBbWlnYU9TIC9DL2luc3RhbGwsIHdoaWNoIGluc3RhbGxzIGJvb3RibG9ja3Mgb24gZmxvcHB5IGRpc2NzCisgIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKKyAjIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKKyAjIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCisrIyBPUy8yJ3Mgc3lzdGVtIGluc3RhbGwsIHdoaWNoIGhhcyBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IHNlbWFudGljCisgIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCistZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2CistZWNobyAiY29uZmlndXJlOjEwNDI6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQorKyMgUmVqZWN0IGluc3RhbGwgcHJvZ3JhbXMgdGhhdCBjYW5ub3QgaW5zdGFsbCBtdWx0aXBsZSBmaWxlcy4KKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUgaW5zdGFsbCIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUgaW5zdGFsbC4uLiAiID4mNjsgfQorIGlmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgorLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKytpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgorKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKyBlbHNlCistICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IjoiCistICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbworLSAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KKy0gICAgY2FzZSAiJGFjX2Rpci8iIGluCistICAgIC98Li98Li8vfC9ldGMvKnwvdXNyL3NiaW4vKnwvdXNyL2V0Yy8qfC9zYmluLyp8L3Vzci9hZnN3cy9iaW4vKnwvdXNyL3VjYi8qKSA7OworLSAgICAqKQorLSAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCistICAgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290CistICAgICAgIyBieSBkZWZhdWx0LgorLSAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KKy0gICAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfcHJvZzsgdGhlbgorKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorK2ZvciBhc19kaXIgaW4gJFBBVEgKKytkbworKyAgSUZTPSRhc19zYXZlX0lGUworKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKysgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgorK2Nhc2UgJGFzX2Rpci8gaW4KKysgIC4vIHwgLi8vIHwgL2NDLyogfCBcCisrICAvZXRjLyogfCAvdXNyL3NiaW4vKiB8IC91c3IvZXRjLyogfCAvc2Jpbi8qIHwgL3Vzci9hZnN3cy9iaW4vKiB8IFwKKysgID86XFwvb3MyXFwvaW5zdGFsbFxcLyogfCA/OlxcL09TMlxcL0lOU1RBTExcXC8qIHwgXAorKyAgL3Vzci91Y2IvKiApIDs7CisrICAqKQorKyAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgorKyAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKKysgICAgIyBieSBkZWZhdWx0LgorKyAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCisrICAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisrCWlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAJICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgorLSAgICAgICAgICAgIGdyZXAgZHNwbXNnICRhY19kaXIvJGFjX3Byb2cgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisrCSAgICBncmVwIGRzcG1zZyAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCisgCSAgICA6CisrCSAgZWxpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgorKwkgICAgZ3JlcCBwd3BsdXMgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiID4vZGV2L251bGwgMj4mMTsgdGhlbgorKwkgICAgIyBwcm9ncmFtLXNwZWNpZmljIGluc3RhbGwgc2NyaXB0IHVzZWQgYnkgSFAgcHdwbHVzLS1kb24ndCB1c2UuCisrCSAgICA6CisgCSAgZWxzZQorLQkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYWNfZGlyLyRhY19wcm9nIC1jIgorLQkgICAgYnJlYWsgMgorKwkgICAgcm0gLXJmIGNvbmZ0ZXN0Lm9uZSBjb25mdGVzdC50d28gY29uZnRlc3QuZGlyCisrCSAgICBlY2hvIG9uZSA+IGNvbmZ0ZXN0Lm9uZQorKwkgICAgZWNobyB0d28gPiBjb25mdGVzdC50d28KKysJICAgIG1rZGlyIGNvbmZ0ZXN0LmRpcgorKwkgICAgaWYgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiIC1jIGNvbmZ0ZXN0Lm9uZSBjb25mdGVzdC50d28gImBwd2RgL2NvbmZ0ZXN0LmRpciIgJiYKKysJICAgICAgdGVzdCAtcyBjb25mdGVzdC5vbmUgJiYgdGVzdCAtcyBjb25mdGVzdC50d28gJiYKKysJICAgICAgdGVzdCAtcyBjb25mdGVzdC5kaXIvY29uZnRlc3Qub25lICYmCisrCSAgICAgIHRlc3QgLXMgY29uZnRlc3QuZGlyL2NvbmZ0ZXN0LnR3bworKwkgICAgdGhlbgorKwkgICAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQgLWMiCisrCSAgICAgIGJyZWFrIDMKKysJICAgIGZpCisgCSAgZmkKKyAJZmkKKyAgICAgICBkb25lCistICAgICAgOzsKKy0gICAgZXNhYworLSAgZG9uZQorLSAgSUZTPSIkYWNfc2F2ZV9JRlMiCisrICAgIGRvbmUKKysgICAgOzsKKytlc2FjCisrCisrZG9uZQorK0lGUz0kYXNfc2F2ZV9JRlMKKysKKytybSAtcmYgY29uZnRlc3Qub25lIGNvbmZ0ZXN0LnR3byBjb25mdGVzdC5kaXIKKyAKKyBmaQorICAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KKy0gICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKKysgICAgSU5TVEFMTD0kYWNfY3ZfcGF0aF9pbnN0YWxsCisgICBlbHNlCistICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKKy0gICAgIyBwYXRoIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCisrICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIERvbid0IGNhY2hlIGEKKysgICAgIyB2YWx1ZSBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAorICAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcworLSAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgorLSAgICBJTlNUQUxMPSIkYWNfaW5zdGFsbF9zaCIKKysgICAgIyByZW1vdmVkLCBvciBpZiB0aGUgdmFsdWUgaXMgYSByZWxhdGl2ZSBuYW1lLgorKyAgICBJTlNUQUxMPSRhY19pbnN0YWxsX3NoCisgICBmaQorIGZpCistZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2CisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJElOU1RBTEwiID4mNQorKyRhc19lY2hvICIkSU5TVEFMTCIgPiY2OyB9CisgCisgIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgorICMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCisgdGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JworIAorLXRlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTF9QUk9HUkFNfScKKyt0ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTEx9JworIAorIHRlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCisgCitAQCAtMTEwMiw3MyArMzM4MSw4NiBAQAorICNBQ19DSEVDS19QUk9HKEFVVE9DT05GLCBhdXRvY29uZiwgYXV0b2NvbmYsIHRydWUpCisgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJzdHJpcCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCisgc2V0IGR1bW15IHN0cmlwOyBhY193b3JkPSQyCistZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKKy1lY2hvICJjb25maWd1cmU6MTEwNzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKy1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19TVFJJUCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCistICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQorK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19TVFJJUCtzZXR9IiA9IHNldDsgdGhlbgorKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKyBlbHNlCisgICBpZiB0ZXN0IC1uICIkU1RSSVAiOyB0aGVuCisgICBhY19jdl9wcm9nX1NUUklQPSIkU1RSSVAiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorIGVsc2UKKy0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCistICBhY19kdW1teT0iJFBBVEgiCistICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKy0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKy0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCistICAgICAgYWNfY3ZfcHJvZ19TVFJJUD0ic3RyaXAiCistICAgICAgYnJlYWsKKy0gICAgZmkKKy0gIGRvbmUKKy0gIElGUz0iJGFjX3NhdmVfaWZzIgorK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKKytmb3IgYXNfZGlyIGluICRQQVRICisrZG8KKysgIElGUz0kYXNfc2F2ZV9JRlMKKysgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisrICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKysgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKysgICAgYWNfY3ZfcHJvZ19TVFJJUD0ic3RyaXAiCisrICAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisrICAgIGJyZWFrIDIKKysgIGZpCisrZG9uZQorK2RvbmUKKytJRlM9JGFzX3NhdmVfSUZTCisrCisgICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19TVFJJUCIgJiYgYWNfY3ZfcHJvZ19TVFJJUD0idHJ1ZSIKKyBmaQorIGZpCistU1RSSVA9IiRhY19jdl9wcm9nX1NUUklQIgorK1NUUklQPSRhY19jdl9wcm9nX1NUUklQCisgaWYgdGVzdCAtbiAiJFNUUklQIjsgdGhlbgorLSAgZWNobyAiJGFjX3QiIiRTVFJJUCIgMT4mNgorKyAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJFNUUklQIiA+JjUKKyskYXNfZWNobyAiJFNUUklQIiA+JjY7IH0KKyBlbHNlCistICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKysgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKKyskYXNfZWNobyAibm8iID4mNjsgfQorIGZpCisgCisgCisrCisgZm9yIGFjX3Byb2cgaW4gZ21ha2UgZ251bWFrZQorIGRvCistIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCisrICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KKyBzZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKKy1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZToxMTQwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1VfTUFLRScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCistICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQorK2lmIHRlc3QgIiR7YWNfY3ZfcGF0aF9VX01BS0Urc2V0fSIgPSBzZXQ7IHRoZW4KKysgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisgZWxzZQorLSAgY2FzZSAiJFVfTUFLRSIgaW4KKy0gIC8qKQorKyAgY2FzZSAkVV9NQUtFIGluCisrICBbXFwvXSogfCA/OltcXC9dKikKKyAgIGFjX2N2X3BhdGhfVV9NQUtFPSIkVV9NQUtFIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgIDs7CistICA/Oi8qKQkJCSAKKy0gIGFjX2N2X3BhdGhfVV9NQUtFPSIkVV9NQUtFIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCistICA7OworICAgKikKKy0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCistICBhY19kdW1teT0iJFBBVEgiCistICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCistICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCistICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorLSAgICAgIGFjX2N2X3BhdGhfVV9NQUtFPSIkYWNfZGlyLyRhY193b3JkIgorLSAgICAgIGJyZWFrCistICAgIGZpCistICBkb25lCistICBJRlM9IiRhY19zYXZlX2lmcyIKKysgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKKytmb3IgYXNfZGlyIGluICRQQVRICisrZG8KKysgIElGUz0kYXNfc2F2ZV9JRlMKKysgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisrICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKysgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKysgICAgYWNfY3ZfcGF0aF9VX01BS0U9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCisrICAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisrICAgIGJyZWFrIDIKKysgIGZpCisrZG9uZQorK2RvbmUKKytJRlM9JGFzX3NhdmVfSUZTCisrCisgICA7OworIGVzYWMKKyBmaQorLVVfTUFLRT0iJGFjX2N2X3BhdGhfVV9NQUtFIgorK1VfTUFLRT0kYWNfY3ZfcGF0aF9VX01BS0UKKyBpZiB0ZXN0IC1uICIkVV9NQUtFIjsgdGhlbgorLSAgZWNobyAiJGFjX3QiIiRVX01BS0UiIDE+JjYKKysgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRVX01BS0UiID4mNQorKyRhc19lY2hvICIkVV9NQUtFIiA+JjY7IH0KKyBlbHNlCistICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKysgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKKyskYXNfZWNobyAibm8iID4mNjsgfQorIGZpCisgCistdGVzdCAtbiAiJFVfTUFLRSIgJiYgYnJlYWsKKysKKysgIHRlc3QgLW4gIiRVX01BS0UiICYmIGJyZWFrCisgZG9uZQorIHRlc3QgLW4gIiRVX01BS0UiIHx8IFVfTUFLRT0ibWFrZSIKKyAKK0BAIC0xMTc2LDE4MiArMzQ2OCwxNTAgQEAKKyAKKyAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImRveHlnZW4iLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorIHNldCBkdW1teSBkb3h5Z2VuOyBhY193b3JkPSQyCistZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKKy1lY2hvICJjb25maWd1cmU6MTE4MTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKy1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9ET1hZR0VOJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKy0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CisraWYgdGVzdCAiJHthY19jdl9wYXRoX0RPWFlHRU4rc2V0fSIgPSBzZXQ7IHRoZW4KKysgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisgZWxzZQorLSAgY2FzZSAiJERPWFlHRU4iIGluCistICAvKikKKysgIGNhc2UgJERPWFlHRU4gaW4KKysgIFtcXC9dKiB8ID86W1xcL10qKQorICAgYWNfY3ZfcGF0aF9ET1hZR0VOPSIkRE9YWUdFTiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCisgICA7OworLSAgPzovKikJCQkgCistICBhY19jdl9wYXRoX0RPWFlHRU49IiRET1hZR0VOIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCistICA7OworICAgKikKKy0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCistICBhY19kdW1teT0iJFBBVEg6L3Vzci9sb2NhbC9iaW46L3Vzci9iaW4iCistICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCistICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCistICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorLSAgICAgIGFjX2N2X3BhdGhfRE9YWUdFTj0iJGFjX2Rpci8kYWNfd29yZCIKKy0gICAgICBicmVhaworLSAgICBmaQorLSAgZG9uZQorLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCisrICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCisrYXNfZHVtbXk9IiRQQVRIOi91c3IvbG9jYWwvYmluOi91c3IvYmluIgorK2ZvciBhc19kaXIgaW4gJGFzX2R1bW15CisrZG8KKysgIElGUz0kYXNfc2F2ZV9JRlMKKysgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisrICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKysgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKysgICAgYWNfY3ZfcGF0aF9ET1hZR0VOPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorKyAgICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorKyAgICBicmVhayAyCisrICBmaQorK2RvbmUKKytkb25lCisrSUZTPSRhc19zYXZlX0lGUworKworICAgOzsKKyBlc2FjCisgZmkKKy1ET1hZR0VOPSIkYWNfY3ZfcGF0aF9ET1hZR0VOIgorK0RPWFlHRU49JGFjX2N2X3BhdGhfRE9YWUdFTgorIGlmIHRlc3QgLW4gIiRET1hZR0VOIjsgdGhlbgorLSAgZWNobyAiJGFjX3QiIiRET1hZR0VOIiAxPiY2CisrICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkRE9YWUdFTiIgPiY1CisrJGFzX2VjaG8gIiRET1hZR0VOIiA+JjY7IH0KKyBlbHNlCistICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKysgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKKyskYXNfZWNobyAibm8iID4mNjsgfQorIGZpCisgCisgCisgCisgIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgorLWlmICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViIHN1bjQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKKy1lbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBydW4gJGFjX2NvbmZpZ19zdWIiIDE+JjI7IGV4aXQgMTsgfQorLWZpCistCistZWNobyAkYWNfbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2CistZWNobyAiY29uZmlndXJlOjEyMjE6IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQorLQorLWhvc3RfYWxpYXM9JGhvc3QKKy1jYXNlICIkaG9zdF9hbGlhcyIgaW4KKy1OT05FKQorLSAgY2FzZSAkbm9ub3B0IGluCistICBOT05FKQorLSAgICBpZiBob3N0X2FsaWFzPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX2d1ZXNzYDsgdGhlbiA6CistICAgIGVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGd1ZXNzIGhvc3QgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiIDE+JjI7IGV4aXQgMTsgfQorLSAgICBmaSA7OworLSAgKikgaG9zdF9hbGlhcz0kbm9ub3B0IDs7CistICBlc2FjIDs7CisrJFNIRUxMICIkYWNfYXV4X2Rpci9jb25maWcuc3ViIiBzdW40ID4vZGV2L251bGwgMj4mMSB8fAorKyAgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBydW4gJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgcnVuICRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViIiA+JjI7fQorKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorKworK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUuLi4gIiA+JjY7IH0KKytpZiB0ZXN0ICIke2FjX2N2X2J1aWxkK3NldH0iID0gc2V0OyB0aGVuCisrICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorK2Vsc2UKKysgIGFjX2J1aWxkX2FsaWFzPSRidWlsZF9hbGlhcworK3Rlc3QgIngkYWNfYnVpbGRfYWxpYXMiID0geCAmJgorKyAgYWNfYnVpbGRfYWxpYXM9YCRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzImAKKyt0ZXN0ICJ4JGFjX2J1aWxkX2FsaWFzIiA9IHggJiYKKysgIHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgZ3Vlc3MgYnVpbGQgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgZ3Vlc3MgYnVpbGQgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiID4mMjt9CisrICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisrYWNfY3ZfYnVpbGQ9YCRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgJGFjX2J1aWxkX2FsaWFzYCB8fAorKyAgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6ICRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViICRhY19idWlsZF9hbGlhcyBmYWlsZWQiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiAkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiAkYWNfYnVpbGRfYWxpYXMgZmFpbGVkIiA+JjI7fQorKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorKworK2ZpCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2J1aWxkIiA+JjUKKyskYXNfZWNobyAiJGFjX2N2X2J1aWxkIiA+JjY7IH0KKytjYXNlICRhY19jdl9idWlsZCBpbgorKyotKi0qKSA7OworKyopIHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBpbnZhbGlkIHZhbHVlIG9mIGNhbm9uaWNhbCBidWlsZCIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgdmFsdWUgb2YgY2Fub25pY2FsIGJ1aWxkIiA+JjI7fQorKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTs7CisgZXNhYworLQorLWhvc3Q9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRob3N0X2FsaWFzYAorLWhvc3RfY3B1PWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKKy1ob3N0X3ZlbmRvcj1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCistaG9zdF9vcz1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCistZWNobyAiJGFjX3QiIiRob3N0IiAxPiY2CistCistZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEN5Z3dpbiBlbnZpcm9ubWVudCIiLi4uICRhY19jIiAxPiY2CistZWNobyAiY29uZmlndXJlOjEyNDI6IGNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiID4mNQorLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jeWd3aW4nK3NldH0nYFwiID0gc2V0IjsgdGhlbgorLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKy1lbHNlCistICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCistI2xpbmUgMTI0NyAiY29uZmlndXJlIgorLSNpbmNsdWRlICJjb25mZGVmcy5oIgorLQorLWludCBtYWluKCkgeworLQorLSNpZm5kZWYgX19DWUdXSU5fXworLSNkZWZpbmUgX19DWUdXSU5fXyBfX0NZR1dJTjMyX18KKy0jZW5kaWYKKy1yZXR1cm4gX19DWUdXSU5fXzsKKy07IHJldHVybiAwOyB9CistRU9GCistaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjU4OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCistICBybSAtcmYgY29uZnRlc3QqCistICBhY19jdl9jeWd3aW49eWVzCistZWxzZQorLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKy0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorLSAgYWNfY3ZfY3lnd2luPW5vCistZmkKKy1ybSAtZiBjb25mdGVzdCoKKy1ybSAtZiBjb25mdGVzdCoKKytidWlsZD0kYWNfY3ZfYnVpbGQKKythY19zYXZlX0lGUz0kSUZTOyBJRlM9Jy0nCisrc2V0IHggJGFjX2N2X2J1aWxkCisrc2hpZnQKKytidWlsZF9jcHU9JDEKKytidWlsZF92ZW5kb3I9JDIKKytzaGlmdDsgc2hpZnQKKysjIFJlbWVtYmVyLCB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIElGUyBpcyB1c2VkIHRvIGNyZWF0ZSAkKiwKKysjIGV4Y2VwdCB3aXRoIG9sZCBzaGVsbHM6CisrYnVpbGRfb3M9JCoKKytJRlM9JGFjX3NhdmVfSUZTCisrY2FzZSAkYnVpbGRfb3MgaW4gKlwgKikgYnVpbGRfb3M9YGVjaG8gIiRidWlsZF9vcyIgfCBzZWQgJ3MvIC8tL2cnYDs7IGVzYWMKKysKKysKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZS4uLiAiID4mNjsgfQorK2lmIHRlc3QgIiR7YWNfY3ZfaG9zdCtzZXR9IiA9IHNldDsgdGhlbgorKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKytlbHNlCisrICBpZiB0ZXN0ICJ4JGhvc3RfYWxpYXMiID0geDsgdGhlbgorKyAgYWNfY3ZfaG9zdD0kYWNfY3ZfYnVpbGQKKytlbHNlCisrICBhY19jdl9ob3N0PWAkU0hFTEwgIiRhY19hdXhfZGlyL2NvbmZpZy5zdWIiICRob3N0X2FsaWFzYCB8fAorKyAgICB7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIgJGhvc3RfYWxpYXMgZmFpbGVkIiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIgJGhvc3RfYWxpYXMgZmFpbGVkIiA+JjI7fQorKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorIGZpCisgCistZWNobyAiJGFjX3QiIiRhY19jdl9jeWd3aW4iIDE+JjYKKy1DWUdXSU49CistdGVzdCAiJGFjX2N2X2N5Z3dpbiIgPSB5ZXMgJiYgQ1lHV0lOPXllcworLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBtaW5ndzMyIGVudmlyb25tZW50IiIuLi4gJGFjX2MiIDE+JjYKKy1lY2hvICJjb25maWd1cmU6MTI3NTogY2hlY2tpbmcgZm9yIG1pbmd3MzIgZW52aXJvbm1lbnQiID4mNQorLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9taW5ndzMyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKy0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CistZWxzZQorLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorLSNsaW5lIDEyODAgImNvbmZpZ3VyZSIKKy0jaW5jbHVkZSAiY29uZmRlZnMuaCIKKy0KKy1pbnQgbWFpbigpIHsKKy1yZXR1cm4gX19NSU5HVzMyX187CistOyByZXR1cm4gMDsgfQorLUVPRgorLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTI4NzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorLSAgYWNfY3ZfbWluZ3czMj15ZXMKKy1lbHNlCistICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CistICBybSAtcmYgY29uZnRlc3QqCistICBhY19jdl9taW5ndzMyPW5vCistZmkKKy1ybSAtZiBjb25mdGVzdCoKKy1ybSAtZiBjb25mdGVzdCoKKyBmaQorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9ob3N0IiA+JjUKKyskYXNfZWNobyAiJGFjX2N2X2hvc3QiID4mNjsgfQorK2Nhc2UgJGFjX2N2X2hvc3QgaW4KKysqLSotKikgOzsKKysqKSB7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogaW52YWxpZCB2YWx1ZSBvZiBjYW5vbmljYWwgaG9zdCIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgdmFsdWUgb2YgY2Fub25pY2FsIGhvc3QiID4mMjt9CisrICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OzsKKytlc2FjCisraG9zdD0kYWNfY3ZfaG9zdAorK2FjX3NhdmVfSUZTPSRJRlM7IElGUz0nLScKKytzZXQgeCAkYWNfY3ZfaG9zdAorK3NoaWZ0CisraG9zdF9jcHU9JDEKKytob3N0X3ZlbmRvcj0kMgorK3NoaWZ0OyBzaGlmdAorKyMgUmVtZW1iZXIsIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgSUZTIGlzIHVzZWQgdG8gY3JlYXRlICQqLAorKyMgZXhjZXB0IHdpdGggb2xkIHNoZWxsczoKKytob3N0X29zPSQqCisrSUZTPSRhY19zYXZlX0lGUworK2Nhc2UgJGhvc3Rfb3MgaW4gKlwgKikgaG9zdF9vcz1gZWNobyAiJGhvc3Rfb3MiIHwgc2VkICdzLyAvLS9nJ2A7OyBlc2FjCisgCistZWNobyAiJGFjX3QiIiRhY19jdl9taW5ndzMyIiAxPiY2CistTUlOR1czMj0KKy10ZXN0ICIkYWNfY3ZfbWluZ3czMiIgPSB5ZXMgJiYgTUlOR1czMj15ZXMKKy0KKy0KKy1lY2hvICRhY19uICJjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZToxMzA2OiBjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiID4mNQorLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9leGVleHQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKy1lbHNlCistICBpZiB0ZXN0ICIkQ1lHV0lOIiA9IHllcyB8fCB0ZXN0ICIkTUlOR1czMiIgPSB5ZXM7IHRoZW4KKy0gIGFjX2N2X2V4ZWV4dD0uZXhlCistZWxzZQorLSAgcm0gLWYgY29uZnRlc3QqCistICBlY2hvICdpbnQgbWFpbiAoKSB7IHJldHVybiAwOyB9JyA+IGNvbmZ0ZXN0LiRhY19leHQKKy0gIGFjX2N2X2V4ZWV4dD0KKy0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTMxNjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfTsgdGhlbgorLSAgICBmb3IgZmlsZSBpbiBjb25mdGVzdC4qOyBkbworLSAgICAgIGNhc2UgJGZpbGUgaW4KKy0gICAgICAqLmMgfCAqLm8gfCAqLm9iaikgOzsKKy0gICAgICAqKSBhY19jdl9leGVleHQ9YGVjaG8gJGZpbGUgfCBzZWQgLWUgcy9jb25mdGVzdC8vYCA7OworLSAgICAgIGVzYWMKKy0gICAgZG9uZQorLSAgZWxzZQorLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KKy0gIGZpCistICBybSAtZiBjb25mdGVzdCoKKy0gIHRlc3QgeCIke2FjX2N2X2V4ZWV4dH0iID0geCAmJiBhY19jdl9leGVleHQ9bm8KKy1maQorLWZpCisgCistRVhFRVhUPSIiCistdGVzdCB4IiR7YWNfY3ZfZXhlZXh0fSIgIT0geG5vICYmIEVYRUVYVD0ke2FjX2N2X2V4ZWV4dH0KKy1lY2hvICIkYWNfdCIiJHthY19jdl9leGVleHR9IiAxPiY2CistYWNfZXhlZXh0PSRFWEVFWFQKKyAKKyAKKyAKKy0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBzdHJpY3QgY29tcGlsaW5nIGlzIG9uIiIuLi4gJGFjX2MiIDE+JjYKKy1lY2hvICJjb25maWd1cmU6MTMzOTogY2hlY2tpbmcgd2hldGhlciBzdHJpY3QgY29tcGlsaW5nIGlzIG9uIiA+JjUKKy0gICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXN0cmljdCBvciAtLWRpc2FibGUtc3RyaWN0IHdhcyBnaXZlbi4KKysgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgc3RyaWN0IGNvbXBpbGluZyBpcyBvbiIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBzdHJpY3QgY29tcGlsaW5nIGlzIG9uLi4uICIgPiY2OyB9CisrICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zdHJpY3Qgd2FzIGdpdmVuLgorIGlmIHRlc3QgIiR7ZW5hYmxlX3N0cmljdCtzZXR9IiA9IHNldDsgdGhlbgorLSAgZW5hYmxldmFsPSIkZW5hYmxlX3N0cmljdCIKKy0gIAorKyAgZW5hYmxldmFsPSRlbmFibGVfc3RyaWN0OworICAgICAgICAgaWYgdGVzdCAiJGVuYWJsZXZhbCIgPSBubworICAgICAgICAgdGhlbgorICAgICAgICAgICAgIGFjX3VzZV9zdHJpY3Rfb3B0aW9ucz1ubworICAgICAgICAgZWxzZQorICAgICAgICAgICAgIGFjX3VzZV9zdHJpY3Rfb3B0aW9ucz15ZXMKKyAgICAgICAgIGZpCistICAgICAgCisrCisgZWxzZQorICAgYWNfdXNlX3N0cmljdF9vcHRpb25zPW5vCisgZmkKKyAKKy0gICAgZWNobyAiJGFjX3QiIiRhY191c2Vfc3RyaWN0X29wdGlvbnMiIDE+JjYKKysgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3VzZV9zdHJpY3Rfb3B0aW9ucyIgPiY1CisrJGFzX2VjaG8gIiRhY191c2Vfc3RyaWN0X29wdGlvbnMiID4mNjsgfQorIAorICAgICBpZiB0ZXN0ICIkYWNfdXNlX3N0cmljdF9vcHRpb25zIiA9IHllcworICAgICB0aGVuCitAQCAtMTM5MSwxNyArMzY1MSwxNyBAQAorIAorIAorIAorLSAgICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtNjRiaXQtbGlicyBvciAtLWRpc2FibGUtNjRiaXQtbGlicyB3YXMgZ2l2ZW4uCisrCisrICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS02NGJpdC1saWJzIHdhcyBnaXZlbi4KKyBpZiB0ZXN0ICIke2VuYWJsZV82NGJpdF9saWJzK3NldH0iID0gc2V0OyB0aGVuCistICBlbmFibGV2YWw9IiRlbmFibGVfNjRiaXRfbGlicyIKKy0gIEVOQUJMRV82NEJJVF9MSUJTPSR7ZW5hYmxldmFsfQorKyAgZW5hYmxldmFsPSRlbmFibGVfNjRiaXRfbGliczsgRU5BQkxFXzY0QklUX0xJQlM9JHtlbmFibGV2YWx9CisgZWxzZQorICAgRU5BQkxFXzY0QklUX0xJQlM9eWVzCistICAgIAorKworIGZpCisgCistICAgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgNjQtYml0IGV4ZWN1dGFibGUgc3VwcG9ydCIiLi4uICRhY19jIiAxPiY2CistZWNobyAiY29uZmlndXJlOjE0MDU6IGNoZWNraW5nIGZvciA2NC1iaXQgZXhlY3V0YWJsZSBzdXBwb3J0IiA+JjUKKysgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgNjQtYml0IGV4ZWN1dGFibGUgc3VwcG9ydCIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIDY0LWJpdCBleGVjdXRhYmxlIHN1cHBvcnQuLi4gIiA+JjY7IH0KKyAgICAgaWYgdGVzdCAiJEVOQUJMRV82NEJJVF9MSUJTIiA9IG5vOyB0aGVuCisgICAgICAgICBjYXNlICIke2hvc3R9IiBpbgorICAgICAgICAgKi0qLWhwdXgqKQorQEAgLTE0NjUsNyArMzcyNSw3IEBACisgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICA7OworICAgICAgICAgKi0qLWFpeCopCistICAgICAgICAgICAgaWYgdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IG5vOyB0aGVuCisrICAgICAgICAgICAgaWYgdGVzdCAiJGFjX2N2X2NfY29tcGlsZXJfZ251IiA9IG5vOyB0aGVuCisgICAgICAgICAgICAgICAgICMgTm90ZTogSGF2ZSBub3QgdGVzdGVkIDY0LWJpdG5lc3Mgd2l0aCBnY2MuCisgICAgICAgICAgICAgICAgICMgTWF5YmUgdGhlIGZsYWcgIi1tYWl4NjQiIGNvdWxkIGJlIHVzZWQgd2l0aCBnY2M/CisgICAgICAgICAgICAgICAgIE9MRF9DRkxBR1M9IiR7Q0ZMQUdTfSIKK0BAIC0xNDc3LDIzICszNzM3LDUwIEBACisgICAgICAgICAgICAgICAgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgICBFTkFCTEVfNjRCSVRfTElCUz1ubworIGVsc2UKKy0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKy0jbGluZSAxNDgyICJjb25maWd1cmUiCistI2luY2x1ZGUgImNvbmZkZWZzLmgiCisrICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworIGludCBtYWluKHZvaWQpIHtyZXR1cm4gMDt9CistRU9GCistaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDg2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCistdGhlbgorK19BQ0VPRgorK3JtIC1mIGNvbmZ0ZXN0JGFjX2V4ZWV4dAorK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfbGluayIpIDI+JjUKKysgIGFjX3N0YXR1cz0kPworKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsgYWNfdHJ5PScuL2NvbmZ0ZXN0JGFjX2V4ZWV4dCcKKysgIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKKysgIGFjX3N0YXR1cz0kPworKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgICBFTkFCTEVfNjRCSVRfTElCUz15ZXMKKyBlbHNlCistICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CistICBybSAtZnIgY29uZnRlc3QqCistICBFTkFCTEVfNjRCSVRfTElCUz1ubworKyAgJGFzX2VjaG8gIiRhc19tZTogcHJvZ3JhbSBleGl0ZWQgd2l0aCBzdGF0dXMgJGFjX3N0YXR1cyIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cisrc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorKworKyggZXhpdCAkYWNfc3RhdHVzICkKKytFTkFCTEVfNjRCSVRfTElCUz1ubworIGZpCistcm0gLWZyIGNvbmZ0ZXN0KgorK3JtIC1yZiBjb25mdGVzdC5kU1lNCisrcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgZmkKKyAKKysKKyAgICAgICAgICAgICAgICAgaWYgdGVzdCAiJEVOQUJMRV82NEJJVF9MSUJTIiA9IG5vOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICBDRkxBR1M9IiR7T0xEX0NGTEFHU30iCisgICAgICAgICAgICAgICAgICAgICBDWFhGTEFHUz0iJHtPTERfQ1hYRkxBR1N9IgorQEAgLTE1MDQsNyArMzc5MSw3IEBACisgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICA7OworICAgICAgICAgKi0qLWhwdXgqKQorLSAgICAgICAgICAgICAgICAgICAgICAgIAorKworICAgICAgICAgICAgIE9MRF9DRkxBR1M9IiR7Q0ZMQUdTfSIKKyAgICAgICAgICAgICBPTERfQ1hYRkxBR1M9IiR7Q1hYRkxBR1N9IgorICAgICAgICAgICAgIENGTEFHUz0iJHtDRkxBR1N9ICtERDY0IgorQEAgLTE1MTIsMjMgKzM3OTksNTAgQEAKKyAgICAgICAgICAgICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorICAgRU5BQkxFXzY0QklUX0xJQlM9bm8KKyBlbHNlCistICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCistI2xpbmUgMTUxNyAiY29uZmlndXJlIgorLSNpbmNsdWRlICJjb25mZGVmcy5oIgorKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyBpbnQgbWFpbih2b2lkKSB7cmV0dXJuIDA7fQorLUVPRgorLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTUyMTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAorLXRoZW4KKytfQUNFT0YKKytybSAtZiBjb25mdGVzdCRhY19leGVleHQKKytpZiB7IChhY190cnk9IiRhY19saW5rIgorK2Nhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX2xpbmsiKSAyPiY1CisrICBhY19zdGF0dXM9JD8KKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCisrICB7IChjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY190cnkiKSAyPiY1CisrICBhY19zdGF0dXM9JD8KKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICAgRU5BQkxFXzY0QklUX0xJQlM9eWVzCisgZWxzZQorLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKy0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorLSAgcm0gLWZyIGNvbmZ0ZXN0KgorLSAgRU5BQkxFXzY0QklUX0xJQlM9bm8KKysgICRhc19lY2hvICIkYXNfbWU6IHByb2dyYW0gZXhpdGVkIHdpdGggc3RhdHVzICRhY19zdGF0dXMiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKysKKysoIGV4aXQgJGFjX3N0YXR1cyApCisrRU5BQkxFXzY0QklUX0xJQlM9bm8KKyBmaQorLXJtIC1mciBjb25mdGVzdCoKKytybSAtcmYgY29uZnRlc3QuZFNZTQorK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorIGZpCisgCisrCisgICAgICAgICAgICAgaWYgdGVzdCAiJEVOQUJMRV82NEJJVF9MSUJTIiA9IG5vOyB0aGVuCisgICAgICAgICAgICAgICAgIENGTEFHUz0iJHtPTERfQ0ZMQUdTfSIKKyAgICAgICAgICAgICAgICAgQ1hYRkxBR1M9IiR7T0xEX0NYWEZMQUdTfSIKK0BAIC0xNTM3LDIzICszODUxLDUwIEBACisgICAgICAgICAgICAgICAgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisgICBFTkFCTEVfNjRCSVRfTElCUz1ubworIGVsc2UKKy0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKy0jbGluZSAxNTQyICJjb25maWd1cmUiCistI2luY2x1ZGUgImNvbmZkZWZzLmgiCisrICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworIGludCBtYWluKHZvaWQpIHtyZXR1cm4gMDt9CistRU9GCistaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTQ2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCistdGhlbgorK19BQ0VPRgorK3JtIC1mIGNvbmZ0ZXN0JGFjX2V4ZWV4dAorK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfbGluayIpIDI+JjUKKysgIGFjX3N0YXR1cz0kPworKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsgYWNfdHJ5PScuL2NvbmZ0ZXN0JGFjX2V4ZWV4dCcKKysgIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKKysgIGFjX3N0YXR1cz0kPworKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgICBFTkFCTEVfNjRCSVRfTElCUz15ZXMKKyBlbHNlCistICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CistICBybSAtZnIgY29uZnRlc3QqCistICBFTkFCTEVfNjRCSVRfTElCUz1ubworKyAgJGFzX2VjaG8gIiRhc19tZTogcHJvZ3JhbSBleGl0ZWQgd2l0aCBzdGF0dXMgJGFjX3N0YXR1cyIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cisrc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorKworKyggZXhpdCAkYWNfc3RhdHVzICkKKytFTkFCTEVfNjRCSVRfTElCUz1ubworIGZpCistcm0gLWZyIGNvbmZ0ZXN0KgorK3JtIC1yZiBjb25mdGVzdC5kU1lNCisrcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgZmkKKyAKKysKKyAgICAgICAgICAgICAgICAgaWYgdGVzdCAiJEVOQUJMRV82NEJJVF9MSUJTIiA9IG5vOyB0aGVuCisgICAgICAgICAgICAgICAgICAgICBDRkxBR1M9IiR7T0xEX0NGTEFHU30iCisgICAgICAgICAgICAgICAgICAgICBDWFhGTEFHUz0iJHtPTERfQ1hYRkxBR1N9IgorQEAgLTE1NjUsMzQgKzM5MDYsMzUgQEAKKyAgICAgICAgICAgICA7OworICAgICAgICAgZXNhYworICAgICBmaQorLSAgICAgICAgZWNobyAiJGFjX3QiIiRFTkFCTEVfNjRCSVRfTElCUyIgMT4mNgorKyAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJEVOQUJMRV82NEJJVF9MSUJTIiA+JjUKKyskYXNfZWNobyAiJEVOQUJMRV82NEJJVF9MSUJTIiA+JjY7IH0KKyAKKyAKKyAKKyAKKyAKKy0JZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hpY2ggTWFrZWZpbGUgZnJhZ21lbnQgdG8gdXNlIiIuLi4gJGFjX2MiIDE+JjYKKy1lY2hvICJjb25maWd1cmU6MTU3NjogY2hlY2tpbmcgd2hpY2ggTWFrZWZpbGUgZnJhZ21lbnQgdG8gdXNlIiA+JjUKKy1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snaWN1X2N2X2hvc3RfZnJhZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCistICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorKwl7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hpY2ggTWFrZWZpbGUgZnJhZ21lbnQgdG8gdXNlIiA+JjUKKyskYXNfZWNob19uICJjaGVja2luZyB3aGljaCBNYWtlZmlsZSBmcmFnbWVudCB0byB1c2UuLi4gIiA+JjY7IH0KKytpZiB0ZXN0ICIke2ljdV9jdl9ob3N0X2ZyYWcrc2V0fSIgPSBzZXQ7IHRoZW4KKysgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisgZWxzZQorLSAgCisrCisgY2FzZSAiJHtob3N0fSIgaW4KKyAqLSotc29sYXJpcyopCistCWlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCQorLQkJaWN1X2N2X2hvc3RfZnJhZz1taC1zb2xhcmlzLWdjYyAKKysJaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKysJCWljdV9jdl9ob3N0X2ZyYWc9bWgtc29sYXJpcy1nY2MKKyAJZWxzZQorIAkJaWN1X2N2X2hvc3RfZnJhZz1taC1zb2xhcmlzCisgCWZpIDs7CisgYWxwaGEqLSotbGludXgtZ251KQorIAlpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgorIAkJaWN1X2N2X2hvc3RfZnJhZz1taC1hbHBoYS1saW51eC1nY2MKKy0JZWxzZSAgCisrCWVsc2UKKyAJCWljdV9jdl9ob3N0X2ZyYWc9bWgtYWxwaGEtbGludXgtY2MKKyAJZmkgOzsKKyAqLSotbGludXgqKSBpY3VfY3ZfaG9zdF9mcmFnPW1oLWxpbnV4IDs7CisgKi0qLWN5Z3dpbikKKy0JaWYgdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IHllczsgdGhlbgorKwlpZiB0ZXN0ICIkYWNfY3ZfY19jb21waWxlcl9nbnUiID0geWVzOyB0aGVuCisgCSAgCWljdV9jdl9ob3N0X2ZyYWc9bWgtY3lnd2luCisgCWVsc2UKKyAJICAJaWN1X2N2X2hvc3RfZnJhZz1taC1jeWd3aW4tbXN2YworQEAgLTE2MjksMTEzICszOTcxLDE2OSBAQAorICotc2VxdWVudC0qKSAJaWN1X2N2X2hvc3RfZnJhZz1taC1wdHggOzsKKyAqKSAJCWljdV9jdl9ob3N0X2ZyYWc9bWgtdW5rbm93biA7OworIGVzYWMKKy0JCQorLQkKKy1maQorIAorLWVjaG8gIiRhY190IiIkaWN1X2N2X2hvc3RfZnJhZyIgMT4mNgorKworK2ZpCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGljdV9jdl9ob3N0X2ZyYWciID4mNQorKyRhc19lY2hvICIkaWN1X2N2X2hvc3RfZnJhZyIgPiY2OyB9CisgCisgCisgY2FzZSAiJHtob3N0fSIgaW4KKy0JKi0qLWhwdXgqKSAJZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGZsb29yIGluIC1sbSIiLi4uICRhY19jIiAxPiY2CistZWNobyAiY29uZmlndXJlOjE2NDI6IGNoZWNraW5nIGZvciBmbG9vciBpbiAtbG0iID4mNQorLWFjX2xpYl92YXI9YGVjaG8gbSdfJ2Zsb29yIHwgc2VkICd5JS4vKy0lX19wXyUnYAorLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKysJKi0qLWhwdXgqKSAJeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBmbG9vciBpbiAtbG0iID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBmbG9vciBpbiAtbG0uLi4gIiA+JjY7IH0KKytpZiB0ZXN0ICIke2FjX2N2X2xpYl9tX2Zsb29yK3NldH0iID0gc2V0OyB0aGVuCisrICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorIGVsc2UKKy0gIGFjX3NhdmVfTElCUz0iJExJQlMiCisrICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCisgTElCUz0iLWxtICAkTElCUyIKKy1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCistI2xpbmUgMTY1MCAiY29uZmlndXJlIgorLSNpbmNsdWRlICJjb25mZGVmcy5oIgorLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCistLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworLWNoYXIgZmxvb3IoKTsKKy0KKy1pbnQgbWFpbigpIHsKKy1mbG9vcigpCistOyByZXR1cm4gMDsgfQorLUVPRgorLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTY2MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCistICBybSAtcmYgY29uZnRlc3QqCistICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgorLWVsc2UKKy0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CistICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKy0gIHJtIC1yZiBjb25mdGVzdCoKKy0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKKy1maQorLXJtIC1mIGNvbmZ0ZXN0KgorLUxJQlM9IiRhY19zYXZlX0xJQlMiCistCistZmkKKy1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgorLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGNvbmZkZWZzLmguICAqLworK19BQ0VPRgorK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBlbmQgY29uZmRlZnMuaC4gICovCisrCisrLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisrICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisrICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKysjaWZkZWYgX19jcGx1c3BsdXMKKytleHRlcm4gIkMiCisrI2VuZGlmCisrY2hhciBmbG9vciAoKTsKKytpbnQKKyttYWluICgpCisreworK3JldHVybiBmbG9vciAoKTsKKysgIDsKKysgIHJldHVybiAwOworK30KKytfQUNFT0YKKytybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisrCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisrICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgeworKwkgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgfHwKKysJICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0CisrICAgICAgIH07IHRoZW4KKysgIGFjX2N2X2xpYl9tX2Zsb29yPXllcworK2Vsc2UKKysgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKysKKysJYWNfY3ZfbGliX21fZmxvb3I9bm8KKytmaQorKworK3JtIC1yZiBjb25mdGVzdC5kU1lNCisrcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKKysgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKKytmaQorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9saWJfbV9mbG9vciIgPiY1CisrJGFzX2VjaG8gIiRhY19jdl9saWJfbV9mbG9vciIgPiY2OyB9CisraWYgdGVzdCAieCRhY19jdl9saWJfbV9mbG9vciIgPSB4IiJ5ZXM7IHRoZW4KKyAgIExJQl9NPSItbG0iCistZWxzZQorLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CisgZmkKKyAgOzsKKy0JCistCSopIAkJZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGZsb29yIGluIC1sbSIiLi4uICRhY19jIiAxPiY2CistZWNobyAiY29uZmlndXJlOjE2ODM6IGNoZWNraW5nIGZvciBmbG9vciBpbiAtbG0iID4mNQorLWFjX2xpYl92YXI9YGVjaG8gbSdfJ2Zsb29yIHwgc2VkICd5JS4vKy0lX19wXyUnYAorLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKysKKysJKikKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGZsb29yIGluIC1sbSIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGZsb29yIGluIC1sbS4uLiAiID4mNjsgfQorK2lmIHRlc3QgIiR7YWNfY3ZfbGliX21fZmxvb3Irc2V0fSIgPSBzZXQ7IHRoZW4KKysgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisgZWxzZQorLSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKKysgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKKyBMSUJTPSItbG0gICRMSUJTIgorLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKy0jbGluZSAxNjkxICJjb25maWd1cmUiCistI2luY2x1ZGUgImNvbmZkZWZzLmgiCistLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCistICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCistY2hhciBmbG9vcigpOworLQorLWludCBtYWluKCkgeworLWZsb29yKCkKKy07IHJldHVybiAwOyB9CistRU9GCistaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNzAyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKy0gIHJtIC1yZiBjb25mdGVzdCoKKy0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCistZWxzZQorLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKy0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgorLWZpCistcm0gLWYgY29uZnRlc3QqCistTElCUz0iJGFjX3NhdmVfTElCUyIKKy0KKy1maQorLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCistICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CistICAgIGFjX3RyX2xpYj1IQVZFX0xJQmBlY2hvIG0gfCBzZWQgLWUgJ3MvW15hLXpBLVowLTlfXS9fL2cnIFwKKy0gICAgLWUgJ3kvYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovJ2AKKy0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCistI2RlZmluZSAkYWNfdHJfbGliIDEKKy1FT0YKKytjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworKworKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisrI2lmZGVmIF9fY3BsdXNwbHVzCisrZXh0ZXJuICJDIgorKyNlbmRpZgorK2NoYXIgZmxvb3IgKCk7CisraW50CisrbWFpbiAoKQorK3sKKytyZXR1cm4gZmxvb3IgKCk7CisrICA7CisrICByZXR1cm4gMDsKKyt9CisrX0FDRU9GCisrcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKKytpZiB7IChhY190cnk9IiRhY19saW5rIgorK2Nhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQorKyAgYWNfc3RhdHVzPSQ/CisrICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorKyAgcm0gLWYgY29uZnRlc3QuZXIxCisrICBjYXQgY29uZnRlc3QuZXJyID4mNQorKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKysJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmIHsKKysJIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzIHx8CisrCSAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorKyAgICAgICB9OyB0aGVuCisrICBhY19jdl9saWJfbV9mbG9vcj15ZXMKKytlbHNlCisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrCWFjX2N2X2xpYl9tX2Zsb29yPW5vCisrZmkKKysKKytybSAtcmYgY29uZnRlc3QuZFNZTQorK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCisrICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKytMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCisrZmkKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGliX21fZmxvb3IiID4mNQorKyRhc19lY2hvICIkYWNfY3ZfbGliX21fZmxvb3IiID4mNjsgfQorK2lmIHRlc3QgIngkYWNfY3ZfbGliX21fZmxvb3IiID0geCIieWVzOyB0aGVuCisrICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisrI2RlZmluZSBIQVZFX0xJQk0gMQorK19BQ0VPRgorIAorICAgTElCUz0iLWxtICRMSUJTIgorIAorLWVsc2UKKy0gIGVjaG8gIiRhY190IiJubyIgMT4mNgorIGZpCistIAorKworIAkJCUxJQl9NPSIiIDs7CisgZXNhYworIAorIAorLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcyIiLi4uICRhY19jIiAxPiY2CistZWNobyAiY29uZmlndXJlOjE3MzQ6IGNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcyIgPiY1CisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcyIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLi4uICIgPiY2OyB9CisgZW5hYmxlZD1ubworLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaGFyZWQgb3IgLS1kaXNhYmxlLXNoYXJlZCB3YXMgZ2l2ZW4uCisrIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNoYXJlZCB3YXMgZ2l2ZW4uCisgaWYgdGVzdCAiJHtlbmFibGVfc2hhcmVkK3NldH0iID0gc2V0OyB0aGVuCistICBlbmFibGV2YWw9IiRlbmFibGVfc2hhcmVkIgorLSAgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKysgIGVuYWJsZXZhbD0kZW5hYmxlX3NoYXJlZDsgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAJICAgICB5ZXN8IiIpIGVuYWJsZWQ9eWVzOyBFTkFCTEVfU0hBUkVEPVlFUyA7OworIAkgICAgIG5vKTs7CisgCSAgICAgKikgOzsKK0BAIC0xNzQ1LDE2MiArNDE0MywyMzAgQEAKKyAKKyBmaQorIAorLWVjaG8gIiRhY190IiIkZW5hYmxlZCIgMT4mNgorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRlbmFibGVkIiA+JjUKKyskYXNfZWNobyAiJGVuYWJsZWQiID4mNjsgfQorIAorIAorLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllcyIiLi4uICRhY19jIiAxPiY2CistZWNobyAiY29uZmlndXJlOjE3NTM6IGNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllcyIgPiY1CisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllcyIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzLi4uICIgPiY2OyB9CisgZW5hYmxlZD1ubworLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zdGF0aWMgb3IgLS1kaXNhYmxlLXN0YXRpYyB3YXMgZ2l2ZW4uCisrIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXN0YXRpYyB3YXMgZ2l2ZW4uCisgaWYgdGVzdCAiJHtlbmFibGVfc3RhdGljK3NldH0iID0gc2V0OyB0aGVuCistICBlbmFibGV2YWw9IiRlbmFibGVfc3RhdGljIgorLSAgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKysgIGVuYWJsZXZhbD0kZW5hYmxlX3N0YXRpYzsgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAJICAgICB5ZXN8IiIpIGVuYWJsZWQ9eWVzOyBFTkFCTEVfU1RBVElDPVlFUyA7OworIAkgICAgIG5vKSA7OworIAkgICAgICopIDs7CisgICAgIGVzYWMKKyBmaQorIAorLWVjaG8gIiRhY190IiIkZW5hYmxlZCIgMT4mNgorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRlbmFibGVkIiA+JjUKKyskYXNfZWNobyAiJGVuYWJsZWQiID4mNjsgfQorIAorIAorLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgZGVidWcgbGlicmFyaWVzIiIuLi4gJGFjX2MiIDE+JjYKKy1lY2hvICJjb25maWd1cmU6MTc2OTogY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBkZWJ1ZyBsaWJyYXJpZXMiID4mNQorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIGRlYnVnIGxpYnJhcmllcyIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBkZWJ1ZyBsaWJyYXJpZXMuLi4gIiA+JjY7IH0KKyBlbmFibGVkPW5vCisgRU5BQkxFX0RFQlVHPTAKKy0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZGVidWcgb3IgLS1kaXNhYmxlLWRlYnVnIHdhcyBnaXZlbi4KKysjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZGVidWcgd2FzIGdpdmVuLgorIGlmIHRlc3QgIiR7ZW5hYmxlX2RlYnVnK3NldH0iID0gc2V0OyB0aGVuCistICBlbmFibGV2YWw9IiRlbmFibGVfZGVidWciCistICAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorKyAgZW5hYmxldmFsPSRlbmFibGVfZGVidWc7ICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgICAgICAgICAgeWVzfCIiKSBlbmFibGVkPXllczsgRU5BQkxFX0RFQlVHPTEgOzsKKyAgICAgICAgICAqKSA7OworICAgICBlc2FjCisgZmkKKyAKKy1lY2hvICIkYWNfdCIiJGVuYWJsZWQiIDE+JjYKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkZW5hYmxlZCIgPiY1CisrJGFzX2VjaG8gIiRlbmFibGVkIiA+JjY7IH0KKyAKKyAKKy1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHJlbGVhc2UgbGlicmFyaWVzIiIuLi4gJGFjX2MiIDE+JjYKKy1lY2hvICJjb25maWd1cmU6MTc4NTogY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCByZWxlYXNlIGxpYnJhcmllcyIgPiY1CisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgcmVsZWFzZSBsaWJyYXJpZXMiID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgcmVsZWFzZSBsaWJyYXJpZXMuLi4gIiA+JjY7IH0KKyBlbmFibGVkPXllcworIEVOQUJMRV9SRUxFQVNFPTEKKy0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtcmVsZWFzZSBvciAtLWRpc2FibGUtcmVsZWFzZSB3YXMgZ2l2ZW4uCisrIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXJlbGVhc2Ugd2FzIGdpdmVuLgorIGlmIHRlc3QgIiR7ZW5hYmxlX3JlbGVhc2Urc2V0fSIgPSBzZXQ7IHRoZW4KKy0gIGVuYWJsZXZhbD0iJGVuYWJsZV9yZWxlYXNlIgorLSAgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKysgIGVuYWJsZXZhbD0kZW5hYmxlX3JlbGVhc2U7ICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgICAgICAgICAgbm8pIGVuYWJsZWQ9bm87IEVOQUJMRV9SRUxFQVNFPTAgOzsKKyAgICAgICAgICAqKSA7OworICAgICBlc2FjCisgZmkKKyAKKy1lY2hvICIkYWNfdCIiJGVuYWJsZWQiIDE+JjYKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkZW5hYmxlZCIgPiY1CisrJGFzX2VjaG8gIiRlbmFibGVkIiA+JjY7IH0KKyAKKyAKKy0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCistc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgorLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2CistZWNobyAiY29uZmlndXJlOjE4MDM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CistaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKy0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CisraWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fXJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCisrc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9cmFubGliOyBhY193b3JkPSQyCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CisraWYgdGVzdCAiJHthY19jdl9wcm9nX1JBTkxJQitzZXR9IiA9IHNldDsgdGhlbgorKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKyBlbHNlCisgICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorIGVsc2UKKy0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCistICBhY19kdW1teT0iJFBBVEgiCistICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKy0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKy0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCistICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9InJhbmxpYiIKKy0gICAgICBicmVhaworLSAgICBmaQorLSAgZG9uZQorLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCistICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiICYmIGFjX2N2X3Byb2dfUkFOTElCPSI6IgorK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKKytmb3IgYXNfZGlyIGluICRQQVRICisrZG8KKysgIElGUz0kYXNfc2F2ZV9JRlMKKysgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisrICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKysgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKysgICAgYWNfY3ZfcHJvZ19SQU5MSUI9IiR7YWNfdG9vbF9wcmVmaXh9cmFubGliIgorKyAgICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorKyAgICBicmVhayAyCisrICBmaQorK2RvbmUKKytkb25lCisrSUZTPSRhc19zYXZlX0lGUworKworIGZpCisgZmkKKy1SQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKKytSQU5MSUI9JGFjX2N2X3Byb2dfUkFOTElCCisgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KKy0gIGVjaG8gIiRhY190IiIkUkFOTElCIiAxPiY2CisrICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkUkFOTElCIiA+JjUKKyskYXNfZWNobyAiJFJBTkxJQiIgPiY2OyB9CisrZWxzZQorKyAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorKyRhc19lY2hvICJubyIgPiY2OyB9CisrZmkKKysKKysKKytmaQorK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiI7IHRoZW4KKysgIGFjX2N0X1JBTkxJQj0kUkFOTElCCisrICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCisrc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQorK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9SQU5MSUIrc2V0fSIgPSBzZXQ7IHRoZW4KKysgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisrZWxzZQorKyAgaWYgdGVzdCAtbiAiJGFjX2N0X1JBTkxJQiI7IHRoZW4KKysgIGFjX2N2X3Byb2dfYWNfY3RfUkFOTElCPSIkYWNfY3RfUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KKytlbHNlCisrYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorK2ZvciBhc19kaXIgaW4gJFBBVEgKKytkbworKyAgSUZTPSRhc19zYXZlX0lGUworKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKysgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorKyAgICBhY19jdl9wcm9nX2FjX2N0X1JBTkxJQj0icmFubGliIgorKyAgICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorKyAgICBicmVhayAyCisrICBmaQorK2RvbmUKKytkb25lCisrSUZTPSRhc19zYXZlX0lGUworKworK2ZpCisrZmkKKythY19jdF9SQU5MSUI9JGFjX2N2X3Byb2dfYWNfY3RfUkFOTElCCisraWYgdGVzdCAtbiAiJGFjX2N0X1JBTkxJQiI7IHRoZW4KKysgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdF9SQU5MSUIiID4mNQorKyRhc19lY2hvICIkYWNfY3RfUkFOTElCIiA+JjY7IH0KKytlbHNlCisrICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CisrJGFzX2VjaG8gIm5vIiA+JjY7IH0KKytmaQorKworKyAgaWYgdGVzdCAieCRhY19jdF9SQU5MSUIiID0geDsgdGhlbgorKyAgICBSQU5MSUI9IjoiCisrICBlbHNlCisrICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KKyt5ZXM6KQorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KKythY190b29sX3dhcm5lZD15ZXMgOzsKKytlc2FjCisrICAgIFJBTkxJQj0kYWNfY3RfUkFOTElCCisrICBmaQorIGVsc2UKKy0gIGVjaG8gIiRhY190IiJubyIgMT4mNgorKyAgUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCisgZmkKKyAKKyAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImFyIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KKyBzZXQgZHVtbXkgYXI7IGFjX3dvcmQ9JDIKKy1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZToxODMzOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0FSJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKy0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CisraWYgdGVzdCAiJHthY19jdl9wYXRoX0FSK3NldH0iID0gc2V0OyB0aGVuCisrICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorIGVsc2UKKy0gIGNhc2UgIiRBUiIgaW4KKy0gIC8qKQorKyAgY2FzZSAkQVIgaW4KKysgIFtcXC9dKiB8ID86W1xcL10qKQorICAgYWNfY3ZfcGF0aF9BUj0iJEFSIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KKyAgIDs7CistICA/Oi8qKQkJCSAKKy0gIGFjX2N2X3BhdGhfQVI9IiRBUiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgorLSAgOzsKKyAgICopCistICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorLSAgYWNfZHVtbXk9IiRQQVRIOi9iaW46L3Vzci9iaW46L3Vzci9jY3MvYmluIgorLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvIAorLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKy0gICAgICBhY19jdl9wYXRoX0FSPSIkYWNfZGlyLyRhY193b3JkIgorLSAgICAgIGJyZWFrCistICAgIGZpCistICBkb25lCistICBJRlM9IiRhY19zYXZlX2lmcyIKKysgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKKythc19kdW1teT0iJFBBVEg6L2JpbjovdXNyL2JpbjovdXNyL2Njcy9iaW4iCisrZm9yIGFzX2RpciBpbiAkYXNfZHVtbXkKKytkbworKyAgSUZTPSRhc19zYXZlX0lGUworKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKysgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorKyAgICBhY19jdl9wYXRoX0FSPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorKyAgICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorKyAgICBicmVhayAyCisrICBmaQorK2RvbmUKKytkb25lCisrSUZTPSRhc19zYXZlX0lGUworKworICAgdGVzdCAteiAiJGFjX2N2X3BhdGhfQVIiICYmIGFjX2N2X3BhdGhfQVI9ImVjaG8gYXJjaGl2ZXIgYXIgbm90IGZvdW5kIHJlLXJ1biBjb25maWd1cmUgOyBmYWxzZSIKKyAgIDs7CisgZXNhYworIGZpCistQVI9IiRhY19jdl9wYXRoX0FSIgorK0FSPSRhY19jdl9wYXRoX0FSCisgaWYgdGVzdCAtbiAiJEFSIjsgdGhlbgorLSAgZWNobyAiJGFjX3QiIiRBUiIgMT4mNgorKyAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJEFSIiA+JjUKKyskYXNfZWNobyAiJEFSIiA+JjY7IH0KKyBlbHNlCistICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKysgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKKyskYXNfZWNobyAibm8iID4mNjsgfQorIGZpCisgCisgCistZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgcmVuYW1pbmcgb2Ygc3ltYm9scyIiLi4uICRhY19jIiAxPiY2CistZWNobyAiY29uZmlndXJlOjE4Njg6IGNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIHJlbmFtaW5nIG9mIHN5bWJvbHMiID4mNQorKworK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSByZW5hbWluZyBvZiBzeW1ib2xzIiA+JjUKKyskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSByZW5hbWluZyBvZiBzeW1ib2xzLi4uICIgPiY2OyB9CisgZW5hYmxlZD15ZXMKKyBVX0RJU0FCTEVfUkVOQU1JTkc9MAorLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1yZW5hbWluZyBvciAtLWRpc2FibGUtcmVuYW1pbmcgd2FzIGdpdmVuLgorKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1yZW5hbWluZyB3YXMgZ2l2ZW4uCisgaWYgdGVzdCAiJHtlbmFibGVfcmVuYW1pbmcrc2V0fSIgPSBzZXQ7IHRoZW4KKy0gIGVuYWJsZXZhbD0iJGVuYWJsZV9yZW5hbWluZyIKKy0gICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisrICBlbmFibGV2YWw9JGVuYWJsZV9yZW5hbWluZzsgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAJICAgICB5ZXN8IiIpIGVuYWJsZWQ9eWVzIDs7CisgCSAgICAgbm8pIGVuYWJsZWQ9bm87IFVfRElTQUJMRV9SRU5BTUlORz0xIDs7CisgCSAgICAgKikgOzsKKyAgICAgZXNhYworIGZpCisgCistZWNobyAiJGFjX3QiIiRlbmFibGVkIiAxPiY2CisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGVuYWJsZWQiID4mNQorKyRhc19lY2hvICIkZW5hYmxlZCIgPiY2OyB9CisgCisgCistZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgZnVuY3Rpb24gYW5kIGRhdGEgdHJhY2luZyIiLi4uICRhY19jIiAxPiY2CistZWNobyAiY29uZmlndXJlOjE4ODU6IGNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIGZ1bmN0aW9uIGFuZCBkYXRhIHRyYWNpbmciID4mNQorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBmdW5jdGlvbiBhbmQgZGF0YSB0cmFjaW5nIiA+JjUKKyskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBmdW5jdGlvbiBhbmQgZGF0YSB0cmFjaW5nLi4uICIgPiY2OyB9CisgZW5hYmxlZD15ZXMKKyBVX0VOQUJMRV9UUkFDSU5HPTEKKy0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtdHJhY2luZyBvciAtLWRpc2FibGUtdHJhY2luZyB3YXMgZ2l2ZW4uCisrIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXRyYWNpbmcgd2FzIGdpdmVuLgorIGlmIHRlc3QgIiR7ZW5hYmxlX3RyYWNpbmcrc2V0fSIgPSBzZXQ7IHRoZW4KKy0gIGVuYWJsZXZhbD0iJGVuYWJsZV90cmFjaW5nIgorLSAgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKysgIGVuYWJsZXZhbD0kZW5hYmxlX3RyYWNpbmc7ICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgCSAgICAgeWVzfCIiKSBlbmFibGVkPXllcyA7OworIAkgICAgIG5vKSBlbmFibGVkPW5vOyBVX0VOQUJMRV9UUkFDSU5HPTAgOzsKKyAJICAgICAqKSA7OworICAgICBlc2FjCisgZmkKKyAKKy1lY2hvICIkYWNfdCIiJGVuYWJsZWQiIDE+JjYKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkZW5hYmxlZCIgPiY1CisrJGFzX2VjaG8gIiRlbmFibGVkIiA+JjY7IH0KKyAKKyAKKy0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtcnBhdGggb3IgLS1kaXNhYmxlLXJwYXRoIHdhcyBnaXZlbi4KKysjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtcnBhdGggd2FzIGdpdmVuLgorIGlmIHRlc3QgIiR7ZW5hYmxlX3JwYXRoK3NldH0iID0gc2V0OyB0aGVuCistICBlbmFibGV2YWw9IiRlbmFibGVfcnBhdGgiCistICAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorKyAgZW5hYmxldmFsPSRlbmFibGVfcnBhdGg7ICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgCSAgICAgeWVzfCIiKSBFTkFCTEVfUlBBVEg9WUVTIDs7CisgCSAgICAgbm8pIDs7CisgCSAgICAgKikgOzsKK0BAIC0xOTEzLDM0ICs0Mzc5LDYwIEBACisgCisgCisgCistZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGRlZmluaXRpb24gb2YgVV9JTkxJTkUgZm9yIEMiIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZToxOTE4OiBjaGVja2luZyBmb3IgZGVmaW5pdGlvbiBvZiBVX0lOTElORSBmb3IgQyIgPiY1CistaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfaW5saW5lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKy0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBkZWZpbml0aW9uIG9mIFVfSU5MSU5FIGZvciBDIiA+JjUKKyskYXNfZWNob19uICJjaGVja2luZyBmb3IgZGVmaW5pdGlvbiBvZiBVX0lOTElORSBmb3IgQy4uLiAiID4mNjsgfQorK2lmIHRlc3QgIiR7YWNfY3ZfY19pbmxpbmUrc2V0fSIgPSBzZXQ7IHRoZW4KKysgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisgZWxzZQorICAgYWNfY3ZfY19pbmxpbmU9bm8KKyBmb3IgYWNfa3cgaW4gaW5saW5lIF9faW5saW5lX18gX19pbmxpbmU7IGRvCistICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCistI2xpbmUgMTkyNSAiY29uZmlndXJlIgorLSNpbmNsdWRlICJjb25mZGVmcy5oIgorKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyAKKy1pbnQgbWFpbigpIHsKKytpbnQKKyttYWluICgpCisreworIH0gJGFjX2t3IGZvbygpIHsKKy07IHJldHVybiAwOyB9CistRU9GCistaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxOTMyOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCistICBybSAtcmYgY29uZnRlc3QqCisrICA7CisrICByZXR1cm4gMDsKKyt9CisrX0FDRU9GCisrcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisrCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisrICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgICBhY19jdl9jX2lubGluZT0kYWNfa3c7IGJyZWFrCisgZWxzZQorLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKy0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cisrc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorKworKworIGZpCistcm0gLWYgY29uZnRlc3QqCisrCisrcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgICBkb25lCistICAKKy1maQorIAorLWVjaG8gIiRhY190IiIkYWNfY3ZfY19pbmxpbmUiIDE+JjYKKytmaQorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9jX2lubGluZSIgPiY1CisrJGFzX2VjaG8gIiRhY19jdl9jX2lubGluZSIgPiY2OyB9CisgY2FzZSAiJGFjX2N2X2NfaW5saW5lIiBpbgorICAgICAgIHllcykgICAgICAgVV9JTkxJTkU9ICJpbmxpbmUiIDs7CisgCSAgbm8gKSAgICAgICBVX0lOTElORT0gOzsKK0BAIC0xOTUwLDEzICs0NDQyLDE0IEBACisgCisgdGhyZWFkcz10cnVlCisgCistIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXRocmVhZHMgb3IgLS1kaXNhYmxlLXRocmVhZHMgd2FzIGdpdmVuLgorKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS10aHJlYWRzIHdhcyBnaXZlbi4KKyBpZiB0ZXN0ICIke2VuYWJsZV90aHJlYWRzK3NldH0iID0gc2V0OyB0aGVuCistICBlbmFibGV2YWw9IiRlbmFibGVfdGhyZWFkcyIKKy0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKysgIGVuYWJsZXZhbD0kZW5hYmxlX3RocmVhZHM7IGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAJCXllcykgdGhyZWFkcz10cnVlIDs7CisgCQlubykgIHRocmVhZHM9ZmFsc2UgOzsKKy0JCSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgLS1lbmFibGUtdGhyZWFkcyIgMT4mMjsgZXhpdCAxOyB9IDs7CisrCQkqKSB7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgLS1lbmFibGUtdGhyZWFkcyIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGJhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIC0tZW5hYmxlLXRocmVhZHMiID4mMjt9CisrICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9IDs7CisgCQllc2FjCisgZWxzZQorICAgdGhyZWFkcz10cnVlCitAQCAtMTk3MiwxNzEgKzQ0NjUsMjk1IEBACisgSUNVX1VTRV9USFJFQURTPTAKKyAKKyBpZiB0ZXN0ICR0aHJlYWRzID0gdHJ1ZTsgdGhlbgorLSAgICAgICAgICAgCistICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgcHRocmVhZF9hdHRyX2luaXQgaW4gLWxwdGhyZWFkIiIuLi4gJGFjX2MiIDE+JjYKKy1lY2hvICJjb25maWd1cmU6MTk3ODogY2hlY2tpbmcgZm9yIHB0aHJlYWRfYXR0cl9pbml0IGluIC1scHRocmVhZCIgPiY1CistYWNfbGliX3Zhcj1gZWNobyBwdGhyZWFkJ18ncHRocmVhZF9hdHRyX2luaXQgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCistaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCistICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorKworKworK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgcHRocmVhZF9hdHRyX2luaXQgaW4gLWxwdGhyZWFkIiA+JjUKKyskYXNfZWNob19uICJjaGVja2luZyBmb3IgcHRocmVhZF9hdHRyX2luaXQgaW4gLWxwdGhyZWFkLi4uICIgPiY2OyB9CisraWYgdGVzdCAiJHthY19jdl9saWJfcHRocmVhZF9wdGhyZWFkX2F0dHJfaW5pdCtzZXR9IiA9IHNldDsgdGhlbgorKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKyBlbHNlCistICBhY19zYXZlX0xJQlM9IiRMSUJTIgorKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworIExJQlM9Ii1scHRocmVhZCAgJExJQlMiCistY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorLSNsaW5lIDE5ODYgImNvbmZpZ3VyZSIKKy0jaW5jbHVkZSAiY29uZmRlZnMuaCIKKy0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKy0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKy1jaGFyIHB0aHJlYWRfYXR0cl9pbml0KCk7CistCistaW50IG1haW4oKSB7CistcHRocmVhZF9hdHRyX2luaXQoKQorLTsgcmV0dXJuIDA7IH0KKy1FT0YKKy1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE5OTc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKKy1lbHNlCistICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CistICBybSAtcmYgY29uZnRlc3QqCistICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCistZmkKKy1ybSAtZiBjb25mdGVzdCoKKy1MSUJTPSIkYWNfc2F2ZV9MSUJTIgorLQorLWZpCistaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KKy0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKy0gICAgYWNfdHJfbGliPUhBVkVfTElCYGVjaG8gcHRocmVhZCB8IHNlZCAtZSAncy9bXmEtekEtWjAtOV9dL18vZycgXAorLSAgICAtZSAneS9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi8nYAorLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKy0jZGVmaW5lICRhY190cl9saWIgMQorLUVPRgorK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGNvbmZkZWZzLmguICAqLworK19BQ0VPRgorK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBlbmQgY29uZmRlZnMuaC4gICovCisrCisrLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisrICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisrICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKysjaWZkZWYgX19jcGx1c3BsdXMKKytleHRlcm4gIkMiCisrI2VuZGlmCisrY2hhciBwdGhyZWFkX2F0dHJfaW5pdCAoKTsKKytpbnQKKyttYWluICgpCisreworK3JldHVybiBwdGhyZWFkX2F0dHJfaW5pdCAoKTsKKysgIDsKKysgIHJldHVybiAwOworK30KKytfQUNFT0YKKytybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisrCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisrICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgeworKwkgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgfHwKKysJICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0CisrICAgICAgIH07IHRoZW4KKysgIGFjX2N2X2xpYl9wdGhyZWFkX3B0aHJlYWRfYXR0cl9pbml0PXllcworK2Vsc2UKKysgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKysKKysJYWNfY3ZfbGliX3B0aHJlYWRfcHRocmVhZF9hdHRyX2luaXQ9bm8KKytmaQorKworK3JtIC1yZiBjb25mdGVzdC5kU1lNCisrcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKKysgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKKytmaQorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9saWJfcHRocmVhZF9wdGhyZWFkX2F0dHJfaW5pdCIgPiY1CisrJGFzX2VjaG8gIiRhY19jdl9saWJfcHRocmVhZF9wdGhyZWFkX2F0dHJfaW5pdCIgPiY2OyB9CisraWYgdGVzdCAieCRhY19jdl9saWJfcHRocmVhZF9wdGhyZWFkX2F0dHJfaW5pdCIgPSB4IiJ5ZXM7IHRoZW4KKysgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKysjZGVmaW5lIEhBVkVfTElCUFRIUkVBRCAxCisrX0FDRU9GCisgCisgICBMSUJTPSItbHB0aHJlYWQgJExJQlMiCisgCistZWxzZQorLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CisgZmkKKyAKKyAgIGlmIHRlc3QgJGFjX2N2X2xpYl9wdGhyZWFkX3B0aHJlYWRfYXR0cl9pbml0ID0geWVzOyB0aGVuCisgICAgSUNVX1VTRV9USFJFQURTPTEKKyAgIGVsc2UKKy0gICAgICAgICAgICAgICAKKy0gICAKKy1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSIiLi4uICRhY19jIiAxPiY2CistZWNobyAiY29uZmlndXJlOjIwMzA6IGNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgcHRocmVhZF9tdXRleF9kZXN0cm95IiA+JjUKKy1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfc2VhcmNoX3B0aHJlYWRfbXV0ZXhfZGVzdHJveScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCistICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorKworKworK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyBwdGhyZWFkX211dGV4X2Rlc3Ryb3kuLi4gIiA+JjY7IH0KKytpZiB0ZXN0ICIke2FjX2N2X3NlYXJjaF9wdGhyZWFkX211dGV4X2Rlc3Ryb3krc2V0fSIgPSBzZXQ7IHRoZW4KKysgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisgZWxzZQorICAgYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTPSIkTElCUyIKKyBhY19jdl9zZWFyY2hfcHRocmVhZF9tdXRleF9kZXN0cm95PSJubyIKKyBmb3IgaSBpbiBwdGhyZWFkIHB0aHJlYWRzIGNfciA7IGRvCisgTElCUz0iLWwkaSAgJGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUyIKKy1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCistI2xpbmUgMjAzOSAiY29uZmlndXJlIgorLSNpbmNsdWRlICJjb25mZGVmcy5oIgorLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCistLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworLWNoYXIgcHRocmVhZF9tdXRleF9kZXN0cm95KCk7CistCistaW50IG1haW4oKSB7CistcHRocmVhZF9tdXRleF9kZXN0cm95KCkKKy07IHJldHVybiAwOyB9CistRU9GCistaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDUwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKy0gIHJtIC1yZiBjb25mdGVzdCoKKytjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworKworKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisrI2lmZGVmIF9fY3BsdXNwbHVzCisrZXh0ZXJuICJDIgorKyNlbmRpZgorK2NoYXIgcHRocmVhZF9tdXRleF9kZXN0cm95ICgpOworK2ludAorK21haW4gKCkKKyt7CisrcmV0dXJuIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSAoKTsKKysgIDsKKysgIHJldHVybiAwOworK30KKytfQUNFT0YKKytybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisrCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisrICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgeworKwkgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgfHwKKysJICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0CisrICAgICAgIH07IHRoZW4KKyAgIGFjX2N2X3NlYXJjaF9wdGhyZWFkX211dGV4X2Rlc3Ryb3k9Ii1sJGkiCisgYnJlYWsKKyBlbHNlCistICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrCisgZmkKKy1ybSAtZiBjb25mdGVzdCoKKysKKytybSAtcmYgY29uZnRlc3QuZFNZTQorK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCisrICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyBkb25lCisgaWYgdGVzdCAiJGFjX2N2X3NlYXJjaF9wdGhyZWFkX211dGV4X2Rlc3Ryb3kiID0gIm5vIjsgdGhlbgorLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKy0jbGluZSAyMDYyICJjb25maWd1cmUiCistI2luY2x1ZGUgImNvbmZkZWZzLmgiCistLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCistICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCistY2hhciBwdGhyZWFkX211dGV4X2Rlc3Ryb3koKTsKKy0KKy1pbnQgbWFpbigpIHsKKy1wdGhyZWFkX211dGV4X2Rlc3Ryb3koKQorLTsgcmV0dXJuIDA7IH0KKy1FT0YKKy1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIwNzM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGNvbmZkZWZzLmguICAqLworK19BQ0VPRgorK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBlbmQgY29uZmRlZnMuaC4gICovCisrCisrLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisrICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisrICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKysjaWZkZWYgX19jcGx1c3BsdXMKKytleHRlcm4gIkMiCisrI2VuZGlmCisrY2hhciBwdGhyZWFkX211dGV4X2Rlc3Ryb3kgKCk7CisraW50CisrbWFpbiAoKQorK3sKKytyZXR1cm4gcHRocmVhZF9tdXRleF9kZXN0cm95ICgpOworKyAgOworKyAgcmV0dXJuIDA7CisrfQorK19BQ0VPRgorK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CisraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKKytjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKysgIGFjX3N0YXR1cz0kPworKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKysgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisrCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKysJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKysgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJiB7CisrCSB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllcyB8fAorKwkgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQKKysgICAgICAgfTsgdGhlbgorICAgYWNfY3Zfc2VhcmNoX3B0aHJlYWRfbXV0ZXhfZGVzdHJveT0ibm9uZSByZXF1aXJlZCIKKyBlbHNlCistICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrCisgZmkKKy1ybSAtZiBjb25mdGVzdCoKKysKKytybSAtcmYgY29uZnRlc3QuZFNZTQorK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCisrICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyBmaQorIExJQlM9IiRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMiCisgZmkKKy0KKy1lY2hvICIkYWNfdCIiJGFjX2N2X3NlYXJjaF9wdGhyZWFkX211dGV4X2Rlc3Ryb3kiIDE+JjYKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfc2VhcmNoX3B0aHJlYWRfbXV0ZXhfZGVzdHJveSIgPiY1CisrJGFzX2VjaG8gIiRhY19jdl9zZWFyY2hfcHRocmVhZF9tdXRleF9kZXN0cm95IiA+JjY7IH0KKyBpZiB0ZXN0ICIkYWNfY3Zfc2VhcmNoX3B0aHJlYWRfbXV0ZXhfZGVzdHJveSIgIT0gIm5vIjsgdGhlbgorICAgdGVzdCAiJGFjX2N2X3NlYXJjaF9wdGhyZWFkX211dGV4X2Rlc3Ryb3kiID0gIm5vbmUgcmVxdWlyZWQiIHx8IExJQlM9IiRhY19jdl9zZWFyY2hfcHRocmVhZF9tdXRleF9kZXN0cm95ICRMSUJTIgorLSAgCisrCisgZWxzZSA6CistICAKKysKKyBmaQorIAorICAgIGlmIHRlc3QgIiRhY19jdl9zZWFyY2hfcHRocmVhZF9tdXRleF9kZXN0cm95IiAhPSBubzsgdGhlbgorICAgICBJQ1VfVVNFX1RIUkVBRFM9MQorICAgIGVsc2UKKy0gICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBwdGhyZWFkX211dGV4X2luaXQgaW4gLWxwdGhyZWFkIiIuLi4gJGFjX2MiIDE+JjYKKy1lY2hvICJjb25maWd1cmU6MjA5NzogY2hlY2tpbmcgZm9yIHB0aHJlYWRfbXV0ZXhfaW5pdCBpbiAtbHB0aHJlYWQiID4mNQorLWFjX2xpYl92YXI9YGVjaG8gcHRocmVhZCdfJ3B0aHJlYWRfbXV0ZXhfaW5pdCB8IHNlZCAneSUuLystJV9fcF8lJ2AKKy1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKy0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CisrCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBwdGhyZWFkX211dGV4X2luaXQgaW4gLWxwdGhyZWFkIiA+JjUKKyskYXNfZWNob19uICJjaGVja2luZyBmb3IgcHRocmVhZF9tdXRleF9pbml0IGluIC1scHRocmVhZC4uLiAiID4mNjsgfQorK2lmIHRlc3QgIiR7YWNfY3ZfbGliX3B0aHJlYWRfcHRocmVhZF9tdXRleF9pbml0K3NldH0iID0gc2V0OyB0aGVuCisrICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorIGVsc2UKKy0gIGFjX3NhdmVfTElCUz0iJExJQlMiCisrICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCisgTElCUz0iLWxwdGhyZWFkICAkTElCUyIKKy1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCistI2xpbmUgMjEwNSAiY29uZmlndXJlIgorLSNpbmNsdWRlICJjb25mZGVmcy5oIgorLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCistLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworLWNoYXIgcHRocmVhZF9tdXRleF9pbml0KCk7CistCistaW50IG1haW4oKSB7CistcHRocmVhZF9tdXRleF9pbml0KCkKKy07IHJldHVybiAwOyB9CistRU9GCistaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTE2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKy0gIHJtIC1yZiBjb25mdGVzdCoKKy0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCistZWxzZQorLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKy0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgorLWZpCistcm0gLWYgY29uZnRlc3QqCistTElCUz0iJGFjX3NhdmVfTElCUyIKKy0KKy1maQorLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCistICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CistICAgIGFjX3RyX2xpYj1IQVZFX0xJQmBlY2hvIHB0aHJlYWQgfCBzZWQgLWUgJ3MvW15hLXpBLVowLTlfXS9fL2cnIFwKKy0gICAgLWUgJ3kvYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovJ2AKKy0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCistI2RlZmluZSAkYWNfdHJfbGliIDEKKy1FT0YKKytjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworKworKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisrI2lmZGVmIF9fY3BsdXNwbHVzCisrZXh0ZXJuICJDIgorKyNlbmRpZgorK2NoYXIgcHRocmVhZF9tdXRleF9pbml0ICgpOworK2ludAorK21haW4gKCkKKyt7CisrcmV0dXJuIHB0aHJlYWRfbXV0ZXhfaW5pdCAoKTsKKysgIDsKKysgIHJldHVybiAwOworK30KKytfQUNFT0YKKytybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisrCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisrICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgeworKwkgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgfHwKKysJICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0CisrICAgICAgIH07IHRoZW4KKysgIGFjX2N2X2xpYl9wdGhyZWFkX3B0aHJlYWRfbXV0ZXhfaW5pdD15ZXMKKytlbHNlCisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrCWFjX2N2X2xpYl9wdGhyZWFkX3B0aHJlYWRfbXV0ZXhfaW5pdD1ubworK2ZpCisrCisrcm0gLXJmIGNvbmZ0ZXN0LmRTWU0KKytybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisrTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworK2ZpCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2xpYl9wdGhyZWFkX3B0aHJlYWRfbXV0ZXhfaW5pdCIgPiY1CisrJGFzX2VjaG8gIiRhY19jdl9saWJfcHRocmVhZF9wdGhyZWFkX211dGV4X2luaXQiID4mNjsgfQorK2lmIHRlc3QgIngkYWNfY3ZfbGliX3B0aHJlYWRfcHRocmVhZF9tdXRleF9pbml0IiA9IHgiInllczsgdGhlbgorKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorKyNkZWZpbmUgSEFWRV9MSUJQVEhSRUFEIDEKKytfQUNFT0YKKyAKKyAgIExJQlM9Ii1scHRocmVhZCAkTElCUyIKKyAKKy1lbHNlCistICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKyBmaQorIAorICAgICBpZiB0ZXN0ICRhY19jdl9saWJfcHRocmVhZF9wdGhyZWFkX211dGV4X2luaXQgPSB5ZXM7IHRoZW4KK0BAIC0yMTQ0LDUzICs0NzYxLDkxIEBACisgICAgIGZpCisgICAgZmkKKyAKKy0gICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgcHRocmVhZF9tdXRleF9sb2NrIiIuLi4gJGFjX2MiIDE+JjYKKy1lY2hvICJjb25maWd1cmU6MjE0OTogY2hlY2tpbmcgZm9yIHB0aHJlYWRfbXV0ZXhfbG9jayIgPiY1CistaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfcHRocmVhZF9tdXRleF9sb2NrJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKy0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CistZWxzZQorLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorLSNsaW5lIDIxNTQgImNvbmZpZ3VyZSIKKy0jaW5jbHVkZSAiY29uZmRlZnMuaCIKKysgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHB0aHJlYWRfbXV0ZXhfbG9jayIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHB0aHJlYWRfbXV0ZXhfbG9jay4uLiAiID4mNjsgfQorK2lmIHRlc3QgIiR7YWNfY3ZfZnVuY19wdGhyZWFkX211dGV4X2xvY2src2V0fSIgPSBzZXQ7IHRoZW4KKysgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisrZWxzZQorKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKysvKiBEZWZpbmUgcHRocmVhZF9tdXRleF9sb2NrIHRvIGFuIGlubm9jdW91cyB2YXJpYW50LCBpbiBjYXNlIDxsaW1pdHMuaD4gZGVjbGFyZXMgcHRocmVhZF9tdXRleF9sb2NrLgorKyAgIEZvciBleGFtcGxlLCBIUC1VWCAxMWkgPGxpbWl0cy5oPiBkZWNsYXJlcyBnZXR0aW1lb2ZkYXkuICAqLworKyNkZWZpbmUgcHRocmVhZF9tdXRleF9sb2NrIGlubm9jdW91c19wdGhyZWFkX211dGV4X2xvY2sKKysKKyAvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCistICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgcHRocmVhZF9tdXRleF9sb2NrKCk7IGJlbG93LiAgKi8KKy0jaW5jbHVkZSA8YXNzZXJ0Lmg+CistLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCistICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCistY2hhciBwdGhyZWFkX211dGV4X2xvY2soKTsKKysgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciBwdGhyZWFkX211dGV4X2xvY2sgKCk7IGJlbG93LgorKyAgICBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCisrICAgIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4gICovCisrCisrI2lmZGVmIF9fU1REQ19fCisrIyBpbmNsdWRlIDxsaW1pdHMuaD4KKysjZWxzZQorKyMgaW5jbHVkZSA8YXNzZXJ0Lmg+CisrI2VuZGlmCisgCistaW50IG1haW4oKSB7CisrI3VuZGVmIHB0aHJlYWRfbXV0ZXhfbG9jaworIAorKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisrI2lmZGVmIF9fY3BsdXNwbHVzCisrZXh0ZXJuICJDIgorKyNlbmRpZgorK2NoYXIgcHRocmVhZF9tdXRleF9sb2NrICgpOworIC8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCistI2lmIGRlZmluZWQgKF9fc3R1Yl9wdGhyZWFkX211dGV4X2xvY2spIHx8IGRlZmluZWQgKF9fc3R1Yl9fX3B0aHJlYWRfbXV0ZXhfbG9jaykKKysjaWYgZGVmaW5lZCBfX3N0dWJfcHRocmVhZF9tdXRleF9sb2NrIHx8IGRlZmluZWQgX19zdHViX19fcHRocmVhZF9tdXRleF9sb2NrCisgY2hva2UgbWUKKy0jZWxzZQorLXB0aHJlYWRfbXV0ZXhfbG9jaygpOworICNlbmRpZgorIAorLTsgcmV0dXJuIDA7IH0KKy1FT0YKKy1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIxNzc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorLSAgZXZhbCAiYWNfY3ZfZnVuY19wdGhyZWFkX211dGV4X2xvY2s9eWVzIgorLWVsc2UKKy0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CistICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKy0gIHJtIC1yZiBjb25mdGVzdCoKKy0gIGV2YWwgImFjX2N2X2Z1bmNfcHRocmVhZF9tdXRleF9sb2NrPW5vIgorLWZpCistcm0gLWYgY29uZnRlc3QqCistZmkKKy0KKy1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXydwdGhyZWFkX211dGV4X2xvY2tgXCIgPSB5ZXMiOyB0aGVuCistICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CistICA6CistZWxzZQorLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CisraW50CisrbWFpbiAoKQorK3sKKytyZXR1cm4gcHRocmVhZF9tdXRleF9sb2NrICgpOworKyAgOworKyAgcmV0dXJuIDA7CisrfQorK19BQ0VPRgorK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CisraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKKytjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKysgIGFjX3N0YXR1cz0kPworKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKysgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisrCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKysJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKysgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJiB7CisrCSB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllcyB8fAorKwkgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQKKysgICAgICAgfTsgdGhlbgorKyAgYWNfY3ZfZnVuY19wdGhyZWFkX211dGV4X2xvY2s9eWVzCisrZWxzZQorKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cisrc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorKworKwlhY19jdl9mdW5jX3B0aHJlYWRfbXV0ZXhfbG9jaz1ubworK2ZpCisrCisrcm0gLXJmIGNvbmZ0ZXN0LmRTWU0KKytybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisgZmkKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfZnVuY19wdGhyZWFkX211dGV4X2xvY2siID4mNQorKyRhc19lY2hvICIkYWNfY3ZfZnVuY19wdGhyZWFkX211dGV4X2xvY2siID4mNjsgfQorIAorIAorICAgIGlmIHRlc3QgJGFjX2N2X2Z1bmNfcHRocmVhZF9tdXRleF9sb2NrID0geWVzOyB0aGVuCitAQCAtMjE5OCw3ICs0ODUzLDcgQEAKKyAgICBmaQorICAgICAgIGNhc2UgIiR7aG9zdH0iIGluCisgICAgKi1wYy1jeWd3aW4qfCotcGMtbWluZ3cqKQorLSAgICAgaWYgdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IG5vOyB0aGVuCisrICAgICBpZiB0ZXN0ICIkYWNfY3ZfY19jb21waWxlcl9nbnUiID0gbm87IHRoZW4KKyAgICAgICAgICAgICAgIElDVV9VU0VfVEhSRUFEUz0xCisgICAgICBmaSA7OworICAgICotKi1ocHV4KikKK0BAIC0yMjIyLDM3ICs0ODc3LDY3IEBACisgIyBUaGUgQUNfRlVOQ19NTUFQIG1hY3JvIGRvZXNuJ3Qgd29yayBwcm9wZXJseS4gIEl0IHNlZW1zIHRvIGJlIHRvbyBzcGVjaWZpYy4KKyAjIERvIHRoaXMgY2hlY2sgaW5zdGVhZC4KKyBIQVZFX01NQVA9MAorLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBtbWFwIiIuLi4gJGFjX2MiIDE+JjYKKy1lY2hvICJjb25maWd1cmU6MjIyNzogY2hlY2tpbmcgZm9yIG1tYXAiID4mNQorLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX21tYXBfb2snK3NldH0nYFwiID0gc2V0IjsgdGhlbgorLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKy1lbHNlCistICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCistI2xpbmUgMjIzMiAiY29uZmlndXJlIgorLSNpbmNsdWRlICJjb25mZGVmcy5oIgorLSAgICAKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIG1tYXAiID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBtbWFwLi4uICIgPiY2OyB9CisraWYgdGVzdCAiJHthY19jdl9mdW5jX21tYXBfb2src2V0fSIgPSBzZXQ7IHRoZW4KKysgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisrZWxzZQorKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKysKKyAjaW5jbHVkZSA8dW5pc3RkLmg+CisgI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisgI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisgI2luY2x1ZGUgPGZjbnRsLmg+CistICAgIAorLWludCBtYWluKCkgeworKworK2ludAorK21haW4gKCkKKyt7CisgICAgIG1tYXAoKHZvaWQgKikwLCAwLCBQUk9UX1JFQUQsIDAsIDAsIDApOworLTsgcmV0dXJuIDA7IH0KKy1FT0YKKy1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIyNDQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorKyAgOworKyAgcmV0dXJuIDA7CisrfQorK19BQ0VPRgorK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CisraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKKytjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKysgIGFjX3N0YXR1cz0kPworKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKysgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisrCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKysJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKysgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJiB7CisrCSB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllcyB8fAorKwkgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQKKysgICAgICAgfTsgdGhlbgorICAgYWNfY3ZfZnVuY19tbWFwX29rPXllcworIGVsc2UKKy0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CistICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKy0gIHJtIC1yZiBjb25mdGVzdCoKKy0gIGFjX2N2X2Z1bmNfbW1hcF9vaz1ubworKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cisrc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorKworKwlhY19jdl9mdW5jX21tYXBfb2s9bm8KKyBmaQorLXJtIC1mIGNvbmZ0ZXN0KiAKKysKKytybSAtcmYgY29uZnRlc3QuZFNZTQorK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCisrICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyBmaQorIAorLWVjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19tbWFwX29rIiAxPiY2CisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2Z1bmNfbW1hcF9vayIgPiY1CisrJGFzX2VjaG8gIiRhY19jdl9mdW5jX21tYXBfb2siID4mNjsgfQorIGlmIHRlc3QgJGFjX2N2X2Z1bmNfbW1hcF9vayA9IHllcworIHRoZW4KKyAgICAgSEFWRV9NTUFQPTEKK0BAIC0yMjY5LDEyNCArNDk1NCw3NzIgQEAKKyAKKyAKKyAKKy1lY2hvICRhY19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIiLi4uICRhY19jIiAxPiY2CistZWNobyAiY29uZmlndXJlOjIyNzQ6IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKKythY19leHQ9YworK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCisrYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCisrYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IuLi4gIiA+JjY7IH0KKyAjIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgorIGlmIHRlc3QgLW4gIiRDUFAiICYmIHRlc3QgLWQgIiRDUFAiOyB0aGVuCisgICBDUFA9CisgZmkKKyBpZiB0ZXN0IC16ICIkQ1BQIjsgdGhlbgorLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NQUCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCistICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorKyAgaWYgdGVzdCAiJHthY19jdl9wcm9nX0NQUCtzZXR9IiA9IHNldDsgdGhlbgorKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKytlbHNlCisrICAgICAgIyBEb3VibGUgcXVvdGVzIGJlY2F1c2UgQ1BQIG5lZWRzIHRvIGJlIGV4cGFuZGVkCisrICAgIGZvciBDUFAgaW4gIiRDQyAtRSIgIiRDQyAtRSAtdHJhZGl0aW9uYWwtY3BwIiAiL2xpYi9jcHAiCisrICAgIGRvCisrICAgICAgYWNfcHJlcHJvY19vaz1mYWxzZQorK2ZvciBhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcworK2RvCisrICAjIFVzZSBhIGhlYWRlciBmaWxlIHRoYXQgY29tZXMgd2l0aCBnY2MsIHNvIGNvbmZpZ3VyaW5nIGdsaWJjCisrICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KKysgICMgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQorKyAgIyA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuCisrICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAorKyAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4gIlN5bnRheCBlcnJvciIgaXMgaGVyZSB0byBjYXRjaCB0aGlzIGNhc2UuCisrICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworKyNpZmRlZiBfX1NURENfXworKyMgaW5jbHVkZSA8bGltaXRzLmg+CisrI2Vsc2UKKysjIGluY2x1ZGUgPGFzc2VydC5oPgorKyNlbmRpZgorKwkJICAgICBTeW50YXggZXJyb3IKKytfQUNFT0YKKytpZiB7IChhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIKKytjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbCAmJiB7CisrCSB0ZXN0IC16ICIkYWNfY19wcmVwcm9jX3dhcm5fZmxhZyRhY19jX3dlcnJvcl9mbGFnIiB8fAorKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorKyAgICAgICB9OyB0aGVuCisrICA6CisrZWxzZQorKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cisrc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorKworKyAgIyBCcm9rZW46IGZhaWxzIG9uIHZhbGlkIGlucHV0LgorK2NvbnRpbnVlCisrZmkKKysKKytybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAorKworKyAgIyBPSywgd29ya3Mgb24gc2FuZSBjYXNlcy4gIE5vdyBjaGVjayB3aGV0aGVyIG5vbmV4aXN0ZW50IGhlYWRlcnMKKysgICMgY2FuIGJlIGRldGVjdGVkIGFuZCBob3cuCisrICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworKyNpbmNsdWRlIDxhY19ub25leGlzdGVudC5oPgorK19BQ0VPRgorK2lmIHsgKGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IgorK2Nhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj5jb25mdGVzdC5lcjEKKysgIGFjX3N0YXR1cz0kPworKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKysgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsICYmIHsKKysJIHRlc3QgLXogIiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisrCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisrICAgICAgIH07IHRoZW4KKysgICMgQnJva2VuOiBzdWNjZXNzIG9uIGludmFsaWQgaW5wdXQuCisrY29udGludWUKKytlbHNlCisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrICAjIFBhc3NlcyBib3RoIHRlc3RzLgorK2FjX3ByZXByb2Nfb2s9OgorK2JyZWFrCisrZmkKKysKKytybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAorKworK2RvbmUKKysjIEJlY2F1c2Ugb2YgYGJyZWFrJywgX0FDX1BSRVBST0NfSUZFTFNFJ3MgY2xlYW5pbmcgY29kZSB3YXMgc2tpcHBlZC4KKytybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAorK2lmICRhY19wcmVwcm9jX29rOyB0aGVuCisrICBicmVhaworK2ZpCisrCisrICAgIGRvbmUKKysgICAgYWNfY3ZfcHJvZ19DUFA9JENQUAorKworK2ZpCisrICBDUFA9JGFjX2N2X3Byb2dfQ1BQCisgZWxzZQorLSAgICAjIFRoaXMgbXVzdCBiZSBpbiBkb3VibGUgcXVvdGVzLCBub3Qgc2luZ2xlIHF1b3RlcywgYmVjYXVzZSBDUFAgbWF5IGdldAorLSAgIyBzdWJzdGl0dXRlZCBpbnRvIHRoZSBNYWtlZmlsZSBhbmQgIiR7Q0MtY2N9IiB3aWxsIGNvbmZ1c2UgbWFrZS4KKy0gIENQUD0iJHtDQy1jY30gLUUiCisrICBhY19jdl9wcm9nX0NQUD0kQ1BQCisrZmkKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQ1BQIiA+JjUKKyskYXNfZWNobyAiJENQUCIgPiY2OyB9CisrYWNfcHJlcHJvY19vaz1mYWxzZQorK2ZvciBhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcworK2RvCisrICAjIFVzZSBhIGhlYWRlciBmaWxlIHRoYXQgY29tZXMgd2l0aCBnY2MsIHNvIGNvbmZpZ3VyaW5nIGdsaWJjCisrICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KKysgICMgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQorKyAgIyA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuCisgICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAorLSAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4KKy0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKy0jbGluZSAyMjg5ICJjb25maWd1cmUiCistI2luY2x1ZGUgImNvbmZkZWZzLmgiCistI2luY2x1ZGUgPGFzc2VydC5oPgorLVN5bnRheCBFcnJvcgorLUVPRgorLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCisteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjk1OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKKy1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorKyAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4gIlN5bnRheCBlcnJvciIgaXMgaGVyZSB0byBjYXRjaCB0aGlzIGNhc2UuCisrICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworKyNpZmRlZiBfX1NURENfXworKyMgaW5jbHVkZSA8bGltaXRzLmg+CisrI2Vsc2UKKysjIGluY2x1ZGUgPGFzc2VydC5oPgorKyNlbmRpZgorKwkJICAgICBTeW50YXggZXJyb3IKKytfQUNFT0YKKytpZiB7IChhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIKKytjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbCAmJiB7CisrCSB0ZXN0IC16ICIkYWNfY19wcmVwcm9jX3dhcm5fZmxhZyRhY19jX3dlcnJvcl9mbGFnIiB8fAorKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorKyAgICAgICB9OyB0aGVuCisgICA6CisgZWxzZQorLSAgZWNobyAiJGFjX2VyciIgPiY1CistICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CistICBybSAtcmYgY29uZnRlc3QqCistICBDUFA9IiR7Q0MtY2N9IC1FIC10cmFkaXRpb25hbC1jcHAiCistICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCistI2xpbmUgMjMwNiAiY29uZmlndXJlIgorLSNpbmNsdWRlICJjb25mZGVmcy5oIgorLSNpbmNsdWRlIDxhc3NlcnQuaD4KKy1TeW50YXggRXJyb3IKKy1FT0YKKy1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgorLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjMxMjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KKy1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCistaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKysgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKysKKysgICMgQnJva2VuOiBmYWlscyBvbiB2YWxpZCBpbnB1dC4KKytjb250aW51ZQorK2ZpCisrCisrcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKKysKKysgICMgT0ssIHdvcmtzIG9uIHNhbmUgY2FzZXMuICBOb3cgY2hlY2sgd2hldGhlciBub25leGlzdGVudCBoZWFkZXJzCisrICAjIGNhbiBiZSBkZXRlY3RlZCBhbmQgaG93LgorKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKysjaW5jbHVkZSA8YWNfbm9uZXhpc3RlbnQuaD4KKytfQUNFT0YKKytpZiB7IChhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIKKytjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbCAmJiB7CisrCSB0ZXN0IC16ICIkYWNfY19wcmVwcm9jX3dhcm5fZmxhZyRhY19jX3dlcnJvcl9mbGFnIiB8fAorKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorKyAgICAgICB9OyB0aGVuCisrICAjIEJyb2tlbjogc3VjY2VzcyBvbiBpbnZhbGlkIGlucHV0LgorK2NvbnRpbnVlCisrZWxzZQorKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cisrc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorKworKyAgIyBQYXNzZXMgYm90aCB0ZXN0cy4KKythY19wcmVwcm9jX29rPToKKyticmVhaworK2ZpCisrCisrcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKKysKKytkb25lCisrIyBCZWNhdXNlIG9mIGBicmVhaycsIF9BQ19QUkVQUk9DX0lGRUxTRSdzIGNsZWFuaW5nIGNvZGUgd2FzIHNraXBwZWQuCisrcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKKytpZiAkYWNfcHJlcHJvY19vazsgdGhlbgorICAgOgorIGVsc2UKKy0gIGVjaG8gIiRhY19lcnIiID4mNQorLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKy0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorLSAgQ1BQPSIke0NDLWNjfSAtbm9sb2dvIC1FIgorLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorLSNsaW5lIDIzMjMgImNvbmZpZ3VyZSIKKy0jaW5jbHVkZSAiY29uZmRlZnMuaCIKKy0jaW5jbHVkZSA8YXNzZXJ0Lmg+CistU3ludGF4IEVycm9yCistRU9GCistYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKKy17IChldmFsIGVjaG8gY29uZmlndXJlOjIzMjk6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CistYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAorLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCisrICB7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KKyt7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogQyBwcmVwcm9jZXNzb3IgXCIkQ1BQXCIgZmFpbHMgc2FuaXR5IGNoZWNrCisrU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBDIHByZXByb2Nlc3NvciBcIiRDUFBcIiBmYWlscyBzYW5pdHkgY2hlY2sKKytTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KKysgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07IH0KKytmaQorKworK2FjX2V4dD1jCisrYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKKythY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCisrYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKKythY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisrCisrCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBncmVwIHRoYXQgaGFuZGxlcyBsb25nIGxpbmVzIGFuZCAtZSIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGdyZXAgdGhhdCBoYW5kbGVzIGxvbmcgbGluZXMgYW5kIC1lLi4uICIgPiY2OyB9CisraWYgdGVzdCAiJHthY19jdl9wYXRoX0dSRVArc2V0fSIgPSBzZXQ7IHRoZW4KKysgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisrZWxzZQorKyAgaWYgdGVzdCAteiAiJEdSRVAiOyB0aGVuCisrICBhY19wYXRoX0dSRVBfZm91bmQ9ZmFsc2UKKysgICMgTG9vcCB0aHJvdWdoIHRoZSB1c2VyJ3MgcGF0aCBhbmQgdGVzdCBmb3IgZWFjaCBvZiBQUk9HTkFNRS1MSVNUCisrICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCisrZm9yIGFzX2RpciBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4KKytkbworKyAgSUZTPSRhc19zYXZlX0lGUworKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKysgIGZvciBhY19wcm9nIGluIGdyZXAgZ2dyZXA7IGRvCisrICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworKyAgICAgIGFjX3BhdGhfR1JFUD0iJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIKKysgICAgICB7IHRlc3QgLWYgIiRhY19wYXRoX0dSRVAiICYmICRhc190ZXN0X3ggIiRhY19wYXRoX0dSRVAiOyB9IHx8IGNvbnRpbnVlCisrIyBDaGVjayBmb3IgR05VIGFjX3BhdGhfR1JFUCBhbmQgc2VsZWN0IGl0IGlmIGl0IGlzIGZvdW5kLgorKyAgIyBDaGVjayBmb3IgR05VICRhY19wYXRoX0dSRVAKKytjYXNlIGAiJGFjX3BhdGhfR1JFUCIgLS12ZXJzaW9uIDI+JjFgIGluCisrKkdOVSopCisrICBhY19jdl9wYXRoX0dSRVA9IiRhY19wYXRoX0dSRVAiIGFjX3BhdGhfR1JFUF9mb3VuZD06OzsKKysqKQorKyAgYWNfY291bnQ9MAorKyAgJGFzX2VjaG9fbiAwMTIzNDU2Nzg5ID4iY29uZnRlc3QuaW4iCisrICB3aGlsZSA6CisrICBkbworKyAgICBjYXQgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QuaW4iID4iY29uZnRlc3QudG1wIgorKyAgICBtdiAiY29uZnRlc3QudG1wIiAiY29uZnRlc3QuaW4iCisrICAgIGNwICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0Lm5sIgorKyAgICAkYXNfZWNobyAnR1JFUCcgPj4gImNvbmZ0ZXN0Lm5sIgorKyAgICAiJGFjX3BhdGhfR1JFUCIgLWUgJ0dSRVAkJyAtZSAnLShjYW5ub3QgbWF0Y2gpLScgPCAiY29uZnRlc3QubmwiID4iY29uZnRlc3Qub3V0IiAyPi9kZXYvbnVsbCB8fCBicmVhaworKyAgICBkaWZmICJjb25mdGVzdC5vdXQiICJjb25mdGVzdC5ubCIgPi9kZXYvbnVsbCAyPiYxIHx8IGJyZWFrCisrICAgIGFjX2NvdW50PWBleHByICRhY19jb3VudCArIDFgCisrICAgIGlmIHRlc3QgJGFjX2NvdW50IC1ndCAke2FjX3BhdGhfR1JFUF9tYXgtMH07IHRoZW4KKysgICAgICAjIEJlc3Qgb25lIHNvIGZhciwgc2F2ZSBpdCBidXQga2VlcCBsb29raW5nIGZvciBhIGJldHRlciBvbmUKKysgICAgICBhY19jdl9wYXRoX0dSRVA9IiRhY19wYXRoX0dSRVAiCisrICAgICAgYWNfcGF0aF9HUkVQX21heD0kYWNfY291bnQKKysgICAgZmkKKysgICAgIyAxMCooMl4xMCkgY2hhcnMgYXMgaW5wdXQgc2VlbXMgbW9yZSB0aGFuIGVub3VnaAorKyAgICB0ZXN0ICRhY19jb3VudCAtZ3QgMTAgJiYgYnJlYWsKKysgIGRvbmUKKysgIHJtIC1mIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0LnRtcCBjb25mdGVzdC5ubCBjb25mdGVzdC5vdXQ7OworK2VzYWMKKysKKysgICAgICAkYWNfcGF0aF9HUkVQX2ZvdW5kICYmIGJyZWFrIDMKKysgICAgZG9uZQorKyAgZG9uZQorK2RvbmUKKytJRlM9JGFzX3NhdmVfSUZTCisrICBpZiB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HUkVQIjsgdGhlbgorKyAgICB7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogbm8gYWNjZXB0YWJsZSBncmVwIGNvdWxkIGJlIGZvdW5kIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbiIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgZ3JlcCBjb3VsZCBiZSBmb3VuZCBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4iID4mMjt9CisrICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisrICBmaQorK2Vsc2UKKysgIGFjX2N2X3BhdGhfR1JFUD0kR1JFUAorK2ZpCisrCisrZmkKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfcGF0aF9HUkVQIiA+JjUKKyskYXNfZWNobyAiJGFjX2N2X3BhdGhfR1JFUCIgPiY2OyB9CisrIEdSRVA9IiRhY19jdl9wYXRoX0dSRVAiCisrCisrCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBlZ3JlcCIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGVncmVwLi4uICIgPiY2OyB9CisraWYgdGVzdCAiJHthY19jdl9wYXRoX0VHUkVQK3NldH0iID0gc2V0OyB0aGVuCisrICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorK2Vsc2UKKysgIGlmIGVjaG8gYSB8ICRHUkVQIC1FICcoYXxiKScgPi9kZXYvbnVsbCAyPiYxCisrICAgdGhlbiBhY19jdl9wYXRoX0VHUkVQPSIkR1JFUCAtRSIKKysgICBlbHNlCisrICAgICBpZiB0ZXN0IC16ICIkRUdSRVAiOyB0aGVuCisrICBhY19wYXRoX0VHUkVQX2ZvdW5kPWZhbHNlCisrICAjIExvb3AgdGhyb3VnaCB0aGUgdXNlcidzIHBhdGggYW5kIHRlc3QgZm9yIGVhY2ggb2YgUFJPR05BTUUtTElTVAorKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorK2ZvciBhc19kaXIgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluCisrZG8KKysgIElGUz0kYXNfc2F2ZV9JRlMKKysgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisrICBmb3IgYWNfcHJvZyBpbiBlZ3JlcDsgZG8KKysgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisrICAgICAgYWNfcGF0aF9FR1JFUD0iJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIKKysgICAgICB7IHRlc3QgLWYgIiRhY19wYXRoX0VHUkVQIiAmJiAkYXNfdGVzdF94ICIkYWNfcGF0aF9FR1JFUCI7IH0gfHwgY29udGludWUKKysjIENoZWNrIGZvciBHTlUgYWNfcGF0aF9FR1JFUCBhbmQgc2VsZWN0IGl0IGlmIGl0IGlzIGZvdW5kLgorKyAgIyBDaGVjayBmb3IgR05VICRhY19wYXRoX0VHUkVQCisrY2FzZSBgIiRhY19wYXRoX0VHUkVQIiAtLXZlcnNpb24gMj4mMWAgaW4KKysqR05VKikKKysgIGFjX2N2X3BhdGhfRUdSRVA9IiRhY19wYXRoX0VHUkVQIiBhY19wYXRoX0VHUkVQX2ZvdW5kPTo7OworKyopCisrICBhY19jb3VudD0wCisrICAkYXNfZWNob19uIDAxMjM0NTY3ODkgPiJjb25mdGVzdC5pbiIKKysgIHdoaWxlIDoKKysgIGRvCisrICAgIGNhdCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5pbiIgPiJjb25mdGVzdC50bXAiCisrICAgIG12ICJjb25mdGVzdC50bXAiICJjb25mdGVzdC5pbiIKKysgICAgY3AgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QubmwiCisrICAgICRhc19lY2hvICdFR1JFUCcgPj4gImNvbmZ0ZXN0Lm5sIgorKyAgICAiJGFjX3BhdGhfRUdSRVAiICdFR1JFUCQnIDwgImNvbmZ0ZXN0Lm5sIiA+ImNvbmZ0ZXN0Lm91dCIgMj4vZGV2L251bGwgfHwgYnJlYWsKKysgICAgZGlmZiAiY29uZnRlc3Qub3V0IiAiY29uZnRlc3QubmwiID4vZGV2L251bGwgMj4mMSB8fCBicmVhaworKyAgICBhY19jb3VudD1gZXhwciAkYWNfY291bnQgKyAxYAorKyAgICBpZiB0ZXN0ICRhY19jb3VudCAtZ3QgJHthY19wYXRoX0VHUkVQX21heC0wfTsgdGhlbgorKyAgICAgICMgQmVzdCBvbmUgc28gZmFyLCBzYXZlIGl0IGJ1dCBrZWVwIGxvb2tpbmcgZm9yIGEgYmV0dGVyIG9uZQorKyAgICAgIGFjX2N2X3BhdGhfRUdSRVA9IiRhY19wYXRoX0VHUkVQIgorKyAgICAgIGFjX3BhdGhfRUdSRVBfbWF4PSRhY19jb3VudAorKyAgICBmaQorKyAgICAjIDEwKigyXjEwKSBjaGFycyBhcyBpbnB1dCBzZWVtcyBtb3JlIHRoYW4gZW5vdWdoCisrICAgIHRlc3QgJGFjX2NvdW50IC1ndCAxMCAmJiBicmVhaworKyAgZG9uZQorKyAgcm0gLWYgY29uZnRlc3QuaW4gY29uZnRlc3QudG1wIGNvbmZ0ZXN0Lm5sIGNvbmZ0ZXN0Lm91dDs7CisrZXNhYworKworKyAgICAgICRhY19wYXRoX0VHUkVQX2ZvdW5kICYmIGJyZWFrIDMKKysgICAgZG9uZQorKyAgZG9uZQorK2RvbmUKKytJRlM9JGFzX3NhdmVfSUZTCisrICBpZiB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9FR1JFUCI7IHRoZW4KKysgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IG5vIGFjY2VwdGFibGUgZWdyZXAgY291bGQgYmUgZm91bmQgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluIiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBlZ3JlcCBjb3VsZCBiZSBmb3VuZCBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4iID4mMjt9CisrICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisrICBmaQorK2Vsc2UKKysgIGFjX2N2X3BhdGhfRUdSRVA9JEVHUkVQCisrZmkKKysKKysgICBmaQorK2ZpCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3BhdGhfRUdSRVAiID4mNQorKyRhc19lY2hvICIkYWNfY3ZfcGF0aF9FR1JFUCIgPiY2OyB9CisrIEVHUkVQPSIkYWNfY3ZfcGF0aF9FR1JFUCIKKysKKysKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzLi4uICIgPiY2OyB9CisraWYgdGVzdCAiJHthY19jdl9oZWFkZXJfc3RkYytzZXR9IiA9IHNldDsgdGhlbgorKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKytlbHNlCisrICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworKyNpbmNsdWRlIDxzdGRsaWIuaD4KKysjaW5jbHVkZSA8c3RkYXJnLmg+CisrI2luY2x1ZGUgPHN0cmluZy5oPgorKyNpbmNsdWRlIDxmbG9hdC5oPgorKworK2ludAorK21haW4gKCkKKyt7CisrCisrICA7CisrICByZXR1cm4gMDsKKyt9CisrX0FDRU9GCisrcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisrCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisrICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisrICBhY19jdl9oZWFkZXJfc3RkYz15ZXMKKytlbHNlCisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrCWFjX2N2X2hlYWRlcl9zdGRjPW5vCisrZmkKKysKKytybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKysKKytpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorKyAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgorKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKysjaW5jbHVkZSA8c3RyaW5nLmg+CisrCisrX0FDRU9GCisraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorKyAgJEVHUkVQICJtZW1jaHIiID4vZGV2L251bGwgMj4mMTsgdGhlbgorICAgOgorIGVsc2UKKy0gIGVjaG8gIiRhY19lcnIiID4mNQorLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKy0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorLSAgQ1BQPS9saWIvY3BwCisrICBhY19jdl9oZWFkZXJfc3RkYz1ubworIGZpCisgcm0gLWYgY29uZnRlc3QqCisrCisgZmkKKy1ybSAtZiBjb25mdGVzdCoKKysKKytpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorKyAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgorKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKysjaW5jbHVkZSA8c3RkbGliLmg+CisrCisrX0FDRU9GCisraWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorKyAgJEVHUkVQICJmcmVlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKysgIDoKKytlbHNlCisrICBhY19jdl9oZWFkZXJfc3RkYz1ubworIGZpCisgcm0gLWYgY29uZnRlc3QqCistICBhY19jdl9wcm9nX0NQUD0iJENQUCIKKysKKyBmaQorLSAgQ1BQPSIkYWNfY3ZfcHJvZ19DUFAiCisrCisraWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKysgICMgL2Jpbi9jYyBpbiBJcml4LTQuMC41IGdldHMgbm9uLUFOU0kgY3R5cGUgbWFjcm9zIHVubGVzcyB1c2luZyAtYW5zaS4KKysgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisrICA6CisrZWxzZQorKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKysjaW5jbHVkZSA8Y3R5cGUuaD4KKysjaW5jbHVkZSA8c3RkbGliLmg+CisrI2lmICgoJyAnICYgMHgwRkYpID09IDB4MDIwKQorKyMgZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKKysjIGRlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCisrI2Vsc2UKKysjIGRlZmluZSBJU0xPV0VSKGMpIFwKKysJCSAgICgoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ2knKSBcCisrCQkgICAgIHx8ICgnaicgPD0gKGMpICYmIChjKSA8PSAncicpIFwKKysJCSAgICAgfHwgKCdzJyA8PSAoYykgJiYgKGMpIDw9ICd6JykpCisrIyBkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICgoYykgfCAweDQwKSA6IChjKSkKKysjZW5kaWYKKysKKysjZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQorK2ludAorK21haW4gKCkKKyt7CisrICBpbnQgaTsKKysgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKysgICAgaWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKQorKwl8fCB0b3VwcGVyIChpKSAhPSBUT1VQUEVSIChpKSkKKysgICAgICByZXR1cm4gMjsKKysgIHJldHVybiAwOworK30KKytfQUNFT0YKKytybSAtZiBjb25mdGVzdCRhY19leGVleHQKKytpZiB7IChhY190cnk9IiRhY19saW5rIgorK2Nhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX2xpbmsiKSAyPiY1CisrICBhY19zdGF0dXM9JD8KKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCisrICB7IChjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY190cnkiKSAyPiY1CisrICBhY19zdGF0dXM9JD8KKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorKyAgOgorIGVsc2UKKy0gIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgorKyAgJGFzX2VjaG8gIiRhc19tZTogcHJvZ3JhbSBleGl0ZWQgd2l0aCBzdGF0dXMgJGFjX3N0YXR1cyIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cisrc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorKworKyggZXhpdCAkYWNfc3RhdHVzICkKKythY19jdl9oZWFkZXJfc3RkYz1ubworK2ZpCisrcm0gLXJmIGNvbmZ0ZXN0LmRTWU0KKytybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKytmaQorKworKworK2ZpCisrZmkKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX3N0ZGMiID4mNQorKyRhc19lY2hvICIkYWNfY3ZfaGVhZGVyX3N0ZGMiID4mNjsgfQorK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisrCisrY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKysjZGVmaW5lIFNURENfSEVBREVSUyAxCisrX0FDRU9GCisrCisgZmkKKy1lY2hvICIkYWNfdCIiJENQUCIgMT4mNgorIAorLWZvciBhY19oZHIgaW4gaW50dHlwZXMuaAorKyMgT24gSVJJWCA1LjMsIHN5cy90eXBlcyBhbmQgaW50dHlwZXMuaCBhcmUgY29uZmxpY3RpbmcuCisrCisrCisrCisrCisrCisrCisrCisrCisrCisrZm9yIGFjX2hlYWRlciBpbiBzeXMvdHlwZXMuaCBzeXMvc3RhdC5oIHN0ZGxpYi5oIHN0cmluZy5oIG1lbW9yeS5oIHN0cmluZ3MuaCBcCisrCQkgIGludHR5cGVzLmggc3RkaW50LmggdW5pc3RkLmgKKyBkbworLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKKy1lY2hvICJjb25maWd1cmU6MjM1NzogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQorLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKy1lbHNlCistICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCistI2xpbmUgMjM2MiAiY29uZmlndXJlIgorLSNpbmNsdWRlICJjb25mZGVmcy5oIgorLSNpbmNsdWRlIDwkYWNfaGRyPgorLUVPRgorLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCisteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzY3OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKKy1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKKy1lbHNlCistICBlY2hvICIkYWNfZXJyIiA+JjUKKy0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CistICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKy0gIHJtIC1yZiBjb25mdGVzdCoKKy0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKKy1maQorLXJtIC1mIGNvbmZ0ZXN0KgorK2FzX2FjX0hlYWRlcj1gJGFzX2VjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19oZWFkZXIiID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfaGVhZGVyLi4uICIgPiY2OyB9CisraWYgeyBhc192YXI9JGFzX2FjX0hlYWRlcjsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgorKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKytlbHNlCisrICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworKyRhY19pbmNsdWRlc19kZWZhdWx0CisrCisrI2luY2x1ZGUgPCRhY19oZWFkZXI+CisrX0FDRU9GCisrcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisrCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisrICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisrICBldmFsICIkYXNfYWNfSGVhZGVyPXllcyIKKytlbHNlCisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrCWV2YWwgIiRhc19hY19IZWFkZXI9bm8iCisrZmkKKysKKytybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKytmaQorK2FjX3Jlcz1gZXZhbCAnYXNfdmFsPSR7JyRhc19hY19IZWFkZXInfQorKwkJICRhc19lY2hvICIkYXNfdmFsIidgCisrCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfcmVzIiA+JjUKKyskYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9CisrYXNfdmFsPWBldmFsICdhc192YWw9JHsnJGFzX2FjX0hlYWRlcid9CisrCQkgJGFzX2VjaG8gIiRhc192YWwiJ2AKKysgICBpZiB0ZXN0ICJ4JGFzX3ZhbCIgPSB4IiJ5ZXM7IHRoZW4KKysgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKysjZGVmaW5lIGAkYXNfZWNobyAiSEFWRV8kYWNfaGVhZGVyIiB8ICRhc190cl9jcHBgIDEKKytfQUNFT0YKKysKKyBmaQorLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCistICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CistICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKKy0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCistI2RlZmluZSAkYWNfdHJfaGRyIDEKKy1FT0YKKy0gCistZWxzZQorLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CisrCisrZG9uZQorKworKworKworK2ZvciBhY19oZWFkZXIgaW4gaW50dHlwZXMuaAorK2RvCisrYXNfYWNfSGVhZGVyPWAkYXNfZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAorK2lmIHsgYXNfdmFyPSRhc19hY19IZWFkZXI7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KKysgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2hlYWRlciIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gIiA+JjY7IH0KKytpZiB7IGFzX3Zhcj0kYXNfYWNfSGVhZGVyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCisrICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorK2ZpCisrYWNfcmVzPWBldmFsICdhc192YWw9JHsnJGFzX2FjX0hlYWRlcid9CisrCQkgJGFzX2VjaG8gIiRhc192YWwiJ2AKKysJICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19yZXMiID4mNQorKyRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KKytlbHNlCisrICAjIElzIHRoZSBoZWFkZXIgY29tcGlsYWJsZT8KKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgJGFjX2hlYWRlciB1c2FiaWxpdHkiID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nICRhY19oZWFkZXIgdXNhYmlsaXR5Li4uICIgPiY2OyB9CisrY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyskYWNfaW5jbHVkZXNfZGVmYXVsdAorKyNpbmNsdWRlIDwkYWNfaGVhZGVyPgorK19BQ0VPRgorK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKKytpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorK2Nhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorKyAgYWNfc3RhdHVzPSQ/CisrICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorKyAgcm0gLWYgY29uZnRlc3QuZXIxCisrICBjYXQgY29uZnRlc3QuZXJyID4mNQorKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKysJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorKyAgYWNfaGVhZGVyX2NvbXBpbGVyPXllcworK2Vsc2UKKysgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKysKKysJYWNfaGVhZGVyX2NvbXBpbGVyPW5vCisrZmkKKysKKytybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjUKKyskYXNfZWNobyAiJGFjX2hlYWRlcl9jb21waWxlciIgPiY2OyB9CisrCisrIyBJcyB0aGUgaGVhZGVyIHByZXNlbnQ/CisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nICRhY19oZWFkZXIgcHJlc2VuY2UiID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nICRhY19oZWFkZXIgcHJlc2VuY2UuLi4gIiA+JjY7IH0KKytjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworKyNpbmNsdWRlIDwkYWNfaGVhZGVyPgorK19BQ0VPRgorK2lmIHsgKGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IgorK2Nhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj5jb25mdGVzdC5lcjEKKysgIGFjX3N0YXR1cz0kPworKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKysgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsICYmIHsKKysJIHRlc3QgLXogIiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisrCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisrICAgICAgIH07IHRoZW4KKysgIGFjX2hlYWRlcl9wcmVwcm9jPXllcworK2Vsc2UKKysgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKysKKysgIGFjX2hlYWRlcl9wcmVwcm9jPW5vCisrZmkKKysKKytybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfcHJlcHJvYyIgPiY1CisrJGFzX2VjaG8gIiRhY19oZWFkZXJfcHJlcHJvYyIgPiY2OyB9CisrCisrIyBTbz8gIFdoYXQgYWJvdXQgdGhpcyBoZWFkZXI/CisrY2FzZSAkYWNfaGVhZGVyX2NvbXBpbGVyOiRhY19oZWFkZXJfcHJlcHJvYzokYWNfY19wcmVwcm9jX3dhcm5fZmxhZyBpbgorKyAgeWVzOm5vOiApCisrICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjI7fQorKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiYyO30KKysgICAgYWNfaGVhZGVyX3ByZXByb2M9eWVzCisrICAgIDs7CisrICBubzp5ZXM6KiApCisrICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcmVzZW50IGJ1dCBjYW5ub3QgYmUgY29tcGlsZWQiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiYyO30KKysgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mNQorKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mMjt9CisrICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBzZWUgdGhlIEF1dG9jb25mIGRvY3VtZW50YXRpb24iID4mNQorKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiYyO30KKysgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBzZWN0aW9uIFwiUHJlc2VudCBCdXQgQ2Fubm90IEJlIENvbXBpbGVkXCIiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBzZWN0aW9uIFwiUHJlc2VudCBCdXQgQ2Fubm90IEJlIENvbXBpbGVkXCIiID4mMjt9CisrICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBwcmVwcm9jZXNzb3IncyByZXN1bHQiID4mMjt9CisrICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBpbiB0aGUgZnV0dXJlLCB0aGUgY29tcGlsZXIgd2lsbCB0YWtlIHByZWNlZGVuY2UiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IGluIHRoZSBmdXR1cmUsIHRoZSBjb21waWxlciB3aWxsIHRha2UgcHJlY2VkZW5jZSIgPiYyO30KKysKKysgICAgOzsKKytlc2FjCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKKyskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX2hlYWRlci4uLiAiID4mNjsgfQorK2lmIHsgYXNfdmFyPSRhc19hY19IZWFkZXI7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KKysgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisrZWxzZQorKyAgZXZhbCAiJGFzX2FjX0hlYWRlcj1cJGFjX2hlYWRlcl9wcmVwcm9jIgorK2ZpCisrYWNfcmVzPWBldmFsICdhc192YWw9JHsnJGFzX2FjX0hlYWRlcid9CisrCQkgJGFzX2VjaG8gIiRhc192YWwiJ2AKKysJICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19yZXMiID4mNQorKyRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KKysKKytmaQorK2FzX3ZhbD1gZXZhbCAnYXNfdmFsPSR7JyRhc19hY19IZWFkZXInfQorKwkJICRhc19lY2hvICIkYXNfdmFsIidgCisrICAgaWYgdGVzdCAieCRhc192YWwiID0geCIieWVzOyB0aGVuCisrICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisrI2RlZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCisrX0FDRU9GCisrCisgZmkKKysKKyBkb25lCisgCisgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2ludHR5cGVzX2ggPSBubzsgdGhlbgorQEAgLTIzOTUsNyArNTcyOCw4IEBACisgIFVfSEFWRV9JTlRUWVBFU19IPTEKKyBmaQorIGlmIHRlc3QgIiRDQyIgPSBjY2M7IHRoZW4KKy0gZWNobyAiJGFjX3QiIiJDIGNvbXBpbGVyIHNldCB0byBDQ0MgJHtDQ30iICIgMT4mNgorKyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBcIkMgY29tcGlsZXIgc2V0IHRvIENDQyAke0NDfVwiICIgPiY1CisrJGFzX2VjaG8gIlwiQyBjb21waWxlciBzZXQgdG8gQ0NDICR7Q0N9XCIgIiA+JjY7IH0KKyAgY2FzZSAiJHtob3N0fSIgaW4KKyAgICAgICAgIGFscGhhKi0qLSopIFVfSEFWRV9JTlRUWVBFU19IPTA7CisgIGVzYWMKK0BAIC0yNDAzLDE1ICs1NzM3LDE3IEBACisgCisgCisgCistIyBDaGVjayB3aGV0aGVyIC0td2l0aC1pb3N0cmVhbSBvciAtLXdpdGhvdXQtaW9zdHJlYW0gd2FzIGdpdmVuLgorKworKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtaW9zdHJlYW0gd2FzIGdpdmVuLgorIGlmIHRlc3QgIiR7d2l0aF9pb3N0cmVhbStzZXR9IiA9IHNldDsgdGhlbgorLSAgd2l0aHZhbD0iJHdpdGhfaW9zdHJlYW0iCistICBjYXNlICIke3dpdGh2YWx9IiBpbgorKyAgd2l0aHZhbD0kd2l0aF9pb3N0cmVhbTsgY2FzZSAiJHt3aXRodmFsfSIgaW4KKyAJCW5vbmUpIHN0cmVhbXM9bm9uZSA7OworIAkJb2xkKSBzdHJlYW1zPTE5ODUwNiA7OworIAkJc3RkKSBzdHJlYW1zPTE5OTcxMSA7OworIAkJYXV0bykgc3RyZWFtcz0gOzsKKy0JCSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogYmFkIHZhbHVlICR7d2l0aHZhbH0gZm9yIC0td2l0aC1pb3N0cmVhbSIgMT4mMjsgZXhpdCAxOyB9IDs7CisrCQkqKSB7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogYmFkIHZhbHVlICR7d2l0aHZhbH0gZm9yIC0td2l0aC1pb3N0cmVhbSIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGJhZCB2YWx1ZSAke3dpdGh2YWx9IGZvciAtLXdpdGgtaW9zdHJlYW0iID4mMjt9CisrICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9IDs7CisgCQllc2FjCisgZWxzZQorICAgc3RyZWFtcz0KK0BAIC0yNDIxLDEzICs1NzU3LDEyIEBACisgVV9JT1NUUkVBTV9TT1VSQ0U9MAorIGlmIHRlc3QgeCRzdHJlYW1zICE9IHhub25lCisgdGhlbgorLSAgICAKKy0gICAgYWNfZXh0PUMKKy0jIENYWEZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KKysKKysgICAgYWNfZXh0PWNwcAorIGFjX2NwcD0nJENYWENQUCAkQ1BQRkxBR1MnCistYWNfY29tcGlsZT0nJHtDWFgtZysrfSAtYyAkQ1hYRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKKy1hY19saW5rPScke0NYWC1nKyt9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDWFhGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jeHhfY3Jvc3MKKythY19jb21waWxlPSckQ1hYIC1jICRDWFhGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCisrYWNfbGluaz0nJENYWCAtbyBjb25mdGVzdCRhY19leGVleHQgJENYWEZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKKythY19jb21waWxlcl9nbnU9JGFjX2N2X2N4eF9jb21waWxlcl9nbnUKKyAKKyAgICAgT0xEX0NYWEZMQUdTPSIke0NYWEZMQUdTfSIKKyAgICAgY2FzZSAiJHtpY3VfY3ZfaG9zdF9mcmFnfSIgaW4KK0BAIC0yNDM1LDEzOSArNTc3MCw0ODEgQEAKKyAgICAgICAgICAgICBDWFhGTEFHUz0iJHtDWFhGTEFHU30gLUFBIgorICAgICAgICAgOzsKKyAgICAgZXNhYworLSAgICBlY2hvICRhY19uICJjaGVja2luZyBpb3N0cmVhbSB1c2FiaWxpdHkiIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZToyNDQwOiBjaGVja2luZyBpb3N0cmVhbSB1c2FiaWxpdHkiID4mNQorLSAgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCistI2xpbmUgMjQ0MiAiY29uZmlndXJlIgorLSNpbmNsdWRlICJjb25mZGVmcy5oIgorKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaW9zdHJlYW0gdXNhYmlsaXR5IiA+JjUKKyskYXNfZWNob19uICJjaGVja2luZyBpb3N0cmVhbSB1c2FiaWxpdHkuLi4gIiA+JjY7IH0KKysKKytjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworICNpbmNsdWRlIDxpb3N0cmVhbT4KKy1pbnQgbWFpbigpIHsKKytpbnQKKyttYWluICgpCisreworIAorLTsgcmV0dXJuIDA7IH0KKy1FT0YKKy1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0NDk6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKy0gIHJtIC1yZiBjb25mdGVzdCoKKysgIDsKKysgIHJldHVybiAwOworK30KKytfQUNFT0YKKytybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CisraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKKytjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKysgIGFjX3N0YXR1cz0kPworKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKysgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisrCSB0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIiB8fAorKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorICAgYWNfY3ZfaGVhZGVyX2lvc3RyZWFtPXllcworIGVsc2UKKy0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CistICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKy0gIHJtIC1yZiBjb25mdGVzdCoKKy0gIGFjX2N2X2hlYWRlcl9pb3N0cmVhbT1ubworKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cisrc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorKworKwlhY19jdl9oZWFkZXJfaW9zdHJlYW09bm8KKyBmaQorLXJtIC1mIGNvbmZ0ZXN0KgorKworK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICAgICBpZiB0ZXN0ICRpY3VfY3ZfaG9zdF9mcmFnID0gbWgtY3lnd2luLW1zdmMKKyAgICAgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNfY3ZfaGVhZGVyX2lvc3RyZWFtPXllcworICAgICBmaQorLSAgICBlY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9pb3N0cmVhbSIgMT4mNgorKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX2lvc3RyZWFtIiA+JjUKKyskYXNfZWNobyAiJGFjX2N2X2hlYWRlcl9pb3N0cmVhbSIgPiY2OyB9CisgICAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9pb3N0cmVhbSA9IHllcworICAgICB0aGVuCisgICAgICAgICBVX0lPU1RSRUFNX1NPVVJDRT0xOTk3MTEKKyAgICAgZWxzZQorICAgICAgICAgQ1hYRkxBR1M9IiR7T0xEX0NYWEZMQUdTfSIKKy0gICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMrKyBwcmVwcm9jZXNzb3IiIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZToyNDcwOiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDKysgcHJlcHJvY2Vzc29yIiA+JjUKKysgICAgICAgIGFjX2V4dD1jcHAKKythY19jcHA9JyRDWFhDUFAgJENQUEZMQUdTJworK2FjX2NvbXBpbGU9JyRDWFggLWMgJENYWEZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKKythY19saW5rPSckQ1hYIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY3h4X2NvbXBpbGVyX2dudQorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDKysgcHJlcHJvY2Vzc29yIiA+JjUKKyskYXNfZWNob19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDKysgcHJlcHJvY2Vzc29yLi4uICIgPiY2OyB9CisgaWYgdGVzdCAteiAiJENYWENQUCI7IHRoZW4KKy1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DWFhDUFAnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKysgIGlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DWFhDUFArc2V0fSIgPSBzZXQ7IHRoZW4KKysgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisgZWxzZQorLSAgYWNfZXh0PUMKKy0jIENYWEZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KKy1hY19jcHA9JyRDWFhDUFAgJENQUEZMQUdTJworLWFjX2NvbXBpbGU9JyR7Q1hYLWcrK30gLWMgJENYWEZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCistYWNfbGluaz0nJHtDWFgtZysrfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKKy1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY3h4X2Nyb3NzCistICBDWFhDUFA9IiR7Q1hYLWcrK30gLUUiCistICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCistI2xpbmUgMjQ4MyAiY29uZmlndXJlIgorLSNpbmNsdWRlICJjb25mZGVmcy5oIgorLSNpbmNsdWRlIDxzdGRsaWIuaD4KKy1FT0YKKy1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgorLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQ4ODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KKy1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCistaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKysgICAgICAjIERvdWJsZSBxdW90ZXMgYmVjYXVzZSBDWFhDUFAgbmVlZHMgdG8gYmUgZXhwYW5kZWQKKysgICAgZm9yIENYWENQUCBpbiAiJENYWCAtRSIgIi9saWIvY3BwIgorKyAgICBkbworKyAgICAgIGFjX3ByZXByb2Nfb2s9ZmFsc2UKKytmb3IgYWNfY3h4X3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcworK2RvCisrICAjIFVzZSBhIGhlYWRlciBmaWxlIHRoYXQgY29tZXMgd2l0aCBnY2MsIHNvIGNvbmZpZ3VyaW5nIGdsaWJjCisrICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KKysgICMgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQorKyAgIyA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuCisrICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAorKyAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4gIlN5bnRheCBlcnJvciIgaXMgaGVyZSB0byBjYXRjaCB0aGlzIGNhc2UuCisrICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworKyNpZmRlZiBfX1NURENfXworKyMgaW5jbHVkZSA8bGltaXRzLmg+CisrI2Vsc2UKKysjIGluY2x1ZGUgPGFzc2VydC5oPgorKyNlbmRpZgorKwkJICAgICBTeW50YXggZXJyb3IKKytfQUNFT0YKKytpZiB7IChhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIKKytjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbCAmJiB7CisrCSB0ZXN0IC16ICIkYWNfY3h4X3ByZXByb2Nfd2Fybl9mbGFnJGFjX2N4eF93ZXJyb3JfZmxhZyIgfHwKKysJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKysgICAgICAgfTsgdGhlbgorICAgOgorIGVsc2UKKy0gIGVjaG8gIiRhY19lcnIiID4mNQorLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKy0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorLSAgQ1hYQ1BQPS9saWIvY3BwCisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrICAjIEJyb2tlbjogZmFpbHMgb24gdmFsaWQgaW5wdXQuCisrY29udGludWUKKyBmaQorLXJtIC1mIGNvbmZ0ZXN0KgorLSAgYWNfY3ZfcHJvZ19DWFhDUFA9IiRDWFhDUFAiCistYWNfZXh0PUMKKy0jIENYWEZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KKy1hY19jcHA9JyRDWFhDUFAgJENQUEZMQUdTJworLWFjX2NvbXBpbGU9JyR7Q1hYLWcrK30gLWMgJENYWEZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCistYWNfbGluaz0nJHtDWFgtZysrfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKKy1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY3h4X2Nyb3NzCistZmkKKy1maQorLUNYWENQUD0iJGFjX2N2X3Byb2dfQ1hYQ1BQIgorLWVjaG8gIiRhY190IiIkQ1hYQ1BQIiAxPiY2CistCistYWNfc2FmZT1gZWNobyAiaW9zdHJlYW0uaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCistZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGlvc3RyZWFtLmgiIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZToyNTE0OiBjaGVja2luZyBmb3IgaW9zdHJlYW0uaCIgPiY1CistaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCistICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorLWVsc2UKKy0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKy0jbGluZSAyNTE5ICJjb25maWd1cmUiCistI2luY2x1ZGUgImNvbmZkZWZzLmgiCistI2luY2x1ZGUgPGlvc3RyZWFtLmg+CistRU9GCistYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKKy17IChldmFsIGVjaG8gY29uZmlndXJlOjI1MjQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CistYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAorLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCistICBybSAtcmYgY29uZnRlc3QqCistICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgorLWVsc2UKKy0gIGVjaG8gIiRhY19lcnIiID4mNQorLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKy0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgorKworK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CisrCisrICAjIE9LLCB3b3JrcyBvbiBzYW5lIGNhc2VzLiAgTm93IGNoZWNrIHdoZXRoZXIgbm9uZXhpc3RlbnQgaGVhZGVycworKyAgIyBjYW4gYmUgZGV0ZWN0ZWQgYW5kIGhvdy4KKysgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGNvbmZkZWZzLmguICAqLworK19BQ0VPRgorK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBlbmQgY29uZmRlZnMuaC4gICovCisrI2luY2x1ZGUgPGFjX25vbmV4aXN0ZW50Lmg+CisrX0FDRU9GCisraWYgeyAoYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPmNvbmZ0ZXN0LmVyMQorKyAgYWNfc3RhdHVzPSQ/CisrICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorKyAgcm0gLWYgY29uZnRlc3QuZXIxCisrICBjYXQgY29uZnRlc3QuZXJyID4mNQorKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGwgJiYgeworKwkgdGVzdCAteiAiJGFjX2N4eF9wcmVwcm9jX3dhcm5fZmxhZyRhY19jeHhfd2Vycm9yX2ZsYWciIHx8CisrCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisrICAgICAgIH07IHRoZW4KKysgICMgQnJva2VuOiBzdWNjZXNzIG9uIGludmFsaWQgaW5wdXQuCisrY29udGludWUKKytlbHNlCisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrICAjIFBhc3NlcyBib3RoIHRlc3RzLgorK2FjX3ByZXByb2Nfb2s9OgorK2JyZWFrCisgZmkKKy1ybSAtZiBjb25mdGVzdCoKKysKKytybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAorKworK2RvbmUKKysjIEJlY2F1c2Ugb2YgYGJyZWFrJywgX0FDX1BSRVBST0NfSUZFTFNFJ3MgY2xlYW5pbmcgY29kZSB3YXMgc2tpcHBlZC4KKytybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAorK2lmICRhY19wcmVwcm9jX29rOyB0aGVuCisrICBicmVhaworK2ZpCisrCisrICAgIGRvbmUKKysgICAgYWNfY3ZfcHJvZ19DWFhDUFA9JENYWENQUAorKworK2ZpCisrICBDWFhDUFA9JGFjX2N2X3Byb2dfQ1hYQ1BQCisrZWxzZQorKyAgYWNfY3ZfcHJvZ19DWFhDUFA9JENYWENQUAorK2ZpCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENYWENQUCIgPiY1CisrJGFzX2VjaG8gIiRDWFhDUFAiID4mNjsgfQorK2FjX3ByZXByb2Nfb2s9ZmFsc2UKKytmb3IgYWNfY3h4X3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcworK2RvCisrICAjIFVzZSBhIGhlYWRlciBmaWxlIHRoYXQgY29tZXMgd2l0aCBnY2MsIHNvIGNvbmZpZ3VyaW5nIGdsaWJjCisrICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KKysgICMgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQorKyAgIyA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuCisrICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAorKyAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4gIlN5bnRheCBlcnJvciIgaXMgaGVyZSB0byBjYXRjaCB0aGlzIGNhc2UuCisrICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworKyNpZmRlZiBfX1NURENfXworKyMgaW5jbHVkZSA8bGltaXRzLmg+CisrI2Vsc2UKKysjIGluY2x1ZGUgPGFzc2VydC5oPgorKyNlbmRpZgorKwkJICAgICBTeW50YXggZXJyb3IKKytfQUNFT0YKKytpZiB7IChhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIKKytjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbCAmJiB7CisrCSB0ZXN0IC16ICIkYWNfY3h4X3ByZXByb2Nfd2Fybl9mbGFnJGFjX2N4eF93ZXJyb3JfZmxhZyIgfHwKKysJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKysgICAgICAgfTsgdGhlbgorKyAgOgorK2Vsc2UKKysgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKysKKysgICMgQnJva2VuOiBmYWlscyBvbiB2YWxpZCBpbnB1dC4KKytjb250aW51ZQorK2ZpCisrCisrcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKKysKKysgICMgT0ssIHdvcmtzIG9uIHNhbmUgY2FzZXMuICBOb3cgY2hlY2sgd2hldGhlciBub25leGlzdGVudCBoZWFkZXJzCisrICAjIGNhbiBiZSBkZXRlY3RlZCBhbmQgaG93LgorKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKysjaW5jbHVkZSA8YWNfbm9uZXhpc3RlbnQuaD4KKytfQUNFT0YKKytpZiB7IChhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIKKytjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbCAmJiB7CisrCSB0ZXN0IC16ICIkYWNfY3h4X3ByZXByb2Nfd2Fybl9mbGFnJGFjX2N4eF93ZXJyb3JfZmxhZyIgfHwKKysJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKysgICAgICAgfTsgdGhlbgorKyAgIyBCcm9rZW46IHN1Y2Nlc3Mgb24gaW52YWxpZCBpbnB1dC4KKytjb250aW51ZQorK2Vsc2UKKysgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKysKKysgICMgUGFzc2VzIGJvdGggdGVzdHMuCisrYWNfcHJlcHJvY19vaz06CisrYnJlYWsKKyBmaQorLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCistICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CisrCisrcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKKysKKytkb25lCisrIyBCZWNhdXNlIG9mIGBicmVhaycsIF9BQ19QUkVQUk9DX0lGRUxTRSdzIGNsZWFuaW5nIGNvZGUgd2FzIHNraXBwZWQuCisrcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKKytpZiAkYWNfcHJlcHJvY19vazsgdGhlbgorICAgOgorIGVsc2UKKy0gIGVjaG8gIiRhY190IiJubyIgMT4mNgorKyAgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9CisreyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IEMrKyBwcmVwcm9jZXNzb3IgXCIkQ1hYQ1BQXCIgZmFpbHMgc2FuaXR5IGNoZWNrCisrU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBDKysgcHJlcHJvY2Vzc29yIFwiJENYWENQUFwiIGZhaWxzIHNhbml0eSBjaGVjaworK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQorKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTsgfQorK2ZpCisrCisrYWNfZXh0PWNwcAorK2FjX2NwcD0nJENYWENQUCAkQ1BQRkxBR1MnCisrYWNfY29tcGlsZT0nJENYWCAtYyAkQ1hYRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworK2FjX2xpbms9JyRDWFggLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDWFhGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCisrYWNfY29tcGlsZXJfZ251PSRhY19jdl9jeHhfY29tcGlsZXJfZ251CisrCisrCisraWYgdGVzdCAiJHthY19jdl9oZWFkZXJfaW9zdHJlYW1faCtzZXR9IiA9IHNldDsgdGhlbgorKyAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBpb3N0cmVhbS5oIiA+JjUKKyskYXNfZWNob19uICJjaGVja2luZyBmb3IgaW9zdHJlYW0uaC4uLiAiID4mNjsgfQorK2lmIHRlc3QgIiR7YWNfY3ZfaGVhZGVyX2lvc3RyZWFtX2grc2V0fSIgPSBzZXQ7IHRoZW4KKysgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisrZmkKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX2lvc3RyZWFtX2giID4mNQorKyRhc19lY2hvICIkYWNfY3ZfaGVhZGVyX2lvc3RyZWFtX2giID4mNjsgfQorK2Vsc2UKKysgICMgSXMgdGhlIGhlYWRlciBjb21waWxhYmxlPworK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBpb3N0cmVhbS5oIHVzYWJpbGl0eSIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgaW9zdHJlYW0uaCB1c2FiaWxpdHkuLi4gIiA+JjY7IH0KKytjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworKyRhY19pbmNsdWRlc19kZWZhdWx0CisrI2luY2x1ZGUgPGlvc3RyZWFtLmg+CisrX0FDRU9GCisrcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworKwkgdGVzdCAteiAiJGFjX2N4eF93ZXJyb3JfZmxhZyIgfHwKKysJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKysgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKysgIGFjX2hlYWRlcl9jb21waWxlcj15ZXMKKytlbHNlCisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrCWFjX2hlYWRlcl9jb21waWxlcj1ubworK2ZpCisrCisrcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9jb21waWxlciIgPiY1CisrJGFzX2VjaG8gIiRhY19oZWFkZXJfY29tcGlsZXIiID4mNjsgfQorKworKyMgSXMgdGhlIGhlYWRlciBwcmVzZW50PworK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBpb3N0cmVhbS5oIHByZXNlbmNlIiA+JjUKKyskYXNfZWNob19uICJjaGVja2luZyBpb3N0cmVhbS5oIHByZXNlbmNlLi4uICIgPiY2OyB9CisrY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKysjaW5jbHVkZSA8aW9zdHJlYW0uaD4KKytfQUNFT0YKKytpZiB7IChhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIKKytjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbCAmJiB7CisrCSB0ZXN0IC16ICIkYWNfY3h4X3ByZXByb2Nfd2Fybl9mbGFnJGFjX2N4eF93ZXJyb3JfZmxhZyIgfHwKKysJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKysgICAgICAgfTsgdGhlbgorKyAgYWNfaGVhZGVyX3ByZXByb2M9eWVzCisrZWxzZQorKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cisrc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorKworKyAgYWNfaGVhZGVyX3ByZXByb2M9bm8KKytmaQorKworK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9wcmVwcm9jIiA+JjUKKyskYXNfZWNobyAiJGFjX2hlYWRlcl9wcmVwcm9jIiA+JjY7IH0KKysKKysjIFNvPyAgV2hhdCBhYm91dCB0aGlzIGhlYWRlcj8KKytjYXNlICRhY19oZWFkZXJfY29tcGlsZXI6JGFjX2hlYWRlcl9wcmVwcm9jOiRhY19jeHhfcHJlcHJvY193YXJuX2ZsYWcgaW4KKysgIHllczpubzogKQorKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogaW9zdHJlYW0uaDogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogaW9zdHJlYW0uaDogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiYyO30KKysgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IGlvc3RyZWFtLmg6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGlvc3RyZWFtLmg6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mMjt9CisrICAgIGFjX2hlYWRlcl9wcmVwcm9jPXllcworKyAgICA7OworKyAgbm86eWVzOiogKQorKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogaW9zdHJlYW0uaDogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBpb3N0cmVhbS5oOiBwcmVzZW50IGJ1dCBjYW5ub3QgYmUgY29tcGlsZWQiID4mMjt9CisrICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBpb3N0cmVhbS5oOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBpb3N0cmVhbS5oOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjI7fQorKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogaW9zdHJlYW0uaDogc2VlIHRoZSBBdXRvY29uZiBkb2N1bWVudGF0aW9uIiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBpb3N0cmVhbS5oOiBzZWUgdGhlIEF1dG9jb25mIGRvY3VtZW50YXRpb24iID4mMjt9CisrICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBpb3N0cmVhbS5oOiAgICAgc2VjdGlvbiBcIlByZXNlbnQgQnV0IENhbm5vdCBCZSBDb21waWxlZFwiIiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBpb3N0cmVhbS5oOiAgICAgc2VjdGlvbiBcIlByZXNlbnQgQnV0IENhbm5vdCBCZSBDb21waWxlZFwiIiA+JjI7fQorKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogaW9zdHJlYW0uaDogcHJvY2VlZGluZyB3aXRoIHRoZSBwcmVwcm9jZXNzb3IncyByZXN1bHQiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGlvc3RyZWFtLmg6IHByb2NlZWRpbmcgd2l0aCB0aGUgcHJlcHJvY2Vzc29yJ3MgcmVzdWx0IiA+JjI7fQorKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogaW9zdHJlYW0uaDogaW4gdGhlIGZ1dHVyZSwgdGhlIGNvbXBpbGVyIHdpbGwgdGFrZSBwcmVjZWRlbmNlIiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBpb3N0cmVhbS5oOiBpbiB0aGUgZnV0dXJlLCB0aGUgY29tcGlsZXIgd2lsbCB0YWtlIHByZWNlZGVuY2UiID4mMjt9CisrCisrICAgIDs7CisrZXNhYworK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgaW9zdHJlYW0uaCIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGlvc3RyZWFtLmguLi4gIiA+JjY7IH0KKytpZiB0ZXN0ICIke2FjX2N2X2hlYWRlcl9pb3N0cmVhbV9oK3NldH0iID0gc2V0OyB0aGVuCisrICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorK2Vsc2UKKysgIGFjX2N2X2hlYWRlcl9pb3N0cmVhbV9oPSRhY19oZWFkZXJfcHJlcHJvYworK2ZpCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2hlYWRlcl9pb3N0cmVhbV9oIiA+JjUKKyskYXNfZWNobyAiJGFjX2N2X2hlYWRlcl9pb3N0cmVhbV9oIiA+JjY7IH0KKysKKyBmaQorIAorKworICAgICAgICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2lvc3RyZWFtX2ggPSB5ZXM7IHRoZW4KKy0gICAgICAgICAgICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIG9zdHJlYW0gaXMgcmVhbGx5IGRlZmluZWQiIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZToyNTQ3OiBjaGVja2luZyB3aGV0aGVyIG9zdHJlYW0gaXMgcmVhbGx5IGRlZmluZWQiID4mNQorLSAgICAgICAgICAgIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9pb3N0cmVhbV9vaycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCistICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorLWVsc2UKKy0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKy0jbGluZSAyNTUyICJjb25maWd1cmUiCistI2luY2x1ZGUgImNvbmZkZWZzLmgiCisrICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgb3N0cmVhbSBpcyByZWFsbHkgZGVmaW5lZCIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciBvc3RyZWFtIGlzIHJlYWxseSBkZWZpbmVkLi4uICIgPiY2OyB9CisrICAgICAgICAgICAgaWYgdGVzdCAiJHthY19jdl9pb3N0cmVhbV9vaytzZXR9IiA9IHNldDsgdGhlbgorKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKytlbHNlCisrICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworICNpbmNsdWRlIDxpb3N0cmVhbS5oPgorLWludCBtYWluKCkgeworK2ludAorK21haW4gKCkKKyt7Cisgb3N0cmVhbSAmdGVzdG91dCA9IGNvdXQ7IHRlc3RvdXQgPDwgInRlc3QiIDw8IGVuZGw7CistOyByZXR1cm4gMDsgfQorLUVPRgorLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjU1OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCistICBybSAtcmYgY29uZnRlc3QqCisrICA7CisrICByZXR1cm4gMDsKKyt9CisrX0FDRU9GCisrcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKKytpZiB7IChhY190cnk9IiRhY19saW5rIgorK2Nhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQorKyAgYWNfc3RhdHVzPSQ/CisrICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorKyAgcm0gLWYgY29uZnRlc3QuZXIxCisrICBjYXQgY29uZnRlc3QuZXJyID4mNQorKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKysJIHRlc3QgLXogIiRhY19jeHhfd2Vycm9yX2ZsYWciIHx8CisrCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisrICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgeworKwkgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgfHwKKysJICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0CisrICAgICAgIH07IHRoZW4KKyAgIGFjX2N2X2lvc3RyZWFtX29rPXllcworIGVsc2UKKy0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CistICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKy0gIHJtIC1yZiBjb25mdGVzdCoKKy0gIGFjX2N2X2lvc3RyZWFtX29rPW5vCisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrCWFjX2N2X2lvc3RyZWFtX29rPW5vCisgZmkKKy1ybSAtZiBjb25mdGVzdCoKKysKKytybSAtcmYgY29uZnRlc3QuZFNZTQorK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCisrICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyBmaQorIAorLSAgICAgICAgICAgIGVjaG8gIiRhY190IiIkYWNfY3ZfaW9zdHJlYW1fb2siIDE+JjYKKysgICAgICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfaW9zdHJlYW1fb2siID4mNQorKyRhc19lY2hvICIkYWNfY3ZfaW9zdHJlYW1fb2siID4mNjsgfQorICAgICAgICAgICAgIGlmIHRlc3QgJGFjX2N2X2lvc3RyZWFtX29rID0geWVzCisgICAgICAgICAgICAgdGhlbgorICAgICAgICAgICAgICAgICBVX0lPU1RSRUFNX1NPVVJDRT0xOTg1MDYKK0BAIC0yNTg3LDEwOCArNjI2NCw0MjUgQEAKKyAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICBlc2FjCisgICAgICAgICBlbHNlCistICAgICAgICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAke3dpdGh2YWx9IGlvc3RyZWFtIGlzIG5vdCBhdmFpbGFibGUiIDE+JjI7IGV4aXQgMTsgfQorKyAgICAgICAgICAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiAke3dpdGh2YWx9IGlvc3RyZWFtIGlzIG5vdCBhdmFpbGFibGUiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiAke3dpdGh2YWx9IGlvc3RyZWFtIGlzIG5vdCBhdmFpbGFibGUiID4mMjt9CisrICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgICAgICAgICBmaQorICAgICBmaQorIGZpCisgCisgYWNfZXh0PWMKKy0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCisgYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKKy1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCistYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKKythY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKysKKyAKKyAKKy1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGJ5dGUgb3JkZXJpbmcgaXMgYmlnZW5kaWFuIiIuLi4gJGFjX2MiIDE+JjYKKy1lY2hvICJjb25maWd1cmU6MjYwNTogY2hlY2tpbmcgd2hldGhlciBieXRlIG9yZGVyaW5nIGlzIGJpZ2VuZGlhbiIgPiY1CistaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfYmlnZW5kaWFuJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKy0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CisrIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIGJ5dGUgb3JkZXJpbmcgaXMgYmlnZW5kaWFuIiA+JjUKKyskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIGJ5dGUgb3JkZXJpbmcgaXMgYmlnZW5kaWFuLi4uICIgPiY2OyB9CisraWYgdGVzdCAiJHthY19jdl9jX2JpZ2VuZGlhbitzZXR9IiA9IHNldDsgdGhlbgorKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKyBlbHNlCisgICBhY19jdl9jX2JpZ2VuZGlhbj11bmtub3duCistIyBTZWUgaWYgc3lzL3BhcmFtLmggZGVmaW5lcyB0aGUgQllURV9PUkRFUiBtYWNyby4KKy1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCistI2xpbmUgMjYxMiAiY29uZmlndXJlIgorLSNpbmNsdWRlICJjb25mZGVmcy5oIgorKyAgICAjIFNlZSBpZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSB1bml2ZXJzYWwgY29tcGlsZXIuCisrICAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGNvbmZkZWZzLmguICAqLworK19BQ0VPRgorK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBlbmQgY29uZmRlZnMuaC4gICovCisrI2lmbmRlZiBfX0FQUExFX0NDX18KKysJICAgICAgIG5vdCBhIHVuaXZlcnNhbCBjYXBhYmxlIGNvbXBpbGVyCisrCSAgICAgI2VuZGlmCisrCSAgICAgdHlwZWRlZiBpbnQgZHVtbXk7CisrCisrX0FDRU9GCisrcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisrCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisrICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisrCisrCSMgQ2hlY2sgZm9yIHBvdGVudGlhbCAtYXJjaCBmbGFncy4gIEl0IGlzIG5vdCB1bml2ZXJzYWwgdW5sZXNzCisrCSMgdGhlcmUgYXJlIHNvbWUgLWFyY2ggZmxhZ3MuICBOb3RlIHRoYXQgKnBwYyogYWxzbyBtYXRjaGVzCisrCSMgcHBjNjQuICBUaGlzIGNoZWNrIGlzIGFsc28gcmF0aGVyIGxlc3MgdGhhbiBpZGVhbC4KKysJY2FzZSAiJHtDQ30gJHtDRkxBR1N9ICR7Q1BQRkxBR1N9ICR7TERGTEFHU30iIGluICAjKAorKwkgICotYXJjaCpwcGMqfCotYXJjaCppMzg2KnwqLWFyY2gqeDg2XzY0KikgYWNfY3ZfY19iaWdlbmRpYW49dW5pdmVyc2FsOzsKKysJZXNhYworK2Vsc2UKKysgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKysKKysKKytmaQorKworK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorKyAgICBpZiB0ZXN0ICRhY19jdl9jX2JpZ2VuZGlhbiA9IHVua25vd247IHRoZW4KKysgICAgICAjIFNlZSBpZiBzeXMvcGFyYW0uaCBkZWZpbmVzIHRoZSBCWVRFX09SREVSIG1hY3JvLgorKyAgICAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGNvbmZkZWZzLmguICAqLworK19BQ0VPRgorK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBlbmQgY29uZmRlZnMuaC4gICovCisgI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKy1pbnQgbWFpbigpIHsKKysJICAgICAjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisgCistI2lmICFCWVRFX09SREVSIHx8ICFCSUdfRU5ESUFOIHx8ICFMSVRUTEVfRU5ESUFOCistIGJvZ3VzIGVuZGlhbiBtYWNyb3MKKy0jZW5kaWYKKy07IHJldHVybiAwOyB9CistRU9GCistaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNjIzOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCistICBybSAtcmYgY29uZnRlc3QqCisraW50CisrbWFpbiAoKQorK3sKKysjaWYgISAoZGVmaW5lZCBCWVRFX09SREVSICYmIGRlZmluZWQgQklHX0VORElBTiBcCisrCQkgICAgICYmIGRlZmluZWQgTElUVExFX0VORElBTiAmJiBCWVRFX09SREVSICYmIEJJR19FTkRJQU4gXAorKwkJICAgICAmJiBMSVRUTEVfRU5ESUFOKQorKwkgICAgICBib2d1cyBlbmRpYW4gbWFjcm9zCisrCSAgICAgI2VuZGlmCisrCisrICA7CisrICByZXR1cm4gMDsKKyt9CisrX0FDRU9GCisrcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisrCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisrICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgICAjIEl0IGRvZXM7IG5vdyBzZWUgd2hldGhlciBpdCBkZWZpbmVkIHRvIEJJR19FTkRJQU4gb3Igbm90LgorLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKy0jbGluZSAyNjI3ICJjb25maWd1cmUiCistI2luY2x1ZGUgImNvbmZkZWZzLmgiCisrCSBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKy0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+CistaW50IG1haW4oKSB7CisrCQkjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisgCisraW50CisrbWFpbiAoKQorK3sKKyAjaWYgQllURV9PUkRFUiAhPSBCSUdfRU5ESUFOCistIG5vdCBiaWcgZW5kaWFuCistI2VuZGlmCistOyByZXR1cm4gMDsgfQorLUVPRgorLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjYzODogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorKwkJIG5vdCBiaWcgZW5kaWFuCisrCQkjZW5kaWYKKysKKysgIDsKKysgIHJldHVybiAwOworK30KKytfQUNFT0YKKytybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CisraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKKytjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKysgIGFjX3N0YXR1cz0kPworKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKysgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisrCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKysJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKysgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKyAgIGFjX2N2X2NfYmlnZW5kaWFuPXllcworIGVsc2UKKy0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CistICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKy0gIHJtIC1yZiBjb25mdGVzdCoKKy0gIGFjX2N2X2NfYmlnZW5kaWFuPW5vCisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrCWFjX2N2X2NfYmlnZW5kaWFuPW5vCisgZmkKKy1ybSAtZiBjb25mdGVzdCoKKysKKytybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyBlbHNlCistICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrCisgZmkKKy1ybSAtZiBjb25mdGVzdCoKKy1pZiB0ZXN0ICRhY19jdl9jX2JpZ2VuZGlhbiA9IHVua25vd247IHRoZW4KKy1pZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgcnVuIHRlc3QgcHJvZ3JhbSB3aGlsZSBjcm9zcyBjb21waWxpbmciIDE+JjI7IGV4aXQgMTsgfQorLWVsc2UKKy0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKy0jbGluZSAyNjU4ICJjb25maWd1cmUiCistI2luY2x1ZGUgImNvbmZkZWZzLmgiCistbWFpbiAoKSB7CistICAvKiBBcmUgd2UgbGl0dGxlIG9yIGJpZyBlbmRpYW4/ICBGcm9tIEhhcmJpc29uJlN0ZWVsZS4gICovCistICB1bmlvbgorLSAgeworLSAgICBsb25nIGw7CistICAgIGNoYXIgY1tzaXplb2YgKGxvbmcpXTsKKy0gIH0gdTsKKy0gIHUubCA9IDE7CistICBleGl0ICh1LmNbc2l6ZW9mIChsb25nKSAtIDFdID09IDEpOworKworK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorKyAgICBmaQorKyAgICBpZiB0ZXN0ICRhY19jdl9jX2JpZ2VuZGlhbiA9IHVua25vd247IHRoZW4KKysgICAgICAjIFNlZSBpZiA8bGltaXRzLmg+IGRlZmluZXMgX0xJVFRMRV9FTkRJQU4gb3IgX0JJR19FTkRJQU4gKGUuZy4sIFNvbGFyaXMpLgorKyAgICAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGNvbmZkZWZzLmguICAqLworK19BQ0VPRgorK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBlbmQgY29uZmRlZnMuaC4gICovCisrI2luY2x1ZGUgPGxpbWl0cy5oPgorKworK2ludAorK21haW4gKCkKKyt7CisrI2lmICEgKGRlZmluZWQgX0xJVFRMRV9FTkRJQU4gfHwgZGVmaW5lZCBfQklHX0VORElBTikKKysJICAgICAgYm9ndXMgZW5kaWFuIG1hY3JvcworKwkgICAgICNlbmRpZgorKworKyAgOworKyAgcmV0dXJuIDA7CisgfQorLUVPRgorLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjY3MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAorLXRoZW4KKy0gIGFjX2N2X2NfYmlnZW5kaWFuPW5vCistZWxzZQorLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKy0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorLSAgcm0gLWZyIGNvbmZ0ZXN0KgorK19BQ0VPRgorK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKKytpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorK2Nhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorKyAgYWNfc3RhdHVzPSQ/CisrICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorKyAgcm0gLWYgY29uZnRlc3QuZXIxCisrICBjYXQgY29uZnRlc3QuZXJyID4mNQorKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKysJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorKyAgIyBJdCBkb2VzOyBub3cgc2VlIHdoZXRoZXIgaXQgZGVmaW5lZCB0byBfQklHX0VORElBTiBvciBub3QuCisrCSBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworKyNpbmNsdWRlIDxsaW1pdHMuaD4KKysKKytpbnQKKyttYWluICgpCisreworKyNpZm5kZWYgX0JJR19FTkRJQU4KKysJCSBub3QgYmlnIGVuZGlhbgorKwkJI2VuZGlmCisrCisrICA7CisrICByZXR1cm4gMDsKKyt9CisrX0FDRU9GCisrcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisrCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisrICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgICBhY19jdl9jX2JpZ2VuZGlhbj15ZXMKKytlbHNlCisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrCWFjX2N2X2NfYmlnZW5kaWFuPW5vCisrZmkKKysKKytybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKytlbHNlCisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrCisgZmkKKy1ybSAtZnIgY29uZnRlc3QqCisrCisrcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisrICAgIGZpCisrICAgIGlmIHRlc3QgJGFjX2N2X2NfYmlnZW5kaWFuID0gdW5rbm93bjsgdGhlbgorKyAgICAgICMgQ29tcGlsZSBhIHRlc3QgcHJvZ3JhbS4KKysgICAgICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgorKyAgIyBUcnkgdG8gZ3Vlc3MgYnkgZ3JlcHBpbmcgdmFsdWVzIGZyb20gYW4gb2JqZWN0IGZpbGUuCisrCSBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworK3Nob3J0IGludCBhc2NpaV9tbVtdID0KKysJCSAgeyAweDQyNDksIDB4NDc2NSwgMHg2RTQ0LCAweDY5NjEsIDB4NkU1MywgMHg3OTUzLCAwIH07CisrCQlzaG9ydCBpbnQgYXNjaWlfaWlbXSA9CisrCQkgIHsgMHg2OTRDLCAweDU0NTQsIDB4NjU2QywgMHg2RTQ1LCAweDY5NDQsIDB4NkU2MSwgMCB9OworKwkJaW50IHVzZV9hc2NpaSAoaW50IGkpIHsKKysJCSAgcmV0dXJuIGFzY2lpX21tW2ldICsgYXNjaWlfaWlbaV07CisrCQl9CisrCQlzaG9ydCBpbnQgZWJjZGljX2lpW10gPQorKwkJICB7IDB4ODlEMywgMHhFM0UzLCAweDg1OTMsIDB4OTVDNSwgMHg4OUM0LCAweDk1ODEsIDAgfTsKKysJCXNob3J0IGludCBlYmNkaWNfbW1bXSA9CisrCQkgIHsgMHhDMkM5LCAweEM3ODUsIDB4OTVDNCwgMHg4OTgxLCAweDk1RTIsIDB4QThFMiwgMCB9OworKwkJaW50IHVzZV9lYmNkaWMgKGludCBpKSB7CisrCQkgIHJldHVybiBlYmNkaWNfbW1baV0gKyBlYmNkaWNfaWlbaV07CisrCQl9CisrCQlleHRlcm4gaW50IGZvbzsKKysKKytpbnQKKyttYWluICgpCisreworK3JldHVybiB1c2VfYXNjaWkgKGZvbykgPT0gdXNlX2ViY2RpYyAoZm9vKTsKKysgIDsKKysgIHJldHVybiAwOworK30KKytfQUNFT0YKKytybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CisraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKKytjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKysgIGFjX3N0YXR1cz0kPworKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKysgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisrCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKysJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKysgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKysgIGlmIGdyZXAgQklHZW5EaWFuU3lTIGNvbmZ0ZXN0LiRhY19vYmpleHQgPi9kZXYvbnVsbDsgdGhlbgorKwkgICAgICBhY19jdl9jX2JpZ2VuZGlhbj15ZXMKKysJICAgIGZpCisrCSAgICBpZiBncmVwIExpVFRsZUVuRGlhbiBjb25mdGVzdC4kYWNfb2JqZXh0ID4vZGV2L251bGwgOyB0aGVuCisrCSAgICAgIGlmIHRlc3QgIiRhY19jdl9jX2JpZ2VuZGlhbiIgPSB1bmtub3duOyB0aGVuCisrCQlhY19jdl9jX2JpZ2VuZGlhbj1ubworKwkgICAgICBlbHNlCisrCQkjIGZpbmRpbmcgYm90aCBzdHJpbmdzIGlzIHVubGlrZWx5IHRvIGhhcHBlbiwgYnV0IHdobyBrbm93cz8KKysJCWFjX2N2X2NfYmlnZW5kaWFuPXVua25vd24KKysJICAgICAgZmkKKysJICAgIGZpCisrZWxzZQorKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cisrc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorKworKworIGZpCisgCisrcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisrZWxzZQorKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyskYWNfaW5jbHVkZXNfZGVmYXVsdAorK2ludAorK21haW4gKCkKKyt7CisrCisrCSAgICAgLyogQXJlIHdlIGxpdHRsZSBvciBiaWcgZW5kaWFuPyAgRnJvbSBIYXJiaXNvbiZTdGVlbGUuICAqLworKwkgICAgIHVuaW9uCisrCSAgICAgeworKwkgICAgICAgbG9uZyBpbnQgbDsKKysJICAgICAgIGNoYXIgY1tzaXplb2YgKGxvbmcgaW50KV07CisrCSAgICAgfSB1OworKwkgICAgIHUubCA9IDE7CisrCSAgICAgcmV0dXJuIHUuY1tzaXplb2YgKGxvbmcgaW50KSAtIDFdID09IDE7CisrCisrICA7CisrICByZXR1cm4gMDsKKyt9CisrX0FDRU9GCisrcm0gLWYgY29uZnRlc3QkYWNfZXhlZXh0CisraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKKytjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY19saW5rIikgMj4mNQorKyAgYWNfc3RhdHVzPSQ/CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeyBhY190cnk9Jy4vY29uZnRlc3QkYWNfZXhlZXh0JworKyAgeyAoY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfdHJ5IikgMj4mNQorKyAgYWNfc3RhdHVzPSQ/CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKysgIGFjX2N2X2NfYmlnZW5kaWFuPW5vCisrZWxzZQorKyAgJGFzX2VjaG8gIiRhc19tZTogcHJvZ3JhbSBleGl0ZWQgd2l0aCBzdGF0dXMgJGFjX3N0YXR1cyIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cisrc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorKworKyggZXhpdCAkYWNfc3RhdHVzICkKKythY19jdl9jX2JpZ2VuZGlhbj15ZXMKKyBmaQorK3JtIC1yZiBjb25mdGVzdC5kU1lNCisrcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgZmkKKyAKKy1lY2hvICIkYWNfdCIiJGFjX2N2X2NfYmlnZW5kaWFuIiAxPiY2CistaWYgdGVzdCAkYWNfY3ZfY19iaWdlbmRpYW4gPSB5ZXM7IHRoZW4KKy0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorLSNkZWZpbmUgV09SRFNfQklHRU5ESUFOIDEKKy1FT0YKKyAKKysgICAgZmkKKyBmaQorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9jX2JpZ2VuZGlhbiIgPiY1CisrJGFzX2VjaG8gIiRhY19jdl9jX2JpZ2VuZGlhbiIgPiY2OyB9CisrIGNhc2UgJGFjX2N2X2NfYmlnZW5kaWFuIGluICMoCisrICAgeWVzKQorKyAgICAgY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKysjZGVmaW5lIFdPUkRTX0JJR0VORElBTiAxCisrX0FDRU9GCisrOzsgIygKKysgICBubykKKysgICAgICA7OyAjKAorKyAgIHVuaXZlcnNhbCkKKysKKytjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorKyNkZWZpbmUgQUNfQVBQTEVfVU5JVkVSU0FMX0JVSUxEIDEKKytfQUNFT0YKKysKKysgICAgIDs7ICMoCisrICAgKikKKysgICAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiB1bmtub3duIGVuZGlhbm5lc3MKKysgcHJlc2V0dGluZyBhY19jdl9jX2JpZ2VuZGlhbj1ubyAob3IgeWVzKSB3aWxsIGhlbHAiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiB1bmtub3duIGVuZGlhbm5lc3MKKysgcHJlc2V0dGluZyBhY19jdl9jX2JpZ2VuZGlhbj1ubyAob3IgeWVzKSB3aWxsIGhlbHAiID4mMjt9CisrICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9IDs7CisrIGVzYWMKKyAKKyBpZiB0ZXN0ICRhY19jdl9jX2JpZ2VuZGlhbiA9IG5vOyB0aGVuCisgVV9JU19CSUdfRU5ESUFOPTAKK0BAIC0yNzAxLDg0ICs2Njk1LDE1NyBAQAorIAorIFVfSEFWRV9OTF9MQU5HSU5GT19DT0RFU0VUPTAKKyBVX05MX0xBTkdJTkZPX0NPREVTRVQ9LTEKKy1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbmxfbGFuZ2luZm8iIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZToyNzA2OiBjaGVja2luZyBmb3IgbmxfbGFuZ2luZm8iID4mNQorLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX25sX2xhbmdpbmZvJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKy0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CistZWxzZQorLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorLSNsaW5lIDI3MTEgImNvbmZpZ3VyZSIKKy0jaW5jbHVkZSAiY29uZmRlZnMuaCIKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIG5sX2xhbmdpbmZvIiA+JjUKKyskYXNfZWNob19uICJjaGVja2luZyBmb3IgbmxfbGFuZ2luZm8uLi4gIiA+JjY7IH0KKytpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfbmxfbGFuZ2luZm8rc2V0fSIgPSBzZXQ7IHRoZW4KKysgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisrZWxzZQorKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKysvKiBEZWZpbmUgbmxfbGFuZ2luZm8gdG8gYW4gaW5ub2N1b3VzIHZhcmlhbnQsIGluIGNhc2UgPGxpbWl0cy5oPiBkZWNsYXJlcyBubF9sYW5naW5mby4KKysgICBGb3IgZXhhbXBsZSwgSFAtVVggMTFpIDxsaW1pdHMuaD4gZGVjbGFyZXMgZ2V0dGltZW9mZGF5LiAgKi8KKysjZGVmaW5lIG5sX2xhbmdpbmZvIGlubm9jdW91c19ubF9sYW5naW5mbworKworIC8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKKy0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciBubF9sYW5naW5mbygpOyBiZWxvdy4gICovCistI2luY2x1ZGUgPGFzc2VydC5oPgorLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCistLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworLWNoYXIgbmxfbGFuZ2luZm8oKTsKKysgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciBubF9sYW5naW5mbyAoKTsgYmVsb3cuCisrICAgIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKysgICAgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLiAgKi8KKyAKKy1pbnQgbWFpbigpIHsKKysjaWZkZWYgX19TVERDX18KKysjIGluY2x1ZGUgPGxpbWl0cy5oPgorKyNlbHNlCisrIyBpbmNsdWRlIDxhc3NlcnQuaD4KKysjZW5kaWYKKyAKKysjdW5kZWYgbmxfbGFuZ2luZm8KKysKKysvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKysgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKysgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworKyNpZmRlZiBfX2NwbHVzcGx1cworK2V4dGVybiAiQyIKKysjZW5kaWYKKytjaGFyIG5sX2xhbmdpbmZvICgpOworIC8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCistI2lmIGRlZmluZWQgKF9fc3R1Yl9ubF9sYW5naW5mbykgfHwgZGVmaW5lZCAoX19zdHViX19fbmxfbGFuZ2luZm8pCisrI2lmIGRlZmluZWQgX19zdHViX25sX2xhbmdpbmZvIHx8IGRlZmluZWQgX19zdHViX19fbmxfbGFuZ2luZm8KKyBjaG9rZSBtZQorLSNlbHNlCistbmxfbGFuZ2luZm8oKTsKKyAjZW5kaWYKKyAKKy07IHJldHVybiAwOyB9CistRU9GCistaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNzM0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKy0gIHJtIC1yZiBjb25mdGVzdCoKKy0gIGV2YWwgImFjX2N2X2Z1bmNfbmxfbGFuZ2luZm89eWVzIgorLWVsc2UKKy0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CistICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKy0gIHJtIC1yZiBjb25mdGVzdCoKKy0gIGV2YWwgImFjX2N2X2Z1bmNfbmxfbGFuZ2luZm89bm8iCistZmkKKy1ybSAtZiBjb25mdGVzdCoKKy1maQorLQorLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJ25sX2xhbmdpbmZvYFwiID0geWVzIjsgdGhlbgorLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorK2ludAorK21haW4gKCkKKyt7CisrcmV0dXJuIG5sX2xhbmdpbmZvICgpOworKyAgOworKyAgcmV0dXJuIDA7CisrfQorK19BQ0VPRgorK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CisraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKKytjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKysgIGFjX3N0YXR1cz0kPworKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKysgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisrCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKysJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKysgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJiB7CisrCSB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllcyB8fAorKwkgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQKKysgICAgICAgfTsgdGhlbgorKyAgYWNfY3ZfZnVuY19ubF9sYW5naW5mbz15ZXMKKytlbHNlCisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrCWFjX2N2X2Z1bmNfbmxfbGFuZ2luZm89bm8KKytmaQorKworK3JtIC1yZiBjb25mdGVzdC5kU1lNCisrcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKKysgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorK2ZpCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2Z1bmNfbmxfbGFuZ2luZm8iID4mNQorKyRhc19lY2hvICIkYWNfY3ZfZnVuY19ubF9sYW5naW5mbyIgPiY2OyB9CisraWYgdGVzdCAieCRhY19jdl9mdW5jX25sX2xhbmdpbmZvIiA9IHgiInllczsgdGhlbgorICAgVV9IQVZFX05MX0xBTkdJTkZPPTEKKyBlbHNlCistICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKy1VX0hBVkVfTkxfTEFOR0lORk89MAorKyAgVV9IQVZFX05MX0xBTkdJTkZPPTAKKyBmaQorIAorIAorIGlmIHRlc3QgJFVfSEFWRV9OTF9MQU5HSU5GTyAtZXEgMTsgdGhlbgorLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG5sX2xhbmdpbmZvJ3MgYXJndW1lbnQgdG8gb2J0YWluIHRoZSBjb2Rlc2V0IiIuLi4gJGFjX2MiIDE+JjYKKy1lY2hvICJjb25maWd1cmU6Mjc1NzogY2hlY2tpbmcgZm9yIG5sX2xhbmdpbmZvJ3MgYXJndW1lbnQgdG8gb2J0YWluIHRoZSBjb2Rlc2V0IiA+JjUKKy1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbmxfbGFuZ2luZm9fY29kZXNldCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCistICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorKyAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBubF9sYW5naW5mbydzIGFyZ3VtZW50IHRvIG9idGFpbiB0aGUgY29kZXNldCIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIG5sX2xhbmdpbmZvJ3MgYXJndW1lbnQgdG8gb2J0YWluIHRoZSBjb2Rlc2V0Li4uICIgPiY2OyB9CisraWYgdGVzdCAiJHthY19jdl9ubF9sYW5naW5mb19jb2Rlc2V0K3NldH0iID0gc2V0OyB0aGVuCisrICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorIGVsc2UKKyAgIGFjX2N2X25sX2xhbmdpbmZvX2NvZGVzZXQ9InVua25vd24iCisgICBmb3IgYSBpbiBDT0RFU0VUIF9OTF9DVFlQRV9DT0RFU0VUX05BTUU7IGRvCistICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCistI2xpbmUgMjc2NCAiY29uZmlndXJlIgorLSNpbmNsdWRlICJjb25mZGVmcy5oIgorKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyAjaW5jbHVkZSA8bGFuZ2luZm8uaD4KKy1pbnQgbWFpbigpIHsKKytpbnQKKyttYWluICgpCisreworIG5sX2xhbmdpbmZvKCRhKTsKKy07IHJldHVybiAwOyB9CistRU9GCistaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNzcxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKy0gIHJtIC1yZiBjb25mdGVzdCoKKysgIDsKKysgIHJldHVybiAwOworK30KKytfQUNFT0YKKytybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisrCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisrICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgeworKwkgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgfHwKKysJICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0CisrICAgICAgIH07IHRoZW4KKyAgIGFjX2N2X25sX2xhbmdpbmZvX2NvZGVzZXQ9IiRhIjsgYnJlYWsKKyBlbHNlCistICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrCisgZmkKKy1ybSAtZiBjb25mdGVzdCoKKysKKytybSAtcmYgY29uZnRlc3QuZFNZTQorK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCisrICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgIGRvbmUKKyBmaQorLQorLWVjaG8gIiRhY190IiIkYWNfY3ZfbmxfbGFuZ2luZm9fY29kZXNldCIgMT4mNgorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9ubF9sYW5naW5mb19jb2Rlc2V0IiA+JjUKKyskYXNfZWNobyAiJGFjX2N2X25sX2xhbmdpbmZvX2NvZGVzZXQiID4mNjsgfQorICAgaWYgdGVzdCB4JGFjX2N2X25sX2xhbmdpbmZvX2NvZGVzZXQgIT0geHVua25vd24KKyAgIHRoZW4KKyAgICAgICBVX0hBVkVfTkxfTEFOR0lORk9fQ09ERVNFVD0xCitAQCAtMjc4OCw0MiArNjg1NSw3MSBAQAorIAorIAorIAorLWFjX2V4dD1DCistIyBDWFhGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCisrYWNfZXh0PWNwcAorIGFjX2NwcD0nJENYWENQUCAkQ1BQRkxBR1MnCistYWNfY29tcGlsZT0nJHtDWFgtZysrfSAtYyAkQ1hYRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKKy1hY19saW5rPScke0NYWC1nKyt9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDWFhGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jeHhfY3Jvc3MKKy0KKy1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbmFtZXNwYWNlIHN1cHBvcnQiIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZToyODAwOiBjaGVja2luZyBmb3IgbmFtZXNwYWNlIHN1cHBvcnQiID4mNQorLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9uYW1lc3BhY2Vfb2snK3NldH0nYFwiID0gc2V0IjsgdGhlbgorLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKy1lbHNlCistICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCistI2xpbmUgMjgwNSAiY29uZmlndXJlIgorLSNpbmNsdWRlICJjb25mZGVmcy5oIgorK2FjX2NvbXBpbGU9JyRDWFggLWMgJENYWEZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKKythY19saW5rPSckQ1hYIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY3h4X2NvbXBpbGVyX2dudQorKworK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgbmFtZXNwYWNlIHN1cHBvcnQiID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBuYW1lc3BhY2Ugc3VwcG9ydC4uLiAiID4mNjsgfQorK2lmIHRlc3QgIiR7YWNfY3ZfbmFtZXNwYWNlX29rK3NldH0iID0gc2V0OyB0aGVuCisrICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorK2Vsc2UKKysgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGNvbmZkZWZzLmguICAqLworK19BQ0VPRgorK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBlbmQgY29uZmRlZnMuaC4gICovCisgICAgIG5hbWVzcGFjZSB4X3ZlcnNpb24ge3ZvaWQgZigpe319OworICAgICBuYW1lc3BhY2UgeCA9IHhfdmVyc2lvbjsKKyAgICAgdXNpbmcgbmFtZXNwYWNlIHhfdmVyc2lvbjsKKy0gICAgCistaW50IG1haW4oKSB7CisrCisraW50CisrbWFpbiAoKQorK3sKKyAgICAgZigpOworLTsgcmV0dXJuIDA7IH0KKy1FT0YKKy1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI4MTU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorKyAgOworKyAgcmV0dXJuIDA7CisrfQorK19BQ0VPRgorK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CisraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKKytjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKysgIGFjX3N0YXR1cz0kPworKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKysgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisrCSB0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIiB8fAorKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmIHsKKysJIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzIHx8CisrCSAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorKyAgICAgICB9OyB0aGVuCisgICBhY19jdl9uYW1lc3BhY2Vfb2s9eWVzCisgZWxzZQorLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKy0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorLSAgYWNfY3ZfbmFtZXNwYWNlX29rPW5vCisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrCWFjX2N2X25hbWVzcGFjZV9vaz1ubworIGZpCistcm0gLWYgY29uZnRlc3QqIAorKworK3JtIC1yZiBjb25mdGVzdC5kU1lNCisrcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKKysgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorIGZpCisgCistZWNobyAiJGFjX3QiIiRhY19jdl9uYW1lc3BhY2Vfb2siIDE+JjYKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbmFtZXNwYWNlX29rIiA+JjUKKyskYXNfZWNobyAiJGFjX2N2X25hbWVzcGFjZV9vayIgPiY2OyB9CisgVV9IQVZFX05BTUVTUEFDRT0xCisgaWYgdGVzdCAkYWNfY3ZfbmFtZXNwYWNlX29rID0gbm8KKyB0aGVuCitAQCAtMjgzMSwxNiArNjkyNywxOSBAQAorIGZpCisgCisgCistZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHByb3Blcmx5IG92ZXJyaWRpbmcgbmV3IGFuZCBkZWxldGUiIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZToyODM2OiBjaGVja2luZyBmb3IgcHJvcGVybHkgb3ZlcnJpZGluZyBuZXcgYW5kIGRlbGV0ZSIgPiY1CisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBwcm9wZXJseSBvdmVycmlkaW5nIG5ldyBhbmQgZGVsZXRlIiA+JjUKKyskYXNfZWNob19uICJjaGVja2luZyBmb3IgcHJvcGVybHkgb3ZlcnJpZGluZyBuZXcgYW5kIGRlbGV0ZS4uLiAiID4mNjsgfQorIFVfT1ZFUlJJREVfQ1hYX0FMTE9DQVRJT049MAorIFVfSEFWRV9QTEFDRU1FTlRfTkVXPTAKKy1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfb3ZlcnJpZGVfY3h4X2FsbG9jYXRpb25fb2snK3NldH0nYFwiID0gc2V0IjsgdGhlbgorLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKytpZiB0ZXN0ICIke2FjX2N2X292ZXJyaWRlX2N4eF9hbGxvY2F0aW9uX29rK3NldH0iID0gc2V0OyB0aGVuCisrICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorIGVsc2UKKy0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKy0jbGluZSAyODQzICJjb25maWd1cmUiCistI2luY2x1ZGUgImNvbmZkZWZzLmgiCisrICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworICAgICAjaW5jbHVkZSA8c3RkbGliLmg+CisgICAgIGNsYXNzIFVPYmplY3QgeworICAgICB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90IHNpemUpIHtyZXR1cm4gbWFsbG9jKHNpemUpO30KK0BAIC0yODQ4LDM1ICs2OTQ3LDY1IEBACisgICAgIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQgKnApIHtmcmVlKHApO30KKyAgICAgdm9pZCBvcGVyYXRvciBkZWxldGVbXSh2b2lkICpwKSB7ZnJlZShwKTt9CisgICAgIH07CistICAgIAorLWludCBtYWluKCkgeworLSAgICAKKy07IHJldHVybiAwOyB9CistRU9GCistaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyODU3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKy0gIHJtIC1yZiBjb25mdGVzdCoKKysKKytpbnQKKyttYWluICgpCisreworKworKyAgOworKyAgcmV0dXJuIDA7CisrfQorK19BQ0VPRgorK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CisraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKKytjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKysgIGFjX3N0YXR1cz0kPworKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKysgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisrCSB0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIiB8fAorKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmIHsKKysJIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzIHx8CisrCSAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorKyAgICAgICB9OyB0aGVuCisgICBhY19jdl9vdmVycmlkZV9jeHhfYWxsb2NhdGlvbl9vaz15ZXMKKyBlbHNlCistICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CistICBybSAtcmYgY29uZnRlc3QqCistICBhY19jdl9vdmVycmlkZV9jeHhfYWxsb2NhdGlvbl9vaz1ubworKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cisrc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorKworKwlhY19jdl9vdmVycmlkZV9jeHhfYWxsb2NhdGlvbl9vaz1ubworIGZpCistcm0gLWYgY29uZnRlc3QqIAorKworK3JtIC1yZiBjb25mdGVzdC5kU1lNCisrcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKKysgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorIGZpCisgCistZWNobyAiJGFjX3QiIiRhY19jdl9vdmVycmlkZV9jeHhfYWxsb2NhdGlvbl9vayIgMT4mNgorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9vdmVycmlkZV9jeHhfYWxsb2NhdGlvbl9vayIgPiY1CisrJGFzX2VjaG8gIiRhY19jdl9vdmVycmlkZV9jeHhfYWxsb2NhdGlvbl9vayIgPiY2OyB9CisgaWYgdGVzdCAkYWNfY3Zfb3ZlcnJpZGVfY3h4X2FsbG9jYXRpb25fb2sgPSB5ZXMKKyB0aGVuCisgICAgIFVfT1ZFUlJJREVfQ1hYX0FMTE9DQVRJT049MQorLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgcGxhY2VtZW50IG5ldyBhbmQgZGVsZXRlIiIuLi4gJGFjX2MiIDE+JjYKKy1lY2hvICJjb25maWd1cmU6Mjg3NDogY2hlY2tpbmcgZm9yIHBsYWNlbWVudCBuZXcgYW5kIGRlbGV0ZSIgPiY1CistICAgIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9vdmVycmlkZV9wbGFjZW1lbnRfbmV3X29rJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKy0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CistZWxzZQorLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorLSNsaW5lIDI4NzkgImNvbmZpZ3VyZSIKKy0jaW5jbHVkZSAiY29uZmRlZnMuaCIKKysgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBwbGFjZW1lbnQgbmV3IGFuZCBkZWxldGUiID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBwbGFjZW1lbnQgbmV3IGFuZCBkZWxldGUuLi4gIiA+JjY7IH0KKysgICAgaWYgdGVzdCAiJHthY19jdl9vdmVycmlkZV9wbGFjZW1lbnRfbmV3X29rK3NldH0iID0gc2V0OyB0aGVuCisrICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorK2Vsc2UKKysgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGNvbmZkZWZzLmguICAqLworK19BQ0VPRgorK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBlbmQgY29uZmRlZnMuaC4gICovCisgICAgICAgICAjaW5jbHVkZSA8c3RkbGliLmg+CisgICAgICAgICBjbGFzcyBVT2JqZWN0IHsKKyAgICAgICAgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3Qgc2l6ZSkge3JldHVybiBtYWxsb2Moc2l6ZSk7fQorQEAgLTI4ODYsMjQgKzcwMTUsNTEgQEAKKyAgICAgICAgIHZvaWQgKiBvcGVyYXRvciBuZXcoc2l6ZV90LCB2b2lkICpwdHIpIHsgcmV0dXJuIHB0cjsgfQorICAgICAgICAgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCAqLCB2b2lkICopIHt9CisgICAgICAgICB9OworLSAgICAgICAgCistaW50IG1haW4oKSB7CistICAgICAgICAKKy07IHJldHVybiAwOyB9CistRU9GCistaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyODk1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKy0gIHJtIC1yZiBjb25mdGVzdCoKKysKKytpbnQKKyttYWluICgpCisreworKworKyAgOworKyAgcmV0dXJuIDA7CisrfQorK19BQ0VPRgorK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CisraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKKytjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKysgIGFjX3N0YXR1cz0kPworKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKysgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisrCSB0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIiB8fAorKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmIHsKKysJIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzIHx8CisrCSAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorKyAgICAgICB9OyB0aGVuCisgICBhY19jdl9vdmVycmlkZV9wbGFjZW1lbnRfbmV3X29rPXllcworIGVsc2UKKy0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CistICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKy0gIHJtIC1yZiBjb25mdGVzdCoKKy0gIGFjX2N2X292ZXJyaWRlX3BsYWNlbWVudF9uZXdfb2s9bm8KKysgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKysKKysJYWNfY3Zfb3ZlcnJpZGVfcGxhY2VtZW50X25ld19vaz1ubworIGZpCistcm0gLWYgY29uZnRlc3QqIAorKworK3JtIC1yZiBjb25mdGVzdC5kU1lNCisrcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKKysgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorIGZpCisgCistICAgIGVjaG8gIiRhY190IiIkYWNfY3Zfb3ZlcnJpZGVfcGxhY2VtZW50X25ld19vayIgMT4mNgorKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfb3ZlcnJpZGVfcGxhY2VtZW50X25ld19vayIgPiY1CisrJGFzX2VjaG8gIiRhY19jdl9vdmVycmlkZV9wbGFjZW1lbnRfbmV3X29rIiA+JjY7IH0KKyAgICAgaWYgdGVzdCAkYWNfY3Zfb3ZlcnJpZGVfcGxhY2VtZW50X25ld19vayA9IHllcworICAgICB0aGVuCisgICAgICAgICBVX0hBVkVfUExBQ0VNRU5UX05FVz0xCitAQCAtMjkxMyw1OSArNzA2OSw5NiBAQAorIAorIAorIGFjX2V4dD1jCistIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgorIGFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCistYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKKy1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKKy0KKy1lY2hvICRhY19uICJjaGVja2luZyBmb3IgcG9wZW4iIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZToyOTI0OiBjaGVja2luZyBmb3IgcG9wZW4iID4mNQorLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX3BvcGVuJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKy0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CistZWxzZQorLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorLSNsaW5lIDI5MjkgImNvbmZpZ3VyZSIKKy0jaW5jbHVkZSAiY29uZmRlZnMuaCIKKythY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCisrYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKKythY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251CisrCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBwb3BlbiIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHBvcGVuLi4uICIgPiY2OyB9CisraWYgdGVzdCAiJHthY19jdl9mdW5jX3BvcGVuK3NldH0iID0gc2V0OyB0aGVuCisrICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorK2Vsc2UKKysgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGNvbmZkZWZzLmguICAqLworK19BQ0VPRgorK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBlbmQgY29uZmRlZnMuaC4gICovCisrLyogRGVmaW5lIHBvcGVuIHRvIGFuIGlubm9jdW91cyB2YXJpYW50LCBpbiBjYXNlIDxsaW1pdHMuaD4gZGVjbGFyZXMgcG9wZW4uCisrICAgRm9yIGV4YW1wbGUsIEhQLVVYIDExaSA8bGltaXRzLmg+IGRlY2xhcmVzIGdldHRpbWVvZmRheS4gICovCisrI2RlZmluZSBwb3BlbiBpbm5vY3VvdXNfcG9wZW4KKysKKyAvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCistICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgcG9wZW4oKTsgYmVsb3cuICAqLworLSNpbmNsdWRlIDxhc3NlcnQuaD4KKy0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKy0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKy1jaGFyIHBvcGVuKCk7CisrICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgcG9wZW4gKCk7IGJlbG93LgorKyAgICBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCisrICAgIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4gICovCisrCisrI2lmZGVmIF9fU1REQ19fCisrIyBpbmNsdWRlIDxsaW1pdHMuaD4KKysjZWxzZQorKyMgaW5jbHVkZSA8YXNzZXJ0Lmg+CisrI2VuZGlmCisgCistaW50IG1haW4oKSB7CisrI3VuZGVmIHBvcGVuCisgCisrLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisrICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisrICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKysjaWZkZWYgX19jcGx1c3BsdXMKKytleHRlcm4gIkMiCisrI2VuZGlmCisrY2hhciBwb3BlbiAoKTsKKyAvKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCisgICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCisgICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworLSNpZiBkZWZpbmVkIChfX3N0dWJfcG9wZW4pIHx8IGRlZmluZWQgKF9fc3R1Yl9fX3BvcGVuKQorKyNpZiBkZWZpbmVkIF9fc3R1Yl9wb3BlbiB8fCBkZWZpbmVkIF9fc3R1Yl9fX3BvcGVuCisgY2hva2UgbWUKKy0jZWxzZQorLXBvcGVuKCk7CisgI2VuZGlmCisgCistOyByZXR1cm4gMDsgfQorLUVPRgorLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjk1MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCistICBybSAtcmYgY29uZnRlc3QqCistICBldmFsICJhY19jdl9mdW5jX3BvcGVuPXllcyIKKy1lbHNlCistICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CistICBybSAtcmYgY29uZnRlc3QqCistICBldmFsICJhY19jdl9mdW5jX3BvcGVuPW5vIgorLWZpCistcm0gLWYgY29uZnRlc3QqCistZmkKKy0KKy1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXydwb3BlbmBcIiA9IHllcyI7IHRoZW4KKy0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKy0gIDoKKy1lbHNlCistICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKytpbnQKKyttYWluICgpCisreworK3JldHVybiBwb3BlbiAoKTsKKysgIDsKKysgIHJldHVybiAwOworK30KKytfQUNFT0YKKytybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisrCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisrICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgeworKwkgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgfHwKKysJICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0CisrICAgICAgIH07IHRoZW4KKysgIGFjX2N2X2Z1bmNfcG9wZW49eWVzCisrZWxzZQorKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cisrc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorKworKwlhY19jdl9mdW5jX3BvcGVuPW5vCisrZmkKKysKKytybSAtcmYgY29uZnRlc3QuZFNZTQorK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCisrICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyBmaQorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9mdW5jX3BvcGVuIiA+JjUKKyskYXNfZWNobyAiJGFjX2N2X2Z1bmNfcG9wZW4iID4mNjsgfQorIAorIGlmIHRlc3QgeCRhY19jdl9mdW5jX3BvcGVuID0geHllcworIHRoZW4KK0BAIC0yOTc1LDEwNSArNzE2OCwxODEgQEAKKyBmaQorIAorIAorLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB0enNldCIiLi4uICRhY19jIiAxPiY2CistZWNobyAiY29uZmlndXJlOjI5ODA6IGNoZWNraW5nIGZvciB0enNldCIgPiY1CistaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfdHpzZXQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKy1lbHNlCistICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCistI2xpbmUgMjk4NSAiY29uZmlndXJlIgorLSNpbmNsdWRlICJjb25mZGVmcy5oIgorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgdHpzZXQiID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nIGZvciB0enNldC4uLiAiID4mNjsgfQorK2lmIHRlc3QgIiR7YWNfY3ZfZnVuY190enNldCtzZXR9IiA9IHNldDsgdGhlbgorKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKytlbHNlCisrICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworKy8qIERlZmluZSB0enNldCB0byBhbiBpbm5vY3VvdXMgdmFyaWFudCwgaW4gY2FzZSA8bGltaXRzLmg+IGRlY2xhcmVzIHR6c2V0LgorKyAgIEZvciBleGFtcGxlLCBIUC1VWCAxMWkgPGxpbWl0cy5oPiBkZWNsYXJlcyBnZXR0aW1lb2ZkYXkuICAqLworKyNkZWZpbmUgdHpzZXQgaW5ub2N1b3VzX3R6c2V0CisrCisgLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyIHR6c2V0KCk7IGJlbG93LiAgKi8KKy0jaW5jbHVkZSA8YXNzZXJ0Lmg+CistLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCistICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCistY2hhciB0enNldCgpOworKyAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyIHR6c2V0ICgpOyBiZWxvdy4KKysgICAgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQorKyAgICA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuICAqLworIAorLWludCBtYWluKCkgeworKyNpZmRlZiBfX1NURENfXworKyMgaW5jbHVkZSA8bGltaXRzLmg+CisrI2Vsc2UKKysjIGluY2x1ZGUgPGFzc2VydC5oPgorKyNlbmRpZgorIAorKyN1bmRlZiB0enNldAorKworKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisrI2lmZGVmIF9fY3BsdXNwbHVzCisrZXh0ZXJuICJDIgorKyNlbmRpZgorK2NoYXIgdHpzZXQgKCk7CisgLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cworICAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KKy0jaWYgZGVmaW5lZCAoX19zdHViX3R6c2V0KSB8fCBkZWZpbmVkIChfX3N0dWJfX190enNldCkKKysjaWYgZGVmaW5lZCBfX3N0dWJfdHpzZXQgfHwgZGVmaW5lZCBfX3N0dWJfX190enNldAorIGNob2tlIG1lCistI2Vsc2UKKy10enNldCgpOworICNlbmRpZgorIAorLTsgcmV0dXJuIDA7IH0KKy1FT0YKKy1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMwMDg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorLSAgZXZhbCAiYWNfY3ZfZnVuY190enNldD15ZXMiCistZWxzZQorLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKy0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorLSAgZXZhbCAiYWNfY3ZfZnVuY190enNldD1ubyIKKy1maQorLXJtIC1mIGNvbmZ0ZXN0KgorLWZpCistCistaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18ndHpzZXRgXCIgPSB5ZXMiOyB0aGVuCistICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CistICA6CistZWxzZQorLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CisraW50CisrbWFpbiAoKQorK3sKKytyZXR1cm4gdHpzZXQgKCk7CisrICA7CisrICByZXR1cm4gMDsKKyt9CisrX0FDRU9GCisrcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKKytpZiB7IChhY190cnk9IiRhY19saW5rIgorK2Nhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQorKyAgYWNfc3RhdHVzPSQ/CisrICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorKyAgcm0gLWYgY29uZnRlc3QuZXIxCisrICBjYXQgY29uZnRlc3QuZXJyID4mNQorKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKysJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmIHsKKysJIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzIHx8CisrCSAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorKyAgICAgICB9OyB0aGVuCisrICBhY19jdl9mdW5jX3R6c2V0PXllcworK2Vsc2UKKysgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKysKKysJYWNfY3ZfZnVuY190enNldD1ubworK2ZpCisrCisrcm0gLXJmIGNvbmZ0ZXN0LmRTWU0KKytybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisgZmkKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfZnVuY190enNldCIgPiY1CisrJGFzX2VjaG8gIiRhY19jdl9mdW5jX3R6c2V0IiA+JjY7IH0KKyAKKyBpZiB0ZXN0IHgkYWNfY3ZfZnVuY190enNldCA9IHh5ZXMKKyB0aGVuCisgICAgIFVfVFpTRVQ9dHpzZXQKKyBlbHNlCistICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBfdHpzZXQiIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZTozMDMyOiBjaGVja2luZyBmb3IgX3R6c2V0IiA+JjUKKy1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19fdHpzZXQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKy1lbHNlCistICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCistI2xpbmUgMzAzNyAiY29uZmlndXJlIgorLSNpbmNsdWRlICJjb25mZGVmcy5oIgorKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIF90enNldCIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIF90enNldC4uLiAiID4mNjsgfQorK2lmIHRlc3QgIiR7YWNfY3ZfZnVuY19fdHpzZXQrc2V0fSIgPSBzZXQ7IHRoZW4KKysgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisrZWxzZQorKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKysvKiBEZWZpbmUgX3R6c2V0IHRvIGFuIGlubm9jdW91cyB2YXJpYW50LCBpbiBjYXNlIDxsaW1pdHMuaD4gZGVjbGFyZXMgX3R6c2V0LgorKyAgIEZvciBleGFtcGxlLCBIUC1VWCAxMWkgPGxpbWl0cy5oPiBkZWNsYXJlcyBnZXR0aW1lb2ZkYXkuICAqLworKyNkZWZpbmUgX3R6c2V0IGlubm9jdW91c19fdHpzZXQKKysKKyAvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCistICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgX3R6c2V0KCk7IGJlbG93LiAgKi8KKy0jaW5jbHVkZSA8YXNzZXJ0Lmg+CistLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCistICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCistY2hhciBfdHpzZXQoKTsKKysgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciBfdHpzZXQgKCk7IGJlbG93LgorKyAgICBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCisrICAgIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4gICovCisrCisrI2lmZGVmIF9fU1REQ19fCisrIyBpbmNsdWRlIDxsaW1pdHMuaD4KKysjZWxzZQorKyMgaW5jbHVkZSA8YXNzZXJ0Lmg+CisrI2VuZGlmCisgCistaW50IG1haW4oKSB7CisrI3VuZGVmIF90enNldAorIAorKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisrI2lmZGVmIF9fY3BsdXNwbHVzCisrZXh0ZXJuICJDIgorKyNlbmRpZgorK2NoYXIgX3R6c2V0ICgpOworIC8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKKyAgICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCistI2lmIGRlZmluZWQgKF9fc3R1Yl9fdHpzZXQpIHx8IGRlZmluZWQgKF9fc3R1Yl9fX190enNldCkKKysjaWYgZGVmaW5lZCBfX3N0dWJfX3R6c2V0IHx8IGRlZmluZWQgX19zdHViX19fX3R6c2V0CisgY2hva2UgbWUKKy0jZWxzZQorLV90enNldCgpOworICNlbmRpZgorIAorLTsgcmV0dXJuIDA7IH0KKy1FT0YKKy1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMwNjA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorLSAgZXZhbCAiYWNfY3ZfZnVuY19fdHpzZXQ9eWVzIgorLWVsc2UKKy0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CistICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKy0gIHJtIC1yZiBjb25mdGVzdCoKKy0gIGV2YWwgImFjX2N2X2Z1bmNfX3R6c2V0PW5vIgorLWZpCistcm0gLWYgY29uZnRlc3QqCistZmkKKy0KKy1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXydfdHpzZXRgXCIgPSB5ZXMiOyB0aGVuCistICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CistICA6CistZWxzZQorLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CisraW50CisrbWFpbiAoKQorK3sKKytyZXR1cm4gX3R6c2V0ICgpOworKyAgOworKyAgcmV0dXJuIDA7CisrfQorK19BQ0VPRgorK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CisraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKKytjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKysgIGFjX3N0YXR1cz0kPworKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKysgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisrCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKysJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKysgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJiB7CisrCSB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllcyB8fAorKwkgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQKKysgICAgICAgfTsgdGhlbgorKyAgYWNfY3ZfZnVuY19fdHpzZXQ9eWVzCisrZWxzZQorKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cisrc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorKworKwlhY19jdl9mdW5jX190enNldD1ubworK2ZpCisrCisrcm0gLXJmIGNvbmZ0ZXN0LmRTWU0KKytybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisgZmkKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfZnVuY19fdHpzZXQiID4mNQorKyRhc19lY2hvICIkYWNfY3ZfZnVuY19fdHpzZXQiID4mNjsgfQorIAorICAgICBpZiB0ZXN0IHgkYWNfY3ZfZnVuY19fdHpzZXQgPSB4eWVzCisgICAgIHRoZW4KK0BAIC0zMDgxLDE0ICs3MzUwLDE3IEBACisgICAgIGZpCisgZmkKKyAKKy1lY2hvICRhY19uICJjaGVja2luZyBmb3IgdHpuYW1lIiIuLi4gJGFjX2MiIDE+JjYKKy1lY2hvICJjb25maWd1cmU6MzA4NjogY2hlY2tpbmcgZm9yIHR6bmFtZSIgPiY1CistaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Zhcl90em5hbWUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKy1lbHNlCistICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCistI2xpbmUgMzA5MSAiY29uZmlndXJlIgorLSNpbmNsdWRlICJjb25mZGVmcy5oIgorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgdHpuYW1lIiA+JjUKKyskYXNfZWNob19uICJjaGVja2luZyBmb3IgdHpuYW1lLi4uICIgPiY2OyB9CisraWYgdGVzdCAiJHthY19jdl92YXJfdHpuYW1lK3NldH0iID0gc2V0OyB0aGVuCisrICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorK2Vsc2UKKysgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGNvbmZkZWZzLmguICAqLworK19BQ0VPRgorK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBlbmQgY29uZmRlZnMuaC4gICovCisgI2lmbmRlZiBfX1VTRV9QT1NJWAorICNkZWZpbmUgX19VU0VfUE9TSVgKKyAjZW5kaWYKK0BAIC0zMDk2LDY4ICs3MzY4LDEyNiBAQAorICNpZm5kZWYgdHpuYW1lIC8qIEZvciBTR0kuICAqLworIGV4dGVybiBjaGFyICp0em5hbWVbXTsgLyogUlM2MDAwIGFuZCBvdGhlcnMgcmVqZWN0IGNoYXIgKip0em5hbWUuICAqLworICNlbmRpZgorLWludCBtYWluKCkgeworK2ludAorK21haW4gKCkKKyt7CisgYXRvaSgqdHpuYW1lKTsKKy07IHJldHVybiAwOyB9CistRU9GCistaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTA0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKy0gIHJtIC1yZiBjb25mdGVzdCoKKysgIDsKKysgIHJldHVybiAwOworK30KKytfQUNFT0YKKytybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisrCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisrICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgeworKwkgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgfHwKKysJICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0CisrICAgICAgIH07IHRoZW4KKyAgIGFjX2N2X3Zhcl90em5hbWU9eWVzCisgZWxzZQorLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKy0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorLSAgYWNfY3ZfdmFyX3R6bmFtZT1ubworLWZpCistcm0gLWYgY29uZnRlc3QqCisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrCWFjX2N2X3Zhcl90em5hbWU9bm8KKyBmaQorIAorLWVjaG8gIiRhY190IiIkYWNfY3ZfdmFyX3R6bmFtZSIgMT4mNgorK3JtIC1yZiBjb25mdGVzdC5kU1lNCisrcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKKysgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorK2ZpCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3Zhcl90em5hbWUiID4mNQorKyRhc19lY2hvICIkYWNfY3ZfdmFyX3R6bmFtZSIgPiY2OyB9CisgaWYgdGVzdCAkYWNfY3ZfdmFyX3R6bmFtZSA9IHllczsgdGhlbgorICAgVV9UWk5BTUU9dHpuYW1lCisgZWxzZQorLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIF90em5hbWUiIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZTozMTIxOiBjaGVja2luZyBmb3IgX3R6bmFtZSIgPiY1CistaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Zhcl9fdHpuYW1lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKy0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CistZWxzZQorLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorLSNsaW5lIDMxMjYgImNvbmZpZ3VyZSIKKy0jaW5jbHVkZSAiY29uZmRlZnMuaCIKKysgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgX3R6bmFtZSIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIF90em5hbWUuLi4gIiA+JjY7IH0KKytpZiB0ZXN0ICIke2FjX2N2X3Zhcl9fdHpuYW1lK3NldH0iID0gc2V0OyB0aGVuCisrICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorK2Vsc2UKKysgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGNvbmZkZWZzLmguICAqLworK19BQ0VPRgorK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBlbmQgY29uZmRlZnMuaC4gICovCisgICAjaW5jbHVkZSA8dGltZS5oPgorICAgZXh0ZXJuIGNoYXIgKl90em5hbWVbXTsKKy0gIAorLWludCBtYWluKCkgeworKworK2ludAorK21haW4gKCkKKyt7CisgICBhdG9pKCpfdHpuYW1lKTsKKy07IHJldHVybiAwOyB9CistRU9GCistaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTM1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKy0gIHJtIC1yZiBjb25mdGVzdCoKKysgIDsKKysgIHJldHVybiAwOworK30KKytfQUNFT0YKKytybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorK2lmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisrCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisrICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgeworKwkgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgfHwKKysJICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0CisrICAgICAgIH07IHRoZW4KKyAgIGFjX2N2X3Zhcl9fdHpuYW1lPXllcworIGVsc2UKKy0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CistICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKy0gIHJtIC1yZiBjb25mdGVzdCoKKy0gIGFjX2N2X3Zhcl9fdHpuYW1lPW5vCistZmkKKy1ybSAtZiBjb25mdGVzdCoKKysgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKysKKysJYWNfY3ZfdmFyX190em5hbWU9bm8KKyBmaQorIAorLWVjaG8gIiRhY190IiIkYWNfY3ZfdmFyX190em5hbWUiIDE+JjYKKytybSAtcmYgY29uZnRlc3QuZFNZTQorK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCisrICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKytmaQorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl92YXJfX3R6bmFtZSIgPiY1CisrJGFzX2VjaG8gIiRhY19jdl92YXJfX3R6bmFtZSIgPiY2OyB9CisgICAgIGlmIHRlc3QgJGFjX2N2X3Zhcl9fdHpuYW1lID0geWVzOyB0aGVuCisgICAgICAgVV9UWk5BTUU9X3R6bmFtZQorICAgICBmaQorIGZpCisgCisgCistZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHRpbWV6b25lIiIuLi4gJGFjX2MiIDE+JjYKKy1lY2hvICJjb25maWd1cmU6MzE1NTogY2hlY2tpbmcgZm9yIHRpbWV6b25lIiA+JjUKKy1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdmFyX3RpbWV6b25lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKy0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CistZWxzZQorLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorLSNsaW5lIDMxNjAgImNvbmZpZ3VyZSIKKy0jaW5jbHVkZSAiY29uZmRlZnMuaCIKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHRpbWV6b25lIiA+JjUKKyskYXNfZWNob19uICJjaGVja2luZyBmb3IgdGltZXpvbmUuLi4gIiA+JjY7IH0KKytpZiB0ZXN0ICIke2FjX2N2X3Zhcl90aW1lem9uZStzZXR9IiA9IHNldDsgdGhlbgorKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKytlbHNlCisrICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworICNpZm5kZWYgX19VU0VfUE9TSVgKKyAjZGVmaW5lIF9fVVNFX1BPU0lYCisgI2VuZGlmCitAQCAtMzE2Niw4NiArNzQ5NiwxNzAgQEAKKyAjZW5kaWYKKyAjaW5jbHVkZSA8dGltZS5oPgorIAorLWludCBtYWluKCkgeworK2ludAorK21haW4gKCkKKyt7CisgdGltZXpvbmUgPSAxOworLTsgcmV0dXJuIDA7IH0KKy1FT0YKKy1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMxNzQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorKyAgOworKyAgcmV0dXJuIDA7CisrfQorK19BQ0VPRgorK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CisraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKKytjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKysgIGFjX3N0YXR1cz0kPworKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKysgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisrCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKysJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKysgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJiB7CisrCSB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllcyB8fAorKwkgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQKKysgICAgICAgfTsgdGhlbgorICAgYWNfY3ZfdmFyX3RpbWV6b25lPXllcworIGVsc2UKKy0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CistICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKy0gIHJtIC1yZiBjb25mdGVzdCoKKy0gIGFjX2N2X3Zhcl90aW1lem9uZT1ubworLWZpCistcm0gLWYgY29uZnRlc3QqCisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrCWFjX2N2X3Zhcl90aW1lem9uZT1ubworIGZpCisgCistZWNobyAiJGFjX3QiIiRhY19jdl92YXJfdGltZXpvbmUiIDE+JjYKKytybSAtcmYgY29uZnRlc3QuZFNZTQorK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCisrICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKytmaQorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl92YXJfdGltZXpvbmUiID4mNQorKyRhc19lY2hvICIkYWNfY3ZfdmFyX3RpbWV6b25lIiA+JjY7IH0KKyBVX0hBVkVfVElNRVpPTkU9MAorIGlmIHRlc3QgJGFjX2N2X3Zhcl90aW1lem9uZSA9IHllczsgdGhlbgorICAgVV9USU1FWk9ORT10aW1lem9uZQorICAgVV9IQVZFX1RJTUVaT05FPTEKKyBlbHNlCistICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgX190aW1lem9uZSIiLi4uICRhY19jIiAxPiY2CistZWNobyAiY29uZmlndXJlOjMxOTM6IGNoZWNraW5nIGZvciBfX3RpbWV6b25lIiA+JjUKKy1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdmFyX19fdGltZXpvbmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKy1lbHNlCistICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCistI2xpbmUgMzE5OCAiY29uZmlndXJlIgorLSNpbmNsdWRlICJjb25mZGVmcy5oIgorKyAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBfX3RpbWV6b25lIiA+JjUKKyskYXNfZWNob19uICJjaGVja2luZyBmb3IgX190aW1lem9uZS4uLiAiID4mNjsgfQorK2lmIHRlc3QgIiR7YWNfY3ZfdmFyX19fdGltZXpvbmUrc2V0fSIgPSBzZXQ7IHRoZW4KKysgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisrZWxzZQorKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyAgICNpbmNsdWRlIDx0aW1lLmg+CistICAKKy1pbnQgbWFpbigpIHsKKysKKytpbnQKKyttYWluICgpCisreworICAgX190aW1lem9uZSA9IDE7CistOyByZXR1cm4gMDsgfQorLUVPRgorLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzIwNjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCistICBybSAtcmYgY29uZnRlc3QqCisrICA7CisrICByZXR1cm4gMDsKKyt9CisrX0FDRU9GCisrcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKKytpZiB7IChhY190cnk9IiRhY19saW5rIgorK2Nhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQorKyAgYWNfc3RhdHVzPSQ/CisrICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorKyAgcm0gLWYgY29uZnRlc3QuZXIxCisrICBjYXQgY29uZnRlc3QuZXJyID4mNQorKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKysJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmIHsKKysJIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzIHx8CisrCSAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorKyAgICAgICB9OyB0aGVuCisgICBhY19jdl92YXJfX190aW1lem9uZT15ZXMKKyBlbHNlCistICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CistICBybSAtcmYgY29uZnRlc3QqCistICBhY19jdl92YXJfX190aW1lem9uZT1ubworLWZpCistcm0gLWYgY29uZnRlc3QqCisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrCWFjX2N2X3Zhcl9fX3RpbWV6b25lPW5vCisgZmkKKyAKKy1lY2hvICIkYWNfdCIiJGFjX2N2X3Zhcl9fX3RpbWV6b25lIiAxPiY2Cisrcm0gLXJmIGNvbmZ0ZXN0LmRTWU0KKytybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorKyAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisrZmkKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdmFyX19fdGltZXpvbmUiID4mNQorKyRhc19lY2hvICIkYWNfY3ZfdmFyX19fdGltZXpvbmUiID4mNjsgfQorICAgaWYgdGVzdCAkYWNfY3ZfdmFyX19fdGltZXpvbmUgPSB5ZXM7IHRoZW4KKyAgICAgVV9USU1FWk9ORT1fX3RpbWV6b25lCisgICAgIFVfSEFWRV9USU1FWk9ORT0xCisgICBlbHNlCistICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBfdGltZXpvbmUiIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZTozMjI0OiBjaGVja2luZyBmb3IgX3RpbWV6b25lIiA+JjUKKy1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdmFyX190aW1lem9uZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCistICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorLWVsc2UKKy0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKy0jbGluZSAzMjI5ICJjb25maWd1cmUiCistI2luY2x1ZGUgImNvbmZkZWZzLmgiCisrICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgX3RpbWV6b25lIiA+JjUKKyskYXNfZWNob19uICJjaGVja2luZyBmb3IgX3RpbWV6b25lLi4uICIgPiY2OyB9CisraWYgdGVzdCAiJHthY19jdl92YXJfX3RpbWV6b25lK3NldH0iID0gc2V0OyB0aGVuCisrICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorK2Vsc2UKKysgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGNvbmZkZWZzLmguICAqLworK19BQ0VPRgorK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBlbmQgY29uZmRlZnMuaC4gICovCisgICAgICNpbmNsdWRlIDx0aW1lLmg+CistICAgIAorLWludCBtYWluKCkgeworKworK2ludAorK21haW4gKCkKKyt7CisgICAgIF90aW1lem9uZSA9IDE7CistOyByZXR1cm4gMDsgfQorLUVPRgorLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzIzNzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCistICBybSAtcmYgY29uZnRlc3QqCisrICA7CisrICByZXR1cm4gMDsKKyt9CisrX0FDRU9GCisrcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKKytpZiB7IChhY190cnk9IiRhY19saW5rIgorK2Nhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQorKyAgYWNfc3RhdHVzPSQ/CisrICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorKyAgcm0gLWYgY29uZnRlc3QuZXIxCisrICBjYXQgY29uZnRlc3QuZXJyID4mNQorKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKysJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmIHsKKysJIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzIHx8CisrCSAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorKyAgICAgICB9OyB0aGVuCisgICBhY19jdl92YXJfX3RpbWV6b25lPXllcworIGVsc2UKKy0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CistICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKy0gIHJtIC1yZiBjb25mdGVzdCoKKy0gIGFjX2N2X3Zhcl9fdGltZXpvbmU9bm8KKy1maQorLXJtIC1mIGNvbmZ0ZXN0KgorKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cisrc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorKworKwlhY19jdl92YXJfX3RpbWV6b25lPW5vCisgZmkKKyAKKy1lY2hvICIkYWNfdCIiJGFjX2N2X3Zhcl9fdGltZXpvbmUiIDE+JjYKKytybSAtcmYgY29uZnRlc3QuZFNZTQorK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCisrICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKytmaQorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl92YXJfX3RpbWV6b25lIiA+JjUKKyskYXNfZWNobyAiJGFjX2N2X3Zhcl9fdGltZXpvbmUiID4mNjsgfQorICAgICBpZiB0ZXN0ICRhY19jdl92YXJfX3RpbWV6b25lID0geWVzOyB0aGVuCisgICAgICAgVV9USU1FWk9ORT1fdGltZXpvbmUKKyAgICAgICBVX0hBVkVfVElNRVpPTkU9MQorQEAgLTMyNTUsMzcxICs3NjY5LDgzNSBAQAorIAorIAorIAorLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiIuLi4gJGFjX2MiIDE+JjYKKy1lY2hvICJjb25maWd1cmU6MzI2MDogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQorLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfc3RkYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCistICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorLWVsc2UKKy0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKy0jbGluZSAzMjY1ICJjb25maWd1cmUiCistI2luY2x1ZGUgImNvbmZkZWZzLmgiCistI2luY2x1ZGUgPHN0ZGxpYi5oPgorLSNpbmNsdWRlIDxzdGRhcmcuaD4KKy0jaW5jbHVkZSA8c3RyaW5nLmg+CistI2luY2x1ZGUgPGZsb2F0Lmg+CistRU9GCistYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKKy17IChldmFsIGVjaG8gY29uZmlndXJlOjMyNzM6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CistYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAorLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCistICBybSAtcmYgY29uZnRlc3QqCistICBhY19jdl9oZWFkZXJfc3RkYz15ZXMKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGludDhfdCIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGludDhfdC4uLiAiID4mNjsgfQorK2lmIHRlc3QgIiR7YWNfY3ZfdHlwZV9pbnQ4X3Qrc2V0fSIgPSBzZXQ7IHRoZW4KKysgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisgZWxzZQorLSAgZWNobyAiJGFjX2VyciIgPiY1CistICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CistICBybSAtcmYgY29uZnRlc3QqCistICBhY19jdl9oZWFkZXJfc3RkYz1ubworLWZpCistcm0gLWYgY29uZnRlc3QqCistCistaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKy0gICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8gQU5TSS4KKy1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCistI2xpbmUgMzI5MCAiY29uZmlndXJlIgorLSNpbmNsdWRlICJjb25mZGVmcy5oIgorLSNpbmNsdWRlIDxzdHJpbmcuaD4KKy1FT0YKKy1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CistICBlZ3JlcCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKysgIGFjX2N2X3R5cGVfaW50OF90PW5vCisrY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyskYWNfaW5jbHVkZXNfZGVmYXVsdAorK2ludAorK21haW4gKCkKKyt7CisraWYgKHNpemVvZiAoaW50OF90KSkKKysgICAgICAgcmV0dXJuIDA7CisrICA7CisrICByZXR1cm4gMDsKKyt9CisrX0FDRU9GCisrcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisrCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisrICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisrICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworKyRhY19pbmNsdWRlc19kZWZhdWx0CisraW50CisrbWFpbiAoKQorK3sKKytpZiAoc2l6ZW9mICgoaW50OF90KSkpCisrCSAgcmV0dXJuIDA7CisrICA7CisrICByZXR1cm4gMDsKKyt9CisrX0FDRU9GCisrcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisrCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisrICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisgICA6CisgZWxzZQorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KKy1maQorLXJtIC1mIGNvbmZ0ZXN0KgorKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cisrc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorIAorKwlhY19jdl90eXBlX2ludDhfdD15ZXMKKyBmaQorIAorLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCistICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCistY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorLSNsaW5lIDMzMDggImNvbmZpZ3VyZSIKKy0jaW5jbHVkZSAiY29uZmRlZnMuaCIKKy0jaW5jbHVkZSA8c3RkbGliLmg+CistRU9GCistaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorLSAgZWdyZXAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbgorLSAgOgorK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorIGVsc2UKKy0gIHJtIC1yZiBjb25mdGVzdCoKKy0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCistZmkKKy1ybSAtZiBjb25mdGVzdCoKKysgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKysKKyAKKyBmaQorIAorLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCistICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCistaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKytybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKytmaQorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX2ludDhfdCIgPiY1CisrJGFzX2VjaG8gIiRhY19jdl90eXBlX2ludDhfdCIgPiY2OyB9CisraWYgdGVzdCAieCRhY19jdl90eXBlX2ludDhfdCIgPSB4IiJ5ZXM7IHRoZW4KKyAgIDoKKyBlbHNlCistICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCistI2xpbmUgMzMyOSAiY29uZmlndXJlIgorLSNpbmNsdWRlICJjb25mZGVmcy5oIgorLSNpbmNsdWRlIDxjdHlwZS5oPgorLSNkZWZpbmUgSVNMT1dFUihjKSAoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ3onKQorLSNkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQorLSNkZWZpbmUgWE9SKGUsIGYpICgoKGUpICYmICEoZikpIHx8ICghKGUpICYmIChmKSkpCistaW50IG1haW4gKCkgeyBpbnQgaTsgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorLWlmIChYT1IgKGlzbG93ZXIgKGkpLCBJU0xPV0VSIChpKSkgfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpIGV4aXQoMik7CistZXhpdCAoMCk7IH0KKyAKKy1FT0YKKy1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMzNDA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKKy10aGVuCistICA6CistZWxzZQorLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKy0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorLSAgcm0gLWZyIGNvbmZ0ZXN0KgorLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KKy1maQorLXJtIC1mciBjb25mdGVzdCoKKy1maQorK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKysjZGVmaW5lIGludDhfdCBzaWduZWQgY2hhcgorK19BQ0VPRgorIAorIGZpCistZmkKKyAKKy1lY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9zdGRjIiAxPiY2CistaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KKy0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorLSNkZWZpbmUgU1REQ19IRUFERVJTIDEKKy1FT0YKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHVpbnQ4X3QiID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nIGZvciB1aW50OF90Li4uICIgPiY2OyB9CisraWYgdGVzdCAiJHthY19jdl90eXBlX3VpbnQ4X3Qrc2V0fSIgPSBzZXQ7IHRoZW4KKysgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisrZWxzZQorKyAgYWNfY3ZfdHlwZV91aW50OF90PW5vCisrY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyskYWNfaW5jbHVkZXNfZGVmYXVsdAorK2ludAorK21haW4gKCkKKyt7CisraWYgKHNpemVvZiAodWludDhfdCkpCisrICAgICAgIHJldHVybiAwOworKyAgOworKyAgcmV0dXJuIDA7CisrfQorK19BQ0VPRgorK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKKytpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorK2Nhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorKyAgYWNfc3RhdHVzPSQ/CisrICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorKyAgcm0gLWYgY29uZnRlc3QuZXIxCisrICBjYXQgY29uZnRlc3QuZXJyID4mNQorKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKysJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyskYWNfaW5jbHVkZXNfZGVmYXVsdAorK2ludAorK21haW4gKCkKKyt7CisraWYgKHNpemVvZiAoKHVpbnQ4X3QpKSkKKysJICByZXR1cm4gMDsKKysgIDsKKysgIHJldHVybiAwOworK30KKytfQUNFT0YKKytybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CisraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKKytjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKysgIGFjX3N0YXR1cz0kPworKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKysgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisrCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKysJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKysgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKysgIDoKKytlbHNlCisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisgCisrCWFjX2N2X3R5cGVfdWludDhfdD15ZXMKKyBmaQorIAorLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBpbnQ4X3QiIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZTozMzY0OiBjaGVja2luZyBmb3IgaW50OF90IiA+JjUKKy1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9pbnQ4X3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKy1lbHNlCistICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCistI2xpbmUgMzM2OSAiY29uZmlndXJlIgorLSNpbmNsdWRlICJjb25mZGVmcy5oIgorLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKy0jaWYgU1REQ19IRUFERVJTCistI2luY2x1ZGUgPHN0ZGxpYi5oPgorLSNpbmNsdWRlIDxzdGRkZWYuaD4KKy0jZW5kaWYKKy1FT0YKKy1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CistICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlpbnQ4X3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKy0gIHJtIC1yZiBjb25mdGVzdCoKKy0gIGFjX2N2X3R5cGVfaW50OF90PXllcworK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorIGVsc2UKKy0gIHJtIC1yZiBjb25mdGVzdCoKKy0gIGFjX2N2X3R5cGVfaW50OF90PW5vCistZmkKKy1ybSAtZiBjb25mdGVzdCoKKysgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKyAKKy1maQorLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9pbnQ4X3QiIDE+JjYKKy1pZiB0ZXN0ICRhY19jdl90eXBlX2ludDhfdCA9IG5vOyB0aGVuCistICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKy0jZGVmaW5lIGludDhfdCBzaWduZWQgY2hhcgorLUVPRgorIAorIGZpCisgCistZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHVpbnQ4X3QiIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZTozMzk3OiBjaGVja2luZyBmb3IgdWludDhfdCIgPiY1CistaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfdWludDhfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCistICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorLWVsc2UKKy0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKy0jbGluZSAzNDAyICJjb25maWd1cmUiCistI2luY2x1ZGUgImNvbmZkZWZzLmgiCistI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorLSNpZiBTVERDX0hFQURFUlMKKy0jaW5jbHVkZSA8c3RkbGliLmg+CistI2luY2x1ZGUgPHN0ZGRlZi5oPgorLSNlbmRpZgorLUVPRgorLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKy0gIGVncmVwICIoXnxbXmEtekEtWl8wLTldKXVpbnQ4X3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKy0gIHJtIC1yZiBjb25mdGVzdCoKKy0gIGFjX2N2X3R5cGVfdWludDhfdD15ZXMKKy1lbHNlCistICBybSAtcmYgY29uZnRlc3QqCistICBhY19jdl90eXBlX3VpbnQ4X3Q9bm8KKytybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyBmaQorLXJtIC1mIGNvbmZ0ZXN0KgorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX3VpbnQ4X3QiID4mNQorKyRhc19lY2hvICIkYWNfY3ZfdHlwZV91aW50OF90IiA+JjY7IH0KKytpZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfdWludDhfdCIgPSB4IiJ5ZXM7IHRoZW4KKysgIDoKKytlbHNlCisgCistZmkKKy1lY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfdWludDhfdCIgMT4mNgorLWlmIHRlc3QgJGFjX2N2X3R5cGVfdWludDhfdCA9IG5vOyB0aGVuCistICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKytjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisgI2RlZmluZSB1aW50OF90IHVuc2lnbmVkIGNoYXIKKy1FT0YKKytfQUNFT0YKKyAKKyBmaQorIAorLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBpbnQxNl90IiIuLi4gJGFjX2MiIDE+JjYKKy1lY2hvICJjb25maWd1cmU6MzQzMDogY2hlY2tpbmcgZm9yIGludDE2X3QiID4mNQorLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX2ludDE2X3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKy1lbHNlCistICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCistI2xpbmUgMzQzNSAiY29uZmlndXJlIgorLSNpbmNsdWRlICJjb25mZGVmcy5oIgorLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKy0jaWYgU1REQ19IRUFERVJTCistI2luY2x1ZGUgPHN0ZGxpYi5oPgorLSNpbmNsdWRlIDxzdGRkZWYuaD4KKy0jZW5kaWYKKy1FT0YKKy1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CistICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlpbnQxNl90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCistICBybSAtcmYgY29uZnRlc3QqCistICBhY19jdl90eXBlX2ludDE2X3Q9eWVzCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBpbnQxNl90IiA+JjUKKyskYXNfZWNob19uICJjaGVja2luZyBmb3IgaW50MTZfdC4uLiAiID4mNjsgfQorK2lmIHRlc3QgIiR7YWNfY3ZfdHlwZV9pbnQxNl90K3NldH0iID0gc2V0OyB0aGVuCisrICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorIGVsc2UKKy0gIHJtIC1yZiBjb25mdGVzdCoKKyAgIGFjX2N2X3R5cGVfaW50MTZfdD1ubworK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGNvbmZkZWZzLmguICAqLworK19BQ0VPRgorK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBlbmQgY29uZmRlZnMuaC4gICovCisrJGFjX2luY2x1ZGVzX2RlZmF1bHQKKytpbnQKKyttYWluICgpCisreworK2lmIChzaXplb2YgKGludDE2X3QpKQorKyAgICAgICByZXR1cm4gMDsKKysgIDsKKysgIHJldHVybiAwOworK30KKytfQUNFT0YKKytybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CisraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKKytjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKysgIGFjX3N0YXR1cz0kPworKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKysgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisrCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKysJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKysgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKysgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGNvbmZkZWZzLmguICAqLworK19BQ0VPRgorK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBlbmQgY29uZmRlZnMuaC4gICovCisrJGFjX2luY2x1ZGVzX2RlZmF1bHQKKytpbnQKKyttYWluICgpCisreworK2lmIChzaXplb2YgKChpbnQxNl90KSkpCisrCSAgcmV0dXJuIDA7CisrICA7CisrICByZXR1cm4gMDsKKyt9CisrX0FDRU9GCisrcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisrCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisrICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisrICA6CisrZWxzZQorKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cisrc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorKworKwlhY19jdl90eXBlX2ludDE2X3Q9eWVzCisgZmkKKy1ybSAtZiBjb25mdGVzdCoKKysKKytybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKytlbHNlCisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisgCisgZmkKKy1lY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfaW50MTZfdCIgMT4mNgorLWlmIHRlc3QgJGFjX2N2X3R5cGVfaW50MTZfdCA9IG5vOyB0aGVuCistICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKysKKytybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKytmaQorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX2ludDE2X3QiID4mNQorKyRhc19lY2hvICIkYWNfY3ZfdHlwZV9pbnQxNl90IiA+JjY7IH0KKytpZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfaW50MTZfdCIgPSB4IiJ5ZXM7IHRoZW4KKysgIDoKKytlbHNlCisrCisrY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorICNkZWZpbmUgaW50MTZfdCBzaWduZWQgc2hvcnQKKy1FT0YKKytfQUNFT0YKKyAKKyBmaQorIAorLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB1aW50MTZfdCIiLi4uICRhY19jIiAxPiY2CistZWNobyAiY29uZmlndXJlOjM0NjM6IGNoZWNraW5nIGZvciB1aW50MTZfdCIgPiY1CistaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfdWludDE2X3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKy1lbHNlCistICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCistI2xpbmUgMzQ2OCAiY29uZmlndXJlIgorLSNpbmNsdWRlICJjb25mZGVmcy5oIgorLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKy0jaWYgU1REQ19IRUFERVJTCistI2luY2x1ZGUgPHN0ZGxpYi5oPgorLSNpbmNsdWRlIDxzdGRkZWYuaD4KKy0jZW5kaWYKKy1FT0YKKy1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CistICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSl1aW50MTZfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorLSAgYWNfY3ZfdHlwZV91aW50MTZfdD15ZXMKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHVpbnQxNl90IiA+JjUKKyskYXNfZWNob19uICJjaGVja2luZyBmb3IgdWludDE2X3QuLi4gIiA+JjY7IH0KKytpZiB0ZXN0ICIke2FjX2N2X3R5cGVfdWludDE2X3Qrc2V0fSIgPSBzZXQ7IHRoZW4KKysgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisgZWxzZQorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorICAgYWNfY3ZfdHlwZV91aW50MTZfdD1ubworK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGNvbmZkZWZzLmguICAqLworK19BQ0VPRgorK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBlbmQgY29uZmRlZnMuaC4gICovCisrJGFjX2luY2x1ZGVzX2RlZmF1bHQKKytpbnQKKyttYWluICgpCisreworK2lmIChzaXplb2YgKHVpbnQxNl90KSkKKysgICAgICAgcmV0dXJuIDA7CisrICA7CisrICByZXR1cm4gMDsKKyt9CisrX0FDRU9GCisrcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisrCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisrICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisrICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworKyRhY19pbmNsdWRlc19kZWZhdWx0CisraW50CisrbWFpbiAoKQorK3sKKytpZiAoc2l6ZW9mICgodWludDE2X3QpKSkKKysJICByZXR1cm4gMDsKKysgIDsKKysgIHJldHVybiAwOworK30KKytfQUNFT0YKKytybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CisraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKKytjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKysgIGFjX3N0YXR1cz0kPworKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKysgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisrCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKysJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKysgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKysgIDoKKytlbHNlCisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrCWFjX2N2X3R5cGVfdWludDE2X3Q9eWVzCisgZmkKKy1ybSAtZiBjb25mdGVzdCoKKysKKytybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKytlbHNlCisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisgCisgZmkKKy1lY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfdWludDE2X3QiIDE+JjYKKy1pZiB0ZXN0ICRhY19jdl90eXBlX3VpbnQxNl90ID0gbm87IHRoZW4KKy0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorKworK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorK2ZpCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfdWludDE2X3QiID4mNQorKyRhc19lY2hvICIkYWNfY3ZfdHlwZV91aW50MTZfdCIgPiY2OyB9CisraWYgdGVzdCAieCRhY19jdl90eXBlX3VpbnQxNl90IiA9IHgiInllczsgdGhlbgorKyAgOgorK2Vsc2UKKysKKytjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisgI2RlZmluZSB1aW50MTZfdCB1bnNpZ25lZCBzaG9ydAorLUVPRgorK19BQ0VPRgorIAorIGZpCisgCistZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGludDMyX3QiIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZTozNDk2OiBjaGVja2luZyBmb3IgaW50MzJfdCIgPiY1CistaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfaW50MzJfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCistICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorLWVsc2UKKy0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKy0jbGluZSAzNTAxICJjb25maWd1cmUiCistI2luY2x1ZGUgImNvbmZkZWZzLmgiCistI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorLSNpZiBTVERDX0hFQURFUlMKKy0jaW5jbHVkZSA8c3RkbGliLmg+CistI2luY2x1ZGUgPHN0ZGRlZi5oPgorLSNlbmRpZgorLUVPRgorLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKy0gIGVncmVwICIoXnxbXmEtekEtWl8wLTldKWludDMyX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKy0gIHJtIC1yZiBjb25mdGVzdCoKKy0gIGFjX2N2X3R5cGVfaW50MzJfdD15ZXMKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGludDMyX3QiID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBpbnQzMl90Li4uICIgPiY2OyB9CisraWYgdGVzdCAiJHthY19jdl90eXBlX2ludDMyX3Qrc2V0fSIgPSBzZXQ7IHRoZW4KKysgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisgZWxzZQorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorICAgYWNfY3ZfdHlwZV9pbnQzMl90PW5vCisrY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyskYWNfaW5jbHVkZXNfZGVmYXVsdAorK2ludAorK21haW4gKCkKKyt7CisraWYgKHNpemVvZiAoaW50MzJfdCkpCisrICAgICAgIHJldHVybiAwOworKyAgOworKyAgcmV0dXJuIDA7CisrfQorK19BQ0VPRgorK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKKytpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorK2Nhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorKyAgYWNfc3RhdHVzPSQ/CisrICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorKyAgcm0gLWYgY29uZnRlc3QuZXIxCisrICBjYXQgY29uZnRlc3QuZXJyID4mNQorKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKysJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyskYWNfaW5jbHVkZXNfZGVmYXVsdAorK2ludAorK21haW4gKCkKKyt7CisraWYgKHNpemVvZiAoKGludDMyX3QpKSkKKysJICByZXR1cm4gMDsKKysgIDsKKysgIHJldHVybiAwOworK30KKytfQUNFT0YKKytybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CisraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKKytjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKysgIGFjX3N0YXR1cz0kPworKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKysgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisrCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKysJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKysgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKysgIDoKKytlbHNlCisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrCWFjX2N2X3R5cGVfaW50MzJfdD15ZXMKKyBmaQorLXJtIC1mIGNvbmZ0ZXN0KgorKworK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorK2Vsc2UKKysgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKysKKyAKKyBmaQorLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9pbnQzMl90IiAxPiY2CistaWYgdGVzdCAkYWNfY3ZfdHlwZV9pbnQzMl90ID0gbm87IHRoZW4KKy0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorKworK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorK2ZpCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfaW50MzJfdCIgPiY1CisrJGFzX2VjaG8gIiRhY19jdl90eXBlX2ludDMyX3QiID4mNjsgfQorK2lmIHRlc3QgIngkYWNfY3ZfdHlwZV9pbnQzMl90IiA9IHgiInllczsgdGhlbgorKyAgOgorK2Vsc2UKKysKKytjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisgI2RlZmluZSBpbnQzMl90IHNpZ25lZCBsb25nCistRU9GCisrX0FDRU9GCisgCisgZmkKKyAKKy1lY2hvICRhY19uICJjaGVja2luZyBmb3IgdWludDMyX3QiIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZTozNTI5OiBjaGVja2luZyBmb3IgdWludDMyX3QiID4mNQorLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3VpbnQzMl90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKy0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CistZWxzZQorLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorLSNsaW5lIDM1MzQgImNvbmZpZ3VyZSIKKy0jaW5jbHVkZSAiY29uZmRlZnMuaCIKKy0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+CistI2lmIFNURENfSEVBREVSUworLSNpbmNsdWRlIDxzdGRsaWIuaD4KKy0jaW5jbHVkZSA8c3RkZGVmLmg+CistI2VuZGlmCistRU9GCistaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorLSAgZWdyZXAgIihefFteYS16QS1aXzAtOV0pdWludDMyX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKy0gIHJtIC1yZiBjb25mdGVzdCoKKy0gIGFjX2N2X3R5cGVfdWludDMyX3Q9eWVzCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciB1aW50MzJfdCIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHVpbnQzMl90Li4uICIgPiY2OyB9CisraWYgdGVzdCAiJHthY19jdl90eXBlX3VpbnQzMl90K3NldH0iID0gc2V0OyB0aGVuCisrICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorIGVsc2UKKy0gIHJtIC1yZiBjb25mdGVzdCoKKyAgIGFjX2N2X3R5cGVfdWludDMyX3Q9bm8KKytjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBjb25mZGVmcy5oLiAgKi8KKytfQUNFT0YKKytjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKytjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogZW5kIGNvbmZkZWZzLmguICAqLworKyRhY19pbmNsdWRlc19kZWZhdWx0CisraW50CisrbWFpbiAoKQorK3sKKytpZiAoc2l6ZW9mICh1aW50MzJfdCkpCisrICAgICAgIHJldHVybiAwOworKyAgOworKyAgcmV0dXJuIDA7CisrfQorK19BQ0VPRgorK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKKytpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorK2Nhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorKyAgYWNfc3RhdHVzPSQ/CisrICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorKyAgcm0gLWYgY29uZnRlc3QuZXIxCisrICBjYXQgY29uZnRlc3QuZXJyID4mNQorKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKysJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyskYWNfaW5jbHVkZXNfZGVmYXVsdAorK2ludAorK21haW4gKCkKKyt7CisraWYgKHNpemVvZiAoKHVpbnQzMl90KSkpCisrCSAgcmV0dXJuIDA7CisrICA7CisrICByZXR1cm4gMDsKKyt9CisrX0FDRU9GCisrcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisrCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisrICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisrICA6CisrZWxzZQorKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cisrc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorKworKwlhY19jdl90eXBlX3VpbnQzMl90PXllcworIGZpCistcm0gLWYgY29uZnRlc3QqCisrCisrcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisrZWxzZQorKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cisrc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorKworIAorIGZpCistZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX3VpbnQzMl90IiAxPiY2CistaWYgdGVzdCAkYWNfY3ZfdHlwZV91aW50MzJfdCA9IG5vOyB0aGVuCistICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKysKKytybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKytmaQorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX3VpbnQzMl90IiA+JjUKKyskYXNfZWNobyAiJGFjX2N2X3R5cGVfdWludDMyX3QiID4mNjsgfQorK2lmIHRlc3QgIngkYWNfY3ZfdHlwZV91aW50MzJfdCIgPSB4IiJ5ZXM7IHRoZW4KKysgIDoKKytlbHNlCisrCisrY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorICNkZWZpbmUgdWludDMyX3QgdW5zaWduZWQgbG9uZworLUVPRgorK19BQ0VPRgorIAorIGZpCisgCistZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGludDY0X3QiIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZTozNTYyOiBjaGVja2luZyBmb3IgaW50NjRfdCIgPiY1CistaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfaW50NjRfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCistICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorLWVsc2UKKy0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKy0jbGluZSAzNTY3ICJjb25maWd1cmUiCistI2luY2x1ZGUgImNvbmZkZWZzLmgiCistI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorLSNpZiBTVERDX0hFQURFUlMKKy0jaW5jbHVkZSA8c3RkbGliLmg+CistI2luY2x1ZGUgPHN0ZGRlZi5oPgorLSNlbmRpZgorLUVPRgorLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKy0gIGVncmVwICIoXnxbXmEtekEtWl8wLTldKWludDY0X3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKy0gIHJtIC1yZiBjb25mdGVzdCoKKy0gIGFjX2N2X3R5cGVfaW50NjRfdD15ZXMKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGludDY0X3QiID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBpbnQ2NF90Li4uICIgPiY2OyB9CisraWYgdGVzdCAiJHthY19jdl90eXBlX2ludDY0X3Qrc2V0fSIgPSBzZXQ7IHRoZW4KKysgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisgZWxzZQorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorICAgYWNfY3ZfdHlwZV9pbnQ2NF90PW5vCisrY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyskYWNfaW5jbHVkZXNfZGVmYXVsdAorK2ludAorK21haW4gKCkKKyt7CisraWYgKHNpemVvZiAoaW50NjRfdCkpCisrICAgICAgIHJldHVybiAwOworKyAgOworKyAgcmV0dXJuIDA7CisrfQorK19BQ0VPRgorK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKKytpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorK2Nhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorKyAgYWNfc3RhdHVzPSQ/CisrICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorKyAgcm0gLWYgY29uZnRlc3QuZXIxCisrICBjYXQgY29uZnRlc3QuZXJyID4mNQorKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKysJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorKyAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyskYWNfaW5jbHVkZXNfZGVmYXVsdAorK2ludAorK21haW4gKCkKKyt7CisraWYgKHNpemVvZiAoKGludDY0X3QpKSkKKysJICByZXR1cm4gMDsKKysgIDsKKysgIHJldHVybiAwOworK30KKytfQUNFT0YKKytybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CisraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKKytjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKysgIGFjX3N0YXR1cz0kPworKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKysgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisrCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKysJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKysgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKysgIDoKKytlbHNlCisrICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrCWFjX2N2X3R5cGVfaW50NjRfdD15ZXMKKyBmaQorLXJtIC1mIGNvbmZ0ZXN0KgorIAorLWZpCistZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX2ludDY0X3QiIDE+JjYKKy1pZiB0ZXN0ICRhY19jdl90eXBlX2ludDY0X3QgPSBubzsgdGhlbgorLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisrcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisrZWxzZQorKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cisrc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorKworKworK2ZpCisrCisrcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisrZmkKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdHlwZV9pbnQ2NF90IiA+JjUKKyskYXNfZWNobyAiJGFjX2N2X3R5cGVfaW50NjRfdCIgPiY2OyB9CisraWYgdGVzdCAieCRhY19jdl90eXBlX2ludDY0X3QiID0geCIieWVzOyB0aGVuCisrICA6CisrZWxzZQorKworK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyAjZGVmaW5lIGludDY0X3Qgc2lnbmVkIGxvbmcgbG9uZworLUVPRgorK19BQ0VPRgorIAorIGZpCisgCistZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHVpbnQ2NF90IiIuLi4gJGFjX2MiIDE+JjYKKy1lY2hvICJjb25maWd1cmU6MzU5NTogY2hlY2tpbmcgZm9yIHVpbnQ2NF90IiA+JjUKKy1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV91aW50NjRfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCistICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorLWVsc2UKKy0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKy0jbGluZSAzNjAwICJjb25maWd1cmUiCistI2luY2x1ZGUgImNvbmZkZWZzLmgiCistI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorLSNpZiBTVERDX0hFQURFUlMKKy0jaW5jbHVkZSA8c3RkbGliLmg+CistI2luY2x1ZGUgPHN0ZGRlZi5oPgorLSNlbmRpZgorLUVPRgorLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKy0gIGVncmVwICIoXnxbXmEtekEtWl8wLTldKXVpbnQ2NF90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCistICBybSAtcmYgY29uZnRlc3QqCistICBhY19jdl90eXBlX3VpbnQ2NF90PXllcworK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgdWludDY0X3QiID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nIGZvciB1aW50NjRfdC4uLiAiID4mNjsgfQorK2lmIHRlc3QgIiR7YWNfY3ZfdHlwZV91aW50NjRfdCtzZXR9IiA9IHNldDsgdGhlbgorKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKyBlbHNlCistICBybSAtcmYgY29uZnRlc3QqCisgICBhY19jdl90eXBlX3VpbnQ2NF90PW5vCisrY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisrLyogY29uZmRlZnMuaC4gICovCisrX0FDRU9GCisrY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CisrY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyskYWNfaW5jbHVkZXNfZGVmYXVsdAorK2ludAorK21haW4gKCkKKyt7CisraWYgKHNpemVvZiAodWludDY0X3QpKQorKyAgICAgICByZXR1cm4gMDsKKysgIDsKKysgIHJldHVybiAwOworK30KKytfQUNFT0YKKytybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CisraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKKytjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKysgIGFjX3N0YXR1cz0kPworKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKysgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisrCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKysJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKysgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKysgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGNvbmZkZWZzLmguICAqLworK19BQ0VPRgorK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBlbmQgY29uZmRlZnMuaC4gICovCisrJGFjX2luY2x1ZGVzX2RlZmF1bHQKKytpbnQKKyttYWluICgpCisreworK2lmIChzaXplb2YgKCh1aW50NjRfdCkpKQorKwkgIHJldHVybiAwOworKyAgOworKyAgcmV0dXJuIDA7CisrfQorK19BQ0VPRgorK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKKytpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorK2Nhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorKyAgYWNfc3RhdHVzPSQ/CisrICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorKyAgcm0gLWYgY29uZnRlc3QuZXIxCisrICBjYXQgY29uZnRlc3QuZXJyID4mNQorKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKysJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorKyAgOgorK2Vsc2UKKysgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKysKKysJYWNfY3ZfdHlwZV91aW50NjRfdD15ZXMKKyBmaQorLXJtIC1mIGNvbmZ0ZXN0KgorKworK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorK2Vsc2UKKysgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKysKKyAKKyBmaQorLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV91aW50NjRfdCIgMT4mNgorLWlmIHRlc3QgJGFjX2N2X3R5cGVfdWludDY0X3QgPSBubzsgdGhlbgorLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisrCisrcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisrZmkKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdHlwZV91aW50NjRfdCIgPiY1CisrJGFzX2VjaG8gIiRhY19jdl90eXBlX3VpbnQ2NF90IiA+JjY7IH0KKytpZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfdWludDY0X3QiID0geCIieWVzOyB0aGVuCisrICA6CisrZWxzZQorKworK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyAjZGVmaW5lIHVpbnQ2NF90IHVuc2lnbmVkIGxvbmcgbG9uZworLUVPRgorK19BQ0VPRgorIAorIGZpCisgCitAQCAtMzY4MCwxMTEgKzg1NTgsMjMyIEBACisgZmkKKyAKKyAKKy1hY19zYWZlPWBlY2hvICJ3Y2hhci5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKKy1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd2NoYXIuaCIiLi4uICRhY19jIiAxPiY2CistZWNobyAiY29uZmlndXJlOjM2ODY6IGNoZWNraW5nIGZvciB3Y2hhci5oIiA+JjUKKy1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKy0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CistZWxzZQorLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorLSNsaW5lIDM2OTEgImNvbmZpZ3VyZSIKKy0jaW5jbHVkZSAiY29uZmRlZnMuaCIKKytpZiB0ZXN0ICIke2FjX2N2X2hlYWRlcl93Y2hhcl9oK3NldH0iID0gc2V0OyB0aGVuCisrICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHdjaGFyLmgiID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nIGZvciB3Y2hhci5oLi4uICIgPiY2OyB9CisraWYgdGVzdCAiJHthY19jdl9oZWFkZXJfd2NoYXJfaCtzZXR9IiA9IHNldDsgdGhlbgorKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKytmaQorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9oZWFkZXJfd2NoYXJfaCIgPiY1CisrJGFzX2VjaG8gIiRhY19jdl9oZWFkZXJfd2NoYXJfaCIgPiY2OyB9CisrZWxzZQorKyAgIyBJcyB0aGUgaGVhZGVyIGNvbXBpbGFibGU/CisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdjaGFyLmggdXNhYmlsaXR5IiA+JjUKKyskYXNfZWNob19uICJjaGVja2luZyB3Y2hhci5oIHVzYWJpbGl0eS4uLiAiID4mNjsgfQorK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGNvbmZkZWZzLmguICAqLworK19BQ0VPRgorK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBlbmQgY29uZmRlZnMuaC4gICovCisrJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyAjaW5jbHVkZSA8d2NoYXIuaD4KKy1FT0YKKy1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgorLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzY5NjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KKy1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCistaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKy0gIHJtIC1yZiBjb25mdGVzdCoKKy0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCistZWxzZQorLSAgZWNobyAiJGFjX2VyciIgPiY1CistICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CistICBybSAtcmYgY29uZnRlc3QqCistICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCistZmkKKy1ybSAtZiBjb25mdGVzdCoKKy1maQorLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCistICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CistICA6CisrX0FDRU9GCisrcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorK2lmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCisrICBhY19zdGF0dXM9JD8KKysgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisrICBybSAtZiBjb25mdGVzdC5lcjEKKysgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisrICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisrCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCisrICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisrICBhY19oZWFkZXJfY29tcGlsZXI9eWVzCisrZWxzZQorKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cisrc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorKworKwlhY19oZWFkZXJfY29tcGlsZXI9bm8KKytmaQorKworK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfY29tcGlsZXIiID4mNQorKyRhc19lY2hvICIkYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjY7IH0KKysKKysjIElzIHRoZSBoZWFkZXIgcHJlc2VudD8KKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2NoYXIuaCBwcmVzZW5jZSIgPiY1CisrJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2NoYXIuaCBwcmVzZW5jZS4uLiAiID4mNjsgfQorK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGNvbmZkZWZzLmguICAqLworK19BQ0VPRgorK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBlbmQgY29uZmRlZnMuaC4gICovCisrI2luY2x1ZGUgPHdjaGFyLmg+CisrX0FDRU9GCisraWYgeyAoYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiCisrY2FzZSAiKCgkYWNfdHJ5IiBpbgorKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisrICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKytlc2FjCisrZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKysgIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPmNvbmZ0ZXN0LmVyMQorKyAgYWNfc3RhdHVzPSQ/CisrICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorKyAgcm0gLWYgY29uZnRlc3QuZXIxCisrICBjYXQgY29uZnRlc3QuZXJyID4mNQorKyAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKysgIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGwgJiYgeworKwkgdGVzdCAteiAiJGFjX2NfcHJlcHJvY193YXJuX2ZsYWckYWNfY193ZXJyb3JfZmxhZyIgfHwKKysJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKysgICAgICAgfTsgdGhlbgorKyAgYWNfaGVhZGVyX3ByZXByb2M9eWVzCisrZWxzZQorKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cisrc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorKworKyAgYWNfaGVhZGVyX3ByZXByb2M9bm8KKytmaQorKworK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9wcmVwcm9jIiA+JjUKKyskYXNfZWNobyAiJGFjX2hlYWRlcl9wcmVwcm9jIiA+JjY7IH0KKysKKysjIFNvPyAgV2hhdCBhYm91dCB0aGlzIGhlYWRlcj8KKytjYXNlICRhY19oZWFkZXJfY29tcGlsZXI6JGFjX2hlYWRlcl9wcmVwcm9jOiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluCisrICB5ZXM6bm86ICkKKysgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IHdjaGFyLmg6IGFjY2VwdGVkIGJ5IHRoZSBjb21waWxlciwgcmVqZWN0ZWQgYnkgdGhlIHByZXByb2Nlc3NvciEiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHdjaGFyLmg6IGFjY2VwdGVkIGJ5IHRoZSBjb21waWxlciwgcmVqZWN0ZWQgYnkgdGhlIHByZXByb2Nlc3NvciEiID4mMjt9CisrICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiB3Y2hhci5oOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB3Y2hhci5oOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjI7fQorKyAgICBhY19oZWFkZXJfcHJlcHJvYz15ZXMKKysgICAgOzsKKysgIG5vOnllczoqICkKKysgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IHdjaGFyLmg6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogd2NoYXIuaDogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjI7fQorKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogd2NoYXIuaDogICAgIGNoZWNrIGZvciBtaXNzaW5nIHByZXJlcXVpc2l0ZSBoZWFkZXJzPyIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogd2NoYXIuaDogICAgIGNoZWNrIGZvciBtaXNzaW5nIHByZXJlcXVpc2l0ZSBoZWFkZXJzPyIgPiYyO30KKysgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IHdjaGFyLmg6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogd2NoYXIuaDogc2VlIHRoZSBBdXRvY29uZiBkb2N1bWVudGF0aW9uIiA+JjI7fQorKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogd2NoYXIuaDogICAgIHNlY3Rpb24gXCJQcmVzZW50IEJ1dCBDYW5ub3QgQmUgQ29tcGlsZWRcIiIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogd2NoYXIuaDogICAgIHNlY3Rpb24gXCJQcmVzZW50IEJ1dCBDYW5ub3QgQmUgQ29tcGlsZWRcIiIgPiYyO30KKysgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IHdjaGFyLmg6IHByb2NlZWRpbmcgd2l0aCB0aGUgcHJlcHJvY2Vzc29yJ3MgcmVzdWx0IiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB3Y2hhci5oOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiYyO30KKysgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IHdjaGFyLmg6IGluIHRoZSBmdXR1cmUsIHRoZSBjb21waWxlciB3aWxsIHRha2UgcHJlY2VkZW5jZSIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogd2NoYXIuaDogaW4gdGhlIGZ1dHVyZSwgdGhlIGNvbXBpbGVyIHdpbGwgdGFrZSBwcmVjZWRlbmNlIiA+JjI7fQorKworKyAgICA7OworK2VzYWMKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHdjaGFyLmgiID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nIGZvciB3Y2hhci5oLi4uICIgPiY2OyB9CisraWYgdGVzdCAiJHthY19jdl9oZWFkZXJfd2NoYXJfaCtzZXR9IiA9IHNldDsgdGhlbgorKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKyBlbHNlCistICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKysgIGFjX2N2X2hlYWRlcl93Y2hhcl9oPSRhY19oZWFkZXJfcHJlcHJvYworIGZpCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2hlYWRlcl93Y2hhcl9oIiA+JjUKKyskYXNfZWNobyAiJGFjX2N2X2hlYWRlcl93Y2hhcl9oIiA+JjY7IH0KKysKKytmaQorKworIAorIGlmIHRlc3QgIiRhY19jdl9oZWFkZXJfd2NoYXJfaCIgPSBubworIHRoZW4KKyAgICAgVV9IQVZFX1dDSEFSX0g9MAorICAgICBVX0hBVkVfV0NTQ1BZPTAKKyBlbHNlCistICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorKyAgICBjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorICNkZWZpbmUgSEFWRV9XQ0hBUl9IIDEKKy1FT0YKKytfQUNFT0YKKyAKKyAgICAgVV9IQVZFX1dDSEFSX0g9MQorLSAgICAgICAgCistZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyB3Y3NjcHkiIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZTozNzI5OiBjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIHdjc2NweSIgPiY1CistaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3NlYXJjaF93Y3NjcHknK3NldH0nYFwiID0gc2V0IjsgdGhlbgorLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKy1lbHNlCistICBhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlM9IiRMSUJTIgorLWFjX2N2X3NlYXJjaF93Y3NjcHk9Im5vIgorLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKy0jbGluZSAzNzM2ICJjb25maWd1cmUiCistI2luY2x1ZGUgImNvbmZkZWZzLmgiCistLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCistICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCistY2hhciB3Y3NjcHkoKTsKKy0KKy1pbnQgbWFpbigpIHsKKy13Y3NjcHkoKQorLTsgcmV0dXJuIDA7IH0KKy1FT0YKKy1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM3NDc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorLSAgYWNfY3Zfc2VhcmNoX3djc2NweT0ibm9uZSByZXF1aXJlZCIKKy1lbHNlCistICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyB3Y3NjcHkiID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgd2NzY3B5Li4uICIgPiY2OyB9CisraWYgdGVzdCAiJHthY19jdl9zZWFyY2hfd2NzY3B5K3NldH0iID0gc2V0OyB0aGVuCisrICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorK2Vsc2UKKysgIGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUz0kTElCUworK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGNvbmZkZWZzLmguICAqLworK19BQ0VPRgorK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBlbmQgY29uZmRlZnMuaC4gICovCisrCisrLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisrICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisrICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKysjaWZkZWYgX19jcGx1c3BsdXMKKytleHRlcm4gIkMiCisrI2VuZGlmCisrY2hhciB3Y3NjcHkgKCk7CisraW50CisrbWFpbiAoKQorK3sKKytyZXR1cm4gd2NzY3B5ICgpOworKyAgOworKyAgcmV0dXJuIDA7CisrfQorK19BQ0VPRgorK2ZvciBhY19saWIgaW4gJycgd2NzIHc7IGRvCisrICBpZiB0ZXN0IC16ICIkYWNfbGliIjsgdGhlbgorKyAgICBhY19yZXM9Im5vbmUgcmVxdWlyZWQiCisrICBlbHNlCisrICAgIGFjX3Jlcz0tbCRhY19saWIKKysgICAgTElCUz0iLWwkYWNfbGliICAkYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTIgorKyAgZmkKKysgIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CisraWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKKytjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKysgIGFjX3N0YXR1cz0kPworKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKysgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorKyAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7CisrCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKysJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKysgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJiB7CisrCSB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllcyB8fAorKwkgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQKKysgICAgICAgfTsgdGhlbgorKyAgYWNfY3Zfc2VhcmNoX3djc2NweT0kYWNfcmVzCisrZWxzZQorKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cisrc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorKworKworIGZpCistcm0gLWYgY29uZnRlc3QqCistdGVzdCAiJGFjX2N2X3NlYXJjaF93Y3NjcHkiID0gIm5vIiAmJiBmb3IgaSBpbiB3Y3MgdzsgZG8KKy1MSUJTPSItbCRpICAkYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTIgorLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKy0jbGluZSAzNzU4ICJjb25maWd1cmUiCistI2luY2x1ZGUgImNvbmZkZWZzLmgiCistLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKy0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCistICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCistY2hhciB3Y3NjcHkoKTsKKy0KKy1pbnQgbWFpbigpIHsKKy13Y3NjcHkoKQorLTsgcmV0dXJuIDA7IH0KKy1FT0YKKy1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM3Njk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorLSAgcm0gLXJmIGNvbmZ0ZXN0KgorLSAgYWNfY3Zfc2VhcmNoX3djc2NweT0iLWwkaSIKKy1icmVhaworLWVsc2UKKy0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CistICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKysKKytybSAtcmYgY29uZnRlc3QuZFNZTQorK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCisrICAgICAgY29uZnRlc3QkYWNfZXhlZXh0CisrICBpZiB0ZXN0ICIke2FjX2N2X3NlYXJjaF93Y3NjcHkrc2V0fSIgPSBzZXQ7IHRoZW4KKysgIGJyZWFrCisgZmkKKy1ybSAtZiBjb25mdGVzdCoKKyBkb25lCistTElCUz0iJGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUyIKKytpZiB0ZXN0ICIke2FjX2N2X3NlYXJjaF93Y3NjcHkrc2V0fSIgPSBzZXQ7IHRoZW4KKysgIDoKKytlbHNlCisrICBhY19jdl9zZWFyY2hfd2NzY3B5PW5vCisgZmkKKytybSBjb25mdGVzdC4kYWNfZXh0CisrTElCUz0kYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTCisrZmkKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfc2VhcmNoX3djc2NweSIgPiY1CisrJGFzX2VjaG8gIiRhY19jdl9zZWFyY2hfd2NzY3B5IiA+JjY7IH0KKythY19yZXM9JGFjX2N2X3NlYXJjaF93Y3NjcHkKKytpZiB0ZXN0ICIkYWNfcmVzIiAhPSBubzsgdGhlbgorKyAgdGVzdCAiJGFjX3JlcyIgPSAibm9uZSByZXF1aXJlZCIgfHwgTElCUz0iJGFjX3JlcyAkTElCUyIKKyAKKy1lY2hvICIkYWNfdCIiJGFjX2N2X3NlYXJjaF93Y3NjcHkiIDE+JjYKKy1pZiB0ZXN0ICIkYWNfY3Zfc2VhcmNoX3djc2NweSIgIT0gIm5vIjsgdGhlbgorLSAgdGVzdCAiJGFjX2N2X3NlYXJjaF93Y3NjcHkiID0gIm5vbmUgcmVxdWlyZWQiIHx8IExJQlM9IiRhY19jdl9zZWFyY2hfd2NzY3B5ICRMSUJTIgorLSAgCistZWxzZSA6CistICAKKyBmaQorKworICAgICBpZiB0ZXN0ICIkYWNfY3Zfc2VhcmNoX3djc2NweSIgIT0gbm87IHRoZW4KKyAgICAgICBVX0hBVkVfV0NTQ1BZPTEKKyAgICAgZWxzZQorQEAgLTM3OTUsMTcgKzg3OTQsMjAgQEAKKyAKKyAKKyBhY19kZWZhdWx0X3NpemVvZl93Y2hhcl90PTQKKy1lY2hvICRhY19uICJjaGVja2luZyBzaXplIG9mIHdjaGFyX3QiIi4uLiAkYWNfYyIgMT4mNgorLWVjaG8gImNvbmZpZ3VyZTozODAwOiBjaGVja2luZyBzaXplIG9mIHdjaGFyX3QiID4mNQorLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9zaXplb2Zfd2NoYXJfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCistICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBzaXplIG9mIHdjaGFyX3QiID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nIHNpemUgb2Ygd2NoYXJfdC4uLiAiID4mNjsgfQorK2lmIHRlc3QgIiR7YWNfY3Zfc2l6ZW9mX3djaGFyX3Qrc2V0fSIgPSBzZXQ7IHRoZW4KKysgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisgZWxzZQorICAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKyAgIGFjX2N2X3NpemVvZl93Y2hhcl90PSRhY19kZWZhdWx0X3NpemVvZl93Y2hhcl90CisgZWxzZQorLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorLSNsaW5lIDM4MDggImNvbmZpZ3VyZSIKKy0jaW5jbHVkZSAiY29uZmRlZnMuaCIKKysgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorKy8qIGNvbmZkZWZzLmguICAqLworK19BQ0VPRgorK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKysvKiBlbmQgY29uZmRlZnMuaC4gICovCisgI2lmIFNURENfSEVBREVSUworICNpbmNsdWRlIDxzdGRkZWYuaD4KKyAjZW5kaWYKK0BAIC0zODIxLDMwICs4ODIzLDU3IEBACisgICBmcHJpbnRmKGYsICIlZFxuIiwgc2l6ZW9mKHdjaGFyX3QpKTsKKyAgIGV4aXQoMCk7CisgfQorLUVPRgorLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzgyNjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAorLXRoZW4KKytfQUNFT0YKKytybSAtZiBjb25mdGVzdCRhY19leGVleHQKKytpZiB7IChhY190cnk9IiRhY19saW5rIgorK2Nhc2UgIigoJGFjX3RyeSIgaW4KKysgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7CisrZXNhYworK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKyskYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1CisrICAoZXZhbCAiJGFjX2xpbmsiKSAyPiY1CisrICBhY19zdGF0dXM9JD8KKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCisrICB7IChjYXNlICIoKCRhY190cnkiIGluCisrICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKysgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworK2VzYWMKKytldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCisrJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorKyAgKGV2YWwgIiRhY190cnkiKSAyPiY1CisrICBhY19zdGF0dXM9JD8KKysgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisrICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorICAgYWNfY3Zfc2l6ZW9mX3djaGFyX3Q9YGNhdCBjb25mdGVzdHZhbGAKKyBlbHNlCistICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CistICBybSAtZnIgY29uZnRlc3QqCistICBhY19jdl9zaXplb2Zfd2NoYXJfdD0wCisrICAkYXNfZWNobyAiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKytzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisrCisrKCBleGl0ICRhY19zdGF0dXMgKQorK2FjX2N2X3NpemVvZl93Y2hhcl90PTAKKyBmaQorLXJtIC1mciBjb25mdGVzdCoKKytybSAtcmYgY29uZnRlc3QuZFNZTQorK3JtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorIGZpCisgCisrCisgZmkKKy1lY2hvICIkYWNfdCIiJGFjX2N2X3NpemVvZl93Y2hhcl90IiAxPiY2CistY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKyt7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfc2l6ZW9mX3djaGFyX3QiID4mNQorKyRhc19lY2hvICIkYWNfY3Zfc2l6ZW9mX3djaGFyX3QiID4mNjsgfQorK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyAjZGVmaW5lIFNJWkVPRl9XQ0hBUl9UICRhY19jdl9zaXplb2Zfd2NoYXJfdAorLUVPRgorK19BQ0VPRgorIAorIAorIFVfU0laRU9GX1dDSEFSX1Q9JGFjX2N2X3NpemVvZl93Y2hhcl90CisgaWYgdGVzdCAkVV9TSVpFT0ZfV0NIQVJfVCA9IDA7IHRoZW4KKyAJaWYgdGVzdCAkVV9IQVZFX1dDSEFSX0g9MTsgdGhlbgorLQkgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IFRoZXJlIGlzIHdjaGFyLmggYnV0IHRoZSBzaXplIG9mIHdjaGFyX3QgaXMgMCIgMT4mMjsgZXhpdCAxOyB9CisrCSAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBUaGVyZSBpcyB3Y2hhci5oIGJ1dCB0aGUgc2l6ZSBvZiB3Y2hhcl90IGlzIDAiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBUaGVyZSBpcyB3Y2hhci5oIGJ1dCB0aGUgc2l6ZSBvZiB3Y2hhcl90IGlzIDAiID4mMjt9CisrICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgCWZpCisgZmkKKyAKK0BAIC0zODU1LDEzICs4ODg0LDE0IEBACisgI0FDX1NVQlNUKEVDSE9fTikKKyAjQUNfU1VCU1QoRUNIT19DKQorIAorLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1leHRyYXMgb3IgLS1kaXNhYmxlLWV4dHJhcyB3YXMgZ2l2ZW4uCisrIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWV4dHJhcyB3YXMgZ2l2ZW4uCisgaWYgdGVzdCAiJHtlbmFibGVfZXh0cmFzK3NldH0iID0gc2V0OyB0aGVuCistICBlbmFibGV2YWw9IiRlbmFibGVfZXh0cmFzIgorLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorKyAgZW5hYmxldmFsPSRlbmFibGVfZXh0cmFzOyBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgCQl5ZXMpIGV4dHJhcz10cnVlIDs7CisgCQlubykgIGV4dHJhcz1mYWxzZSA7OworLQkJKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGZvciAtLWVuYWJsZS1leHRyYXMiIDE+JjI7IGV4aXQgMTsgfSA7OworKwkJKikgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGJhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIC0tZW5hYmxlLWV4dHJhcyIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGJhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIC0tZW5hYmxlLWV4dHJhcyIgPiYyO30KKysgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0gOzsKKyAJCWVzYWMKKyBlbHNlCisgICBleHRyYXM9dHJ1ZQorQEAgLTM4NzMsMTMgKzg5MDMsMTQgQEAKKyBlbHNlCisgICBFWFRSQVNfVFJVRT0nIycKKyBmaQorLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1leHRyYXMgb3IgLS1kaXNhYmxlLWV4dHJhcyB3YXMgZ2l2ZW4uCisrIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWV4dHJhcyB3YXMgZ2l2ZW4uCisgaWYgdGVzdCAiJHtlbmFibGVfZXh0cmFzK3NldH0iID0gc2V0OyB0aGVuCistICBlbmFibGV2YWw9IiRlbmFibGVfZXh0cmFzIgorLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorKyAgZW5hYmxldmFsPSRlbmFibGVfZXh0cmFzOyBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgCQl5ZXMpIGljdWlvPXRydWUgOzsKKyAJCW5vKSAgaWN1aW89ZmFsc2UgOzsKKy0JCSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgLS1lbmFibGUtaWN1aW8iIDE+JjI7IGV4aXQgMTsgfSA7OworKwkJKikgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGJhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIC0tZW5hYmxlLWljdWlvIiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgLS1lbmFibGUtaWN1aW8iID4mMjt9CisrICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9IDs7CisgCQllc2FjCisgZWxzZQorICAgaWN1aW89dHJ1ZQorQEAgLTM4OTIsMTMgKzg5MjMsMTQgQEAKKyAgIElDVUlPX1RSVUU9JyMnCisgZmkKKyAKKy0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbGF5b3V0IG9yIC0tZGlzYWJsZS1sYXlvdXQgd2FzIGdpdmVuLgorKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1sYXlvdXQgd2FzIGdpdmVuLgorIGlmIHRlc3QgIiR7ZW5hYmxlX2xheW91dCtzZXR9IiA9IHNldDsgdGhlbgorLSAgZW5hYmxldmFsPSIkZW5hYmxlX2xheW91dCIKKy0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKysgIGVuYWJsZXZhbD0kZW5hYmxlX2xheW91dDsgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorIAkJeWVzKSBsYXlvdXQ9dHJ1ZSA7OworIAkJbm8pICBsYXlvdXQ9ZmFsc2UgOzsKKy0JCSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgLS1lbmFibGUtbGF5b3V0IiAxPiYyOyBleGl0IDE7IH0gOzsKKysJCSopIHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGZvciAtLWVuYWJsZS1sYXlvdXQiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGZvciAtLWVuYWJsZS1sYXlvdXQiID4mMjt9CisrICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9IDs7CisgCQllc2FjCisgZWxzZQorICAgbGF5b3V0PXRydWUKK0BAIC0zOTExLDE2ICs4OTQzLDE4IEBACisgICBMQVlPVVRfVFJVRT0nIycKKyBmaQorIAorLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZGF0YS1wYWNrYWdpbmcgb3IgLS13aXRob3V0LWRhdGEtcGFja2FnaW5nIHdhcyBnaXZlbi4KKysKKysjIENoZWNrIHdoZXRoZXIgLS13aXRoLWRhdGEtcGFja2FnaW5nIHdhcyBnaXZlbi4KKyBpZiB0ZXN0ICIke3dpdGhfZGF0YV9wYWNrYWdpbmcrc2V0fSIgPSBzZXQ7IHRoZW4KKy0gIHdpdGh2YWw9IiR3aXRoX2RhdGFfcGFja2FnaW5nIgorLSAgY2FzZSAiJHt3aXRodmFsfSIgaW4KKysgIHdpdGh2YWw9JHdpdGhfZGF0YV9wYWNrYWdpbmc7IGNhc2UgIiR7d2l0aHZhbH0iIGluCisgICAgICAgICAgICAgICAgIGZpbGVzfGFyY2hpdmV8bGlicmFyeSkgZGF0YXBhY2thZ2luZz0kd2l0aHZhbCA7OworIAkJYXV0bykgZGF0YXBhY2thZ2luZz0kd2l0aHZhbCA7OworIAkJY29tbW9uKSBkYXRhcGFja2FnaW5nPWFyY2hpdmUgOzsKKyAJCWRsbCkgZGF0YXBhY2thZ2luZz1saWJyYXJ5IDs7CisgCQlzdGF0aWMpIGRhdGFwYWNrYWdpbmc9c3RhdGljIDs7CistCQkqKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGJhZCB2YWx1ZSAke3dpdGh2YWx9IGZvciAtLXdpdGgtZGF0YS1wYWNrYWdpbmciIDE+JjI7IGV4aXQgMTsgfSA7OworKwkJKikgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGJhZCB2YWx1ZSAke3dpdGh2YWx9IGZvciAtLXdpdGgtZGF0YS1wYWNrYWdpbmciID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBiYWQgdmFsdWUgJHt3aXRodmFsfSBmb3IgLS13aXRoLWRhdGEtcGFja2FnaW5nIiA+JjI7fQorKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfSA7OworIAkJZXNhYworIGVsc2UKKyAgIGRhdGFwYWNrYWdpbmc9CitAQCAtMzkzOSwxMyArODk3MywxNCBAQAorIAorIAorIAorLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1tYXBwZWQgb3IgLS1kaXNhYmxlLW1hcHBlZCB3YXMgZ2l2ZW4uCisrIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW1hcHBlZCB3YXMgZ2l2ZW4uCisgaWYgdGVzdCAiJHtlbmFibGVfbWFwcGVkK3NldH0iID0gc2V0OyB0aGVuCistICBlbmFibGV2YWw9IiRlbmFibGVfbWFwcGVkIgorLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorKyAgZW5hYmxldmFsPSRlbmFibGVfbWFwcGVkOyBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgICAgICAgICAgICAgICAgeWVzKSBtYXBwZWQ9YXJjaGl2ZSA7OworICAgICAgICAgICAgICAgIG5vKSAgbWFwcGVkPWxpYnJhcnkgOzsKKy0gICAgICAgICAgICAgICAqKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGJhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIC0tZW5hYmxlLW1hcHBlZDsgdXNlIC0td2l0aC1kYXRhLXBhY2thZ2luZyBub3ciIDE+JjI7IGV4aXQgMTsgfSA7OworKyAgICAgICAgICAgICAgICopIHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGZvciAtLWVuYWJsZS1tYXBwZWQ7IHVzZSAtLXdpdGgtZGF0YS1wYWNrYWdpbmcgbm93IiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgLS1lbmFibGUtbWFwcGVkOyB1c2UgLS13aXRoLWRhdGEtcGFja2FnaW5nIG5vdyIgPiYyO30KKysgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0gOzsKKyAJZXNhYworIGVsc2UKKyAgIG1hcHBlZD0KK0BAIC0zOTU1LDE0ICs4OTkwLDE4IEBACisgaWYgdGVzdCB4IiRtYXBwZWQiICE9IHg7IHRoZW4KKyAgICAgY2FzZSAkbWFwcGVkIGluCisgCWFyY2hpdmUpCistICAgIAkgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiB1c2UgLS13aXRoLWRhdGEtcGFja2FnaW5nPWFyY2hpdmUgaW5zdGVhZCBvZiAtLWVuYWJsZS1tYXBwZWQiIDE+JjIKKysgICAgCSAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogdXNlIC0td2l0aC1kYXRhLXBhY2thZ2luZz1hcmNoaXZlIGluc3RlYWQgb2YgLS1lbmFibGUtbWFwcGVkIiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2UgLS13aXRoLWRhdGEtcGFja2FnaW5nPWFyY2hpdmUgaW5zdGVhZCBvZiAtLWVuYWJsZS1tYXBwZWQiID4mMjt9CisgCSAgICA7OworIAlsaWJyYXJ5KQorLSAgICAJICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogdXNlIC0td2l0aC1kYXRhLXBhY2thZ2luZz1saWJyYXJ5IGluc3RlYWQgb2YgLS1kaXNhYmxlLW1hcHBlZCIgMT4mMgorKyAgICAJICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiB1c2UgLS13aXRoLWRhdGEtcGFja2FnaW5nPWxpYnJhcnkgaW5zdGVhZCBvZiAtLWRpc2FibGUtbWFwcGVkIiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2UgLS13aXRoLWRhdGEtcGFja2FnaW5nPWxpYnJhcnkgaW5zdGVhZCBvZiAtLWRpc2FibGUtbWFwcGVkIiA+JjI7fQorIAkgICAgOzsKKyAgICAgZXNhYworICAgICBpZiB0ZXN0IHgiJGRhdGFwYWNrYWdpbmciICE9IHggLWEgeCIkbWFwcGVkIiAhPSB4IiRkYXRhcGFja2FnaW5nIjsgdGhlbgorLQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNvbmZsaWN0aW5nIHZhbHVlcyB1c2VkIGZvciAtLXdpdGgtZGF0YS1wYWNrYWdpbmcgYW5kIGRlcHJlY2F0ZWQgLS1lbmFibGUtbWFwcGVkIiAxPiYyOyBleGl0IDE7IH0KKysJeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNvbmZsaWN0aW5nIHZhbHVlcyB1c2VkIGZvciAtLXdpdGgtZGF0YS1wYWNrYWdpbmcgYW5kIGRlcHJlY2F0ZWQgLS1lbmFibGUtbWFwcGVkIiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogY29uZmxpY3RpbmcgdmFsdWVzIHVzZWQgZm9yIC0td2l0aC1kYXRhLXBhY2thZ2luZyBhbmQgZGVwcmVjYXRlZCAtLWVuYWJsZS1tYXBwZWQiID4mMjt9CisrICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgICAgIGZpCisgICAgIGRhdGFwYWNrYWdpbmc9JG1hcHBlZAorIGZpCitAQCAtMzk4OCwxMiArOTAyNywxMiBAQAorIAorIAorIAorLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIGxpYnJhcnkgc3VmZml4IHRvIHVzZSIiLi4uICRhY19jIiAxPiY2CistZWNobyAiY29uZmlndXJlOjM5OTM6IGNoZWNraW5nIGZvciBhIGxpYnJhcnkgc3VmZml4IHRvIHVzZSIgPiY1CistIyBDaGVjayB3aGV0aGVyIC0td2l0aC1saWJyYXJ5LXN1ZmZpeCBvciAtLXdpdGhvdXQtbGlicmFyeS1zdWZmaXggd2FzIGdpdmVuLgorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgYSBsaWJyYXJ5IHN1ZmZpeCB0byB1c2UiID4mNQorKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBhIGxpYnJhcnkgc3VmZml4IHRvIHVzZS4uLiAiID4mNjsgfQorKworKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtbGlicmFyeS1zdWZmaXggd2FzIGdpdmVuLgorIGlmIHRlc3QgIiR7d2l0aF9saWJyYXJ5X3N1ZmZpeCtzZXR9IiA9IHNldDsgdGhlbgorLSAgd2l0aHZhbD0iJHdpdGhfbGlicmFyeV9zdWZmaXgiCistICBJQ1VMSUJTVUZGSVg9IiR7d2l0aHZhbH0iCisrICB3aXRodmFsPSR3aXRoX2xpYnJhcnlfc3VmZml4OyBJQ1VMSUJTVUZGSVg9IiR7d2l0aHZhbH0iCisgZWxzZQorICAgSUNVTElCU1VGRklYPQorIGZpCitAQCAtNDAwMiw3ICs5MDQxLDggQEAKKyBpZiB0ZXN0ICIkbXNnIiA9ICIiOyB0aGVuCisgICAgIG1zZz1ub25lCisgZmkKKy1lY2hvICIkYWNfdCIiJG1zZyIgMT4mNgorK3sgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRtc2ciID4mNQorKyRhc19lY2hvICIkbXNnIiA+JjY7IH0KKyAKKyBpZiB0ZXN0ICIkSUNVTElCU1VGRklYIiAhPSAiIgorIHRoZW4KK0BAIC00MDE0LDEzICs5MDU0LDE0IEBACisgCisgCisgCistIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXRlc3RzIG9yIC0tZGlzYWJsZS10ZXN0cyB3YXMgZ2l2ZW4uCisrIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXRlc3RzIHdhcyBnaXZlbi4KKyBpZiB0ZXN0ICIke2VuYWJsZV90ZXN0cytzZXR9IiA9IHNldDsgdGhlbgorLSAgZW5hYmxldmFsPSIkZW5hYmxlX3Rlc3RzIgorLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorKyAgZW5hYmxldmFsPSRlbmFibGVfdGVzdHM7IGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKyAJCXllcykgdGVzdHM9dHJ1ZSA7OworIAkJbm8pICB0ZXN0cz1mYWxzZSA7OworLQkJKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGZvciAtLWVuYWJsZS10ZXN0cyIgMT4mMjsgZXhpdCAxOyB9IDs7CisrCQkqKSB7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgLS1lbmFibGUtdGVzdHMiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGZvciAtLWVuYWJsZS10ZXN0cyIgPiYyO30KKysgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0gOzsKKyAJCWVzYWMKKyBlbHNlCisgICB0ZXN0cz10cnVlCitAQCAtNDAzMywxMyArOTA3NCwxNCBAQAorICAgVEVTVFNfVFJVRT0nIycKKyBmaQorIAorLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zYW1wbGVzIG9yIC0tZGlzYWJsZS1zYW1wbGVzIHdhcyBnaXZlbi4KKysjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2FtcGxlcyB3YXMgZ2l2ZW4uCisgaWYgdGVzdCAiJHtlbmFibGVfc2FtcGxlcytzZXR9IiA9IHNldDsgdGhlbgorLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NhbXBsZXMiCistICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisrICBlbmFibGV2YWw9JGVuYWJsZV9zYW1wbGVzOyBjYXNlICIke2VuYWJsZXZhbH0iIGluCisgCQl5ZXMpIHNhbXBsZXM9dHJ1ZSA7OworIAkJbm8pICBzYW1wbGVzPWZhbHNlIDs7CistCQkqKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGJhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIC0tZW5hYmxlLXNhbXBsZXMiIDE+JjI7IGV4aXQgMTsgfSA7OworKwkJKikgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGJhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIC0tZW5hYmxlLXNhbXBsZXMiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGZvciAtLWVuYWJsZS1zYW1wbGVzIiA+JjI7fQorKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfSA7OworIAkJZXNhYworIGVsc2UKKyAgIHNhbXBsZXM9dHJ1ZQorQEAgLTQwOTYsNyArOTEzOCw3IEBACisgCisgCisgY2FzZSAiJHtob3N0fSIgaW4KKy0JKi0qLWhwdXgqKSAJCisrCSotKi1ocHV4KikKKyAJCWlmIHRlc3QgIiR7aWN1X2N2X2hvc3RfZnJhZ30iID0gIm1oLWhwdXgtY2MiOyB0aGVuCisgCQkJZm9yIGZpbGUgaW4gc2FtcGxlcy9kYXRlL2RhdGUgXAorIAkJCSAgc2FtcGxlcy9jYWwvY2FsIHRlc3QvY2ludGx0c3QvY2ludGx0c3QgXAorQEAgLTQxNDEsNTE3ICs5MTgzLDEyOTkgQEAKKyAgICAgQ1hYRkxBR1M9IiRDWFhGTEFHUyBcJChUSFJFQURTQ1hYRkxBR1MpIgorIGZpCisgCistdHJhcCAnJyAxIDIgMTUKKy1jYXQgPiBjb25mY2FjaGUgPDxcRU9GCisrYWNfY29uZmlnX2ZpbGVzPSIkYWNfY29uZmlnX2ZpbGVzIGljdWRlZnMubWsgTWFrZWZpbGUgZGF0YS9NYWtlZmlsZSBkYXRhL2ljdXBrZy5pbmMgY29tbW9uL01ha2VmaWxlIGNvbmZpZy9NYWtlZmlsZS5pbmMgaTE4bi9NYWtlZmlsZSBsYXlvdXQvTWFrZWZpbGUgbGF5b3V0ZXgvTWFrZWZpbGUgaW8vTWFrZWZpbGUgZXh0cmEvTWFrZWZpbGUgZXh0cmEvdWNvbnYvTWFrZWZpbGUgZXh0cmEvc2NycHRydW4vTWFrZWZpbGUgc3R1YmRhdGEvTWFrZWZpbGUgdG9vbHMvTWFrZWZpbGUgdG9vbHMvY3Rlc3Rmdy9NYWtlZmlsZSB0b29scy9tYWtlY29udi9NYWtlZmlsZSB0b29scy9nZW5yYi9NYWtlZmlsZSB0b29scy9nZW51Y2EvTWFrZWZpbGUgdG9vbHMvZ2VuY2NvZGUvTWFrZWZpbGUgdG9vbHMvZ2VuY21uL01ha2VmaWxlIHRvb2xzL2dlbmNudmFsL01ha2VmaWxlIHRvb2xzL2dlbm5hbWVzL01ha2VmaWxlIHRvb2xzL2dlbnRlc3QvTWFrZWZpbGUgdG9vbHMvZ2Vubm9ybS9NYWtlZmlsZSB0b29scy9nZW5wcm9wcy9NYWtlZmlsZSB0b29scy9nZW5wbmFtZS9NYWtlZmlsZSB0b29scy9nZW5icmsvTWFrZWZpbGUgdG9vbHMvZ2Vuc3ByZXAvTWFrZWZpbGUgdG9vbHMvaWN1c3dhcC9NYWtlZmlsZSB0b29scy9wa2dkYXRhL01ha2VmaWxlIHRvb2xzL3Rvb2x1dGlsL01ha2VmaWxlIHRvb2xzL2R1bXBjZS9NYWtlZmlsZSB0ZXN0L01ha2VmaWxlIHRlc3QvdGVzdGRhdGEvTWFrZWZpbGUgdGVzdC9oZHJ0c3QvTWFrZWZpbGUgdGVzdC9pbnRsdGVzdC9NYWtlZmlsZSB0ZXN0L2NpbnRsdHN0L01ha2VmaWxlIHRlc3QvaW90ZXN0L01ha2VmaWxlIHRlc3QvdGhhaXRlc3QvTWFrZWZpbGUgdGVzdC90ZXN0bWFwL01ha2VmaWxlIHRlc3QvbGV0ZXN0L01ha2VmaWxlIHRlc3QvdGhyZWFkdGVzdC9NYWtlZmlsZSBzYW1wbGVzL01ha2VmaWxlIHNhbXBsZXMvZGF0ZS9NYWtlZmlsZSBzYW1wbGVzL2NhbC9NYWtlZmlsZSBzYW1wbGVzL2xheW91dC9NYWtlZmlsZSBjb21tb24vdW5pY29kZS9wbGF0Zm9ybS5oIgorKworK2NhdCA+Y29uZmNhY2hlIDw8XF9BQ0VPRgorICMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQorICMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQorLSMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCistIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCisrIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucywgc2VlIGNvbmZpZ3VyZSdzIG9wdGlvbiAtLWNvbmZpZy1jYWNoZS4KKysjIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4gIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0CisrIyB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCisgIworLSMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCistIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQorLSMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcworLSMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCistIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCistIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KKy0jIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKKy0jIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgorKyMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0CisrIyB0aGUgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCisgIworLUVPRgorKyMgYGFjX2N2X2Vudl9mb28nIHZhcmlhYmxlcyAoc2V0IG9yIHVuc2V0KSB3aWxsIGJlIG92ZXJyaWRkZW4gd2hlbgorKyMgbG9hZGluZyB0aGlzIGZpbGUsIG90aGVyICp1bnNldCogYGFjX2N2X2Zvbycgd2lsbCBiZSBhc3NpZ25lZCB0aGUKKysjIGZvbGxvd2luZyB2YWx1ZXMuCisrCisrX0FDRU9GCisrCisgIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKKyAjIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgorLSMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KKysjIFNvLCB3ZSBraWxsIHZhcmlhYmxlcyBjb250YWluaW5nIG5ld2xpbmVzLgorICMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAorICMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCistKHNldCkgMj4mMSB8CistICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQgfCBncmVwIGFjX3NwYWNlKSAyPiYxYCBpbgorLSAgKmFjX3NwYWNlPVwgKikKKy0gICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KKy0gICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KKy0gICAgc2VkIC1uIFwKKy0gICAgICAtZSAicy8nLydcXFxcJycvZyIgXAorLSAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKKy0gICAgOzsKKy0gICopCistICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCistICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKKy0gICAgOzsKKy0gIGVzYWMgPj4gY29uZmNhY2hlCistaWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgorLSAgOgorLWVsc2UKKy0gIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KKy0gICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCistICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQorKygKKysgIGZvciBhY192YXIgaW4gYChzZXQpIDI+JjEgfCBzZWQgLW4gJ3MvXlwoW2EtekEtWl9dW2EtekEtWjAtOV9dKlwpPS4qL1wxL3AnYDsgZG8KKysgICAgZXZhbCBhY192YWw9XCQkYWNfdmFyCisrICAgIGNhc2UgJGFjX3ZhbCBpbiAjKAorKyAgICAqJHthc19ubH0qKQorKyAgICAgIGNhc2UgJGFjX3ZhciBpbiAjKAorKyAgICAgICpfY3ZfKikgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IGNhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lIiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBjYWNoZSB2YXJpYWJsZSAkYWNfdmFyIGNvbnRhaW5zIGEgbmV3bGluZSIgPiYyO30gOzsKKysgICAgICBlc2FjCisrICAgICAgY2FzZSAkYWNfdmFyIGluICMoCisrICAgICAgXyB8IElGUyB8IGFzX25sKSA7OyAjKAorKyAgICAgIEJBU0hfQVJHViB8IEJBU0hfU09VUkNFKSBldmFsICRhY192YXI9IDs7ICMoCisrICAgICAgKikgJGFzX3Vuc2V0ICRhY192YXIgOzsKKysgICAgICBlc2FjIDs7CisrICAgIGVzYWMKKysgIGRvbmUKKysKKysgIChzZXQpIDI+JjEgfAorKyAgICBjYXNlICRhc19ubGAoYWNfc3BhY2U9JyAnOyBzZXQpIDI+JjFgIGluICMoCisrICAgICoke2FzX25sfWFjX3NwYWNlPVwgKikKKysgICAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlCisrICAgICAgIyBzdWJzdGl0dXRpb24gdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCisrICAgICAgc2VkIC1uIFwKKysJInMvJy8nXFxcXCcnL2c7CisrCSAgcy9eXFwoW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qXFwpPVxcKC4qXFwpL1xcMT0nXFwyJy9wIgorKyAgICAgIDs7ICMoCisrICAgICopCisrICAgICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KKysgICAgICBzZWQgLW4gIi9eW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qPS9wIgorKyAgICAgIDs7CisrICAgIGVzYWMgfAorKyAgICBzb3J0CisrKSB8CisrICBzZWQgJworKyAgICAgL15hY19jdl9lbnZfL2IgZW5kCisrICAgICB0IGNsZWFyCisrICAgICA6Y2xlYXIKKysgICAgIHMvXlwoW149XSpcKT1cKC4qW3t9XS4qXCkkL3Rlc3QgIiR7XDErc2V0fSIgPSBzZXQgfHwgJi8KKysgICAgIHQgZW5kCisrICAgICBzL15cKFtePV0qXCk9XCguKlwpJC9cMT0ke1wxPVwyfS8KKysgICAgIDplbmQnID4+Y29uZmNhY2hlCisraWYgZGlmZiAiJGNhY2hlX2ZpbGUiIGNvbmZjYWNoZSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOjsgZWxzZQorKyAgaWYgdGVzdCAtdyAiJGNhY2hlX2ZpbGUiOyB0aGVuCisrICAgIHRlc3QgIngkY2FjaGVfZmlsZSIgIT0gIngvZGV2L251bGwiICYmCisrICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiB1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KKysgICAgY2F0IGNvbmZjYWNoZSA+JGNhY2hlX2ZpbGUKKyAgIGVsc2UKKy0gICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCisrICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogbm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNjt9CisgICBmaQorIGZpCisgcm0gLWYgY29uZmNhY2hlCisgCistdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKKy0KKyB0ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4CisgIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCisgdGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JworIAorLSMgQW55IGFzc2lnbm1lbnQgdG8gVlBBVEggY2F1c2VzIFN1biBtYWtlIHRvIG9ubHkgZXhlY3V0ZQorLSMgdGhlIGZpcnN0IHNldCBvZiBkb3VibGUtY29sb24gcnVsZXMsIHNvIHJlbW92ZSBpdCBpZiBub3QgbmVlZGVkLgorLSMgSWYgdGhlcmUgaXMgYSBjb2xvbiBpbiB0aGUgcGF0aCwgd2UgbmVlZCB0byBrZWVwIGl0LgorLWlmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCistICBhY192cHN1Yj0nL15bIAldKlZQQVRIWyAJXSo9W146XSokL2QnCistZmkKKytERUZTPS1ESEFWRV9DT05GSUdfSAorIAorLXRyYXAgJ3JtIC1mICRDT05GSUdfU1RBVFVTIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKKythY19saWJvYmpzPQorK2FjX2x0bGlib2Jqcz0KKytmb3IgYWNfaSBpbiA6ICRMSUJPQkpTOyBkbyB0ZXN0ICJ4JGFjX2kiID0geDogJiYgY29udGludWUKKysgICMgMS4gUmVtb3ZlIHRoZSBleHRlbnNpb24sIGFuZCAkVSBpZiBhbHJlYWR5IGluc3RhbGxlZC4KKysgIGFjX3NjcmlwdD0ncy9cJFVcLi8uLztzL1wubyQvLztzL1wub2JqJC8vJworKyAgYWNfaT1gJGFzX2VjaG8gIiRhY19pIiB8IHNlZCAiJGFjX3NjcmlwdCJgCisrICAjIDIuIFByZXBlbmQgTElCT0JKRElSLiAgV2hlbiB1c2VkIHdpdGggYXV0b21ha2U+PTEuMTAgTElCT0JKRElSCisrICAjICAgIHdpbGwgYmUgc2V0IHRvIHRoZSBkaXJlY3Rvcnkgd2hlcmUgTElCT0JKUyBvYmplY3RzIGFyZSBidWlsdC4KKysgIGFjX2xpYm9ianM9IiRhY19saWJvYmpzIFwke0xJQk9CSkRJUn0kYWNfaVwkVS4kYWNfb2JqZXh0IgorKyAgYWNfbHRsaWJvYmpzPSIkYWNfbHRsaWJvYmpzIFwke0xJQk9CSkRJUn0kYWNfaSInJFUubG8nCisrZG9uZQorK0xJQk9CSlM9JGFjX2xpYm9ianMKKyAKKy1ERUZTPS1ESEFWRV9DT05GSUdfSAorK0xUTElCT0JKUz0kYWNfbHRsaWJvYmpzCisgCistIyBXaXRob3V0IHRoZSAiLi8iLCBzb21lIHNoZWxscyBsb29rIGluIFBBVEggZm9yIGNvbmZpZy5zdGF0dXMuCistOiAke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfQorIAorLWVjaG8gY3JlYXRpbmcgJENPTkZJR19TVEFUVVMKKy1ybSAtZiAkQ09ORklHX1NUQVRVUworLWNhdCA+ICRDT05GSUdfU1RBVFVTIDw8RU9GCistIyEgL2Jpbi9zaAorLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLgorKworKworKzogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KKythY193cml0ZV9mYWlsPTAKKythY19jbGVhbl9maWxlc19zYXZlPSRhY19jbGVhbl9maWxlcworK2FjX2NsZWFuX2ZpbGVzPSIkYWNfY2xlYW5fZmlsZXMgJENPTkZJR19TVEFUVVMiCisreyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNyZWF0aW5nICRDT05GSUdfU1RBVFVTIiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBjcmVhdGluZyAkQ09ORklHX1NUQVRVUyIgPiY2O30KKytjYXQgPiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorKyMhICRTSEVMTAorKyMgR2VuZXJhdGVkIGJ5ICRhc19tZS4KKyAjIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KKy0jIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3MsCistIyBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKKy0jCistIyAkMCAkYWNfY29uZmlndXJlX2FyZ3MKKy0jCisgIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZworLSMgY29uZmlndXJlLCBpcyBpbiAuL2NvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgorKyMgY29uZmlndXJlLCBpcyBpbiBjb25maWcubG9nIGlmIGl0IGV4aXN0cy4KKyAKKy1hY19jc191c2FnZT0iVXNhZ2U6ICRDT05GSUdfU1RBVFVTIFstLXJlY2hlY2tdIFstLXZlcnNpb25dIFstLWhlbHBdIgorLWZvciBhY19vcHRpb24KKytkZWJ1Zz1mYWxzZQorK2FjX2NzX3JlY2hlY2s9ZmFsc2UKKythY19jc19zaWxlbnQ9ZmFsc2UKKytTSEVMTD1cJHtDT05GSUdfU0hFTEwtJFNIRUxMfQorK19BQ0VPRgorKworK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKysjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKysjIyBNNHNoIEluaXRpYWxpemF0aW9uLiAgIyMKKysjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKysKKysjIEJlIG1vcmUgQm91cm5lIGNvbXBhdGlibGUKKytEVUFMQ0FTRT0xOyBleHBvcnQgRFVBTENBU0UgIyBmb3IgTUtTIHNoCisraWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisrICBlbXVsYXRlIHNoCisrICBOVUxMQ01EPToKKysgICMgUHJlLTQuMiB2ZXJzaW9ucyBvZiBac2ggZG8gd29yZCBzcGxpdHRpbmcgb24gJHsxKyIkQCJ9LCB3aGljaAorKyAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KKysgIGFsaWFzIC1nICckezErIiRAIn0nPSciJEAiJworKyAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKKytlbHNlCisrICBjYXNlIGAoc2V0IC1vKSAyPi9kZXYvbnVsbGAgaW4KKysgICpwb3NpeCopIHNldCAtbyBwb3NpeCA7OworK2VzYWMKKysKKytmaQorKworKworKworKworKyMgUEFUSCBuZWVkcyBDUgorKyMgQXZvaWQgZGVwZW5kaW5nIHVwb24gQ2hhcmFjdGVyIFJhbmdlcy4KKythc19jcl9sZXR0ZXJzPSdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicKKythc19jcl9MRVRURVJTPSdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicKKythc19jcl9MZXR0ZXJzPSRhc19jcl9sZXR0ZXJzJGFzX2NyX0xFVFRFUlMKKythc19jcl9kaWdpdHM9JzAxMjM0NTY3ODknCisrYXNfY3JfYWxudW09JGFzX2NyX0xldHRlcnMkYXNfY3JfZGlnaXRzCisrCisrYXNfbmw9JworKycKKytleHBvcnQgYXNfbmwKKysjIFByaW50aW5nIGEgbG9uZyBzdHJpbmcgY3Jhc2hlcyBTb2xhcmlzIDcgL3Vzci9iaW4vcHJpbnRmLgorK2FzX2VjaG89J1xcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFwnCisrYXNfZWNobz0kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvCisrYXNfZWNobz0kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8KKytpZiAodGVzdCAiWGBwcmludGYgJXMgJGFzX2VjaG9gIiA9ICJYJGFzX2VjaG8iKSAyPi9kZXYvbnVsbDsgdGhlbgorKyAgYXNfZWNobz0ncHJpbnRmICVzXG4nCisrICBhc19lY2hvX249J3ByaW50ZiAlcycKKytlbHNlCisrICBpZiB0ZXN0ICJYYCgvdXNyL3VjYi9lY2hvIC1uIC1uICRhc19lY2hvKSAyPi9kZXYvbnVsbGAiID0gIlgtbiAkYXNfZWNobyI7IHRoZW4KKysgICAgYXNfZWNob19ib2R5PSdldmFsIC91c3IvdWNiL2VjaG8gLW4gIiQxJGFzX25sIicKKysgICAgYXNfZWNob19uPScvdXNyL3VjYi9lY2hvIC1uJworKyAgZWxzZQorKyAgICBhc19lY2hvX2JvZHk9J2V2YWwgZXhwciAiWCQxIiA6ICJYXFwoLipcXCkiJworKyAgICBhc19lY2hvX25fYm9keT0nZXZhbAorKyAgICAgIGFyZz0kMTsKKysgICAgICBjYXNlICRhcmcgaW4KKysgICAgICAqIiRhc19ubCIqKQorKwlleHByICJYJGFyZyIgOiAiWFxcKC4qXFwpJGFzX25sIjsKKysJYXJnPWBleHByICJYJGFyZyIgOiAiLiokYXNfbmxcXCguKlxcKSJgOzsKKysgICAgICBlc2FjOworKyAgICAgIGV4cHIgIlgkYXJnIiA6ICJYXFwoLipcXCkiIHwgdHIgLWQgIiRhc19ubCIKKysgICAgJworKyAgICBleHBvcnQgYXNfZWNob19uX2JvZHkKKysgICAgYXNfZWNob19uPSdzaCAtYyAkYXNfZWNob19uX2JvZHkgYXNfZWNobycKKysgIGZpCisrICBleHBvcnQgYXNfZWNob19ib2R5CisrICBhc19lY2hvPSdzaCAtYyAkYXNfZWNob19ib2R5IGFzX2VjaG8nCisrZmkKKysKKysjIFRoZSB1c2VyIGlzIGFsd2F5cyByaWdodC4KKytpZiB0ZXN0ICIke1BBVEhfU0VQQVJBVE9SK3NldH0iICE9IHNldDsgdGhlbgorKyAgUEFUSF9TRVBBUkFUT1I9OgorKyAgKFBBVEg9Jy9iaW47L2Jpbic7IEZQQVRIPSRQQVRIOyBzaCAtYyA6KSA+L2Rldi9udWxsIDI+JjEgJiYgeworKyAgICAoUEFUSD0nL2JpbjovYmluJzsgRlBBVEg9JFBBVEg7IHNoIC1jIDopID4vZGV2L251bGwgMj4mMSB8fAorKyAgICAgIFBBVEhfU0VQQVJBVE9SPSc7JworKyAgfQorK2ZpCisrCisrIyBTdXBwb3J0IHVuc2V0IHdoZW4gcG9zc2libGUuCisraWYgKCAoTUFJTD02MDsgdW5zZXQgTUFJTCkgfHwgZXhpdCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisrICBhc191bnNldD11bnNldAorK2Vsc2UKKysgIGFzX3Vuc2V0PWZhbHNlCisrZmkKKysKKysKKysjIElGUworKyMgV2UgbmVlZCBzcGFjZSwgdGFiIGFuZCBuZXcgbGluZSwgaW4gcHJlY2lzZWx5IHRoYXQgb3JkZXIuICBRdW90aW5nIGlzCisrIyB0aGVyZSB0byBwcmV2ZW50IGVkaXRvcnMgZnJvbSBjb21wbGFpbmluZyBhYm91dCBzcGFjZS10YWIuCisrIyAoSWYgX0FTX1BBVEhfV0FMSyB3ZXJlIGNhbGxlZCB3aXRoIElGUyB1bnNldCwgaXQgd291bGQgZGlzYWJsZSB3b3JkCisrIyBzcGxpdHRpbmcgYnkgc2V0dGluZyBJRlMgdG8gZW1wdHkgdmFsdWUuKQorK0lGUz0iICIiCSRhc19ubCIKKysKKysjIEZpbmQgd2hvIHdlIGFyZS4gIExvb2sgaW4gdGhlIHBhdGggaWYgd2UgY29udGFpbiBubyBkaXJlY3Rvcnkgc2VwYXJhdG9yLgorK2Nhc2UgJDAgaW4KKysgICpbXFwvXSogKSBhc19teXNlbGY9JDAgOzsKKysgICopIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKKytmb3IgYXNfZGlyIGluICRQQVRICisgZG8KKy0gIGNhc2UgIlwkYWNfb3B0aW9uIiBpbgorLSAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCistICAgIGVjaG8gInJ1bm5pbmcgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIKKy0gICAgZXhlYyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIDs7CistICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdikKKy0gICAgZWNobyAiJENPTkZJR19TVEFUVVMgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMyIKKy0gICAgZXhpdCAwIDs7CistICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC0taCkKKy0gICAgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMCA7OworLSAgKikgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMSA7OworLSAgZXNhYworKyAgSUZTPSRhc19zYXZlX0lGUworKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKysgIHRlc3QgLXIgIiRhc19kaXIvJDAiICYmIGFzX215c2VsZj0kYXNfZGlyLyQwICYmIGJyZWFrCisgZG9uZQorK0lGUz0kYXNfc2F2ZV9JRlMKKyAKKy1hY19naXZlbl9zcmNkaXI9JHNyY2RpcgorLWFjX2dpdmVuX0lOU1RBTEw9IiRJTlNUQUxMIgorKyAgICAgOzsKKytlc2FjCisrIyBXZSBkaWQgbm90IGZpbmQgb3Vyc2VsdmVzLCBtb3N0IHByb2JhYmx5IHdlIHdlcmUgcnVuIGFzIGBzaCBDT01NQU5EJworKyMgaW4gd2hpY2ggY2FzZSB3ZSBhcmUgbm90IHRvIGJlIGZvdW5kIGluIHRoZSBwYXRoLgorK2lmIHRlc3QgIngkYXNfbXlzZWxmIiA9IHg7IHRoZW4KKysgIGFzX215c2VsZj0kMAorK2ZpCisraWYgdGVzdCAhIC1mICIkYXNfbXlzZWxmIjsgdGhlbgorKyAgJGFzX2VjaG8gIiRhc19teXNlbGY6IGVycm9yOiBjYW5ub3QgZmluZCBteXNlbGY7IHJlcnVuIHdpdGggYW4gYWJzb2x1dGUgZmlsZSBuYW1lIiA+JjIKKysgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfQorK2ZpCisgCistdHJhcCAncm0gLWZyIGBlY2hvICJpY3VkZWZzLm1rIFwKKy0JCU1ha2VmaWxlIFwKKy0JCWRhdGEvTWFrZWZpbGUgZGF0YS9pY3Vwa2cuaW5jIFwKKy0JCWNvbW1vbi9NYWtlZmlsZSBjb25maWcvTWFrZWZpbGUuaW5jIGkxOG4vTWFrZWZpbGUgXAorLQkJbGF5b3V0L01ha2VmaWxlIFwKKy0JCWxheW91dGV4L01ha2VmaWxlIFwKKy0JCWlvL01ha2VmaWxlIFwKKy0JCWV4dHJhL01ha2VmaWxlIFwKKy0JCWV4dHJhL3Vjb252L01ha2VmaWxlIGV4dHJhL3NjcnB0cnVuL01ha2VmaWxlCistCQlzdHViZGF0YS9NYWtlZmlsZSBcCistCQl0b29scy9NYWtlZmlsZSB0b29scy9jdGVzdGZ3L01ha2VmaWxlIHRvb2xzL21ha2Vjb252L01ha2VmaWxlIFwKKy0JCXRvb2xzL2dlbnJiL01ha2VmaWxlIFwKKy0JCXRvb2xzL2dlbnVjYS9NYWtlZmlsZSBcCistCQl0b29scy9nZW5jY29kZS9NYWtlZmlsZSBcCistCQl0b29scy9nZW5jbW4vTWFrZWZpbGUgXAorLQkJdG9vbHMvZ2VuY252YWwvTWFrZWZpbGUgXAorLQkJdG9vbHMvZ2VubmFtZXMvTWFrZWZpbGUgXAorLQkJdG9vbHMvZ2VudGVzdC9NYWtlZmlsZSBcCistCQl0b29scy9nZW5ub3JtL01ha2VmaWxlIFwKKy0JCXRvb2xzL2dlbnByb3BzL01ha2VmaWxlIFwKKy0JCXRvb2xzL2dlbnBuYW1lL01ha2VmaWxlIFwKKy0JCXRvb2xzL2dlbmJyay9NYWtlZmlsZSBcCistCQl0b29scy9nZW5zcHJlcC9NYWtlZmlsZSBcCistCQl0b29scy9pY3Vzd2FwL01ha2VmaWxlIFwKKy0JCXRvb2xzL3BrZ2RhdGEvTWFrZWZpbGUgXAorLQkJdG9vbHMvdG9vbHV0aWwvTWFrZWZpbGUgXAorLQkJdG9vbHMvZHVtcGNlL01ha2VmaWxlIFwKKy0JCXRlc3QvTWFrZWZpbGUgdGVzdC90ZXN0ZGF0YS9NYWtlZmlsZSBcCistCQl0ZXN0L2hkcnRzdC9NYWtlZmlsZSBcCistCQl0ZXN0L2ludGx0ZXN0L01ha2VmaWxlIFwKKy0JCXRlc3QvY2ludGx0c3QvTWFrZWZpbGUgXAorLQkJdGVzdC9pb3Rlc3QvTWFrZWZpbGUgXAorLQkJdGVzdC90aGFpdGVzdC9NYWtlZmlsZSBcCistCQl0ZXN0L3Rlc3RtYXAvTWFrZWZpbGUgXAorLQkJdGVzdC9sZXRlc3QvTWFrZWZpbGUgXAorLQkJdGVzdC90aHJlYWR0ZXN0L01ha2VmaWxlIFwKKy0JCXNhbXBsZXMvTWFrZWZpbGUgc2FtcGxlcy9kYXRlL01ha2VmaWxlIFwKKy0JCXNhbXBsZXMvY2FsL01ha2VmaWxlIHNhbXBsZXMvbGF5b3V0L01ha2VmaWxlIFwKKy0JCWNvbW1vbi91bmljb2RlL3BsYXRmb3JtLmggY29tbW9uL2ljdWNmZy5oIiB8IHNlZCAicy86W14gXSovL2ciYCBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1CistRU9GCistY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCistCistIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KKy1zZWQgJ3MvJUAvQEAvOyBzL0AlL0BALzsgcy8lZ1wkL0BnLzsgL0BnXCQvcy9bXFxcXCYlXS9cXFxcJi9nOworLSBzL0BALyVALzsgcy9AQC9AJS87IHMvQGdcJC8lZy8nID4gY29uZnRlc3Quc3VicyA8PFxcQ0VPRgorLSRhY192cHN1YgorLSRleHRyYXN1YgorLXMlQFNIRUxMQCUkU0hFTEwlZworLXMlQENGTEFHU0AlJENGTEFHUyVnCistcyVAQ1BQRkxBR1NAJSRDUFBGTEFHUyVnCistcyVAQ1hYRkxBR1NAJSRDWFhGTEFHUyVnCistcyVARkZMQUdTQCUkRkZMQUdTJWcKKy1zJUBERUZTQCUkREVGUyVnCistcyVATERGTEFHU0AlJExERkxBR1MlZworLXMlQExJQlNAJSRMSUJTJWcKKy1zJUBleGVjX3ByZWZpeEAlJGV4ZWNfcHJlZml4JWcKKy1zJUBwcmVmaXhAJSRwcmVmaXglZworLXMlQHByb2dyYW1fdHJhbnNmb3JtX25hbWVAJSRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJWcKKy1zJUBiaW5kaXJAJSRiaW5kaXIlZworLXMlQHNiaW5kaXJAJSRzYmluZGlyJWcKKy1zJUBsaWJleGVjZGlyQCUkbGliZXhlY2RpciVnCistcyVAZGF0YWRpckAlJGRhdGFkaXIlZworLXMlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKKy1zJUBzaGFyZWRzdGF0ZWRpckAlJHNoYXJlZHN0YXRlZGlyJWcKKy1zJUBsb2NhbHN0YXRlZGlyQCUkbG9jYWxzdGF0ZWRpciVnCistcyVAbGliZGlyQCUkbGliZGlyJWcKKy1zJUBpbmNsdWRlZGlyQCUkaW5jbHVkZWRpciVnCistcyVAb2xkaW5jbHVkZWRpckAlJG9sZGluY2x1ZGVkaXIlZworLXMlQGluZm9kaXJAJSRpbmZvZGlyJWcKKy1zJUBtYW5kaXJAJSRtYW5kaXIlZworLXMlQFBBQ0tBR0VAJSRQQUNLQUdFJWcKKy1zJUBWRVJTSU9OQCUkVkVSU0lPTiVnCistcyVATElCX1ZFUlNJT05AJSRMSUJfVkVSU0lPTiVnCistcyVATElCX1ZFUlNJT05fTUFKT1JAJSRMSUJfVkVSU0lPTl9NQUpPUiVnCistcyVAVU5JQ09ERV9WRVJTSU9OQCUkVU5JQ09ERV9WRVJTSU9OJWcKKy1zJUBDQ0AlJENDJWcKKy1zJUBDWFhAJSRDWFglZworLXMlQElOU1RBTExfUFJPR1JBTUAlJElOU1RBTExfUFJPR1JBTSVnCistcyVASU5TVEFMTF9TQ1JJUFRAJSRJTlNUQUxMX1NDUklQVCVnCistcyVASU5TVEFMTF9EQVRBQCUkSU5TVEFMTF9EQVRBJWcKKy1zJUBTVFJJUEAlJFNUUklQJWcKKy1zJUBVX01BS0VAJSRVX01BS0UlZworLXMlQERPWFlHRU5AJSRET1hZR0VOJWcKKy1zJUBob3N0QCUkaG9zdCVnCistcyVAaG9zdF9hbGlhc0AlJGhvc3RfYWxpYXMlZworLXMlQGhvc3RfY3B1QCUkaG9zdF9jcHUlZworLXMlQGhvc3RfdmVuZG9yQCUkaG9zdF92ZW5kb3IlZworLXMlQGhvc3Rfb3NAJSRob3N0X29zJWcKKy1zJUBFWEVFWFRAJSRFWEVFWFQlZworLXMlQEFSRkxBR1NAJSRBUkZMQUdTJWcKKy1zJUBDT01QSUxFX0xJTktfRU5WVkFSQCUkQ09NUElMRV9MSU5LX0VOVlZBUiVnCistcyVATElCX01AJSRMSUJfTSVnCistcyVARU5BQkxFX1NIQVJFREAlJEVOQUJMRV9TSEFSRUQlZworLXMlQEVOQUJMRV9TVEFUSUNAJSRFTkFCTEVfU1RBVElDJWcKKy1zJUBFTkFCTEVfREVCVUdAJSRFTkFCTEVfREVCVUclZworLXMlQEVOQUJMRV9SRUxFQVNFQCUkRU5BQkxFX1JFTEVBU0UlZworLXMlQFJBTkxJQkAlJFJBTkxJQiVnCistcyVAQVJAJSRBUiVnCistcyVAVV9ESVNBQkxFX1JFTkFNSU5HQCUkVV9ESVNBQkxFX1JFTkFNSU5HJWcKKy1zJUBVX0VOQUJMRV9UUkFDSU5HQCUkVV9FTkFCTEVfVFJBQ0lORyVnCistcyVARU5BQkxFX1JQQVRIQCUkRU5BQkxFX1JQQVRIJWcKKy1zJUBVX0lOTElORUAlJFVfSU5MSU5FJWcKKy1zJUBUSFJFQURTX1RSVUVAJSRUSFJFQURTX1RSVUUlZworLXMlQElDVV9VU0VfVEhSRUFEU0AlJElDVV9VU0VfVEhSRUFEUyVnCistcyVASEFWRV9NTUFQQCUkSEFWRV9NTUFQJWcKKy1zJUBHRU5DQ09ERV9BU1NFTUJMWUAlJEdFTkNDT0RFX0FTU0VNQkxZJWcKKy1zJUBDUFBAJSRDUFAlZworLXMlQFVfSEFWRV9JTlRUWVBFU19IQCUkVV9IQVZFX0lOVFRZUEVTX0glZworLXMlQENYWENQUEAlJENYWENQUCVnCistcyVAVV9JT1NUUkVBTV9TT1VSQ0VAJSRVX0lPU1RSRUFNX1NPVVJDRSVnCistcyVAVV9JU19CSUdfRU5ESUFOQCUkVV9JU19CSUdfRU5ESUFOJWcKKy1zJUBVX0hBVkVfTkxfTEFOR0lORk9AJSRVX0hBVkVfTkxfTEFOR0lORk8lZworLXMlQFVfSEFWRV9OTF9MQU5HSU5GT19DT0RFU0VUQCUkVV9IQVZFX05MX0xBTkdJTkZPX0NPREVTRVQlZworLXMlQFVfTkxfTEFOR0lORk9fQ09ERVNFVEAlJFVfTkxfTEFOR0lORk9fQ09ERVNFVCVnCistcyVAVV9IQVZFX05BTUVTUEFDRUAlJFVfSEFWRV9OQU1FU1BBQ0UlZworLXMlQFVfT1ZFUlJJREVfQ1hYX0FMTE9DQVRJT05AJSRVX09WRVJSSURFX0NYWF9BTExPQ0FUSU9OJWcKKy1zJUBVX0hBVkVfUExBQ0VNRU5UX05FV0AlJFVfSEFWRV9QTEFDRU1FTlRfTkVXJWcKKy1zJUBVX0hBVkVfUE9QRU5AJSRVX0hBVkVfUE9QRU4lZworLXMlQFVfVFpTRVRAJSRVX1RaU0VUJWcKKy1zJUBVX1RaTkFNRUAlJFVfVFpOQU1FJWcKKy1zJUBVX0hBVkVfVElNRVpPTkVAJSRVX0hBVkVfVElNRVpPTkUlZworLXMlQFVfVElNRVpPTkVAJSRVX1RJTUVaT05FJWcKKy1zJUBIQVZFX0lOVDhfVEAlJEhBVkVfSU5UOF9UJWcKKy1zJUBIQVZFX1VJTlQ4X1RAJSRIQVZFX1VJTlQ4X1QlZworLXMlQEhBVkVfSU5UMTZfVEAlJEhBVkVfSU5UMTZfVCVnCistcyVASEFWRV9VSU5UMTZfVEAlJEhBVkVfVUlOVDE2X1QlZworLXMlQEhBVkVfSU5UMzJfVEAlJEhBVkVfSU5UMzJfVCVnCistcyVASEFWRV9VSU5UMzJfVEAlJEhBVkVfVUlOVDMyX1QlZworLXMlQEhBVkVfSU5UNjRfVEAlJEhBVkVfSU5UNjRfVCVnCistcyVASEFWRV9VSU5UNjRfVEAlJEhBVkVfVUlOVDY0X1QlZworLXMlQFVfSEFWRV9XQ0hBUl9IQCUkVV9IQVZFX1dDSEFSX0glZworLXMlQFVfSEFWRV9XQ1NDUFlAJSRVX0hBVkVfV0NTQ1BZJWcKKy1zJUBVX1NJWkVPRl9XQ0hBUl9UQCUkVV9TSVpFT0ZfV0NIQVJfVCVnCistcyVARVhUUkFTX1RSVUVAJSRFWFRSQVNfVFJVRSVnCistcyVASUNVSU9fVFJVRUAlJElDVUlPX1RSVUUlZworLXMlQExBWU9VVF9UUlVFQCUkTEFZT1VUX1RSVUUlZworLXMlQHRoZXN5c2NvbmZkaXJAJSR0aGVzeXNjb25mZGlyJWcKKy1zJUB0aGVkYXRhZGlyQCUkdGhlZGF0YWRpciVnCistcyVAdGhlbGliZGlyQCUkdGhlbGliZGlyJWcKKy1zJUBwa2dpY3VkYXRhZGlyQCUkcGtnaWN1ZGF0YWRpciVnCistcyVAdGhlcGtnaWN1ZGF0YWRpckAlJHRoZXBrZ2ljdWRhdGFkaXIlZworLXMlQERBVEFfUEFDS0FHSU5HX0NQUEZMQUdTQCUkREFUQV9QQUNLQUdJTkdfQ1BQRkxBR1MlZworLXMlQERBVEFfUEFDS0FHSU5HX01PREVAJSREQVRBX1BBQ0tBR0lOR19NT0RFJWcKKy1zJUBJQ1VMSUJTVUZGSVhAJSRJQ1VMSUJTVUZGSVglZworLXMlQFVfSEFWRV9MSUJfU1VGRklYQCUkVV9IQVZFX0xJQl9TVUZGSVglZworLXMlQElDVUxJQlNVRkZJWENOQU1FQCUkSUNVTElCU1VGRklYQ05BTUUlZworLXMlQFRFU1RTX1RSVUVAJSRURVNUU19UUlVFJWcKKy1zJUBTQU1QTEVTX1RSVUVAJSRTQU1QTEVTX1RSVUUlZworLXMlQElDVURBVEFfQ0hBUkAlJElDVURBVEFfQ0hBUiVnCistcyVAcGxhdGZvcm1AJSRwbGF0Zm9ybSVnCistcyVAcGxhdGZvcm1fbWFrZV9mcmFnbWVudF9uYW1lQCUkcGxhdGZvcm1fbWFrZV9mcmFnbWVudF9uYW1lJWcKKy1zJUBwbGF0Zm9ybV9tYWtlX2ZyYWdtZW50QCUkcGxhdGZvcm1fbWFrZV9mcmFnbWVudCVnCistcyVAbGRfcnBhdGhfc3VmQCUkbGRfcnBhdGhfc3VmJWcKKy1zJUBBSVhfU0hMSUJAJSRBSVhfU0hMSUIlZworLQorLUNFT0YKKy1FT0YKKy0KKy1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCistCistIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKKy0jIHNtYWxsIGNvbW1hbmQgbnVtYmVyIGxpbWl0cywgbGlrZSBvbiBEaWdpdGFsIE9TRi8xIGFuZCBIUC1VWC4KKy1hY19tYXhfc2VkX2NtZHM9OTAgIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzZWQgc2NyaXB0LgorLWFjX2ZpbGU9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCistYWNfYmVnPTEgIyBGaXJzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCistYWNfZW5kPSRhY19tYXhfc2VkX2NtZHMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgorLWFjX21vcmVfbGluZXM9OgorLWFjX3NlZF9jbWRzPSIiCistd2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCistICBpZiB0ZXN0ICRhY19iZWcgLWd0IDE7IHRoZW4KKy0gICAgc2VkICIxLCR7YWNfYmVnfWQ7ICR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKKysjIFdvcmsgYXJvdW5kIGJ1Z3MgaW4gcHJlLTMuMCBVV0lOIGtzaC4KKytmb3IgYXNfdmFyIGluIEVOViBNQUlMIE1BSUxQQVRICisrZG8gKCRhc191bnNldCAkYXNfdmFyKSA+L2Rldi9udWxsIDI+JjEgJiYgJGFzX3Vuc2V0ICRhc192YXIKKytkb25lCisrUFMxPSckICcKKytQUzI9Jz4gJworK1BTND0nKyAnCisrCisrIyBOTFMgbnVpc2FuY2VzLgorK0xDX0FMTD1DCisrZXhwb3J0IExDX0FMTAorK0xBTkdVQUdFPUMKKytleHBvcnQgTEFOR1VBR0UKKysKKysjIFJlcXVpcmVkIHRvIHVzZSBiYXNlbmFtZS4KKytpZiBleHByIGEgOiAnXChhXCknID4vZGV2L251bGwgMj4mMSAmJgorKyAgIHRlc3QgIlhgZXhwciAwMDAwMSA6ICcuKlwoLi4uXCknYCIgPSBYMDAxOyB0aGVuCisrICBhc19leHByPWV4cHIKKytlbHNlCisrICBhc19leHByPWZhbHNlCisrZmkKKysKKytpZiAoYmFzZW5hbWUgLS0gLykgPi9kZXYvbnVsbCAyPiYxICYmIHRlc3QgIlhgYmFzZW5hbWUgLS0gLyAyPiYxYCIgPSAiWC8iOyB0aGVuCisrICBhc19iYXNlbmFtZT1iYXNlbmFtZQorK2Vsc2UKKysgIGFzX2Jhc2VuYW1lPWZhbHNlCisrZmkKKysKKysKKysjIE5hbWUgb2YgdGhlIGV4ZWN1dGFibGUuCisrYXNfbWU9YCRhc19iYXNlbmFtZSAtLSAiJDAiIHx8CisrJGFzX2V4cHIgWC8iJDAiIDogJy4qL1woW14vXVteL10qXCkvKiQnIFx8IFwKKysJIFgiJDAiIDogJ1hcKC8vXCkkJyBcfCBcCisrCSBYIiQwIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKKyskYXNfZWNobyBYLyIkMCIgfAorKyAgICBzZWQgJy9eLipcL1woW14vXVteL10qXClcLyokL3sKKysJICAgIHMvL1wxLworKwkgICAgcQorKwkgIH0KKysJICAvXlhcL1woXC9cL1wpJC97CisrCSAgICBzLy9cMS8KKysJICAgIHEKKysJICB9CisrCSAgL15YXC9cKFwvXCkuKi97CisrCSAgICBzLy9cMS8KKysJICAgIHEKKysJICB9CisrCSAgcy8uKi8uLzsgcSdgCisrCisrIyBDRFBBVEguCisrJGFzX3Vuc2V0IENEUEFUSAorKworKworKworKyAgYXNfbGluZW5vXzE9JExJTkVOTworKyAgYXNfbGluZW5vXzI9JExJTkVOTworKyAgdGVzdCAieCRhc19saW5lbm9fMSIgIT0gIngkYXNfbGluZW5vXzIiICYmCisrICB0ZXN0ICJ4YGV4cHIgJGFzX2xpbmVub18xICsgMWAiID0gIngkYXNfbGluZW5vXzIiIHx8IHsKKysKKysgICMgQ3JlYXRlICRhc19tZS5saW5lbm8gYXMgYSBjb3B5IG9mICRhc19teXNlbGYsIGJ1dCB3aXRoICRMSU5FTk8KKysgICMgdW5pZm9ybWx5IHJlcGxhY2VkIGJ5IHRoZSBsaW5lIG51bWJlci4gIFRoZSBmaXJzdCAnc2VkJyBpbnNlcnRzIGEKKysgICMgbGluZS1udW1iZXIgbGluZSBhZnRlciBlYWNoIGxpbmUgdXNpbmcgJExJTkVOTzsgdGhlIHNlY29uZCAnc2VkJworKyAgIyBkb2VzIHRoZSByZWFsIHdvcmsuICBUaGUgc2Vjb25kIHNjcmlwdCB1c2VzICdOJyB0byBwYWlyIGVhY2gKKysgICMgbGluZS1udW1iZXIgbGluZSB3aXRoIHRoZSBsaW5lIGNvbnRhaW5pbmcgJExJTkVOTywgYW5kIGFwcGVuZHMKKysgICMgdHJhaWxpbmcgJy0nIGR1cmluZyBzdWJzdGl0dXRpb24gc28gdGhhdCAkTElORU5PIGlzIG5vdCBhIHNwZWNpYWwKKysgICMgY2FzZSBhdCBsaW5lIGVuZC4KKysgICMgKFJhamEgUiBIYXJpbmF0aCBzdWdnZXN0ZWQgc2VkICc9JywgYW5kIFBhdWwgRWdnZXJ0IHdyb3RlIHRoZQorKyAgIyBzY3JpcHRzIHdpdGggb3B0aW1pemF0aW9uIGhlbHAgZnJvbSBQYW9sbyBCb256aW5pLiAgQmxhbWUgTGVlCisrICAjIEUuIE1jTWFob24gKDE5MzEtMTk4OSkgZm9yIHNlZCdzIHN5bnRheC4gIDotKQorKyAgc2VkIC1uICcKKysgICAgcAorKyAgICAvWyRdTElORU5PLz0KKysgICcgPCRhc19teXNlbGYgfAorKyAgICBzZWQgJworKyAgICAgIHMvWyRdTElORU5PLiovJi0vCisrICAgICAgdCBsaW5lbm8KKysgICAgICBiCisrICAgICAgOmxpbmVubworKyAgICAgIE4KKysgICAgICA6bG9vcAorKyAgICAgIHMvWyRdTElORU5PXChbXickYXNfY3JfYWxudW0nX10uKlxuXClcKC4qXCkvXDJcMVwyLworKyAgICAgIHQgbG9vcAorKyAgICAgIHMvLVxuLiovLworKyAgICAnID4kYXNfbWUubGluZW5vICYmCisrICBjaG1vZCAreCAiJGFzX21lLmxpbmVubyIgfHwKKysgICAgeyAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNyZWF0ZSAkYXNfbWUubGluZW5vOyByZXJ1biB3aXRoIGEgUE9TSVggc2hlbGwiID4mMgorKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorKworKyAgIyBEb24ndCB0cnkgdG8gZXhlYyBhcyBpdCBjaGFuZ2VzICRbMF0sIGNhdXNpbmcgYWxsIHNvcnQgb2YgcHJvYmxlbXMKKysgICMgKHRoZSBkaXJuYW1lIG9mICRbMF0gaXMgbm90IHRoZSBwbGFjZSB3aGVyZSB3ZSBtaWdodCBmaW5kIHRoZQorKyAgIyBvcmlnaW5hbCBhbmQgc28gb24uICBBdXRvY29uZiBpcyBlc3BlY2lhbGx5IHNlbnNpdGl2ZSB0byB0aGlzKS4KKysgIC4gIi4vJGFzX21lLmxpbmVubyIKKysgICMgRXhpdCBzdGF0dXMgaXMgdGhhdCBvZiB0aGUgbGFzdCBjb21tYW5kLgorKyAgZXhpdAorK30KKysKKysKKytpZiAoYXNfZGlyPWBkaXJuYW1lIC0tIC9gICYmIHRlc3QgIlgkYXNfZGlyIiA9IFgvKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKysgIGFzX2Rpcm5hbWU9ZGlybmFtZQorK2Vsc2UKKysgIGFzX2Rpcm5hbWU9ZmFsc2UKKytmaQorKworK0VDSE9fQz0gRUNIT19OPSBFQ0hPX1Q9CisrY2FzZSBgZWNobyAtbiB4YCBpbgorKy1uKikKKysgIGNhc2UgYGVjaG8gJ3hcYydgIGluCisrICAqYyopIEVDSE9fVD0nCSc7OwkjIEVDSE9fVCBpcyBzaW5nbGUgdGFiIGNoYXJhY3Rlci4KKysgICopICAgRUNIT19DPSdcYyc7OworKyAgZXNhYzs7CisrKikKKysgIEVDSE9fTj0nLW4nOzsKKytlc2FjCisraWYgZXhwciBhIDogJ1woYVwpJyA+L2Rldi9udWxsIDI+JjEgJiYKKysgICB0ZXN0ICJYYGV4cHIgMDAwMDEgOiAnLipcKC4uLlwpJ2AiID0gWDAwMTsgdGhlbgorKyAgYXNfZXhwcj1leHByCisrZWxzZQorKyAgYXNfZXhwcj1mYWxzZQorK2ZpCisrCisrcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmZpbGUKKytpZiB0ZXN0IC1kIGNvbmYkJC5kaXI7IHRoZW4KKysgIHJtIC1mIGNvbmYkJC5kaXIvY29uZiQkLmZpbGUKKytlbHNlCisrICBybSAtZiBjb25mJCQuZGlyCisrICBta2RpciBjb25mJCQuZGlyIDI+L2Rldi9udWxsCisrZmkKKytpZiAoZWNobyA+Y29uZiQkLmZpbGUpIDI+L2Rldi9udWxsOyB0aGVuCisrICBpZiBsbiAtcyBjb25mJCQuZmlsZSBjb25mJCQgMj4vZGV2L251bGw7IHRoZW4KKysgICAgYXNfbG5fcz0nbG4gLXMnCisrICAgICMgLi4uIGJ1dCB0aGVyZSBhcmUgdHdvIGdvdGNoYXM6CisrICAgICMgMSkgT24gTVNZUywgYm90aCBgbG4gLXMgZmlsZSBkaXInIGFuZCBgbG4gZmlsZSBkaXInIGZhaWwuCisrICAgICMgMikgREpHUFAgPCAyLjA0IGhhcyBubyBzeW1saW5rczsgYGxuIC1zJyBjcmVhdGVzIGEgd3JhcHBlciBleGVjdXRhYmxlLgorKyAgICAjIEluIGJvdGggY2FzZXMsIHdlIGhhdmUgdG8gZGVmYXVsdCB0byBgY3AgLXAnLgorKyAgICBsbiAtcyBjb25mJCQuZmlsZSBjb25mJCQuZGlyIDI+L2Rldi9udWxsICYmIHRlc3QgISAtZiBjb25mJCQuZXhlIHx8CisrICAgICAgYXNfbG5fcz0nY3AgLXAnCisrICBlbGlmIGxuIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgorKyAgICBhc19sbl9zPWxuCisgICBlbHNlCistICAgIHNlZCAiJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQorKyAgICBhc19sbl9zPSdjcCAtcCcKKyAgIGZpCistICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QucyRhY19maWxlOyB0aGVuCistICAgIGFjX21vcmVfbGluZXM9ZmFsc2UKKy0gICAgcm0gLWYgY29uZnRlc3QucyRhY19maWxlCistICBlbHNlCistICAgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KKy0gICAgICBhY19zZWRfY21kcz0ic2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKKy0gICAgZWxzZQorLSAgICAgIGFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgorLSAgICBmaQorLSAgICBhY19maWxlPWBleHByICRhY19maWxlICsgMWAKKy0gICAgYWNfYmVnPSRhY19lbmQKKy0gICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9jbWRzYAorLSAgZmkKKy1kb25lCistaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgorLSAgYWNfc2VkX2NtZHM9Y2F0CistZmkKKy1FT0YKKy0KKy1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKy0KKy1DT05GSUdfRklMRVM9XCR7Q09ORklHX0ZJTEVTLSJpY3VkZWZzLm1rIFwKKy0JCU1ha2VmaWxlIFwKKy0JCWRhdGEvTWFrZWZpbGUgZGF0YS9pY3Vwa2cuaW5jIFwKKy0JCWNvbW1vbi9NYWtlZmlsZSBjb25maWcvTWFrZWZpbGUuaW5jIGkxOG4vTWFrZWZpbGUgXAorLQkJbGF5b3V0L01ha2VmaWxlIFwKKy0JCWxheW91dGV4L01ha2VmaWxlIFwKKy0JCWlvL01ha2VmaWxlIFwKKy0JCWV4dHJhL01ha2VmaWxlIFwKKy0JCWV4dHJhL3Vjb252L01ha2VmaWxlIGV4dHJhL3NjcnB0cnVuL01ha2VmaWxlCistCQlzdHViZGF0YS9NYWtlZmlsZSBcCistCQl0b29scy9NYWtlZmlsZSB0b29scy9jdGVzdGZ3L01ha2VmaWxlIHRvb2xzL21ha2Vjb252L01ha2VmaWxlIFwKKy0JCXRvb2xzL2dlbnJiL01ha2VmaWxlIFwKKy0JCXRvb2xzL2dlbnVjYS9NYWtlZmlsZSBcCistCQl0b29scy9nZW5jY29kZS9NYWtlZmlsZSBcCistCQl0b29scy9nZW5jbW4vTWFrZWZpbGUgXAorLQkJdG9vbHMvZ2VuY252YWwvTWFrZWZpbGUgXAorLQkJdG9vbHMvZ2VubmFtZXMvTWFrZWZpbGUgXAorLQkJdG9vbHMvZ2VudGVzdC9NYWtlZmlsZSBcCistCQl0b29scy9nZW5ub3JtL01ha2VmaWxlIFwKKy0JCXRvb2xzL2dlbnByb3BzL01ha2VmaWxlIFwKKy0JCXRvb2xzL2dlbnBuYW1lL01ha2VmaWxlIFwKKy0JCXRvb2xzL2dlbmJyay9NYWtlZmlsZSBcCistCQl0b29scy9nZW5zcHJlcC9NYWtlZmlsZSBcCistCQl0b29scy9pY3Vzd2FwL01ha2VmaWxlIFwKKy0JCXRvb2xzL3BrZ2RhdGEvTWFrZWZpbGUgXAorLQkJdG9vbHMvdG9vbHV0aWwvTWFrZWZpbGUgXAorLQkJdG9vbHMvZHVtcGNlL01ha2VmaWxlIFwKKy0JCXRlc3QvTWFrZWZpbGUgdGVzdC90ZXN0ZGF0YS9NYWtlZmlsZSBcCistCQl0ZXN0L2hkcnRzdC9NYWtlZmlsZSBcCistCQl0ZXN0L2ludGx0ZXN0L01ha2VmaWxlIFwKKy0JCXRlc3QvY2ludGx0c3QvTWFrZWZpbGUgXAorLQkJdGVzdC9pb3Rlc3QvTWFrZWZpbGUgXAorLQkJdGVzdC90aGFpdGVzdC9NYWtlZmlsZSBcCistCQl0ZXN0L3Rlc3RtYXAvTWFrZWZpbGUgXAorLQkJdGVzdC9sZXRlc3QvTWFrZWZpbGUgXAorLQkJdGVzdC90aHJlYWR0ZXN0L01ha2VmaWxlIFwKKy0JCXNhbXBsZXMvTWFrZWZpbGUgc2FtcGxlcy9kYXRlL01ha2VmaWxlIFwKKy0JCXNhbXBsZXMvY2FsL01ha2VmaWxlIHNhbXBsZXMvbGF5b3V0L01ha2VmaWxlIFwKKy0JCWNvbW1vbi91bmljb2RlL3BsYXRmb3JtLmgifQorLUVPRgorLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKKy1mb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0ZJTEVTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgorLSAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgorLSAgY2FzZSAiJGFjX2ZpbGUiIGluCistICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAorLSAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKKy0gICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7CistICBlc2FjCisrZWxzZQorKyAgYXNfbG5fcz0nY3AgLXAnCisrZmkKKytybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZGlyL2NvbmYkJC5maWxlIGNvbmYkJC5maWxlCisrcm1kaXIgY29uZiQkLmRpciAyPi9kZXYvbnVsbAorIAorLSAgIyBBZGp1c3QgYSByZWxhdGl2ZSBzcmNkaXIsIHRvcF9zcmNkaXIsIGFuZCBJTlNUQUxMIGZvciBzdWJkaXJlY3Rvcmllcy4KKytpZiBta2RpciAtcCAuIDI+L2Rldi9udWxsOyB0aGVuCisrICBhc19ta2Rpcl9wPToKKytlbHNlCisrICB0ZXN0IC1kIC4vLXAgJiYgcm1kaXIgLi8tcAorKyAgYXNfbWtkaXJfcD1mYWxzZQorK2ZpCisgCistICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KKy0gIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCistICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KKy0gICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KKy0gICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKKy0gICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzJV5cLi8lJSdgIgorLSAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgorLSAgICBhY19kb3RzPWBlY2hvICRhY19kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAorK2lmIHRlc3QgLXggLyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKysgIGFzX3Rlc3RfeD0ndGVzdCAteCcKKytlbHNlCisrICBpZiBscyAtZEwgLyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKysgICAgYXNfbHNfTF9vcHRpb249TAorICAgZWxzZQorLSAgICBhY19kaXJfc3VmZml4PSBhY19kb3RzPQorKyAgICBhc19sc19MX29wdGlvbj0KKyAgIGZpCisrICBhc190ZXN0X3g9JworKyAgICBldmFsIHNoIC1jICdcJycKKysgICAgICBpZiB0ZXN0IC1kICIkMSI7IHRoZW4KKysJdGVzdCAtZCAiJDEvLiI7CisrICAgICAgZWxzZQorKwljYXNlICQxIGluCisrCS0qKXNldCAiLi8kMSI7OworKwllc2FjOworKwljYXNlIGBscyAtbGQnJGFzX2xzX0xfb3B0aW9uJyAiJDEiIDI+L2Rldi9udWxsYCBpbgorKwk/Pz9bc3hdKik6OzsqKWZhbHNlOztlc2FjO2ZpCisrICAgICdcJycgc2gKKysgICcKKytmaQorK2FzX2V4ZWN1dGFibGVfcD0kYXNfdGVzdF94CisrCisrIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIENQUCBuYW1lLgorK2FzX3RyX2NwcD0iZXZhbCBzZWQgJ3klKiRhc19jcl9sZXR0ZXJzJVAkYXNfY3JfTEVUVEVSUyU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCisrCisrIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIHZhcmlhYmxlIG5hbWUuCisrYXNfdHJfc2g9ImV2YWwgc2VkICd5JSorJXBwJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKKysKKysKKytleGVjIDY+JjEKKysKKysjIFNhdmUgdGhlIGxvZyBtZXNzYWdlLCB0byBrZWVwICRbMF0gYW5kIHNvIG9uIG1lYW5pbmdmdWwsIGFuZCB0bworKyMgcmVwb3J0IGFjdHVhbCBpbnB1dCB2YWx1ZXMgb2YgQ09ORklHX0ZJTEVTIGV0Yy4gaW5zdGVhZCBvZiB0aGVpcgorKyMgdmFsdWVzIGFmdGVyIG9wdGlvbnMgaGFuZGxpbmcuCisrYWNfbG9nPSIKKytUaGlzIGZpbGUgd2FzIGV4dGVuZGVkIGJ5ICRhc19tZSwgd2hpY2ggd2FzCisrZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjYzLiAgSW52b2NhdGlvbiBjb21tYW5kIGxpbmUgd2FzCisrCisrICBDT05GSUdfRklMRVMgICAgPSAkQ09ORklHX0ZJTEVTCisrICBDT05GSUdfSEVBREVSUyAgPSAkQ09ORklHX0hFQURFUlMKKysgIENPTkZJR19MSU5LUyAgICA9ICRDT05GSUdfTElOS1MKKysgIENPTkZJR19DT01NQU5EUyA9ICRDT05GSUdfQ09NTUFORFMKKysgICQgJDAgJEAKKyAKKy0gIGNhc2UgIiRhY19naXZlbl9zcmNkaXIiIGluCistICAuKSAgc3JjZGlyPS4KKy0gICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCistICAgICAgZWxzZSB0b3Bfc3JjZGlyPWBlY2hvICRhY19kb3RzfHNlZCAncyUvJCUlJ2A7IGZpIDs7CistICAvKikgc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiOyB0b3Bfc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyIiA7OworLSAgKikgIyBSZWxhdGl2ZSBwYXRoLgorLSAgICBzcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IgorLSAgICB0b3Bfc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIiIDs7CistICBlc2FjCisrb24gYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgCisrIgorKworK19BQ0VPRgorKworK2Nhc2UgJGFjX2NvbmZpZ19maWxlcyBpbiAqIgorKyIqKSBzZXQgeCAkYWNfY29uZmlnX2ZpbGVzOyBzaGlmdDsgYWNfY29uZmlnX2ZpbGVzPSQqOzsKKytlc2FjCisrCisrY2FzZSAkYWNfY29uZmlnX2hlYWRlcnMgaW4gKiIKKysiKikgc2V0IHggJGFjX2NvbmZpZ19oZWFkZXJzOyBzaGlmdDsgYWNfY29uZmlnX2hlYWRlcnM9JCo7OworK2VzYWMKKyAKKy0gIGNhc2UgIiRhY19naXZlbl9JTlNUQUxMIiBpbgorLSAgWy8kXSopIElOU1RBTEw9IiRhY19naXZlbl9JTlNUQUxMIiA7OworLSAgKikgSU5TVEFMTD0iJGFjX2RvdHMkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKKy0gIGVzYWMKKyAKKy0gIGVjaG8gY3JlYXRpbmcgIiRhY19maWxlIgorLSAgcm0gLWYgIiRhY19maWxlIgorLSAgY29uZmlndXJlX2lucHV0PSJHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGBlY2hvICRhY19maWxlX2lufHNlZCAncyUuKi8lJSdgIGJ5IGNvbmZpZ3VyZS4iCistICBjYXNlICIkYWNfZmlsZSIgaW4KKy0gICpNYWtlZmlsZSopIGFjX2NvbXN1Yj0iMWlcXAorLSMgJGNvbmZpZ3VyZV9pbnB1dCIgOzsKKy0gICopIGFjX2NvbXN1Yj0gOzsKKytjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKysjIEZpbGVzIHRoYXQgY29uZmlnLnN0YXR1cyB3YXMgbWFkZSBmb3IuCisrY29uZmlnX2ZpbGVzPSIkYWNfY29uZmlnX2ZpbGVzIgorK2NvbmZpZ19oZWFkZXJzPSIkYWNfY29uZmlnX2hlYWRlcnMiCisrCisrX0FDRU9GCisrCisrY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorK2FjX2NzX3VzYWdlPSJcCisrXGAkYXNfbWUnIGluc3RhbnRpYXRlcyBmaWxlcyBmcm9tIHRlbXBsYXRlcyBhY2NvcmRpbmcgdG8gdGhlCisrY3VycmVudCBjb25maWd1cmF0aW9uLgorKworK1VzYWdlOiAkMCBbT1BUSU9OXS4uLiBbRklMRV0uLi4KKysKKysgIC1oLCAtLWhlbHAgICAgICAgcHJpbnQgdGhpcyBoZWxwLCB0aGVuIGV4aXQKKysgIC1WLCAtLXZlcnNpb24gICAgcHJpbnQgdmVyc2lvbiBudW1iZXIgYW5kIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MsIHRoZW4gZXhpdAorKyAgLXEsIC0tcXVpZXQsIC0tc2lsZW50CisrICAgICAgICAgICAgICAgICAgIGRvIG5vdCBwcmludCBwcm9ncmVzcyBtZXNzYWdlcworKyAgLWQsIC0tZGVidWcgICAgICBkb24ndCByZW1vdmUgdGVtcG9yYXJ5IGZpbGVzCisrICAgICAgLS1yZWNoZWNrICAgIHVwZGF0ZSAkYXNfbWUgYnkgcmVjb25maWd1cmluZyBpbiB0aGUgc2FtZSBjb25kaXRpb25zCisrICAgICAgLS1maWxlPUZJTEVbOlRFTVBMQVRFXQorKyAgICAgICAgICAgICAgICAgICBpbnN0YW50aWF0ZSB0aGUgY29uZmlndXJhdGlvbiBmaWxlIEZJTEUKKysgICAgICAtLWhlYWRlcj1GSUxFWzpURU1QTEFURV0KKysgICAgICAgICAgICAgICAgICAgaW5zdGFudGlhdGUgdGhlIGNvbmZpZ3VyYXRpb24gaGVhZGVyIEZJTEUKKysKKytDb25maWd1cmF0aW9uIGZpbGVzOgorKyRjb25maWdfZmlsZXMKKysKKytDb25maWd1cmF0aW9uIGhlYWRlcnM6CisrJGNvbmZpZ19oZWFkZXJzCisrCisrUmVwb3J0IGJ1Z3MgdG8gPGJ1Zy1hdXRvY29uZkBnbnUub3JnPi4iCisrCisrX0FDRU9GCisrY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCisrYWNfY3NfdmVyc2lvbj0iXFwKKytjb25maWcuc3RhdHVzCisrY29uZmlndXJlZCBieSAkMCwgZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjYzLAorKyAgd2l0aCBvcHRpb25zIFxcImAkYXNfZWNobyAiJGFjX2NvbmZpZ3VyZV9hcmdzIiB8IHNlZCAncy9eIC8vOyBzL1tcXCIiXGBcJF0vXFxcXCYvZydgXFwiCisrCisrQ29weXJpZ2h0IChDKSAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorK1RoaXMgY29uZmlnLnN0YXR1cyBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorK2dpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4iCisrCisrYWNfcHdkPSckYWNfcHdkJworK3NyY2Rpcj0nJHNyY2RpcicKKytJTlNUQUxMPSckSU5TVEFMTCcKKyt0ZXN0IC1uICJcJEFXSyIgfHwgQVdLPWF3aworK19BQ0VPRgorKworK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKysjIFRoZSBkZWZhdWx0IGxpc3RzIGFwcGx5IGlmIHRoZSB1c2VyIGRvZXMgbm90IHNwZWNpZnkgYW55IGZpbGUuCisrYWNfbmVlZF9kZWZhdWx0cz06Cisrd2hpbGUgdGVzdCAkIyAhPSAwCisrZG8KKysgIGNhc2UgJDEgaW4KKysgIC0tKj0qKQorKyAgICBhY19vcHRpb249YGV4cHIgIlgkMSIgOiAnWFwoW149XSpcKT0nYAorKyAgICBhY19vcHRhcmc9YGV4cHIgIlgkMSIgOiAnWFtePV0qPVwoLipcKSdgCisrICAgIGFjX3NoaWZ0PToKKysgICAgOzsKKysgICopCisrICAgIGFjX29wdGlvbj0kMQorKyAgICBhY19vcHRhcmc9JDIKKysgICAgYWNfc2hpZnQ9c2hpZnQKKysgICAgOzsKKyAgIGVzYWMKKyAKKy0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCistICBzZWQgLWUgIiRhY19jb21zdWIKKy1zJUBjb25maWd1cmVfaW5wdXRAJSRjb25maWd1cmVfaW5wdXQlZworLXMlQHNyY2RpckAlJHNyY2RpciVnCistcyVAdG9wX3NyY2RpckAlJHRvcF9zcmNkaXIlZworLXMlQElOU1RBTExAJSRJTlNUQUxMJWcKKy0iICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+ICRhY19maWxlCistZmk7IGRvbmUKKy1ybSAtZiBjb25mdGVzdC5zKgorKyAgY2FzZSAkYWNfb3B0aW9uIGluCisrICAjIEhhbmRsaW5nIG9mIHRoZSBvcHRpb25zLgorKyAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCisrICAgIGFjX2NzX3JlY2hlY2s9OiA7OworKyAgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12IHwgLVYgKQorKyAgICAkYXNfZWNobyAiJGFjX2NzX3ZlcnNpb24iOyBleGl0IDs7CisrICAtLWRlYnVnIHwgLS1kZWJ1IHwgLS1kZWIgfCAtLWRlIHwgLS1kIHwgLWQgKQorKyAgICBkZWJ1Zz06IDs7CisrICAtLWZpbGUgfCAtLWZpbCB8IC0tZmkgfCAtLWYgKQorKyAgICAkYWNfc2hpZnQKKysgICAgY2FzZSAkYWNfb3B0YXJnIGluCisrICAgICpcJyopIGFjX29wdGFyZz1gJGFzX2VjaG8gIiRhY19vcHRhcmciIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7CisrICAgIGVzYWMKKysgICAgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTICckYWNfb3B0YXJnJyIKKysgICAgYWNfbmVlZF9kZWZhdWx0cz1mYWxzZTs7CisrICAtLWhlYWRlciB8IC0taGVhZGUgfCAtLWhlYWQgfCAtLWhlYSApCisrICAgICRhY19zaGlmdAorKyAgICBjYXNlICRhY19vcHRhcmcgaW4KKysgICAgKlwnKikgYWNfb3B0YXJnPWAkYXNfZWNobyAiJGFjX29wdGFyZyIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAgOzsKKysgICAgZXNhYworKyAgICBDT05GSUdfSEVBREVSUz0iJENPTkZJR19IRUFERVJTICckYWNfb3B0YXJnJyIKKysgICAgYWNfbmVlZF9kZWZhdWx0cz1mYWxzZTs7CisrICAtLWhlIHwgLS1oKQorKyAgICAjIENvbmZsaWN0IGJldHdlZW4gLS1oZWxwIGFuZCAtLWhlYWRlcgorKyAgICB7ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBhbWJpZ3VvdXMgb3B0aW9uOiAkMQorK1RyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiA+JjIKKysgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07OworKyAgLS1oZWxwIHwgLS1oZWwgfCAtaCApCisrICAgICRhc19lY2hvICIkYWNfY3NfdXNhZ2UiOyBleGl0IDs7CisrICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAorKyAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwgfCAtLXNpIHwgLS1zKQorKyAgICBhY19jc19zaWxlbnQ9OiA7OworKworKyAgIyBUaGlzIGlzIGFuIGVycm9yLgorKyAgLSopIHsgJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IHVucmVjb2duaXplZCBvcHRpb246ICQxCisrVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iID4mMgorKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfSA7OworKworKyAgKikgYWNfY29uZmlnX3RhcmdldHM9IiRhY19jb25maWdfdGFyZ2V0cyAkMSIKKysgICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2UgOzsKKyAKKy0jIFRoZXNlIHNlZCBjb21tYW5kcyBhcmUgcGFzc2VkIHRvIHNlZCBhcyAiQSBOQU1FIEIgTkFNRSBDIFZBTFVFIEQiLCB3aGVyZQorLSMgTkFNRSBpcyB0aGUgY3BwIG1hY3JvIGJlaW5nIGRlZmluZWQgYW5kIFZBTFVFIGlzIHRoZSB2YWx1ZSBpdCBpcyBiZWluZyBnaXZlbi4KKy0jCistIyBhY19kIHNldHMgdGhlIHZhbHVlIGluICIjZGVmaW5lIE5BTUUgVkFMVUUiIGxpbmVzLgorLWFjX2RBPSdzJV5cKFsgCV0qXCkjXChbIAldKmRlZmluZVsgCV1bIAldKlwpJworLWFjX2RCPSdcKFsgCV1bIAldKlwpW14gCV0qJVwxI1wyJworLWFjX2RDPSdcMycKKy1hY19kRD0nJWcnCistIyBhY191IHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KKy1hY191QT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKKy1hY191Qj0nXChbIAldXCklXDEjXDJkZWZpbmVcMycKKy1hY191Qz0nICcKKy1hY191RD0nXDQlZycKKy0jIGFjX2UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRob3V0IHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgorLWFjX2VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJworLWFjX2VCPSckJVwxI1wyZGVmaW5lXDMnCistYWNfZUM9JyAnCistYWNfZUQ9JyVnJworLQorLWlmIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgIT0gc2V0OyB0aGVuCistRU9GCistY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCistICBDT05GSUdfSEVBREVSUz0iY29tbW9uL2ljdWNmZy5oIgorLUVPRgorLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKKy1maQorLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfSEVBREVSUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KKy0gICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KKy0gIGNhc2UgIiRhY19maWxlIiBpbgorLSAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKKy0gICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7CistICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OworICAgZXNhYworKyAgc2hpZnQKKytkb25lCisrCisrYWNfY29uZmlndXJlX2V4dHJhX2FyZ3M9CisgCistICBlY2hvIGNyZWF0aW5nICRhY19maWxlCisraWYgJGFjX2NzX3NpbGVudDsgdGhlbgorKyAgZXhlYyA2Pi9kZXYvbnVsbAorKyAgYWNfY29uZmlndXJlX2V4dHJhX2FyZ3M9IiRhY19jb25maWd1cmVfZXh0cmFfYXJncyAtLXNpbGVudCIKKytmaQorKworK19BQ0VPRgorK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorK2lmIFwkYWNfY3NfcmVjaGVjazsgdGhlbgorKyAgc2V0IFggJyRTSEVMTCcgJyQwJyAkYWNfY29uZmlndXJlX2FyZ3MgXCRhY19jb25maWd1cmVfZXh0cmFfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbgorKyAgc2hpZnQKKysgIFwkYXNfZWNobyAicnVubmluZyBDT05GSUdfU0hFTEw9JFNIRUxMIFwkKiIgPiY2CisrICBDT05GSUdfU0hFTEw9JyRTSEVMTCcKKysgIGV4cG9ydCBDT05GSUdfU0hFTEwKKysgIGV4ZWMgIlwkQCIKKytmaQorIAorLSAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiBjb25mdGVzdC5vdXQKKy0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCistICBjYXQgJGFjX2ZpbGVfaW5wdXRzID4gY29uZnRlc3QuaW4KKy0KKy1FT0YKKy0KKy0jIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gYSBzZWQgc2NyaXB0IGNvbmZ0ZXN0LnZhbHMgdGhhdCBzdWJzdGl0dXRlcworLSMgdGhlIHByb3BlciB2YWx1ZXMgaW50byBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLiAgQW5kIGZpcnN0OgorLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCistIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgaW4gYW4gdW5xdW90ZWQgaGVyZSBkb2N1bWVudCBpbiBjb25maWcuc3RhdHVzLgorLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKKy1jYXQgPiBjb25mdGVzdC5oZHIgPDxcRU9GCistcy9bXFwmJV0vXFwmL2cKKy1zJVtcXCRgXSVcXCYlZworLXMlI2RlZmluZSBcKFtBLVphLXpfXVtBLVphLXowLTlfXSpcKSAqXCguKlwpJSR7YWNfZEF9XDEke2FjX2RCfVwxJHthY19kQ31cMiR7YWNfZER9JWdwCistcyVhY19kJWFjX3UlZ3AKKy1zJWFjX3UlYWNfZSVncAorLUVPRgorLXNlZCAtbiAtZiBjb25mdGVzdC5oZHIgY29uZmRlZnMuaCA+IGNvbmZ0ZXN0LnZhbHMKKy1ybSAtZiBjb25mdGVzdC5oZHIKKy0KKy0jIFRoaXMgc2VkIGNvbW1hbmQgcmVwbGFjZXMgI3VuZGVmIHdpdGggY29tbWVudHMuICBUaGlzIGlzIG5lY2Vzc2FyeSwgZm9yCistIyBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAorLSMgb24gc29tZSBzeXN0ZW1zIHdoZXJlIGNvbmZpZ3VyZSB3aWxsIG5vdCBkZWNpZGUgdG8gZGVmaW5lIGl0LgorLWNhdCA+PiBjb25mdGVzdC52YWxzIDw8XEVPRgorLXMlXlsgCV0qI1sgCV0qdW5kZWZbIAldWyAJXSpbYS16QS1aX11bYS16QS1aXzAtOV0qJS8qICYgKi8lCistRU9GCisrX0FDRU9GCisrY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorK2V4ZWMgNT4+Y29uZmlnLmxvZworK3sKKysgIGVjaG8KKysgIHNlZCAnaDtzLy4vLS9nO3MvXi4uLi8jIyAvO3MvLi4uJC8gIyMvO3A7eDtwO3gnIDw8X0FTQk9YCisrIyMgUnVubmluZyAkYXNfbWUuICMjCisrX0FTQk9YCisrICAkYXNfZWNobyAiJGFjX2xvZyIKKyt9ID4mNQorKworK19BQ0VPRgorK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorK19BQ0VPRgorIAorLSMgQnJlYWsgdXAgY29uZnRlc3QudmFscyBiZWNhdXNlIHNvbWUgc2hlbGxzIGhhdmUgYSBsaW1pdCBvbgorLSMgdGhlIHNpemUgb2YgaGVyZSBkb2N1bWVudHMsIGFuZCBvbGQgc2VkcyBoYXZlIHNtYWxsIGxpbWl0cyB0b28uCisrY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorIAorLXJtIC1mIGNvbmZ0ZXN0LnRhaWwKKy13aGlsZSA6CisrIyBIYW5kbGluZyBvZiBhcmd1bWVudHMuCisrZm9yIGFjX2NvbmZpZ190YXJnZXQgaW4gJGFjX2NvbmZpZ190YXJnZXRzCisgZG8KKy0gIGFjX2xpbmVzPWBncmVwIC1jIC4gY29uZnRlc3QudmFsc2AKKy0gICMgZ3JlcCAtYyBnaXZlcyBlbXB0eSBvdXRwdXQgZm9yIGFuIGVtcHR5IGZpbGUgb24gc29tZSBBSVggc3lzdGVtcy4KKy0gIGlmIHRlc3QgLXogIiRhY19saW5lcyIgfHwgdGVzdCAiJGFjX2xpbmVzIiAtZXEgMDsgdGhlbiBicmVhazsgZmkKKy0gICMgV3JpdGUgYSBsaW1pdGVkLXNpemUgaGVyZSBkb2N1bWVudCB0byBjb25mdGVzdC5mcmFnLgorLSAgZWNobyAnICBjYXQgPiBjb25mdGVzdC5mcmFnIDw8Q0VPRicgPj4gJENPTkZJR19TVEFUVVMKKy0gIHNlZCAke2FjX21heF9oZXJlX2xpbmVzfXEgY29uZnRlc3QudmFscyA+PiAkQ09ORklHX1NUQVRVUworLSAgZWNobyAnQ0VPRgorLSAgc2VkIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gPiBjb25mdGVzdC5vdXQKKy0gIHJtIC1mIGNvbmZ0ZXN0LmluCistICBtdiBjb25mdGVzdC5vdXQgY29uZnRlc3QuaW4KKy0nID4+ICRDT05GSUdfU1RBVFVTCistICBzZWQgMSwke2FjX21heF9oZXJlX2xpbmVzfWQgY29uZnRlc3QudmFscyA+IGNvbmZ0ZXN0LnRhaWwKKy0gIHJtIC1mIGNvbmZ0ZXN0LnZhbHMKKy0gIG12IGNvbmZ0ZXN0LnRhaWwgY29uZnRlc3QudmFscworLWRvbmUKKy1ybSAtZiBjb25mdGVzdC52YWxzCistCistY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorLSAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5oCistICBlY2hvICIvKiAkYWNfZmlsZS4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gICovIiA+IGNvbmZ0ZXN0LmgKKy0gIGNhdCBjb25mdGVzdC5pbiA+PiBjb25mdGVzdC5oCistICBybSAtZiBjb25mdGVzdC5pbgorLSAgaWYgY21wIC1zICRhY19maWxlIGNvbmZ0ZXN0LmggMj4vZGV2L251bGw7IHRoZW4KKy0gICAgZWNobyAiJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIgorLSAgICBybSAtZiBjb25mdGVzdC5oCisrICBjYXNlICRhY19jb25maWdfdGFyZ2V0IGluCisrICAgICJjb21tb24vaWN1Y2ZnLmgiKSBDT05GSUdfSEVBREVSUz0iJENPTkZJR19IRUFERVJTIGNvbW1vbi9pY3VjZmcuaCIgOzsKKysgICAgImljdWRlZnMubWsiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgaWN1ZGVmcy5tayIgOzsKKysgICAgIk1ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIE1ha2VmaWxlIiA7OworKyAgICAiZGF0YS9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBkYXRhL01ha2VmaWxlIiA7OworKyAgICAiZGF0YS9pY3Vwa2cuaW5jIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGRhdGEvaWN1cGtnLmluYyIgOzsKKysgICAgImNvbW1vbi9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBjb21tb24vTWFrZWZpbGUiIDs7CisrICAgICJjb25maWcvTWFrZWZpbGUuaW5jIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGNvbmZpZy9NYWtlZmlsZS5pbmMiIDs7CisrICAgICJpMThuL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGkxOG4vTWFrZWZpbGUiIDs7CisrICAgICJsYXlvdXQvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgbGF5b3V0L01ha2VmaWxlIiA7OworKyAgICAibGF5b3V0ZXgvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgbGF5b3V0ZXgvTWFrZWZpbGUiIDs7CisrICAgICJpby9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBpby9NYWtlZmlsZSIgOzsKKysgICAgImV4dHJhL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGV4dHJhL01ha2VmaWxlIiA7OworKyAgICAiZXh0cmEvdWNvbnYvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgZXh0cmEvdWNvbnYvTWFrZWZpbGUiIDs7CisrICAgICJleHRyYS9zY3JwdHJ1bi9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBleHRyYS9zY3JwdHJ1bi9NYWtlZmlsZSIgOzsKKysgICAgInN0dWJkYXRhL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHN0dWJkYXRhL01ha2VmaWxlIiA7OworKyAgICAidG9vbHMvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgdG9vbHMvTWFrZWZpbGUiIDs7CisrICAgICJ0b29scy9jdGVzdGZ3L01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRvb2xzL2N0ZXN0ZncvTWFrZWZpbGUiIDs7CisrICAgICJ0b29scy9tYWtlY29udi9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB0b29scy9tYWtlY29udi9NYWtlZmlsZSIgOzsKKysgICAgInRvb2xzL2dlbnJiL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRvb2xzL2dlbnJiL01ha2VmaWxlIiA7OworKyAgICAidG9vbHMvZ2VudWNhL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRvb2xzL2dlbnVjYS9NYWtlZmlsZSIgOzsKKysgICAgInRvb2xzL2dlbmNjb2RlL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRvb2xzL2dlbmNjb2RlL01ha2VmaWxlIiA7OworKyAgICAidG9vbHMvZ2VuY21uL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRvb2xzL2dlbmNtbi9NYWtlZmlsZSIgOzsKKysgICAgInRvb2xzL2dlbmNudmFsL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRvb2xzL2dlbmNudmFsL01ha2VmaWxlIiA7OworKyAgICAidG9vbHMvZ2VubmFtZXMvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgdG9vbHMvZ2VubmFtZXMvTWFrZWZpbGUiIDs7CisrICAgICJ0b29scy9nZW50ZXN0L01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRvb2xzL2dlbnRlc3QvTWFrZWZpbGUiIDs7CisrICAgICJ0b29scy9nZW5ub3JtL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRvb2xzL2dlbm5vcm0vTWFrZWZpbGUiIDs7CisrICAgICJ0b29scy9nZW5wcm9wcy9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB0b29scy9nZW5wcm9wcy9NYWtlZmlsZSIgOzsKKysgICAgInRvb2xzL2dlbnBuYW1lL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRvb2xzL2dlbnBuYW1lL01ha2VmaWxlIiA7OworKyAgICAidG9vbHMvZ2VuYnJrL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRvb2xzL2dlbmJyay9NYWtlZmlsZSIgOzsKKysgICAgInRvb2xzL2dlbnNwcmVwL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRvb2xzL2dlbnNwcmVwL01ha2VmaWxlIiA7OworKyAgICAidG9vbHMvaWN1c3dhcC9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB0b29scy9pY3Vzd2FwL01ha2VmaWxlIiA7OworKyAgICAidG9vbHMvcGtnZGF0YS9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB0b29scy9wa2dkYXRhL01ha2VmaWxlIiA7OworKyAgICAidG9vbHMvdG9vbHV0aWwvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgdG9vbHMvdG9vbHV0aWwvTWFrZWZpbGUiIDs7CisrICAgICJ0b29scy9kdW1wY2UvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgdG9vbHMvZHVtcGNlL01ha2VmaWxlIiA7OworKyAgICAidGVzdC9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB0ZXN0L01ha2VmaWxlIiA7OworKyAgICAidGVzdC90ZXN0ZGF0YS9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB0ZXN0L3Rlc3RkYXRhL01ha2VmaWxlIiA7OworKyAgICAidGVzdC9oZHJ0c3QvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgdGVzdC9oZHJ0c3QvTWFrZWZpbGUiIDs7CisrICAgICJ0ZXN0L2ludGx0ZXN0L01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRlc3QvaW50bHRlc3QvTWFrZWZpbGUiIDs7CisrICAgICJ0ZXN0L2NpbnRsdHN0L01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRlc3QvY2ludGx0c3QvTWFrZWZpbGUiIDs7CisrICAgICJ0ZXN0L2lvdGVzdC9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB0ZXN0L2lvdGVzdC9NYWtlZmlsZSIgOzsKKysgICAgInRlc3QvdGhhaXRlc3QvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgdGVzdC90aGFpdGVzdC9NYWtlZmlsZSIgOzsKKysgICAgInRlc3QvdGVzdG1hcC9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB0ZXN0L3Rlc3RtYXAvTWFrZWZpbGUiIDs7CisrICAgICJ0ZXN0L2xldGVzdC9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB0ZXN0L2xldGVzdC9NYWtlZmlsZSIgOzsKKysgICAgInRlc3QvdGhyZWFkdGVzdC9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB0ZXN0L3RocmVhZHRlc3QvTWFrZWZpbGUiIDs7CisrICAgICJzYW1wbGVzL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHNhbXBsZXMvTWFrZWZpbGUiIDs7CisrICAgICJzYW1wbGVzL2RhdGUvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgc2FtcGxlcy9kYXRlL01ha2VmaWxlIiA7OworKyAgICAic2FtcGxlcy9jYWwvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgc2FtcGxlcy9jYWwvTWFrZWZpbGUiIDs7CisrICAgICJzYW1wbGVzL2xheW91dC9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBzYW1wbGVzL2xheW91dC9NYWtlZmlsZSIgOzsKKysgICAgImNvbW1vbi91bmljb2RlL3BsYXRmb3JtLmgiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgY29tbW9uL3VuaWNvZGUvcGxhdGZvcm0uaCIgOzsKKysKKysgICopIHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBpbnZhbGlkIGFyZ3VtZW50OiAkYWNfY29uZmlnX3RhcmdldCIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgYXJndW1lbnQ6ICRhY19jb25maWdfdGFyZ2V0IiA+JjI7fQorKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTs7CisrICBlc2FjCisrZG9uZQorKworKworKyMgSWYgdGhlIHVzZXIgZGlkIG5vdCB1c2UgdGhlIGFyZ3VtZW50cyB0byBzcGVjaWZ5IHRoZSBpdGVtcyB0byBpbnN0YW50aWF0ZSwKKysjIHRoZW4gdGhlIGVudnZhciBpbnRlcmZhY2UgaXMgdXNlZC4gIFNldCBvbmx5IHRob3NlIHRoYXQgYXJlIG5vdC4KKysjIFdlIHVzZSB0aGUgbG9uZyBmb3JtIGZvciB0aGUgZGVmYXVsdCBhc3NpZ25tZW50IGJlY2F1c2Ugb2YgYW4gZXh0cmVtZWx5CisrIyBiaXphcnJlIGJ1ZyBvbiBTdW5PUyA0LjEuMy4KKytpZiAkYWNfbmVlZF9kZWZhdWx0czsgdGhlbgorKyAgdGVzdCAiJHtDT05GSUdfRklMRVMrc2V0fSIgPSBzZXQgfHwgQ09ORklHX0ZJTEVTPSRjb25maWdfZmlsZXMKKysgIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgPSBzZXQgfHwgQ09ORklHX0hFQURFUlM9JGNvbmZpZ19oZWFkZXJzCisrZmkKKysKKysjIEhhdmUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGZvciBjb252ZW5pZW5jZS4gIE1ha2UgaXQgaW4gdGhlIGJ1aWxkIHRyZWUKKysjIHNpbXBseSBiZWNhdXNlIHRoZXJlIGlzIG5vIHJlYXNvbiBhZ2FpbnN0IGhhdmluZyBpdCBoZXJlLCBhbmQgaW4gYWRkaXRpb24sCisrIyBjcmVhdGluZyBhbmQgbW92aW5nIGZpbGVzIGZyb20gL3RtcCBjYW4gc29tZXRpbWVzIGNhdXNlIHByb2JsZW1zLgorKyMgSG9vayBmb3IgaXRzIHJlbW92YWwgdW5sZXNzIGRlYnVnZ2luZy4KKysjIE5vdGUgdGhhdCB0aGVyZSBpcyBhIHNtYWxsIHdpbmRvdyBpbiB3aGljaCB0aGUgZGlyZWN0b3J5IHdpbGwgbm90IGJlIGNsZWFuZWQ6CisrIyBhZnRlciBpdHMgY3JlYXRpb24gYnV0IGJlZm9yZSBpdHMgbmFtZSBoYXMgYmVlbiBhc3NpZ25lZCB0byBgJHRtcCcuCisrJGRlYnVnIHx8CisreworKyAgdG1wPQorKyAgdHJhcCAnZXhpdF9zdGF0dXM9JD8KKysgIHsgdGVzdCAteiAiJHRtcCIgfHwgdGVzdCAhIC1kICIkdG1wIiB8fCBybSAtZnIgIiR0bXAiOyB9ICYmIGV4aXQgJGV4aXRfc3RhdHVzCisrJyAwCisrICB0cmFwICd7IChleGl0IDEpOyBleGl0IDE7IH0nIDEgMiAxMyAxNQorK30KKysjIENyZWF0ZSBhIChzZWN1cmUpIHRtcCBkaXJlY3RvcnkgZm9yIHRtcCBmaWxlcy4KKysKKyt7CisrICB0bXA9YCh1bWFzayAwNzcgJiYgbWt0ZW1wIC1kICIuL2NvbmZYWFhYWFgiKSAyPi9kZXYvbnVsbGAgJiYKKysgIHRlc3QgLW4gIiR0bXAiICYmIHRlc3QgLWQgIiR0bXAiCisrfSAgfHwKKyt7CisrICB0bXA9Li9jb25mJCQtJFJBTkRPTQorKyAgKHVtYXNrIDA3NyAmJiBta2RpciAiJHRtcCIpCisrfSB8fAorK3sKKysgICAkYXNfZWNobyAiJGFzX21lOiBjYW5ub3QgY3JlYXRlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiAuIiA+JjIKKysgICB7IChleGl0IDEpOyBleGl0IDE7IH0KKyt9CisrCisrIyBTZXQgdXAgdGhlIHNjcmlwdHMgZm9yIENPTkZJR19GSUxFUyBzZWN0aW9uLgorKyMgTm8gbmVlZCB0byBnZW5lcmF0ZSB0aGVtIGlmIHRoZXJlIGFyZSBubyBDT05GSUdfRklMRVMuCisrIyBUaGlzIGhhcHBlbnMgZm9yIGluc3RhbmNlIHdpdGggYC4vY29uZmlnLnN0YXR1cyBjb25maWcuaCcuCisraWYgdGVzdCAtbiAiJENPTkZJR19GSUxFUyI7IHRoZW4KKysKKysKKythY19jcj0nCisnCisrYWNfY3NfYXdrX2NyPWAkQVdLICdCRUdJTiB7IHByaW50ICJhXHJiIiB9JyA8L2Rldi9udWxsIDI+L2Rldi9udWxsYAorK2lmIHRlc3QgIiRhY19jc19hd2tfY3IiID0gImEke2FjX2NyfWIiOyB0aGVuCisrICBhY19jc19hd2tfY3I9J1xccicKKytlbHNlCisrICBhY19jc19hd2tfY3I9JGFjX2NyCisrZmkKKysKKytlY2hvICdCRUdJTiB7JyA+IiR0bXAvc3ViczEuYXdrIiAmJgorK19BQ0VPRgorKworKworK3sKKysgIGVjaG8gImNhdCA+Y29uZiQkc3Vicy5hd2sgPDxfQUNFT0YiICYmCisrICBlY2hvICIkYWNfc3Vic3RfdmFycyIgfCBzZWQgJ3MvLiovJiEkJiRhY19kZWxpbS8nICYmCisrICBlY2hvICJfQUNFT0YiCisrfSA+Y29uZiQkc3Vicy5zaCB8fAorKyAgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNvdWxkIG5vdCBtYWtlICRDT05GSUdfU1RBVFVTIiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogY291bGQgbm90IG1ha2UgJENPTkZJR19TVEFUVVMiID4mMjt9CisrICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisrYWNfZGVsaW1fbnVtPWBlY2hvICIkYWNfc3Vic3RfdmFycyIgfCBncmVwIC1jICckJ2AKKythY19kZWxpbT0nJSFfISMgJworK2ZvciBhY19sYXN0X3RyeSBpbiBmYWxzZSBmYWxzZSBmYWxzZSBmYWxzZSBmYWxzZSA6OyBkbworKyAgLiAuL2NvbmYkJHN1YnMuc2ggfHwKKysgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNvdWxkIG5vdCBtYWtlICRDT05GSUdfU1RBVFVTIiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogY291bGQgbm90IG1ha2UgJENPTkZJR19TVEFUVVMiID4mMjt9CisrICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisrCisrICBhY19kZWxpbV9uPWBzZWQgLW4gInMvLiokYWNfZGVsaW1cJC9YL3AiIGNvbmYkJHN1YnMuYXdrIHwgZ3JlcCAtYyBYYAorKyAgaWYgdGVzdCAkYWNfZGVsaW1fbiA9ICRhY19kZWxpbV9udW07IHRoZW4KKysgICAgYnJlYWsKKysgIGVsaWYgJGFjX2xhc3RfdHJ5OyB0aGVuCisrICAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjb3VsZCBub3QgbWFrZSAkQ09ORklHX1NUQVRVUyIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGNvdWxkIG5vdCBtYWtlICRDT05GSUdfU1RBVFVTIiA+JjI7fQorKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorKyAgZWxzZQorKyAgICBhY19kZWxpbT0iJGFjX2RlbGltISRhY19kZWxpbSBfJGFjX2RlbGltISEgIgorKyAgZmkKKytkb25lCisrcm0gLWYgY29uZiQkc3Vicy5zaAorKworK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorK2NhdCA+PiJcJHRtcC9zdWJzMS5hd2siIDw8XFxfQUNBV0sgJiYKKytfQUNFT0YKKytzZWQgLW4gJworK2gKKytzL14vU1siLzsgcy8hLiovIl09LworK3AKKytnCisrcy9eW14hXSohLy8KKys6cmVwbAorK3QgcmVwbAorK3MvJyIkYWNfZGVsaW0iJyQvLworK3QgZGVsaW0KKys6bmwKKytoCisrcy9cKC5cezE0OFx9XCkuKi9cMS8KKyt0IG1vcmUxCisrcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvXFxuIlxcLworK3AKKytuCisrYiByZXBsCisrOm1vcmUxCisrcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvIlxcLworK3AKKytnCisrcy8uXHsxNDhcfS8vCisrdCBubAorKzpkZWxpbQorK2gKKytzL1woLlx7MTQ4XH1cKS4qL1wxLworK3QgbW9yZTIKKytzL1siXFxdL1xcJi9nOyBzL14vIi87IHMvJC8iLworK3AKKytiCisrOm1vcmUyCisrcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvIlxcLworK3AKKytnCisrcy8uXHsxNDhcfS8vCisrdCBkZWxpbQorKycgPGNvbmYkJHN1YnMuYXdrIHwgc2VkICcKKysvXlteIiJdL3sKKysgIE4KKysgIHMvXG4vLworK30KKysnID4+JENPTkZJR19TVEFUVVMgfHwgYWNfd3JpdGVfZmFpbD0xCisrcm0gLWYgY29uZiQkc3Vicy5hd2sKKytjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKytfQUNBV0sKKytjYXQgPj4iXCR0bXAvc3ViczEuYXdrIiA8PF9BQ0FXSyAmJgorKyAgZm9yIChrZXkgaW4gUykgU19pc19zZXRba2V5XSA9IDEKKysgIEZTID0gIgciCisrCisrfQorK3sKKysgIGxpbmUgPSAkIDAKKysgIG5maWVsZHMgPSBzcGxpdChsaW5lLCBmaWVsZCwgIkAiKQorKyAgc3Vic3RlZCA9IDAKKysgIGxlbiA9IGxlbmd0aChmaWVsZFsxXSkKKysgIGZvciAoaSA9IDI7IGkgPCBuZmllbGRzOyBpKyspIHsKKysgICAga2V5ID0gZmllbGRbaV0KKysgICAga2V5bGVuID0gbGVuZ3RoKGtleSkKKysgICAgaWYgKFNfaXNfc2V0W2tleV0pIHsKKysgICAgICB2YWx1ZSA9IFNba2V5XQorKyAgICAgIGxpbmUgPSBzdWJzdHIobGluZSwgMSwgbGVuKSAiIiB2YWx1ZSAiIiBzdWJzdHIobGluZSwgbGVuICsga2V5bGVuICsgMykKKysgICAgICBsZW4gKz0gbGVuZ3RoKHZhbHVlKSArIGxlbmd0aChmaWVsZFsrK2ldKQorKyAgICAgIHN1YnN0ZWQgPSAxCisrICAgIH0gZWxzZQorKyAgICAgIGxlbiArPSAxICsga2V5bGVuCisrICB9CisrCisrICBwcmludCBsaW5lCisrfQorKworK19BQ0FXSworK19BQ0VPRgorK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKytpZiBzZWQgInMvJGFjX2NyLy8iIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KKysgIHNlZCAicy8kYWNfY3JcJC8vOyBzLyRhY19jci8kYWNfY3NfYXdrX2NyL2ciCisrZWxzZQorKyAgY2F0CisrZmkgPCAiJHRtcC9zdWJzMS5hd2siID4gIiR0bXAvc3Vicy5hd2siIFwKKysgIHx8IHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjb3VsZCBub3Qgc2V0dXAgY29uZmlnIGZpbGVzIG1hY2hpbmVyeSIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGNvdWxkIG5vdCBzZXR1cCBjb25maWcgZmlsZXMgbWFjaGluZXJ5IiA+JjI7fQorKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorK19BQ0VPRgorKworKyMgVlBBVEggbWF5IGNhdXNlIHRyb3VibGUgd2l0aCBzb21lIG1ha2VzLCBzbyB3ZSByZW1vdmUgJChzcmNkaXIpLAorKyMgJHtzcmNkaXJ9IGFuZCBAc3JjZGlyQCBmcm9tIFZQQVRIIGlmIHNyY2RpciBpcyAiLiIsIHN0cmlwIGxlYWRpbmcgYW5kCisrIyB0cmFpbGluZyBjb2xvbnMgYW5kIHRoZW4gcmVtb3ZlIHRoZSB3aG9sZSBsaW5lIGlmIFZQQVRIIGJlY29tZXMgZW1wdHkKKysjIChhY3R1YWxseSB3ZSBsZWF2ZSBhbiBlbXB0eSBsaW5lIHRvIHByZXNlcnZlIGxpbmUgbnVtYmVycykuCisraWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KKysgIGFjX3Zwc3ViPScvXlsJIF0qVlBBVEhbCSBdKj0veworK3MvOipcJChzcmNkaXIpOiovOi8KKytzLzoqXCR7c3JjZGlyfToqLzovCisrcy86KkBzcmNkaXJAOiovOi8KKytzL15cKFtePV0qPVsJIF0qXCk6Ki9cMS8KKytzLzoqJC8vCisrcy9eW149XSo9WwkgXSokLy8KKyt9JworK2ZpCisrCisrY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorK2ZpICMgdGVzdCAtbiAiJENPTkZJR19GSUxFUyIKKysKKysjIFNldCB1cCB0aGUgc2NyaXB0cyBmb3IgQ09ORklHX0hFQURFUlMgc2VjdGlvbi4KKysjIE5vIG5lZWQgdG8gZ2VuZXJhdGUgdGhlbSBpZiB0aGVyZSBhcmUgbm8gQ09ORklHX0hFQURFUlMuCisrIyBUaGlzIGhhcHBlbnMgZm9yIGluc3RhbmNlIHdpdGggYC4vY29uZmlnLnN0YXR1cyBNYWtlZmlsZScuCisraWYgdGVzdCAtbiAiJENPTkZJR19IRUFERVJTIjsgdGhlbgorK2NhdCA+IiR0bXAvZGVmaW5lcy5hd2siIDw8XF9BQ0FXSyB8fAorK0JFR0lOIHsKKytfQUNFT0YKKysKKysjIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gYW4gYXdrIHNjcmlwdCBgZGVmaW5lcy5hd2snLCBlbWJlZGRlZCBhcworKyMgaGVyZS1kb2N1bWVudCBpbiBjb25maWcuc3RhdHVzLCB0aGF0IHN1YnN0aXR1dGVzIHRoZSBwcm9wZXIgdmFsdWVzIGludG8KKysjIGNvbmZpZy5oLmluIHRvIHByb2R1Y2UgY29uZmlnLmguCisrCisrIyBDcmVhdGUgYSBkZWxpbWl0ZXIgc3RyaW5nIHRoYXQgZG9lcyBub3QgZXhpc3QgaW4gY29uZmRlZnMuaCwgdG8gZWFzZQorKyMgaGFuZGxpbmcgb2YgbG9uZyBsaW5lcy4KKythY19kZWxpbT0nJSFfISMgJworK2ZvciBhY19sYXN0X3RyeSBpbiBmYWxzZSBmYWxzZSA6OyBkbworKyAgYWNfdD1gc2VkIC1uICIvJGFjX2RlbGltL3AiIGNvbmZkZWZzLmhgCisrICBpZiB0ZXN0IC16ICIkYWNfdCI7IHRoZW4KKysgICAgYnJlYWsKKysgIGVsaWYgJGFjX2xhc3RfdHJ5OyB0aGVuCisrICAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjb3VsZCBub3QgbWFrZSAkQ09ORklHX0hFQURFUlMiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBjb3VsZCBub3QgbWFrZSAkQ09ORklHX0hFQURFUlMiID4mMjt9CisrICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisgICBlbHNlCistICAgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgorLSAgICAgIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCistICAgICAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCistICAgICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KKy0gICAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgorKyAgICBhY19kZWxpbT0iJGFjX2RlbGltISRhY19kZWxpbSBfJGFjX2RlbGltISEgIgorKyAgZmkKKytkb25lCisrCisrIyBGb3IgdGhlIGF3ayBzY3JpcHQsIEQgaXMgYW4gYXJyYXkgb2YgbWFjcm8gdmFsdWVzIGtleWVkIGJ5IG5hbWUsCisrIyBsaWtld2lzZSBQIGNvbnRhaW5zIG1hY3JvIHBhcmFtZXRlcnMgaWYgYW55LiAgUHJlc2VydmUgYmFja3NsYXNoCisrIyBuZXdsaW5lIHNlcXVlbmNlcy4KKysKKythY193b3JkX3JlPVtfJGFzX2NyX0xldHRlcnNdW18kYXNfY3JfYWxudW1dKgorK3NlZCAtbiAnCisrcy8uXHsxNDhcfS8mJyIkYWNfZGVsaW0iJy9nCisrdCByc2V0CisrOnJzZXQKKytzL15bCSBdKiNbCSBdKmRlZmluZVsJIF1bCSBdKi8gLworK3QgZGVmCisrZAorKzpkZWYKKytzL1xcJC8vCisrdCBic25sCisrcy9bIlxcXS9cXCYvZworK3MvXiBcKCciJGFjX3dvcmRfcmUiJ1wpXCgoW14oKV0qKVwpWwkgXSpcKC4qXCkvUFsiXDEiXT0iXDIiXAorK0RbIlwxIl09IiBcMyIvcAorK3MvXiBcKCciJGFjX3dvcmRfcmUiJ1wpWwkgXSpcKC4qXCkvRFsiXDEiXT0iIFwyIi9wCisrZAorKzpic25sCisrcy9bIlxcXS9cXCYvZworK3MvXiBcKCciJGFjX3dvcmRfcmUiJ1wpXCgoW14oKV0qKVwpWwkgXSpcKC4qXCkvUFsiXDEiXT0iXDIiXAorK0RbIlwxIl09IiBcM1xcXFxcXG4iXFwvcAorK3QgY29udAorK3MvXiBcKCciJGFjX3dvcmRfcmUiJ1wpWwkgXSpcKC4qXCkvRFsiXDEiXT0iIFwyXFxcXFxcbiJcXC9wCisrdCBjb250CisrZAorKzpjb250CisrbgorK3MvLlx7MTQ4XH0vJiciJGFjX2RlbGltIicvZworK3QgY2xlYXIKKys6Y2xlYXIKKytzL1xcJC8vCisrdCBic25sYworK3MvWyJcXF0vXFwmL2c7IHMvXi8iLzsgcy8kLyIvcAorK2QKKys6YnNubGMKKytzL1siXFxdL1xcJi9nOyBzL14vIi87IHMvJC9cXFxcXFxuIlxcL3AKKytiIGNvbnQKKysnIDxjb25mZGVmcy5oIHwgc2VkICcKKytzLyciJGFjX2RlbGltIicvIlxcXAorKyIvZycgPj4kQ09ORklHX1NUQVRVUyB8fCBhY193cml0ZV9mYWlsPTEKKysKKytjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKysgIGZvciAoa2V5IGluIEQpIERfaXNfc2V0W2tleV0gPSAxCisrICBGUyA9ICIHIgorK30KKysvXltcdCBdKiNbXHQgXSooZGVmaW5lfHVuZGVmKVtcdCBdKyRhY193b3JkX3JlKFtcdCAoXXxcJCkvIHsKKysgIGxpbmUgPSBcJCAwCisrICBzcGxpdChsaW5lLCBhcmcsICIgIikKKysgIGlmIChhcmdbMV0gPT0gIiMiKSB7CisrICAgIGRlZnVuZGVmID0gYXJnWzJdCisrICAgIG1hYzEgPSBhcmdbM10KKysgIH0gZWxzZSB7CisrICAgIGRlZnVuZGVmID0gc3Vic3RyKGFyZ1sxXSwgMikKKysgICAgbWFjMSA9IGFyZ1syXQorKyAgfQorKyAgc3BsaXQobWFjMSwgbWFjMiwgIigiKSAjKQorKyAgbWFjcm8gPSBtYWMyWzFdCisrICBwcmVmaXggPSBzdWJzdHIobGluZSwgMSwgaW5kZXgobGluZSwgZGVmdW5kZWYpIC0gMSkKKysgIGlmIChEX2lzX3NldFttYWNyb10pIHsKKysgICAgIyBQcmVzZXJ2ZSB0aGUgd2hpdGUgc3BhY2Ugc3Vycm91bmRpbmcgdGhlICIjIi4KKysgICAgcHJpbnQgcHJlZml4ICJkZWZpbmUiLCBtYWNybyBQW21hY3JvXSBEW21hY3JvXQorKyAgICBuZXh0CisrICB9IGVsc2UgeworKyAgICAjIFJlcGxhY2UgI3VuZGVmIHdpdGggY29tbWVudHMuICBUaGlzIGlzIG5lY2Vzc2FyeSwgZm9yIGV4YW1wbGUsCisrICAgICMgaW4gdGhlIGNhc2Ugb2YgX1BPU0lYX1NPVVJDRSwgd2hpY2ggaXMgcHJlZGVmaW5lZCBhbmQgcmVxdWlyZWQKKysgICAgIyBvbiBzb21lIHN5c3RlbXMgd2hlcmUgY29uZmlndXJlIHdpbGwgbm90IGRlY2lkZSB0byBkZWZpbmUgaXQuCisrICAgIGlmIChkZWZ1bmRlZiA9PSAidW5kZWYiKSB7CisrICAgICAgcHJpbnQgIi8qIiwgcHJlZml4IGRlZnVuZGVmLCBtYWNybywgIiovIgorKyAgICAgIG5leHQKKysgICAgfQorKyAgfQorK30KKyt7IHByaW50IH0KKytfQUNBV0sKKytfQUNFT0YKKytjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCisrICB7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY291bGQgbm90IHNldHVwIGNvbmZpZyBoZWFkZXJzIG1hY2hpbmVyeSIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGNvdWxkIG5vdCBzZXR1cCBjb25maWcgaGVhZGVycyBtYWNoaW5lcnkiID4mMjt9CisrICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisrZmkgIyB0ZXN0IC1uICIkQ09ORklHX0hFQURFUlMiCisrCisrCisrZXZhbCBzZXQgWCAiICA6RiAkQ09ORklHX0ZJTEVTICA6SCAkQ09ORklHX0hFQURFUlMgICAgIgorK3NoaWZ0CisrZm9yIGFjX3RhZworK2RvCisrICBjYXNlICRhY190YWcgaW4KKysgIDpbRkhMQ10pIGFjX21vZGU9JGFjX3RhZzsgY29udGludWU7OworKyAgZXNhYworKyAgY2FzZSAkYWNfbW9kZSRhY190YWcgaW4KKysgIDpbRkhMXSo6Kik7OworKyAgOkwqIHwgOkMqOiopIHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBpbnZhbGlkIHRhZyAkYWNfdGFnIiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCB0YWcgJGFjX3RhZyIgPiYyO30KKysgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07OworKyAgOltGSF0tKSBhY190YWc9LTotOzsKKysgIDpbRkhdKikgYWNfdGFnPSRhY190YWc6JGFjX3RhZy5pbjs7CisrICBlc2FjCisrICBhY19zYXZlX0lGUz0kSUZTCisrICBJRlM9OgorKyAgc2V0IHggJGFjX3RhZworKyAgSUZTPSRhY19zYXZlX0lGUworKyAgc2hpZnQKKysgIGFjX2ZpbGU9JDEKKysgIHNoaWZ0CisrCisrICBjYXNlICRhY19tb2RlIGluCisrICA6TCkgYWNfc291cmNlPSQxOzsKKysgIDpbRkhdKQorKyAgICBhY19maWxlX2lucHV0cz0KKysgICAgZm9yIGFjX2YKKysgICAgZG8KKysgICAgICBjYXNlICRhY19mIGluCisrICAgICAgLSkgYWNfZj0iJHRtcC9zdGRpbiI7OworKyAgICAgICopICMgTG9vayBmb3IgdGhlIGZpbGUgZmlyc3QgaW4gdGhlIGJ1aWxkIHRyZWUsIHRoZW4gaW4gdGhlIHNvdXJjZSB0cmVlCisrCSAjIChpZiB0aGUgcGF0aCBpcyBub3QgYWJzb2x1dGUpLiAgVGhlIGFic29sdXRlIHBhdGggY2Fubm90IGJlIERPUy1zdHlsZSwKKysJICMgYmVjYXVzZSAkYWNfZiBjYW5ub3QgY29udGFpbiBgOicuCisrCSB0ZXN0IC1mICIkYWNfZiIgfHwKKysJICAgY2FzZSAkYWNfZiBpbgorKwkgICBbXFwvJF0qKSBmYWxzZTs7CisrCSAgICopIHRlc3QgLWYgIiRzcmNkaXIvJGFjX2YiICYmIGFjX2Y9IiRzcmNkaXIvJGFjX2YiOzsKKysJICAgZXNhYyB8fAorKwkgICB7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGZpbmQgaW5wdXQgZmlsZTogJGFjX2YiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgZmluZCBpbnB1dCBmaWxlOiAkYWNfZiIgPiYyO30KKysgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07OworKyAgICAgIGVzYWMKKysgICAgICBjYXNlICRhY19mIGluICpcJyopIGFjX2Y9YCRhc19lY2hvICIkYWNfZiIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImA7OyBlc2FjCisrICAgICAgYWNfZmlsZV9pbnB1dHM9IiRhY19maWxlX2lucHV0cyAnJGFjX2YnIgorKyAgICBkb25lCisrCisrICAgICMgTGV0J3Mgc3RpbGwgcHJldGVuZCBpdCBpcyBgY29uZmlndXJlJyB3aGljaCBpbnN0YW50aWF0ZXMgKGkuZS4sIGRvbid0CisrICAgICMgdXNlICRhc19tZSksIHBlb3BsZSB3b3VsZCBiZSBzdXJwcmlzZWQgdG8gcmVhZDoKKysgICAgIyAgICAvKiBjb25maWcuaC4gIEdlbmVyYXRlZCBieSBjb25maWcuc3RhdHVzLiAgKi8KKysgICAgY29uZmlndXJlX2lucHV0PSdHZW5lcmF0ZWQgZnJvbSAnYAorKwkgICRhc19lY2hvICIkKiIgfCBzZWQgJ3N8XlteOl0qL3x8O3N8OlteOl0qL3wsIHxnJworKwlgJyBieSBjb25maWd1cmUuJworKyAgICBpZiB0ZXN0IHgiJGFjX2ZpbGUiICE9IHgtOyB0aGVuCisrICAgICAgY29uZmlndXJlX2lucHV0PSIkYWNfZmlsZS4gICRjb25maWd1cmVfaW5wdXQiCisrICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNyZWF0aW5nICRhY19maWxlIiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBjcmVhdGluZyAkYWNfZmlsZSIgPiY2O30KKysgICAgZmkKKysgICAgIyBOZXV0cmFsaXplIHNwZWNpYWwgY2hhcmFjdGVycyBpbnRlcnByZXRlZCBieSBzZWQgaW4gcmVwbGFjZW1lbnQgc3RyaW5ncy4KKysgICAgY2FzZSAkY29uZmlndXJlX2lucHV0IGluICMoCisrICAgICpcJiogfCAqXHwqIHwgKlxcKiApCisrICAgICAgIGFjX3NlZF9jb25mX2lucHV0PWAkYXNfZWNobyAiJGNvbmZpZ3VyZV9pbnB1dCIgfAorKyAgICAgICBzZWQgJ3MvW1xcXFwmfF0vXFxcXCYvZydgOzsgIygKKysgICAgKikgYWNfc2VkX2NvbmZfaW5wdXQ9JGNvbmZpZ3VyZV9pbnB1dDs7CisrICAgIGVzYWMKKysKKysgICAgY2FzZSAkYWNfdGFnIGluCisrICAgICo6LToqIHwgKjotKSBjYXQgPiIkdG1wL3N0ZGluIiBcCisrICAgICAgfHwgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBjb3VsZCBub3QgY3JlYXRlICRhY19maWxlIiA+JjI7fQorKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfSA7OworKyAgICBlc2FjCisrICAgIDs7CisrICBlc2FjCisrCisrICBhY19kaXI9YCRhc19kaXJuYW1lIC0tICIkYWNfZmlsZSIgfHwKKyskYXNfZXhwciBYIiRhY19maWxlIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAorKwkgWCIkYWNfZmlsZSIgOiAnWFwoLy9cKVteL10nIFx8IFwKKysJIFgiJGFjX2ZpbGUiIDogJ1hcKC8vXCkkJyBcfCBcCisrCSBYIiRhY19maWxlIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKKyskYXNfZWNobyBYIiRhY19maWxlIiB8CisrICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97CisrCSAgICBzLy9cMS8KKysJICAgIHEKKysJICB9CisrCSAgL15YXChcL1wvXClbXi9dLioveworKwkgICAgcy8vXDEvCisrCSAgICBxCisrCSAgfQorKwkgIC9eWFwoXC9cL1wpJC97CisrCSAgICBzLy9cMS8KKysJICAgIHEKKysJICB9CisrCSAgL15YXChcL1wpLioveworKwkgICAgcy8vXDEvCisrCSAgICBxCisrCSAgfQorKwkgIHMvLiovLi87IHEnYAorKyAgeyBhc19kaXI9IiRhY19kaXIiCisrICBjYXNlICRhc19kaXIgaW4gIygKKysgIC0qKSBhc19kaXI9Li8kYXNfZGlyOzsKKysgIGVzYWMKKysgIHRlc3QgLWQgIiRhc19kaXIiIHx8IHsgJGFzX21rZGlyX3AgJiYgbWtkaXIgLXAgIiRhc19kaXIiOyB9IHx8IHsKKysgICAgYXNfZGlycz0KKysgICAgd2hpbGUgOjsgZG8KKysgICAgICBjYXNlICRhc19kaXIgaW4gIygKKysgICAgICAqXCcqKSBhc19xZGlyPWAkYXNfZWNobyAiJGFzX2RpciIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImA7OyAjJygKKysgICAgICAqKSBhc19xZGlyPSRhc19kaXI7OworKyAgICAgIGVzYWMKKysgICAgICBhc19kaXJzPSInJGFzX3FkaXInICRhc19kaXJzIgorKyAgICAgIGFzX2Rpcj1gJGFzX2Rpcm5hbWUgLS0gIiRhc19kaXIiIHx8CisrJGFzX2V4cHIgWCIkYXNfZGlyIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAorKwkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpW14vXScgXHwgXAorKwkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpJCcgXHwgXAorKwkgWCIkYXNfZGlyIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKKyskYXNfZWNobyBYIiRhc19kaXIiIHwKKysgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKKysJICAgIHMvL1wxLworKwkgICAgcQorKwkgIH0KKysJICAvXlhcKFwvXC9cKVteL10uKi97CisrCSAgICBzLy9cMS8KKysJICAgIHEKKysJICB9CisrCSAgL15YXChcL1wvXCkkL3sKKysJICAgIHMvL1wxLworKwkgICAgcQorKwkgIH0KKysJICAvXlhcKFwvXCkuKi97CisrCSAgICBzLy9cMS8KKysJICAgIHEKKysJICB9CisrCSAgcy8uKi8uLzsgcSdgCisrICAgICAgdGVzdCAtZCAiJGFzX2RpciIgJiYgYnJlYWsKKysgICAgZG9uZQorKyAgICB0ZXN0IC16ICIkYXNfZGlycyIgfHwgZXZhbCAibWtkaXIgJGFzX2RpcnMiCisrICB9IHx8IHRlc3QgLWQgIiRhc19kaXIiIHx8IHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY3JlYXRlIGRpcmVjdG9yeSAkYXNfZGlyIiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgJGFzX2RpciIgPiYyO30KKysgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07IH0KKysgIGFjX2J1aWxkZGlyPS4KKysKKytjYXNlICIkYWNfZGlyIiBpbgorKy4pIGFjX2Rpcl9zdWZmaXg9IGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OworKyopCisrICBhY19kaXJfc3VmZml4PS9gJGFzX2VjaG8gIiRhY19kaXIiIHwgc2VkICdzfF5cLltcXC9dfHwnYAorKyAgIyBBICIuLiIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgorKyAgYWNfdG9wX2J1aWxkZGlyX3N1Yj1gJGFzX2VjaG8gIiRhY19kaXJfc3VmZml4IiB8IHNlZCAnc3wvW15cXC9dKnwvLi58ZztzfC98fCdgCisrICBjYXNlICRhY190b3BfYnVpbGRkaXJfc3ViIGluCisrICAiIikgYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7CisrICAqKSAgYWNfdG9wX2J1aWxkX3ByZWZpeD0kYWNfdG9wX2J1aWxkZGlyX3N1Yi8gOzsKKysgIGVzYWMgOzsKKytlc2FjCisrYWNfYWJzX3RvcF9idWlsZGRpcj0kYWNfcHdkCisrYWNfYWJzX2J1aWxkZGlyPSRhY19wd2QkYWNfZGlyX3N1ZmZpeAorKyMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6CisrYWNfdG9wX2J1aWxkZGlyPSRhY190b3BfYnVpbGRfcHJlZml4CisrCisrY2FzZSAkc3JjZGlyIGluCisrICAuKSAgIyBXZSBhcmUgYnVpbGRpbmcgaW4gcGxhY2UuCisrICAgIGFjX3NyY2Rpcj0uCisrICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZGRpcl9zdWIKKysgICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZCA7OworKyAgW1xcL10qIHwgPzpbXFwvXSogKSAgIyBBYnNvbHV0ZSBuYW1lLgorKyAgICBhY19zcmNkaXI9JHNyY2RpciRhY19kaXJfc3VmZml4OworKyAgICBhY190b3Bfc3JjZGlyPSRzcmNkaXIKKysgICAgYWNfYWJzX3RvcF9zcmNkaXI9JHNyY2RpciA7OworKyAgKikgIyBSZWxhdGl2ZSBuYW1lLgorKyAgICBhY19zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyJGFjX2Rpcl9zdWZmaXgKKysgICAgYWNfdG9wX3NyY2Rpcj0kYWNfdG9wX2J1aWxkX3ByZWZpeCRzcmNkaXIKKysgICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZC8kc3JjZGlyIDs7CisrZXNhYworK2FjX2Fic19zcmNkaXI9JGFjX2Fic190b3Bfc3JjZGlyJGFjX2Rpcl9zdWZmaXgKKysKKysKKysgIGNhc2UgJGFjX21vZGUgaW4KKysgIDpGKQorKyAgIworKyAgIyBDT05GSUdfRklMRQorKyAgIworKworKyAgY2FzZSAkSU5TVEFMTCBpbgorKyAgW1xcLyRdKiB8ID86W1xcL10qICkgYWNfSU5TVEFMTD0kSU5TVEFMTCA7OworKyAgKikgYWNfSU5TVEFMTD0kYWNfdG9wX2J1aWxkX3ByZWZpeCRJTlNUQUxMIDs7CisrICBlc2FjCisrX0FDRU9GCisrCisrY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorKyMgSWYgdGhlIHRlbXBsYXRlIGRvZXMgbm90IGtub3cgYWJvdXQgZGF0YXJvb3RkaXIsIGV4cGFuZCBpdC4KKysjIEZJWE1FOiBUaGlzIGhhY2sgc2hvdWxkIGJlIHJlbW92ZWQgYSBmZXcgeWVhcnMgYWZ0ZXIgMi42MC4KKythY19kYXRhcm9vdGRpcl9oYWNrPTsgYWNfZGF0YXJvb3RkaXJfc2Vlbj0KKysKKythY19zZWRfZGF0YXJvb3Q9JworKy9kYXRhcm9vdGRpci8geworKyAgcAorKyAgcQorK30KKysvQGRhdGFkaXJAL3AKKysvQGRvY2RpckAvcAorKy9AaW5mb2RpckAvcAorKy9AbG9jYWxlZGlyQC9wCisrL0BtYW5kaXJAL3AKKysnCisrY2FzZSBgZXZhbCAic2VkIC1uIFwiXCRhY19zZWRfZGF0YXJvb3RcIiAkYWNfZmlsZV9pbnB1dHMiYCBpbgorKypkYXRhcm9vdGRpciopIGFjX2RhdGFyb290ZGlyX3NlZW49eWVzOzsKKysqQGRhdGFkaXJAKnwqQGRvY2RpckAqfCpAaW5mb2RpckAqfCpAbG9jYWxlZGlyQCp8KkBtYW5kaXJAKikKKysgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfZmlsZV9pbnB1dHMgc2VlbXMgdG8gaWdub3JlIHRoZSAtLWRhdGFyb290ZGlyIHNldHRpbmciID4mNQorKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19maWxlX2lucHV0cyBzZWVtcyB0byBpZ25vcmUgdGhlIC0tZGF0YXJvb3RkaXIgc2V0dGluZyIgPiYyO30KKytfQUNFT0YKKytjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKysgIGFjX2RhdGFyb290ZGlyX2hhY2s9JworKyAgcyZAZGF0YWRpckAmJGRhdGFkaXImZworKyAgcyZAZG9jZGlyQCYkZG9jZGlyJmcKKysgIHMmQGluZm9kaXJAJiRpbmZvZGlyJmcKKysgIHMmQGxvY2FsZWRpckAmJGxvY2FsZWRpciZnCisrICBzJkBtYW5kaXJAJiRtYW5kaXImZworKyAgICBzJlxcXCR7ZGF0YXJvb3RkaXJ9JiRkYXRhcm9vdGRpciZnJyA7OworK2VzYWMKKytfQUNFT0YKKysKKysjIE5ldXRyYWxpemUgVlBBVEggd2hlbiBgJHNyY2RpcicgPSBgLicuCisrIyBTaGVsbCBjb2RlIGluIGNvbmZpZ3VyZS5hYyBtaWdodCBzZXQgZXh0cmFzdWIuCisrIyBGSVhNRTogZG8gd2UgcmVhbGx5IHdhbnQgdG8gbWFpbnRhaW4gdGhpcyBmZWF0dXJlPworK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorK2FjX3NlZF9leHRyYT0iJGFjX3Zwc3ViCisrJGV4dHJhc3ViCisrX0FDRU9GCisrY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorKzp0CisrL0BbYS16QS1aX11bYS16QS1aXzAtOV0qQC8hYgorK3N8QGNvbmZpZ3VyZV9pbnB1dEB8JGFjX3NlZF9jb25mX2lucHV0fDt0IHQKKytzJkB0b3BfYnVpbGRkaXJAJiRhY190b3BfYnVpbGRkaXJfc3ViJjt0IHQKKytzJkB0b3BfYnVpbGRfcHJlZml4QCYkYWNfdG9wX2J1aWxkX3ByZWZpeCY7dCB0CisrcyZAc3JjZGlyQCYkYWNfc3JjZGlyJjt0IHQKKytzJkBhYnNfc3JjZGlyQCYkYWNfYWJzX3NyY2RpciY7dCB0CisrcyZAdG9wX3NyY2RpckAmJGFjX3RvcF9zcmNkaXImO3QgdAorK3MmQGFic190b3Bfc3JjZGlyQCYkYWNfYWJzX3RvcF9zcmNkaXImO3QgdAorK3MmQGJ1aWxkZGlyQCYkYWNfYnVpbGRkaXImO3QgdAorK3MmQGFic19idWlsZGRpckAmJGFjX2Fic19idWlsZGRpciY7dCB0CisrcyZAYWJzX3RvcF9idWlsZGRpckAmJGFjX2Fic190b3BfYnVpbGRkaXImO3QgdAorK3MmQElOU1RBTExAJiRhY19JTlNUQUxMJjt0IHQKKyskYWNfZGF0YXJvb3RkaXJfaGFjaworKyIKKytldmFsIHNlZCBcIlwkYWNfc2VkX2V4dHJhXCIgIiRhY19maWxlX2lucHV0cyIgfCAkQVdLIC1mICIkdG1wL3N1YnMuYXdrIiA+JHRtcC9vdXQgXAorKyAgfHwgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBjb3VsZCBub3QgY3JlYXRlICRhY19maWxlIiA+JjI7fQorKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorKworK3Rlc3QgLXogIiRhY19kYXRhcm9vdGRpcl9oYWNrJGFjX2RhdGFyb290ZGlyX3NlZW4iICYmCisrICB7IGFjX291dD1gc2VkIC1uICcvXCR7ZGF0YXJvb3RkaXJ9L3AnICIkdG1wL291dCJgOyB0ZXN0IC1uICIkYWNfb3V0IjsgfSAmJgorKyAgeyBhY19vdXQ9YHNlZCAtbiAnL15bCSBdKmRhdGFyb290ZGlyWwkgXSo6Kj0vcCcgIiR0bXAvb3V0ImA7IHRlc3QgLXogIiRhY19vdXQiOyB9ICYmCisrICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2ZpbGUgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIHZhcmlhYmxlIFxgZGF0YXJvb3RkaXInCisrd2hpY2ggc2VlbXMgdG8gYmUgdW5kZWZpbmVkLiAgUGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBkZWZpbmVkLiIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2ZpbGUgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIHZhcmlhYmxlIFxgZGF0YXJvb3RkaXInCisrd2hpY2ggc2VlbXMgdG8gYmUgdW5kZWZpbmVkLiAgUGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBkZWZpbmVkLiIgPiYyO30KKysKKysgIHJtIC1mICIkdG1wL3N0ZGluIgorKyAgY2FzZSAkYWNfZmlsZSBpbgorKyAgLSkgY2F0ICIkdG1wL291dCIgJiYgcm0gLWYgIiR0bXAvb3V0Ijs7CisrICAqKSBybSAtZiAiJGFjX2ZpbGUiICYmIG12ICIkdG1wL291dCIgIiRhY19maWxlIjs7CisrICBlc2FjIFwKKysgIHx8IHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjb3VsZCBub3QgY3JlYXRlICRhY19maWxlIiA+JjUKKyskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogY291bGQgbm90IGNyZWF0ZSAkYWNfZmlsZSIgPiYyO30KKysgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKysgOzsKKysgIDpIKQorKyAgIworKyAgIyBDT05GSUdfSEVBREVSCisrICAjCisrICBpZiB0ZXN0IHgiJGFjX2ZpbGUiICE9IHgtOyB0aGVuCisrICAgIHsKKysgICAgICAkYXNfZWNobyAiLyogJGNvbmZpZ3VyZV9pbnB1dCAgKi8iIFwKKysgICAgICAmJiBldmFsICckQVdLIC1mICIkdG1wL2RlZmluZXMuYXdrIicgIiRhY19maWxlX2lucHV0cyIKKysgICAgfSA+IiR0bXAvY29uZmlnLmgiIFwKKysgICAgICB8fCB7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY291bGQgbm90IGNyZWF0ZSAkYWNfZmlsZSIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiID4mMjt9CisrICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CisrICAgIGlmIGRpZmYgIiRhY19maWxlIiAiJHRtcC9jb25maWcuaCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisrICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86ICRhY19maWxlIGlzIHVuY2hhbmdlZCIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIiA+JjY7fQorKyAgICBlbHNlCisrICAgICAgcm0gLWYgIiRhY19maWxlIgorKyAgICAgIG12ICIkdG1wL2NvbmZpZy5oIiAiJGFjX2ZpbGUiIFwKKysJfHwgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBjb3VsZCBub3QgY3JlYXRlICRhY19maWxlIiA+JjI7fQorKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorICAgICBmaQorLSAgICBybSAtZiAkYWNfZmlsZQorLSAgICBtdiBjb25mdGVzdC5oICRhY19maWxlCisrICBlbHNlCisrICAgICRhc19lY2hvICIvKiAkY29uZmlndXJlX2lucHV0ICAqLyIgXAorKyAgICAgICYmIGV2YWwgJyRBV0sgLWYgIiR0bXAvZGVmaW5lcy5hd2siJyAiJGFjX2ZpbGVfaW5wdXRzIiBcCisrICAgICAgfHwgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNvdWxkIG5vdCBjcmVhdGUgLSIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGNvdWxkIG5vdCBjcmVhdGUgLSIgPiYyO30KKysgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKyAgIGZpCistZmk7IGRvbmUKKysgOzsKKysKKyAKKy1FT0YKKy1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKysgIGVzYWMKKysKKytkb25lICMgZm9yIGFjX3RhZworIAorLUVPRgorLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKKyAKKy1leGl0IDAKKy1FT0YKKyt7IChleGl0IDApOyBleGl0IDA7IH0KKytfQUNFT0YKKyBjaG1vZCAreCAkQ09ORklHX1NUQVRVUworLXJtIC1mciBjb25mZGVmcyogJGFjX2NsZWFuX2ZpbGVzCistdGVzdCAiJG5vX2NyZWF0ZSIgPSB5ZXMgfHwgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJENPTkZJR19TVEFUVVMgfHwgZXhpdCAxCisrYWNfY2xlYW5fZmlsZXM9JGFjX2NsZWFuX2ZpbGVzX3NhdmUKKysKKyt0ZXN0ICRhY193cml0ZV9mYWlsID0gMCB8fAorKyAgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IHdyaXRlIGZhaWx1cmUgY3JlYXRpbmcgJENPTkZJR19TVEFUVVMiID4mNQorKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiB3cml0ZSBmYWlsdXJlIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTIiA+JjI7fQorKyAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorKworKworKyMgY29uZmlndXJlIGlzIHdyaXRpbmcgdG8gY29uZmlnLmxvZywgYW5kIHRoZW4gY2FsbHMgY29uZmlnLnN0YXR1cy4KKysjIGNvbmZpZy5zdGF0dXMgZG9lcyBpdHMgb3duIHJlZGlyZWN0aW9uLCBhcHBlbmRpbmcgdG8gY29uZmlnLmxvZy4KKysjIFVuZm9ydHVuYXRlbHksIG9uIERPUyB0aGlzIGZhaWxzLCBhcyBjb25maWcubG9nIGlzIHN0aWxsIGtlcHQgb3BlbgorKyMgYnkgY29uZmlndXJlLCBzbyBjb25maWcuc3RhdHVzIHdvbid0IGJlIGFibGUgdG8gd3JpdGUgdG8gaXQ7IGl0cworKyMgb3V0cHV0IGlzIHNpbXBseSBkaXNjYXJkZWQuICBTbyB3ZSBleGVjIHRoZSBGRCB0byAvZGV2L251bGwsCisrIyBlZmZlY3RpdmVseSBjbG9zaW5nIGNvbmZpZy5sb2csIHNvIGl0IGNhbiBiZSBwcm9wZXJseSAocmUpb3BlbmVkIGFuZAorKyMgYXBwZW5kZWQgdG8gYnkgY29uZmlnLnN0YXR1cy4gIFdoZW4gY29taW5nIGJhY2sgdG8gY29uZmlndXJlLCB3ZQorKyMgbmVlZCB0byBtYWtlIHRoZSBGRCBhdmFpbGFibGUgYWdhaW4uCisraWYgdGVzdCAiJG5vX2NyZWF0ZSIgIT0geWVzOyB0aGVuCisrICBhY19jc19zdWNjZXNzPToKKysgIGFjX2NvbmZpZ19zdGF0dXNfYXJncz0KKysgIHRlc3QgIiRzaWxlbnQiID0geWVzICYmCisrICAgIGFjX2NvbmZpZ19zdGF0dXNfYXJncz0iJGFjX2NvbmZpZ19zdGF0dXNfYXJncyAtLXF1aWV0IgorKyAgZXhlYyA1Pi9kZXYvbnVsbAorKyAgJFNIRUxMICRDT05GSUdfU1RBVFVTICRhY19jb25maWdfc3RhdHVzX2FyZ3MgfHwgYWNfY3Nfc3VjY2Vzcz1mYWxzZQorKyAgZXhlYyA1Pj5jb25maWcubG9nCisrICAjIFVzZSB8fCwgbm90ICYmLCB0byBhdm9pZCBleGl0aW5nIGZyb20gdGhlIGlmIHdpdGggJD8gPSAxLCB3aGljaAorKyAgIyB3b3VsZCBtYWtlIGNvbmZpZ3VyZSBmYWlsIGlmIHRoaXMgaXMgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24uCisrICAkYWNfY3Nfc3VjY2VzcyB8fCB7IChleGl0IDEpOyBleGl0IDE7IH0KKytmaQorK2lmIHRlc3QgLW4gIiRhY191bnJlY29nbml6ZWRfb3B0cyIgJiYgdGVzdCAiJGVuYWJsZV9vcHRpb25fY2hlY2tpbmciICE9IG5vOyB0aGVuCisrICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogdW5yZWNvZ25pemVkIG9wdGlvbnM6ICRhY191bnJlY29nbml6ZWRfb3B0cyIgPiY1CisrJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdW5yZWNvZ25pemVkIG9wdGlvbnM6ICRhY191bnJlY29nbml6ZWRfb3B0cyIgPiYyO30KKytmaQorIAorIAorIGlmIHRlc3QgJElDVV9VU0VfVEhSRUFEUyA9IDA7IHRoZW4KK09ubHkgaW4gM18wL2ljdS9zb3VyY2UvZXh0cmEvc2NycHRydW46IE1ha2VmaWxlCitPbmx5IGluIDNfMC9pY3Uvc291cmNlOiBsaWIKK09ubHkgaW4gM18wL2ljdS9zb3VyY2Uvc2FtcGxlcy9sYXlvdXQ6IE1ha2VmaWxlCitPbmx5IGluIDNfMC9pY3Uvc291cmNlL3Rlc3QvbGV0ZXN0OiBNYWtlZmlsZQorT25seSBpbiAzXzAvaWN1L3NvdXJjZS90ZXN0L3Rlc3RtYXA6IE1ha2VmaWxlCitPbmx5IGluIDNfMC9pY3Uvc291cmNlL3Rlc3QvdGhhaXRlc3Q6IE1ha2VmaWxlCitPbmx5IGluIDNfMC9pY3Uvc291cmNlL3Rlc3QvdGhyZWFkdGVzdDogTWFrZWZpbGUKK09ubHkgaW4gM18wL2ljdS9zb3VyY2UvdG9vbHMvZHVtcGNlOiBNYWtlZmlsZQpkaWZmIC0tZ2l0IGEvbXVsdGkvYy9wYXRjaC8zXzIgYi9tdWx0aS9jL3BhdGNoLzNfMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODJiNWYzCi0tLSAvZGV2L251bGwKKysrIGIvbXVsdGkvYy9wYXRjaC8zXzIKQEAgLTAsMCArMSwxMjM4NCBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBJQk0gQ29ycC4gYW5kIE90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZAorLS0tIDNfMi5vcmlnL2ljdS9zb3VyY2UvY29uZmlnL21oLWRhcndpbiAgICAgICAgMjAwOC0xMC0yMCAxNDo1Nzo1Mi4wMDAwMDAwMDAgLTA3MDAKKysrKyAzXzIvaWN1L3NvdXJjZS9jb25maWcvbWgtZGFyd2luICAgICAyMDA4LTEwLTIwIDE1OjU3OjI4LjAwMDAwMDAwMCAtMDcwMAorQEAgLTEzLDggKzEzLDggQEAKKyBMRF9GTEFHUyArPSAtaGVhZGVycGFkX21heF9pbnN0YWxsX25hbWVzCisgCisgIyMgQ29tbWFuZHMgdG8gZ2VuZXJhdGUgZGVwZW5kZW5jeSBmaWxlcworLUdFTl9ERVBTLmM9CSQoQ0MpIC1FIC1NTUQgICQoREVGUykgJChDUFBGTEFHUykKKy1HRU5fREVQUy5jYz0JJChDWFgpIC1FIC1NTUQgICQoREVGUykgJChDUFBGTEFHUykKKytHRU5fREVQUy5jPQllY2hvIAorK0dFTl9ERVBTLmNjPQllY2hvIAorIAorICMjIENvbW1hbmRzIHRvIGNvbXBpbGUKKyBDT01QSUxFLmM9CSQoQ0MpICQoREVGUykgJChDUFBGTEFHUykgJChDRkxBR1MpIC1mbm8tY29tbW9uIC1jCitPbmx5IGluIDNfMC5vcmlnL2ljdS9zb3VyY2U6IGNvbmZpZy5jYWNoZQorT25seSBpbiAzXzAub3JpZy9pY3Uvc291cmNlOiBjb25maWcubG9nCitkaWZmIC1ydSAzXzAub3JpZy9pY3Uvc291cmNlL2NvbmZpZ3VyZSAzXzAvaWN1L3NvdXJjZS9jb25maWd1cmUKKy0tLSAzXzIub3JpZy9pY3Uvc291cmNlL2NvbmZpZ3VyZQorKysrIDNfMi9pY3Uvc291cmNlL2NvbmZpZ3VyZQorMmQxCis8IAorNCw1YzMKKzwgIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTMgCis8ICMgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKy0tLQorPiAjIEdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42My4KKzZhNSw2Cis+ICMgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLAorPiAjIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCis4YTksNTcxCis+ICMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworPiAjIyBNNHNoIEluaXRpYWxpemF0aW9uLiAgIyMKKz4gIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCis+IAorPiAjIEJlIG1vcmUgQm91cm5lIGNvbXBhdGlibGUKKz4gRFVBTENBU0U9MTsgZXhwb3J0IERVQUxDQVNFICMgZm9yIE1LUyBzaAorPiBpZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKz4gICBlbXVsYXRlIHNoCis+ICAgTlVMTENNRD06Cis+ICAgIyBQcmUtNC4yIHZlcnNpb25zIG9mIFpzaCBkbyB3b3JkIHNwbGl0dGluZyBvbiAkezErIiRAIn0sIHdoaWNoCis+ICAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KKz4gICBhbGlhcyAtZyAnJHsxKyIkQCJ9Jz0nIiRAIicKKz4gICBzZXRvcHQgTk9fR0xPQl9TVUJTVAorPiBlbHNlCis+ICAgY2FzZSBgKHNldCAtbykgMj4vZGV2L251bGxgIGluCis+ICAgKnBvc2l4Kikgc2V0IC1vIHBvc2l4IDs7Cis+IGVzYWMKKz4gCis+IGZpCis+IAorPiAKKz4gCis+IAorPiAjIFBBVEggbmVlZHMgQ1IKKz4gIyBBdm9pZCBkZXBlbmRpbmcgdXBvbiBDaGFyYWN0ZXIgUmFuZ2VzLgorPiBhc19jcl9sZXR0ZXJzPSdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicKKz4gYXNfY3JfTEVUVEVSUz0nQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonCis+IGFzX2NyX0xldHRlcnM9JGFzX2NyX2xldHRlcnMkYXNfY3JfTEVUVEVSUworPiBhc19jcl9kaWdpdHM9JzAxMjM0NTY3ODknCis+IGFzX2NyX2FsbnVtPSRhc19jcl9MZXR0ZXJzJGFzX2NyX2RpZ2l0cworPiAKKz4gYXNfbmw9JworPiAnCis+IGV4cG9ydCBhc19ubAorPiAjIFByaW50aW5nIGEgbG9uZyBzdHJpbmcgY3Jhc2hlcyBTb2xhcmlzIDcgL3Vzci9iaW4vcHJpbnRmLgorPiBhc19lY2hvPSdcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcJworPiBhc19lY2hvPSRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8KKz4gYXNfZWNobz0kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8KKz4gaWYgKHRlc3QgIlhgcHJpbnRmICVzICRhc19lY2hvYCIgPSAiWCRhc19lY2hvIikgMj4vZGV2L251bGw7IHRoZW4KKz4gICBhc19lY2hvPSdwcmludGYgJXNcbicKKz4gICBhc19lY2hvX249J3ByaW50ZiAlcycKKz4gZWxzZQorPiAgIGlmIHRlc3QgIlhgKC91c3IvdWNiL2VjaG8gLW4gLW4gJGFzX2VjaG8pIDI+L2Rldi9udWxsYCIgPSAiWC1uICRhc19lY2hvIjsgdGhlbgorPiAgICAgYXNfZWNob19ib2R5PSdldmFsIC91c3IvdWNiL2VjaG8gLW4gIiQxJGFzX25sIicKKz4gICAgIGFzX2VjaG9fbj0nL3Vzci91Y2IvZWNobyAtbicKKz4gICBlbHNlCis+ICAgICBhc19lY2hvX2JvZHk9J2V2YWwgZXhwciAiWCQxIiA6ICJYXFwoLipcXCkiJworPiAgICAgYXNfZWNob19uX2JvZHk9J2V2YWwKKz4gICAgICAgYXJnPSQxOworPiAgICAgICBjYXNlICRhcmcgaW4KKz4gICAgICAgKiIkYXNfbmwiKikKKz4gCWV4cHIgIlgkYXJnIiA6ICJYXFwoLipcXCkkYXNfbmwiOworPiAJYXJnPWBleHByICJYJGFyZyIgOiAiLiokYXNfbmxcXCguKlxcKSJgOzsKKz4gICAgICAgZXNhYzsKKz4gICAgICAgZXhwciAiWCRhcmciIDogIlhcXCguKlxcKSIgfCB0ciAtZCAiJGFzX25sIgorPiAgICAgJworPiAgICAgZXhwb3J0IGFzX2VjaG9fbl9ib2R5Cis+ICAgICBhc19lY2hvX249J3NoIC1jICRhc19lY2hvX25fYm9keSBhc19lY2hvJworPiAgIGZpCis+ICAgZXhwb3J0IGFzX2VjaG9fYm9keQorPiAgIGFzX2VjaG89J3NoIC1jICRhc19lY2hvX2JvZHkgYXNfZWNobycKKz4gZmkKKz4gCis+ICMgVGhlIHVzZXIgaXMgYWx3YXlzIHJpZ2h0LgorPiBpZiB0ZXN0ICIke1BBVEhfU0VQQVJBVE9SK3NldH0iICE9IHNldDsgdGhlbgorPiAgIFBBVEhfU0VQQVJBVE9SPToKKz4gICAoUEFUSD0nL2JpbjsvYmluJzsgRlBBVEg9JFBBVEg7IHNoIC1jIDopID4vZGV2L251bGwgMj4mMSAmJiB7Cis+ICAgICAoUEFUSD0nL2JpbjovYmluJzsgRlBBVEg9JFBBVEg7IHNoIC1jIDopID4vZGV2L251bGwgMj4mMSB8fAorPiAgICAgICBQQVRIX1NFUEFSQVRPUj0nOycKKz4gICB9Cis+IGZpCis+IAorPiAjIFN1cHBvcnQgdW5zZXQgd2hlbiBwb3NzaWJsZS4KKz4gaWYgKCAoTUFJTD02MDsgdW5zZXQgTUFJTCkgfHwgZXhpdCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCis+ICAgYXNfdW5zZXQ9dW5zZXQKKz4gZWxzZQorPiAgIGFzX3Vuc2V0PWZhbHNlCis+IGZpCis+IAorPiAKKz4gIyBJRlMKKz4gIyBXZSBuZWVkIHNwYWNlLCB0YWIgYW5kIG5ldyBsaW5lLCBpbiBwcmVjaXNlbHkgdGhhdCBvcmRlci4gIFF1b3RpbmcgaXMKKz4gIyB0aGVyZSB0byBwcmV2ZW50IGVkaXRvcnMgZnJvbSBjb21wbGFpbmluZyBhYm91dCBzcGFjZS10YWIuCis+ICMgKElmIF9BU19QQVRIX1dBTEsgd2VyZSBjYWxsZWQgd2l0aCBJRlMgdW5zZXQsIGl0IHdvdWxkIGRpc2FibGUgd29yZAorPiAjIHNwbGl0dGluZyBieSBzZXR0aW5nIElGUyB0byBlbXB0eSB2YWx1ZS4pCis+IElGUz0iICIiCSRhc19ubCIKKz4gCis+ICMgRmluZCB3aG8gd2UgYXJlLiAgTG9vayBpbiB0aGUgcGF0aCBpZiB3ZSBjb250YWluIG5vIGRpcmVjdG9yeSBzZXBhcmF0b3IuCis+IGNhc2UgJDAgaW4KKz4gICAqW1xcL10qICkgYXNfbXlzZWxmPSQwIDs7Cis+ICAgKikgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorPiBmb3IgYXNfZGlyIGluICRQQVRICis+IGRvCis+ICAgSUZTPSRhc19zYXZlX0lGUworPiAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCis+ICAgdGVzdCAtciAiJGFzX2Rpci8kMCIgJiYgYXNfbXlzZWxmPSRhc19kaXIvJDAgJiYgYnJlYWsKKz4gZG9uZQorPiBJRlM9JGFzX3NhdmVfSUZTCis+IAorPiAgICAgIDs7Cis+IGVzYWMKKz4gIyBXZSBkaWQgbm90IGZpbmQgb3Vyc2VsdmVzLCBtb3N0IHByb2JhYmx5IHdlIHdlcmUgcnVuIGFzIGBzaCBDT01NQU5EJworPiAjIGluIHdoaWNoIGNhc2Ugd2UgYXJlIG5vdCB0byBiZSBmb3VuZCBpbiB0aGUgcGF0aC4KKz4gaWYgdGVzdCAieCRhc19teXNlbGYiID0geDsgdGhlbgorPiAgIGFzX215c2VsZj0kMAorPiBmaQorPiBpZiB0ZXN0ICEgLWYgIiRhc19teXNlbGYiOyB0aGVuCis+ICAgJGFzX2VjaG8gIiRhc19teXNlbGY6IGVycm9yOiBjYW5ub3QgZmluZCBteXNlbGY7IHJlcnVuIHdpdGggYW4gYWJzb2x1dGUgZmlsZSBuYW1lIiA+JjIKKz4gICB7IChleGl0IDEpOyBleGl0IDE7IH0KKz4gZmkKKz4gCis+ICMgV29yayBhcm91bmQgYnVncyBpbiBwcmUtMy4wIFVXSU4ga3NoLgorPiBmb3IgYXNfdmFyIGluIEVOViBNQUlMIE1BSUxQQVRICis+IGRvICgkYXNfdW5zZXQgJGFzX3ZhcikgPi9kZXYvbnVsbCAyPiYxICYmICRhc191bnNldCAkYXNfdmFyCis+IGRvbmUKKz4gUFMxPSckICcKKz4gUFMyPSc+ICcKKz4gUFM0PScrICcKKz4gCis+ICMgTkxTIG51aXNhbmNlcy4KKz4gTENfQUxMPUMKKz4gZXhwb3J0IExDX0FMTAorPiBMQU5HVUFHRT1DCis+IGV4cG9ydCBMQU5HVUFHRQorPiAKKz4gIyBSZXF1aXJlZCB0byB1c2UgYmFzZW5hbWUuCis+IGlmIGV4cHIgYSA6ICdcKGFcKScgPi9kZXYvbnVsbCAyPiYxICYmCis+ICAgIHRlc3QgIlhgZXhwciAwMDAwMSA6ICcuKlwoLi4uXCknYCIgPSBYMDAxOyB0aGVuCis+ICAgYXNfZXhwcj1leHByCis+IGVsc2UKKz4gICBhc19leHByPWZhbHNlCis+IGZpCis+IAorPiBpZiAoYmFzZW5hbWUgLS0gLykgPi9kZXYvbnVsbCAyPiYxICYmIHRlc3QgIlhgYmFzZW5hbWUgLS0gLyAyPiYxYCIgPSAiWC8iOyB0aGVuCis+ICAgYXNfYmFzZW5hbWU9YmFzZW5hbWUKKz4gZWxzZQorPiAgIGFzX2Jhc2VuYW1lPWZhbHNlCis+IGZpCis+IAorPiAKKz4gIyBOYW1lIG9mIHRoZSBleGVjdXRhYmxlLgorPiBhc19tZT1gJGFzX2Jhc2VuYW1lIC0tICIkMCIgfHwKKz4gJGFzX2V4cHIgWC8iJDAiIDogJy4qL1woW14vXVteL10qXCkvKiQnIFx8IFwKKz4gCSBYIiQwIiA6ICdYXCgvL1wpJCcgXHwgXAorPiAJIFgiJDAiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorPiAkYXNfZWNobyBYLyIkMCIgfAorPiAgICAgc2VkICcvXi4qXC9cKFteL11bXi9dKlwpXC8qJC97Cis+IAkgICAgcy8vXDEvCis+IAkgICAgcQorPiAJICB9Cis+IAkgIC9eWFwvXChcL1wvXCkkL3sKKz4gCSAgICBzLy9cMS8KKz4gCSAgICBxCis+IAkgIH0KKz4gCSAgL15YXC9cKFwvXCkuKi97Cis+IAkgICAgcy8vXDEvCis+IAkgICAgcQorPiAJICB9Cis+IAkgIHMvLiovLi87IHEnYAorPiAKKz4gIyBDRFBBVEguCis+ICRhc191bnNldCBDRFBBVEgKKz4gCis+IAorPiBpZiB0ZXN0ICJ4JENPTkZJR19TSEVMTCIgPSB4OyB0aGVuCis+ICAgaWYgKGV2YWwgIjoiKSAyPi9kZXYvbnVsbDsgdGhlbgorPiAgIGFzX2hhdmVfcmVxdWlyZWQ9eWVzCis+IGVsc2UKKz4gICBhc19oYXZlX3JlcXVpcmVkPW5vCis+IGZpCis+IAorPiAgIGlmIHRlc3QgJGFzX2hhdmVfcmVxdWlyZWQgPSB5ZXMgJiYJIChldmFsICI6Cis+IChhc19mdW5jX3JldHVybiAoKSB7Cis+ICAgKGV4aXQgXCQxKQorPiB9Cis+IGFzX2Z1bmNfc3VjY2VzcyAoKSB7Cis+ICAgYXNfZnVuY19yZXR1cm4gMAorPiB9Cis+IGFzX2Z1bmNfZmFpbHVyZSAoKSB7Cis+ICAgYXNfZnVuY19yZXR1cm4gMQorPiB9Cis+IGFzX2Z1bmNfcmV0X3N1Y2Nlc3MgKCkgeworPiAgIHJldHVybiAwCis+IH0KKz4gYXNfZnVuY19yZXRfZmFpbHVyZSAoKSB7Cis+ICAgcmV0dXJuIDEKKz4gfQorPiAKKz4gZXhpdGNvZGU9MAorPiBpZiBhc19mdW5jX3N1Y2Nlc3M7IHRoZW4KKz4gICA6Cis+IGVsc2UKKz4gICBleGl0Y29kZT0xCis+ICAgZWNobyBhc19mdW5jX3N1Y2Nlc3MgZmFpbGVkLgorPiBmaQorPiAKKz4gaWYgYXNfZnVuY19mYWlsdXJlOyB0aGVuCis+ICAgZXhpdGNvZGU9MQorPiAgIGVjaG8gYXNfZnVuY19mYWlsdXJlIHN1Y2NlZWRlZC4KKz4gZmkKKz4gCis+IGlmIGFzX2Z1bmNfcmV0X3N1Y2Nlc3M7IHRoZW4KKz4gICA6Cis+IGVsc2UKKz4gICBleGl0Y29kZT0xCis+ICAgZWNobyBhc19mdW5jX3JldF9zdWNjZXNzIGZhaWxlZC4KKz4gZmkKKz4gCis+IGlmIGFzX2Z1bmNfcmV0X2ZhaWx1cmU7IHRoZW4KKz4gICBleGl0Y29kZT0xCis+ICAgZWNobyBhc19mdW5jX3JldF9mYWlsdXJlIHN1Y2NlZWRlZC4KKz4gZmkKKz4gCis+IGlmICggc2V0IHg7IGFzX2Z1bmNfcmV0X3N1Y2Nlc3MgeSAmJiB0ZXN0IHggPSBcIlwkMVwiICk7IHRoZW4KKz4gICA6Cis+IGVsc2UKKz4gICBleGl0Y29kZT0xCis+ICAgZWNobyBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgd2VyZSBub3Qgc2F2ZWQuCis+IGZpCis+IAorPiB0ZXN0IFwkZXhpdGNvZGUgPSAwKSB8fCB7IChleGl0IDEpOyBleGl0IDE7IH0KKz4gCis+ICgKKz4gICBhc19saW5lbm9fMT1cJExJTkVOTworPiAgIGFzX2xpbmVub18yPVwkTElORU5PCis+ICAgdGVzdCBcInhcJGFzX2xpbmVub18xXCIgIT0gXCJ4XCRhc19saW5lbm9fMlwiICYmCis+ICAgdGVzdCBcInhcYGV4cHIgXCRhc19saW5lbm9fMSArIDFcYFwiID0gXCJ4XCRhc19saW5lbm9fMlwiKSB8fCB7IChleGl0IDEpOyBleGl0IDE7IH0KKz4gIikgMj4gL2Rldi9udWxsOyB0aGVuCis+ICAgOgorPiBlbHNlCis+ICAgYXNfY2FuZGlkYXRlX3NoZWxscz0KKz4gICAgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKKz4gZm9yIGFzX2RpciBpbiAvYmluJFBBVEhfU0VQQVJBVE9SL3Vzci9iaW4kUEFUSF9TRVBBUkFUT1IkUEFUSAorPiBkbworPiAgIElGUz0kYXNfc2F2ZV9JRlMKKz4gICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorPiAgIGNhc2UgJGFzX2RpciBpbgorPiAJIC8qKQorPiAJICAgZm9yIGFzX2Jhc2UgaW4gc2ggYmFzaCBrc2ggc2g1OyBkbworPiAJICAgICBhc19jYW5kaWRhdGVfc2hlbGxzPSIkYXNfY2FuZGlkYXRlX3NoZWxscyAkYXNfZGlyLyRhc19iYXNlIgorPiAJICAgZG9uZTs7Cis+ICAgICAgICBlc2FjCis+IGRvbmUKKz4gSUZTPSRhc19zYXZlX0lGUworPiAKKz4gCis+ICAgICAgIGZvciBhc19zaGVsbCBpbiAkYXNfY2FuZGlkYXRlX3NoZWxscyAkU0hFTEw7IGRvCis+IAkgIyBUcnkgb25seSBzaGVsbHMgdGhhdCBleGlzdCwgdG8gc2F2ZSBzZXZlcmFsIGZvcmtzLgorPiAJIGlmIHsgdGVzdCAtZiAiJGFzX3NoZWxsIiB8fCB0ZXN0IC1mICIkYXNfc2hlbGwuZXhlIjsgfSAmJgorPiAJCXsgKCIkYXNfc2hlbGwiKSAyPiAvZGV2L251bGwgPDxcX0FTRU9GCis+IGlmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgorPiAgIGVtdWxhdGUgc2gKKz4gICBOVUxMQ01EPToKKz4gICAjIFByZS00LjIgdmVyc2lvbnMgb2YgWnNoIGRvIHdvcmQgc3BsaXR0aW5nIG9uICR7MSsiJEAifSwgd2hpY2gKKz4gICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgorPiAgIGFsaWFzIC1nICckezErIiRAIn0nPSciJEAiJworPiAgIHNldG9wdCBOT19HTE9CX1NVQlNUCis+IGVsc2UKKz4gICBjYXNlIGAoc2V0IC1vKSAyPi9kZXYvbnVsbGAgaW4KKz4gICAqcG9zaXgqKSBzZXQgLW8gcG9zaXggOzsKKz4gZXNhYworPiAKKz4gZmkKKz4gCis+IAorPiA6Cis+IF9BU0VPRgorPiB9OyB0aGVuCis+ICAgQ09ORklHX1NIRUxMPSRhc19zaGVsbAorPiAJICAgICAgIGFzX2hhdmVfcmVxdWlyZWQ9eWVzCis+IAkgICAgICAgaWYgeyAiJGFzX3NoZWxsIiAyPiAvZGV2L251bGwgPDxcX0FTRU9GCis+IGlmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgorPiAgIGVtdWxhdGUgc2gKKz4gICBOVUxMQ01EPToKKz4gICAjIFByZS00LjIgdmVyc2lvbnMgb2YgWnNoIGRvIHdvcmQgc3BsaXR0aW5nIG9uICR7MSsiJEAifSwgd2hpY2gKKz4gICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgorPiAgIGFsaWFzIC1nICckezErIiRAIn0nPSciJEAiJworPiAgIHNldG9wdCBOT19HTE9CX1NVQlNUCis+IGVsc2UKKz4gICBjYXNlIGAoc2V0IC1vKSAyPi9kZXYvbnVsbGAgaW4KKz4gICAqcG9zaXgqKSBzZXQgLW8gcG9zaXggOzsKKz4gZXNhYworPiAKKz4gZmkKKz4gCis+IAorPiA6Cis+IChhc19mdW5jX3JldHVybiAoKSB7Cis+ICAgKGV4aXQgJDEpCis+IH0KKz4gYXNfZnVuY19zdWNjZXNzICgpIHsKKz4gICBhc19mdW5jX3JldHVybiAwCis+IH0KKz4gYXNfZnVuY19mYWlsdXJlICgpIHsKKz4gICBhc19mdW5jX3JldHVybiAxCis+IH0KKz4gYXNfZnVuY19yZXRfc3VjY2VzcyAoKSB7Cis+ICAgcmV0dXJuIDAKKz4gfQorPiBhc19mdW5jX3JldF9mYWlsdXJlICgpIHsKKz4gICByZXR1cm4gMQorPiB9Cis+IAorPiBleGl0Y29kZT0wCis+IGlmIGFzX2Z1bmNfc3VjY2VzczsgdGhlbgorPiAgIDoKKz4gZWxzZQorPiAgIGV4aXRjb2RlPTEKKz4gICBlY2hvIGFzX2Z1bmNfc3VjY2VzcyBmYWlsZWQuCis+IGZpCis+IAorPiBpZiBhc19mdW5jX2ZhaWx1cmU7IHRoZW4KKz4gICBleGl0Y29kZT0xCis+ICAgZWNobyBhc19mdW5jX2ZhaWx1cmUgc3VjY2VlZGVkLgorPiBmaQorPiAKKz4gaWYgYXNfZnVuY19yZXRfc3VjY2VzczsgdGhlbgorPiAgIDoKKz4gZWxzZQorPiAgIGV4aXRjb2RlPTEKKz4gICBlY2hvIGFzX2Z1bmNfcmV0X3N1Y2Nlc3MgZmFpbGVkLgorPiBmaQorPiAKKz4gaWYgYXNfZnVuY19yZXRfZmFpbHVyZTsgdGhlbgorPiAgIGV4aXRjb2RlPTEKKz4gICBlY2hvIGFzX2Z1bmNfcmV0X2ZhaWx1cmUgc3VjY2VlZGVkLgorPiBmaQorPiAKKz4gaWYgKCBzZXQgeDsgYXNfZnVuY19yZXRfc3VjY2VzcyB5ICYmIHRlc3QgeCA9ICIkMSIgKTsgdGhlbgorPiAgIDoKKz4gZWxzZQorPiAgIGV4aXRjb2RlPTEKKz4gICBlY2hvIHBvc2l0aW9uYWwgcGFyYW1ldGVycyB3ZXJlIG5vdCBzYXZlZC4KKz4gZmkKKz4gCis+IHRlc3QgJGV4aXRjb2RlID0gMCkgfHwgeyAoZXhpdCAxKTsgZXhpdCAxOyB9Cis+IAorPiAoCis+ICAgYXNfbGluZW5vXzE9JExJTkVOTworPiAgIGFzX2xpbmVub18yPSRMSU5FTk8KKz4gICB0ZXN0ICJ4JGFzX2xpbmVub18xIiAhPSAieCRhc19saW5lbm9fMiIgJiYKKz4gICB0ZXN0ICJ4YGV4cHIgJGFzX2xpbmVub18xICsgMWAiID0gIngkYXNfbGluZW5vXzIiKSB8fCB7IChleGl0IDEpOyBleGl0IDE7IH0KKz4gCis+IF9BU0VPRgorPiB9OyB0aGVuCis+ICAgYnJlYWsKKz4gZmkKKz4gCis+IGZpCis+IAorPiAgICAgICBkb25lCis+IAorPiAgICAgICBpZiB0ZXN0ICJ4JENPTkZJR19TSEVMTCIgIT0geDsgdGhlbgorPiAgIGZvciBhc192YXIgaW4gQkFTSF9FTlYgRU5WCis+IAlkbyAoJGFzX3Vuc2V0ICRhc192YXIpID4vZGV2L251bGwgMj4mMSAmJiAkYXNfdW5zZXQgJGFzX3ZhcgorPiAJZG9uZQorPiAJZXhwb3J0IENPTkZJR19TSEVMTAorPiAJZXhlYyAiJENPTkZJR19TSEVMTCIgIiRhc19teXNlbGYiICR7MSsiJEAifQorPiBmaQorPiAKKz4gCis+ICAgICBpZiB0ZXN0ICRhc19oYXZlX3JlcXVpcmVkID0gbm87IHRoZW4KKz4gICBlY2hvIFRoaXMgc2NyaXB0IHJlcXVpcmVzIGEgc2hlbGwgbW9yZSBtb2Rlcm4gdGhhbiBhbGwgdGhlCis+ICAgICAgIGVjaG8gc2hlbGxzIHRoYXQgSSBmb3VuZCBvbiB5b3VyIHN5c3RlbS4gIFBsZWFzZSBpbnN0YWxsIGEKKz4gICAgICAgZWNobyBtb2Rlcm4gc2hlbGwsIG9yIG1hbnVhbGx5IHJ1biB0aGUgc2NyaXB0IHVuZGVyIHN1Y2ggYQorPiAgICAgICBlY2hvIHNoZWxsIGlmIHlvdSBkbyBoYXZlIG9uZS4KKz4gICAgICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9Cis+IGZpCis+IAorPiAKKz4gZmkKKz4gCis+IGZpCis+IAorPiAKKz4gCis+IChldmFsICJhc19mdW5jX3JldHVybiAoKSB7Cis+ICAgKGV4aXQgXCQxKQorPiB9Cis+IGFzX2Z1bmNfc3VjY2VzcyAoKSB7Cis+ICAgYXNfZnVuY19yZXR1cm4gMAorPiB9Cis+IGFzX2Z1bmNfZmFpbHVyZSAoKSB7Cis+ICAgYXNfZnVuY19yZXR1cm4gMQorPiB9Cis+IGFzX2Z1bmNfcmV0X3N1Y2Nlc3MgKCkgeworPiAgIHJldHVybiAwCis+IH0KKz4gYXNfZnVuY19yZXRfZmFpbHVyZSAoKSB7Cis+ICAgcmV0dXJuIDEKKz4gfQorPiAKKz4gZXhpdGNvZGU9MAorPiBpZiBhc19mdW5jX3N1Y2Nlc3M7IHRoZW4KKz4gICA6Cis+IGVsc2UKKz4gICBleGl0Y29kZT0xCis+ICAgZWNobyBhc19mdW5jX3N1Y2Nlc3MgZmFpbGVkLgorPiBmaQorPiAKKz4gaWYgYXNfZnVuY19mYWlsdXJlOyB0aGVuCis+ICAgZXhpdGNvZGU9MQorPiAgIGVjaG8gYXNfZnVuY19mYWlsdXJlIHN1Y2NlZWRlZC4KKz4gZmkKKz4gCis+IGlmIGFzX2Z1bmNfcmV0X3N1Y2Nlc3M7IHRoZW4KKz4gICA6Cis+IGVsc2UKKz4gICBleGl0Y29kZT0xCis+ICAgZWNobyBhc19mdW5jX3JldF9zdWNjZXNzIGZhaWxlZC4KKz4gZmkKKz4gCis+IGlmIGFzX2Z1bmNfcmV0X2ZhaWx1cmU7IHRoZW4KKz4gICBleGl0Y29kZT0xCis+ICAgZWNobyBhc19mdW5jX3JldF9mYWlsdXJlIHN1Y2NlZWRlZC4KKz4gZmkKKz4gCis+IGlmICggc2V0IHg7IGFzX2Z1bmNfcmV0X3N1Y2Nlc3MgeSAmJiB0ZXN0IHggPSBcIlwkMVwiICk7IHRoZW4KKz4gICA6Cis+IGVsc2UKKz4gICBleGl0Y29kZT0xCis+ICAgZWNobyBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgd2VyZSBub3Qgc2F2ZWQuCis+IGZpCis+IAorPiB0ZXN0IFwkZXhpdGNvZGUgPSAwIikgfHwgeworPiAgIGVjaG8gTm8gc2hlbGwgZm91bmQgdGhhdCBzdXBwb3J0cyBzaGVsbCBmdW5jdGlvbnMuCis+ICAgZWNobyBQbGVhc2UgdGVsbCBidWctYXV0b2NvbmZAZ251Lm9yZyBhYm91dCB5b3VyIHN5c3RlbSwKKz4gICBlY2hvIGluY2x1ZGluZyBhbnkgZXJyb3IgcG9zc2libHkgb3V0cHV0IGJlZm9yZSB0aGlzIG1lc3NhZ2UuCis+ICAgZWNobyBUaGlzIGNhbiBoZWxwIHVzIGltcHJvdmUgZnV0dXJlIGF1dG9jb25mIHZlcnNpb25zLgorPiAgIGVjaG8gQ29uZmlndXJhdGlvbiB3aWxsIG5vdyBwcm9jZWVkIHdpdGhvdXQgc2hlbGwgZnVuY3Rpb25zLgorPiB9Cis+IAorPiAKKz4gCis+ICAgYXNfbGluZW5vXzE9JExJTkVOTworPiAgIGFzX2xpbmVub18yPSRMSU5FTk8KKz4gICB0ZXN0ICJ4JGFzX2xpbmVub18xIiAhPSAieCRhc19saW5lbm9fMiIgJiYKKz4gICB0ZXN0ICJ4YGV4cHIgJGFzX2xpbmVub18xICsgMWAiID0gIngkYXNfbGluZW5vXzIiIHx8IHsKKz4gCis+ICAgIyBDcmVhdGUgJGFzX21lLmxpbmVubyBhcyBhIGNvcHkgb2YgJGFzX215c2VsZiwgYnV0IHdpdGggJExJTkVOTworPiAgICMgdW5pZm9ybWx5IHJlcGxhY2VkIGJ5IHRoZSBsaW5lIG51bWJlci4gIFRoZSBmaXJzdCAnc2VkJyBpbnNlcnRzIGEKKz4gICAjIGxpbmUtbnVtYmVyIGxpbmUgYWZ0ZXIgZWFjaCBsaW5lIHVzaW5nICRMSU5FTk87IHRoZSBzZWNvbmQgJ3NlZCcKKz4gICAjIGRvZXMgdGhlIHJlYWwgd29yay4gIFRoZSBzZWNvbmQgc2NyaXB0IHVzZXMgJ04nIHRvIHBhaXIgZWFjaAorPiAgICMgbGluZS1udW1iZXIgbGluZSB3aXRoIHRoZSBsaW5lIGNvbnRhaW5pbmcgJExJTkVOTywgYW5kIGFwcGVuZHMKKz4gICAjIHRyYWlsaW5nICctJyBkdXJpbmcgc3Vic3RpdHV0aW9uIHNvIHRoYXQgJExJTkVOTyBpcyBub3QgYSBzcGVjaWFsCis+ICAgIyBjYXNlIGF0IGxpbmUgZW5kLgorPiAgICMgKFJhamEgUiBIYXJpbmF0aCBzdWdnZXN0ZWQgc2VkICc9JywgYW5kIFBhdWwgRWdnZXJ0IHdyb3RlIHRoZQorPiAgICMgc2NyaXB0cyB3aXRoIG9wdGltaXphdGlvbiBoZWxwIGZyb20gUGFvbG8gQm9uemluaS4gIEJsYW1lIExlZQorPiAgICMgRS4gTWNNYWhvbiAoMTkzMS0xOTg5KSBmb3Igc2VkJ3Mgc3ludGF4LiAgOi0pCis+ICAgc2VkIC1uICcKKz4gICAgIHAKKz4gICAgIC9bJF1MSU5FTk8vPQorPiAgICcgPCRhc19teXNlbGYgfAorPiAgICAgc2VkICcKKz4gICAgICAgcy9bJF1MSU5FTk8uKi8mLS8KKz4gICAgICAgdCBsaW5lbm8KKz4gICAgICAgYgorPiAgICAgICA6bGluZW5vCis+ICAgICAgIE4KKz4gICAgICAgOmxvb3AKKz4gICAgICAgcy9bJF1MSU5FTk9cKFteJyRhc19jcl9hbG51bSdfXS4qXG5cKVwoLipcKS9cMlwxXDIvCis+ICAgICAgIHQgbG9vcAorPiAgICAgICBzLy1cbi4qLy8KKz4gICAgICcgPiRhc19tZS5saW5lbm8gJiYKKz4gICBjaG1vZCAreCAiJGFzX21lLmxpbmVubyIgfHwKKz4gICAgIHsgJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjcmVhdGUgJGFzX21lLmxpbmVubzsgcmVydW4gd2l0aCBhIFBPU0lYIHNoZWxsIiA+JjIKKz4gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Cis+IAorPiAgICMgRG9uJ3QgdHJ5IHRvIGV4ZWMgYXMgaXQgY2hhbmdlcyAkWzBdLCBjYXVzaW5nIGFsbCBzb3J0IG9mIHByb2JsZW1zCis+ICAgIyAodGhlIGRpcm5hbWUgb2YgJFswXSBpcyBub3QgdGhlIHBsYWNlIHdoZXJlIHdlIG1pZ2h0IGZpbmQgdGhlCis+ICAgIyBvcmlnaW5hbCBhbmQgc28gb24uICBBdXRvY29uZiBpcyBlc3BlY2lhbGx5IHNlbnNpdGl2ZSB0byB0aGlzKS4KKz4gICAuICIuLyRhc19tZS5saW5lbm8iCis+ICAgIyBFeGl0IHN0YXR1cyBpcyB0aGF0IG9mIHRoZSBsYXN0IGNvbW1hbmQuCis+ICAgZXhpdAorPiB9Cis+IAorPiAKKz4gaWYgKGFzX2Rpcj1gZGlybmFtZSAtLSAvYCAmJiB0ZXN0ICJYJGFzX2RpciIgPSBYLykgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCis+ICAgYXNfZGlybmFtZT1kaXJuYW1lCis+IGVsc2UKKz4gICBhc19kaXJuYW1lPWZhbHNlCis+IGZpCis+IAorPiBFQ0hPX0M9IEVDSE9fTj0gRUNIT19UPQorPiBjYXNlIGBlY2hvIC1uIHhgIGluCis+IC1uKikKKz4gICBjYXNlIGBlY2hvICd4XGMnYCBpbgorPiAgICpjKikgRUNIT19UPScJJzs7CSMgRUNIT19UIGlzIHNpbmdsZSB0YWIgY2hhcmFjdGVyLgorPiAgICopICAgRUNIT19DPSdcYyc7OworPiAgIGVzYWM7OworPiAqKQorPiAgIEVDSE9fTj0nLW4nOzsKKz4gZXNhYworPiBpZiBleHByIGEgOiAnXChhXCknID4vZGV2L251bGwgMj4mMSAmJgorPiAgICB0ZXN0ICJYYGV4cHIgMDAwMDEgOiAnLipcKC4uLlwpJ2AiID0gWDAwMTsgdGhlbgorPiAgIGFzX2V4cHI9ZXhwcgorPiBlbHNlCis+ICAgYXNfZXhwcj1mYWxzZQorPiBmaQorPiAKKz4gcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmZpbGUKKz4gaWYgdGVzdCAtZCBjb25mJCQuZGlyOyB0aGVuCis+ICAgcm0gLWYgY29uZiQkLmRpci9jb25mJCQuZmlsZQorPiBlbHNlCis+ICAgcm0gLWYgY29uZiQkLmRpcgorPiAgIG1rZGlyIGNvbmYkJC5kaXIgMj4vZGV2L251bGwKKz4gZmkKKz4gaWYgKGVjaG8gPmNvbmYkJC5maWxlKSAyPi9kZXYvbnVsbDsgdGhlbgorPiAgIGlmIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgorPiAgICAgYXNfbG5fcz0nbG4gLXMnCis+ICAgICAjIC4uLiBidXQgdGhlcmUgYXJlIHR3byBnb3RjaGFzOgorPiAgICAgIyAxKSBPbiBNU1lTLCBib3RoIGBsbiAtcyBmaWxlIGRpcicgYW5kIGBsbiBmaWxlIGRpcicgZmFpbC4KKz4gICAgICMgMikgREpHUFAgPCAyLjA0IGhhcyBubyBzeW1saW5rczsgYGxuIC1zJyBjcmVhdGVzIGEgd3JhcHBlciBleGVjdXRhYmxlLgorPiAgICAgIyBJbiBib3RoIGNhc2VzLCB3ZSBoYXZlIHRvIGRlZmF1bHQgdG8gYGNwIC1wJy4KKz4gICAgIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJC5kaXIgMj4vZGV2L251bGwgJiYgdGVzdCAhIC1mIGNvbmYkJC5leGUgfHwKKz4gICAgICAgYXNfbG5fcz0nY3AgLXAnCis+ICAgZWxpZiBsbiBjb25mJCQuZmlsZSBjb25mJCQgMj4vZGV2L251bGw7IHRoZW4KKz4gICAgIGFzX2xuX3M9bG4KKz4gICBlbHNlCis+ICAgICBhc19sbl9zPSdjcCAtcCcKKz4gICBmaQorPiBlbHNlCis+ICAgYXNfbG5fcz0nY3AgLXAnCis+IGZpCis+IHJtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5kaXIvY29uZiQkLmZpbGUgY29uZiQkLmZpbGUKKz4gcm1kaXIgY29uZiQkLmRpciAyPi9kZXYvbnVsbAorPiAKKz4gaWYgbWtkaXIgLXAgLiAyPi9kZXYvbnVsbDsgdGhlbgorPiAgIGFzX21rZGlyX3A9OgorPiBlbHNlCis+ICAgdGVzdCAtZCAuLy1wICYmIHJtZGlyIC4vLXAKKz4gICBhc19ta2Rpcl9wPWZhbHNlCis+IGZpCis+IAorPiBpZiB0ZXN0IC14IC8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCis+ICAgYXNfdGVzdF94PSd0ZXN0IC14JworPiBlbHNlCis+ICAgaWYgbHMgLWRMIC8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCis+ICAgICBhc19sc19MX29wdGlvbj1MCis+ICAgZWxzZQorPiAgICAgYXNfbHNfTF9vcHRpb249Cis+ICAgZmkKKz4gICBhc190ZXN0X3g9JworPiAgICAgZXZhbCBzaCAtYyAnXCcnCis+ICAgICAgIGlmIHRlc3QgLWQgIiQxIjsgdGhlbgorPiAJdGVzdCAtZCAiJDEvLiI7Cis+ICAgICAgIGVsc2UKKz4gCWNhc2UgJDEgaW4KKz4gCS0qKXNldCAiLi8kMSI7OworPiAJZXNhYzsKKz4gCWNhc2UgYGxzIC1sZCckYXNfbHNfTF9vcHRpb24nICIkMSIgMj4vZGV2L251bGxgIGluCis+IAk/Pz9bc3hdKik6OzsqKWZhbHNlOztlc2FjO2ZpCis+ICAgICAnXCcnIHNoCis+ICAgJworPiBmaQorPiBhc19leGVjdXRhYmxlX3A9JGFzX3Rlc3RfeAorPiAKKz4gIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIENQUCBuYW1lLgorPiBhc190cl9jcHA9ImV2YWwgc2VkICd5JSokYXNfY3JfbGV0dGVycyVQJGFzX2NyX0xFVFRFUlMlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgorPiAKKz4gIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIHZhcmlhYmxlIG5hbWUuCis+IGFzX3RyX3NoPSJldmFsIHNlZCAneSUqKyVwcCU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCis+IAorMTAsMTFjNTczLDU4MworPCAjIERlZmF1bHRzOgorPCBhY19oZWxwPQorLS0tCis+IAorPiBleGVjIDc8JjAgPC9kZXYvbnVsbCA2PiYxCis+IAorPiAjIE5hbWUgb2YgdGhlIGhvc3QuCis+ICMgaG9zdG5hbWUgb24gc29tZSBzeXN0ZW1zIChTVlIzLjIsIExpbnV4KSByZXR1cm5zIGEgYm9ndXMgZXhpdCBzdGF0dXMsCis+ICMgc28gdW5hbWUgZ2V0cyBydW4gdG9vLgorPiBhY19ob3N0bmFtZT1gKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWAKKz4gCis+ICMKKz4gIyBJbml0aWFsaXphdGlvbnMuCis+ICMKKzEzLDUyYzU4NSw4MTAKKzwgIyBBbnkgYWRkaXRpb25zIGZyb20gY29uZmlndXJlLmluOgorPCBhY19oZWxwPSIkYWNfaGVscAorPCAgIC0tZW5hYmxlLXN0cmljdCAgICAgICAgIGNvbXBpbGUgd2l0aCBzdHJpY3QgY29tcGlsZXIgb3B0aW9ucyBbZGVmYXVsdD1ub10iCis8IGFjX2hlbHA9IiRhY19oZWxwCis8ICAgLS1lbmFibGUtNjRiaXQtbGlicyAgICAgYnVpbGQgNjQtYml0IGxpYnJhcmllcyBbZGVmYXVsdD15ZXNdIgorPCBhY19oZWxwPSIkYWNfaGVscAorPCAgIC0tZW5hYmxlLXNoYXJlZCAgICAgICAgIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMgW2RlZmF1bHQ9eWVzXSIKKzwgYWNfaGVscD0iJGFjX2hlbHAKKzwgICAtLWVuYWJsZS1zdGF0aWMgICAgICAgICBidWlsZCBzdGF0aWMgbGlicmFyaWVzIFtkZWZhdWx0PW5vXSIKKzwgYWNfaGVscD0iJGFjX2hlbHAKKzwgICAtLWVuYWJsZS1kZWJ1ZyAgICAgICAgICBidWlsZCBkZWJ1ZyBsaWJyYXJpZXMgW2RlZmF1bHQ9bm9dIgorPCBhY19oZWxwPSIkYWNfaGVscAorPCAgIC0tZW5hYmxlLXJlbGVhc2UgICAgICAgIGJ1aWxkIHJlbGVhc2UgbGlicmFyaWVzIFtkZWZhdWx0PXllc10iCis8IGFjX2hlbHA9IiRhY19oZWxwCis8ICAgLS1lbmFibGUtcmVuYW1pbmcgICAgICAgYWRkIGEgdmVyc2lvbiBzdWZmaXggdG8gc3ltYm9scyBbZGVmYXVsdD15ZXNdIgorPCBhY19oZWxwPSIkYWNfaGVscAorPCAgIC0tZW5hYmxlLXRyYWNpbmcgICAgICAgIGVuYWJsZSBmdW5jdGlvbiBhbmQgZGF0YSB0cmFjaW5nIFtkZWZhdWx0PXllc10iCis8IGFjX2hlbHA9IiRhY19oZWxwCis8ICAgLS1lbmFibGUtcnBhdGggICAgICAgICAgdXNlIHJwYXRoIHdoZW4gbGlua2luZyBbZGVmYXVsdCBpcyBvbmx5IGlmIG5lY2Vzc2FyeV0iCis8IGFjX2hlbHA9IiRhY19oZWxwCis8ICAgLS1lbmFibGUtdGhyZWFkcyAgICAgICAgYnVpbGQgSUNVIHdpdGggdGhyZWFkIHNhZmV0eSBbZGVmYXVsdD15ZXNdIgorPCBhY19oZWxwPSIkYWNfaGVscAorPCAgIC0td2l0aC1pb3N0cmVhbT12ZXJzaW9uIHNwZWNpZnkgdGhlIHZlcnNpb24gb2YgaW9zdHJlYW0gdG8gdXNlIChub25lLCBvbGQsIHN0ZCwgYXV0bykgW2RlZmF1bHQ9YXV0b10iCis8IGFjX2hlbHA9IiRhY19oZWxwCis8ICAgLS1lbmFibGUtZXh0cmFzICAgICAgICAgYnVpbGQgSUNVIGV4dHJhcyBbZGVmYXVsdD15ZXNdIgorPCBhY19oZWxwPSIkYWNfaGVscAorPCAgIC0tZW5hYmxlLWljdWlvICAgICAgICAgIGJ1aWxkIElDVSdzIGljdWlvIGxpYnJhcnkgW2RlZmF1bHQ9eWVzXSIKKzwgYWNfaGVscD0iJGFjX2hlbHAKKzwgICAtLWVuYWJsZS1sYXlvdXQgICAgICAgICBidWlsZCBJQ1UncyBsYXlvdXQgbGlicmFyeSBbZGVmYXVsdD15ZXNdIgorPCBhY19oZWxwPSIkYWNfaGVscAorPCAgIC0td2l0aC1kYXRhLXBhY2thZ2luZz10eXBlIHNwZWNpZnkgaG93IHRvIHBhY2thZ2UgSUNVIGRhdGEgKGZpbGVzLCBhcmNoaXZlLCBsaWJyYXJ5LCBhdXRvKSBbZGVmYXVsdD1hdXRvXSIKKzwgYWNfaGVscD0iJGFjX2hlbHAKKzwgIgorPCBhY19oZWxwPSIkYWNfaGVscAorPCAgIC0td2l0aC1saWJyYXJ5LXN1ZmZpeD1zdWZmaXggICAgdGFnIGEgc3VmZml4IHRvIHRoZSBsaWJyYXJ5IG5hbWVzIFtkZWZhdWx0PV0iCis8IGFjX2hlbHA9IiRhY19oZWxwCis8ICAgLS1lbmFibGUtdGVzdHMgICAgICAgICAgYnVpbGQgSUNVIHRlc3RzIFtkZWZhdWx0PXllc10iCis8IGFjX2hlbHA9IiRhY19oZWxwCis8ICAgLS1lbmFibGUtc2FtcGxlcyAgICAgICAgYnVpbGQgSUNVIHNhbXBsZXMgW2RlZmF1bHQ9eWVzXSAgCis8IEFkZGl0aW9uYWxseSwgdGhlIHZhcmlhYmxlIEZPUkNFX0xJQlMgbWF5IGJlIHNldCBiZWZvcmUgY2FsbGluZyBjb25maWd1cmUuIElmIHNldCwgaXQgd2lsbCBSRVBMQUNFIGFueSBhdXRvbWF0aWMgbGlzdCBvZiBsaWJyYXJpZXMuIgorLS0tCis+IGFjX2NsZWFuX2ZpbGVzPQorPiBhY19jb25maWdfbGlib2JqX2Rpcj0uCis+IExJQk9CSlM9Cis+IGNyb3NzX2NvbXBpbGluZz1ubworPiBzdWJkaXJzPQorPiBNRkxBR1M9Cis+IE1BS0VGTEFHUz0KKz4gU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KKz4gCis+ICMgSWRlbnRpdHkgb2YgdGhpcyBwYWNrYWdlLgorPiBQQUNLQUdFX05BTUU9Cis+IFBBQ0tBR0VfVEFSTkFNRT0KKz4gUEFDS0FHRV9WRVJTSU9OPQorPiBQQUNLQUdFX1NUUklORz0KKz4gUEFDS0FHRV9CVUdSRVBPUlQ9Cis+IAorPiBhY191bmlxdWVfZmlsZT0iY29tbW9uL3VuaWNvZGUvdXR5cGVzLmgiCis+ICMgRmFjdG9yaW5nIGRlZmF1bHQgaGVhZGVycyBmb3IgbW9zdCB0ZXN0cy4KKz4gYWNfaW5jbHVkZXNfZGVmYXVsdD0iXAorPiAjaW5jbHVkZSA8c3RkaW8uaD4KKz4gI2lmZGVmIEhBVkVfU1lTX1RZUEVTX0gKKz4gIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKz4gI2VuZGlmCis+ICNpZmRlZiBIQVZFX1NZU19TVEFUX0gKKz4gIyBpbmNsdWRlIDxzeXMvc3RhdC5oPgorPiAjZW5kaWYKKz4gI2lmZGVmIFNURENfSEVBREVSUworPiAjIGluY2x1ZGUgPHN0ZGxpYi5oPgorPiAjIGluY2x1ZGUgPHN0ZGRlZi5oPgorPiAjZWxzZQorPiAjIGlmZGVmIEhBVkVfU1RETElCX0gKKz4gIyAgaW5jbHVkZSA8c3RkbGliLmg+Cis+ICMgZW5kaWYKKz4gI2VuZGlmCis+ICNpZmRlZiBIQVZFX1NUUklOR19ICis+ICMgaWYgIWRlZmluZWQgU1REQ19IRUFERVJTICYmIGRlZmluZWQgSEFWRV9NRU1PUllfSAorPiAjICBpbmNsdWRlIDxtZW1vcnkuaD4KKz4gIyBlbmRpZgorPiAjIGluY2x1ZGUgPHN0cmluZy5oPgorPiAjZW5kaWYKKz4gI2lmZGVmIEhBVkVfU1RSSU5HU19ICis+ICMgaW5jbHVkZSA8c3RyaW5ncy5oPgorPiAjZW5kaWYKKz4gI2lmZGVmIEhBVkVfSU5UVFlQRVNfSAorPiAjIGluY2x1ZGUgPGludHR5cGVzLmg+Cis+ICNlbmRpZgorPiAjaWZkZWYgSEFWRV9TVERJTlRfSAorPiAjIGluY2x1ZGUgPHN0ZGludC5oPgorPiAjZW5kaWYKKz4gI2lmZGVmIEhBVkVfVU5JU1REX0gKKz4gIyBpbmNsdWRlIDx1bmlzdGQuaD4KKz4gI2VuZGlmIgorPiAKKz4gYWNfc3Vic3RfdmFycz0nTFRMSUJPQkpTCis+IExJQk9CSlMKKz4gQUlYX1NITElCCis+IGxkX3JwYXRoX3N1ZgorPiBwbGF0Zm9ybV9tYWtlX2ZyYWdtZW50Cis+IHBsYXRmb3JtX21ha2VfZnJhZ21lbnRfbmFtZQorPiBwbGF0Zm9ybQorPiBJQ1VEQVRBX0NIQVIKKz4gU0FNUExFU19UUlVFCis+IFRFU1RTX1RSVUUKKz4gSUNVTElCU1VGRklYQ05BTUUKKz4gVV9IQVZFX0xJQl9TVUZGSVgKKz4gSUNVTElCU1VGRklYCis+IERBVEFfUEFDS0FHSU5HX01PREUKKz4gREFUQV9QQUNLQUdJTkdfQ1BQRkxBR1MKKz4gdGhlcGtnaWN1ZGF0YWRpcgorPiBwa2dpY3VkYXRhZGlyCis+IHRoZWxpYmRpcgorPiB0aGVkYXRhZGlyCis+IHRoZXN5c2NvbmZkaXIKKz4gTEFZT1VUX1RSVUUKKz4gSUNVSU9fVFJVRQorPiBFWFRSQVNfVFJVRQorPiBVX1NJWkVPRl9XQ0hBUl9UCis+IFVfSEFWRV9XQ1NDUFkKKz4gVV9IQVZFX1dDSEFSX0gKKz4gSEFWRV9VSU5UNjRfVAorPiBIQVZFX0lOVDY0X1QKKz4gSEFWRV9VSU5UMzJfVAorPiBIQVZFX0lOVDMyX1QKKz4gSEFWRV9VSU5UMTZfVAorPiBIQVZFX0lOVDE2X1QKKz4gSEFWRV9VSU5UOF9UCis+IEhBVkVfSU5UOF9UCis+IFVfVElNRVpPTkUKKz4gVV9IQVZFX1RJTUVaT05FCis+IFVfVFpOQU1FCis+IFVfSEFWRV9UWk5BTUUKKz4gVV9UWlNFVAorPiBVX0hBVkVfVFpTRVQKKz4gVV9IQVZFX1BPUEVOCis+IFVfSEFWRV9QTEFDRU1FTlRfTkVXCis+IFVfT1ZFUlJJREVfQ1hYX0FMTE9DQVRJT04KKz4gVV9IQVZFX05BTUVTUEFDRQorPiBVX05MX0xBTkdJTkZPX0NPREVTRVQKKz4gVV9IQVZFX05MX0xBTkdJTkZPX0NPREVTRVQKKz4gVV9IQVZFX05MX0xBTkdJTkZPCis+IFVfSVNfQklHX0VORElBTgorPiBVX0lPU1RSRUFNX1NPVVJDRQorPiBDWFhDUFAKKz4gVV9IQVZFX0lOVFRZUEVTX0gKKz4gRUdSRVAKKz4gR1JFUAorPiBDUFAKKz4gR0VOQ0NPREVfQVNTRU1CTFkKKz4gSEFWRV9NTUFQCis+IElDVV9VU0VfVEhSRUFEUworPiBUSFJFQURTX1RSVUUKKz4gVV9JTkxJTkUKKz4gRU5BQkxFX1JQQVRICis+IFVfRU5BQkxFX1RSQUNJTkcKKz4gVV9ESVNBQkxFX1JFTkFNSU5HCis+IEFSCis+IFJBTkxJQgorPiBFTkFCTEVfUkVMRUFTRQorPiBFTkFCTEVfREVCVUcKKz4gRU5BQkxFX1NUQVRJQworPiBFTkFCTEVfU0hBUkVECis+IExJQl9NCis+IENPTVBJTEVfTElOS19FTlZWQVIKKz4gQVJGTEFHUworPiBob3N0X29zCis+IGhvc3RfdmVuZG9yCis+IGhvc3RfY3B1Cis+IGhvc3QKKz4gYnVpbGRfb3MKKz4gYnVpbGRfdmVuZG9yCis+IGJ1aWxkX2NwdQorPiBidWlsZAorPiBET1hZR0VOCis+IFVfTUFLRQorPiBTVFJJUAorPiBJTlNUQUxMX0RBVEEKKz4gSU5TVEFMTF9TQ1JJUFQKKz4gSU5TVEFMTF9QUk9HUkFNCis+IGFjX2N0X0NYWAorPiBDWFhGTEFHUworPiBDWFgKKz4gT0JKRVhUCis+IEVYRUVYVAorPiBhY19jdF9DQworPiBMREZMQUdTCis+IENGTEFHUworPiBDQworPiBDUFBGTEFHUworPiBVTklDT0RFX1ZFUlNJT04KKz4gTElCX1ZFUlNJT05fTUFKT1IKKz4gTElCX1ZFUlNJT04KKz4gVkVSU0lPTgorPiBQQUNLQUdFCis+IHRhcmdldF9hbGlhcworPiBob3N0X2FsaWFzCis+IGJ1aWxkX2FsaWFzCis+IExJQlMKKz4gRUNIT19UCis+IEVDSE9fTgorPiBFQ0hPX0MKKz4gREVGUworPiBtYW5kaXIKKz4gbG9jYWxlZGlyCis+IGxpYmRpcgorPiBwc2RpcgorPiBwZGZkaXIKKz4gZHZpZGlyCis+IGh0bWxkaXIKKz4gaW5mb2RpcgorPiBkb2NkaXIKKz4gb2xkaW5jbHVkZWRpcgorPiBpbmNsdWRlZGlyCis+IGxvY2Fsc3RhdGVkaXIKKz4gc2hhcmVkc3RhdGVkaXIKKz4gc3lzY29uZmRpcgorPiBkYXRhZGlyCis+IGRhdGFyb290ZGlyCis+IGxpYmV4ZWNkaXIKKz4gc2JpbmRpcgorPiBiaW5kaXIKKz4gcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZQorPiBwcmVmaXgKKz4gZXhlY19wcmVmaXgKKz4gUEFDS0FHRV9CVUdSRVBPUlQKKz4gUEFDS0FHRV9TVFJJTkcKKz4gUEFDS0FHRV9WRVJTSU9OCis+IFBBQ0tBR0VfVEFSTkFNRQorPiBQQUNLQUdFX05BTUUKKz4gUEFUSF9TRVBBUkFUT1IKKz4gU0hFTEwnCis+IGFjX3N1YnN0X2ZpbGVzPScnCis+IGFjX3VzZXJfb3B0cz0nCis+IGVuYWJsZV9vcHRpb25fY2hlY2tpbmcKKz4gZW5hYmxlX3N0cmljdAorPiBlbmFibGVfNjRiaXRfbGlicworPiBlbmFibGVfc2hhcmVkCis+IGVuYWJsZV9zdGF0aWMKKz4gZW5hYmxlX2RlYnVnCis+IGVuYWJsZV9yZWxlYXNlCis+IGVuYWJsZV9yZW5hbWluZworPiBlbmFibGVfdHJhY2luZworPiBlbmFibGVfcnBhdGgKKz4gZW5hYmxlX3RocmVhZHMKKz4gd2l0aF9pb3N0cmVhbQorPiBlbmFibGVfZXh0cmFzCis+IGVuYWJsZV9sYXlvdXQKKz4gd2l0aF9kYXRhX3BhY2thZ2luZworPiBlbmFibGVfbWFwcGVkCis+IHdpdGhfbGlicmFyeV9zdWZmaXgKKz4gZW5hYmxlX3Rlc3RzCis+IGVuYWJsZV9zYW1wbGVzCis+ICcKKz4gICAgICAgYWNfcHJlY2lvdXNfdmFycz0nYnVpbGRfYWxpYXMKKz4gaG9zdF9hbGlhcworPiB0YXJnZXRfYWxpYXMKKz4gQ0MKKz4gQ0ZMQUdTCis+IExERkxBR1MKKz4gTElCUworPiBDUFBGTEFHUworPiBDWFgKKz4gQ1hYRkxBR1MKKz4gQ0NDCis+IENQUAorPiBDWFhDUFAnCis+IAorNTRhODEzLDgxNgorPiBhY19pbml0X2hlbHA9Cis+IGFjX2luaXRfdmVyc2lvbj1mYWxzZQorPiBhY191bnJlY29nbml6ZWRfb3B0cz0KKz4gYWNfdW5yZWNvZ25pemVkX3NlcD0KKzU3LDU4YzgxOQorPCBidWlsZD1OT05FCis8IGNhY2hlX2ZpbGU9Li9jb25maWcuY2FjaGUKKy0tLQorPiBjYWNoZV9maWxlPS9kZXYvbnVsbAorNjBkODIwCis8IGhvc3Q9Tk9ORQorNjJkODIxCis8IG5vbm9wdD1OT05FCis3MWQ4MjkKKzwgdGFyZ2V0PU5PTkUKKzc0YTgzMyw4MzkKKz4gCis+ICMgSW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBvcHRpb25zLgorPiAjIFRoZXNlIGFyZSBsZWZ0IHVuZXhwYW5kZWQgc28gdXNlcnMgY2FuICJtYWtlIGluc3RhbGwgZXhlY19wcmVmaXg9L2ZvbyIKKz4gIyBhbmQgYWxsIHRoZSB2YXJpYWJsZXMgdGhhdCBhcmUgc3VwcG9zZWQgdG8gYmUgYmFzZWQgb24gZXhlY19wcmVmaXgKKz4gIyBieSBkZWZhdWx0IHdpbGwgYWN0dWFsbHkgY2hhbmdlLgorPiAjIFVzZSBicmFjZXMgaW5zdGVhZCBvZiBwYXJlbnMgYmVjYXVzZSBzaCwgcGVybCwgZXRjLiBhbHNvIGFjY2VwdCB0aGVtLgorPiAjIChUaGUgbGlzdCBmb2xsb3dzIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBHTlUgQ29kaW5nIFN0YW5kYXJkcy4pCis3OGM4NDMsODQ0Cis8IGRhdGFkaXI9JyR7cHJlZml4fS9zaGFyZScKKy0tLQorPiBkYXRhcm9vdGRpcj0nJHtwcmVmaXh9L3NoYXJlJworPiBkYXRhZGlyPScke2RhdGFyb290ZGlyfScKKzgyZDg0NworPCBsaWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKKzg1LDkzYzg1MCw4NTgKKzwgaW5mb2Rpcj0nJHtwcmVmaXh9L2luZm8nCis8IG1hbmRpcj0nJHtwcmVmaXh9L21hbicKKzwgCis8ICMgSW5pdGlhbGl6ZSBzb21lIG90aGVyIHZhcmlhYmxlcy4KKzwgc3ViZGlycz0KKzwgTUZMQUdTPSBNQUtFRkxBR1M9Cis8IFNIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Cis8ICMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2hlbGwgaGVyZSBkb2N1bWVudC4KKzwgYWNfbWF4X2hlcmVfbGluZXM9MTIKKy0tLQorPiBkb2NkaXI9JyR7ZGF0YXJvb3RkaXJ9L2RvYy8ke1BBQ0tBR0V9JworPiBpbmZvZGlyPScke2RhdGFyb290ZGlyfS9pbmZvJworPiBodG1sZGlyPScke2RvY2Rpcn0nCis+IGR2aWRpcj0nJHtkb2NkaXJ9JworPiBwZGZkaXI9JyR7ZG9jZGlyfScKKz4gcHNkaXI9JyR7ZG9jZGlyfScKKz4gbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCis+IGxvY2FsZWRpcj0nJHtkYXRhcm9vdGRpcn0vbG9jYWxlJworPiBtYW5kaXI9JyR7ZGF0YXJvb3RkaXJ9L21hbicKKzk1YTg2MQorPiBhY19kYXNoZGFzaD0KKzk4ZDg2MworPCAKKzEwMWM4NjYKKzwgICAgIGV2YWwgIiRhY19wcmV2PVwkYWNfb3B0aW9uIgorLS0tCis+ICAgICBldmFsICRhY19wcmV2PVwkYWNfb3B0aW9uCisxMDYsMTA4Yzg3MSw4NzMKKzwgICBjYXNlICIkYWNfb3B0aW9uIiBpbgorPCAgIC0qPSopIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGlvbiIgfCBzZWQgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OworPCAgICopIGFjX29wdGFyZz0gOzsKKy0tLQorPiAgIGNhc2UgJGFjX29wdGlvbiBpbgorPiAgICo9KikJYWNfb3B0YXJnPWBleHByICJYJGFjX29wdGlvbiIgOiAnW149XSo9XCguKlwpJ2AgOzsKKz4gICAqKQlhY19vcHRhcmc9eWVzIDs7CisxMTNjODc4LDg4MAorPCAgIGNhc2UgIiRhY19vcHRpb24iIGluCistLS0KKz4gICBjYXNlICRhY19kYXNoZGFzaCRhY19vcHRpb24gaW4KKz4gICAtLSkKKz4gICAgIGFjX2Rhc2hkYXNoPXllcyA7OworMTE4Yzg4NQorPCAgICAgYmluZGlyPSIkYWNfb3B0YXJnIiA7OworLS0tCis+ICAgICBiaW5kaXI9JGFjX29wdGFyZyA7OworMTIxYzg4OAorPCAgICAgYWNfcHJldj1idWlsZCA7OworLS0tCis+ICAgICBhY19wcmV2PWJ1aWxkX2FsaWFzIDs7CisxMjNjODkwCis8ICAgICBidWlsZD0iJGFjX29wdGFyZyIgOzsKKy0tLQorPiAgICAgYnVpbGRfYWxpYXM9JGFjX29wdGFyZyA7OworMTMwYzg5Nyw5MDAKKzwgICAgIGNhY2hlX2ZpbGU9IiRhY19vcHRhcmciIDs7CistLS0KKz4gICAgIGNhY2hlX2ZpbGU9JGFjX29wdGFyZyA7OworPiAKKz4gICAtLWNvbmZpZy1jYWNoZSB8IC1DKQorPiAgICAgY2FjaGVfZmlsZT1jb25maWcuY2FjaGUgOzsKKzEzMmM5MDIKKzwgICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCB8IC0tZGF0YSB8IC0tZGF0IHwgLS1kYSkKKy0tLQorPiAgIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkKQorMTM0LDEzNmM5MDQsOTEyCis8ICAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCis8ICAgfCAtLWRhPSopCis8ICAgICBkYXRhZGlyPSIkYWNfb3B0YXJnIiA7OworLS0tCis+ICAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KikKKz4gICAgIGRhdGFkaXI9JGFjX29wdGFyZyA7OworPiAKKz4gICAtZGF0YXJvb3RkaXIgfCAtLWRhdGFyb290ZGlyIHwgLS1kYXRhcm9vdGRpIHwgLS1kYXRhcm9vdGQgfCAtLWRhdGFyb290IFwKKz4gICB8IC0tZGF0YXJvbyB8IC0tZGF0YXJvIHwgLS1kYXRhcikKKz4gICAgIGFjX3ByZXY9ZGF0YXJvb3RkaXIgOzsKKz4gICAtZGF0YXJvb3RkaXI9KiB8IC0tZGF0YXJvb3RkaXI9KiB8IC0tZGF0YXJvb3RkaT0qIHwgLS1kYXRhcm9vdGQ9KiBcCis+ICAgfCAtLWRhdGFyb290PSogfCAtLWRhdGFyb289KiB8IC0tZGF0YXJvPSogfCAtLWRhdGFyPSopCis+ICAgICBkYXRhcm9vdGRpcj0kYWNfb3B0YXJnIDs7CisxMzljOTE1Cis8ICAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZGlzYWJsZS0vLydgCistLS0KKz4gICAgIGFjX3VzZXJvcHQ9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSpkaXNhYmxlLVwoLipcKSdgCisxNDEsMTQ1YzkxNyw5MzkKKzwgICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgorPCAgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Cis8ICAgICBmaQorPCAgICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKKzwgICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PW5vIiA7OworLS0tCis+ICAgICBleHByICJ4JGFjX3VzZXJvcHQiIDogIi4qW14tKy5fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgorPiAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIGZlYXR1cmUgbmFtZTogJGFjX3VzZXJvcHQiID4mMgorPiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKz4gICAgIGFjX3VzZXJvcHRfb3JpZz0kYWNfdXNlcm9wdAorPiAgICAgYWNfdXNlcm9wdD1gJGFzX2VjaG8gIiRhY191c2Vyb3B0IiB8IHNlZCAncy9bLSsuXS9fL2cnYAorPiAgICAgY2FzZSAkYWNfdXNlcl9vcHRzIGluCis+ICAgICAgICoiCis+ICJlbmFibGVfJGFjX3VzZXJvcHQiCis+ICIqKSA7OworPiAgICAgICAqKSBhY191bnJlY29nbml6ZWRfb3B0cz0iJGFjX3VucmVjb2duaXplZF9vcHRzJGFjX3VucmVjb2duaXplZF9zZXAtLWRpc2FibGUtJGFjX3VzZXJvcHRfb3JpZyIKKz4gCSBhY191bnJlY29nbml6ZWRfc2VwPScsICc7OworPiAgICAgZXNhYworPiAgICAgZXZhbCBlbmFibGVfJGFjX3VzZXJvcHQ9bm8gOzsKKz4gCis+ICAgLWRvY2RpciB8IC0tZG9jZGlyIHwgLS1kb2NkaSB8IC0tZG9jIHwgLS1kbykKKz4gICAgIGFjX3ByZXY9ZG9jZGlyIDs7Cis+ICAgLWRvY2Rpcj0qIHwgLS1kb2NkaXI9KiB8IC0tZG9jZGk9KiB8IC0tZG9jPSogfCAtLWRvPSopCis+ICAgICBkb2NkaXI9JGFjX29wdGFyZyA7OworPiAKKz4gICAtZHZpZGlyIHwgLS1kdmlkaXIgfCAtLWR2aWRpIHwgLS1kdmlkIHwgLS1kdmkgfCAtLWR2KQorPiAgICAgYWNfcHJldj1kdmlkaXIgOzsKKz4gICAtZHZpZGlyPSogfCAtLWR2aWRpcj0qIHwgLS1kdmlkaT0qIHwgLS1kdmlkPSogfCAtLWR2aT0qIHwgLS1kdj0qKQorPiAgICAgZHZpZGlyPSRhY19vcHRhcmcgOzsKKzE0OGM5NDIKKzwgICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSplbmFibGUtLy8nIC1lICdzLz0uKi8vJ2AKKy0tLQorPiAgICAgYWNfdXNlcm9wdD1gZXhwciAieCRhY19vcHRpb24iIDogJ3gtKmVuYWJsZS1cKFtePV0qXCknYAorMTUwLDE1NmM5NDQsOTU0Cis8ICAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KKzwgICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorPCAgICAgZmkKKzwgICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCis8ICAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgorPCAgICAgICAqPSopIDs7Cis8ICAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKKy0tLQorPiAgICAgZXhwciAieCRhY191c2Vyb3B0IiA6ICIuKlteLSsuXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKz4gICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCBmZWF0dXJlIG5hbWU6ICRhY191c2Vyb3B0IiA+JjIKKz4gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Cis+ICAgICBhY191c2Vyb3B0X29yaWc9JGFjX3VzZXJvcHQKKz4gICAgIGFjX3VzZXJvcHQ9YCRhc19lY2hvICIkYWNfdXNlcm9wdCIgfCBzZWQgJ3MvWy0rLl0vXy9nJ2AKKz4gICAgIGNhc2UgJGFjX3VzZXJfb3B0cyBpbgorPiAgICAgICAqIgorPiAiZW5hYmxlXyRhY191c2Vyb3B0IgorPiAiKikgOzsKKz4gICAgICAgKikgYWNfdW5yZWNvZ25pemVkX29wdHM9IiRhY191bnJlY29nbml6ZWRfb3B0cyRhY191bnJlY29nbml6ZWRfc2VwLS1lbmFibGUtJGFjX3VzZXJvcHRfb3JpZyIKKz4gCSBhY191bnJlY29nbml6ZWRfc2VwPScsICc7OworMTU4Yzk1NgorPCAgICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09JyRhY19vcHRhcmcnIiA7OworLS0tCis+ICAgICBldmFsIGVuYWJsZV8kYWNfdXNlcm9wdD1cJGFjX29wdGFyZyA7OworMTY3Yzk2NQorPCAgICAgZXhlY19wcmVmaXg9IiRhY19vcHRhcmciIDs7CistLS0KKz4gICAgIGV4ZWNfcHJlZml4PSRhY19vcHRhcmcgOzsKKzE3MywyMjZjOTcxLDk3NgorPCAgIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlKQorPCAgICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCis8ICAgICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCis8ICAgICBjYXQgPDwgRU9GCis8IFVzYWdlOiBjb25maWd1cmUgW29wdGlvbnNdIFtob3N0XQorPCBPcHRpb25zOiBbZGVmYXVsdHMgaW4gYnJhY2tldHMgYWZ0ZXIgZGVzY3JpcHRpb25zXQorPCBDb25maWd1cmF0aW9uOgorPCAgIC0tY2FjaGUtZmlsZT1GSUxFICAgICAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFCis8ICAgLS1oZWxwICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlCis8ICAgLS1uby1jcmVhdGUgICAgICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKKzwgICAtLXF1aWV0LCAtLXNpbGVudCAgICAgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKKzwgICAtLXZlcnNpb24gICAgICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBvZiBhdXRvY29uZiB0aGF0IGNyZWF0ZWQgY29uZmlndXJlCis8IERpcmVjdG9yeSBhbmQgZmlsZSBuYW1lczoKKzwgICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKKzwgICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQorPCAgIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCis8ICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NhbWUgYXMgcHJlZml4XQorPCAgIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2Jpbl0KKzwgICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL3NiaW5dCis8ICAgLS1saWJleGVjZGlyPURJUiAgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvbGliZXhlY10KKzwgICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCis8ICAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9zaGFyZV0KKzwgICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC9ldGNdCis8ICAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKKzwgICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL2NvbV0KKzwgICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvdmFyXQorPCAgIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBpbiBESVIgW0VQUkVGSVgvbGliXQorPCAgIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIGluIERJUiBbUFJFRklYL2luY2x1ZGVdCis8ICAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgaW4gRElSIFsvdXNyL2luY2x1ZGVdCis8ICAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL2luZm9dCis8ICAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvbWFuXQorPCAgIC0tc3JjZGlyPURJUiAgICAgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIC4uXQorPCAgIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCis8ICAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcworPCAgIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNCis8ICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCis8IEVPRgorPCAgICAgY2F0IDw8IEVPRgorPCBIb3N0IHR5cGU6Cis8ICAgLS1idWlsZD1CVUlMRCAgICAgICAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbQlVJTEQ9SE9TVF0KKzwgICAtLWhvc3Q9SE9TVCAgICAgICAgICAgICBjb25maWd1cmUgZm9yIEhPU1QgW2d1ZXNzZWRdCis8ICAgLS10YXJnZXQ9VEFSR0VUICAgICAgICAgY29uZmlndXJlIGZvciBUQVJHRVQgW1RBUkdFVD1IT1NUXQorPCBGZWF0dXJlcyBhbmQgcGFja2FnZXM6Cis8ICAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQorPCAgIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KKzwgICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KKzwgICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCis8ICAgLS14LWluY2x1ZGVzPURJUiAgICAgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKKzwgICAtLXgtbGlicmFyaWVzPURJUiAgICAgICBYIGxpYnJhcnkgZmlsZXMgYXJlIGluIERJUgorPCBFT0YKKzwgICAgIGlmIHRlc3QgLW4gIiRhY19oZWxwIjsgdGhlbgorPCAgICAgICBlY2hvICItLWVuYWJsZSBhbmQgLS13aXRoIG9wdGlvbnMgcmVjb2duaXplZDokYWNfaGVscCIKKzwgICAgIGZpCis8ICAgICBleGl0IDAgOzsKKy0tLQorPiAgIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLWgpCis+ICAgICBhY19pbml0X2hlbHA9bG9uZyA7OworPiAgIC1oZWxwPXIqIHwgLS1oZWxwPXIqIHwgLS1oZWw9ciogfCAtLWhlPXIqIHwgLWhyKikKKz4gICAgIGFjX2luaXRfaGVscD1yZWN1cnNpdmUgOzsKKz4gICAtaGVscD1zKiB8IC0taGVscD1zKiB8IC0taGVsPXMqIHwgLS1oZT1zKiB8IC1ocyopCis+ICAgICBhY19pbml0X2hlbHA9c2hvcnQgOzsKKzIyOWM5NzkKKzwgICAgIGFjX3ByZXY9aG9zdCA7OworLS0tCis+ICAgICBhY19wcmV2PWhvc3RfYWxpYXMgOzsKKzIzMWM5ODEsOTg3Cis8ICAgICBob3N0PSIkYWNfb3B0YXJnIiA7OworLS0tCis+ICAgICBob3N0X2FsaWFzPSRhY19vcHRhcmcgOzsKKz4gCis+ICAgLWh0bWxkaXIgfCAtLWh0bWxkaXIgfCAtLWh0bWxkaSB8IC0taHRtbGQgfCAtLWh0bWwgfCAtLWh0bSB8IC0taHQpCis+ICAgICBhY19wcmV2PWh0bWxkaXIgOzsKKz4gICAtaHRtbGRpcj0qIHwgLS1odG1sZGlyPSogfCAtLWh0bWxkaT0qIHwgLS1odG1sZD0qIHwgLS1odG1sPSogfCAtLWh0bT0qIFwKKz4gICB8IC0taHQ9KikKKz4gICAgIGh0bWxkaXI9JGFjX29wdGFyZyA7OworMjM4Yzk5NAorPCAgICAgaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKKy0tLQorPiAgICAgaW5jbHVkZWRpcj0kYWNfb3B0YXJnIDs7CisyNDNjOTk5Cis8ICAgICBpbmZvZGlyPSIkYWNfb3B0YXJnIiA7OworLS0tCis+ICAgICBpbmZvZGlyPSRhY19vcHRhcmcgOzsKKzI0OGMxMDA0Cis8ICAgICBsaWJkaXI9IiRhY19vcHRhcmciIDs7CistLS0KKz4gICAgIGxpYmRpcj0kYWNfb3B0YXJnIDs7CisyNTVjMTAxMSwxMDE2Cis8ICAgICBsaWJleGVjZGlyPSIkYWNfb3B0YXJnIiA7OworLS0tCis+ICAgICBsaWJleGVjZGlyPSRhY19vcHRhcmcgOzsKKz4gCis+ICAgLWxvY2FsZWRpciB8IC0tbG9jYWxlZGlyIHwgLS1sb2NhbGVkaSB8IC0tbG9jYWxlZCB8IC0tbG9jYWxlKQorPiAgICAgYWNfcHJldj1sb2NhbGVkaXIgOzsKKz4gICAtbG9jYWxlZGlyPSogfCAtLWxvY2FsZWRpcj0qIHwgLS1sb2NhbGVkaT0qIHwgLS1sb2NhbGVkPSogfCAtLWxvY2FsZT0qKQorPiAgICAgbG9jYWxlZGlyPSRhY19vcHRhcmcgOzsKKzI1OCwyNTljMTAxOQorPCAgIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IFwKKzwgICB8IC0tbG9jYWxzIHwgLS1sb2NhbCB8IC0tbG9jYSB8IC0tbG9jIHwgLS1sbykKKy0tLQorPiAgIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IHwgLS1sb2NhbHMpCisyNjIsMjY0YzEwMjIsMTAyMworPCAgIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogXAorPCAgIHwgLS1sb2NhbHM9KiB8IC0tbG9jYWw9KiB8IC0tbG9jYT0qIHwgLS1sb2M9KiB8IC0tbG89KikKKzwgICAgIGxvY2Fsc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7CistLS0KKz4gICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIHwgLS1sb2NhbHM9KikKKz4gICAgIGxvY2Fsc3RhdGVkaXI9JGFjX29wdGFyZyA7OworMjY5YzEwMjgKKzwgICAgIG1hbmRpcj0iJGFjX29wdGFyZyIgOzsKKy0tLQorPiAgICAgbWFuZGlyPSRhY19vcHRhcmcgOzsKKzI3NmMxMDM1Cis8ICAgfCAtLW5vLWNyIHwgLS1uby1jKQorLS0tCis+ICAgfCAtLW5vLWNyIHwgLS1uby1jIHwgLW4pCisyOTBjMTA0OQorPCAgICAgb2xkaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKKy0tLQorPiAgICAgb2xkaW5jbHVkZWRpcj0kYWNfb3B0YXJnIDs7CisyOTVjMTA1NAorPCAgICAgcHJlZml4PSIkYWNfb3B0YXJnIiA7OworLS0tCis+ICAgICBwcmVmaXg9JGFjX29wdGFyZyA7OworMzAyYzEwNjEKKzwgICAgIHByb2dyYW1fcHJlZml4PSIkYWNfb3B0YXJnIiA7OworLS0tCis+ICAgICBwcm9ncmFtX3ByZWZpeD0kYWNfb3B0YXJnIDs7CiszMDljMTA2OAorPCAgICAgcHJvZ3JhbV9zdWZmaXg9IiRhY19vcHRhcmciIDs7CistLS0KKz4gICAgIHByb2dyYW1fc3VmZml4PSRhY19vcHRhcmcgOzsKKzMyNmMxMDg1LDEwOTUKKzwgICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9IiRhY19vcHRhcmciIDs7CistLS0KKz4gICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9JGFjX29wdGFyZyA7OworPiAKKz4gICAtcGRmZGlyIHwgLS1wZGZkaXIgfCAtLXBkZmRpIHwgLS1wZGZkIHwgLS1wZGYgfCAtLXBkKQorPiAgICAgYWNfcHJldj1wZGZkaXIgOzsKKz4gICAtcGRmZGlyPSogfCAtLXBkZmRpcj0qIHwgLS1wZGZkaT0qIHwgLS1wZGZkPSogfCAtLXBkZj0qIHwgLS1wZD0qKQorPiAgICAgcGRmZGlyPSRhY19vcHRhcmcgOzsKKz4gCis+ICAgLXBzZGlyIHwgLS1wc2RpciB8IC0tcHNkaSB8IC0tcHNkIHwgLS1wcykKKz4gICAgIGFjX3ByZXY9cHNkaXIgOzsKKz4gICAtcHNkaXI9KiB8IC0tcHNkaXI9KiB8IC0tcHNkaT0qIHwgLS1wc2Q9KiB8IC0tcHM9KikKKz4gICAgIHBzZGlyPSRhY19vcHRhcmcgOzsKKzMzNmMxMTA1Cis8ICAgICBzYmluZGlyPSIkYWNfb3B0YXJnIiA7OworLS0tCis+ICAgICBzYmluZGlyPSRhY19vcHRhcmcgOzsKKzM0N2MxMTE2Cis8ICAgICBzaGFyZWRzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKKy0tLQorPiAgICAgc2hhcmVkc3RhdGVkaXI9JGFjX29wdGFyZyA7OworMzUyYzExMjEKKzwgICAgIHNpdGU9IiRhY19vcHRhcmciIDs7CistLS0KKz4gICAgIHNpdGU9JGFjX29wdGFyZyA7OworMzU3YzExMjYKKzwgICAgIHNyY2Rpcj0iJGFjX29wdGFyZyIgOzsKKy0tLQorPiAgICAgc3JjZGlyPSRhY19vcHRhcmcgOzsKKzM2NGMxMTMzCis8ICAgICBzeXNjb25mZGlyPSIkYWNfb3B0YXJnIiA7OworLS0tCis+ICAgICBzeXNjb25mZGlyPSRhY19vcHRhcmcgOzsKKzM2N2MxMTM2Cis8ICAgICBhY19wcmV2PXRhcmdldCA7OworLS0tCis+ICAgICBhY19wcmV2PXRhcmdldF9hbGlhcyA7OworMzY5YzExMzgKKzwgICAgIHRhcmdldD0iJGFjX29wdGFyZyIgOzsKKy0tLQorPiAgICAgdGFyZ2V0X2FsaWFzPSRhY19vcHRhcmcgOzsKKzM3NCwzNzZjMTE0MywxMTQ0Cis8ICAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMpCis8ICAgICBlY2hvICJjb25maWd1cmUgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMyIKKzwgICAgIGV4aXQgMCA7OworLS0tCis+ICAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtVikKKz4gICAgIGFjX2luaXRfdmVyc2lvbj06IDs7CiszNzljMTE0NworPCAgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGgtLy8nIC1lICdzLz0uKi8vJ2AKKy0tLQorPiAgICAgYWNfdXNlcm9wdD1gZXhwciAieCRhY19vcHRpb24iIDogJ3gtKndpdGgtXChbXj1dKlwpJ2AKKzM4MSwzODdjMTE0OSwxMTU5Cis8ICAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KKzwgICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQorPCAgICAgZmkKKzwgICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCis8ICAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgorPCAgICAgICAqPSopIDs7Cis8ICAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKKy0tLQorPiAgICAgZXhwciAieCRhY191c2Vyb3B0IiA6ICIuKlteLSsuXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKz4gICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCBwYWNrYWdlIG5hbWU6ICRhY191c2Vyb3B0IiA+JjIKKz4gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Cis+ICAgICBhY191c2Vyb3B0X29yaWc9JGFjX3VzZXJvcHQKKz4gICAgIGFjX3VzZXJvcHQ9YCRhc19lY2hvICIkYWNfdXNlcm9wdCIgfCBzZWQgJ3MvWy0rLl0vXy9nJ2AKKz4gICAgIGNhc2UgJGFjX3VzZXJfb3B0cyBpbgorPiAgICAgICAqIgorPiAid2l0aF8kYWNfdXNlcm9wdCIKKz4gIiopIDs7Cis+ICAgICAgICopIGFjX3VucmVjb2duaXplZF9vcHRzPSIkYWNfdW5yZWNvZ25pemVkX29wdHMkYWNfdW5yZWNvZ25pemVkX3NlcC0td2l0aC0kYWNfdXNlcm9wdF9vcmlnIgorPiAJIGFjX3VucmVjb2duaXplZF9zZXA9JywgJzs7CiszODljMTE2MQorPCAgICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PSckYWNfb3B0YXJnJyIgOzsKKy0tLQorPiAgICAgZXZhbCB3aXRoXyRhY191c2Vyb3B0PVwkYWNfb3B0YXJnIDs7CiszOTJjMTE2NAorPCAgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGhvdXQtLy8nYAorLS0tCis+ICAgICBhY191c2Vyb3B0PWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qd2l0aG91dC1cKC4qXCknYAorMzk0LDM5OGMxMTY2LDExNzgKKzwgICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgorPCAgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Cis8ICAgICBmaQorPCAgICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKKzwgICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT1ubyIgOzsKKy0tLQorPiAgICAgZXhwciAieCRhY191c2Vyb3B0IiA6ICIuKlteLSsuXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKz4gICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCBwYWNrYWdlIG5hbWU6ICRhY191c2Vyb3B0IiA+JjIKKz4gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Cis+ICAgICBhY191c2Vyb3B0X29yaWc9JGFjX3VzZXJvcHQKKz4gICAgIGFjX3VzZXJvcHQ9YCRhc19lY2hvICIkYWNfdXNlcm9wdCIgfCBzZWQgJ3MvWy0rLl0vXy9nJ2AKKz4gICAgIGNhc2UgJGFjX3VzZXJfb3B0cyBpbgorPiAgICAgICAqIgorPiAid2l0aF8kYWNfdXNlcm9wdCIKKz4gIiopIDs7Cis+ICAgICAgICopIGFjX3VucmVjb2duaXplZF9vcHRzPSIkYWNfdW5yZWNvZ25pemVkX29wdHMkYWNfdW5yZWNvZ25pemVkX3NlcC0td2l0aG91dC0kYWNfdXNlcm9wdF9vcmlnIgorPiAJIGFjX3VucmVjb2duaXplZF9zZXA9JywgJzs7Cis+ICAgICBlc2FjCis+ICAgICBldmFsIHdpdGhfJGFjX3VzZXJvcHQ9bm8gOzsKKzQwOWMxMTg5Cis8ICAgICB4X2luY2x1ZGVzPSIkYWNfb3B0YXJnIiA7OworLS0tCis+ICAgICB4X2luY2x1ZGVzPSRhY19vcHRhcmcgOzsKKzQxNmMxMTk2Cis8ICAgICB4X2xpYnJhcmllcz0iJGFjX29wdGFyZyIgOzsKKy0tLQorPiAgICAgeF9saWJyYXJpZXM9JGFjX29wdGFyZyA7OworNDE4YzExOTgsMTIwMAorPCAgIC0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19vcHRpb246IGludmFsaWQgb3B0aW9uOyB1c2UgLS1oZWxwIHRvIHNob3cgdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQorLS0tCis+ICAgLSopIHsgJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IHVucmVjb2duaXplZCBvcHRpb246ICRhY19vcHRpb24KKz4gVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iID4mMgorPiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKzQyMGExMjAzLDEyMTEKKz4gICAqPSopCis+ICAgICBhY19lbnZ2YXI9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4XChbXj1dKlwpPSdgCis+ICAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCis+ICAgICBleHByICJ4JGFjX2VudnZhciIgOiAiLipbXl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCis+ICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgdmFyaWFibGUgbmFtZTogJGFjX2VudnZhciIgPiYyCis+ICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorPiAgICAgZXZhbCAkYWNfZW52dmFyPVwkYWNfb3B0YXJnCis+ICAgICBleHBvcnQgJGFjX2VudnZhciA7OworPiAKKzQyMiw0MjhjMTIxMywxMjE3Cis8ICAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgorPCAgICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6ICRhY19vcHRpb246IGludmFsaWQgaG9zdCB0eXBlIiAxPiYyCis8ICAgICBmaQorPCAgICAgaWYgdGVzdCAieCRub25vcHQiICE9IHhOT05FOyB0aGVuCis8ICAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfQorPCAgICAgZmkKKzwgICAgIG5vbm9wdD0iJGFjX29wdGlvbiIKKy0tLQorPiAgICAgIyBGSVhNRTogc2hvdWxkIGJlIHJlbW92ZWQgaW4gYXV0b2NvbmYgMy4wLgorPiAgICAgJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogeW91IHNob3VsZCB1c2UgLS1idWlsZCwgLS1ob3N0LCAtLXRhcmdldCIgPiYyCis+ICAgICBleHByICJ4JGFjX29wdGlvbiIgOiAiLipbXi0uXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKz4gICAgICAgJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogaW52YWxpZCBob3N0IHR5cGU6ICRhY19vcHRpb24iID4mMgorPiAgICAgOiAke2J1aWxkX2FsaWFzPSRhY19vcHRpb259ICR7aG9zdF9hbGlhcz0kYWNfb3B0aW9ufSAke3RhcmdldF9hbGlhcz0kYWNfb3B0aW9ufQorNDM1YzEyMjQsMTIyNgorPCAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAtLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AiIDE+JjI7IGV4aXQgMTsgfQorLS0tCis+ICAgYWNfb3B0aW9uPS0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYAorPiAgIHsgJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gJGFjX29wdGlvbiIgPiYyCis+ICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorNDM4LDQ1MWMxMjI5LDEyMzUKKzwgdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKKzwgCis8ICMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgorPCAjIDAgc3RhbmRhcmQgaW5wdXQKKzwgIyAxIGZpbGUgY3JlYXRpb24KKzwgIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKKzwgIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQorPCAjIDQgdXNlZCBvbiB0aGUgS3Vib3RhIFRpdGFuCis8ICMgNiBjaGVja2luZyBmb3IuLi4gbWVzc2FnZXMgYW5kIHJlc3VsdHMKKzwgIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKKzwgaWYgdGVzdCAiJHNpbGVudCIgPSB5ZXM7IHRoZW4KKzwgICBleGVjIDY+L2Rldi9udWxsCis8IGVsc2UKKzwgICBleGVjIDY+JjEKKy0tLQorPiBpZiB0ZXN0IC1uICIkYWNfdW5yZWNvZ25pemVkX29wdHMiOyB0aGVuCis+ICAgY2FzZSAkZW5hYmxlX29wdGlvbl9jaGVja2luZyBpbgorPiAgICAgbm8pIDs7Cis+ICAgICBmYXRhbCkgeyAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogdW5yZWNvZ25pemVkIG9wdGlvbnM6ICRhY191bnJlY29nbml6ZWRfb3B0cyIgPiYyCis+ICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfSA7OworPiAgICAgKikgICAgICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVucmVjb2duaXplZCBvcHRpb25zOiAkYWNfdW5yZWNvZ25pemVkX29wdHMiID4mMiA7OworPiAgIGVzYWMKKzQ1Myw0NThkMTIzNgorPCBleGVjIDU+Li9jb25maWcubG9nCis8IAorPCBlY2hvICJcCis8IFRoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCis8IHJ1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCis8ICIgMT4mNQorNDYwLDQ2M2MxMjM4LDEyNDIKKzwgIyBTdHJpcCBvdXQgLS1uby1jcmVhdGUgYW5kIC0tbm8tcmVjdXJzaW9uIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCis8ICMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgorPCBhY19jb25maWd1cmVfYXJncz0KKzwgZm9yIGFjX2FyZworLS0tCis+ICMgQ2hlY2sgYWxsIGRpcmVjdG9yeSBhcmd1bWVudHMgZm9yIGNvbnNpc3RlbmN5LgorPiBmb3IgYWNfdmFyIGluCWV4ZWNfcHJlZml4IHByZWZpeCBiaW5kaXIgc2JpbmRpciBsaWJleGVjZGlyIGRhdGFyb290ZGlyIFwKKz4gCQlkYXRhZGlyIHN5c2NvbmZkaXIgc2hhcmVkc3RhdGVkaXIgbG9jYWxzdGF0ZWRpciBpbmNsdWRlZGlyIFwKKz4gCQlvbGRpbmNsdWRlZGlyIGRvY2RpciBpbmZvZGlyIGh0bWxkaXIgZHZpZGlyIHBkZmRpciBwc2RpciBcCis+IAkJbGliZGlyIGxvY2FsZWRpciBtYW5kaXIKKzQ2NSw0NzJjMTI0NCwxMjU0Cis8ICAgY2FzZSAiJGFjX2FyZyIgaW4KKzwgICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAorPCAgIHwgLS1uby1jciB8IC0tbm8tYykgOzsKKzwgICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKKzwgICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikgOzsKKzwgICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP10qKQorPCAgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OworPCAgICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKKy0tLQorPiAgIGV2YWwgYWNfdmFsPVwkJGFjX3ZhcgorPiAgICMgUmVtb3ZlIHRyYWlsaW5nIHNsYXNoZXMuCis+ICAgY2FzZSAkYWNfdmFsIGluCis+ICAgICAqLyApCis+ICAgICAgIGFjX3ZhbD1gZXhwciAiWCRhY192YWwiIDogJ1hcKC4qW14vXVwpJyBcfCAiWCRhY192YWwiIDogJ1hcKC4qXCknYAorPiAgICAgICBldmFsICRhY192YXI9XCRhY192YWw7OworPiAgIGVzYWMKKz4gICAjIEJlIHN1cmUgdG8gaGF2ZSBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZXMuCis+ICAgY2FzZSAkYWNfdmFsIGluCis+ICAgICBbXFwvJF0qIHwgPzpbXFwvXSogKSAgY29udGludWU7OworPiAgICAgTk9ORSB8ICcnICkgY2FzZSAkYWNfdmFyIGluICpwcmVmaXggKSBjb250aW51ZTs7IGVzYWM7OworNDczYTEyNTYsMTI1NworPiAgIHsgJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGV4cGVjdGVkIGFuIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIGZvciAtLSRhY192YXI6ICRhY192YWwiID4mMgorPiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKzQ3Niw0ODRjMTI2MCwxMjkxCis8ICMgTkxTIG51aXNhbmNlcy4KKzwgIyBPbmx5IHNldCB0aGVzZSB0byBDIGlmIGFscmVhZHkgc2V0LiAgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseQorPCAjIGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KKzwgIyBGaXhpbmcgTENfTUVTU0FHRVMgcHJldmVudHMgU29sYXJpcyBzaCBmcm9tIHRyYW5zbGF0aW5nIHZhciB2YWx1ZXMgaW4gYHNldCchCis8ICMgTm9uLUMgTENfQ1RZUEUgdmFsdWVzIGJyZWFrIHRoZSBjdHlwZSBjaGVjay4KKzwgaWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCis8IGlmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuIExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyBmaQorPCBpZiB0ZXN0ICIke0xDX01FU1NBR0VTK3NldH0iID0gc2V0OyB0aGVuIExDX01FU1NBR0VTPUM7IGV4cG9ydCBMQ19NRVNTQUdFUzsgZmkKKzwgaWYgdGVzdCAiJHtMQ19DVFlQRStzZXR9IiAgICA9IHNldDsgdGhlbiBMQ19DVFlQRT1DOyAgICBleHBvcnQgTENfQ1RZUEU7ICAgIGZpCistLS0KKz4gIyBUaGVyZSBtaWdodCBiZSBwZW9wbGUgd2hvIGRlcGVuZCBvbiB0aGUgb2xkIGJyb2tlbiBiZWhhdmlvcjogYCRob3N0JworPiAjIHVzZWQgdG8gaG9sZCB0aGUgYXJndW1lbnQgb2YgLS1ob3N0IGV0Yy4KKz4gIyBGSVhNRTogVG8gcmVtb3ZlIHNvbWUgZGF5LgorPiBidWlsZD0kYnVpbGRfYWxpYXMKKz4gaG9zdD0kaG9zdF9hbGlhcworPiB0YXJnZXQ9JHRhcmdldF9hbGlhcworPiAKKz4gIyBGSVhNRTogVG8gcmVtb3ZlIHNvbWUgZGF5LgorPiBpZiB0ZXN0ICJ4JGhvc3RfYWxpYXMiICE9IHg7IHRoZW4KKz4gICBpZiB0ZXN0ICJ4JGJ1aWxkX2FsaWFzIiA9IHg7IHRoZW4KKz4gICAgIGNyb3NzX2NvbXBpbGluZz1tYXliZQorPiAgICAgJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogSWYgeW91IHdhbnRlZCB0byBzZXQgdGhlIC0tYnVpbGQgdHlwZSwgZG9uJ3QgdXNlIC0taG9zdC4KKz4gICAgIElmIGEgY3Jvc3MgY29tcGlsZXIgaXMgZGV0ZWN0ZWQgdGhlbiBjcm9zcyBjb21waWxlIG1vZGUgd2lsbCBiZSB1c2VkLiIgPiYyCis+ICAgZWxpZiB0ZXN0ICJ4JGJ1aWxkX2FsaWFzIiAhPSAieCRob3N0X2FsaWFzIjsgdGhlbgorPiAgICAgY3Jvc3NfY29tcGlsaW5nPXllcworPiAgIGZpCis+IGZpCis+IAorPiBhY190b29sX3ByZWZpeD0KKz4gdGVzdCAtbiAiJGhvc3RfYWxpYXMiICYmIGFjX3Rvb2xfcHJlZml4PSRob3N0X2FsaWFzLQorPiAKKz4gdGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYgZXhlYyA2Pi9kZXYvbnVsbAorPiAKKz4gCis+IGFjX3B3ZD1gcHdkYCAmJiB0ZXN0IC1uICIkYWNfcHdkIiAmJgorPiBhY19sc19kaT1gbHMgLWRpIC5gICYmCis+IGFjX3B3ZF9sc19kaT1gY2QgIiRhY19wd2QiICYmIGxzIC1kaSAuYCB8fAorPiAgIHsgJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IHdvcmtpbmcgZGlyZWN0b3J5IGNhbm5vdCBiZSBkZXRlcm1pbmVkIiA+JjIKKz4gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Cis+IHRlc3QgIlgkYWNfbHNfZGkiID0gIlgkYWNfcHdkX2xzX2RpIiB8fAorPiAgIHsgJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IHB3ZCBkb2VzIG5vdCByZXBvcnQgbmFtZSBvZiB3b3JraW5nIGRpcmVjdG9yeSIgPiYyCis+ICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorNDg2LDQ5M2QxMjkyCis8ICMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCis8IHJtIC1yZiBjb25mdGVzdCogY29uZmRlZnMuaAorPCAjIEFJWCBjcHAgbG9zZXMgb24gYW4gZW1wdHkgZmlsZSwgc28gbWFrZSBzdXJlIGl0IGNvbnRhaW5zIGF0IGxlYXN0IGEgbmV3bGluZS4KKzwgZWNobyA+IGNvbmZkZWZzLmgKKzwgCis8ICMgQSBmaWxlbmFtZSB1bmlxdWUgdG8gdGhpcyBwYWNrYWdlLCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHRoYXQKKzwgIyBjb25maWd1cmUgaXMgaW4sIHdoaWNoIHdlIGNhbiBsb29rIGZvciB0byBmaW5kIG91dCBpZiBzcmNkaXIgaXMgY29ycmVjdC4KKzwgYWNfdW5pcXVlX2ZpbGU9Y29tbW9uL3VuaWNvZGUvdXR5cGVzLmgKKzQ5OCw1MDFjMTI5NywxMzIwCis8ICAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIGl0cyBwYXJlbnQuCis8ICAgYWNfcHJvZz0kMAorPCAgIGFjX2NvbmZkaXI9YGVjaG8gJGFjX3Byb2d8c2VkICdzJS9bXi9dW14vXSokJSUnYAorPCAgIHRlc3QgIngkYWNfY29uZmRpciIgPSAieCRhY19wcm9nIiAmJiBhY19jb25mZGlyPS4KKy0tLQorPiAgICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiB0aGUgcGFyZW50IGRpcmVjdG9yeS4KKz4gICBhY19jb25mZGlyPWAkYXNfZGlybmFtZSAtLSAiJGFzX215c2VsZiIgfHwKKz4gJGFzX2V4cHIgWCIkYXNfbXlzZWxmIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAorPiAJIFgiJGFzX215c2VsZiIgOiAnWFwoLy9cKVteL10nIFx8IFwKKz4gCSBYIiRhc19teXNlbGYiIDogJ1hcKC8vXCkkJyBcfCBcCis+IAkgWCIkYXNfbXlzZWxmIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKKz4gJGFzX2VjaG8gWCIkYXNfbXlzZWxmIiB8Cis+ICAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveworPiAJICAgIHMvL1wxLworPiAJICAgIHEKKz4gCSAgfQorPiAJICAvXlhcKFwvXC9cKVteL10uKi97Cis+IAkgICAgcy8vXDEvCis+IAkgICAgcQorPiAJICB9Cis+IAkgIC9eWFwoXC9cL1wpJC97Cis+IAkgICAgcy8vXDEvCis+IAkgICAgcQorPiAJICB9Cis+IAkgIC9eWFwoXC9cKS4qL3sKKz4gCSAgICBzLy9cMS8KKz4gCSAgICBxCis+IAkgIH0KKz4gCSAgcy8uKi8uLzsgcSdgCis1MDNjMTMyMgorPCAgIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgorLS0tCis+ICAgaWYgdGVzdCAhIC1yICIkc3JjZGlyLyRhY191bmlxdWVfZmlsZSI7IHRoZW4KKzUwOSw1MzBjMTMyOCwxMzUyCis8IGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgorPCAgIGlmIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllczsgdGhlbgorPCAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkYWNfY29uZmRpciBvciAuLiIgMT4mMjsgZXhpdCAxOyB9Cis8ICAgZWxzZQorPCAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkc3JjZGlyIiAxPiYyOyBleGl0IDE7IH0KKzwgICBmaQorPCBmaQorPCBzcmNkaXI9YGVjaG8gIiR7c3JjZGlyfSIgfCBzZWQgJ3MlXChbXi9dXCkvKiQlXDElJ2AKKzwgCis8ICMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCis8IGlmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KKzwgICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KKzwgICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgorPCAgIGVsc2UKKzwgICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKKzwgICBmaQorPCBmaQorPCBmb3IgYWNfc2l0ZV9maWxlIGluICRDT05GSUdfU0lURTsgZG8KKzwgICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgorPCAgICAgZWNobyAibG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIgorPCAgICAgLiAiJGFjX3NpdGVfZmlsZSIKKzwgICBmaQorLS0tCis+IGlmIHRlc3QgISAtciAiJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGUiOyB0aGVuCis+ICAgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzICYmIHNyY2Rpcj0iJGFjX2NvbmZkaXIgb3IgLi4iCis+ICAgeyAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGZpbmQgc291cmNlcyAoJGFjX3VuaXF1ZV9maWxlKSBpbiAkc3JjZGlyIiA+JjIKKz4gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Cis+IGZpCis+IGFjX21zZz0ic291cmNlcyBhcmUgaW4gJHNyY2RpciwgYnV0IFxgY2QgJHNyY2RpcicgZG9lcyBub3Qgd29yayIKKz4gYWNfYWJzX2NvbmZkaXI9YCgKKz4gCWNkICIkc3JjZGlyIiAmJiB0ZXN0IC1yICIuLyRhY191bmlxdWVfZmlsZSIgfHwgeyAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogJGFjX21zZyIgPiYyCis+ICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorPiAJcHdkKWAKKz4gIyBXaGVuIGJ1aWxkaW5nIGluIHBsYWNlLCBzZXQgc3JjZGlyPS4KKz4gaWYgdGVzdCAiJGFjX2Fic19jb25mZGlyIiA9ICIkYWNfcHdkIjsgdGhlbgorPiAgIHNyY2Rpcj0uCis+IGZpCis+ICMgUmVtb3ZlIHVubmVjZXNzYXJ5IHRyYWlsaW5nIHNsYXNoZXMgZnJvbSBzcmNkaXIuCis+ICMgRG91YmxlIHNsYXNoZXMgaW4gZmlsZSBuYW1lcyBpbiBvYmplY3QgZmlsZSBkZWJ1Z2dpbmcgaW5mbworPiAjIG1lc3MgdXAgTS14IGdkYiBpbiBFbWFjcy4KKz4gY2FzZSAkc3JjZGlyIGluCis+ICovKSBzcmNkaXI9YGV4cHIgIlgkc3JjZGlyIiA6ICdYXCguKlteL11cKScgXHwgIlgkc3JjZGlyIiA6ICdYXCguKlwpJ2A7OworPiBlc2FjCis+IGZvciBhY192YXIgaW4gJGFjX3ByZWNpb3VzX3ZhcnM7IGRvCis+ICAgZXZhbCBhY19lbnZfJHthY192YXJ9X3NldD1cJHske2FjX3Zhcn0rc2V0fQorPiAgIGV2YWwgYWNfZW52XyR7YWNfdmFyfV92YWx1ZT1cJCR7YWNfdmFyfQorPiAgIGV2YWwgYWNfY3ZfZW52XyR7YWNfdmFyfV9zZXQ9XCR7JHthY192YXJ9K3NldH0KKz4gICBldmFsIGFjX2N2X2Vudl8ke2FjX3Zhcn1fdmFsdWU9XCQke2FjX3Zhcn0KKzUzMyw1MzljMTM1NSwxMzYyCis8IGlmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgorPCAgIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCis8ICAgLiAkY2FjaGVfZmlsZQorPCBlbHNlCis8ICAgZWNobyAiY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCis8ICAgPiAkY2FjaGVfZmlsZQorPCBmaQorLS0tCis+ICMKKz4gIyBSZXBvcnQgdGhlIC0taGVscCBtZXNzYWdlLgorPiAjCis+IGlmIHRlc3QgIiRhY19pbml0X2hlbHAiID0gImxvbmciOyB0aGVuCis+ICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCis+ICAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgorPiAgIGNhdCA8PF9BQ0VPRgorPiBcYGNvbmZpZ3VyZScgY29uZmlndXJlcyB0aGlzIHBhY2thZ2UgdG8gYWRhcHQgdG8gbWFueSBraW5kcyBvZiBzeXN0ZW1zLgorNTQxLDU1NmMxMzY0LDE4MTkKKzwgYWNfZXh0PWMKKzwgIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgorPCBhY19jcHA9JyRDUFAgJENQUEZMQUdTJworPCBhY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCis8IGFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKKzwgY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCis8IAorPCBhY19leGVleHQ9Cis8IGFjX29iamV4dD1vCis8IGlmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCis8ICAgIyBTdGFyZGVudCBWaXN0cmEgU1ZSNCBncmVwIGxhY2tzIC1lLCBzYXlzIGdoYXppQGNhaXAucnV0Z2Vycy5lZHUuCis8ICAgaWYgKGVjaG8gLW4gdGVzdGluZzsgZWNobyAxLDIsMykgfCBzZWQgcy8tbi94bi8gfCBncmVwIHhuID4vZGV2L251bGw7IHRoZW4KKzwgICAgIGFjX249IGFjX2M9JworPCAnIGFjX3Q9JwknCis8ICAgZWxzZQorPCAgICAgYWNfbj0tbiBhY19jPSBhY190PQorLS0tCis+IFVzYWdlOiAkMCBbT1BUSU9OXS4uLiBbVkFSPVZBTFVFXS4uLgorPiAKKz4gVG8gYXNzaWduIGVudmlyb25tZW50IHZhcmlhYmxlcyAoZS5nLiwgQ0MsIENGTEFHUy4uLiksIHNwZWNpZnkgdGhlbSBhcworPiBWQVI9VkFMVUUuICBTZWUgYmVsb3cgZm9yIGRlc2NyaXB0aW9ucyBvZiBzb21lIG9mIHRoZSB1c2VmdWwgdmFyaWFibGVzLgorPiAKKz4gRGVmYXVsdHMgZm9yIHRoZSBvcHRpb25zIGFyZSBzcGVjaWZpZWQgaW4gYnJhY2tldHMuCis+IAorPiBDb25maWd1cmF0aW9uOgorPiAgIC1oLCAtLWhlbHAgICAgICAgICAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIGFuZCBleGl0Cis+ICAgICAgIC0taGVscD1zaG9ydCAgICAgICAgZGlzcGxheSBvcHRpb25zIHNwZWNpZmljIHRvIHRoaXMgcGFja2FnZQorPiAgICAgICAtLWhlbHA9cmVjdXJzaXZlICAgIGRpc3BsYXkgdGhlIHNob3J0IGhlbHAgb2YgYWxsIHRoZSBpbmNsdWRlZCBwYWNrYWdlcworPiAgIC1WLCAtLXZlcnNpb24gICAgICAgICAgIGRpc3BsYXkgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgZXhpdAorPiAgIC1xLCAtLXF1aWV0LCAtLXNpbGVudCAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcworPiAgICAgICAtLWNhY2hlLWZpbGU9RklMRSAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFIFtkaXNhYmxlZF0KKz4gICAtQywgLS1jb25maWctY2FjaGUgICAgICBhbGlhcyBmb3IgXGAtLWNhY2hlLWZpbGU9Y29uZmlnLmNhY2hlJworPiAgIC1uLCAtLW5vLWNyZWF0ZSAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCis+ICAgICAgIC0tc3JjZGlyPURJUiAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgXGAuLiddCis+IAorPiBJbnN0YWxsYXRpb24gZGlyZWN0b3JpZXM6Cis+ICAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCis+ICAgICAgICAgICAgICAgICAgICAgICAgICAgWyRhY19kZWZhdWx0X3ByZWZpeF0KKz4gICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAorPiAgICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVhdCis+IAorPiBCeSBkZWZhdWx0LCBcYG1ha2UgaW5zdGFsbCcgd2lsbCBpbnN0YWxsIGFsbCB0aGUgZmlsZXMgaW4KKz4gXGAkYWNfZGVmYXVsdF9wcmVmaXgvYmluJywgXGAkYWNfZGVmYXVsdF9wcmVmaXgvbGliJyBldGMuICBZb3UgY2FuIHNwZWNpZnkKKz4gYW4gaW5zdGFsbGF0aW9uIHByZWZpeCBvdGhlciB0aGFuIFxgJGFjX2RlZmF1bHRfcHJlZml4JyB1c2luZyBcYC0tcHJlZml4JywKKz4gZm9yIGluc3RhbmNlIFxgLS1wcmVmaXg9XCRIT01FJy4KKz4gCis+IEZvciBiZXR0ZXIgY29udHJvbCwgdXNlIHRoZSBvcHRpb25zIGJlbG93LgorPiAKKz4gRmluZSB0dW5pbmcgb2YgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcmllczoKKz4gICAtLWJpbmRpcj1ESVIgICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIFtFUFJFRklYL2Jpbl0KKz4gICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgW0VQUkVGSVgvc2Jpbl0KKz4gICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIFtFUFJFRklYL2xpYmV4ZWNdCis+ICAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgW1BSRUZJWC9ldGNdCis+ICAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBbUFJFRklYL2NvbV0KKz4gICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgW1BSRUZJWC92YXJdCis+ICAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIFtFUFJFRklYL2xpYl0KKz4gICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBbUFJFRklYL2luY2x1ZGVdCis+ICAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgWy91c3IvaW5jbHVkZV0KKz4gICAtLWRhdGFyb290ZGlyPURJUiAgICAgICByZWFkLW9ubHkgYXJjaC4taW5kZXBlbmRlbnQgZGF0YSByb290IFtQUkVGSVgvc2hhcmVdCis+ICAgLS1kYXRhZGlyPURJUiAgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIFtEQVRBUk9PVERJUl0KKz4gICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gW0RBVEFST09URElSL2luZm9dCis+ICAgLS1sb2NhbGVkaXI9RElSICAgICAgICAgbG9jYWxlLWRlcGVuZGVudCBkYXRhIFtEQVRBUk9PVERJUi9sb2NhbGVdCis+ICAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gW0RBVEFST09URElSL21hbl0KKz4gICAtLWRvY2Rpcj1ESVIgICAgICAgICAgICBkb2N1bWVudGF0aW9uIHJvb3QgW0RBVEFST09URElSL2RvYy9QQUNLQUdFXQorPiAgIC0taHRtbGRpcj1ESVIgICAgICAgICAgIGh0bWwgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQorPiAgIC0tZHZpZGlyPURJUiAgICAgICAgICAgIGR2aSBkb2N1bWVudGF0aW9uIFtET0NESVJdCis+ICAgLS1wZGZkaXI9RElSICAgICAgICAgICAgcGRmIGRvY3VtZW50YXRpb24gW0RPQ0RJUl0KKz4gICAtLXBzZGlyPURJUiAgICAgICAgICAgICBwcyBkb2N1bWVudGF0aW9uIFtET0NESVJdCis+IF9BQ0VPRgorPiAKKz4gICBjYXQgPDxcX0FDRU9GCis+IAorPiBTeXN0ZW0gdHlwZXM6Cis+ICAgLS1idWlsZD1CVUlMRCAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbZ3Vlc3NlZF0KKz4gICAtLWhvc3Q9SE9TVCAgICAgICBjcm9zcy1jb21waWxlIHRvIGJ1aWxkIHByb2dyYW1zIHRvIHJ1biBvbiBIT1NUIFtCVUlMRF0KKz4gX0FDRU9GCis+IGZpCis+IAorPiBpZiB0ZXN0IC1uICIkYWNfaW5pdF9oZWxwIjsgdGhlbgorPiAKKz4gICBjYXQgPDxcX0FDRU9GCis+IAorPiBPcHRpb25hbCBGZWF0dXJlczoKKz4gICAtLWRpc2FibGUtb3B0aW9uLWNoZWNraW5nICBpZ25vcmUgdW5yZWNvZ25pemVkIC0tZW5hYmxlLy0td2l0aCBvcHRpb25zCis+ICAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQorPiAgIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KKz4gICAtLWVuYWJsZS1zdHJpY3QgICAgICAgICBjb21waWxlIHdpdGggc3RyaWN0IGNvbXBpbGVyIG9wdGlvbnMgZGVmYXVsdD1ubworPiAgIC0tZW5hYmxlLTY0Yml0LWxpYnMgICAgIGJ1aWxkIDY0LWJpdCBsaWJyYXJpZXMgZGVmYXVsdD15ZXMKKz4gICAtLWVuYWJsZS1zaGFyZWQgICAgICAgICBidWlsZCBzaGFyZWQgbGlicmFyaWVzIGRlZmF1bHQ9eWVzCis+ICAgLS1lbmFibGUtc3RhdGljICAgICAgICAgYnVpbGQgc3RhdGljIGxpYnJhcmllcyBkZWZhdWx0PW5vCis+ICAgLS1lbmFibGUtZGVidWcgICAgICAgICAgYnVpbGQgZGVidWcgbGlicmFyaWVzIGRlZmF1bHQ9bm8KKz4gICAtLWVuYWJsZS1yZWxlYXNlICAgICAgICBidWlsZCByZWxlYXNlIGxpYnJhcmllcyBkZWZhdWx0PXllcworPiAgIC0tZW5hYmxlLXJlbmFtaW5nICAgICAgIGFkZCBhIHZlcnNpb24gc3VmZml4IHRvIHN5bWJvbHMgZGVmYXVsdD15ZXMKKz4gICAtLWVuYWJsZS10cmFjaW5nICAgICAgICBlbmFibGUgZnVuY3Rpb24gYW5kIGRhdGEgdHJhY2luZyBkZWZhdWx0PXllcworPiAgIC0tZW5hYmxlLXJwYXRoICAgICAgICAgIHVzZSBycGF0aCB3aGVuIGxpbmtpbmcgZGVmYXVsdCBpcyBvbmx5IGlmIG5lY2Vzc2FyeQorPiAgIC0tZW5hYmxlLXRocmVhZHMgICAgICAgIGJ1aWxkIElDVSB3aXRoIHRocmVhZCBzYWZldHkgZGVmYXVsdD15ZXMKKz4gICAtLWVuYWJsZS1leHRyYXMgICAgICAgICBidWlsZCBJQ1UgZXh0cmFzIGRlZmF1bHQ9eWVzCis+ICAgLS1lbmFibGUtaWN1aW8gICAgICAgICAgYnVpbGQgSUNVJ3MgaWN1aW8gbGlicmFyeSBkZWZhdWx0PXllcworPiAgIC0tZW5hYmxlLWxheW91dCAgICAgICAgIGJ1aWxkIElDVSdzIGxheW91dCBsaWJyYXJ5IGRlZmF1bHQ9eWVzCis+IAorPiAgIC0tZW5hYmxlLXRlc3RzICAgICAgICAgIGJ1aWxkIElDVSB0ZXN0cyBkZWZhdWx0PXllcworPiAgIC0tZW5hYmxlLXNhbXBsZXMgICAgICAgIGJ1aWxkIElDVSBzYW1wbGVzIGRlZmF1bHQ9eWVzCis+IEFkZGl0aW9uYWxseSwgdGhlIHZhcmlhYmxlIEZPUkNFX0xJQlMgbWF5IGJlIHNldCBiZWZvcmUgY2FsbGluZyBjb25maWd1cmUuIElmIHNldCwgaXQgd2lsbCBSRVBMQUNFIGFueSBhdXRvbWF0aWMgbGlzdCBvZiBsaWJyYXJpZXMuCis+IAorPiBPcHRpb25hbCBQYWNrYWdlczoKKz4gICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KKz4gICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCis+ICAgLS13aXRoLWlvc3RyZWFtPXZlcnNpb24gc3BlY2lmeSB0aGUgdmVyc2lvbiBvZiBpb3N0cmVhbSB0byB1c2UgKG5vbmUsIG9sZCwgc3RkLCBhdXRvKSBkZWZhdWx0PWF1dG8KKz4gICAtLXdpdGgtZGF0YS1wYWNrYWdpbmc9dHlwZSBzcGVjaWZ5IGhvdyB0byBwYWNrYWdlIElDVSBkYXRhIChmaWxlcywgYXJjaGl2ZSwgbGlicmFyeSwgYXV0bykgZGVmYXVsdD1hdXRvCis+ICAgLS13aXRoLWxpYnJhcnktc3VmZml4PXN1ZmZpeCAgICB0YWcgYSBzdWZmaXggdG8gdGhlIGxpYnJhcnkgbmFtZXMgZGVmYXVsdD0KKz4gCis+IFNvbWUgaW5mbHVlbnRpYWwgZW52aXJvbm1lbnQgdmFyaWFibGVzOgorPiAgIENDICAgICAgICAgIEMgY29tcGlsZXIgY29tbWFuZAorPiAgIENGTEFHUyAgICAgIEMgY29tcGlsZXIgZmxhZ3MKKz4gICBMREZMQUdTICAgICBsaW5rZXIgZmxhZ3MsIGUuZy4gLUw8bGliIGRpcj4gaWYgeW91IGhhdmUgbGlicmFyaWVzIGluIGEKKz4gICAgICAgICAgICAgICBub25zdGFuZGFyZCBkaXJlY3RvcnkgPGxpYiBkaXI+Cis+ICAgTElCUyAgICAgICAgbGlicmFyaWVzIHRvIHBhc3MgdG8gdGhlIGxpbmtlciwgZS5nLiAtbDxsaWJyYXJ5PgorPiAgIENQUEZMQUdTICAgIEMvQysrL09iamVjdGl2ZSBDIHByZXByb2Nlc3NvciBmbGFncywgZS5nLiAtSTxpbmNsdWRlIGRpcj4gaWYKKz4gICAgICAgICAgICAgICB5b3UgaGF2ZSBoZWFkZXJzIGluIGEgbm9uc3RhbmRhcmQgZGlyZWN0b3J5IDxpbmNsdWRlIGRpcj4KKz4gICBDWFggICAgICAgICBDKysgY29tcGlsZXIgY29tbWFuZAorPiAgIENYWEZMQUdTICAgIEMrKyBjb21waWxlciBmbGFncworPiAgIENQUCAgICAgICAgIEMgcHJlcHJvY2Vzc29yCis+ICAgQ1hYQ1BQICAgICAgQysrIHByZXByb2Nlc3NvcgorPiAKKz4gVXNlIHRoZXNlIHZhcmlhYmxlcyB0byBvdmVycmlkZSB0aGUgY2hvaWNlcyBtYWRlIGJ5IGBjb25maWd1cmUnIG9yIHRvIGhlbHAKKz4gaXQgdG8gZmluZCBsaWJyYXJpZXMgYW5kIHByb2dyYW1zIHdpdGggbm9uc3RhbmRhcmQgbmFtZXMvbG9jYXRpb25zLgorPiAKKz4gX0FDRU9GCis+IGFjX3N0YXR1cz0kPworPiBmaQorPiAKKz4gaWYgdGVzdCAiJGFjX2luaXRfaGVscCIgPSAicmVjdXJzaXZlIjsgdGhlbgorPiAgICMgSWYgdGhlcmUgYXJlIHN1YmRpcnMsIHJlcG9ydCB0aGVpciBzcGVjaWZpYyAtLWhlbHAuCis+ICAgZm9yIGFjX2RpciBpbiA6ICRhY19zdWJkaXJzX2FsbDsgZG8gdGVzdCAieCRhY19kaXIiID0geDogJiYgY29udGludWUKKz4gICAgIHRlc3QgLWQgIiRhY19kaXIiIHx8Cis+ICAgICAgIHsgY2QgIiRzcmNkaXIiICYmIGFjX3B3ZD1gcHdkYCAmJiBzcmNkaXI9LiAmJiB0ZXN0IC1kICIkYWNfZGlyIjsgfSB8fAorPiAgICAgICBjb250aW51ZQorPiAgICAgYWNfYnVpbGRkaXI9LgorPiAKKz4gY2FzZSAiJGFjX2RpciIgaW4KKz4gLikgYWNfZGlyX3N1ZmZpeD0gYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7Cis+ICopCis+ICAgYWNfZGlyX3N1ZmZpeD0vYCRhc19lY2hvICIkYWNfZGlyIiB8IHNlZCAnc3xeXC5bXFwvXXx8J2AKKz4gICAjIEEgIi4uIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCis+ICAgYWNfdG9wX2J1aWxkZGlyX3N1Yj1gJGFzX2VjaG8gIiRhY19kaXJfc3VmZml4IiB8IHNlZCAnc3wvW15cXC9dKnwvLi58ZztzfC98fCdgCis+ICAgY2FzZSAkYWNfdG9wX2J1aWxkZGlyX3N1YiBpbgorPiAgICIiKSBhY190b3BfYnVpbGRkaXJfc3ViPS4gYWNfdG9wX2J1aWxkX3ByZWZpeD0gOzsKKz4gICAqKSAgYWNfdG9wX2J1aWxkX3ByZWZpeD0kYWNfdG9wX2J1aWxkZGlyX3N1Yi8gOzsKKz4gICBlc2FjIDs7Cis+IGVzYWMKKz4gYWNfYWJzX3RvcF9idWlsZGRpcj0kYWNfcHdkCis+IGFjX2Fic19idWlsZGRpcj0kYWNfcHdkJGFjX2Rpcl9zdWZmaXgKKz4gIyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eToKKz4gYWNfdG9wX2J1aWxkZGlyPSRhY190b3BfYnVpbGRfcHJlZml4Cis+IAorPiBjYXNlICRzcmNkaXIgaW4KKz4gICAuKSAgIyBXZSBhcmUgYnVpbGRpbmcgaW4gcGxhY2UuCis+ICAgICBhY19zcmNkaXI9LgorPiAgICAgYWNfdG9wX3NyY2Rpcj0kYWNfdG9wX2J1aWxkZGlyX3N1YgorPiAgICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZCA7OworPiAgIFtcXC9dKiB8ID86W1xcL10qICkgICMgQWJzb2x1dGUgbmFtZS4KKz4gICAgIGFjX3NyY2Rpcj0kc3JjZGlyJGFjX2Rpcl9zdWZmaXg7Cis+ICAgICBhY190b3Bfc3JjZGlyPSRzcmNkaXIKKz4gICAgIGFjX2Fic190b3Bfc3JjZGlyPSRzcmNkaXIgOzsKKz4gICAqKSAjIFJlbGF0aXZlIG5hbWUuCis+ICAgICBhY19zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyJGFjX2Rpcl9zdWZmaXgKKz4gICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyCis+ICAgICBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfcHdkLyRzcmNkaXIgOzsKKz4gZXNhYworPiBhY19hYnNfc3JjZGlyPSRhY19hYnNfdG9wX3NyY2RpciRhY19kaXJfc3VmZml4Cis+IAorPiAgICAgY2QgIiRhY19kaXIiIHx8IHsgYWNfc3RhdHVzPSQ/OyBjb250aW51ZTsgfQorPiAgICAgIyBDaGVjayBmb3IgZ3Vlc3RlZCBjb25maWd1cmUuCis+ICAgICBpZiB0ZXN0IC1mICIkYWNfc3JjZGlyL2NvbmZpZ3VyZS5nbnUiOyB0aGVuCis+ICAgICAgIGVjaG8gJiYKKz4gICAgICAgJFNIRUxMICIkYWNfc3JjZGlyL2NvbmZpZ3VyZS5nbnUiIC0taGVscD1yZWN1cnNpdmUKKz4gICAgIGVsaWYgdGVzdCAtZiAiJGFjX3NyY2Rpci9jb25maWd1cmUiOyB0aGVuCis+ICAgICAgIGVjaG8gJiYKKz4gICAgICAgJFNIRUxMICIkYWNfc3JjZGlyL2NvbmZpZ3VyZSIgLS1oZWxwPXJlY3Vyc2l2ZQorPiAgICAgZWxzZQorPiAgICAgICAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBubyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGlzIGluICRhY19kaXIiID4mMgorPiAgICAgZmkgfHwgYWNfc3RhdHVzPSQ/Cis+ICAgICBjZCAiJGFjX3B3ZCIgfHwgeyBhY19zdGF0dXM9JD87IGJyZWFrOyB9Cis+ICAgZG9uZQorPiBmaQorPiAKKz4gdGVzdCAtbiAiJGFjX2luaXRfaGVscCIgJiYgZXhpdCAkYWNfc3RhdHVzCis+IGlmICRhY19pbml0X3ZlcnNpb247IHRoZW4KKz4gICBjYXQgPDxcX0FDRU9GCis+IGNvbmZpZ3VyZQorPiBnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjMKKz4gCis+IENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwKKz4gMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKz4gVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKz4gZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgorPiBfQUNFT0YKKz4gICBleGl0Cis+IGZpCis+IGNhdCA+Y29uZmlnLmxvZyA8PF9BQ0VPRgorPiBUaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQorPiBydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgorPiAKKz4gSXQgd2FzIGNyZWF0ZWQgYnkgJGFzX21lLCB3aGljaCB3YXMKKz4gZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjYzLiAgSW52b2NhdGlvbiBjb21tYW5kIGxpbmUgd2FzCis+IAorPiAgICQgJDAgJEAKKz4gCis+IF9BQ0VPRgorPiBleGVjIDU+PmNvbmZpZy5sb2cKKz4geworPiBjYXQgPDxfQVNVTkFNRQorPiAjIyAtLS0tLS0tLS0gIyMKKz4gIyMgUGxhdGZvcm0uICMjCis+ICMjIC0tLS0tLS0tLSAjIworPiAKKz4gaG9zdG5hbWUgPSBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWAKKz4gdW5hbWUgLW0gPSBgKHVuYW1lIC1tKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCis+IHVuYW1lIC1yID0gYCh1bmFtZSAtcikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAorPiB1bmFtZSAtcyA9IGAodW5hbWUgLXMpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKKz4gdW5hbWUgLXYgPSBgKHVuYW1lIC12KSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCis+IAorPiAvdXNyL2Jpbi91bmFtZSAtcCA9IGAoL3Vzci9iaW4vdW5hbWUgLXApIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKKz4gL2Jpbi91bmFtZSAtWCAgICAgPSBgKC9iaW4vdW5hbWUgLVgpIDI+L2Rldi9udWxsICAgICB8fCBlY2hvIHVua25vd25gCis+IAorPiAvYmluL2FyY2ggICAgICAgICAgICAgID0gYCgvYmluL2FyY2gpIDI+L2Rldi9udWxsICAgICAgICAgICAgICB8fCBlY2hvIHVua25vd25gCis+IC91c3IvYmluL2FyY2ggLWsgICAgICAgPSBgKC91c3IvYmluL2FyY2ggLWspIDI+L2Rldi9udWxsICAgICAgIHx8IGVjaG8gdW5rbm93bmAKKz4gL3Vzci9jb252ZXgvZ2V0c3lzaW5mbyA9IGAoL3Vzci9jb252ZXgvZ2V0c3lzaW5mbykgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAorPiAvdXNyL2Jpbi9ob3N0aW5mbyAgICAgID0gYCgvdXNyL2Jpbi9ob3N0aW5mbykgMj4vZGV2L251bGwgICAgICB8fCBlY2hvIHVua25vd25gCis+IC9iaW4vbWFjaGluZSAgICAgICAgICAgPSBgKC9iaW4vbWFjaGluZSkgMj4vZGV2L251bGwgICAgICAgICAgIHx8IGVjaG8gdW5rbm93bmAKKz4gL3Vzci9iaW4vb3NsZXZlbCAgICAgICA9IGAoL3Vzci9iaW4vb3NsZXZlbCkgMj4vZGV2L251bGwgICAgICAgfHwgZWNobyB1bmtub3duYAorPiAvYmluL3VuaXZlcnNlICAgICAgICAgID0gYCgvYmluL3VuaXZlcnNlKSAyPi9kZXYvbnVsbCAgICAgICAgICB8fCBlY2hvIHVua25vd25gCis+IAorPiBfQVNVTkFNRQorPiAKKz4gYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorPiBmb3IgYXNfZGlyIGluICRQQVRICis+IGRvCis+ICAgSUZTPSRhc19zYXZlX0lGUworPiAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCis+ICAgJGFzX2VjaG8gIlBBVEg6ICRhc19kaXIiCis+IGRvbmUKKz4gSUZTPSRhc19zYXZlX0lGUworPiAKKz4gfSA+JjUKKz4gCis+IGNhdCA+JjUgPDxfQUNFT0YKKz4gCis+IAorPiAjIyAtLS0tLS0tLS0tLSAjIworPiAjIyBDb3JlIHRlc3RzLiAjIworPiAjIyAtLS0tLS0tLS0tLSAjIworPiAKKz4gX0FDRU9GCis+IAorPiAKKz4gIyBLZWVwIGEgdHJhY2Ugb2YgdGhlIGNvbW1hbmQgbGluZS4KKz4gIyBTdHJpcCBvdXQgLS1uby1jcmVhdGUgYW5kIC0tbm8tcmVjdXJzaW9uIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCis+ICMgU3RyaXAgb3V0IC0tc2lsZW50IGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byByZWNvcmQgaXQgZm9yIGZ1dHVyZSBydW5zLgorPiAjIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhLWNoYXJhY3RlcnMuCis+ICMgTWFrZSB0d28gcGFzc2VzIHRvIGFsbG93IGZvciBwcm9wZXIgZHVwbGljYXRlLWFyZ3VtZW50IHN1cHByZXNzaW9uLgorPiBhY19jb25maWd1cmVfYXJncz0KKz4gYWNfY29uZmlndXJlX2FyZ3MwPQorPiBhY19jb25maWd1cmVfYXJnczE9Cis+IGFjX211c3Rfa2VlcF9uZXh0PWZhbHNlCis+IGZvciBhY19wYXNzIGluIDEgMgorPiBkbworPiAgIGZvciBhY19hcmcKKz4gICBkbworPiAgICAgY2FzZSAkYWNfYXJnIGluCis+ICAgICAtbm8tY3JlYXRlIHwgLS1uby1jKiB8IC1uIHwgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tciopIGNvbnRpbnVlIDs7Cis+ICAgICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAorPiAgICAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCis+ICAgICAgIGNvbnRpbnVlIDs7Cis+ICAgICAqXCcqKQorPiAgICAgICBhY19hcmc9YCRhc19lY2hvICIkYWNfYXJnIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYCA7OworPiAgICAgZXNhYworPiAgICAgY2FzZSAkYWNfcGFzcyBpbgorPiAgICAgMSkgYWNfY29uZmlndXJlX2FyZ3MwPSIkYWNfY29uZmlndXJlX2FyZ3MwICckYWNfYXJnJyIgOzsKKz4gICAgIDIpCis+ICAgICAgIGFjX2NvbmZpZ3VyZV9hcmdzMT0iJGFjX2NvbmZpZ3VyZV9hcmdzMSAnJGFjX2FyZyciCis+ICAgICAgIGlmIHRlc3QgJGFjX211c3Rfa2VlcF9uZXh0ID0gdHJ1ZTsgdGhlbgorPiAJYWNfbXVzdF9rZWVwX25leHQ9ZmFsc2UgIyBHb3QgdmFsdWUsIGJhY2sgdG8gbm9ybWFsLgorPiAgICAgICBlbHNlCis+IAljYXNlICRhY19hcmcgaW4KKz4gCSAgKj0qIHwgLS1jb25maWctY2FjaGUgfCAtQyB8IC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKiBcCis+IAkgIHwgLWVuYWJsZS0qIHwgLS1lbmFibGUtKiB8IC1nYXMgfCAtLWcqIHwgLW5mcCB8IC0tbmYqIFwKKz4gCSAgfCAtcSB8IC1xdWlldCB8IC0tcSogfCAtc2lsZW50IHwgLS1zaWwqIHwgLXYgfCAtdmVyYiogXAorPiAJICB8IC13aXRoLSogfCAtLXdpdGgtKiB8IC13aXRob3V0LSogfCAtLXdpdGhvdXQtKiB8IC0teCkKKz4gCSAgICBjYXNlICIkYWNfY29uZmlndXJlX2FyZ3MwICIgaW4KKz4gCSAgICAgICIkYWNfY29uZmlndXJlX2FyZ3MxIioiICckYWNfYXJnJyAiKiApIGNvbnRpbnVlIDs7Cis+IAkgICAgZXNhYworPiAJICAgIDs7Cis+IAkgIC0qICkgYWNfbXVzdF9rZWVwX25leHQ9dHJ1ZSA7OworPiAJZXNhYworPiAgICAgICBmaQorPiAgICAgICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIKKz4gICAgICAgOzsKKz4gICAgIGVzYWMKKz4gICBkb25lCis+IGRvbmUKKz4gJGFzX3Vuc2V0IGFjX2NvbmZpZ3VyZV9hcmdzMCB8fCB0ZXN0ICIke2FjX2NvbmZpZ3VyZV9hcmdzMCtzZXR9IiAhPSBzZXQgfHwgeyBhY19jb25maWd1cmVfYXJnczA9OyBleHBvcnQgYWNfY29uZmlndXJlX2FyZ3MwOyB9Cis+ICRhc191bnNldCBhY19jb25maWd1cmVfYXJnczEgfHwgdGVzdCAiJHthY19jb25maWd1cmVfYXJnczErc2V0fSIgIT0gc2V0IHx8IHsgYWNfY29uZmlndXJlX2FyZ3MxPTsgZXhwb3J0IGFjX2NvbmZpZ3VyZV9hcmdzMTsgfQorPiAKKz4gIyBXaGVuIGludGVycnVwdGVkIG9yIGV4aXQnZCwgY2xlYW51cCB0ZW1wb3JhcnkgZmlsZXMsIGFuZCBjb21wbGV0ZQorPiAjIGNvbmZpZy5sb2cuICBXZSByZW1vdmUgY29tbWVudHMgYmVjYXVzZSBhbnl3YXkgdGhlIHF1b3RlcyBpbiB0aGVyZQorPiAjIHdvdWxkIGNhdXNlIHByb2JsZW1zIG9yIGxvb2sgdWdseS4KKz4gIyBXQVJOSU5HOiBVc2UgJ1wnJyB0byByZXByZXNlbnQgYW4gYXBvc3Ryb3BoZSB3aXRoaW4gdGhlIHRyYXAuCis+ICMgV0FSTklORzogRG8gbm90IHN0YXJ0IHRoZSB0cmFwIGNvZGUgd2l0aCBhIG5ld2xpbmUsIGR1ZSB0byBhIEZyZWVCU0QgNC4wIGJ1Zy4KKz4gdHJhcCAnZXhpdF9zdGF0dXM9JD8KKz4gICAjIFNhdmUgaW50byBjb25maWcubG9nIHNvbWUgaW5mb3JtYXRpb24gdGhhdCBtaWdodCBoZWxwIGluIGRlYnVnZ2luZy4KKz4gICB7Cis+ICAgICBlY2hvCis+IAorPiAgICAgY2F0IDw8XF9BU0JPWAorPiAjIyAtLS0tLS0tLS0tLS0tLS0tICMjCis+ICMjIENhY2hlIHZhcmlhYmxlcy4gIyMKKz4gIyMgLS0tLS0tLS0tLS0tLS0tLSAjIworPiBfQVNCT1gKKz4gICAgIGVjaG8KKz4gICAgICMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCis+ICgKKz4gICBmb3IgYWNfdmFyIGluIGAoc2V0KSAyPiYxIHwgc2VkIC1uICdcJydzL15cKFthLXpBLVpfXVthLXpBLVowLTlfXSpcKT0uKi9cMS9wJ1wnJ2A7IGRvCis+ICAgICBldmFsIGFjX3ZhbD1cJCRhY192YXIKKz4gICAgIGNhc2UgJGFjX3ZhbCBpbiAjKAorPiAgICAgKiR7YXNfbmx9KikKKz4gICAgICAgY2FzZSAkYWNfdmFyIGluICMoCis+ICAgICAgICpfY3ZfKikgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IGNhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogY2FjaGUgdmFyaWFibGUgJGFjX3ZhciBjb250YWlucyBhIG5ld2xpbmUiID4mMjt9IDs7Cis+ICAgICAgIGVzYWMKKz4gICAgICAgY2FzZSAkYWNfdmFyIGluICMoCis+ICAgICAgIF8gfCBJRlMgfCBhc19ubCkgOzsgIygKKz4gICAgICAgQkFTSF9BUkdWIHwgQkFTSF9TT1VSQ0UpIGV2YWwgJGFjX3Zhcj0gOzsgIygKKz4gICAgICAgKikgJGFzX3Vuc2V0ICRhY192YXIgOzsKKz4gICAgICAgZXNhYyA7OworPiAgICAgZXNhYworPiAgIGRvbmUKKz4gICAoc2V0KSAyPiYxIHwKKz4gICAgIGNhc2UgJGFzX25sYChhY19zcGFjZT0nXCcnICdcJyc7IHNldCkgMj4mMWAgaW4gIygKKz4gICAgICoke2FzX25sfWFjX3NwYWNlPVwgKikKKz4gICAgICAgc2VkIC1uIFwKKz4gCSJzLydcJycvJ1wnJ1xcXFwnXCcnJ1wnJy9nOworPiAJICBzL15cXChbXyRhc19jcl9hbG51bV0qX2N2X1tfJGFzX2NyX2FsbnVtXSpcXCk9XFwoLipcXCkvXFwxPSdcJydcXDInXCcnL3AiCis+ICAgICAgIDs7ICMoCis+ICAgICAqKQorPiAgICAgICBzZWQgLW4gIi9eW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qPS9wIgorPiAgICAgICA7OworPiAgICAgZXNhYyB8Cis+ICAgICBzb3J0Cis+ICkKKz4gICAgIGVjaG8KKz4gCis+ICAgICBjYXQgPDxcX0FTQk9YCis+ICMjIC0tLS0tLS0tLS0tLS0tLS0tICMjCis+ICMjIE91dHB1dCB2YXJpYWJsZXMuICMjCis+ICMjIC0tLS0tLS0tLS0tLS0tLS0tICMjCis+IF9BU0JPWAorPiAgICAgZWNobworPiAgICAgZm9yIGFjX3ZhciBpbiAkYWNfc3Vic3RfdmFycworPiAgICAgZG8KKz4gICAgICAgZXZhbCBhY192YWw9XCQkYWNfdmFyCis+ICAgICAgIGNhc2UgJGFjX3ZhbCBpbgorPiAgICAgICAqXCdcJycqKSBhY192YWw9YCRhc19lY2hvICIkYWNfdmFsIiB8IHNlZCAicy8nXCcnLydcJydcXFxcXFxcXCdcJycnXCcnL2ciYDs7Cis+ICAgICAgIGVzYWMKKz4gICAgICAgJGFzX2VjaG8gIiRhY192YXI9J1wnJyRhY192YWwnXCcnIgorPiAgICAgZG9uZSB8IHNvcnQKKz4gICAgIGVjaG8KKz4gCis+ICAgICBpZiB0ZXN0IC1uICIkYWNfc3Vic3RfZmlsZXMiOyB0aGVuCis+ICAgICAgIGNhdCA8PFxfQVNCT1gKKz4gIyMgLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworPiAjIyBGaWxlIHN1YnN0aXR1dGlvbnMuICMjCis+ICMjIC0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKz4gX0FTQk9YCis+ICAgICAgIGVjaG8KKz4gICAgICAgZm9yIGFjX3ZhciBpbiAkYWNfc3Vic3RfZmlsZXMKKz4gICAgICAgZG8KKz4gCWV2YWwgYWNfdmFsPVwkJGFjX3ZhcgorPiAJY2FzZSAkYWNfdmFsIGluCis+IAkqXCdcJycqKSBhY192YWw9YCRhc19lY2hvICIkYWNfdmFsIiB8IHNlZCAicy8nXCcnLydcJydcXFxcXFxcXCdcJycnXCcnL2ciYDs7Cis+IAllc2FjCis+IAkkYXNfZWNobyAiJGFjX3Zhcj0nXCcnJGFjX3ZhbCdcJyciCis+ICAgICAgIGRvbmUgfCBzb3J0Cis+ICAgICAgIGVjaG8KKz4gICAgIGZpCis+IAorPiAgICAgaWYgdGVzdCAtcyBjb25mZGVmcy5oOyB0aGVuCis+ICAgICAgIGNhdCA8PFxfQVNCT1gKKz4gIyMgLS0tLS0tLS0tLS0gIyMKKz4gIyMgY29uZmRlZnMuaC4gIyMKKz4gIyMgLS0tLS0tLS0tLS0gIyMKKz4gX0FTQk9YCis+ICAgICAgIGVjaG8KKz4gICAgICAgY2F0IGNvbmZkZWZzLmgKKz4gICAgICAgZWNobworPiAgICAgZmkKKz4gICAgIHRlc3QgIiRhY19zaWduYWwiICE9IDAgJiYKKz4gICAgICAgJGFzX2VjaG8gIiRhc19tZTogY2F1Z2h0IHNpZ25hbCAkYWNfc2lnbmFsIgorPiAgICAgJGFzX2VjaG8gIiRhc19tZTogZXhpdCAkZXhpdF9zdGF0dXMiCis+ICAgfSA+JjUKKz4gICBybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogJiYKKz4gICAgIHJtIC1mIC1yIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29uZiQkKiAkYWNfY2xlYW5fZmlsZXMgJiYKKz4gICAgIGV4aXQgJGV4aXRfc3RhdHVzCis+ICcgMAorPiBmb3IgYWNfc2lnbmFsIGluIDEgMiAxMyAxNTsgZG8KKz4gICB0cmFwICdhY19zaWduYWw9JyRhY19zaWduYWwnOyB7IChleGl0IDEpOyBleGl0IDE7IH0nICRhY19zaWduYWwKKz4gZG9uZQorPiBhY19zaWduYWw9MAorPiAKKz4gIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4KKz4gcm0gLWYgLXIgY29uZnRlc3QqIGNvbmZkZWZzLmgKKz4gCis+ICMgUHJlZGVmaW5lZCBwcmVwcm9jZXNzb3IgdmFyaWFibGVzLgorPiAKKz4gY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorPiAjZGVmaW5lIFBBQ0tBR0VfTkFNRSAiJFBBQ0tBR0VfTkFNRSIKKz4gX0FDRU9GCis+IAorPiAKKz4gY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorPiAjZGVmaW5lIFBBQ0tBR0VfVEFSTkFNRSAiJFBBQ0tBR0VfVEFSTkFNRSIKKz4gX0FDRU9GCis+IAorPiAKKz4gY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorPiAjZGVmaW5lIFBBQ0tBR0VfVkVSU0lPTiAiJFBBQ0tBR0VfVkVSU0lPTiIKKz4gX0FDRU9GCis+IAorPiAKKz4gY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorPiAjZGVmaW5lIFBBQ0tBR0VfU1RSSU5HICIkUEFDS0FHRV9TVFJJTkciCis+IF9BQ0VPRgorPiAKKz4gCis+IGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKz4gI2RlZmluZSBQQUNLQUdFX0JVR1JFUE9SVCAiJFBBQ0tBR0VfQlVHUkVQT1JUIgorPiBfQUNFT0YKKz4gCis+IAorPiAjIExldCB0aGUgc2l0ZSBmaWxlIHNlbGVjdCBhbiBhbHRlcm5hdGUgY2FjaGUgZmlsZSBpZiBpdCB3YW50cyB0by4KKz4gIyBQcmVmZXIgYW4gZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KKz4gYWNfc2l0ZV9maWxlMT1OT05FCis+IGFjX3NpdGVfZmlsZTI9Tk9ORQorPiBpZiB0ZXN0IC1uICIkQ09ORklHX1NJVEUiOyB0aGVuCis+ICAgYWNfc2l0ZV9maWxlMT0kQ09ORklHX1NJVEUKKz4gZWxpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KKz4gICBhY19zaXRlX2ZpbGUxPSRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUKKz4gICBhY19zaXRlX2ZpbGUyPSRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlCis+IGVsc2UKKz4gICBhY19zaXRlX2ZpbGUxPSRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZQorPiAgIGFjX3NpdGVfZmlsZTI9JGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZQorPiBmaQorPiBmb3IgYWNfc2l0ZV9maWxlIGluICIkYWNfc2l0ZV9maWxlMSIgIiRhY19zaXRlX2ZpbGUyIgorPiBkbworPiAgIHRlc3QgIngkYWNfc2l0ZV9maWxlIiA9IHhOT05FICYmIGNvbnRpbnVlCis+ICAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KKz4gICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiID4mNjt9Cis+ICAgICBzZWQgJ3MvXi98IC8nICIkYWNfc2l0ZV9maWxlIiA+JjUKKz4gICAgIC4gIiRhY19zaXRlX2ZpbGUiCis+ICAgZmkKKz4gZG9uZQorPiAKKz4gaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCis+ICAgIyBTb21lIHZlcnNpb25zIG9mIGJhc2ggd2lsbCBmYWlsIHRvIHNvdXJjZSAvZGV2L251bGwgKHNwZWNpYWwKKz4gICAjIGZpbGVzIGFjdHVhbGx5KSwgc28gd2UgYXZvaWQgZG9pbmcgdGhhdC4KKz4gICBpZiB0ZXN0IC1mICIkY2FjaGVfZmlsZSI7IHRoZW4KKz4gICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogbG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KKz4gICAgIGNhc2UgJGNhY2hlX2ZpbGUgaW4KKz4gICAgICAgW1xcL10qIHwgPzpbXFwvXSogKSAuICIkY2FjaGVfZmlsZSI7OworPiAgICAgICAqKSAgICAgICAgICAgICAgICAgICAgICAuICIuLyRjYWNoZV9maWxlIjs7Cis+ICAgICBlc2FjCis1NTljMTgyMiwxODg0Cis8ICAgYWNfbj0gYWNfYz0nXGMnIGFjX3Q9CistLS0KKz4gICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KKz4gICA+JGNhY2hlX2ZpbGUKKz4gZmkKKz4gCis+ICMgQ2hlY2sgdGhhdCB0aGUgcHJlY2lvdXMgdmFyaWFibGVzIHNhdmVkIGluIHRoZSBjYWNoZSBoYXZlIGtlcHQgdGhlIHNhbWUKKz4gIyB2YWx1ZS4KKz4gYWNfY2FjaGVfY29ycnVwdGVkPWZhbHNlCis+IGZvciBhY192YXIgaW4gJGFjX3ByZWNpb3VzX3ZhcnM7IGRvCis+ICAgZXZhbCBhY19vbGRfc2V0PVwkYWNfY3ZfZW52XyR7YWNfdmFyfV9zZXQKKz4gICBldmFsIGFjX25ld19zZXQ9XCRhY19lbnZfJHthY192YXJ9X3NldAorPiAgIGV2YWwgYWNfb2xkX3ZhbD1cJGFjX2N2X2Vudl8ke2FjX3Zhcn1fdmFsdWUKKz4gICBldmFsIGFjX25ld192YWw9XCRhY19lbnZfJHthY192YXJ9X3ZhbHVlCis+ICAgY2FzZSAkYWNfb2xkX3NldCwkYWNfbmV3X3NldCBpbgorPiAgICAgc2V0LCkKKz4gICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBcYCRhY192YXInIHdhcyBzZXQgdG8gXGAkYWNfb2xkX3ZhbCcgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBcYCRhY192YXInIHdhcyBzZXQgdG8gXGAkYWNfb2xkX3ZhbCcgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiYyO30KKz4gICAgICAgYWNfY2FjaGVfY29ycnVwdGVkPTogOzsKKz4gICAgICxzZXQpCis+ICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogXGAkYWNfdmFyJyB3YXMgbm90IHNldCBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIG5vdCBzZXQgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiYyO30KKz4gICAgICAgYWNfY2FjaGVfY29ycnVwdGVkPTogOzsKKz4gICAgICwpOzsKKz4gICAgICopCis+ICAgICAgIGlmIHRlc3QgIngkYWNfb2xkX3ZhbCIgIT0gIngkYWNfbmV3X3ZhbCI7IHRoZW4KKz4gCSMgZGlmZmVyZW5jZXMgaW4gd2hpdGVzcGFjZSBkbyBub3QgbGVhZCB0byBmYWlsdXJlLgorPiAJYWNfb2xkX3ZhbF93PWBlY2hvIHggJGFjX29sZF92YWxgCis+IAlhY19uZXdfdmFsX3c9YGVjaG8geCAkYWNfbmV3X3ZhbGAKKz4gCWlmIHRlc3QgIiRhY19vbGRfdmFsX3ciICE9ICIkYWNfbmV3X3ZhbF93IjsgdGhlbgorPiAJICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IFxgJGFjX3ZhcicgaGFzIGNoYW5nZWQgc2luY2UgdGhlIHByZXZpb3VzIHJ1bjoiID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogXGAkYWNfdmFyJyBoYXMgY2hhbmdlZCBzaW5jZSB0aGUgcHJldmlvdXMgcnVuOiIgPiYyO30KKz4gCSAgYWNfY2FjaGVfY29ycnVwdGVkPToKKz4gCWVsc2UKKz4gCSAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHdhcm5pbmc6IGlnbm9yaW5nIHdoaXRlc3BhY2UgY2hhbmdlcyBpbiBcYCRhY192YXInIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogd2FybmluZzogaWdub3Jpbmcgd2hpdGVzcGFjZSBjaGFuZ2VzIGluIFxgJGFjX3Zhcicgc2luY2UgdGhlIHByZXZpb3VzIHJ1bjoiID4mMjt9Cis+IAkgIGV2YWwgJGFjX3Zhcj1cJGFjX29sZF92YWwKKz4gCWZpCis+IAl7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogICBmb3JtZXIgdmFsdWU6ICBcYCRhY19vbGRfdmFsJyIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6ICAgZm9ybWVyIHZhbHVlOiAgXGAkYWNfb2xkX3ZhbCciID4mMjt9Cis+IAl7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogICBjdXJyZW50IHZhbHVlOiBcYCRhY19uZXdfdmFsJyIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6ICAgY3VycmVudCB2YWx1ZTogXGAkYWNfbmV3X3ZhbCciID4mMjt9Cis+ICAgICAgIGZpOzsKKz4gICBlc2FjCis+ICAgIyBQYXNzIHByZWNpb3VzIHZhcmlhYmxlcyB0byBjb25maWcuc3RhdHVzLgorPiAgIGlmIHRlc3QgIiRhY19uZXdfc2V0IiA9IHNldDsgdGhlbgorPiAgICAgY2FzZSAkYWNfbmV3X3ZhbCBpbgorPiAgICAgKlwnKikgYWNfYXJnPSRhY192YXI9YCRhc19lY2hvICIkYWNfbmV3X3ZhbCIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAgOzsKKz4gICAgICopIGFjX2FyZz0kYWNfdmFyPSRhY19uZXdfdmFsIDs7Cis+ICAgICBlc2FjCis+ICAgICBjYXNlICIgJGFjX2NvbmZpZ3VyZV9hcmdzICIgaW4KKz4gICAgICAgKiIgJyRhY19hcmcnICIqKSA7OyAjIEF2b2lkIGR1cHMuICBVc2Ugb2YgcXVvdGVzIGVuc3VyZXMgYWNjdXJhY3kuCis+ICAgICAgICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OworPiAgICAgZXNhYworPiAgIGZpCis+IGRvbmUKKz4gaWYgJGFjX2NhY2hlX2NvcnJ1cHRlZDsgdGhlbgorPiAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cis+ICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjaGFuZ2VzIGluIHRoZSBlbnZpcm9ubWVudCBjYW4gY29tcHJvbWlzZSB0aGUgYnVpbGQiID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogY2hhbmdlcyBpbiB0aGUgZW52aXJvbm1lbnQgY2FuIGNvbXByb21pc2UgdGhlIGJ1aWxkIiA+JjI7fQorPiAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBydW4gXGBtYWtlIGRpc3RjbGVhbicgYW5kL29yIFxgcm0gJGNhY2hlX2ZpbGUnIGFuZCBzdGFydCBvdmVyIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IHJ1biBcYG1ha2UgZGlzdGNsZWFuJyBhbmQvb3IgXGBybSAkY2FjaGVfZmlsZScgYW5kIHN0YXJ0IG92ZXIiID4mMjt9Cis+ICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorNTY0YTE4OTAsMTkxMgorPiAKKz4gCis+IAorPiAKKz4gCis+IAorPiAKKz4gCis+IAorPiAKKz4gCis+IAorPiAKKz4gYWNfZXh0PWMKKz4gYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKKz4gYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworPiBhY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworPiBhY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251Cis+IAorPiAKKz4gCis+IGFjX2NvbmZpZ19oZWFkZXJzPSIkYWNfY29uZmlnX2hlYWRlcnMgY29tbW9uL2ljdWNmZy5oIgorPiAKKzU2OCw1NjljMTkxNiwxOTE3Cis8IGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBJQ1UgdmVyc2lvbiBudW1iZXJzIiIuLi4gJGFjX2MiIDE+JjYKKzwgZWNobyAiY29uZmlndXJlOjU3MDogY2hlY2tpbmcgZm9yIElDVSB2ZXJzaW9uIG51bWJlcnMiID4mNQorLS0tCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgSUNVIHZlcnNpb24gbnVtYmVycyIgPiY1Cis+ICRhc19lY2hvX24gImNoZWNraW5nIGZvciBJQ1UgdmVyc2lvbiBudW1iZXJzLi4uICIgPiY2OyB9Cis1NzhjMTkyNiwxOTI4Cis8ICAgICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBDYW5ub3QgZGV0ZXJtaW5lIElDVSB2ZXJzaW9uIG51bWJlciBmcm9tIGhlYWRlciBmaWxlcyIgMT4mMjsgZXhpdCAxOyB9CistLS0KKz4gICAgICAgICB7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogQ2Fubm90IGRldGVybWluZSBJQ1UgdmVyc2lvbiBudW1iZXIgZnJvbSBoZWFkZXIgZmlsZXMiID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogQ2Fubm90IGRldGVybWluZSBJQ1UgdmVyc2lvbiBudW1iZXIgZnJvbSBoZWFkZXIgZmlsZXMiID4mMjt9Cis+ICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorNTg2YzE5MzYsMTkzNworPCBlY2hvICIkYWNfdCIicmVsZWFzZSAkVkVSU0lPTiwgbGlicmFyeSAkTElCX1ZFUlNJT04iIDE+JjYKKy0tLQorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiByZWxlYXNlICRWRVJTSU9OLCBsaWJyYXJ5ICRMSUJfVkVSU0lPTiIgPiY1Cis+ICRhc19lY2hvICJyZWxlYXNlICRWRVJTSU9OLCBsaWJyYXJ5ICRMSUJfVkVSU0lPTiIgPiY2OyB9Cis1OTRjMTk0NSwxOTkxCis8ICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KKy0tLQorPiBhY19leHQ9YworPiBhY19jcHA9JyRDUFAgJENQUEZMQUdTJworPiBhY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCis+IGFjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCis+IGFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKz4gaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorPiAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1nY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorPiBzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1nY2M7IGFjX3dvcmQ9JDIKKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Cis+ICRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQorPiBpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KKz4gICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorPiBlbHNlCis+ICAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorPiAgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCis+IGVsc2UKKz4gYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorPiBmb3IgYXNfZGlyIGluICRQQVRICis+IGRvCis+ICAgSUZTPSRhc19zYXZlX0lGUworPiAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCis+ICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCis+ICAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorPiAgICAgYWNfY3ZfcHJvZ19DQz0iJHthY190b29sX3ByZWZpeH1nY2MiCis+ICAgICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorPiAgICAgYnJlYWsgMgorPiAgIGZpCis+IGRvbmUKKz4gZG9uZQorPiBJRlM9JGFzX3NhdmVfSUZTCis+IAorPiBmaQorPiBmaQorPiBDQz0kYWNfY3ZfcHJvZ19DQworPiBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCis+ICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENDIiA+JjUKKz4gJGFzX2VjaG8gIiRDQyIgPiY2OyB9Cis+IGVsc2UKKz4gICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Cis+ICRhc19lY2hvICJubyIgPiY2OyB9Cis+IGZpCis+IAorPiAKKz4gZmkKKz4gaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfQ0MiOyB0aGVuCis+ICAgYWNfY3RfQ0M9JENDCis+ICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorNTk2LDU5OWMxOTkzLDIwNDkKKzwgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKKzwgZWNobyAiY29uZmlndXJlOjU5ODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKzwgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorPCAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CistLS0KKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Cis+ICRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQorPiBpZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KKz4gICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorPiBlbHNlCis+ICAgaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgorPiAgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19jdF9DQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCis+IGVsc2UKKz4gYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorPiBmb3IgYXNfZGlyIGluICRQQVRICis+IGRvCis+ICAgSUZTPSRhc19zYXZlX0lGUworPiAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCis+ICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCis+ICAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorPiAgICAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iZ2NjIgorPiAgICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKz4gICAgIGJyZWFrIDIKKz4gICBmaQorPiBkb25lCis+IGRvbmUKKz4gSUZTPSRhc19zYXZlX0lGUworPiAKKz4gZmkKKz4gZmkKKz4gYWNfY3RfQ0M9JGFjX2N2X3Byb2dfYWNfY3RfQ0MKKz4gaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgorPiAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdF9DQyIgPiY1Cis+ICRhc19lY2hvICIkYWNfY3RfQ0MiID4mNjsgfQorPiBlbHNlCis+ICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorPiAkYXNfZWNobyAibm8iID4mNjsgfQorPiBmaQorPiAKKz4gICBpZiB0ZXN0ICJ4JGFjX2N0X0NDIiA9IHg7IHRoZW4KKz4gICAgIENDPSIiCis+ICAgZWxzZQorPiAgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgorPiB5ZXM6KQorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorPiBhY190b29sX3dhcm5lZD15ZXMgOzsKKz4gZXNhYworPiAgICAgQ0M9JGFjX2N0X0NDCis+ICAgZmkKKz4gZWxzZQorPiAgIENDPSIkYWNfY3ZfcHJvZ19DQyIKKz4gZmkKKz4gCis+IGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KKz4gICAgICAgICAgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKz4gICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1jYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCis+IHNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWNjOyBhY193b3JkPSQyCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorPiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KKz4gaWYgdGVzdCAiJHthY19jdl9wcm9nX0NDK3NldH0iID0gc2V0OyB0aGVuCis+ICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKzYwNCw2MTNjMjA1NCwyMDY4Cis8ICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKzwgICBhY19kdW1teT0iJFBBVEgiCis8ICAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCis8ICAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgorPCAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCis8ICAgICAgIGFjX2N2X3Byb2dfQ0M9ImdjYyIKKzwgICAgICAgYnJlYWsKKzwgICAgIGZpCis8ICAgZG9uZQorPCAgIElGUz0iJGFjX3NhdmVfaWZzIgorLS0tCis+IGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKKz4gZm9yIGFzX2RpciBpbiAkUEFUSAorPiBkbworPiAgIElGUz0kYXNfc2F2ZV9JRlMKKz4gICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorPiAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworPiAgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKz4gICAgIGFjX2N2X3Byb2dfQ0M9IiR7YWNfdG9vbF9wcmVmaXh9Y2MiCis+ICAgICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorPiAgICAgYnJlYWsgMgorPiAgIGZpCis+IGRvbmUKKz4gZG9uZQorPiBJRlM9JGFzX3NhdmVfSUZTCis+IAorNjE2YzIwNzEKKzwgQ0M9IiRhY19jdl9wcm9nX0NDIgorLS0tCis+IENDPSRhY19jdl9wcm9nX0NDCis2MThjMjA3MywyMDc0Cis8ICAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorLS0tCis+ICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENDIiA+JjUKKz4gJGFzX2VjaG8gIiRDQyIgPiY2OyB9Cis2MjBjMjA3NiwyMDc3Cis8ICAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CistLS0KKz4gICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Cis+ICRhc19lY2hvICJubyIgPiY2OyB9Cis2MjJhMjA4MCwyMDgyCis+IAorPiAgIGZpCis+IGZpCis2MjYsNjI5YzIwODYsMjA4OQorPCBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6NjI4OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorPCBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCis8ICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKy0tLQorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Cis+IGlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DQytzZXR9IiA9IHNldDsgdGhlbgorPiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Cis2MzRkMjA5MworPCAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCis2MzYsNjQ4YzIwOTUsMjExMworPCAgIGFjX2R1bW15PSIkUEFUSCIKKzwgICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKzwgICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCis8ICAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKzwgICAgICAgaWYgdGVzdCAiJGFjX2Rpci8kYWNfd29yZCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCis8ICAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKKzwgCWNvbnRpbnVlCis8ICAgICAgIGZpCis8ICAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgorPCAgICAgICBicmVhaworPCAgICAgZmkKKzwgICBkb25lCis8ICAgSUZTPSIkYWNfc2F2ZV9pZnMiCistLS0KKz4gYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorPiBmb3IgYXNfZGlyIGluICRQQVRICis+IGRvCis+ICAgSUZTPSRhc19zYXZlX0lGUworPiAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCis+ICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCis+ICAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorPiAgICAgaWYgdGVzdCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCis+ICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcworPiAgICAgICAgY29udGludWUKKz4gICAgICBmaQorPiAgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCis+ICAgICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorPiAgICAgYnJlYWsgMgorPiAgIGZpCis+IGRvbmUKKz4gZG9uZQorPiBJRlM9JGFzX3NhdmVfSUZTCis+IAorNjUzYzIxMTgKKzwgICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCistLS0KKz4gICBpZiB0ZXN0ICQjICE9IDA7IHRoZW4KKzY1OCw2NjBjMjEyMworPCAgICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCis8ICAgICBzaGlmdAorPCAgICAgYWNfY3ZfcHJvZ19DQz0iJEAiCistLS0KKz4gICAgIGFjX2N2X3Byb2dfQ0M9IiRhc19kaXIvJGFjX3dvcmQkezErJyAnfSRAIgorNjY1YzIxMjgKKzwgQ0M9IiRhY19jdl9wcm9nX0NDIgorLS0tCis+IENDPSRhY19jdl9wcm9nX0NDCis2NjdjMjEzMCwyMTMxCis8ICAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgorLS0tCis+ICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENDIiA+JjUKKz4gJGFzX2VjaG8gIiRDQyIgPiY2OyB9Cis2NjljMjEzMywyMTM0Cis8ICAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CistLS0KKz4gICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Cis+ICRhc19lY2hvICJubyIgPiY2OyB9Cis2NzIsNjgwYzIxMzcsMjE0OAorPCAgIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KKzwgICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCis8ICAgICAqd2luMzIqIHwgKldJTjMyKikKKzwgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCis8IHNldCBkdW1teSBjbDsgYWNfd29yZD0kMgorPCBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6Njc5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorPCBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCis8ICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKy0tLQorPiAKKz4gZmkKKz4gaWYgdGVzdCAteiAiJENDIjsgdGhlbgorPiAgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKz4gICBmb3IgYWNfcHJvZyBpbiBjbC5leGUKKz4gICBkbworPiAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCis+IHNldCBkdW1teSAkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZzsgYWNfd29yZD0kMgorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Cis+IGlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DQytzZXR9IiA9IHNldDsgdGhlbgorPiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Cis2ODUsNjk0YzIxNTMsMjE2NworPCAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCis8ICAgYWNfZHVtbXk9IiRQQVRIIgorPCAgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworPCAgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKzwgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorPCAgICAgICBhY19jdl9wcm9nX0NDPSJjbCIKKzwgICAgICAgYnJlYWsKKzwgICAgIGZpCis8ICAgZG9uZQorPCAgIElGUz0iJGFjX3NhdmVfaWZzIgorLS0tCis+IGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKKz4gZm9yIGFzX2RpciBpbiAkUEFUSAorPiBkbworPiAgIElGUz0kYXNfc2F2ZV9JRlMKKz4gICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorPiAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworPiAgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKz4gICAgIGFjX2N2X3Byb2dfQ0M9IiRhY190b29sX3ByZWZpeCRhY19wcm9nIgorPiAgICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKz4gICAgIGJyZWFrIDIKKz4gICBmaQorPiBkb25lCis+IGRvbmUKKz4gSUZTPSRhc19zYXZlX0lGUworPiAKKzY5N2MyMTcwCis8IENDPSIkYWNfY3ZfcHJvZ19DQyIKKy0tLQorPiBDQz0kYWNfY3ZfcHJvZ19DQworNjk5YzIxNzIsMjE3MworPCAgIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKKy0tLQorPiAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRDQyIgPiY1Cis+ICRhc19lY2hvICIkQ0MiID4mNjsgfQorNzAxYzIxNzUsMjE3NgorPCAgIGVjaG8gIiRhY190IiJubyIgMT4mNgorLS0tCis+ICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorPiAkYXNfZWNobyAibm8iID4mNjsgfQorNzAzLDcwNGMyMTc4LDIyMDYKKzwgIDs7Cis8ICAgICBlc2FjCistLS0KKz4gCis+IAorPiAgICAgdGVzdCAtbiAiJENDIiAmJiBicmVhaworPiAgIGRvbmUKKz4gZmkKKz4gaWYgdGVzdCAteiAiJENDIjsgdGhlbgorPiAgIGFjX2N0X0NDPSRDQworPiAgIGZvciBhY19wcm9nIGluIGNsLmV4ZQorPiBkbworPiAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorPiBzZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Cis+ICRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQorPiBpZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KKz4gICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorPiBlbHNlCis+ICAgaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgorPiAgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19jdF9DQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCis+IGVsc2UKKz4gYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorPiBmb3IgYXNfZGlyIGluICRQQVRICis+IGRvCis+ICAgSUZTPSRhc19zYXZlX0lGUworPiAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCis+ICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCis+ICAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorPiAgICAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX3Byb2ciCis+ICAgICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorPiAgICAgYnJlYWsgMgorNzA2YzIyMDgsMjIyMAorPCAgIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9CistLS0KKz4gZG9uZQorPiBkb25lCis+IElGUz0kYXNfc2F2ZV9JRlMKKz4gCis+IGZpCis+IGZpCis+IGFjX2N0X0NDPSRhY19jdl9wcm9nX2FjX2N0X0NDCis+IGlmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKz4gICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3RfQ0MiID4mNQorPiAkYXNfZWNobyAiJGFjX2N0X0NDIiA+JjY7IH0KKz4gZWxzZQorPiAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKKz4gJGFzX2VjaG8gIm5vIiA+JjY7IH0KKzcwOSw3MTBkMjIyMgorPCBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6NzExOiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQorNzEyLDczMGMyMjI0LDIyMjgKKzwgYWNfZXh0PWMKKzwgIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgorPCBhY19jcHA9JyRDUFAgJENQUEZMQUdTJworPCBhY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCis8IGFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKKzwgY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCis8IAorPCBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8IEVPRgorPCAKKzwgI2xpbmUgNzIyICJjb25maWd1cmUiCis8ICNpbmNsdWRlICJjb25mZGVmcy5oIgorPCAKKzwgbWFpbigpe3JldHVybigwKTt9Cis8IEVPRgorPCBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjcyNzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCis8ICAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKKzwgICAjIElmIHdlIGNhbid0IHJ1biBhIHRyaXZpYWwgcHJvZ3JhbSwgd2UgYXJlIHByb2JhYmx5IHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIuCis8ICAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCis8ICAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCistLS0KKz4gICB0ZXN0IC1uICIkYWNfY3RfQ0MiICYmIGJyZWFrCis+IGRvbmUKKz4gCis+ICAgaWYgdGVzdCAieCRhY19jdF9DQyIgPSB4OyB0aGVuCis+ICAgICBDQz0iIgorNzMyYzIyMzAsMjIzNgorPCAgICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKKy0tLQorPiAgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgorPiB5ZXM6KQorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorPiBhY190b29sX3dhcm5lZD15ZXMgOzsKKz4gZXNhYworPiAgICAgQ0M9JGFjX2N0X0NDCis3MzQsNzM3ZDIyMzcKKzwgZWxzZQorPCAgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis8ICAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Cis8ICAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubworNzM5LDc0NWQyMjM4Cis8IHJtIC1mciBjb25mdGVzdCoKKzwgYWNfZXh0PWMKKzwgIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgorPCBhY19jcHA9JyRDUFAgJENQUEZMQUdTJworPCBhY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCis8IGFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKKzwgY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCis3NDcsNzQ5ZDIyMzkKKzwgZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX3dvcmtzIiAxPiY2Cis8IGlmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgorPCAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Cis3NTEsNzU0ZDIyNDAKKzwgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6NzUzOiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1Cis8IGVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgorPCBjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKKzc1Niw3NjdjMjI0MiwyMzY4Cis8IGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKKzwgZWNobyAiY29uZmlndXJlOjc1ODogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQorPCBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nY2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorPCAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Cis8IGVsc2UKKzwgICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCis8ICNpZmRlZiBfX0dOVUNfXworPCAgIHllczsKKzwgI2VuZGlmCis8IEVPRgorPCBpZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6NzY3OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKzwgICBhY19jdl9wcm9nX2djYz15ZXMKKy0tLQorPiAKKz4gdGVzdCAteiAiJENDIiAmJiB7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cis+IHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBubyBhY2NlcHRhYmxlIEMgY29tcGlsZXIgZm91bmQgaW4gXCRQQVRICis+IFNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgQyBjb21waWxlciBmb3VuZCBpbiBcJFBBVEgKKz4gU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9Cis+ICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTsgfQorPiAKKz4gIyBQcm92aWRlIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbXBpbGVyLgorPiAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBDIGNvbXBpbGVyIHZlcnNpb24iID4mNQorPiBzZXQgWCAkYWNfY29tcGlsZQorPiBhY19jb21waWxlcj0kMgorPiB7IChhY190cnk9IiRhY19jb21waWxlciAtLXZlcnNpb24gPiY1IgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19jb21waWxlciAtLXZlcnNpb24gPiY1IikgMj4mNQorPiAgIGFjX3N0YXR1cz0kPworPiAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cis+ICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0KKz4geyAoYWNfdHJ5PSIkYWNfY29tcGlsZXIgLXYgPiY1IgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19jb21waWxlciAtdiA+JjUiKSAyPiY1Cis+ICAgYWNfc3RhdHVzPSQ/Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfQorPiB7IChhY190cnk9IiRhY19jb21waWxlciAtViA+JjUiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2NvbXBpbGVyIC1WID4mNSIpIDI+JjUKKz4gICBhY19zdGF0dXM9JD8KKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9Cis+IAorPiBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogY29uZmRlZnMuaC4gICovCis+IF9BQ0VPRgorPiBjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKz4gY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBlbmQgY29uZmRlZnMuaC4gICovCis+IAorPiBpbnQKKz4gbWFpbiAoKQorPiB7Cis+IAorPiAgIDsKKz4gICByZXR1cm4gMDsKKz4gfQorPiBfQUNFT0YKKz4gYWNfY2xlYW5fZmlsZXNfc2F2ZT0kYWNfY2xlYW5fZmlsZXMKKz4gYWNfY2xlYW5fZmlsZXM9IiRhY19jbGVhbl9maWxlcyBhLm91dCBhLm91dC5kU1lNIGEuZXhlIGIub3V0IgorPiAjIFRyeSB0byBjcmVhdGUgYW4gZXhlY3V0YWJsZSB3aXRob3V0IC1vIGZpcnN0LCBkaXNyZWdhcmQgYS5vdXQuCis+ICMgSXQgd2lsbCBoZWxwIHVzIGRpYWdub3NlIGJyb2tlbiBjb21waWxlcnMsIGFuZCBmaW5kaW5nIG91dCBhbiBpbnR1aXRpb24KKz4gIyBvZiBleGVleHQuCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgQyBjb21waWxlciBkZWZhdWx0IG91dHB1dCBmaWxlIG5hbWUiID4mNQorPiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgQyBjb21waWxlciBkZWZhdWx0IG91dHB1dCBmaWxlIG5hbWUuLi4gIiA+JjY7IH0KKz4gYWNfbGlua19kZWZhdWx0PWAkYXNfZWNobyAiJGFjX2xpbmsiIHwgc2VkICdzLyAtbyAqY29uZnRlc3RbXiBdKi8vJ2AKKz4gCis+ICMgVGhlIHBvc3NpYmxlIG91dHB1dCBmaWxlczoKKz4gYWNfZmlsZXM9ImEub3V0IGNvbmZ0ZXN0LmV4ZSBjb25mdGVzdCBhLmV4ZSBhX291dC5leGUgYi5vdXQgY29uZnRlc3QuKiIKKz4gCis+IGFjX3JtZmlsZXM9Cis+IGZvciBhY19maWxlIGluICRhY19maWxlcworPiBkbworPiAgIGNhc2UgJGFjX2ZpbGUgaW4KKz4gICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiB8ICouZFNZTSB8ICoubyB8ICoub2JqICkgOzsKKz4gICAgICogKSBhY19ybWZpbGVzPSIkYWNfcm1maWxlcyAkYWNfZmlsZSI7OworPiAgIGVzYWMKKz4gZG9uZQorPiBybSAtZiAkYWNfcm1maWxlcworPiAKKz4gaWYgeyAoYWNfdHJ5PSIkYWNfbGlua19kZWZhdWx0IgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19saW5rX2RlZmF1bHQiKSAyPiY1Cis+ICAgYWNfc3RhdHVzPSQ/Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgdGhlbgorPiAgICMgQXV0b2NvbmYtMi4xMyBjb3VsZCBzZXQgdGhlIGFjX2N2X2V4ZWV4dCB2YXJpYWJsZSB0byBgbm8nLgorPiAjIFNvIGlnbm9yZSBhIHZhbHVlIG9mIGBubycsIG90aGVyd2lzZSB0aGlzIHdvdWxkIGxlYWQgdG8gYEVYRUVYVCA9IG5vJworPiAjIGluIGEgTWFrZWZpbGUuICBXZSBzaG91bGQgbm90IG92ZXJyaWRlIGFjX2N2X2V4ZWV4dCBpZiBpdCB3YXMgY2FjaGVkLAorPiAjIHNvIHRoYXQgdGhlIHVzZXIgY2FuIHNob3J0LWNpcmN1aXQgdGhpcyB0ZXN0IGZvciBjb21waWxlcnMgdW5rbm93biB0bworPiAjIEF1dG9jb25mLgorPiBmb3IgYWNfZmlsZSBpbiAkYWNfZmlsZXMgJycKKz4gZG8KKz4gICB0ZXN0IC1mICIkYWNfZmlsZSIgfHwgY29udGludWUKKz4gICBjYXNlICRhY19maWxlIGluCis+ICAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubWFwIHwgKi5pbmYgfCAqLmRTWU0gfCAqLm8gfCAqLm9iaiApCis+IAk7OworPiAgICAgW2FiXS5vdXQgKQorPiAJIyBXZSBmb3VuZCB0aGUgZGVmYXVsdCBleGVjdXRhYmxlLCBidXQgZXhlZXh0PScnIGlzIG1vc3QKKz4gCSMgY2VydGFpbmx5IHJpZ2h0LgorPiAJYnJlYWs7OworPiAgICAgKi4qICkKKz4gICAgICAgICBpZiB0ZXN0ICIke2FjX2N2X2V4ZWV4dCtzZXR9IiA9IHNldCAmJiB0ZXN0ICIkYWNfY3ZfZXhlZXh0IiAhPSBubzsKKz4gCXRoZW4gOjsgZWxzZQorPiAJICAgYWNfY3ZfZXhlZXh0PWBleHByICIkYWNfZmlsZSIgOiAnW14uXSpcKFwuLipcKSdgCis+IAlmaQorPiAJIyBXZSBzZXQgYWNfY3ZfZXhlZXh0IGhlcmUgYmVjYXVzZSB0aGUgbGF0ZXIgdGVzdCBmb3IgaXQgaXMgbm90Cis+IAkjIHNhZmU6IGNyb3NzIGNvbXBpbGVycyBtYXkgbm90IGFkZCB0aGUgc3VmZml4IGlmIGdpdmVuIGFuIGAtbycKKz4gCSMgYXJndW1lbnQsIHNvIHdlIG1heSBuZWVkIHRvIGtub3cgaXQgYXQgdGhhdCBwb2ludCBhbHJlYWR5LgorPiAJIyBFdmVuIGlmIHRoaXMgc2VjdGlvbiBsb29rcyBjcnVmdHk6IGl0IGhhcyB0aGUgYWR2YW50YWdlIG9mCis+IAkjIGFjdHVhbGx5IHdvcmtpbmcuCis+IAlicmVhazs7Cis+ICAgICAqICkKKz4gCWJyZWFrOzsKKz4gICBlc2FjCis+IGRvbmUKKz4gdGVzdCAiJGFjX2N2X2V4ZWV4dCIgPSBubyAmJiBhY19jdl9leGVleHQ9Cis+IAorNzY5YzIzNzAKKzwgICBhY19jdl9wcm9nX2djYz1ubworLS0tCis+ICAgYWNfZmlsZT0nJworNzcwYTIzNzIsMjQyMworPiAKKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2ZpbGUiID4mNQorPiAkYXNfZWNobyAiJGFjX2ZpbGUiID4mNjsgfQorPiBpZiB0ZXN0IC16ICIkYWNfZmlsZSI7IHRoZW4KKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKz4geyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorPiB7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzCis+IFNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcworPiBTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KKz4gICAgeyAoZXhpdCA3Nyk7IGV4aXQgNzc7IH07IH07IH0KKz4gZmkKKz4gCis+IGFjX2V4ZWV4dD0kYWNfY3ZfZXhlZXh0Cis+IAorPiAjIENoZWNrIHRoYXQgdGhlIGNvbXBpbGVyIHByb2R1Y2VzIGV4ZWN1dGFibGVzIHdlIGNhbiBydW4uICBJZiBub3QsIGVpdGhlcgorPiAjIHRoZSBjb21waWxlciBpcyBicm9rZW4sIG9yIHdlIGNyb3NzIGNvbXBpbGUuCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIHdvcmtzIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciB3b3Jrcy4uLiAiID4mNjsgfQorPiAjIEZJWE1FOiBUaGVzZSBjcm9zcyBjb21waWxlciBoYWNrcyBzaG91bGQgYmUgcmVtb3ZlZCBmb3IgQXV0b2NvbmYgMy4wCis+ICMgSWYgbm90IGNyb3NzIGNvbXBpbGluZywgY2hlY2sgdGhhdCB3ZSBjYW4gcnVuIGEgc2ltcGxlIHByb2dyYW0uCis+IGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciICE9IHllczsgdGhlbgorPiAgIGlmIHsgYWNfdHJ5PScuLyRhY19maWxlJworPiAgIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKKz4gICBhY19zdGF0dXM9JD8KKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCis+ICAgICBjcm9zc19jb21waWxpbmc9bm8KKz4gICBlbHNlCis+ICAgICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IG1heWJlOyB0aGVuCis+IAljcm9zc19jb21waWxpbmc9eWVzCis+ICAgICBlbHNlCis+IAl7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cis+IHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgcnVuIEMgY29tcGlsZWQgcHJvZ3JhbXMuCis+IElmIHlvdSBtZWFudCB0byBjcm9zcyBjb21waWxlLCB1c2UgXGAtLWhvc3QnLgorPiBTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgcnVuIEMgY29tcGlsZWQgcHJvZ3JhbXMuCis+IElmIHlvdSBtZWFudCB0byBjcm9zcyBjb21waWxlLCB1c2UgXGAtLWhvc3QnLgorPiBTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KKz4gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OyB9Cis+ICAgICBmaQorPiAgIGZpCis3NzFhMjQyNSwyNDI2Cis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1Cis+ICRhc19lY2hvICJ5ZXMiID4mNjsgfQorNzczYzI0MjgsMjU0OQorPCBlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ2NjIiAxPiY2CistLS0KKz4gcm0gLWYgLXIgYS5vdXQgYS5vdXQuZFNZTSBhLmV4ZSBjb25mdGVzdCRhY19jdl9leGVleHQgYi5vdXQKKz4gYWNfY2xlYW5fZmlsZXM9JGFjX2NsZWFuX2ZpbGVzX3NhdmUKKz4gIyBDaGVjayB0aGF0IHRoZSBjb21waWxlciBwcm9kdWNlcyBleGVjdXRhYmxlcyB3ZSBjYW4gcnVuLiAgSWYgbm90LCBlaXRoZXIKKz4gIyB0aGUgY29tcGlsZXIgaXMgYnJva2VuLCBvciB3ZSBjcm9zcyBjb21waWxlLgorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgY3Jvc3MgY29tcGlsaW5nIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgY3Jvc3MgY29tcGlsaW5nLi4uICIgPiY2OyB9Cis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRjcm9zc19jb21waWxpbmciID4mNQorPiAkYXNfZWNobyAiJGNyb3NzX2NvbXBpbGluZyIgPiY2OyB9Cis+IAorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBleGVjdXRhYmxlcyIgPiY1Cis+ICRhc19lY2hvX24gImNoZWNraW5nIGZvciBzdWZmaXggb2YgZXhlY3V0YWJsZXMuLi4gIiA+JjY7IH0KKz4gaWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKKz4gY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfbGluayIpIDI+JjUKKz4gICBhY19zdGF0dXM9JD8KKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9OyB0aGVuCis+ICAgIyBJZiBib3RoIGBjb25mdGVzdC5leGUnIGFuZCBgY29uZnRlc3QnIGFyZSBgcHJlc2VudCcgKHdlbGwsIG9ic2VydmFibGUpCis+ICMgY2F0Y2ggYGNvbmZ0ZXN0LmV4ZScuICBGb3IgaW5zdGFuY2Ugd2l0aCBDeWd3aW4sIGBscyBjb25mdGVzdCcgd2lsbAorPiAjIHdvcmsgcHJvcGVybHkgKGkuZS4sIHJlZmVyIHRvIGBjb25mdGVzdC5leGUnKSwgd2hpbGUgaXQgd29uJ3Qgd2l0aAorPiAjIGBybScuCis+IGZvciBhY19maWxlIGluIGNvbmZ0ZXN0LmV4ZSBjb25mdGVzdCBjb25mdGVzdC4qOyBkbworPiAgIHRlc3QgLWYgIiRhY19maWxlIiB8fCBjb250aW51ZQorPiAgIGNhc2UgJGFjX2ZpbGUgaW4KKz4gICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiB8ICouZFNZTSB8ICoubyB8ICoub2JqICkgOzsKKz4gICAgICouKiApIGFjX2N2X2V4ZWV4dD1gZXhwciAiJGFjX2ZpbGUiIDogJ1teLl0qXChcLi4qXCknYAorPiAJICBicmVhazs7Cis+ICAgICAqICkgYnJlYWs7OworPiAgIGVzYWMKKz4gZG9uZQorPiBlbHNlCis+ICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorPiB7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc3VmZml4IG9mIGV4ZWN1dGFibGVzOiBjYW5ub3QgY29tcGlsZSBhbmQgbGluaworPiBTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzdWZmaXggb2YgZXhlY3V0YWJsZXM6IGNhbm5vdCBjb21waWxlIGFuZCBsaW5rCis+IFNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQorPiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07IH0KKz4gZmkKKz4gCis+IHJtIC1mIGNvbmZ0ZXN0JGFjX2N2X2V4ZWV4dAorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfZXhlZXh0IiA+JjUKKz4gJGFzX2VjaG8gIiRhY19jdl9leGVleHQiID4mNjsgfQorPiAKKz4gcm0gLWYgY29uZnRlc3QuJGFjX2V4dAorPiBFWEVFWFQ9JGFjX2N2X2V4ZWV4dAorPiBhY19leGVleHQ9JEVYRUVYVAorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXMiID4mNQorPiAkYXNfZWNob19uICJjaGVja2luZyBmb3Igc3VmZml4IG9mIG9iamVjdCBmaWxlcy4uLiAiID4mNjsgfQorPiBpZiB0ZXN0ICIke2FjX2N2X29iamV4dCtzZXR9IiA9IHNldDsgdGhlbgorPiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Cis+IGVsc2UKKz4gICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogY29uZmRlZnMuaC4gICovCis+IF9BQ0VPRgorPiBjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKz4gY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBlbmQgY29uZmRlZnMuaC4gICovCis+IAorPiBpbnQKKz4gbWFpbiAoKQorPiB7Cis+IAorPiAgIDsKKz4gICByZXR1cm4gMDsKKz4gfQorPiBfQUNFT0YKKz4gcm0gLWYgY29uZnRlc3QubyBjb25mdGVzdC5vYmoKKz4gaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKKz4gY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfY29tcGlsZSIpIDI+JjUKKz4gICBhY19zdGF0dXM9JD8KKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9OyB0aGVuCis+ICAgZm9yIGFjX2ZpbGUgaW4gY29uZnRlc3QubyBjb25mdGVzdC5vYmogY29uZnRlc3QuKjsgZG8KKz4gICB0ZXN0IC1mICIkYWNfZmlsZSIgfHwgY29udGludWU7Cis+ICAgY2FzZSAkYWNfZmlsZSBpbgorPiAgICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm1hcCB8ICouaW5mIHwgKi5kU1lNICkgOzsKKz4gICAgICopIGFjX2N2X29iamV4dD1gZXhwciAiJGFjX2ZpbGUiIDogJy4qXC5cKC4qXCknYAorPiAgICAgICAgYnJlYWs7OworPiAgIGVzYWMKKz4gZG9uZQorPiBlbHNlCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCis+IHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KKz4geyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXM6IGNhbm5vdCBjb21waWxlCis+IFNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXM6IGNhbm5vdCBjb21waWxlCis+IFNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQorPiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07IH0KKz4gZmkKKz4gCis+IHJtIC1mIGNvbmZ0ZXN0LiRhY19jdl9vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorPiBmaQorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfb2JqZXh0IiA+JjUKKz4gJGFzX2VjaG8gIiRhY19jdl9vYmpleHQiID4mNjsgfQorPiBPQkpFWFQ9JGFjX2N2X29iamV4dAorPiBhY19vYmpleHQ9JE9CSkVYVAorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDIGNvbXBpbGVyIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDIGNvbXBpbGVyLi4uICIgPiY2OyB9Cis+IGlmIHRlc3QgIiR7YWNfY3ZfY19jb21waWxlcl9nbnUrc2V0fSIgPSBzZXQ7IHRoZW4KKz4gICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorPiBlbHNlCis+ICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGNvbmZkZWZzLmguICAqLworPiBfQUNFT0YKKz4gY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Cis+IGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogZW5kIGNvbmZkZWZzLmguICAqLworNzc1YzI1NTEsMjU5NAorPCBpZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgorLS0tCis+IGludAorPiBtYWluICgpCis+IHsKKz4gI2lmbmRlZiBfX0dOVUNfXworPiAgICAgICAgY2hva2UgbWUKKz4gI2VuZGlmCis+IAorPiAgIDsKKz4gICByZXR1cm4gMDsKKz4gfQorPiBfQUNFT0YKKz4gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorPiBpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKz4gICBhY19zdGF0dXM9JD8KKz4gICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorPiAgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorPiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Cis+IAkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Cis+IAkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorPiAgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKz4gICBhY19jb21waWxlcl9nbnU9eWVzCis+IGVsc2UKKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKz4gCWFjX2NvbXBpbGVyX2dudT1ubworPiBmaQorPiAKKz4gcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Cis+IGFjX2N2X2NfY29tcGlsZXJfZ251PSRhY19jb21waWxlcl9nbnUKKz4gCis+IGZpCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9jX2NvbXBpbGVyX2dudSIgPiY1Cis+ICRhc19lY2hvICIkYWNfY3ZfY19jb21waWxlcl9nbnUiID4mNjsgfQorPiBpZiB0ZXN0ICRhY19jb21waWxlcl9nbnUgPSB5ZXM7IHRoZW4KKzc3OWEyNTk5LDI2NTgKKz4gYWNfdGVzdF9DRkxBR1M9JHtDRkxBR1Mrc2V0fQorPiBhY19zYXZlX0NGTEFHUz0kQ0ZMQUdTCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyICRDQyBhY2NlcHRzIC1nIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciAkQ0MgYWNjZXB0cyAtZy4uLiAiID4mNjsgfQorPiBpZiB0ZXN0ICIke2FjX2N2X3Byb2dfY2NfZytzZXR9IiA9IHNldDsgdGhlbgorPiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Cis+IGVsc2UKKz4gICBhY19zYXZlX2Nfd2Vycm9yX2ZsYWc9JGFjX2Nfd2Vycm9yX2ZsYWcKKz4gICAgYWNfY193ZXJyb3JfZmxhZz15ZXMKKz4gICAgYWNfY3ZfcHJvZ19jY19nPW5vCis+ICAgIENGTEFHUz0iLWciCis+ICAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKz4gCis+IGludAorPiBtYWluICgpCis+IHsKKz4gCis+ICAgOworPiAgIHJldHVybiAwOworPiB9Cis+IF9BQ0VPRgorPiBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Cis+IGlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorPiAgIGFjX3N0YXR1cz0kPworPiAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCis+ICAgcm0gLWYgY29uZnRlc3QuZXIxCis+ICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKz4gCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKz4gCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCis+ICAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorPiAgIGFjX2N2X3Byb2dfY2NfZz15ZXMKKz4gZWxzZQorPiAgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Cis+IAorPiAJQ0ZMQUdTPSIiCis+ICAgICAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKz4gCis+IGludAorPiBtYWluICgpCis+IHsKKzc4MSw3ODdjMjY2MCwyNjgyCis8IGFjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgorPCBhY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKKzwgQ0ZMQUdTPQorPCBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6Nzg2OiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQorPCBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19jY19nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKzwgICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorLS0tCis+ICAgOworPiAgIHJldHVybiAwOworPiB9Cis+IF9BQ0VPRgorPiBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Cis+IGlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorPiAgIGFjX3N0YXR1cz0kPworPiAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCis+ICAgcm0gLWYgY29uZnRlc3QuZXIxCis+ICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKz4gCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKz4gCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCis+ICAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorPiAgIDoKKzc4OSw3OTBjMjY4NCwyNzIxCis8ICAgZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCis8IGlmIHRlc3QgLXogImAke0NDLWNjfSAtZyAtYyBjb25mdGVzdC5jIDI+JjFgIjsgdGhlbgorLS0tCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCis+IAlhY19jX3dlcnJvcl9mbGFnPSRhY19zYXZlX2Nfd2Vycm9yX2ZsYWcKKz4gCSBDRkxBR1M9Ii1nIgorPiAJIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKz4gCis+IGludAorPiBtYWluICgpCis+IHsKKz4gCis+ICAgOworPiAgIHJldHVybiAwOworPiB9Cis+IF9BQ0VPRgorPiBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Cis+IGlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorPiAgIGFjX3N0YXR1cz0kPworPiAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCis+ICAgcm0gLWYgY29uZnRlc3QuZXIxCis+ICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKz4gCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKz4gCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCis+ICAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorNzkzYzI3MjQsMjcyNworPCAgIGFjX2N2X3Byb2dfY2NfZz1ubworLS0tCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCis+IAorNzk1ZDI3MjgKKzwgcm0gLWYgY29uZnRlc3QqCis3OTZhMjczMAorPiBybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKzc5OWMyNzMzLDI3NDAKKzwgZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2ciIDE+JjYKKy0tLQorPiBybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKz4gZmkKKz4gCis+IHJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorPiAgICBhY19jX3dlcnJvcl9mbGFnPSRhY19zYXZlX2Nfd2Vycm9yX2ZsYWcKKz4gZmkKKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3Byb2dfY2NfZyIgPiY1Cis+ICRhc19lY2hvICIkYWNfY3ZfcHJvZ19jY19nIiA+JjY7IH0KKzgwMWMyNzQyCis8ICAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCistLS0KKz4gICBDRkxBR1M9JGFjX3NhdmVfQ0ZMQUdTCis4MTRhMjc1NiwyNzkwCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJENDIG9wdGlvbiB0byBhY2NlcHQgSVNPIEM4OSIgPiY1Cis+ICRhc19lY2hvX24gImNoZWNraW5nIGZvciAkQ0Mgb3B0aW9uIHRvIGFjY2VwdCBJU08gQzg5Li4uICIgPiY2OyB9Cis+IGlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19jY19jODkrc2V0fSIgPSBzZXQ7IHRoZW4KKz4gICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorPiBlbHNlCis+ICAgYWNfY3ZfcHJvZ19jY19jODk9bm8KKz4gYWNfc2F2ZV9DQz0kQ0MKKz4gY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGNvbmZkZWZzLmguICAqLworPiBfQUNFT0YKKz4gY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Cis+IGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogZW5kIGNvbmZkZWZzLmguICAqLworPiAjaW5jbHVkZSA8c3RkYXJnLmg+Cis+ICNpbmNsdWRlIDxzdGRpby5oPgorPiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Cis+ICNpbmNsdWRlIDxzeXMvc3RhdC5oPgorPiAvKiBNb3N0IG9mIHRoZSBmb2xsb3dpbmcgdGVzdHMgYXJlIHN0b2xlbiBmcm9tIFJDUyA1LjcncyBzcmMvY29uZi5zaC4gICovCis+IHN0cnVjdCBidWYgeyBpbnQgeDsgfTsKKz4gRklMRSAqICgqcmNzb3BlbikgKHN0cnVjdCBidWYgKiwgc3RydWN0IHN0YXQgKiwgaW50KTsKKz4gc3RhdGljIGNoYXIgKmUgKHAsIGkpCis+ICAgICAgY2hhciAqKnA7Cis+ICAgICAgaW50IGk7Cis+IHsKKz4gICByZXR1cm4gcFtpXTsKKz4gfQorPiBzdGF0aWMgY2hhciAqZiAoY2hhciAqICgqZykgKGNoYXIgKiosIGludCksIGNoYXIgKipwLCAuLi4pCis+IHsKKz4gICBjaGFyICpzOworPiAgIHZhX2xpc3QgdjsKKz4gICB2YV9zdGFydCAodixwKTsKKz4gICBzID0gZyAocCwgdmFfYXJnICh2LGludCkpOworPiAgIHZhX2VuZCAodik7Cis+ICAgcmV0dXJuIHM7Cis+IH0KKzgxNmMyNzkyLDI4MjEKKzwgZm9yIGFjX3Byb2cgaW4gJENDQyBjKysgZysrIGdjYyBDQyBjeHggY2MrKyBjbAorLS0tCis+IC8qIE9TRiA0LjAgQ29tcGFxIGNjIGlzIHNvbWUgc29ydCBvZiBhbG1vc3QtQU5TSSBieSBkZWZhdWx0LiAgSXQgaGFzCis+ICAgIGZ1bmN0aW9uIHByb3RvdHlwZXMgYW5kIHN0dWZmLCBidXQgbm90ICdceEhIJyBoZXggY2hhcmFjdGVyIGNvbnN0YW50cy4KKz4gICAgVGhlc2UgZG9uJ3QgcHJvdm9rZSBhbiBlcnJvciB1bmZvcnR1bmF0ZWx5LCBpbnN0ZWFkIGFyZSBzaWxlbnRseSB0cmVhdGVkCis+ICAgIGFzICd4Jy4gIFRoZSBmb2xsb3dpbmcgaW5kdWNlcyBhbiBlcnJvciwgdW50aWwgLXN0ZCBpcyBhZGRlZCB0byBnZXQKKz4gICAgcHJvcGVyIEFOU0kgbW9kZS4gIEN1cmlvdXNseSAnXHgwMCchPSd4JyBhbHdheXMgY29tZXMgb3V0IHRydWUsIGZvciBhbgorPiAgICBhcnJheSBzaXplIGF0IGxlYXN0LiAgSXQncyBuZWNlc3NhcnkgdG8gd3JpdGUgJ1x4MDAnPT0wIHRvIGdldCBzb21ldGhpbmcKKz4gICAgdGhhdCdzIHRydWUgb25seSB3aXRoIC1zdGQuICAqLworPiBpbnQgb3NmNF9jY19hcnJheSBbJ1x4MDAnID09IDAgPyAxIDogLTFdOworPiAKKz4gLyogSUJNIEMgNiBmb3IgQUlYIGlzIGFsbW9zdC1BTlNJIGJ5IGRlZmF1bHQsIGJ1dCBpdCByZXBsYWNlcyBtYWNybyBwYXJhbWV0ZXJzCis+ICAgIGluc2lkZSBzdHJpbmdzIGFuZCBjaGFyYWN0ZXIgY29uc3RhbnRzLiAgKi8KKz4gI2RlZmluZSBGT08oeCkgJ3gnCis+IGludCB4bGM2X2NjX2FycmF5W0ZPTyhhKSA9PSAneCcgPyAxIDogLTFdOworPiAKKz4gaW50IHRlc3QgKGludCBpLCBkb3VibGUgeCk7Cis+IHN0cnVjdCBzMSB7aW50ICgqZikgKGludCBhKTt9OworPiBzdHJ1Y3QgczIge2ludCAoKmYpIChkb3VibGUgYSk7fTsKKz4gaW50IHBhaXJuYW1lcyAoaW50LCBjaGFyICoqLCBGSUxFICooKikoc3RydWN0IGJ1ZiAqLCBzdHJ1Y3Qgc3RhdCAqLCBpbnQpLCBpbnQsIGludCk7Cis+IGludCBhcmdjOworPiBjaGFyICoqYXJndjsKKz4gaW50Cis+IG1haW4gKCkKKz4geworPiByZXR1cm4gZiAoZSwgYXJndiwgMCkgIT0gYXJndlswXSAgfHwgIGYgKGUsIGFyZ3YsIDEpICE9IGFyZ3ZbMV07Cis+ICAgOworPiAgIHJldHVybiAwOworPiB9Cis+IF9BQ0VPRgorPiBmb3IgYWNfYXJnIGluICcnIC1xbGFuZ2x2bD1leHRjODkgLXFsYW5nbHZsPWFuc2kgLXN0ZCBcCis+IAktQWUgIi1BYSAtRF9IUFVYX1NPVVJDRSIgIi1YYyAtRF9fRVhURU5TSU9OU19fIgorODE4LDgyM2MyODIzLDI4OTUKKzwgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCis8IHNldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgorPCBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6ODIyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorPCBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DWFgnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorPCAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CistLS0KKz4gICBDQz0iJGFjX3NhdmVfQ0MgJGFjX2FyZyIKKz4gICBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Cis+IGlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorPiAgIGFjX3N0YXR1cz0kPworPiAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCis+ICAgcm0gLWYgY29uZnRlc3QuZXIxCis+ICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKz4gCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKz4gCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCis+ICAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorPiAgIGFjX2N2X3Byb2dfY2NfYzg5PSRhY19hcmcKKz4gZWxzZQorPiAgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Cis+IAorPiAKKz4gZmkKKz4gCis+IHJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQKKz4gICB0ZXN0ICJ4JGFjX2N2X3Byb2dfY2NfYzg5IiAhPSAieG5vIiAmJiBicmVhaworPiBkb25lCis+IHJtIC1mIGNvbmZ0ZXN0LiRhY19leHQKKz4gQ0M9JGFjX3NhdmVfQ0MKKz4gCis+IGZpCis+ICMgQUNfQ0FDSEVfVkFMCis+IGNhc2UgIngkYWNfY3ZfcHJvZ19jY19jODkiIGluCis+ICAgeCkKKz4gICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vbmUgbmVlZGVkIiA+JjUKKz4gJGFzX2VjaG8gIm5vbmUgbmVlZGVkIiA+JjY7IH0gOzsKKz4gICB4bm8pCis+ICAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB1bnN1cHBvcnRlZCIgPiY1Cis+ICRhc19lY2hvICJ1bnN1cHBvcnRlZCIgPiY2OyB9IDs7Cis+ICAgKikKKz4gICAgIENDPSIkQ0MgJGFjX2N2X3Byb2dfY2NfYzg5IgorPiAgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3Byb2dfY2NfYzg5IiA+JjUKKz4gJGFzX2VjaG8gIiRhY19jdl9wcm9nX2NjX2M4OSIgPiY2OyB9IDs7Cis+IGVzYWMKKz4gCis+IAorPiBhY19leHQ9YworPiBhY19jcHA9JyRDUFAgJENQUEZMQUdTJworPiBhY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCis+IGFjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCis+IGFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKz4gCis+IGFjX2V4dD1jcHAKKz4gYWNfY3BwPSckQ1hYQ1BQICRDUFBGTEFHUycKKz4gYWNfY29tcGlsZT0nJENYWCAtYyAkQ1hYRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworPiBhY19saW5rPSckQ1hYIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworPiBhY19jb21waWxlcl9nbnU9JGFjX2N2X2N4eF9jb21waWxlcl9nbnUKKz4gaWYgdGVzdCAteiAiJENYWCI7IHRoZW4KKz4gICBpZiB0ZXN0IC1uICIkQ0NDIjsgdGhlbgorPiAgICAgQ1hYPSRDQ0MKKz4gICBlbHNlCis+ICAgICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCis+ICAgZm9yIGFjX3Byb2cgaW4gZysrIGMrKyBncHAgYUNDIENDIGN4eCBjYysrIGNsLmV4ZSBGQ0MgS0NDIFJDQyB4bENfciB4bEMKKz4gICBkbworPiAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCis+IHNldCBkdW1teSAkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZzsgYWNfd29yZD0kMgorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Cis+IGlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DWFgrc2V0fSIgPSBzZXQ7IHRoZW4KKz4gICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorODI4LDgzN2MyOTAwLDI5MTQKKzwgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorPCAgIGFjX2R1bW15PSIkUEFUSCIKKzwgICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKzwgICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCis8ICAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKzwgICAgICAgYWNfY3ZfcHJvZ19DWFg9IiRhY19wcm9nIgorPCAgICAgICBicmVhaworPCAgICAgZmkKKzwgICBkb25lCis8ICAgSUZTPSIkYWNfc2F2ZV9pZnMiCistLS0KKz4gYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorPiBmb3IgYXNfZGlyIGluICRQQVRICis+IGRvCis+ICAgSUZTPSRhc19zYXZlX0lGUworPiAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCis+ICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCis+ICAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorPiAgICAgYWNfY3ZfcHJvZ19DWFg9IiRhY190b29sX3ByZWZpeCRhY19wcm9nIgorPiAgICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKz4gICAgIGJyZWFrIDIKKz4gICBmaQorPiBkb25lCis+IGRvbmUKKz4gSUZTPSRhc19zYXZlX0lGUworPiAKKzg0MGMyOTE3Cis8IENYWD0iJGFjX2N2X3Byb2dfQ1hYIgorLS0tCis+IENYWD0kYWNfY3ZfcHJvZ19DWFgKKzg0MmMyOTE5LDI5MjAKKzwgICBlY2hvICIkYWNfdCIiJENYWCIgMT4mNgorLS0tCis+ICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENYWCIgPiY1Cis+ICRhc19lY2hvICIkQ1hYIiA+JjY7IH0KKzg0NGMyOTIyLDI5MjMKKzwgICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKy0tLQorPiAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKKz4gJGFzX2VjaG8gIm5vIiA+JjY7IH0KKzg0N2MyOTI2LDI5NTUKKzwgdGVzdCAtbiAiJENYWCIgJiYgYnJlYWsKKy0tLQorPiAKKz4gICAgIHRlc3QgLW4gIiRDWFgiICYmIGJyZWFrCis+ICAgZG9uZQorPiBmaQorPiBpZiB0ZXN0IC16ICIkQ1hYIjsgdGhlbgorPiAgIGFjX2N0X0NYWD0kQ1hYCis+ICAgZm9yIGFjX3Byb2cgaW4gZysrIGMrKyBncHAgYUNDIENDIGN4eCBjYysrIGNsLmV4ZSBGQ0MgS0NDIFJDQyB4bENfciB4bEMKKz4gZG8KKz4gICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KKz4gc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorPiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KKz4gaWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X0NYWCtzZXR9IiA9IHNldDsgdGhlbgorPiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Cis+IGVsc2UKKz4gICBpZiB0ZXN0IC1uICIkYWNfY3RfQ1hYIjsgdGhlbgorPiAgIGFjX2N2X3Byb2dfYWNfY3RfQ1hYPSIkYWNfY3RfQ1hYIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KKz4gZWxzZQorPiBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCis+IGZvciBhc19kaXIgaW4gJFBBVEgKKz4gZG8KKz4gICBJRlM9JGFzX3NhdmVfSUZTCis+ICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKz4gICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKz4gICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCis+ICAgICBhY19jdl9wcm9nX2FjX2N0X0NYWD0iJGFjX3Byb2ciCis+ICAgICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorPiAgICAgYnJlYWsgMgorPiAgIGZpCis+IGRvbmUKKzg0OWMyOTU3LDI5NjgKKzwgdGVzdCAtbiAiJENYWCIgfHwgQ1hYPSJnY2MiCistLS0KKz4gSUZTPSRhc19zYXZlX0lGUworPiAKKz4gZmkKKz4gZmkKKz4gYWNfY3RfQ1hYPSRhY19jdl9wcm9nX2FjX2N0X0NYWAorPiBpZiB0ZXN0IC1uICIkYWNfY3RfQ1hYIjsgdGhlbgorPiAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdF9DWFgiID4mNQorPiAkYXNfZWNobyAiJGFjX2N0X0NYWCIgPiY2OyB9Cis+IGVsc2UKKz4gICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Cis+ICRhc19lY2hvICJubyIgPiY2OyB9Cis+IGZpCis4NTIsODUzYzI5NzEsMjk3MgorPCBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDKysgY29tcGlsZXIgKCRDWFggJENYWEZMQUdTICRMREZMQUdTKSB3b3JrcyIiLi4uICRhY19jIiAxPiY2Cis8IGVjaG8gImNvbmZpZ3VyZTo4NTQ6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMrKyBjb21waWxlciAoJENYWCAkQ1hYRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKKy0tLQorPiAgIHRlc3QgLW4gIiRhY19jdF9DWFgiICYmIGJyZWFrCis+IGRvbmUKKzg1NSw4NzNjMjk3NCwyOTc1Cis8IGFjX2V4dD1DCis8ICMgQ1hYRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgorPCBhY19jcHA9JyRDWFhDUFAgJENQUEZMQUdTJworPCBhY19jb21waWxlPScke0NYWC1nKyt9IC1jICRDWFhGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworPCBhY19saW5rPScke0NYWC1nKyt9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDWFhGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworPCBjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY3h4X2Nyb3NzCis8IAorPCBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8IEVPRgorPCAKKzwgI2xpbmUgODY1ICJjb25maWd1cmUiCis8ICNpbmNsdWRlICJjb25mZGVmcy5oIgorPCAKKzwgaW50IG1haW4oKXtyZXR1cm4oMCk7fQorPCBFT0YKKzwgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4NzA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorPCAgIGFjX2N2X3Byb2dfY3h4X3dvcmtzPXllcworPCAgICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KKzwgICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KKzwgICAgIGFjX2N2X3Byb2dfY3h4X2Nyb3NzPW5vCistLS0KKz4gICBpZiB0ZXN0ICJ4JGFjX2N0X0NYWCIgPSB4OyB0aGVuCis+ICAgICBDWFg9ImcrKyIKKzg3NWMyOTc3LDI5ODMKKzwgICAgIGFjX2N2X3Byb2dfY3h4X2Nyb3NzPXllcworLS0tCis+ICAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCis+IHllczopCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9Cis+IGFjX3Rvb2xfd2FybmVkPXllcyA7OworPiBlc2FjCis+ICAgICBDWFg9JGFjX2N0X0NYWAorODc3LDg4MGQyOTg0Cis8IGVsc2UKKzwgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPCAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorPCAgIGFjX2N2X3Byb2dfY3h4X3dvcmtzPW5vCis4ODIsODg4ZDI5ODUKKzwgcm0gLWZyIGNvbmZ0ZXN0KgorPCBhY19leHQ9YworPCAjIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCis8IGFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCis8IGFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKKzwgYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworPCBjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKKzg5MCw4OTJjMjk4NworPCBlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY3h4X3dvcmtzIiAxPiY2Cis8IGlmIHRlc3QgJGFjX2N2X3Byb2dfY3h4X3dvcmtzID0gbm87IHRoZW4KKzwgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMrKyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9CistLS0KKz4gICBmaQorODk0LDg5N2MyOTg5LDMwMzcKKzwgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQysrIGNvbXBpbGVyICgkQ1hYICRDWFhGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIiLi4uICRhY19jIiAxPiY2Cis8IGVjaG8gImNvbmZpZ3VyZTo4OTY6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMrKyBjb21waWxlciAoJENYWCAkQ1hYRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQorPCBlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY3h4X2Nyb3NzIiAxPiY2Cis8IGNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jeHhfY3Jvc3MKKy0tLQorPiAjIFByb3ZpZGUgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGlsZXIuCis+ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIEMrKyBjb21waWxlciB2ZXJzaW9uIiA+JjUKKz4gc2V0IFggJGFjX2NvbXBpbGUKKz4gYWNfY29tcGlsZXI9JDIKKz4geyAoYWNfdHJ5PSIkYWNfY29tcGlsZXIgLS12ZXJzaW9uID4mNSIKKz4gY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfY29tcGlsZXIgLS12ZXJzaW9uID4mNSIpIDI+JjUKKz4gICBhY19zdGF0dXM9JD8KKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9Cis+IHsgKGFjX3RyeT0iJGFjX2NvbXBpbGVyIC12ID4mNSIKKz4gY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfY29tcGlsZXIgLXYgPiY1IikgMj4mNQorPiAgIGFjX3N0YXR1cz0kPworPiAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cis+ICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0KKz4geyAoYWNfdHJ5PSIkYWNfY29tcGlsZXIgLVYgPiY1IgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19jb21waWxlciAtViA+JjUiKSAyPiY1Cis+ICAgYWNfc3RhdHVzPSQ/Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfQorPiAKKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQysrIGNvbXBpbGVyIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDKysgY29tcGlsZXIuLi4gIiA+JjY7IH0KKz4gaWYgdGVzdCAiJHthY19jdl9jeHhfY29tcGlsZXJfZ251K3NldH0iID0gc2V0OyB0aGVuCis+ICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKz4gZWxzZQorPiAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKzg5OSw5MDZjMzAzOSwzMDQzCis8IGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDKysiIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6OTAxOiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQysrIiA+JjUKKzwgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ3h4JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKzwgICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorPCBlbHNlCis8ICAgY2F0ID4gY29uZnRlc3QuQyA8PEVPRgorPCAjaWZkZWYgX19HTlVDX18KKzwgICB5ZXM7CistLS0KKz4gaW50Cis+IG1haW4gKCkKKz4geworPiAjaWZuZGVmIF9fR05VQ19fCis+ICAgICAgICBjaG9rZSBtZQorOTA4LDkxNmQzMDQ0Cis8IEVPRgorPCBpZiB7IGFjX3RyeT0nJHtDWFgtZysrfSAtRSBjb25mdGVzdC5DJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo5MTA6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9OyB9IHwgZWdyZXAgeWVzID4vZGV2L251bGwgMj4mMTsgdGhlbgorPCAgIGFjX2N2X3Byb2dfZ3h4PXllcworPCBlbHNlCis8ICAgYWNfY3ZfcHJvZ19neHg9bm8KKzwgZmkKKzwgZmkKKzwgCis8IGVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19neHgiIDE+JjYKKzkxOGMzMDQ2LDMwODIKKzwgaWYgdGVzdCAkYWNfY3ZfcHJvZ19neHggPSB5ZXM7IHRoZW4KKy0tLQorPiAgIDsKKz4gICByZXR1cm4gMDsKKz4gfQorPiBfQUNFT0YKKz4gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorPiBpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKz4gICBhY19zdGF0dXM9JD8KKz4gICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorPiAgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorPiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Cis+IAkgdGVzdCAteiAiJGFjX2N4eF93ZXJyb3JfZmxhZyIgfHwKKz4gCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCis+ICAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorPiAgIGFjX2NvbXBpbGVyX2dudT15ZXMKKz4gZWxzZQorPiAgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Cis+IAorPiAJYWNfY29tcGlsZXJfZ251PW5vCis+IGZpCis+IAorPiBybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKz4gYWNfY3ZfY3h4X2NvbXBpbGVyX2dudT0kYWNfY29tcGlsZXJfZ251Cis+IAorPiBmaQorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfY3h4X2NvbXBpbGVyX2dudSIgPiY1Cis+ICRhc19lY2hvICIkYWNfY3ZfY3h4X2NvbXBpbGVyX2dudSIgPiY2OyB9Cis+IGlmIHRlc3QgJGFjX2NvbXBpbGVyX2dudSA9IHllczsgdGhlbgorOTIyYTMwODcsMzEwNworPiBhY190ZXN0X0NYWEZMQUdTPSR7Q1hYRkxBR1Mrc2V0fQorPiBhY19zYXZlX0NYWEZMQUdTPSRDWFhGTEFHUworPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciAkQ1hYIGFjY2VwdHMgLWciID4mNQorPiAkYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyICRDWFggYWNjZXB0cyAtZy4uLiAiID4mNjsgfQorPiBpZiB0ZXN0ICIke2FjX2N2X3Byb2dfY3h4X2crc2V0fSIgPSBzZXQ7IHRoZW4KKz4gICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorPiBlbHNlCis+ICAgYWNfc2F2ZV9jeHhfd2Vycm9yX2ZsYWc9JGFjX2N4eF93ZXJyb3JfZmxhZworPiAgICBhY19jeHhfd2Vycm9yX2ZsYWc9eWVzCis+ICAgIGFjX2N2X3Byb2dfY3h4X2c9bm8KKz4gICAgQ1hYRkxBR1M9Ii1nIgorPiAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogY29uZmRlZnMuaC4gICovCis+IF9BQ0VPRgorPiBjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKz4gY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBlbmQgY29uZmRlZnMuaC4gICovCis+IAorPiBpbnQKKz4gbWFpbiAoKQorPiB7Cis5MjQsOTMwYzMxMDksMzEzMQorPCBhY190ZXN0X0NYWEZMQUdTPSIke0NYWEZMQUdTK3NldH0iCis8IGFjX3NhdmVfQ1hYRkxBR1M9IiRDWFhGTEFHUyIKKzwgQ1hYRkxBR1M9Cis8IGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtDWFgtZysrfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKKzwgZWNobyAiY29uZmlndXJlOjkyOTogY2hlY2tpbmcgd2hldGhlciAke0NYWC1nKyt9IGFjY2VwdHMgLWciID4mNQorPCBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19jeHhfZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCis8ICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKy0tLQorPiAgIDsKKz4gICByZXR1cm4gMDsKKz4gfQorPiBfQUNFT0YKKz4gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorPiBpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKz4gICBhY19zdGF0dXM9JD8KKz4gICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorPiAgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorPiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Cis+IAkgdGVzdCAteiAiJGFjX2N4eF93ZXJyb3JfZmxhZyIgfHwKKz4gCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCis+ICAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorPiAgIGFjX2N2X3Byb2dfY3h4X2c9eWVzCis5MzIsOTMzYzMxMzMsMzIwOQorPCAgIGVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuY2MKKzwgaWYgdGVzdCAteiAiYCR7Q1hYLWcrK30gLWcgLWMgY29uZnRlc3QuY2MgMj4mMWAiOyB0aGVuCistLS0KKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKz4gCUNYWEZMQUdTPSIiCis+ICAgICAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKz4gCis+IGludAorPiBtYWluICgpCis+IHsKKz4gCis+ICAgOworPiAgIHJldHVybiAwOworPiB9Cis+IF9BQ0VPRgorPiBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Cis+IGlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorPiAgIGFjX3N0YXR1cz0kPworPiAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCis+ICAgcm0gLWYgY29uZnRlc3QuZXIxCis+ICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKz4gCSB0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIiB8fAorPiAJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKz4gICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCis+ICAgOgorPiBlbHNlCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCis+IAlhY19jeHhfd2Vycm9yX2ZsYWc9JGFjX3NhdmVfY3h4X3dlcnJvcl9mbGFnCis+IAkgQ1hYRkxBR1M9Ii1nIgorPiAJIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKz4gCis+IGludAorPiBtYWluICgpCis+IHsKKz4gCis+ICAgOworPiAgIHJldHVybiAwOworPiB9Cis+IF9BQ0VPRgorPiBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Cis+IGlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorPiAgIGFjX3N0YXR1cz0kPworPiAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCis+ICAgcm0gLWYgY29uZnRlc3QuZXIxCis+ICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKz4gCSB0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIiB8fAorPiAJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKz4gICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCis5MzZjMzIxMiwzMjE4Cis8ICAgYWNfY3ZfcHJvZ19jeHhfZz1ubworLS0tCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCis+IAorPiBmaQorPiAKKz4gcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Cis5MzhkMzIxOQorPCBybSAtZiBjb25mdGVzdCoKKzkzOWEzMjIxCis+IHJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorOTQyYzMyMjQsMzIyOAorPCBlY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY3h4X2ciIDE+JjYKKy0tLQorPiBybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKz4gICAgYWNfY3h4X3dlcnJvcl9mbGFnPSRhY19zYXZlX2N4eF93ZXJyb3JfZmxhZworPiBmaQorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfcHJvZ19jeHhfZyIgPiY1Cis+ICRhc19lY2hvICIkYWNfY3ZfcHJvZ19jeHhfZyIgPiY2OyB9Cis5NDRjMzIzMAorPCAgIENYWEZMQUdTPSIkYWNfc2F2ZV9DWFhGTEFHUyIKKy0tLQorPiAgIENYWEZMQUdTPSRhY19zYXZlX0NYWEZMQUdTCis5NTdhMzI0NCwzMjQ4Cis+IGFjX2V4dD1jCis+IGFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCis+IGFjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKKz4gYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKKz4gYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorOTYwLDk2MWMzMjUxLDMyNTIKKzwgZm9yIGFjX2RpciBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLjsgZG8KKzwgICBpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC1zaDsgdGhlbgorLS0tCis+IGZvciBhY19kaXIgaW4gIiRzcmNkaXIiICIkc3JjZGlyLy4uIiAiJHNyY2Rpci8uLi8uLiI7IGRvCis+ICAgaWYgdGVzdCAtZiAiJGFjX2Rpci9pbnN0YWxsLXNoIjsgdGhlbgorOTY1YzMyNTYKKzwgICBlbGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLnNoOyB0aGVuCistLS0KKz4gICBlbGlmIHRlc3QgLWYgIiRhY19kaXIvaW5zdGFsbC5zaCI7IHRoZW4KKzk2OGEzMjYwLDMyNjMKKz4gICBlbGlmIHRlc3QgLWYgIiRhY19kaXIvc2h0b29sIjsgdGhlbgorPiAgICAgYWNfYXV4X2Rpcj0kYWNfZGlyCis+ICAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9zaHRvb2wgaW5zdGFsbCAtYyIKKz4gICAgIGJyZWFrCis5NzJjMzI2NywzMjY5Cis8ICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uIiAxPiYyOyBleGl0IDE7IH0KKy0tLQorPiAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gXCIkc3JjZGlyXCIgXCIkc3JjZGlyLy4uXCIgXCIkc3JjZGlyLy4uLy4uXCIiID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluIFwiJHNyY2RpclwiIFwiJHNyY2Rpci8uLlwiIFwiJHNyY2Rpci8uLi8uLlwiIiA+JjI7fQorPiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKzk3NCw5NzZjMzI3MSwzMjc5Cis8IGFjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKKzwgYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCis8IGFjX2NvbmZpZ3VyZT0kYWNfYXV4X2Rpci9jb25maWd1cmUgIyBUaGlzIHNob3VsZCBiZSBDeWdudXMgY29uZmlndXJlLgorLS0tCis+IAorPiAjIFRoZXNlIHRocmVlIHZhcmlhYmxlcyBhcmUgdW5kb2N1bWVudGVkIGFuZCB1bnN1cHBvcnRlZCwKKz4gIyBhbmQgYXJlIGludGVuZGVkIHRvIGJlIHdpdGhkcmF3biBpbiBhIGZ1dHVyZSBBdXRvY29uZiByZWxlYXNlLgorPiAjIFRoZXkgY2FuIGNhdXNlIHNlcmlvdXMgcHJvYmxlbXMgaWYgYSBidWlsZGVyJ3Mgc291cmNlIHRyZWUgaXMgaW4gYSBkaXJlY3RvcnkKKz4gIyB3aG9zZSBmdWxsIG5hbWUgY29udGFpbnMgdW51c3VhbCBjaGFyYWN0ZXJzLgorPiBhY19jb25maWdfZ3Vlc3M9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MiICAjIFBsZWFzZSBkb24ndCB1c2UgdGhpcyB2YXIuCis+IGFjX2NvbmZpZ19zdWI9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViIiAgIyBQbGVhc2UgZG9uJ3QgdXNlIHRoaXMgdmFyLgorPiBhY19jb25maWd1cmU9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWd1cmUiICAjIFBsZWFzZSBkb24ndCB1c2UgdGhpcyB2YXIuCis+IAorOTg0YTMyODgKKz4gIyBBbWlnYU9TIC9DL2luc3RhbGwsIHdoaWNoIGluc3RhbGxzIGJvb3RibG9ja3Mgb24gZmxvcHB5IGRpc2NzCis5ODdhMzI5MgorPiAjIE9TLzIncyBzeXN0ZW0gaW5zdGFsbCwgd2hpY2ggaGFzIGEgY29tcGxldGVseSBkaWZmZXJlbnQgc2VtYW50aWMKKzk4OSw5OTBjMzI5NCwzMjk2Cis8IGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6OTkxOiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKKy0tLQorPiAjIFJlamVjdCBpbnN0YWxsIHByb2dyYW1zIHRoYXQgY2Fubm90IGluc3RhbGwgbXVsdGlwbGUgZmlsZXMuCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgYSBCU0QtY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUgaW5zdGFsbC4uLiAiID4mNjsgfQorOTkyLDk5M2MzMjk4LDMyOTkKKzwgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfaW5zdGFsbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCis8ICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKy0tLQorPiBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgorPiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Cis5OTUsMTAwNWMzMzAxLDMzMTgKKzwgICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IjoiCis8ICAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KKzwgICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgorPCAgICAgY2FzZSAiJGFjX2Rpci8iIGluCis8ICAgICAvfC4vfC4vL3wvZXRjLyp8L3Vzci9zYmluLyp8L3Vzci9ldGMvKnwvc2Jpbi8qfC91c3IvYWZzd3MvYmluLyp8L3Vzci91Y2IvKikgOzsKKzwgICAgICopCis8ICAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCis8ICAgICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAorPCAgICAgICAjIGJ5IGRlZmF1bHQuCis8ICAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KKzwgICAgICAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3Byb2c7IHRoZW4KKy0tLQorPiAgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKKz4gZm9yIGFzX2RpciBpbiAkUEFUSAorPiBkbworPiAgIElGUz0kYXNfc2F2ZV9JRlMKKz4gICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorPiAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgorPiBjYXNlICRhc19kaXIvIGluCis+ICAgLi8gfCAuLy8gfCAvY0MvKiB8IFwKKz4gICAvZXRjLyogfCAvdXNyL3NiaW4vKiB8IC91c3IvZXRjLyogfCAvc2Jpbi8qIHwgL3Vzci9hZnN3cy9iaW4vKiB8IFwKKz4gICA/OlxcL29zMlxcL2luc3RhbGxcXC8qIHwgPzpcXC9PUzJcXC9JTlNUQUxMXFwvKiB8IFwKKz4gICAvdXNyL3VjYi8qICkgOzsKKz4gICAqKQorPiAgICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KKz4gICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAorPiAgICAgIyBieSBkZWZhdWx0LgorPiAgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbworPiAgICAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKz4gCWlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCI7IH07IHRoZW4KKzEwMDdjMzMyMAorPCAgICAgICAgICAgICBncmVwIGRzcG1zZyAkYWNfZGlyLyRhY19wcm9nID4vZGV2L251bGwgMj4mMTsgdGhlbgorLS0tCis+IAkgICAgZ3JlcCBkc3Btc2cgIiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiID4vZGV2L251bGwgMj4mMTsgdGhlbgorMTAwOWEzMzIzLDMzMjYKKz4gCSAgZWxpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgorPiAJICAgIGdyZXAgcHdwbHVzICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKz4gCSAgICAjIHByb2dyYW0tc3BlY2lmaWMgaW5zdGFsbCBzY3JpcHQgdXNlZCBieSBIUCBwd3BsdXMtLWRvbid0IHVzZS4KKz4gCSAgICA6CisxMDExLDEwMTJjMzMyOCwzMzM5Cis8IAkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYWNfZGlyLyRhY19wcm9nIC1jIgorPCAJICAgIGJyZWFrIDIKKy0tLQorPiAJICAgIHJtIC1yZiBjb25mdGVzdC5vbmUgY29uZnRlc3QudHdvIGNvbmZ0ZXN0LmRpcgorPiAJICAgIGVjaG8gb25lID4gY29uZnRlc3Qub25lCis+IAkgICAgZWNobyB0d28gPiBjb25mdGVzdC50d28KKz4gCSAgICBta2RpciBjb25mdGVzdC5kaXIKKz4gCSAgICBpZiAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgLWMgY29uZnRlc3Qub25lIGNvbmZ0ZXN0LnR3byAiYHB3ZGAvY29uZnRlc3QuZGlyIiAmJgorPiAJICAgICAgdGVzdCAtcyBjb25mdGVzdC5vbmUgJiYgdGVzdCAtcyBjb25mdGVzdC50d28gJiYKKz4gCSAgICAgIHRlc3QgLXMgY29uZnRlc3QuZGlyL2NvbmZ0ZXN0Lm9uZSAmJgorPiAJICAgICAgdGVzdCAtcyBjb25mdGVzdC5kaXIvY29uZnRlc3QudHdvCis+IAkgICAgdGhlbgorPiAJICAgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IC1jIgorPiAJICAgICAgYnJlYWsgMworPiAJICAgIGZpCisxMDE2LDEwMTljMzM0MywzMzUwCis8ICAgICAgIDs7Cis8ICAgICBlc2FjCis8ICAgZG9uZQorPCAgIElGUz0iJGFjX3NhdmVfSUZTIgorLS0tCis+ICAgICBkb25lCis+ICAgICA7OworPiBlc2FjCis+IAorPiBkb25lCis+IElGUz0kYXNfc2F2ZV9JRlMKKz4gCis+IHJtIC1yZiBjb25mdGVzdC5vbmUgY29uZnRlc3QudHdvIGNvbmZ0ZXN0LmRpcgorMTAyM2MzMzU0Cis8ICAgICBJTlNUQUxMPSIkYWNfY3ZfcGF0aF9pbnN0YWxsIgorLS0tCis+ICAgICBJTlNUQUxMPSRhY19jdl9wYXRoX2luc3RhbGwKKzEwMjUsMTAyNmMzMzU2LDMzNTcKKzwgICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKKzwgICAgICMgcGF0aCBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAorLS0tCis+ICAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBEb24ndCBjYWNoZSBhCis+ICAgICAjIHZhbHVlIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCisxMDI4LDEwMjljMzM1OSwzMzYwCis8ICAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgorPCAgICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCistLS0KKz4gICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHZhbHVlIGlzIGEgcmVsYXRpdmUgbmFtZS4KKz4gICAgIElOU1RBTEw9JGFjX2luc3RhbGxfc2gKKzEwMzJjMzM2MywzMzY0Cis8IGVjaG8gIiRhY190IiIkSU5TVEFMTCIgMT4mNgorLS0tCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRJTlNUQUxMIiA+JjUKKz4gJGFzX2VjaG8gIiRJTlNUQUxMIiA+JjY7IH0KKzEwMzhjMzM3MAorPCB0ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTExfUFJPR1JBTX0nCistLS0KKz4gdGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMfScKKzEwNTQsMTA1N2MzMzg2LDMzODkKKzwgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKKzwgZWNobyAiY29uZmlndXJlOjEwNTY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Cis8IGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1NUUklQJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKzwgICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorLS0tCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorPiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KKz4gaWYgdGVzdCAiJHthY19jdl9wcm9nX1NUUklQK3NldH0iID0gc2V0OyB0aGVuCis+ICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKzEwNjIsMTA3MWMzMzk0LDM0MDgKKzwgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgorPCAgIGFjX2R1bW15PSIkUEFUSCIKKzwgICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KKzwgICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCis8ICAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KKzwgICAgICAgYWNfY3ZfcHJvZ19TVFJJUD0ic3RyaXAiCis8ICAgICAgIGJyZWFrCis8ICAgICBmaQorPCAgIGRvbmUKKzwgICBJRlM9IiRhY19zYXZlX2lmcyIKKy0tLQorPiBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCis+IGZvciBhc19kaXIgaW4gJFBBVEgKKz4gZG8KKz4gICBJRlM9JGFzX3NhdmVfSUZTCis+ICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKz4gICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKz4gICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCis+ICAgICBhY19jdl9wcm9nX1NUUklQPSJzdHJpcCIKKz4gICAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Cis+ICAgICBicmVhayAyCis+ICAgZmkKKz4gZG9uZQorPiBkb25lCis+IElGUz0kYXNfc2F2ZV9JRlMKKz4gCisxMDc1YzM0MTIKKzwgU1RSSVA9IiRhY19jdl9wcm9nX1NUUklQIgorLS0tCis+IFNUUklQPSRhY19jdl9wcm9nX1NUUklQCisxMDc3YzM0MTQsMzQxNQorPCAgIGVjaG8gIiRhY190IiIkU1RSSVAiIDE+JjYKKy0tLQorPiAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRTVFJJUCIgPiY1Cis+ICRhc19lY2hvICIkU1RSSVAiID4mNjsgfQorMTA3OWMzNDE3LDM0MTgKKzwgICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKy0tLQorPiAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKKz4gJGFzX2VjaG8gIm5vIiA+JjY7IH0KKzEwODJhMzQyMgorPiAKKzEwODVjMzQyNQorPCAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KKy0tLQorPiAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorMTA4NywxMDkwYzM0MjcsMzQzMAorPCBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6MTA4OTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKzwgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfVV9NQUtFJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKzwgICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorLS0tCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorPiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KKz4gaWYgdGVzdCAiJHthY19jdl9wYXRoX1VfTUFLRStzZXR9IiA9IHNldDsgdGhlbgorPiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisxMDkyLDEwOTNjMzQzMiwzNDMzCis8ICAgY2FzZSAiJFVfTUFLRSIgaW4KKzwgICAvKikKKy0tLQorPiAgIGNhc2UgJFVfTUFLRSBpbgorPiAgIFtcXC9dKiB8ID86W1xcL10qKQorMTA5NiwxMDk4ZDM0MzUKKzwgICA/Oi8qKQkJCSAKKzwgICBhY19jdl9wYXRoX1VfTUFLRT0iJFVfTUFLRSIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgorPCAgIDs7CisxMTAwLDExMDljMzQzNywzNDUxCis8ICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKzwgICBhY19kdW1teT0iJFBBVEgiCis8ICAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvIAorPCAgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKzwgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorPCAgICAgICBhY19jdl9wYXRoX1VfTUFLRT0iJGFjX2Rpci8kYWNfd29yZCIKKzwgICAgICAgYnJlYWsKKzwgICAgIGZpCis8ICAgZG9uZQorPCAgIElGUz0iJGFjX3NhdmVfaWZzIgorLS0tCis+ICAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorPiBmb3IgYXNfZGlyIGluICRQQVRICis+IGRvCis+ICAgSUZTPSRhc19zYXZlX0lGUworPiAgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCis+ICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCis+ICAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorPiAgICAgYWNfY3ZfcGF0aF9VX01BS0U9IiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiCis+ICAgICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorPiAgICAgYnJlYWsgMgorPiAgIGZpCis+IGRvbmUKKz4gZG9uZQorPiBJRlM9JGFzX3NhdmVfSUZTCis+IAorMTExM2MzNDU1Cis8IFVfTUFLRT0iJGFjX2N2X3BhdGhfVV9NQUtFIgorLS0tCis+IFVfTUFLRT0kYWNfY3ZfcGF0aF9VX01BS0UKKzExMTVjMzQ1NywzNDU4Cis8ICAgZWNobyAiJGFjX3QiIiRVX01BS0UiIDE+JjYKKy0tLQorPiAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRVX01BS0UiID4mNQorPiAkYXNfZWNobyAiJFVfTUFLRSIgPiY2OyB9CisxMTE3YzM0NjAsMzQ2MQorPCAgIGVjaG8gIiRhY190IiJubyIgMT4mNgorLS0tCis+ICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorPiAkYXNfZWNobyAibm8iID4mNjsgfQorMTEyMGMzNDY0LDM0NjUKKzwgdGVzdCAtbiAiJFVfTUFLRSIgJiYgYnJlYWsKKy0tLQorPiAKKz4gICB0ZXN0IC1uICIkVV9NQUtFIiAmJiBicmVhaworMTEyOCwxMTMxYzM0NzMsMzQ3NgorPCBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6MTEzMDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKzwgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfRE9YWUdFTicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCis8ICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKy0tLQorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Cis+IGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9ET1hZR0VOK3NldH0iID0gc2V0OyB0aGVuCis+ICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKzExMzMsMTEzNGMzNDc4LDM0NzkKKzwgICBjYXNlICIkRE9YWUdFTiIgaW4KKzwgICAvKikKKy0tLQorPiAgIGNhc2UgJERPWFlHRU4gaW4KKz4gICBbXFwvXSogfCA/OltcXC9dKikKKzExMzcsMTEzOWQzNDgxCis8ICAgPzovKikJCQkgCis8ICAgYWNfY3ZfcGF0aF9ET1hZR0VOPSIkRE9YWUdFTiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgorPCAgIDs7CisxMTQxLDExNTBjMzQ4MywzNDk4Cis8ICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKzwgICBhY19kdW1teT0iJFBBVEg6L3Vzci9sb2NhbC9iaW46L3Vzci9iaW4iCis8ICAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvIAorPCAgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKzwgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorPCAgICAgICBhY19jdl9wYXRoX0RPWFlHRU49IiRhY19kaXIvJGFjX3dvcmQiCis8ICAgICAgIGJyZWFrCis8ICAgICBmaQorPCAgIGRvbmUKKzwgICBJRlM9IiRhY19zYXZlX2lmcyIKKy0tLQorPiAgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKKz4gYXNfZHVtbXk9IiRQQVRIOi91c3IvbG9jYWwvYmluOi91c3IvYmluIgorPiBmb3IgYXNfZGlyIGluICRhc19kdW1teQorPiBkbworPiAgIElGUz0kYXNfc2F2ZV9JRlMKKz4gICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorPiAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworPiAgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKz4gICAgIGFjX2N2X3BhdGhfRE9YWUdFTj0iJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIKKz4gICAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Cis+ICAgICBicmVhayAyCis+ICAgZmkKKz4gZG9uZQorPiBkb25lCis+IElGUz0kYXNfc2F2ZV9JRlMKKz4gCisxMTU0YzM1MDIKKzwgRE9YWUdFTj0iJGFjX2N2X3BhdGhfRE9YWUdFTiIKKy0tLQorPiBET1hZR0VOPSRhY19jdl9wYXRoX0RPWFlHRU4KKzExNTZjMzUwNCwzNTA1Cis8ICAgZWNobyAiJGFjX3QiIiRET1hZR0VOIiAxPiY2CistLS0KKz4gICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkRE9YWUdFTiIgPiY1Cis+ICRhc19lY2hvICIkRE9YWUdFTiIgPiY2OyB9CisxMTU4YzM1MDcsMzUwOAorPCAgIGVjaG8gIiRhY190IiJubyIgMT4mNgorLS0tCis+ICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorPiAkYXNfZWNobyAibm8iID4mNjsgfQorMTE2NCwxMTgwYzM1MTQsMzU0MworPCBpZiAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Cis8IGVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IHJ1biAkYWNfY29uZmlnX3N1YiIgMT4mMjsgZXhpdCAxOyB9Cis8IGZpCis8IAorPCBlY2hvICRhY19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKKzwgZWNobyAiY29uZmlndXJlOjExNzA6IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQorPCAKKzwgaG9zdF9hbGlhcz0kaG9zdAorPCBjYXNlICIkaG9zdF9hbGlhcyIgaW4KKzwgTk9ORSkKKzwgICBjYXNlICRub25vcHQgaW4KKzwgICBOT05FKQorPCAgICAgaWYgaG9zdF9hbGlhcz1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19ndWVzc2A7IHRoZW4gOgorPCAgICAgZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZ3Vlc3MgaG9zdCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgMT4mMjsgZXhpdCAxOyB9Cis8ICAgICBmaSA7OworPCAgICopIGhvc3RfYWxpYXM9JG5vbm9wdCA7OworPCAgIGVzYWMgOzsKKy0tLQorPiAkU0hFTEwgIiRhY19hdXhfZGlyL2NvbmZpZy5zdWIiIHN1bjQgPi9kZXYvbnVsbCAyPiYxIHx8Cis+ICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBydW4gJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIiID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IHJ1biAkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgPiYyO30KKz4gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Cis+IAorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQorPiAkYXNfZWNob19uICJjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZS4uLiAiID4mNjsgfQorPiBpZiB0ZXN0ICIke2FjX2N2X2J1aWxkK3NldH0iID0gc2V0OyB0aGVuCis+ICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKz4gZWxzZQorPiAgIGFjX2J1aWxkX2FsaWFzPSRidWlsZF9hbGlhcworPiB0ZXN0ICJ4JGFjX2J1aWxkX2FsaWFzIiA9IHggJiYKKz4gICBhY19idWlsZF9hbGlhcz1gJFNIRUxMICIkYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MiYAorPiB0ZXN0ICJ4JGFjX2J1aWxkX2FsaWFzIiA9IHggJiYKKz4gICB7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGd1ZXNzIGJ1aWxkIHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBndWVzcyBidWlsZCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgPiYyO30KKz4gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Cis+IGFjX2N2X2J1aWxkPWAkU0hFTEwgIiRhY19hdXhfZGlyL2NvbmZpZy5zdWIiICRhY19idWlsZF9hbGlhc2AgfHwKKz4gICB7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIgJGFjX2J1aWxkX2FsaWFzIGZhaWxlZCIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiAkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiAkYWNfYnVpbGRfYWxpYXMgZmFpbGVkIiA+JjI7fQorPiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKz4gCis+IGZpCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9idWlsZCIgPiY1Cis+ICRhc19lY2hvICIkYWNfY3ZfYnVpbGQiID4mNjsgfQorPiBjYXNlICRhY19jdl9idWlsZCBpbgorPiAqLSotKikgOzsKKz4gKikgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGludmFsaWQgdmFsdWUgb2YgY2Fub25pY2FsIGJ1aWxkIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgdmFsdWUgb2YgY2Fub25pY2FsIGJ1aWxkIiA+JjI7fQorPiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07OworMTE4MiwxMjE2YzM1NDUsMzU3MAorPCAKKzwgaG9zdD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGhvc3RfYWxpYXNgCis8IGhvc3RfY3B1PWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKKzwgaG9zdF92ZW5kb3I9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAorPCBob3N0X29zPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKKzwgZWNobyAiJGFjX3QiIiRob3N0IiAxPiY2Cis8IAorPCBlY2hvICRhY19uICJjaGVja2luZyBmb3IgQ3lnd2luIGVudmlyb25tZW50IiIuLi4gJGFjX2MiIDE+JjYKKzwgZWNobyAiY29uZmlndXJlOjExOTE6IGNoZWNraW5nIGZvciBDeWd3aW4gZW52aXJvbm1lbnQiID4mNQorPCBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY3lnd2luJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKzwgICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorPCBlbHNlCis8ICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorPCAjbGluZSAxMTk2ICJjb25maWd1cmUiCis8ICNpbmNsdWRlICJjb25mZGVmcy5oIgorPCAKKzwgaW50IG1haW4oKSB7Cis8IAorPCAjaWZuZGVmIF9fQ1lHV0lOX18KKzwgI2RlZmluZSBfX0NZR1dJTl9fIF9fQ1lHV0lOMzJfXworPCAjZW5kaWYKKzwgcmV0dXJuIF9fQ1lHV0lOX187Cis8IDsgcmV0dXJuIDA7IH0KKzwgRU9GCis8IGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTIwNzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzwgICBhY19jdl9jeWd3aW49eWVzCis8IGVsc2UKKzwgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPCAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzwgICBhY19jdl9jeWd3aW49bm8KKzwgZmkKKzwgcm0gLWYgY29uZnRlc3QqCis8IHJtIC1mIGNvbmZ0ZXN0KgorLS0tCis+IGJ1aWxkPSRhY19jdl9idWlsZAorPiBhY19zYXZlX0lGUz0kSUZTOyBJRlM9Jy0nCis+IHNldCB4ICRhY19jdl9idWlsZAorPiBzaGlmdAorPiBidWlsZF9jcHU9JDEKKz4gYnVpbGRfdmVuZG9yPSQyCis+IHNoaWZ0OyBzaGlmdAorPiAjIFJlbWVtYmVyLCB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIElGUyBpcyB1c2VkIHRvIGNyZWF0ZSAkKiwKKz4gIyBleGNlcHQgd2l0aCBvbGQgc2hlbGxzOgorPiBidWlsZF9vcz0kKgorPiBJRlM9JGFjX3NhdmVfSUZTCis+IGNhc2UgJGJ1aWxkX29zIGluICpcICopIGJ1aWxkX29zPWBlY2hvICIkYnVpbGRfb3MiIHwgc2VkICdzLyAvLS9nJ2A7OyBlc2FjCis+IAorPiAKKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQorPiAkYXNfZWNob19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlLi4uICIgPiY2OyB9Cis+IGlmIHRlc3QgIiR7YWNfY3ZfaG9zdCtzZXR9IiA9IHNldDsgdGhlbgorPiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Cis+IGVsc2UKKz4gICBpZiB0ZXN0ICJ4JGhvc3RfYWxpYXMiID0geDsgdGhlbgorPiAgIGFjX2N2X2hvc3Q9JGFjX2N2X2J1aWxkCis+IGVsc2UKKz4gICBhY19jdl9ob3N0PWAkU0hFTEwgIiRhY19hdXhfZGlyL2NvbmZpZy5zdWIiICRob3N0X2FsaWFzYCB8fAorPiAgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6ICRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViICRob3N0X2FsaWFzIGZhaWxlZCIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiAkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiAkaG9zdF9hbGlhcyBmYWlsZWQiID4mMjt9Cis+ICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorMTIxOSwxMjQ1ZDM1NzIKKzwgZWNobyAiJGFjX3QiIiRhY19jdl9jeWd3aW4iIDE+JjYKKzwgQ1lHV0lOPQorPCB0ZXN0ICIkYWNfY3ZfY3lnd2luIiA9IHllcyAmJiBDWUdXSU49eWVzCis8IGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBtaW5ndzMyIGVudmlyb25tZW50IiIuLi4gJGFjX2MiIDE+JjYKKzwgZWNobyAiY29uZmlndXJlOjEyMjQ6IGNoZWNraW5nIGZvciBtaW5ndzMyIGVudmlyb25tZW50IiA+JjUKKzwgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X21pbmd3MzInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorPCAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Cis8IGVsc2UKKzwgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCis8ICNsaW5lIDEyMjkgImNvbmZpZ3VyZSIKKzwgI2luY2x1ZGUgImNvbmZkZWZzLmgiCis8IAorPCBpbnQgbWFpbigpIHsKKzwgcmV0dXJuIF9fTUlOR1czMl9fOworPCA7IHJldHVybiAwOyB9Cis8IEVPRgorPCBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEyMzY6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKzwgICBybSAtcmYgY29uZnRlc3QqCis8ICAgYWNfY3ZfbWluZ3czMj15ZXMKKzwgZWxzZQorPCAgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis8ICAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Cis8ICAgcm0gLXJmIGNvbmZ0ZXN0KgorPCAgIGFjX2N2X21pbmd3MzI9bm8KKzwgZmkKKzwgcm0gLWYgY29uZnRlc3QqCis8IHJtIC1mIGNvbmZ0ZXN0KgorMTI0NmEzNTc0LDM1OTMKKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2hvc3QiID4mNQorPiAkYXNfZWNobyAiJGFjX2N2X2hvc3QiID4mNjsgfQorPiBjYXNlICRhY19jdl9ob3N0IGluCis+ICotKi0qKSA7OworPiAqKSB7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogaW52YWxpZCB2YWx1ZSBvZiBjYW5vbmljYWwgaG9zdCIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIHZhbHVlIG9mIGNhbm9uaWNhbCBob3N0IiA+JjI7fQorPiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07OworPiBlc2FjCis+IGhvc3Q9JGFjX2N2X2hvc3QKKz4gYWNfc2F2ZV9JRlM9JElGUzsgSUZTPSctJworPiBzZXQgeCAkYWNfY3ZfaG9zdAorPiBzaGlmdAorPiBob3N0X2NwdT0kMQorPiBob3N0X3ZlbmRvcj0kMgorPiBzaGlmdDsgc2hpZnQKKz4gIyBSZW1lbWJlciwgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBJRlMgaXMgdXNlZCB0byBjcmVhdGUgJCosCis+ICMgZXhjZXB0IHdpdGggb2xkIHNoZWxsczoKKz4gaG9zdF9vcz0kKgorPiBJRlM9JGFjX3NhdmVfSUZTCis+IGNhc2UgJGhvc3Rfb3MgaW4gKlwgKikgaG9zdF9vcz1gZWNobyAiJGhvc3Rfb3MiIHwgc2VkICdzLyAvLS9nJ2A7OyBlc2FjCisxMjQ4LDEyNzdkMzU5NAorPCBlY2hvICIkYWNfdCIiJGFjX2N2X21pbmd3MzIiIDE+JjYKKzwgTUlOR1czMj0KKzwgdGVzdCAiJGFjX2N2X21pbmd3MzIiID0geWVzICYmIE1JTkdXMzI9eWVzCis8IAorPCAKKzwgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiIuLi4gJGFjX2MiIDE+JjYKKzwgZWNobyAiY29uZmlndXJlOjEyNTU6IGNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIgPiY1Cis8IGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9leGVleHQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorPCAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Cis8IGVsc2UKKzwgICBpZiB0ZXN0ICIkQ1lHV0lOIiA9IHllcyB8fCB0ZXN0ICIkTUlOR1czMiIgPSB5ZXM7IHRoZW4KKzwgICBhY19jdl9leGVleHQ9LmV4ZQorPCBlbHNlCis8ICAgcm0gLWYgY29uZnRlc3QqCis8ICAgZWNobyAnaW50IG1haW4gKCkgeyByZXR1cm4gMDsgfScgPiBjb25mdGVzdC4kYWNfZXh0Cis8ICAgYWNfY3ZfZXhlZXh0PQorPCAgIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTI2NTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfTsgdGhlbgorPCAgICAgZm9yIGZpbGUgaW4gY29uZnRlc3QuKjsgZG8KKzwgICAgICAgY2FzZSAkZmlsZSBpbgorPCAgICAgICAqLmMgfCAqLm8gfCAqLm9iaikgOzsKKzwgICAgICAgKikgYWNfY3ZfZXhlZXh0PWBlY2hvICRmaWxlIHwgc2VkIC1lIHMvY29uZnRlc3QvL2AgOzsKKzwgICAgICAgZXNhYworPCAgICAgZG9uZQorPCAgIGVsc2UKKzwgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQorPCAgIGZpCis8ICAgcm0gLWYgY29uZnRlc3QqCis8ICAgdGVzdCB4IiR7YWNfY3ZfZXhlZXh0fSIgPSB4ICYmIGFjX2N2X2V4ZWV4dD1ubworPCBmaQorPCBmaQorMTI3OSwxMjgyZDM1OTUKKzwgRVhFRVhUPSIiCis8IHRlc3QgeCIke2FjX2N2X2V4ZWV4dH0iICE9IHhubyAmJiBFWEVFWFQ9JHthY19jdl9leGVleHR9Cis8IGVjaG8gIiRhY190IiIke2FjX2N2X2V4ZWV4dH0iIDE+JjYKKzwgYWNfZXhlZXh0PSRFWEVFWFQKKzEyODYsMTI4OGMzNTk5LDM2MDEKKzwgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgc3RyaWN0IGNvbXBpbGluZyBpcyBvbiIiLi4uICRhY19jIiAxPiY2Cis8IGVjaG8gImNvbmZpZ3VyZToxMjg4OiBjaGVja2luZyB3aGV0aGVyIHN0cmljdCBjb21waWxpbmcgaXMgb24iID4mNQorPCAgICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXN0cmljdCBvciAtLWRpc2FibGUtc3RyaWN0IHdhcyBnaXZlbi4KKy0tLQorPiAgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgc3RyaWN0IGNvbXBpbGluZyBpcyBvbiIgPiY1Cis+ICRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgc3RyaWN0IGNvbXBpbGluZyBpcyBvbi4uLiAiID4mNjsgfQorPiAgICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXN0cmljdCB3YXMgZ2l2ZW4uCisxMjkwLDEyOTFjMzYwMworPCAgIGVuYWJsZXZhbD0iJGVuYWJsZV9zdHJpY3QiCis8ICAgCistLS0KKz4gICBlbmFibGV2YWw9JGVuYWJsZV9zdHJpY3Q7CisxMjk4YzM2MTAKKzwgICAgICAgCistLS0KKz4gCisxMzAzYzM2MTUsMzYxNgorPCAgICAgZWNobyAiJGFjX3QiIiRhY191c2Vfc3RyaWN0X29wdGlvbnMiIDE+JjYKKy0tLQorPiAgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3VzZV9zdHJpY3Rfb3B0aW9ucyIgPiY1Cis+ICRhc19lY2hvICIkYWNfdXNlX3N0cmljdF9vcHRpb25zIiA+JjY7IH0KKzEzNDNjMzY1NiwzNjU3Cis8ICAgICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtNjRiaXQtbGlicyBvciAtLWRpc2FibGUtNjRiaXQtbGlicyB3YXMgZ2l2ZW4uCistLS0KKz4gCis+ICAgICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtNjRiaXQtbGlicyB3YXMgZ2l2ZW4uCisxMzQ1LDEzNDZjMzY1OQorPCAgIGVuYWJsZXZhbD0iJGVuYWJsZV82NGJpdF9saWJzIgorPCAgIEVOQUJMRV82NEJJVF9MSUJTPSR7ZW5hYmxldmFsfQorLS0tCis+ICAgZW5hYmxldmFsPSRlbmFibGVfNjRiaXRfbGliczsgRU5BQkxFXzY0QklUX0xJQlM9JHtlbmFibGV2YWx9CisxMzQ5YzM2NjIKKzwgICAgIAorLS0tCis+IAorMTM1MiwxMzUzYzM2NjUsMzY2NgorPCAgICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciA2NC1iaXQgZXhlY3V0YWJsZSBzdXBwb3J0IiIuLi4gJGFjX2MiIDE+JjYKKzwgZWNobyAiY29uZmlndXJlOjEzNTQ6IGNoZWNraW5nIGZvciA2NC1iaXQgZXhlY3V0YWJsZSBzdXBwb3J0IiA+JjUKKy0tLQorPiAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgNjQtYml0IGV4ZWN1dGFibGUgc3VwcG9ydCIgPiY1Cis+ICRhc19lY2hvX24gImNoZWNraW5nIGZvciA2NC1iaXQgZXhlY3V0YWJsZSBzdXBwb3J0Li4uICIgPiY2OyB9CisxNDA4YzM3MjEKKzwgICAgICAgICAgICAgaWYgdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IG5vOyB0aGVuCistLS0KKz4gICAgICAgICAgICAgaWYgdGVzdCAiJGFjX2N2X2NfY29tcGlsZXJfZ251IiA9IG5vOyB0aGVuCisxNDIwLDE0MjJjMzczMywzNzM4Cis8ICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorPCAjbGluZSAxNDIyICJjb25maWd1cmUiCis8ICNpbmNsdWRlICJjb25mZGVmcy5oIgorLS0tCis+ICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGNvbmZkZWZzLmguICAqLworPiBfQUNFT0YKKz4gY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Cis+IGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogZW5kIGNvbmZkZWZzLmguICAqLworMTQyNCwxNDI2YzM3NDAsMzc2MgorPCBFT0YKKzwgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDI2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCis8IHRoZW4KKy0tLQorPiBfQUNFT0YKKz4gcm0gLWYgY29uZnRlc3QkYWNfZXhlZXh0Cis+IGlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2xpbmsiKSAyPiY1Cis+ICAgYWNfc3RhdHVzPSQ/Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCis+ICAgeyAoY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfdHJ5IikgMj4mNQorPiAgIGFjX3N0YXR1cz0kPworPiAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cis+ICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKzE0MjksMTQzMmMzNzY1LDM3NzAKKzwgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPCAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorPCAgIHJtIC1mciBjb25mdGVzdCoKKzwgICBFTkFCTEVfNjRCSVRfTElCUz1ubworLS0tCis+ICAgJGFzX2VjaG8gIiRhc19tZTogcHJvZ3JhbSBleGl0ZWQgd2l0aCBzdGF0dXMgJGFjX3N0YXR1cyIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Cis+IAorPiAoIGV4aXQgJGFjX3N0YXR1cyApCis+IEVOQUJMRV82NEJJVF9MSUJTPW5vCisxNDM0YzM3NzIsMzc3MworPCBybSAtZnIgY29uZnRlc3QqCistLS0KKz4gcm0gLXJmIGNvbmZ0ZXN0LmRTWU0KKz4gcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisxNDM2YTM3NzYKKz4gCisxNDUwYzM3OTAKKzwgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0KKz4gCisxNDU4LDE0NjBjMzc5OCwzODAzCis8ICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorPCAjbGluZSAxNDYwICJjb25maWd1cmUiCis8ICNpbmNsdWRlICJjb25mZGVmcy5oIgorLS0tCis+ICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGNvbmZkZWZzLmguICAqLworPiBfQUNFT0YKKz4gY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Cis+IGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogZW5kIGNvbmZkZWZzLmguICAqLworMTQ2MiwxNDY0YzM4MDUsMzgyNworPCBFT0YKKzwgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDY0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCis8IHRoZW4KKy0tLQorPiBfQUNFT0YKKz4gcm0gLWYgY29uZnRlc3QkYWNfZXhlZXh0Cis+IGlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2xpbmsiKSAyPiY1Cis+ICAgYWNfc3RhdHVzPSQ/Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCis+ICAgeyAoY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfdHJ5IikgMj4mNQorPiAgIGFjX3N0YXR1cz0kPworPiAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cis+ICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKzE0NjcsMTQ3MGMzODMwLDM4MzUKKzwgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPCAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorPCAgIHJtIC1mciBjb25mdGVzdCoKKzwgICBFTkFCTEVfNjRCSVRfTElCUz1ubworLS0tCis+ICAgJGFzX2VjaG8gIiRhc19tZTogcHJvZ3JhbSBleGl0ZWQgd2l0aCBzdGF0dXMgJGFjX3N0YXR1cyIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Cis+IAorPiAoIGV4aXQgJGFjX3N0YXR1cyApCis+IEVOQUJMRV82NEJJVF9MSUJTPW5vCisxNDcyYzM4MzcsMzgzOAorPCBybSAtZnIgY29uZnRlc3QqCistLS0KKz4gcm0gLXJmIGNvbmZ0ZXN0LmRTWU0KKz4gcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisxNDc0YTM4NDEKKz4gCisxNDgzLDE0ODVjMzg1MCwzODU1Cis8ICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorPCAjbGluZSAxNDg1ICJjb25maWd1cmUiCis8ICNpbmNsdWRlICJjb25mZGVmcy5oIgorLS0tCis+ICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGNvbmZkZWZzLmguICAqLworPiBfQUNFT0YKKz4gY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Cis+IGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogZW5kIGNvbmZkZWZzLmguICAqLworMTQ4NywxNDg5YzM4NTcsMzg3OQorPCBFT0YKKzwgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDg5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCis8IHRoZW4KKy0tLQorPiBfQUNFT0YKKz4gcm0gLWYgY29uZnRlc3QkYWNfZXhlZXh0Cis+IGlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2xpbmsiKSAyPiY1Cis+ICAgYWNfc3RhdHVzPSQ/Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCis+ICAgeyAoY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfdHJ5IikgMj4mNQorPiAgIGFjX3N0YXR1cz0kPworPiAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cis+ICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKzE0OTIsMTQ5NWMzODgyLDM4ODcKKzwgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPCAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorPCAgIHJtIC1mciBjb25mdGVzdCoKKzwgICBFTkFCTEVfNjRCSVRfTElCUz1ubworLS0tCis+ICAgJGFzX2VjaG8gIiRhc19tZTogcHJvZ3JhbSBleGl0ZWQgd2l0aCBzdGF0dXMgJGFjX3N0YXR1cyIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Cis+IAorPiAoIGV4aXQgJGFjX3N0YXR1cyApCis+IEVOQUJMRV82NEJJVF9MSUJTPW5vCisxNDk3YzM4ODksMzg5MAorPCBybSAtZnIgY29uZnRlc3QqCistLS0KKz4gcm0gLXJmIGNvbmZ0ZXN0LmRTWU0KKz4gcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisxNDk5YTM4OTMKKz4gCisxNTExYzM5MDUsMzkwNgorPCAgICAgICAgIGVjaG8gIiRhY190IiIkRU5BQkxFXzY0QklUX0xJQlMiIDE+JjYKKy0tLQorPiAgICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRFTkFCTEVfNjRCSVRfTElCUyIgPiY1Cis+ICRhc19lY2hvICIkRU5BQkxFXzY0QklUX0xJQlMiID4mNjsgfQorMTUxNywxNTIwYzM5MTIsMzkxNQorPCAJZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hpY2ggTWFrZWZpbGUgZnJhZ21lbnQgdG8gdXNlIiIuLi4gJGFjX2MiIDE+JjYKKzwgZWNobyAiY29uZmlndXJlOjE1MTk6IGNoZWNraW5nIHdoaWNoIE1ha2VmaWxlIGZyYWdtZW50IHRvIHVzZSIgPiY1Cis8IGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydpY3VfY3ZfaG9zdF9mcmFnJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKzwgICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorLS0tCis+IAl7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hpY2ggTWFrZWZpbGUgZnJhZ21lbnQgdG8gdXNlIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hpY2ggTWFrZWZpbGUgZnJhZ21lbnQgdG8gdXNlLi4uICIgPiY2OyB9Cis+IGlmIHRlc3QgIiR7aWN1X2N2X2hvc3RfZnJhZytzZXR9IiA9IHNldDsgdGhlbgorPiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisxNTIyYzM5MTcKKzwgICAKKy0tLQorPiAKKzE1MjUsMTUyNmMzOTIwLDM5MjEKKzwgCWlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCQorPCAJCWljdV9jdl9ob3N0X2ZyYWc9bWgtc29sYXJpcy1nY2MgCistLS0KKz4gCWlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCis+IAkJaWN1X2N2X2hvc3RfZnJhZz1taC1zb2xhcmlzLWdjYworMTUzM2MzOTI4Cis8IAllbHNlICAKKy0tLQorPiAJZWxzZQorMTU4NywxNTg5ZDM5ODEKKzwgCQkKKzwgCQorPCBmaQorMTU5MWMzOTgzLDM5ODYKKzwgZWNobyAiJGFjX3QiIiRpY3VfY3ZfaG9zdF9mcmFnIiAxPiY2CistLS0KKz4gCis+IGZpCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRpY3VfY3ZfaG9zdF9mcmFnIiA+JjUKKz4gJGFzX2VjaG8gIiRpY3VfY3ZfaG9zdF9mcmFnIiA+JjY7IH0KKzE1OTUsMTU5OWMzOTkwLDM5OTMKKzwgCSotKi1ocHV4KikgCWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBmbG9vciBpbiAtbG0iIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6MTU5NzogY2hlY2tpbmcgZm9yIGZsb29yIGluIC1sbSIgPiY1Cis8IGFjX2xpYl92YXI9YGVjaG8gbSdfJ2Zsb29yIHwgc2VkICd5JS4vKy0lX19wXyUnYAorPCBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKzwgICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorLS0tCis+IAkqLSotaHB1eCopIAl7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGZsb29yIGluIC1sbSIgPiY1Cis+ICRhc19lY2hvX24gImNoZWNraW5nIGZvciBmbG9vciBpbiAtbG0uLi4gIiA+JjY7IH0KKz4gaWYgdGVzdCAiJHthY19jdl9saWJfbV9mbG9vcitzZXR9IiA9IHNldDsgdGhlbgorPiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisxNjAxYzM5OTUKKzwgICBhY19zYXZlX0xJQlM9IiRMSUJTIgorLS0tCis+ICAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworMTYwMywxNjI5YzM5OTcsNDA1NQorPCBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCis8ICNsaW5lIDE2MDUgImNvbmZpZ3VyZSIKKzwgI2luY2x1ZGUgImNvbmZkZWZzLmgiCis8IC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCis8IC8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKzwgICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCis8IGNoYXIgZmxvb3IoKTsKKzwgCis8IGludCBtYWluKCkgeworPCBmbG9vcigpCis8IDsgcmV0dXJuIDA7IH0KKzwgRU9GCis8IGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTYxNjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCis8ICAgcm0gLXJmIGNvbmZ0ZXN0KgorPCAgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCis8IGVsc2UKKzwgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPCAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzwgICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCis8IGZpCis8IHJtIC1mIGNvbmZ0ZXN0KgorPCBMSUJTPSIkYWNfc2F2ZV9MSUJTIgorPCAKKzwgZmkKKzwgaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KKzwgICBlY2hvICIkYWNfdCIieWVzIiAxPiY2CistLS0KKz4gY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGNvbmZkZWZzLmguICAqLworPiBfQUNFT0YKKz4gY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Cis+IGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogZW5kIGNvbmZkZWZzLmguICAqLworPiAKKz4gLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCis+ICAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworPiAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworPiAjaWZkZWYgX19jcGx1c3BsdXMKKz4gZXh0ZXJuICJDIgorPiAjZW5kaWYKKz4gY2hhciBmbG9vciAoKTsKKz4gaW50Cis+IG1haW4gKCkKKz4geworPiByZXR1cm4gZmxvb3IgKCk7Cis+ICAgOworPiAgIHJldHVybiAwOworPiB9Cis+IF9BQ0VPRgorPiBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorPiBpZiB7IChhY190cnk9IiRhY19saW5rIgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKz4gICBhY19zdGF0dXM9JD8KKz4gICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorPiAgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorPiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Cis+IAkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Cis+IAkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorPiAgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJiB7Cis+IAkgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgfHwKKz4gCSAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorPiAgICAgICAgfTsgdGhlbgorPiAgIGFjX2N2X2xpYl9tX2Zsb29yPXllcworPiBlbHNlCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCis+IAlhY19jdl9saWJfbV9mbG9vcj1ubworPiBmaQorPiAKKz4gcm0gLXJmIGNvbmZ0ZXN0LmRTWU0KKz4gcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKKz4gICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKz4gTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworPiBmaQorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGliX21fZmxvb3IiID4mNQorPiAkYXNfZWNobyAiJGFjX2N2X2xpYl9tX2Zsb29yIiA+JjY7IH0KKz4gaWYgdGVzdCAieCRhY19jdl9saWJfbV9mbG9vciIgPSB4IiJ5ZXM7IHRoZW4KKzE2MzEsMTYzMmQ0MDU2Cis8IGVsc2UKKzwgICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKzE2MzUsMTY2NmQ0MDU4Cis8IAkKKzwgCSopIAkJZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGZsb29yIGluIC1sbSIiLi4uICRhY19jIiAxPiY2Cis8IGVjaG8gImNvbmZpZ3VyZToxNjM4OiBjaGVja2luZyBmb3IgZmxvb3IgaW4gLWxtIiA+JjUKKzwgYWNfbGliX3Zhcj1gZWNobyBtJ18nZmxvb3IgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCis8IGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorPCAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Cis8IGVsc2UKKzwgICBhY19zYXZlX0xJQlM9IiRMSUJTIgorPCBMSUJTPSItbG0gICRMSUJTIgorPCBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCis8ICNsaW5lIDE2NDYgImNvbmZpZ3VyZSIKKzwgI2luY2x1ZGUgImNvbmZkZWZzLmgiCis8IC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCis8IC8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKzwgICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCis8IGNoYXIgZmxvb3IoKTsKKzwgCis8IGludCBtYWluKCkgeworPCBmbG9vcigpCis8IDsgcmV0dXJuIDA7IH0KKzwgRU9GCis8IGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTY1NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCis8ICAgcm0gLXJmIGNvbmZ0ZXN0KgorPCAgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCis8IGVsc2UKKzwgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPCAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzwgICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCis8IGZpCis8IHJtIC1mIGNvbmZ0ZXN0KgorPCBMSUJTPSIkYWNfc2F2ZV9MSUJTIgorMTY2OCwxNjc1YzQwNjAsNDEyOQorPCBmaQorPCBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgorPCAgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKzwgICAgIGFjX3RyX2xpYj1IQVZFX0xJQmBlY2hvIG0gfCBzZWQgLWUgJ3MvW15hLXpBLVowLTlfXS9fL2cnIFwKKzwgICAgIC1lICd5L2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6L0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaLydgCis8ICAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKzwgI2RlZmluZSAkYWNfdHJfbGliIDEKKzwgRU9GCistLS0KKz4gCSopCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgZmxvb3IgaW4gLWxtIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGZsb29yIGluIC1sbS4uLiAiID4mNjsgfQorPiBpZiB0ZXN0ICIke2FjX2N2X2xpYl9tX2Zsb29yK3NldH0iID0gc2V0OyB0aGVuCis+ICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKz4gZWxzZQorPiAgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKKz4gTElCUz0iLWxtICAkTElCUyIKKz4gY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGNvbmZkZWZzLmguICAqLworPiBfQUNFT0YKKz4gY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Cis+IGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogZW5kIGNvbmZkZWZzLmguICAqLworPiAKKz4gLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCis+ICAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworPiAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworPiAjaWZkZWYgX19jcGx1c3BsdXMKKz4gZXh0ZXJuICJDIgorPiAjZW5kaWYKKz4gY2hhciBmbG9vciAoKTsKKz4gaW50Cis+IG1haW4gKCkKKz4geworPiByZXR1cm4gZmxvb3IgKCk7Cis+ICAgOworPiAgIHJldHVybiAwOworPiB9Cis+IF9BQ0VPRgorPiBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorPiBpZiB7IChhY190cnk9IiRhY19saW5rIgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKz4gICBhY19zdGF0dXM9JD8KKz4gICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorPiAgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorPiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Cis+IAkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Cis+IAkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorPiAgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJiB7Cis+IAkgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgfHwKKz4gCSAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorPiAgICAgICAgfTsgdGhlbgorPiAgIGFjX2N2X2xpYl9tX2Zsb29yPXllcworPiBlbHNlCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCis+IAlhY19jdl9saWJfbV9mbG9vcj1ubworPiBmaQorPiAKKz4gcm0gLXJmIGNvbmZ0ZXN0LmRTWU0KKz4gcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKKz4gICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKz4gTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworPiBmaQorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGliX21fZmxvb3IiID4mNQorPiAkYXNfZWNobyAiJGFjX2N2X2xpYl9tX2Zsb29yIiA+JjY7IH0KKz4gaWYgdGVzdCAieCRhY19jdl9saWJfbV9mbG9vciIgPSB4IiJ5ZXM7IHRoZW4KKz4gICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCis+ICNkZWZpbmUgSEFWRV9MSUJNIDEKKz4gX0FDRU9GCisxNjc5LDE2ODBkNDEzMgorPCBlbHNlCis8ICAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CisxNjgyYzQxMzQKKzwgIAorLS0tCis+IAorMTY4NywxNjg4YzQxMzksNDE0MAorPCBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMiIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6MTY4OTogY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzIiA+JjUKKy0tLQorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLi4uICIgPiY2OyB9CisxNjkwYzQxNDIKKzwgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNoYXJlZCBvciAtLWRpc2FibGUtc2hhcmVkIHdhcyBnaXZlbi4KKy0tLQorPiAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2hhcmVkIHdhcyBnaXZlbi4KKzE2OTIsMTY5M2M0MTQ0Cis8ICAgZW5hYmxldmFsPSIkZW5hYmxlX3NoYXJlZCIKKzwgICAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorLS0tCis+ICAgZW5hYmxldmFsPSRlbmFibGVfc2hhcmVkOyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorMTcwM2M0MTU0LDQxNTUKKzwgZWNobyAiJGFjX3QiIiRlbmFibGVkIiAxPiY2CistLS0KKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGVuYWJsZWQiID4mNQorPiAkYXNfZWNobyAiJGVuYWJsZWQiID4mNjsgfQorMTcwNiwxNzA3YzQxNTgsNDE1OQorPCBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMiIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6MTcwODogY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzIiA+JjUKKy0tLQorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzLi4uICIgPiY2OyB9CisxNzA5YzQxNjEKKzwgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXN0YXRpYyBvciAtLWRpc2FibGUtc3RhdGljIHdhcyBnaXZlbi4KKy0tLQorPiAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc3RhdGljIHdhcyBnaXZlbi4KKzE3MTEsMTcxMmM0MTYzCis8ICAgZW5hYmxldmFsPSIkZW5hYmxlX3N0YXRpYyIKKzwgICAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorLS0tCis+ICAgZW5hYmxldmFsPSRlbmFibGVfc3RhdGljOyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorMTcxOWM0MTcwLDQxNzEKKzwgZWNobyAiJGFjX3QiIiRlbmFibGVkIiAxPiY2CistLS0KKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGVuYWJsZWQiID4mNQorPiAkYXNfZWNobyAiJGVuYWJsZWQiID4mNjsgfQorMTcyMiwxNzIzYzQxNzQsNDE3NQorPCBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIGRlYnVnIGxpYnJhcmllcyIiLi4uICRhY19jIiAxPiY2Cis8IGVjaG8gImNvbmZpZ3VyZToxNzI0OiBjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIGRlYnVnIGxpYnJhcmllcyIgPiY1CistLS0KKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgZGVidWcgbGlicmFyaWVzIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBkZWJ1ZyBsaWJyYXJpZXMuLi4gIiA+JjY7IH0KKzE3MjZjNDE3OAorPCAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZGVidWcgb3IgLS1kaXNhYmxlLWRlYnVnIHdhcyBnaXZlbi4KKy0tLQorPiAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZGVidWcgd2FzIGdpdmVuLgorMTcyOCwxNzI5YzQxODAKKzwgICBlbmFibGV2YWw9IiRlbmFibGVfZGVidWciCis8ICAgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKy0tLQorPiAgIGVuYWJsZXZhbD0kZW5hYmxlX2RlYnVnOyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorMTczNWM0MTg2LDQxODcKKzwgZWNobyAiJGFjX3QiIiRlbmFibGVkIiAxPiY2CistLS0KKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGVuYWJsZWQiID4mNQorPiAkYXNfZWNobyAiJGVuYWJsZWQiID4mNjsgfQorMTczOCwxNzM5YzQxOTAsNDE5MQorPCBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHJlbGVhc2UgbGlicmFyaWVzIiIuLi4gJGFjX2MiIDE+JjYKKzwgZWNobyAiY29uZmlndXJlOjE3NDA6IGNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgcmVsZWFzZSBsaWJyYXJpZXMiID4mNQorLS0tCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHJlbGVhc2UgbGlicmFyaWVzIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCByZWxlYXNlIGxpYnJhcmllcy4uLiAiID4mNjsgfQorMTc0MmM0MTk0Cis8ICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1yZWxlYXNlIG9yIC0tZGlzYWJsZS1yZWxlYXNlIHdhcyBnaXZlbi4KKy0tLQorPiAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtcmVsZWFzZSB3YXMgZ2l2ZW4uCisxNzQ0LDE3NDVjNDE5NgorPCAgIGVuYWJsZXZhbD0iJGVuYWJsZV9yZWxlYXNlIgorPCAgICBjYXNlICIke2VuYWJsZXZhbH0iIGluCistLS0KKz4gICBlbmFibGV2YWw9JGVuYWJsZV9yZWxlYXNlOyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorMTc1MWM0MjAyLDQyMDMKKzwgZWNobyAiJGFjX3QiIiRlbmFibGVkIiAxPiY2CistLS0KKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGVuYWJsZWQiID4mNQorPiAkYXNfZWNobyAiJGVuYWJsZWQiID4mNjsgfQorMTc1NCwxNzU5YzQyMDYsNDIxMgorPCAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCis8IHNldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKKzwgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKKzwgZWNobyAiY29uZmlndXJlOjE3NTg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Cis8IGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCis8ICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKy0tLQorPiBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCis+ICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fXJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCis+IHNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fXJhbmxpYjsgYWNfd29yZD0kMgorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9Cis+IGlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19SQU5MSUIrc2V0fSIgPSBzZXQ7IHRoZW4KKz4gICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorMTc2NCwxNzc0YzQyMTcsNDIzMQorPCAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCis8ICAgYWNfZHVtbXk9IiRQQVRIIgorPCAgIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbworPCAgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKzwgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorPCAgICAgICBhY19jdl9wcm9nX1JBTkxJQj0icmFubGliIgorPCAgICAgICBicmVhaworPCAgICAgZmkKKzwgICBkb25lCis8ICAgSUZTPSIkYWNfc2F2ZV9pZnMiCis8ICAgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIiAmJiBhY19jdl9wcm9nX1JBTkxJQj0iOiIKKy0tLQorPiBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCis+IGZvciBhc19kaXIgaW4gJFBBVEgKKz4gZG8KKz4gICBJRlM9JGFzX3NhdmVfSUZTCis+ICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKz4gICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKz4gICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCis+ICAgICBhY19jdl9wcm9nX1JBTkxJQj0iJHthY190b29sX3ByZWZpeH1yYW5saWIiCis+ICAgICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorPiAgICAgYnJlYWsgMgorPiAgIGZpCis+IGRvbmUKKz4gZG9uZQorPiBJRlM9JGFzX3NhdmVfSUZTCis+IAorMTc3N2M0MjM0Cis8IFJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgorLS0tCis+IFJBTkxJQj0kYWNfY3ZfcHJvZ19SQU5MSUIKKzE3NzljNDIzNiw0MjkzCis8ICAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKKy0tLQorPiAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRSQU5MSUIiID4mNQorPiAkYXNfZWNobyAiJFJBTkxJQiIgPiY2OyB9Cis+IGVsc2UKKz4gICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Cis+ICRhc19lY2hvICJubyIgPiY2OyB9Cis+IGZpCis+IAorPiAKKz4gZmkKKz4gaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIjsgdGhlbgorPiAgIGFjX2N0X1JBTkxJQj0kUkFOTElCCis+ICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorPiBzZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorPiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KKz4gaWYgdGVzdCAiJHthY19jdl9wcm9nX2FjX2N0X1JBTkxJQitzZXR9IiA9IHNldDsgdGhlbgorPiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Cis+IGVsc2UKKz4gICBpZiB0ZXN0IC1uICIkYWNfY3RfUkFOTElCIjsgdGhlbgorPiAgIGFjX2N2X3Byb2dfYWNfY3RfUkFOTElCPSIkYWNfY3RfUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KKz4gZWxzZQorPiBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCis+IGZvciBhc19kaXIgaW4gJFBBVEgKKz4gZG8KKz4gICBJRlM9JGFzX3NhdmVfSUZTCis+ICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKz4gICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKz4gICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCis+ICAgICBhY19jdl9wcm9nX2FjX2N0X1JBTkxJQj0icmFubGliIgorPiAgICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKz4gICAgIGJyZWFrIDIKKz4gICBmaQorPiBkb25lCis+IGRvbmUKKz4gSUZTPSRhc19zYXZlX0lGUworPiAKKz4gZmkKKz4gZmkKKz4gYWNfY3RfUkFOTElCPSRhY19jdl9wcm9nX2FjX2N0X1JBTkxJQgorPiBpZiB0ZXN0IC1uICIkYWNfY3RfUkFOTElCIjsgdGhlbgorPiAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdF9SQU5MSUIiID4mNQorPiAkYXNfZWNobyAiJGFjX2N0X1JBTkxJQiIgPiY2OyB9Cis+IGVsc2UKKz4gICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Cis+ICRhc19lY2hvICJubyIgPiY2OyB9Cis+IGZpCis+IAorPiAgIGlmIHRlc3QgIngkYWNfY3RfUkFOTElCIiA9IHg7IHRoZW4KKz4gICAgIFJBTkxJQj0iOiIKKz4gICBlbHNlCis+ICAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCis+IHllczopCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9Cis+IGFjX3Rvb2xfd2FybmVkPXllcyA7OworPiBlc2FjCis+ICAgICBSQU5MSUI9JGFjX2N0X1JBTkxJQgorPiAgIGZpCisxNzgxYzQyOTUKKzwgICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKy0tLQorPiAgIFJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgorMTc4NiwxNzg5YzQzMDAsNDMwMworPCBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6MTc4ODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKzwgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfQVInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorPCAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CistLS0KKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Cis+ICRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQorPiBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfQVIrc2V0fSIgPSBzZXQ7IHRoZW4KKz4gICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorMTc5MSwxNzkyYzQzMDUsNDMwNgorPCAgIGNhc2UgIiRBUiIgaW4KKzwgICAvKikKKy0tLQorPiAgIGNhc2UgJEFSIGluCis+ICAgW1xcL10qIHwgPzpbXFwvXSopCisxNzk1LDE3OTdkNDMwOAorPCAgID86LyopCQkJIAorPCAgIGFjX2N2X3BhdGhfQVI9IiRBUiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgorPCAgIDs7CisxNzk5LDE4MDhjNDMxMCw0MzI1Cis8ICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKKzwgICBhY19kdW1teT0iJFBBVEg6L2JpbjovdXNyL2JpbjovdXNyL2Njcy9iaW4iCis8ICAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvIAorPCAgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KKzwgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgorPCAgICAgICBhY19jdl9wYXRoX0FSPSIkYWNfZGlyLyRhY193b3JkIgorPCAgICAgICBicmVhaworPCAgICAgZmkKKzwgICBkb25lCis8ICAgSUZTPSIkYWNfc2F2ZV9pZnMiCistLS0KKz4gICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCis+IGFzX2R1bW15PSIkUEFUSDovYmluOi91c3IvYmluOi91c3IvY2NzL2JpbiIKKz4gZm9yIGFzX2RpciBpbiAkYXNfZHVtbXkKKz4gZG8KKz4gICBJRlM9JGFzX3NhdmVfSUZTCis+ICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKz4gICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKz4gICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCis+ICAgICBhY19jdl9wYXRoX0FSPSIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IgorPiAgICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKz4gICAgIGJyZWFrIDIKKz4gICBmaQorPiBkb25lCis+IGRvbmUKKz4gSUZTPSRhc19zYXZlX0lGUworPiAKKzE4MTNjNDMzMAorPCBBUj0iJGFjX2N2X3BhdGhfQVIiCistLS0KKz4gQVI9JGFjX2N2X3BhdGhfQVIKKzE4MTVjNDMzMiw0MzMzCis8ICAgZWNobyAiJGFjX3QiIiRBUiIgMT4mNgorLS0tCis+ICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJEFSIiA+JjUKKz4gJGFzX2VjaG8gIiRBUiIgPiY2OyB9CisxODE3YzQzMzUsNDMzNgorPCAgIGVjaG8gIiRhY190IiJubyIgMT4mNgorLS0tCis+ICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQorPiAkYXNfZWNobyAibm8iID4mNjsgfQorMTgyMSwxODIyYzQzNDAsNDM0MgorPCBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSByZW5hbWluZyBvZiBzeW1ib2xzIiIuLi4gJGFjX2MiIDE+JjYKKzwgZWNobyAiY29uZmlndXJlOjE4MjM6IGNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIHJlbmFtaW5nIG9mIHN5bWJvbHMiID4mNQorLS0tCis+IAorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgcmVuYW1pbmcgb2Ygc3ltYm9scyIgPiY1Cis+ICRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIHJlbmFtaW5nIG9mIHN5bWJvbHMuLi4gIiA+JjY7IH0KKzE4MjVjNDM0NQorPCAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtcmVuYW1pbmcgb3IgLS1kaXNhYmxlLXJlbmFtaW5nIHdhcyBnaXZlbi4KKy0tLQorPiAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtcmVuYW1pbmcgd2FzIGdpdmVuLgorMTgyNywxODI4YzQzNDcKKzwgICBlbmFibGV2YWw9IiRlbmFibGVfcmVuYW1pbmciCis8ICAgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKy0tLQorPiAgIGVuYWJsZXZhbD0kZW5hYmxlX3JlbmFtaW5nOyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorMTgzNWM0MzU0LDQzNTUKKzwgZWNobyAiJGFjX3QiIiRlbmFibGVkIiAxPiY2CistLS0KKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGVuYWJsZWQiID4mNQorPiAkYXNfZWNobyAiJGVuYWJsZWQiID4mNjsgfQorMTgzOCwxODM5YzQzNTgsNDM1OQorPCBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBmdW5jdGlvbiBhbmQgZGF0YSB0cmFjaW5nIiIuLi4gJGFjX2MiIDE+JjYKKzwgZWNobyAiY29uZmlndXJlOjE4NDA6IGNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIGZ1bmN0aW9uIGFuZCBkYXRhIHRyYWNpbmciID4mNQorLS0tCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBmdW5jdGlvbiBhbmQgZGF0YSB0cmFjaW5nIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgZnVuY3Rpb24gYW5kIGRhdGEgdHJhY2luZy4uLiAiID4mNjsgfQorMTg0MmM0MzYyCis8ICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS10cmFjaW5nIG9yIC0tZGlzYWJsZS10cmFjaW5nIHdhcyBnaXZlbi4KKy0tLQorPiAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtdHJhY2luZyB3YXMgZ2l2ZW4uCisxODQ0LDE4NDVjNDM2NAorPCAgIGVuYWJsZXZhbD0iJGVuYWJsZV90cmFjaW5nIgorPCAgICBjYXNlICIke2VuYWJsZXZhbH0iIGluCistLS0KKz4gICBlbmFibGV2YWw9JGVuYWJsZV90cmFjaW5nOyAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorMTg1MmM0MzcxLDQzNzIKKzwgZWNobyAiJGFjX3QiIiRlbmFibGVkIiAxPiY2CistLS0KKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGVuYWJsZWQiID4mNQorPiAkYXNfZWNobyAiJGVuYWJsZWQiID4mNjsgfQorMTg1NWM0Mzc1Cis8ICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1ycGF0aCBvciAtLWRpc2FibGUtcnBhdGggd2FzIGdpdmVuLgorLS0tCis+ICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1ycGF0aCB3YXMgZ2l2ZW4uCisxODU3LDE4NThjNDM3NworPCAgIGVuYWJsZXZhbD0iJGVuYWJsZV9ycGF0aCIKKzwgICAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorLS0tCis+ICAgZW5hYmxldmFsPSRlbmFibGVfcnBhdGg7ICBjYXNlICIke2VuYWJsZXZhbH0iIGluCisxODcxLDE4NzRjNDM5MCw0MzkzCis8IGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBkZWZpbml0aW9uIG9mIFVfSU5MSU5FIGZvciBDIiIuLi4gJGFjX2MiIDE+JjYKKzwgZWNobyAiY29uZmlndXJlOjE4NzM6IGNoZWNraW5nIGZvciBkZWZpbml0aW9uIG9mIFVfSU5MSU5FIGZvciBDIiA+JjUKKzwgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfaW5saW5lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKzwgICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorLS0tCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgZGVmaW5pdGlvbiBvZiBVX0lOTElORSBmb3IgQyIgPiY1Cis+ICRhc19lY2hvX24gImNoZWNraW5nIGZvciBkZWZpbml0aW9uIG9mIFVfSU5MSU5FIGZvciBDLi4uICIgPiY2OyB9Cis+IGlmIHRlc3QgIiR7YWNfY3ZfY19pbmxpbmUrc2V0fSIgPSBzZXQ7IHRoZW4KKz4gICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorMTg3OCwxODgwYzQzOTcsNDQwMgorPCAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKzwgI2xpbmUgMTg4MCAiY29uZmlndXJlIgorPCAjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy0tLQorPiAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKzE4ODJjNDQwNCw0NDA2Cis8IGludCBtYWluKCkgeworLS0tCis+IGludAorPiBtYWluICgpCis+IHsKKzE4ODQsMTg4N2M0NDA4LDQ0MjkKKzwgOyByZXR1cm4gMDsgfQorPCBFT0YKKzwgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxODg3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCis8ICAgcm0gLXJmIGNvbmZ0ZXN0KgorLS0tCis+ICAgOworPiAgIHJldHVybiAwOworPiB9Cis+IF9BQ0VPRgorPiBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Cis+IGlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorPiAgIGFjX3N0YXR1cz0kPworPiAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCis+ICAgcm0gLWYgY29uZnRlc3QuZXIxCis+ICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKz4gCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKz4gCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCis+ICAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorMTg5MCwxODkxYzQ0MzIsNDQzNQorPCAgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis8ICAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CistLS0KKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKz4gCisxODkzYzQ0MzcsNDQzOAorPCBybSAtZiBjb25mdGVzdCoKKy0tLQorPiAKKz4gcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisxODk1LDE4OTZkNDQzOQorPCAgIAorPCBmaQorMTg5OGM0NDQxLDQ0NDMKKzwgZWNobyAiJGFjX3QiIiRhY19jdl9jX2lubGluZSIgMT4mNgorLS0tCis+IGZpCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9jX2lubGluZSIgPiY1Cis+ICRhc19lY2hvICIkYWNfY3ZfY19pbmxpbmUiID4mNjsgfQorMTkwOGM0NDUzCis8ICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS10aHJlYWRzIG9yIC0tZGlzYWJsZS10aHJlYWRzIHdhcyBnaXZlbi4KKy0tLQorPiAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtdGhyZWFkcyB3YXMgZ2l2ZW4uCisxOTEwLDE5MTFjNDQ1NQorPCAgIGVuYWJsZXZhbD0iJGVuYWJsZV90aHJlYWRzIgorPCAgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKy0tLQorPiAgIGVuYWJsZXZhbD0kZW5hYmxlX3RocmVhZHM7IGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKzE5MTRjNDQ1OCw0NDYwCis8IAkJKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGZvciAtLWVuYWJsZS10aHJlYWRzIiAxPiYyOyBleGl0IDE7IH0gOzsKKy0tLQorPiAJCSopIHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGZvciAtLWVuYWJsZS10aHJlYWRzIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGJhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIC0tZW5hYmxlLXRocmVhZHMiID4mMjt9Cis+ICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfSA7OworMTkzMCwxOTM1YzQ0NzYsNDQ4MQorPCAgICAgICAgICAgIAorPCAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBwdGhyZWFkX2F0dHJfaW5pdCBpbiAtbHB0aHJlYWQiIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6MTkzMzogY2hlY2tpbmcgZm9yIHB0aHJlYWRfYXR0cl9pbml0IGluIC1scHRocmVhZCIgPiY1Cis8IGFjX2xpYl92YXI9YGVjaG8gcHRocmVhZCdfJ3B0aHJlYWRfYXR0cl9pbml0IHwgc2VkICd5JS4vKy0lX19wXyUnYAorPCBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKzwgICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorLS0tCis+IAorPiAKKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBwdGhyZWFkX2F0dHJfaW5pdCBpbiAtbHB0aHJlYWQiID4mNQorPiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgcHRocmVhZF9hdHRyX2luaXQgaW4gLWxwdGhyZWFkLi4uICIgPiY2OyB9Cis+IGlmIHRlc3QgIiR7YWNfY3ZfbGliX3B0aHJlYWRfcHRocmVhZF9hdHRyX2luaXQrc2V0fSIgPSBzZXQ7IHRoZW4KKz4gICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorMTkzN2M0NDgzCis8ICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKKy0tLQorPiAgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKKzE5MzksMTk3MGM0NDg1LDQ1NDYKKzwgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorPCAjbGluZSAxOTQxICJjb25maWd1cmUiCis8ICNpbmNsdWRlICJjb25mZGVmcy5oIgorPCAvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworPCAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCis8ICAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworPCBjaGFyIHB0aHJlYWRfYXR0cl9pbml0KCk7Cis8IAorPCBpbnQgbWFpbigpIHsKKzwgcHRocmVhZF9hdHRyX2luaXQoKQorPCA7IHJldHVybiAwOyB9Cis8IEVPRgorPCBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE5NTI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzwgICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgorPCBlbHNlCis8ICAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKzwgICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKzwgICBybSAtcmYgY29uZnRlc3QqCis8ICAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgorPCBmaQorPCBybSAtZiBjb25mdGVzdCoKKzwgTElCUz0iJGFjX3NhdmVfTElCUyIKKzwgCis8IGZpCis8IGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCis8ICAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorPCAgICAgYWNfdHJfbGliPUhBVkVfTElCYGVjaG8gcHRocmVhZCB8IHNlZCAtZSAncy9bXmEtekEtWjAtOV9dL18vZycgXAorPCAgICAgLWUgJ3kvYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovJ2AKKzwgICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorPCAjZGVmaW5lICRhY190cl9saWIgMQorPCBFT0YKKy0tLQorPiBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogY29uZmRlZnMuaC4gICovCis+IF9BQ0VPRgorPiBjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKz4gY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBlbmQgY29uZmRlZnMuaC4gICovCis+IAorPiAvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKz4gICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCis+ICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCis+ICNpZmRlZiBfX2NwbHVzcGx1cworPiBleHRlcm4gIkMiCis+ICNlbmRpZgorPiBjaGFyIHB0aHJlYWRfYXR0cl9pbml0ICgpOworPiBpbnQKKz4gbWFpbiAoKQorPiB7Cis+IHJldHVybiBwdGhyZWFkX2F0dHJfaW5pdCAoKTsKKz4gICA7Cis+ICAgcmV0dXJuIDA7Cis+IH0KKz4gX0FDRU9GCis+IHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0Cis+IGlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQorPiAgIGFjX3N0YXR1cz0kPworPiAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCis+ICAgcm0gLWYgY29uZnRlc3QuZXIxCis+ICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKz4gCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKz4gCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCis+ICAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmIHsKKz4gCSB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllcyB8fAorPiAJICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0Cis+ICAgICAgICB9OyB0aGVuCis+ICAgYWNfY3ZfbGliX3B0aHJlYWRfcHRocmVhZF9hdHRyX2luaXQ9eWVzCis+IGVsc2UKKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKz4gCWFjX2N2X2xpYl9wdGhyZWFkX3B0aHJlYWRfYXR0cl9pbml0PW5vCis+IGZpCis+IAorPiBybSAtcmYgY29uZnRlc3QuZFNZTQorPiBybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorPiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorPiBMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCis+IGZpCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9saWJfcHRocmVhZF9wdGhyZWFkX2F0dHJfaW5pdCIgPiY1Cis+ICRhc19lY2hvICIkYWNfY3ZfbGliX3B0aHJlYWRfcHRocmVhZF9hdHRyX2luaXQiID4mNjsgfQorPiBpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9wdGhyZWFkX3B0aHJlYWRfYXR0cl9pbml0IiA9IHgiInllczsgdGhlbgorPiAgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKz4gI2RlZmluZSBIQVZFX0xJQlBUSFJFQUQgMQorPiBfQUNFT0YKKzE5NzQsMTk3NWQ0NTQ5Cis8IGVsc2UKKzwgICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKzE5ODEsMTk4NmM0NTU1LDQ1NjAKKzwgICAgICAgICAgICAgICAgCis8ICAgIAorPCBlY2hvICRhY19uICJjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSIiLi4uICRhY19jIiAxPiY2Cis8IGVjaG8gImNvbmZpZ3VyZToxOTg1OiBjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSIgPiY1Cis8IGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9zZWFyY2hfcHRocmVhZF9tdXRleF9kZXN0cm95JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKzwgICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorLS0tCis+IAorPiAKKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgcHRocmVhZF9tdXRleF9kZXN0cm95IiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyBwdGhyZWFkX211dGV4X2Rlc3Ryb3kuLi4gIiA+JjY7IH0KKz4gaWYgdGVzdCAiJHthY19jdl9zZWFyY2hfcHRocmVhZF9tdXRleF9kZXN0cm95K3NldH0iID0gc2V0OyB0aGVuCis+ICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKzE5OTIsMjAwNWM0NTY2LDQ2MDgKKzwgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorPCAjbGluZSAxOTk0ICJjb25maWd1cmUiCis8ICNpbmNsdWRlICJjb25mZGVmcy5oIgorPCAvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworPCAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCis8ICAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworPCBjaGFyIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgpOworPCAKKzwgaW50IG1haW4oKSB7Cis8IHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgpCis8IDsgcmV0dXJuIDA7IH0KKzwgRU9GCis8IGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjAwNTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCis8ICAgcm0gLXJmIGNvbmZ0ZXN0KgorLS0tCis+IGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKz4gCis+IC8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorPiAgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKz4gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKz4gI2lmZGVmIF9fY3BsdXNwbHVzCis+IGV4dGVybiAiQyIKKz4gI2VuZGlmCis+IGNoYXIgcHRocmVhZF9tdXRleF9kZXN0cm95ICgpOworPiBpbnQKKz4gbWFpbiAoKQorPiB7Cis+IHJldHVybiBwdGhyZWFkX211dGV4X2Rlc3Ryb3kgKCk7Cis+ICAgOworPiAgIHJldHVybiAwOworPiB9Cis+IF9BQ0VPRgorPiBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorPiBpZiB7IChhY190cnk9IiRhY19saW5rIgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKz4gICBhY19zdGF0dXM9JD8KKz4gICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorPiAgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorPiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Cis+IAkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Cis+IAkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorPiAgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJiB7Cis+IAkgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgfHwKKz4gCSAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorPiAgICAgICAgfTsgdGhlbgorMjAwOSwyMDEwYzQ2MTIsNDYxNQorPCAgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis8ICAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CistLS0KKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKz4gCisyMDEyYzQ2MTcsNDYyMAorPCBybSAtZiBjb25mdGVzdCoKKy0tLQorPiAKKz4gcm0gLXJmIGNvbmZ0ZXN0LmRTWU0KKz4gcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKKz4gICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKzIwMTUsMjAyOGM0NjIzLDQ2NjUKKzwgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorPCAjbGluZSAyMDE3ICJjb25maWd1cmUiCis8ICNpbmNsdWRlICJjb25mZGVmcy5oIgorPCAvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLworPCAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCis8ICAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworPCBjaGFyIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgpOworPCAKKzwgaW50IG1haW4oKSB7Cis8IHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgpCis8IDsgcmV0dXJuIDA7IH0KKzwgRU9GCis8IGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjAyODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCis8ICAgcm0gLXJmIGNvbmZ0ZXN0KgorLS0tCis+IGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKz4gCis+IC8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorPiAgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKz4gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKz4gI2lmZGVmIF9fY3BsdXNwbHVzCis+IGV4dGVybiAiQyIKKz4gI2VuZGlmCis+IGNoYXIgcHRocmVhZF9tdXRleF9kZXN0cm95ICgpOworPiBpbnQKKz4gbWFpbiAoKQorPiB7Cis+IHJldHVybiBwdGhyZWFkX211dGV4X2Rlc3Ryb3kgKCk7Cis+ICAgOworPiAgIHJldHVybiAwOworPiB9Cis+IF9BQ0VPRgorPiBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorPiBpZiB7IChhY190cnk9IiRhY19saW5rIgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKz4gICBhY19zdGF0dXM9JD8KKz4gICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorPiAgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorPiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Cis+IAkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Cis+IAkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorPiAgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJiB7Cis+IAkgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgfHwKKz4gCSAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorPiAgICAgICAgfTsgdGhlbgorMjAzMSwyMDMyYzQ2NjgsNDY3MQorPCAgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis8ICAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CistLS0KKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKz4gCisyMDM0YzQ2NzMsNDY3NgorPCBybSAtZiBjb25mdGVzdCoKKy0tLQorPiAKKz4gcm0gLXJmIGNvbmZ0ZXN0LmRTWU0KKz4gcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKKz4gICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKzIwMzgsMjAzOWM0NjgwLDQ2ODEKKzwgCis8IGVjaG8gIiRhY190IiIkYWNfY3Zfc2VhcmNoX3B0aHJlYWRfbXV0ZXhfZGVzdHJveSIgMT4mNgorLS0tCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9zZWFyY2hfcHRocmVhZF9tdXRleF9kZXN0cm95IiA+JjUKKz4gJGFzX2VjaG8gIiRhY19jdl9zZWFyY2hfcHRocmVhZF9tdXRleF9kZXN0cm95IiA+JjY7IH0KKzIwNDJjNDY4NAorPCAgIAorLS0tCis+IAorMjA0NGM0Njg2Cis8ICAgCistLS0KKz4gCisyMDUwLDIwNTRjNDY5Miw0Njk2Cis8ICAgICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHB0aHJlYWRfbXV0ZXhfaW5pdCBpbiAtbHB0aHJlYWQiIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6MjA1MjogY2hlY2tpbmcgZm9yIHB0aHJlYWRfbXV0ZXhfaW5pdCBpbiAtbHB0aHJlYWQiID4mNQorPCBhY19saWJfdmFyPWBlY2hvIHB0aHJlYWQnXydwdGhyZWFkX211dGV4X2luaXQgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCis8IGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgorPCAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CistLS0KKz4gCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgcHRocmVhZF9tdXRleF9pbml0IGluIC1scHRocmVhZCIgPiY1Cis+ICRhc19lY2hvX24gImNoZWNraW5nIGZvciBwdGhyZWFkX211dGV4X2luaXQgaW4gLWxwdGhyZWFkLi4uICIgPiY2OyB9Cis+IGlmIHRlc3QgIiR7YWNfY3ZfbGliX3B0aHJlYWRfcHRocmVhZF9tdXRleF9pbml0K3NldH0iID0gc2V0OyB0aGVuCis+ICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKzIwNTZjNDY5OAorPCAgIGFjX3NhdmVfTElCUz0iJExJQlMiCistLS0KKz4gICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCisyMDU4LDIwODljNDcwMCw0NzYxCis8IGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKzwgI2xpbmUgMjA2MCAiY29uZmlndXJlIgorPCAjaW5jbHVkZSAiY29uZmRlZnMuaCIKKzwgLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKzwgLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorPCAgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKzwgY2hhciBwdGhyZWFkX211dGV4X2luaXQoKTsKKzwgCis8IGludCBtYWluKCkgeworPCBwdGhyZWFkX211dGV4X2luaXQoKQorPCA7IHJldHVybiAwOyB9Cis8IEVPRgorPCBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIwNzE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzwgICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgorPCBlbHNlCis8ICAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKzwgICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKzwgICBybSAtcmYgY29uZnRlc3QqCis8ICAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgorPCBmaQorPCBybSAtZiBjb25mdGVzdCoKKzwgTElCUz0iJGFjX3NhdmVfTElCUyIKKzwgCis8IGZpCis8IGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCis8ICAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorPCAgICAgYWNfdHJfbGliPUhBVkVfTElCYGVjaG8gcHRocmVhZCB8IHNlZCAtZSAncy9bXmEtekEtWjAtOV9dL18vZycgXAorPCAgICAgLWUgJ3kvYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovJ2AKKzwgICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorPCAjZGVmaW5lICRhY190cl9saWIgMQorPCBFT0YKKy0tLQorPiBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogY29uZmRlZnMuaC4gICovCis+IF9BQ0VPRgorPiBjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKz4gY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBlbmQgY29uZmRlZnMuaC4gICovCis+IAorPiAvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKz4gICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCis+ICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCis+ICNpZmRlZiBfX2NwbHVzcGx1cworPiBleHRlcm4gIkMiCis+ICNlbmRpZgorPiBjaGFyIHB0aHJlYWRfbXV0ZXhfaW5pdCAoKTsKKz4gaW50Cis+IG1haW4gKCkKKz4geworPiByZXR1cm4gcHRocmVhZF9tdXRleF9pbml0ICgpOworPiAgIDsKKz4gICByZXR1cm4gMDsKKz4gfQorPiBfQUNFT0YKKz4gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKKz4gaWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKKz4gY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCis+ICAgYWNfc3RhdHVzPSQ/Cis+ICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKz4gICBybSAtZiBjb25mdGVzdC5lcjEKKz4gICBjYXQgY29uZnRlc3QuZXJyID4mNQorPiAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cis+ICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworPiAJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorPiAJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKz4gICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgeworPiAJIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzIHx8Cis+IAkgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQKKz4gICAgICAgIH07IHRoZW4KKz4gICBhY19jdl9saWJfcHRocmVhZF9wdGhyZWFkX211dGV4X2luaXQ9eWVzCis+IGVsc2UKKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKz4gCWFjX2N2X2xpYl9wdGhyZWFkX3B0aHJlYWRfbXV0ZXhfaW5pdD1ubworPiBmaQorPiAKKz4gcm0gLXJmIGNvbmZ0ZXN0LmRTWU0KKz4gcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKKz4gICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKz4gTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworPiBmaQorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGliX3B0aHJlYWRfcHRocmVhZF9tdXRleF9pbml0IiA+JjUKKz4gJGFzX2VjaG8gIiRhY19jdl9saWJfcHRocmVhZF9wdGhyZWFkX211dGV4X2luaXQiID4mNjsgfQorPiBpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9wdGhyZWFkX3B0aHJlYWRfbXV0ZXhfaW5pdCIgPSB4IiJ5ZXM7IHRoZW4KKz4gICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCis+ICNkZWZpbmUgSEFWRV9MSUJQVEhSRUFEIDEKKz4gX0FDRU9GCisyMDkzLDIwOTRkNDc2NAorPCBlbHNlCis8ICAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CisyMTAyLDIxMDljNDc3Miw0Nzg2Cis8ICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBwdGhyZWFkX211dGV4X2xvY2siIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6MjEwNDogY2hlY2tpbmcgZm9yIHB0aHJlYWRfbXV0ZXhfbG9jayIgPiY1Cis8IGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX3B0aHJlYWRfbXV0ZXhfbG9jaycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCis8ICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKzwgZWxzZQorPCAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKzwgI2xpbmUgMjEwOSAiY29uZmlndXJlIgorPCAjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy0tLQorPiAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHB0aHJlYWRfbXV0ZXhfbG9jayIgPiY1Cis+ICRhc19lY2hvX24gImNoZWNraW5nIGZvciBwdGhyZWFkX211dGV4X2xvY2suLi4gIiA+JjY7IH0KKz4gaWYgdGVzdCAiJHthY19jdl9mdW5jX3B0aHJlYWRfbXV0ZXhfbG9jaytzZXR9IiA9IHNldDsgdGhlbgorPiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Cis+IGVsc2UKKz4gICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogY29uZmRlZnMuaC4gICovCis+IF9BQ0VPRgorPiBjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKz4gY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBlbmQgY29uZmRlZnMuaC4gICovCis+IC8qIERlZmluZSBwdGhyZWFkX211dGV4X2xvY2sgdG8gYW4gaW5ub2N1b3VzIHZhcmlhbnQsIGluIGNhc2UgPGxpbWl0cy5oPiBkZWNsYXJlcyBwdGhyZWFkX211dGV4X2xvY2suCis+ICAgIEZvciBleGFtcGxlLCBIUC1VWCAxMWkgPGxpbWl0cy5oPiBkZWNsYXJlcyBnZXR0aW1lb2ZkYXkuICAqLworPiAjZGVmaW5lIHB0aHJlYWRfbXV0ZXhfbG9jayBpbm5vY3VvdXNfcHRocmVhZF9tdXRleF9sb2NrCis+IAorMjExMSwyMTE2YzQ3ODgsNDc5NgorPCAgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciBwdGhyZWFkX211dGV4X2xvY2soKTsgYmVsb3cuICAqLworPCAjaW5jbHVkZSA8YXNzZXJ0Lmg+Cis8IC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCis8IC8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKzwgICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCis8IGNoYXIgcHRocmVhZF9tdXRleF9sb2NrKCk7CistLS0KKz4gICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgcHRocmVhZF9tdXRleF9sb2NrICgpOyBiZWxvdy4KKz4gICAgIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKz4gICAgIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4gICovCis+IAorPiAjaWZkZWYgX19TVERDX18KKz4gIyBpbmNsdWRlIDxsaW1pdHMuaD4KKz4gI2Vsc2UKKz4gIyBpbmNsdWRlIDxhc3NlcnQuaD4KKz4gI2VuZGlmCisyMTE4YzQ3OTgKKzwgaW50IG1haW4oKSB7CistLS0KKz4gI3VuZGVmIHB0aHJlYWRfbXV0ZXhfbG9jaworMjExOWE0ODAwLDQ4MDYKKz4gLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCis+ICAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworPiAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworPiAjaWZkZWYgX19jcGx1c3BsdXMKKz4gZXh0ZXJuICJDIgorPiAjZW5kaWYKKz4gY2hhciBwdGhyZWFkX211dGV4X2xvY2sgKCk7CisyMTIzYzQ4MTAKKzwgI2lmIGRlZmluZWQgKF9fc3R1Yl9wdGhyZWFkX211dGV4X2xvY2spIHx8IGRlZmluZWQgKF9fc3R1Yl9fX3B0aHJlYWRfbXV0ZXhfbG9jaykKKy0tLQorPiAjaWYgZGVmaW5lZCBfX3N0dWJfcHRocmVhZF9tdXRleF9sb2NrIHx8IGRlZmluZWQgX19zdHViX19fcHRocmVhZF9tdXRleF9sb2NrCisyMTI1LDIxMjZkNDgxMQorPCAjZWxzZQorPCBwdGhyZWFkX211dGV4X2xvY2soKTsKKzIxMjksMjE0N2M0ODE0LDQ4NTMKKzwgOyByZXR1cm4gMDsgfQorPCBFT0YKKzwgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTMyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKzwgICBybSAtcmYgY29uZnRlc3QqCis8ICAgZXZhbCAiYWNfY3ZfZnVuY19wdGhyZWFkX211dGV4X2xvY2s9eWVzIgorPCBlbHNlCis8ICAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKzwgICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKzwgICBybSAtcmYgY29uZnRlc3QqCis8ICAgZXZhbCAiYWNfY3ZfZnVuY19wdGhyZWFkX211dGV4X2xvY2s9bm8iCis8IGZpCis8IHJtIC1mIGNvbmZ0ZXN0KgorPCBmaQorPCAKKzwgaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18ncHRocmVhZF9tdXRleF9sb2NrYFwiID0geWVzIjsgdGhlbgorPCAgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKzwgICA6Cis8IGVsc2UKKzwgICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKy0tLQorPiBpbnQKKz4gbWFpbiAoKQorPiB7Cis+IHJldHVybiBwdGhyZWFkX211dGV4X2xvY2sgKCk7Cis+ICAgOworPiAgIHJldHVybiAwOworPiB9Cis+IF9BQ0VPRgorPiBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorPiBpZiB7IChhY190cnk9IiRhY19saW5rIgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKz4gICBhY19zdGF0dXM9JD8KKz4gICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorPiAgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorPiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Cis+IAkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Cis+IAkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorPiAgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJiB7Cis+IAkgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgfHwKKz4gCSAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorPiAgICAgICAgfTsgdGhlbgorPiAgIGFjX2N2X2Z1bmNfcHRocmVhZF9tdXRleF9sb2NrPXllcworPiBlbHNlCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCis+IAlhY19jdl9mdW5jX3B0aHJlYWRfbXV0ZXhfbG9jaz1ubworPiBmaQorPiAKKz4gcm0gLXJmIGNvbmZ0ZXN0LmRTWU0KKz4gcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKKz4gICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKzIxNDhhNDg1NSw0ODU2Cis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9mdW5jX3B0aHJlYWRfbXV0ZXhfbG9jayIgPiY1Cis+ICRhc19lY2hvICIkYWNfY3ZfZnVuY19wdGhyZWFkX211dGV4X2xvY2siID4mNjsgfQorMjE1NmM0ODY0Cis8ICAgICAgaWYgdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IG5vOyB0aGVuCistLS0KKz4gICAgICBpZiB0ZXN0ICIkYWNfY3ZfY19jb21waWxlcl9nbnUiID0gbm87IHRoZW4KKzIxODAsMjE4OGM0ODg4LDQ4OTkKKzwgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG1tYXAiIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6MjE4MjogY2hlY2tpbmcgZm9yIG1tYXAiID4mNQorPCBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19tbWFwX29rJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKzwgICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorPCBlbHNlCis8ICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorPCAjbGluZSAyMTg3ICJjb25maWd1cmUiCis8ICNpbmNsdWRlICJjb25mZGVmcy5oIgorPCAgICAgCistLS0KKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBtbWFwIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIG1tYXAuLi4gIiA+JjY7IH0KKz4gaWYgdGVzdCAiJHthY19jdl9mdW5jX21tYXBfb2src2V0fSIgPSBzZXQ7IHRoZW4KKz4gICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorPiBlbHNlCis+ICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGNvbmZkZWZzLmguICAqLworPiBfQUNFT0YKKz4gY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Cis+IGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogZW5kIGNvbmZkZWZzLmguICAqLworPiAKKzIxOTMsMjE5NGM0OTA0LDQ5MDcKKzwgICAgIAorPCBpbnQgbWFpbigpIHsKKy0tLQorPiAKKz4gaW50Cis+IG1haW4gKCkKKz4geworMjE5NiwyMTk5YzQ5MDksNDkzMworPCA7IHJldHVybiAwOyB9Cis8IEVPRgorPCBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIxOTk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorPCAgIHJtIC1yZiBjb25mdGVzdCoKKy0tLQorPiAgIDsKKz4gICByZXR1cm4gMDsKKz4gfQorPiBfQUNFT0YKKz4gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKKz4gaWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKKz4gY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCis+ICAgYWNfc3RhdHVzPSQ/Cis+ICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKz4gICBybSAtZiBjb25mdGVzdC5lcjEKKz4gICBjYXQgY29uZnRlc3QuZXJyID4mNQorPiAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cis+ICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworPiAJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorPiAJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKz4gICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgeworPiAJIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzIHx8Cis+IAkgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQKKz4gICAgICAgIH07IHRoZW4KKzIyMDIsMjIwNWM0OTM2LDQ5MzkKKzwgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPCAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzwgICBhY19jdl9mdW5jX21tYXBfb2s9bm8KKy0tLQorPiAgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Cis+IAorPiAJYWNfY3ZfZnVuY19tbWFwX29rPW5vCisyMjA3YzQ5NDEsNDk0NAorPCBybSAtZiBjb25mdGVzdCogCistLS0KKz4gCis+IHJtIC1yZiBjb25mdGVzdC5kU1lNCis+IHJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCis+ICAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisyMjEwYzQ5NDcsNDk0OAorPCBlY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfbW1hcF9vayIgMT4mNgorLS0tCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9mdW5jX21tYXBfb2siID4mNQorPiAkYXNfZWNobyAiJGFjX2N2X2Z1bmNfbW1hcF9vayIgPiY2OyB9CisyMjI3LDIyMjhjNDk2NSw0OTcxCis8IGVjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiIuLi4gJGFjX2MiIDE+JjYKKzwgZWNobyAiY29uZmlndXJlOjIyMjk6IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKKy0tLQorPiBhY19leHQ9YworPiBhY19jcHA9JyRDUFAgJENQUEZMQUdTJworPiBhY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCis+IGFjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCis+IGFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IuLi4gIiA+JjY7IH0KKzIyMzQsMjIzNWM0OTc3LDUwODQKKzwgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ1BQJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKzwgICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorLS0tCis+ICAgaWYgdGVzdCAiJHthY19jdl9wcm9nX0NQUCtzZXR9IiA9IHNldDsgdGhlbgorPiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Cis+IGVsc2UKKz4gICAgICAgIyBEb3VibGUgcXVvdGVzIGJlY2F1c2UgQ1BQIG5lZWRzIHRvIGJlIGV4cGFuZGVkCis+ICAgICBmb3IgQ1BQIGluICIkQ0MgLUUiICIkQ0MgLUUgLXRyYWRpdGlvbmFsLWNwcCIgIi9saWIvY3BwIgorPiAgICAgZG8KKz4gICAgICAgYWNfcHJlcHJvY19vaz1mYWxzZQorPiBmb3IgYWNfY19wcmVwcm9jX3dhcm5fZmxhZyBpbiAnJyB5ZXMKKz4gZG8KKz4gICAjIFVzZSBhIGhlYWRlciBmaWxlIHRoYXQgY29tZXMgd2l0aCBnY2MsIHNvIGNvbmZpZ3VyaW5nIGdsaWJjCis+ICAgIyB3aXRoIGEgZnJlc2ggY3Jvc3MtY29tcGlsZXIgd29ya3MuCis+ICAgIyBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCis+ICAgIyA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuCis+ICAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKKz4gICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLiAiU3ludGF4IGVycm9yIiBpcyBoZXJlIHRvIGNhdGNoIHRoaXMgY2FzZS4KKz4gICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogY29uZmRlZnMuaC4gICovCis+IF9BQ0VPRgorPiBjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKz4gY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBlbmQgY29uZmRlZnMuaC4gICovCis+ICNpZmRlZiBfX1NURENfXworPiAjIGluY2x1ZGUgPGxpbWl0cy5oPgorPiAjZWxzZQorPiAjIGluY2x1ZGUgPGFzc2VydC5oPgorPiAjZW5kaWYKKz4gCQkgICAgIFN5bnRheCBlcnJvcgorPiBfQUNFT0YKKz4gaWYgeyAoYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj5jb25mdGVzdC5lcjEKKz4gICBhY19zdGF0dXM9JD8KKz4gICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorPiAgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorPiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsICYmIHsKKz4gCSB0ZXN0IC16ICIkYWNfY19wcmVwcm9jX3dhcm5fZmxhZyRhY19jX3dlcnJvcl9mbGFnIiB8fAorPiAJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKz4gICAgICAgIH07IHRoZW4KKz4gICA6Cis+IGVsc2UKKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKz4gICAjIEJyb2tlbjogZmFpbHMgb24gdmFsaWQgaW5wdXQuCis+IGNvbnRpbnVlCis+IGZpCis+IAorPiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAorPiAKKz4gICAjIE9LLCB3b3JrcyBvbiBzYW5lIGNhc2VzLiAgTm93IGNoZWNrIHdoZXRoZXIgbm9uZXhpc3RlbnQgaGVhZGVycworPiAgICMgY2FuIGJlIGRldGVjdGVkIGFuZCBob3cuCis+ICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGNvbmZkZWZzLmguICAqLworPiBfQUNFT0YKKz4gY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Cis+IGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogZW5kIGNvbmZkZWZzLmguICAqLworPiAjaW5jbHVkZSA8YWNfbm9uZXhpc3RlbnQuaD4KKz4gX0FDRU9GCis+IGlmIHsgKGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+Y29uZnRlc3QuZXIxCis+ICAgYWNfc3RhdHVzPSQ/Cis+ICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKz4gICBybSAtZiBjb25mdGVzdC5lcjEKKz4gICBjYXQgY29uZnRlc3QuZXJyID4mNQorPiAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cis+ICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbCAmJiB7Cis+IAkgdGVzdCAteiAiJGFjX2NfcHJlcHJvY193YXJuX2ZsYWckYWNfY193ZXJyb3JfZmxhZyIgfHwKKz4gCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCis+ICAgICAgICB9OyB0aGVuCis+ICAgIyBCcm9rZW46IHN1Y2Nlc3Mgb24gaW52YWxpZCBpbnB1dC4KKz4gY29udGludWUKKz4gZWxzZQorPiAgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Cis+IAorPiAgICMgUGFzc2VzIGJvdGggdGVzdHMuCis+IGFjX3ByZXByb2Nfb2s9OgorPiBicmVhaworPiBmaQorPiAKKz4gcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKKz4gCis+IGRvbmUKKz4gIyBCZWNhdXNlIG9mIGBicmVhaycsIF9BQ19QUkVQUk9DX0lGRUxTRSdzIGNsZWFuaW5nIGNvZGUgd2FzIHNraXBwZWQuCis+IHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0Cis+IGlmICRhY19wcmVwcm9jX29rOyB0aGVuCis+ICAgYnJlYWsKKz4gZmkKKz4gCis+ICAgICBkb25lCis+ICAgICBhY19jdl9wcm9nX0NQUD0kQ1BQCis+IAorPiBmaQorPiAgIENQUD0kYWNfY3ZfcHJvZ19DUFAKKzIyMzcsMjIzOWM1MDg2LDUwOTYKKzwgICAgICMgVGhpcyBtdXN0IGJlIGluIGRvdWJsZSBxdW90ZXMsIG5vdCBzaW5nbGUgcXVvdGVzLCBiZWNhdXNlIENQUCBtYXkgZ2V0Cis8ICAgIyBzdWJzdGl0dXRlZCBpbnRvIHRoZSBNYWtlZmlsZSBhbmQgIiR7Q0MtY2N9IiB3aWxsIGNvbmZ1c2UgbWFrZS4KKzwgICBDUFA9IiR7Q0MtY2N9IC1FIgorLS0tCis+ICAgYWNfY3ZfcHJvZ19DUFA9JENQUAorPiBmaQorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQ1BQIiA+JjUKKz4gJGFzX2VjaG8gIiRDUFAiID4mNjsgfQorPiBhY19wcmVwcm9jX29rPWZhbHNlCis+IGZvciBhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcworPiBkbworPiAgICMgVXNlIGEgaGVhZGVyIGZpbGUgdGhhdCBjb21lcyB3aXRoIGdjYywgc28gY29uZmlndXJpbmcgZ2xpYmMKKz4gICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KKz4gICAjIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKz4gICAjIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4KKzIyNDEsMjI1MWM1MDk4LDUxMjgKKzwgICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLgorPCAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKzwgI2xpbmUgMjI0NCAiY29uZmlndXJlIgorPCAjaW5jbHVkZSAiY29uZmRlZnMuaCIKKzwgI2luY2x1ZGUgPGFzc2VydC5oPgorPCBTeW50YXggRXJyb3IKKzwgRU9GCis8IGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCis8IHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjI1MDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KKzwgYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAorPCBpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorLS0tCis+ICAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4gIlN5bnRheCBlcnJvciIgaXMgaGVyZSB0byBjYXRjaCB0aGlzIGNhc2UuCis+ICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGNvbmZkZWZzLmguICAqLworPiBfQUNFT0YKKz4gY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Cis+IGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogZW5kIGNvbmZkZWZzLmguICAqLworPiAjaWZkZWYgX19TVERDX18KKz4gIyBpbmNsdWRlIDxsaW1pdHMuaD4KKz4gI2Vsc2UKKz4gIyBpbmNsdWRlIDxhc3NlcnQuaD4KKz4gI2VuZGlmCis+IAkJICAgICBTeW50YXggZXJyb3IKKz4gX0FDRU9GCis+IGlmIHsgKGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+Y29uZnRlc3QuZXIxCis+ICAgYWNfc3RhdHVzPSQ/Cis+ICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKz4gICBybSAtZiBjb25mdGVzdC5lcjEKKz4gICBjYXQgY29uZnRlc3QuZXJyID4mNQorPiAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cis+ICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbCAmJiB7Cis+IAkgdGVzdCAteiAiJGFjX2NfcHJlcHJvY193YXJuX2ZsYWckYWNfY193ZXJyb3JfZmxhZyIgfHwKKz4gCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCis+ICAgICAgICB9OyB0aGVuCisyMjU0LDIyNjhjNTEzMSw1MTgzCis8ICAgZWNobyAiJGFjX2VyciIgPiY1Cis8ICAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKzwgICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKzwgICBybSAtcmYgY29uZnRlc3QqCis8ICAgQ1BQPSIke0NDLWNjfSAtRSAtdHJhZGl0aW9uYWwtY3BwIgorPCAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKzwgI2xpbmUgMjI2MSAiY29uZmlndXJlIgorPCAjaW5jbHVkZSAiY29uZmRlZnMuaCIKKzwgI2luY2x1ZGUgPGFzc2VydC5oPgorPCBTeW50YXggRXJyb3IKKzwgRU9GCis8IGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCis8IHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjI2NzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KKzwgYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAorPCBpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorLS0tCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCis+ICAgIyBCcm9rZW46IGZhaWxzIG9uIHZhbGlkIGlucHV0LgorPiBjb250aW51ZQorPiBmaQorPiAKKz4gcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKKz4gCis+ICAgIyBPSywgd29ya3Mgb24gc2FuZSBjYXNlcy4gIE5vdyBjaGVjayB3aGV0aGVyIG5vbmV4aXN0ZW50IGhlYWRlcnMKKz4gICAjIGNhbiBiZSBkZXRlY3RlZCBhbmQgaG93LgorPiAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKz4gI2luY2x1ZGUgPGFjX25vbmV4aXN0ZW50Lmg+Cis+IF9BQ0VPRgorPiBpZiB7IChhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIKKz4gY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPmNvbmZ0ZXN0LmVyMQorPiAgIGFjX3N0YXR1cz0kPworPiAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCis+ICAgcm0gLWYgY29uZnRlc3QuZXIxCis+ICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGwgJiYgeworPiAJIHRlc3QgLXogIiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Cis+IAkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorPiAgICAgICAgfTsgdGhlbgorPiAgICMgQnJva2VuOiBzdWNjZXNzIG9uIGludmFsaWQgaW5wdXQuCis+IGNvbnRpbnVlCis+IGVsc2UKKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKz4gICAjIFBhc3NlcyBib3RoIHRlc3RzLgorPiBhY19wcmVwcm9jX29rPToKKz4gYnJlYWsKKz4gZmkKKz4gCis+IHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0Cis+IAorPiBkb25lCis+ICMgQmVjYXVzZSBvZiBgYnJlYWsnLCBfQUNfUFJFUFJPQ19JRkVMU0UncyBjbGVhbmluZyBjb2RlIHdhcyBza2lwcGVkLgorPiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAorPiBpZiAkYWNfcHJlcHJvY19vazsgdGhlbgorMjI3MSwyMjg1YzUxODYsNTQwMAorPCAgIGVjaG8gIiRhY19lcnIiID4mNQorPCAgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis8ICAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Cis8ICAgcm0gLXJmIGNvbmZ0ZXN0KgorPCAgIENQUD0iJHtDQy1jY30gLW5vbG9nbyAtRSIKKzwgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCis8ICNsaW5lIDIyNzggImNvbmZpZ3VyZSIKKzwgI2luY2x1ZGUgImNvbmZkZWZzLmgiCis8ICNpbmNsdWRlIDxhc3NlcnQuaD4KKzwgU3ludGF4IEVycm9yCis8IEVPRgorPCBhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgorPCB7IChldmFsIGVjaG8gY29uZmlndXJlOjIyODQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Cis8IGFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKKzwgaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKy0tLQorPiAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KKz4geyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IEMgcHJlcHJvY2Vzc29yIFwiJENQUFwiIGZhaWxzIHNhbml0eSBjaGVjaworPiBTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBDIHByZXByb2Nlc3NvciBcIiRDUFBcIiBmYWlscyBzYW5pdHkgY2hlY2sKKz4gU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9Cis+ICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTsgfQorPiBmaQorPiAKKz4gYWNfZXh0PWMKKz4gYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKKz4gYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworPiBhY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworPiBhY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251Cis+IAorPiAKKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBncmVwIHRoYXQgaGFuZGxlcyBsb25nIGxpbmVzIGFuZCAtZSIgPiY1Cis+ICRhc19lY2hvX24gImNoZWNraW5nIGZvciBncmVwIHRoYXQgaGFuZGxlcyBsb25nIGxpbmVzIGFuZCAtZS4uLiAiID4mNjsgfQorPiBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfR1JFUCtzZXR9IiA9IHNldDsgdGhlbgorPiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Cis+IGVsc2UKKz4gICBpZiB0ZXN0IC16ICIkR1JFUCI7IHRoZW4KKz4gICBhY19wYXRoX0dSRVBfZm91bmQ9ZmFsc2UKKz4gICAjIExvb3AgdGhyb3VnaCB0aGUgdXNlcidzIHBhdGggYW5kIHRlc3QgZm9yIGVhY2ggb2YgUFJPR05BTUUtTElTVAorPiAgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKKz4gZm9yIGFzX2RpciBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4KKz4gZG8KKz4gICBJRlM9JGFzX3NhdmVfSUZTCis+ICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKz4gICBmb3IgYWNfcHJvZyBpbiBncmVwIGdncmVwOyBkbworPiAgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCis+ICAgICAgIGFjX3BhdGhfR1JFUD0iJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIKKz4gICAgICAgeyB0ZXN0IC1mICIkYWNfcGF0aF9HUkVQIiAmJiAkYXNfdGVzdF94ICIkYWNfcGF0aF9HUkVQIjsgfSB8fCBjb250aW51ZQorPiAjIENoZWNrIGZvciBHTlUgYWNfcGF0aF9HUkVQIGFuZCBzZWxlY3QgaXQgaWYgaXQgaXMgZm91bmQuCis+ICAgIyBDaGVjayBmb3IgR05VICRhY19wYXRoX0dSRVAKKz4gY2FzZSBgIiRhY19wYXRoX0dSRVAiIC0tdmVyc2lvbiAyPiYxYCBpbgorPiAqR05VKikKKz4gICBhY19jdl9wYXRoX0dSRVA9IiRhY19wYXRoX0dSRVAiIGFjX3BhdGhfR1JFUF9mb3VuZD06OzsKKz4gKikKKz4gICBhY19jb3VudD0wCis+ICAgJGFzX2VjaG9fbiAwMTIzNDU2Nzg5ID4iY29uZnRlc3QuaW4iCis+ICAgd2hpbGUgOgorPiAgIGRvCis+ICAgICBjYXQgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QuaW4iID4iY29uZnRlc3QudG1wIgorPiAgICAgbXYgImNvbmZ0ZXN0LnRtcCIgImNvbmZ0ZXN0LmluIgorPiAgICAgY3AgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QubmwiCis+ICAgICAkYXNfZWNobyAnR1JFUCcgPj4gImNvbmZ0ZXN0Lm5sIgorPiAgICAgIiRhY19wYXRoX0dSRVAiIC1lICdHUkVQJCcgLWUgJy0oY2Fubm90IG1hdGNoKS0nIDwgImNvbmZ0ZXN0Lm5sIiA+ImNvbmZ0ZXN0Lm91dCIgMj4vZGV2L251bGwgfHwgYnJlYWsKKz4gICAgIGRpZmYgImNvbmZ0ZXN0Lm91dCIgImNvbmZ0ZXN0Lm5sIiA+L2Rldi9udWxsIDI+JjEgfHwgYnJlYWsKKz4gICAgIGFjX2NvdW50PWBleHByICRhY19jb3VudCArIDFgCis+ICAgICBpZiB0ZXN0ICRhY19jb3VudCAtZ3QgJHthY19wYXRoX0dSRVBfbWF4LTB9OyB0aGVuCis+ICAgICAgICMgQmVzdCBvbmUgc28gZmFyLCBzYXZlIGl0IGJ1dCBrZWVwIGxvb2tpbmcgZm9yIGEgYmV0dGVyIG9uZQorPiAgICAgICBhY19jdl9wYXRoX0dSRVA9IiRhY19wYXRoX0dSRVAiCis+ICAgICAgIGFjX3BhdGhfR1JFUF9tYXg9JGFjX2NvdW50Cis+ICAgICBmaQorPiAgICAgIyAxMCooMl4xMCkgY2hhcnMgYXMgaW5wdXQgc2VlbXMgbW9yZSB0aGFuIGVub3VnaAorPiAgICAgdGVzdCAkYWNfY291bnQgLWd0IDEwICYmIGJyZWFrCis+ICAgZG9uZQorPiAgIHJtIC1mIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0LnRtcCBjb25mdGVzdC5ubCBjb25mdGVzdC5vdXQ7OworPiBlc2FjCis+IAorPiAgICAgICAkYWNfcGF0aF9HUkVQX2ZvdW5kICYmIGJyZWFrIDMKKz4gICAgIGRvbmUKKz4gICBkb25lCis+IGRvbmUKKz4gSUZTPSRhc19zYXZlX0lGUworPiAgIGlmIHRlc3QgLXogIiRhY19jdl9wYXRoX0dSRVAiOyB0aGVuCis+ICAgICB7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogbm8gYWNjZXB0YWJsZSBncmVwIGNvdWxkIGJlIGZvdW5kIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbiIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGdyZXAgY291bGQgYmUgZm91bmQgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluIiA+JjI7fQorPiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKz4gICBmaQorPiBlbHNlCis+ICAgYWNfY3ZfcGF0aF9HUkVQPSRHUkVQCis+IGZpCis+IAorPiBmaQorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfcGF0aF9HUkVQIiA+JjUKKz4gJGFzX2VjaG8gIiRhY19jdl9wYXRoX0dSRVAiID4mNjsgfQorPiAgR1JFUD0iJGFjX2N2X3BhdGhfR1JFUCIKKz4gCis+IAorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGVncmVwIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGVncmVwLi4uICIgPiY2OyB9Cis+IGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9FR1JFUCtzZXR9IiA9IHNldDsgdGhlbgorPiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Cis+IGVsc2UKKz4gICBpZiBlY2hvIGEgfCAkR1JFUCAtRSAnKGF8YiknID4vZGV2L251bGwgMj4mMQorPiAgICB0aGVuIGFjX2N2X3BhdGhfRUdSRVA9IiRHUkVQIC1FIgorPiAgICBlbHNlCis+ICAgICAgaWYgdGVzdCAteiAiJEVHUkVQIjsgdGhlbgorPiAgIGFjX3BhdGhfRUdSRVBfZm91bmQ9ZmFsc2UKKz4gICAjIExvb3AgdGhyb3VnaCB0aGUgdXNlcidzIHBhdGggYW5kIHRlc3QgZm9yIGVhY2ggb2YgUFJPR05BTUUtTElTVAorPiAgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKKz4gZm9yIGFzX2RpciBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4KKz4gZG8KKz4gICBJRlM9JGFzX3NhdmVfSUZTCis+ICAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKz4gICBmb3IgYWNfcHJvZyBpbiBlZ3JlcDsgZG8KKz4gICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworPiAgICAgICBhY19wYXRoX0VHUkVQPSIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IgorPiAgICAgICB7IHRlc3QgLWYgIiRhY19wYXRoX0VHUkVQIiAmJiAkYXNfdGVzdF94ICIkYWNfcGF0aF9FR1JFUCI7IH0gfHwgY29udGludWUKKz4gIyBDaGVjayBmb3IgR05VIGFjX3BhdGhfRUdSRVAgYW5kIHNlbGVjdCBpdCBpZiBpdCBpcyBmb3VuZC4KKz4gICAjIENoZWNrIGZvciBHTlUgJGFjX3BhdGhfRUdSRVAKKz4gY2FzZSBgIiRhY19wYXRoX0VHUkVQIiAtLXZlcnNpb24gMj4mMWAgaW4KKz4gKkdOVSopCis+ICAgYWNfY3ZfcGF0aF9FR1JFUD0iJGFjX3BhdGhfRUdSRVAiIGFjX3BhdGhfRUdSRVBfZm91bmQ9Ojs7Cis+ICopCis+ICAgYWNfY291bnQ9MAorPiAgICRhc19lY2hvX24gMDEyMzQ1Njc4OSA+ImNvbmZ0ZXN0LmluIgorPiAgIHdoaWxlIDoKKz4gICBkbworPiAgICAgY2F0ICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0LmluIiA+ImNvbmZ0ZXN0LnRtcCIKKz4gICAgIG12ICJjb25mdGVzdC50bXAiICJjb25mdGVzdC5pbiIKKz4gICAgIGNwICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0Lm5sIgorPiAgICAgJGFzX2VjaG8gJ0VHUkVQJyA+PiAiY29uZnRlc3QubmwiCis+ICAgICAiJGFjX3BhdGhfRUdSRVAiICdFR1JFUCQnIDwgImNvbmZ0ZXN0Lm5sIiA+ImNvbmZ0ZXN0Lm91dCIgMj4vZGV2L251bGwgfHwgYnJlYWsKKz4gICAgIGRpZmYgImNvbmZ0ZXN0Lm91dCIgImNvbmZ0ZXN0Lm5sIiA+L2Rldi9udWxsIDI+JjEgfHwgYnJlYWsKKz4gICAgIGFjX2NvdW50PWBleHByICRhY19jb3VudCArIDFgCis+ICAgICBpZiB0ZXN0ICRhY19jb3VudCAtZ3QgJHthY19wYXRoX0VHUkVQX21heC0wfTsgdGhlbgorPiAgICAgICAjIEJlc3Qgb25lIHNvIGZhciwgc2F2ZSBpdCBidXQga2VlcCBsb29raW5nIGZvciBhIGJldHRlciBvbmUKKz4gICAgICAgYWNfY3ZfcGF0aF9FR1JFUD0iJGFjX3BhdGhfRUdSRVAiCis+ICAgICAgIGFjX3BhdGhfRUdSRVBfbWF4PSRhY19jb3VudAorPiAgICAgZmkKKz4gICAgICMgMTAqKDJeMTApIGNoYXJzIGFzIGlucHV0IHNlZW1zIG1vcmUgdGhhbiBlbm91Z2gKKz4gICAgIHRlc3QgJGFjX2NvdW50IC1ndCAxMCAmJiBicmVhaworPiAgIGRvbmUKKz4gICBybSAtZiBjb25mdGVzdC5pbiBjb25mdGVzdC50bXAgY29uZnRlc3QubmwgY29uZnRlc3Qub3V0OzsKKz4gZXNhYworPiAKKz4gICAgICAgJGFjX3BhdGhfRUdSRVBfZm91bmQgJiYgYnJlYWsgMworPiAgICAgZG9uZQorPiAgIGRvbmUKKz4gZG9uZQorPiBJRlM9JGFzX3NhdmVfSUZTCis+ICAgaWYgdGVzdCAteiAiJGFjX2N2X3BhdGhfRUdSRVAiOyB0aGVuCis+ICAgICB7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogbm8gYWNjZXB0YWJsZSBlZ3JlcCBjb3VsZCBiZSBmb3VuZCBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4iID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBlZ3JlcCBjb3VsZCBiZSBmb3VuZCBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4iID4mMjt9Cis+ICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorPiAgIGZpCis+IGVsc2UKKz4gICBhY19jdl9wYXRoX0VHUkVQPSRFR1JFUAorPiBmaQorPiAKKz4gICAgZmkKKz4gZmkKKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3BhdGhfRUdSRVAiID4mNQorPiAkYXNfZWNobyAiJGFjX2N2X3BhdGhfRUdSRVAiID4mNjsgfQorPiAgRUdSRVA9IiRhY19jdl9wYXRoX0VHUkVQIgorPiAKKz4gCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1Cis+ICRhc19lY2hvX24gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzLi4uICIgPiY2OyB9Cis+IGlmIHRlc3QgIiR7YWNfY3ZfaGVhZGVyX3N0ZGMrc2V0fSIgPSBzZXQ7IHRoZW4KKz4gICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorPiBlbHNlCis+ICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGNvbmZkZWZzLmguICAqLworPiBfQUNFT0YKKz4gY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Cis+IGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogZW5kIGNvbmZkZWZzLmguICAqLworPiAjaW5jbHVkZSA8c3RkbGliLmg+Cis+ICNpbmNsdWRlIDxzdGRhcmcuaD4KKz4gI2luY2x1ZGUgPHN0cmluZy5oPgorPiAjaW5jbHVkZSA8ZmxvYXQuaD4KKz4gCis+IGludAorPiBtYWluICgpCis+IHsKKz4gCis+ICAgOworPiAgIHJldHVybiAwOworPiB9Cis+IF9BQ0VPRgorPiBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Cis+IGlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorPiAgIGFjX3N0YXR1cz0kPworPiAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCis+ICAgcm0gLWYgY29uZnRlc3QuZXIxCis+ICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKz4gCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKz4gCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCis+ICAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorPiAgIGFjX2N2X2hlYWRlcl9zdGRjPXllcworPiBlbHNlCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCis+IAlhY19jdl9oZWFkZXJfc3RkYz1ubworPiBmaQorPiAKKz4gcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Cis+IAorPiBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorPiAgICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8gQU5TSS4KKz4gICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogY29uZmRlZnMuaC4gICovCis+IF9BQ0VPRgorPiBjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKz4gY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBlbmQgY29uZmRlZnMuaC4gICovCis+ICNpbmNsdWRlIDxzdHJpbmcuaD4KKz4gCis+IF9BQ0VPRgorPiBpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Cis+ICAgJEVHUkVQICJtZW1jaHIiID4vZGV2L251bGwgMj4mMTsgdGhlbgorMjI4OCwyMjkyYzU0MDMKKzwgICBlY2hvICIkYWNfZXJyIiA+JjUKKzwgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPCAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzwgICBDUFA9L2xpYi9jcHAKKy0tLQorPiAgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCisyMjk0YTU0MDYsNTQyNAorPiAKKz4gZmkKKz4gCis+IGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCis+ICAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgorPiAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKz4gI2luY2x1ZGUgPHN0ZGxpYi5oPgorPiAKKz4gX0FDRU9GCis+IGlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKz4gICAkRUdSRVAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbgorPiAgIDoKKz4gZWxzZQorPiAgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCisyMjk2YTU0MjcsNTUwMQorPiAKKz4gZmkKKz4gCis+IGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCis+ICAgIyAvYmluL2NjIGluIElyaXgtNC4wLjUgZ2V0cyBub24tQU5TSSBjdHlwZSBtYWNyb3MgdW5sZXNzIHVzaW5nIC1hbnNpLgorPiAgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCis+ICAgOgorPiBlbHNlCis+ICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGNvbmZkZWZzLmguICAqLworPiBfQUNFT0YKKz4gY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Cis+IGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogZW5kIGNvbmZkZWZzLmguICAqLworPiAjaW5jbHVkZSA8Y3R5cGUuaD4KKz4gI2luY2x1ZGUgPHN0ZGxpYi5oPgorPiAjaWYgKCgnICcgJiAweDBGRikgPT0gMHgwMjApCis+ICMgZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKKz4gIyBkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQorPiAjZWxzZQorPiAjIGRlZmluZSBJU0xPV0VSKGMpIFwKKz4gCQkgICAoKCdhJyA8PSAoYykgJiYgKGMpIDw9ICdpJykgXAorPiAJCSAgICAgfHwgKCdqJyA8PSAoYykgJiYgKGMpIDw9ICdyJykgXAorPiAJCSAgICAgfHwgKCdzJyA8PSAoYykgJiYgKGMpIDw9ICd6JykpCis+ICMgZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAoKGMpIHwgMHg0MCkgOiAoYykpCis+ICNlbmRpZgorPiAKKz4gI2RlZmluZSBYT1IoZSwgZikgKCgoZSkgJiYgIShmKSkgfHwgKCEoZSkgJiYgKGYpKSkKKz4gaW50Cis+IG1haW4gKCkKKz4geworPiAgIGludCBpOworPiAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKz4gICAgIGlmIChYT1IgKGlzbG93ZXIgKGkpLCBJU0xPV0VSIChpKSkKKz4gCXx8IHRvdXBwZXIgKGkpICE9IFRPVVBQRVIgKGkpKQorPiAgICAgICByZXR1cm4gMjsKKz4gICByZXR1cm4gMDsKKz4gfQorPiBfQUNFT0YKKz4gcm0gLWYgY29uZnRlc3QkYWNfZXhlZXh0Cis+IGlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2xpbmsiKSAyPiY1Cis+ICAgYWNfc3RhdHVzPSQ/Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCis+ICAgeyAoY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfdHJ5IikgMj4mNQorPiAgIGFjX3N0YXR1cz0kPworPiAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cis+ICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKz4gICA6Cis+IGVsc2UKKz4gICAkYXNfZWNobyAiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCis+ICggZXhpdCAkYWNfc3RhdHVzICkKKz4gYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KKz4gZmkKKz4gcm0gLXJmIGNvbmZ0ZXN0LmRTWU0KKz4gcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Cis+IGZpCis+IAorPiAKKzIyOTgsMjI5OWQ1NTAyCis8IHJtIC1mIGNvbmZ0ZXN0KgorPCAgIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgorMjMwMSwyMzAzYzU1MDQsNTUxMQorPCAgIENQUD0iJGFjX2N2X3Byb2dfQ1BQIgorPCBlbHNlCis8ICAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCistLS0KKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2hlYWRlcl9zdGRjIiA+JjUKKz4gJGFzX2VjaG8gIiRhY19jdl9oZWFkZXJfc3RkYyIgPiY2OyB9Cis+IGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCis+IAorPiBjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorPiAjZGVmaW5lIFNURENfSEVBREVSUyAxCis+IF9BQ0VPRgorPiAKKzIzMDVkNTUxMgorPCBlY2hvICIkYWNfdCIiJENQUCIgMT4mNgorMjMwN2M1NTE0LDU1MjUKKzwgZm9yIGFjX2hkciBpbiBpbnR0eXBlcy5oCistLS0KKz4gIyBPbiBJUklYIDUuMywgc3lzL3R5cGVzIGFuZCBpbnR0eXBlcy5oIGFyZSBjb25mbGljdGluZy4KKz4gCis+IAorPiAKKz4gCis+IAorPiAKKz4gCis+IAorPiAKKz4gZm9yIGFjX2hlYWRlciBpbiBzeXMvdHlwZXMuaCBzeXMvc3RhdC5oIHN0ZGxpYi5oIHN0cmluZy5oIG1lbW9yeS5oIHN0cmluZ3MuaCBcCis+IAkJICBpbnR0eXBlcy5oIHN0ZGludC5oIHVuaXN0ZC5oCisyMzA5LDIzMzNjNTUyNyw1NTgxCis8IGFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAorPCBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Cis8IGVjaG8gImNvbmZpZ3VyZToyMzEyOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Cis8IGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorPCAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Cis8IGVsc2UKKzwgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCis8ICNsaW5lIDIzMTcgImNvbmZpZ3VyZSIKKzwgI2luY2x1ZGUgImNvbmZkZWZzLmgiCis8ICNpbmNsdWRlIDwkYWNfaGRyPgorPCBFT0YKKzwgYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKKzwgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzIyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorPCBhY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCis8IGlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCis8ICAgcm0gLXJmIGNvbmZ0ZXN0KgorPCAgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCis8IGVsc2UKKzwgICBlY2hvICIkYWNfZXJyIiA+JjUKKzwgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPCAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzwgICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCis8IGZpCis8IHJtIC1mIGNvbmZ0ZXN0KgorLS0tCis+IGFzX2FjX0hlYWRlcj1gJGFzX2VjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gIiA+JjY7IH0KKz4gaWYgeyBhc192YXI9JGFzX2FjX0hlYWRlcjsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgorPiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Cis+IGVsc2UKKz4gICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogY29uZmRlZnMuaC4gICovCis+IF9BQ0VPRgorPiBjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKz4gY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBlbmQgY29uZmRlZnMuaC4gICovCis+ICRhY19pbmNsdWRlc19kZWZhdWx0Cis+IAorPiAjaW5jbHVkZSA8JGFjX2hlYWRlcj4KKz4gX0FDRU9GCis+IHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKKz4gaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKKz4gY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCis+ICAgYWNfc3RhdHVzPSQ/Cis+ICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKz4gICBybSAtZiBjb25mdGVzdC5lcjEKKz4gICBjYXQgY29uZnRlc3QuZXJyID4mNQorPiAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cis+ICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworPiAJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorPiAJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKz4gICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCis+ICAgZXZhbCAiJGFzX2FjX0hlYWRlcj15ZXMiCis+IGVsc2UKKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKz4gCWV2YWwgIiRhc19hY19IZWFkZXI9bm8iCis+IGZpCis+IAorPiBybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKz4gZmkKKz4gYWNfcmVzPWBldmFsICdhc192YWw9JHsnJGFzX2FjX0hlYWRlcid9Cis+IAkJICRhc19lY2hvICIkYXNfdmFsIidgCis+IAkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3JlcyIgPiY1Cis+ICRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KKz4gYXNfdmFsPWBldmFsICdhc192YWw9JHsnJGFzX2FjX0hlYWRlcid9Cis+IAkJICRhc19lY2hvICIkYXNfdmFsIidgCis+ICAgIGlmIHRlc3QgIngkYXNfdmFsIiA9IHgiInllczsgdGhlbgorPiAgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKz4gI2RlZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCis+IF9BQ0VPRgorPiAKKzIzMzUsMjM0M2M1NTgzLDU3MjgKKzwgaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KKzwgICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Cis8ICAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCis8ICAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKKzwgI2RlZmluZSAkYWNfdHJfaGRyIDEKKzwgRU9GCis8ICAKKzwgZWxzZQorPCAgIGVjaG8gIiRhY190IiJubyIgMT4mNgorLS0tCis+IAorPiBkb25lCis+IAorPiAKKz4gCis+IGZvciBhY19oZWFkZXIgaW4gaW50dHlwZXMuaAorPiBkbworPiBhc19hY19IZWFkZXI9YCRhc19lY2hvICJhY19jdl9oZWFkZXJfJGFjX2hlYWRlciIgfCAkYXNfdHJfc2hgCis+IGlmIHsgYXNfdmFyPSRhc19hY19IZWFkZXI7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KKz4gICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19oZWFkZXIiID4mNQorPiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX2hlYWRlci4uLiAiID4mNjsgfQorPiBpZiB7IGFzX3Zhcj0kYXNfYWNfSGVhZGVyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCis+ICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKz4gZmkKKz4gYWNfcmVzPWBldmFsICdhc192YWw9JHsnJGFzX2FjX0hlYWRlcid9Cis+IAkJICRhc19lY2hvICIkYXNfdmFsIidgCis+IAkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3JlcyIgPiY1Cis+ICRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KKz4gZWxzZQorPiAgICMgSXMgdGhlIGhlYWRlciBjb21waWxhYmxlPworPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgJGFjX2hlYWRlciB1c2FiaWxpdHkiID4mNQorPiAkYXNfZWNob19uICJjaGVja2luZyAkYWNfaGVhZGVyIHVzYWJpbGl0eS4uLiAiID4mNjsgfQorPiBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogY29uZmRlZnMuaC4gICovCis+IF9BQ0VPRgorPiBjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKz4gY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBlbmQgY29uZmRlZnMuaC4gICovCis+ICRhY19pbmNsdWRlc19kZWZhdWx0Cis+ICNpbmNsdWRlIDwkYWNfaGVhZGVyPgorPiBfQUNFT0YKKz4gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorPiBpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKz4gICBhY19zdGF0dXM9JD8KKz4gICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorPiAgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorPiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Cis+IAkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Cis+IAkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorPiAgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKz4gICBhY19oZWFkZXJfY29tcGlsZXI9eWVzCis+IGVsc2UKKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKz4gCWFjX2hlYWRlcl9jb21waWxlcj1ubworPiBmaQorPiAKKz4gcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Cis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfY29tcGlsZXIiID4mNQorPiAkYXNfZWNobyAiJGFjX2hlYWRlcl9jb21waWxlciIgPiY2OyB9Cis+IAorPiAjIElzIHRoZSBoZWFkZXIgcHJlc2VudD8KKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nICRhY19oZWFkZXIgcHJlc2VuY2UiID4mNQorPiAkYXNfZWNob19uICJjaGVja2luZyAkYWNfaGVhZGVyIHByZXNlbmNlLi4uICIgPiY2OyB9Cis+IGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKz4gI2luY2x1ZGUgPCRhY19oZWFkZXI+Cis+IF9BQ0VPRgorPiBpZiB7IChhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIKKz4gY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPmNvbmZ0ZXN0LmVyMQorPiAgIGFjX3N0YXR1cz0kPworPiAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCis+ICAgcm0gLWYgY29uZnRlc3QuZXIxCis+ICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGwgJiYgeworPiAJIHRlc3QgLXogIiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Cis+IAkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorPiAgICAgICAgfTsgdGhlbgorPiAgIGFjX2hlYWRlcl9wcmVwcm9jPXllcworPiBlbHNlCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCis+ICAgYWNfaGVhZGVyX3ByZXByb2M9bm8KKz4gZmkKKz4gCis+IHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0Cis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfcHJlcHJvYyIgPiY1Cis+ICRhc19lY2hvICIkYWNfaGVhZGVyX3ByZXByb2MiID4mNjsgfQorPiAKKz4gIyBTbz8gIFdoYXQgYWJvdXQgdGhpcyBoZWFkZXI/Cis+IGNhc2UgJGFjX2hlYWRlcl9jb21waWxlcjokYWNfaGVhZGVyX3ByZXByb2M6JGFjX2NfcHJlcHJvY193YXJuX2ZsYWcgaW4KKz4gICB5ZXM6bm86ICkKKz4gICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiYyO30KKz4gICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiYyO30KKz4gICAgIGFjX2hlYWRlcl9wcmVwcm9jPXllcworPiAgICAgOzsKKz4gICBubzp5ZXM6KiApCis+ICAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjI7fQorPiAgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjI7fQorPiAgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiYyO30KKz4gICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgc2VjdGlvbiBcIlByZXNlbnQgQnV0IENhbm5vdCBCZSBDb21waWxlZFwiIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogICAgIHNlY3Rpb24gXCJQcmVzZW50IEJ1dCBDYW5ub3QgQmUgQ29tcGlsZWRcIiIgPiYyO30KKz4gICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgcHJlcHJvY2Vzc29yJ3MgcmVzdWx0IiA+JjI7fQorPiAgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IGluIHRoZSBmdXR1cmUsIHRoZSBjb21waWxlciB3aWxsIHRha2UgcHJlY2VkZW5jZSIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IGluIHRoZSBmdXR1cmUsIHRoZSBjb21waWxlciB3aWxsIHRha2UgcHJlY2VkZW5jZSIgPiYyO30KKz4gCis+ICAgICA7OworPiBlc2FjCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2hlYWRlciIgPiY1Cis+ICRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfaGVhZGVyLi4uICIgPiY2OyB9Cis+IGlmIHsgYXNfdmFyPSRhc19hY19IZWFkZXI7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KKz4gICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorPiBlbHNlCis+ICAgZXZhbCAiJGFzX2FjX0hlYWRlcj1cJGFjX2hlYWRlcl9wcmVwcm9jIgorPiBmaQorPiBhY19yZXM9YGV2YWwgJ2FzX3ZhbD0keyckYXNfYWNfSGVhZGVyJ30KKz4gCQkgJGFzX2VjaG8gIiRhc192YWwiJ2AKKz4gCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfcmVzIiA+JjUKKz4gJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQorPiAKKz4gZmkKKz4gYXNfdmFsPWBldmFsICdhc192YWw9JHsnJGFzX2FjX0hlYWRlcid9Cis+IAkJICRhc19lY2hvICIkYXNfdmFsIidgCis+ICAgIGlmIHRlc3QgIngkYXNfdmFsIiA9IHgiInllczsgdGhlbgorPiAgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKz4gI2RlZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCis+IF9BQ0VPRgorPiAKKzIzNDRhNTczMAorPiAKKzIzNTNjNTczOSw1NzQwCis8ICBlY2hvICIkYWNfdCIiIkMgY29tcGlsZXIgc2V0IHRvIENDQyAke0NDfSIgIiAxPiY2CistLS0KKz4gIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IFwiQyBjb21waWxlciBzZXQgdG8gQ0NDICR7Q0N9XCIgIiA+JjUKKz4gJGFzX2VjaG8gIlwiQyBjb21waWxlciBzZXQgdG8gQ0NDICR7Q0N9XCIgIiA+JjY7IH0KKzIzNjFjNTc0OCw1NzQ5Cis8ICMgQ2hlY2sgd2hldGhlciAtLXdpdGgtaW9zdHJlYW0gb3IgLS13aXRob3V0LWlvc3RyZWFtIHdhcyBnaXZlbi4KKy0tLQorPiAKKz4gIyBDaGVjayB3aGV0aGVyIC0td2l0aC1pb3N0cmVhbSB3YXMgZ2l2ZW4uCisyMzYzLDIzNjRjNTc1MQorPCAgIHdpdGh2YWw9IiR3aXRoX2lvc3RyZWFtIgorPCAgIGNhc2UgIiR7d2l0aHZhbH0iIGluCistLS0KKz4gICB3aXRodmFsPSR3aXRoX2lvc3RyZWFtOyBjYXNlICIke3dpdGh2YWx9IiBpbgorMjM2OWM1NzU2LDU3NTgKKzwgCQkqKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGJhZCB2YWx1ZSAke3dpdGh2YWx9IGZvciAtLXdpdGgtaW9zdHJlYW0iIDE+JjI7IGV4aXQgMTsgfSA7OworLS0tCis+IAkJKikgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGJhZCB2YWx1ZSAke3dpdGh2YWx9IGZvciAtLXdpdGgtaW9zdHJlYW0iID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogYmFkIHZhbHVlICR7d2l0aHZhbH0gZm9yIC0td2l0aC1pb3N0cmVhbSIgPiYyO30KKz4gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9IDs7CisyMzc5LDIzODFjNTc2OCw1NzY5Cis8ICAgICAKKzwgICAgIGFjX2V4dD1DCis8ICMgQ1hYRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgorLS0tCis+IAorPiAgICAgYWNfZXh0PWNwcAorMjM4MywyMzg1YzU3NzEsNTc3MworPCBhY19jb21waWxlPScke0NYWC1nKyt9IC1jICRDWFhGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworPCBhY19saW5rPScke0NYWC1nKyt9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDWFhGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworPCBjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY3h4X2Nyb3NzCistLS0KKz4gYWNfY29tcGlsZT0nJENYWCAtYyAkQ1hYRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworPiBhY19saW5rPSckQ1hYIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworPiBhY19jb21waWxlcl9nbnU9JGFjX2N2X2N4eF9jb21waWxlcl9nbnUKKzIzOTMsMjM5N2M1NzgxLDU3ODkKKzwgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGlvc3RyZWFtIHVzYWJpbGl0eSIiLi4uICRhY19jIiAxPiY2Cis8IGVjaG8gImNvbmZpZ3VyZToyMzk1OiBjaGVja2luZyBpb3N0cmVhbSB1c2FiaWxpdHkiID4mNQorPCAgICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorPCAjbGluZSAyMzk3ICJjb25maWd1cmUiCis8ICNpbmNsdWRlICJjb25mZGVmcy5oIgorLS0tCis+ICAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaW9zdHJlYW0gdXNhYmlsaXR5IiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgaW9zdHJlYW0gdXNhYmlsaXR5Li4uICIgPiY2OyB9Cis+IAorPiBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogY29uZmRlZnMuaC4gICovCis+IF9BQ0VPRgorPiBjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKz4gY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBlbmQgY29uZmRlZnMuaC4gICovCisyMzk5YzU3OTEsNTc5MworPCBpbnQgbWFpbigpIHsKKy0tLQorPiBpbnQKKz4gbWFpbiAoKQorPiB7CisyNDAxLDI0MDRjNTc5NSw1ODE2Cis8IDsgcmV0dXJuIDA7IH0KKzwgRU9GCis8IGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQwNDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgorPCAgIHJtIC1yZiBjb25mdGVzdCoKKy0tLQorPiAgIDsKKz4gICByZXR1cm4gMDsKKz4gfQorPiBfQUNFT0YKKz4gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorPiBpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKz4gICBhY19zdGF0dXM9JD8KKz4gICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorPiAgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorPiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Cis+IAkgdGVzdCAteiAiJGFjX2N4eF93ZXJyb3JfZmxhZyIgfHwKKz4gCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCis+ICAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorMjQwNywyNDEwYzU4MTksNTgyMgorPCAgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis8ICAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Cis8ICAgcm0gLXJmIGNvbmZ0ZXN0KgorPCAgIGFjX2N2X2hlYWRlcl9pb3N0cmVhbT1ubworLS0tCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCis+IAlhY19jdl9oZWFkZXJfaW9zdHJlYW09bm8KKzI0MTJjNTgyNCw1ODI1Cis8IHJtIC1mIGNvbmZ0ZXN0KgorLS0tCis+IAorPiBybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKzI0MTdjNTgzMCw1ODMxCis8ICAgICBlY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9pb3N0cmVhbSIgMT4mNgorLS0tCis+ICAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX2lvc3RyZWFtIiA+JjUKKz4gJGFzX2VjaG8gIiRhY19jdl9oZWFkZXJfaW9zdHJlYW0iID4mNjsgfQorMjQyMywyNDI0YzU4MzcsNTg0MworPCAgICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMrKyBwcmVwcm9jZXNzb3IiIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6MjQyNTogY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQysrIHByZXByb2Nlc3NvciIgPiY1CistLS0KKz4gICAgICAgICBhY19leHQ9Y3BwCis+IGFjX2NwcD0nJENYWENQUCAkQ1BQRkxBR1MnCis+IGFjX2NvbXBpbGU9JyRDWFggLWMgJENYWEZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKKz4gYWNfbGluaz0nJENYWCAtbyBjb25mdGVzdCRhY19leGVleHQgJENYWEZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKKz4gYWNfY29tcGlsZXJfZ251PSRhY19jdl9jeHhfY29tcGlsZXJfZ251Cis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDKysgcHJlcHJvY2Vzc29yIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQysrIHByZXByb2Nlc3Nvci4uLiAiID4mNjsgfQorMjQyNiwyNDI3YzU4NDUsNTg0NgorPCBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DWFhDUFAnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorPCAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CistLS0KKz4gICBpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ1hYQ1BQK3NldH0iID0gc2V0OyB0aGVuCis+ICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKzI0MjksMjQ0NGM1ODQ4LDU4ODkKKzwgICBhY19leHQ9QworPCAjIENYWEZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KKzwgYWNfY3BwPSckQ1hYQ1BQICRDUFBGTEFHUycKKzwgYWNfY29tcGlsZT0nJHtDWFgtZysrfSAtYyAkQ1hYRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKKzwgYWNfbGluaz0nJHtDWFgtZysrfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKKzwgY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2N4eF9jcm9zcworPCAgIENYWENQUD0iJHtDWFgtZysrfSAtRSIKKzwgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCis8ICNsaW5lIDI0MzggImNvbmZpZ3VyZSIKKzwgI2luY2x1ZGUgImNvbmZkZWZzLmgiCis8ICNpbmNsdWRlIDxzdGRsaWIuaD4KKzwgRU9GCis8IGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCis8IHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQ0MzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KKzwgYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAorPCBpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgorLS0tCis+ICAgICAgICMgRG91YmxlIHF1b3RlcyBiZWNhdXNlIENYWENQUCBuZWVkcyB0byBiZSBleHBhbmRlZAorPiAgICAgZm9yIENYWENQUCBpbiAiJENYWCAtRSIgIi9saWIvY3BwIgorPiAgICAgZG8KKz4gICAgICAgYWNfcHJlcHJvY19vaz1mYWxzZQorPiBmb3IgYWNfY3h4X3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcworPiBkbworPiAgICMgVXNlIGEgaGVhZGVyIGZpbGUgdGhhdCBjb21lcyB3aXRoIGdjYywgc28gY29uZmlndXJpbmcgZ2xpYmMKKz4gICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KKz4gICAjIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKz4gICAjIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4KKz4gICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAorPiAgICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuICJTeW50YXggZXJyb3IiIGlzIGhlcmUgdG8gY2F0Y2ggdGhpcyBjYXNlLgorPiAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKz4gI2lmZGVmIF9fU1REQ19fCis+ICMgaW5jbHVkZSA8bGltaXRzLmg+Cis+ICNlbHNlCis+ICMgaW5jbHVkZSA8YXNzZXJ0Lmg+Cis+ICNlbmRpZgorPiAJCSAgICAgU3ludGF4IGVycm9yCis+IF9BQ0VPRgorPiBpZiB7IChhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIKKz4gY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPmNvbmZ0ZXN0LmVyMQorPiAgIGFjX3N0YXR1cz0kPworPiAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCis+ICAgcm0gLWYgY29uZnRlc3QuZXIxCis+ICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGwgJiYgeworPiAJIHRlc3QgLXogIiRhY19jeHhfcHJlcHJvY193YXJuX2ZsYWckYWNfY3h4X3dlcnJvcl9mbGFnIiB8fAorPiAJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKz4gICAgICAgIH07IHRoZW4KKzI0NDcsMjQ1MWM1ODkyLDU4OTYKKzwgICBlY2hvICIkYWNfZXJyIiA+JjUKKzwgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPCAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzwgICBDWFhDUFA9L2xpYi9jcHAKKy0tLQorPiAgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Cis+IAorPiAgICMgQnJva2VuOiBmYWlscyBvbiB2YWxpZCBpbnB1dC4KKz4gY29udGludWUKKzI0NTMsMjQ4OGM1ODk4LDU5MzYKKzwgcm0gLWYgY29uZnRlc3QqCis8ICAgYWNfY3ZfcHJvZ19DWFhDUFA9IiRDWFhDUFAiCis8IGFjX2V4dD1DCis8ICMgQ1hYRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgorPCBhY19jcHA9JyRDWFhDUFAgJENQUEZMQUdTJworPCBhY19jb21waWxlPScke0NYWC1nKyt9IC1jICRDWFhGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworPCBhY19saW5rPScke0NYWC1nKyt9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDWFhGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JworPCBjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY3h4X2Nyb3NzCis8IGZpCis8IGZpCis8IENYWENQUD0iJGFjX2N2X3Byb2dfQ1hYQ1BQIgorPCBlY2hvICIkYWNfdCIiJENYWENQUCIgMT4mNgorPCAKKzwgYWNfc2FmZT1gZWNobyAiaW9zdHJlYW0uaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCis8IGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBpb3N0cmVhbS5oIiIuLi4gJGFjX2MiIDE+JjYKKzwgZWNobyAiY29uZmlndXJlOjI0Njk6IGNoZWNraW5nIGZvciBpb3N0cmVhbS5oIiA+JjUKKzwgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCis8ICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKzwgZWxzZQorPCAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKzwgI2xpbmUgMjQ3NCAiY29uZmlndXJlIgorPCAjaW5jbHVkZSAiY29uZmRlZnMuaCIKKzwgI2luY2x1ZGUgPGlvc3RyZWFtLmg+Cis8IEVPRgorPCBhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgorPCB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0Nzk6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Cis8IGFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKKzwgaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KKzwgICBybSAtcmYgY29uZnRlc3QqCis8ICAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKKzwgZWxzZQorPCAgIGVjaG8gIiRhY19lcnIiID4mNQorPCAgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis8ICAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Cis8ICAgcm0gLXJmIGNvbmZ0ZXN0KgorPCAgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKKy0tLQorPiAKKz4gcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKKz4gCis+ICAgIyBPSywgd29ya3Mgb24gc2FuZSBjYXNlcy4gIE5vdyBjaGVjayB3aGV0aGVyIG5vbmV4aXN0ZW50IGhlYWRlcnMKKz4gICAjIGNhbiBiZSBkZXRlY3RlZCBhbmQgaG93LgorPiAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKz4gI2luY2x1ZGUgPGFjX25vbmV4aXN0ZW50Lmg+Cis+IF9BQ0VPRgorPiBpZiB7IChhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIKKz4gY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPmNvbmZ0ZXN0LmVyMQorPiAgIGFjX3N0YXR1cz0kPworPiAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCis+ICAgcm0gLWYgY29uZnRlc3QuZXIxCis+ICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGwgJiYgeworPiAJIHRlc3QgLXogIiRhY19jeHhfcHJlcHJvY193YXJuX2ZsYWckYWNfY3h4X3dlcnJvcl9mbGFnIiB8fAorPiAJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKz4gICAgICAgIH07IHRoZW4KKz4gICAjIEJyb2tlbjogc3VjY2VzcyBvbiBpbnZhbGlkIGlucHV0LgorPiBjb250aW51ZQorPiBlbHNlCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCis+ICAgIyBQYXNzZXMgYm90aCB0ZXN0cy4KKz4gYWNfcHJlcHJvY19vaz06Cis+IGJyZWFrCisyNDkwYzU5MzgsNjAwMworPCBybSAtZiBjb25mdGVzdCoKKy0tLQorPiAKKz4gcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKKz4gCis+IGRvbmUKKz4gIyBCZWNhdXNlIG9mIGBicmVhaycsIF9BQ19QUkVQUk9DX0lGRUxTRSdzIGNsZWFuaW5nIGNvZGUgd2FzIHNraXBwZWQuCis+IHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0Cis+IGlmICRhY19wcmVwcm9jX29rOyB0aGVuCis+ICAgYnJlYWsKKz4gZmkKKz4gCis+ICAgICBkb25lCis+ICAgICBhY19jdl9wcm9nX0NYWENQUD0kQ1hYQ1BQCis+IAorPiBmaQorPiAgIENYWENQUD0kYWNfY3ZfcHJvZ19DWFhDUFAKKz4gZWxzZQorPiAgIGFjX2N2X3Byb2dfQ1hYQ1BQPSRDWFhDUFAKKz4gZmkKKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENYWENQUCIgPiY1Cis+ICRhc19lY2hvICIkQ1hYQ1BQIiA+JjY7IH0KKz4gYWNfcHJlcHJvY19vaz1mYWxzZQorPiBmb3IgYWNfY3h4X3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcworPiBkbworPiAgICMgVXNlIGEgaGVhZGVyIGZpbGUgdGhhdCBjb21lcyB3aXRoIGdjYywgc28gY29uZmlndXJpbmcgZ2xpYmMKKz4gICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KKz4gICAjIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKz4gICAjIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4KKz4gICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAorPiAgICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuICJTeW50YXggZXJyb3IiIGlzIGhlcmUgdG8gY2F0Y2ggdGhpcyBjYXNlLgorPiAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKz4gI2lmZGVmIF9fU1REQ19fCis+ICMgaW5jbHVkZSA8bGltaXRzLmg+Cis+ICNlbHNlCis+ICMgaW5jbHVkZSA8YXNzZXJ0Lmg+Cis+ICNlbmRpZgorPiAJCSAgICAgU3ludGF4IGVycm9yCis+IF9BQ0VPRgorPiBpZiB7IChhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIKKz4gY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPmNvbmZ0ZXN0LmVyMQorPiAgIGFjX3N0YXR1cz0kPworPiAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCis+ICAgcm0gLWYgY29uZnRlc3QuZXIxCis+ICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGwgJiYgeworPiAJIHRlc3QgLXogIiRhY19jeHhfcHJlcHJvY193YXJuX2ZsYWckYWNfY3h4X3dlcnJvcl9mbGFnIiB8fAorPiAJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKz4gICAgICAgIH07IHRoZW4KKz4gICA6Cis+IGVsc2UKKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKz4gICAjIEJyb2tlbjogZmFpbHMgb24gdmFsaWQgaW5wdXQuCis+IGNvbnRpbnVlCisyNDkyLDI0OTNjNjAwNSw2MDUxCis8IGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCis8ICAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorLS0tCis+IAorPiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAorPiAKKz4gICAjIE9LLCB3b3JrcyBvbiBzYW5lIGNhc2VzLiAgTm93IGNoZWNrIHdoZXRoZXIgbm9uZXhpc3RlbnQgaGVhZGVycworPiAgICMgY2FuIGJlIGRldGVjdGVkIGFuZCBob3cuCis+ICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGNvbmZkZWZzLmguICAqLworPiBfQUNFT0YKKz4gY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Cis+IGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogZW5kIGNvbmZkZWZzLmguICAqLworPiAjaW5jbHVkZSA8YWNfbm9uZXhpc3RlbnQuaD4KKz4gX0FDRU9GCis+IGlmIHsgKGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+Y29uZnRlc3QuZXIxCis+ICAgYWNfc3RhdHVzPSQ/Cis+ICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKz4gICBybSAtZiBjb25mdGVzdC5lcjEKKz4gICBjYXQgY29uZnRlc3QuZXJyID4mNQorPiAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cis+ICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbCAmJiB7Cis+IAkgdGVzdCAteiAiJGFjX2N4eF9wcmVwcm9jX3dhcm5fZmxhZyRhY19jeHhfd2Vycm9yX2ZsYWciIHx8Cis+IAkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorPiAgICAgICAgfTsgdGhlbgorPiAgICMgQnJva2VuOiBzdWNjZXNzIG9uIGludmFsaWQgaW5wdXQuCis+IGNvbnRpbnVlCis+IGVsc2UKKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKz4gICAjIFBhc3NlcyBib3RoIHRlc3RzLgorPiBhY19wcmVwcm9jX29rPToKKz4gYnJlYWsKKz4gZmkKKz4gCis+IHJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0Cis+IAorPiBkb25lCis+ICMgQmVjYXVzZSBvZiBgYnJlYWsnLCBfQUNfUFJFUFJPQ19JRkVMU0UncyBjbGVhbmluZyBjb2RlIHdhcyBza2lwcGVkLgorPiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAorPiBpZiAkYWNfcHJlcHJvY19vazsgdGhlbgorMjQ5NmM2MDU0LDYxOTUKKzwgICBlY2hvICIkYWNfdCIibm8iIDE+JjYKKy0tLQorPiAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KKz4geyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IEMrKyBwcmVwcm9jZXNzb3IgXCIkQ1hYQ1BQXCIgZmFpbHMgc2FuaXR5IGNoZWNrCis+IFNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IEMrKyBwcmVwcm9jZXNzb3IgXCIkQ1hYQ1BQXCIgZmFpbHMgc2FuaXR5IGNoZWNrCis+IFNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQorPiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07IH0KKz4gZmkKKz4gCis+IGFjX2V4dD1jcHAKKz4gYWNfY3BwPSckQ1hYQ1BQICRDUFBGTEFHUycKKz4gYWNfY29tcGlsZT0nJENYWCAtYyAkQ1hYRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworPiBhY19saW5rPSckQ1hYIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworPiBhY19jb21waWxlcl9nbnU9JGFjX2N2X2N4eF9jb21waWxlcl9nbnUKKz4gCis+IAorPiBpZiB0ZXN0ICIke2FjX2N2X2hlYWRlcl9pb3N0cmVhbV9oK3NldH0iID0gc2V0OyB0aGVuCis+ICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBpb3N0cmVhbS5oIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGlvc3RyZWFtLmguLi4gIiA+JjY7IH0KKz4gaWYgdGVzdCAiJHthY19jdl9oZWFkZXJfaW9zdHJlYW1faCtzZXR9IiA9IHNldDsgdGhlbgorPiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Cis+IGZpCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9oZWFkZXJfaW9zdHJlYW1faCIgPiY1Cis+ICRhc19lY2hvICIkYWNfY3ZfaGVhZGVyX2lvc3RyZWFtX2giID4mNjsgfQorPiBlbHNlCis+ICAgIyBJcyB0aGUgaGVhZGVyIGNvbXBpbGFibGU/Cis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBpb3N0cmVhbS5oIHVzYWJpbGl0eSIgPiY1Cis+ICRhc19lY2hvX24gImNoZWNraW5nIGlvc3RyZWFtLmggdXNhYmlsaXR5Li4uICIgPiY2OyB9Cis+IGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKz4gJGFjX2luY2x1ZGVzX2RlZmF1bHQKKz4gI2luY2x1ZGUgPGlvc3RyZWFtLmg+Cis+IF9BQ0VPRgorPiBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Cis+IGlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorPiAgIGFjX3N0YXR1cz0kPworPiAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCis+ICAgcm0gLWYgY29uZnRlc3QuZXIxCis+ICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKz4gCSB0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIiB8fAorPiAJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKz4gICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCis+ICAgYWNfaGVhZGVyX2NvbXBpbGVyPXllcworPiBlbHNlCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCis+IAlhY19oZWFkZXJfY29tcGlsZXI9bm8KKz4gZmkKKz4gCis+IHJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjUKKz4gJGFzX2VjaG8gIiRhY19oZWFkZXJfY29tcGlsZXIiID4mNjsgfQorPiAKKz4gIyBJcyB0aGUgaGVhZGVyIHByZXNlbnQ/Cis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBpb3N0cmVhbS5oIHByZXNlbmNlIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgaW9zdHJlYW0uaCBwcmVzZW5jZS4uLiAiID4mNjsgfQorPiBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogY29uZmRlZnMuaC4gICovCis+IF9BQ0VPRgorPiBjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKz4gY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBlbmQgY29uZmRlZnMuaC4gICovCis+ICNpbmNsdWRlIDxpb3N0cmVhbS5oPgorPiBfQUNFT0YKKz4gaWYgeyAoYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj5jb25mdGVzdC5lcjEKKz4gICBhY19zdGF0dXM9JD8KKz4gICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorPiAgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorPiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsICYmIHsKKz4gCSB0ZXN0IC16ICIkYWNfY3h4X3ByZXByb2Nfd2Fybl9mbGFnJGFjX2N4eF93ZXJyb3JfZmxhZyIgfHwKKz4gCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCis+ICAgICAgICB9OyB0aGVuCis+ICAgYWNfaGVhZGVyX3ByZXByb2M9eWVzCis+IGVsc2UKKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKz4gICBhY19oZWFkZXJfcHJlcHJvYz1ubworPiBmaQorPiAKKz4gcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9wcmVwcm9jIiA+JjUKKz4gJGFzX2VjaG8gIiRhY19oZWFkZXJfcHJlcHJvYyIgPiY2OyB9Cis+IAorPiAjIFNvPyAgV2hhdCBhYm91dCB0aGlzIGhlYWRlcj8KKz4gY2FzZSAkYWNfaGVhZGVyX2NvbXBpbGVyOiRhY19oZWFkZXJfcHJlcHJvYzokYWNfY3h4X3ByZXByb2Nfd2Fybl9mbGFnIGluCis+ICAgeWVzOm5vOiApCis+ICAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogaW9zdHJlYW0uaDogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGlvc3RyZWFtLmg6IGFjY2VwdGVkIGJ5IHRoZSBjb21waWxlciwgcmVqZWN0ZWQgYnkgdGhlIHByZXByb2Nlc3NvciEiID4mMjt9Cis+ICAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogaW9zdHJlYW0uaDogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGlvc3RyZWFtLmg6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mMjt9Cis+ICAgICBhY19oZWFkZXJfcHJlcHJvYz15ZXMKKz4gICAgIDs7Cis+ICAgbm86eWVzOiogKQorPiAgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IGlvc3RyZWFtLmg6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGlvc3RyZWFtLmg6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiYyO30KKz4gICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBpb3N0cmVhbS5oOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogaW9zdHJlYW0uaDogICAgIGNoZWNrIGZvciBtaXNzaW5nIHByZXJlcXVpc2l0ZSBoZWFkZXJzPyIgPiYyO30KKz4gICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBpb3N0cmVhbS5oOiBzZWUgdGhlIEF1dG9jb25mIGRvY3VtZW50YXRpb24iID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBpb3N0cmVhbS5oOiBzZWUgdGhlIEF1dG9jb25mIGRvY3VtZW50YXRpb24iID4mMjt9Cis+ICAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogaW9zdHJlYW0uaDogICAgIHNlY3Rpb24gXCJQcmVzZW50IEJ1dCBDYW5ub3QgQmUgQ29tcGlsZWRcIiIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGlvc3RyZWFtLmg6ICAgICBzZWN0aW9uIFwiUHJlc2VudCBCdXQgQ2Fubm90IEJlIENvbXBpbGVkXCIiID4mMjt9Cis+ICAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogaW9zdHJlYW0uaDogcHJvY2VlZGluZyB3aXRoIHRoZSBwcmVwcm9jZXNzb3IncyByZXN1bHQiID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBpb3N0cmVhbS5oOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiYyO30KKz4gICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiBpb3N0cmVhbS5oOiBpbiB0aGUgZnV0dXJlLCB0aGUgY29tcGlsZXIgd2lsbCB0YWtlIHByZWNlZGVuY2UiID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBpb3N0cmVhbS5oOiBpbiB0aGUgZnV0dXJlLCB0aGUgY29tcGlsZXIgd2lsbCB0YWtlIHByZWNlZGVuY2UiID4mMjt9Cis+IAorPiAgICAgOzsKKz4gZXNhYworPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGlvc3RyZWFtLmgiID4mNQorPiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgaW9zdHJlYW0uaC4uLiAiID4mNjsgfQorPiBpZiB0ZXN0ICIke2FjX2N2X2hlYWRlcl9pb3N0cmVhbV9oK3NldH0iID0gc2V0OyB0aGVuCis+ICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKz4gZWxzZQorPiAgIGFjX2N2X2hlYWRlcl9pb3N0cmVhbV9oPSRhY19oZWFkZXJfcHJlcHJvYworPiBmaQorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX2lvc3RyZWFtX2giID4mNQorPiAkYXNfZWNobyAiJGFjX2N2X2hlYWRlcl9pb3N0cmVhbV9oIiA+JjY7IH0KKz4gCisyNDk4YTYxOTgKKz4gCisyNTAwLDI1MDdjNjIwMCw2MjEwCis8ICAgICAgICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgb3N0cmVhbSBpcyByZWFsbHkgZGVmaW5lZCIiLi4uICRhY19jIiAxPiY2Cis8IGVjaG8gImNvbmZpZ3VyZToyNTAyOiBjaGVja2luZyB3aGV0aGVyIG9zdHJlYW0gaXMgcmVhbGx5IGRlZmluZWQiID4mNQorPCAgICAgICAgICAgICBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaW9zdHJlYW1fb2snK3NldH0nYFwiID0gc2V0IjsgdGhlbgorPCAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Cis8IGVsc2UKKzwgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCis8ICNsaW5lIDI1MDcgImNvbmZpZ3VyZSIKKzwgI2luY2x1ZGUgImNvbmZkZWZzLmgiCistLS0KKz4gICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgb3N0cmVhbSBpcyByZWFsbHkgZGVmaW5lZCIgPiY1Cis+ICRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgb3N0cmVhbSBpcyByZWFsbHkgZGVmaW5lZC4uLiAiID4mNjsgfQorPiAgICAgICAgICAgICBpZiB0ZXN0ICIke2FjX2N2X2lvc3RyZWFtX29rK3NldH0iID0gc2V0OyB0aGVuCis+ICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKz4gZWxzZQorPiAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKzI1MDljNjIxMiw2MjE0Cis8IGludCBtYWluKCkgeworLS0tCis+IGludAorPiBtYWluICgpCis+IHsKKzI1MTEsMjUxNGM2MjE2LDYyNDAKKzwgOyByZXR1cm4gMDsgfQorPCBFT0YKKzwgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNTE0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKzwgICBybSAtcmYgY29uZnRlc3QqCistLS0KKz4gICA7Cis+ICAgcmV0dXJuIDA7Cis+IH0KKz4gX0FDRU9GCis+IHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0Cis+IGlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQorPiAgIGFjX3N0YXR1cz0kPworPiAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCis+ICAgcm0gLWYgY29uZnRlc3QuZXIxCis+ICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKz4gCSB0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIiB8fAorPiAJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKz4gICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgeworPiAJIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzIHx8Cis+IAkgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQKKz4gICAgICAgIH07IHRoZW4KKzI1MTcsMjUyMGM2MjQzLDYyNDYKKzwgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPCAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzwgICBhY19jdl9pb3N0cmVhbV9vaz1ubworLS0tCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCis+IAlhY19jdl9pb3N0cmVhbV9vaz1ubworMjUyMmM2MjQ4LDYyNTEKKzwgcm0gLWYgY29uZnRlc3QqCistLS0KKz4gCis+IHJtIC1yZiBjb25mdGVzdC5kU1lNCis+IHJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCis+ICAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisyNTI1YzYyNTQsNjI1NQorPCAgICAgICAgICAgICBlY2hvICIkYWNfdCIiJGFjX2N2X2lvc3RyZWFtX29rIiAxPiY2CistLS0KKz4gICAgICAgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2lvc3RyZWFtX29rIiA+JjUKKz4gJGFzX2VjaG8gIiRhY19jdl9pb3N0cmVhbV9vayIgPiY2OyB9CisyNTQ1YzYyNzUsNjI3NworPCAgICAgICAgICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICR7d2l0aHZhbH0gaW9zdHJlYW0gaXMgbm90IGF2YWlsYWJsZSIgMT4mMjsgZXhpdCAxOyB9CistLS0KKz4gICAgICAgICAgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6ICR7d2l0aHZhbH0gaW9zdHJlYW0gaXMgbm90IGF2YWlsYWJsZSIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiAke3dpdGh2YWx9IGlvc3RyZWFtIGlzIG5vdCBhdmFpbGFibGUiID4mMjt9Cis+ICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorMjU1MWQ2MjgyCis8ICMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KKzI1NTMsMjU1NWM2Mjg0LDYyODcKKzwgYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworPCBhY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCis8IGNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworLS0tCis+IGFjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKKz4gYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKKz4gYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorPiAKKzI1NTgsMjU2MWM2MjkwLDYyOTMKKzwgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBieXRlIG9yZGVyaW5nIGlzIGJpZ2VuZGlhbiIiLi4uICRhY19jIiAxPiY2Cis8IGVjaG8gImNvbmZpZ3VyZToyNTYwOiBjaGVja2luZyB3aGV0aGVyIGJ5dGUgb3JkZXJpbmcgaXMgYmlnZW5kaWFuIiA+JjUKKzwgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfYmlnZW5kaWFuJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKzwgICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorLS0tCis+ICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciBieXRlIG9yZGVyaW5nIGlzIGJpZ2VuZGlhbiIgPiY1Cis+ICRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgYnl0ZSBvcmRlcmluZyBpcyBiaWdlbmRpYW4uLi4gIiA+JjY7IH0KKz4gaWYgdGVzdCAiJHthY19jdl9jX2JpZ2VuZGlhbitzZXR9IiA9IHNldDsgdGhlbgorPiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CisyNTY0LDI1NjdjNjI5Niw2MzQ5Cis8ICMgU2VlIGlmIHN5cy9wYXJhbS5oIGRlZmluZXMgdGhlIEJZVEVfT1JERVIgbWFjcm8uCis8IGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKzwgI2xpbmUgMjU2NyAiY29uZmlndXJlIgorPCAjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy0tLQorPiAgICAgIyBTZWUgaWYgd2UncmUgZGVhbGluZyB3aXRoIGEgdW5pdmVyc2FsIGNvbXBpbGVyLgorPiAgICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGNvbmZkZWZzLmguICAqLworPiBfQUNFT0YKKz4gY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Cis+IGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogZW5kIGNvbmZkZWZzLmguICAqLworPiAjaWZuZGVmIF9fQVBQTEVfQ0NfXworPiAJICAgICAgIG5vdCBhIHVuaXZlcnNhbCBjYXBhYmxlIGNvbXBpbGVyCis+IAkgICAgICNlbmRpZgorPiAJICAgICB0eXBlZGVmIGludCBkdW1teTsKKz4gCis+IF9BQ0VPRgorPiBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Cis+IGlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorPiAgIGFjX3N0YXR1cz0kPworPiAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCis+ICAgcm0gLWYgY29uZnRlc3QuZXIxCis+ICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKz4gCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKz4gCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCis+ICAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorPiAKKz4gCSMgQ2hlY2sgZm9yIHBvdGVudGlhbCAtYXJjaCBmbGFncy4gIEl0IGlzIG5vdCB1bml2ZXJzYWwgdW5sZXNzCis+IAkjIHRoZXJlIGFyZSBzb21lIC1hcmNoIGZsYWdzLiAgTm90ZSB0aGF0ICpwcGMqIGFsc28gbWF0Y2hlcworPiAJIyBwcGM2NC4gIFRoaXMgY2hlY2sgaXMgYWxzbyByYXRoZXIgbGVzcyB0aGFuIGlkZWFsLgorPiAJY2FzZSAiJHtDQ30gJHtDRkxBR1N9ICR7Q1BQRkxBR1N9ICR7TERGTEFHU30iIGluICAjKAorPiAJICAqLWFyY2gqcHBjKnwqLWFyY2gqaTM4Nip8Ki1hcmNoKng4Nl82NCopIGFjX2N2X2NfYmlnZW5kaWFuPXVuaXZlcnNhbDs7Cis+IAllc2FjCis+IGVsc2UKKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKz4gCis+IGZpCis+IAorPiBybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKz4gICAgIGlmIHRlc3QgJGFjX2N2X2NfYmlnZW5kaWFuID0gdW5rbm93bjsgdGhlbgorPiAgICAgICAjIFNlZSBpZiBzeXMvcGFyYW0uaCBkZWZpbmVzIHRoZSBCWVRFX09SREVSIG1hY3JvLgorPiAgICAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogY29uZmRlZnMuaC4gICovCis+IF9BQ0VPRgorPiBjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKz4gY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBlbmQgY29uZmRlZnMuaC4gICovCisyNTY5LDI1NzBjNjM1MQorPCAjaW5jbHVkZSA8c3lzL3BhcmFtLmg+Cis8IGludCBtYWluKCkgeworLS0tCis+IAkgICAgICNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKzI1NzIsMjU3OGM2MzUzLDYzODMKKzwgI2lmICFCWVRFX09SREVSIHx8ICFCSUdfRU5ESUFOIHx8ICFMSVRUTEVfRU5ESUFOCis8ICBib2d1cyBlbmRpYW4gbWFjcm9zCis8ICNlbmRpZgorPCA7IHJldHVybiAwOyB9Cis8IEVPRgorPCBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI1Nzg6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KKzwgICBybSAtcmYgY29uZnRlc3QqCistLS0KKz4gaW50Cis+IG1haW4gKCkKKz4geworPiAjaWYgISAoZGVmaW5lZCBCWVRFX09SREVSICYmIGRlZmluZWQgQklHX0VORElBTiBcCis+IAkJICAgICAmJiBkZWZpbmVkIExJVFRMRV9FTkRJQU4gJiYgQllURV9PUkRFUiAmJiBCSUdfRU5ESUFOIFwKKz4gCQkgICAgICYmIExJVFRMRV9FTkRJQU4pCis+IAkgICAgICBib2d1cyBlbmRpYW4gbWFjcm9zCis+IAkgICAgICNlbmRpZgorPiAKKz4gICA7Cis+ICAgcmV0dXJuIDA7Cis+IH0KKz4gX0FDRU9GCis+IHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKKz4gaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKKz4gY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCis+ICAgYWNfc3RhdHVzPSQ/Cis+ICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKz4gICBybSAtZiBjb25mdGVzdC5lcjEKKz4gICBjYXQgY29uZnRlc3QuZXJyID4mNQorPiAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cis+ICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworPiAJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorPiAJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKz4gICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisyNTgwLDI1ODJjNjM4NSw2MzkwCis8IGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKzwgI2xpbmUgMjU4MiAiY29uZmlndXJlIgorPCAjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy0tLQorPiAJIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKzI1ODQsMjU4NWM2MzkyCis8ICNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKzwgaW50IG1haW4oKSB7CistLS0KKz4gCQkjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisyNTg2YTYzOTQsNjM5NgorPiBpbnQKKz4gbWFpbiAoKQorPiB7CisyNTg4LDI1OTNjNjM5OCw2NDIyCis8ICBub3QgYmlnIGVuZGlhbgorPCAjZW5kaWYKKzwgOyByZXR1cm4gMDsgfQorPCBFT0YKKzwgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNTkzOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCis8ICAgcm0gLXJmIGNvbmZ0ZXN0KgorLS0tCis+IAkJIG5vdCBiaWcgZW5kaWFuCis+IAkJI2VuZGlmCis+IAorPiAgIDsKKz4gICByZXR1cm4gMDsKKz4gfQorPiBfQUNFT0YKKz4gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorPiBpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKz4gICBhY19zdGF0dXM9JD8KKz4gICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorPiAgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorPiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Cis+IAkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Cis+IAkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorPiAgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKzI1OTYsMjU5OWM2NDI1LDY0MjgKKzwgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPCAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzwgICBhY19jdl9jX2JpZ2VuZGlhbj1ubworLS0tCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCis+IAlhY19jdl9jX2JpZ2VuZGlhbj1ubworMjYwMWM2NDMwLDY0MzEKKzwgcm0gLWYgY29uZnRlc3QqCistLS0KKz4gCis+IHJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorMjYwMywyNjA0YzY0MzMsNjQzNgorPCAgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis8ICAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CistLS0KKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKz4gCisyNjA2LDI2MjJjNjQzOCw2NDU5Cis8IHJtIC1mIGNvbmZ0ZXN0KgorPCBpZiB0ZXN0ICRhY19jdl9jX2JpZ2VuZGlhbiA9IHVua25vd247IHRoZW4KKzwgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKzwgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBydW4gdGVzdCBwcm9ncmFtIHdoaWxlIGNyb3NzIGNvbXBpbGluZyIgMT4mMjsgZXhpdCAxOyB9Cis8IGVsc2UKKzwgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCis8ICNsaW5lIDI2MTMgImNvbmZpZ3VyZSIKKzwgI2luY2x1ZGUgImNvbmZkZWZzLmgiCis8IG1haW4gKCkgeworPCAgIC8qIEFyZSB3ZSBsaXR0bGUgb3IgYmlnIGVuZGlhbj8gIEZyb20gSGFyYmlzb24mU3RlZWxlLiAgKi8KKzwgICB1bmlvbgorPCAgIHsKKzwgICAgIGxvbmcgbDsKKzwgICAgIGNoYXIgY1tzaXplb2YgKGxvbmcpXTsKKzwgICB9IHU7Cis8ICAgdS5sID0gMTsKKzwgICBleGl0ICh1LmNbc2l6ZW9mIChsb25nKSAtIDFdID09IDEpOworLS0tCis+IAorPiBybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKz4gICAgIGZpCis+ICAgICBpZiB0ZXN0ICRhY19jdl9jX2JpZ2VuZGlhbiA9IHVua25vd247IHRoZW4KKz4gICAgICAgIyBTZWUgaWYgPGxpbWl0cy5oPiBkZWZpbmVzIF9MSVRUTEVfRU5ESUFOIG9yIF9CSUdfRU5ESUFOIChlLmcuLCBTb2xhcmlzKS4KKz4gICAgICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGNvbmZkZWZzLmguICAqLworPiBfQUNFT0YKKz4gY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Cis+IGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogZW5kIGNvbmZkZWZzLmguICAqLworPiAjaW5jbHVkZSA8bGltaXRzLmg+Cis+IAorPiBpbnQKKz4gbWFpbiAoKQorPiB7Cis+ICNpZiAhIChkZWZpbmVkIF9MSVRUTEVfRU5ESUFOIHx8IGRlZmluZWQgX0JJR19FTkRJQU4pCis+IAkgICAgICBib2d1cyBlbmRpYW4gbWFjcm9zCis+IAkgICAgICNlbmRpZgorPiAKKz4gICA7Cis+ICAgcmV0dXJuIDA7CisyNjI0LDI2MzFjNjQ2MSw2NTE3Cis8IEVPRgorPCBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI2MjY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKKzwgdGhlbgorPCAgIGFjX2N2X2NfYmlnZW5kaWFuPW5vCis8IGVsc2UKKzwgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPCAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorPCAgIHJtIC1mciBjb25mdGVzdCoKKy0tLQorPiBfQUNFT0YKKz4gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorPiBpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKz4gICBhY19zdGF0dXM9JD8KKz4gICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorPiAgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorPiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Cis+IAkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Cis+IAkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorPiAgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKz4gICAjIEl0IGRvZXM7IG5vdyBzZWUgd2hldGhlciBpdCBkZWZpbmVkIHRvIF9CSUdfRU5ESUFOIG9yIG5vdC4KKz4gCSBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogY29uZmRlZnMuaC4gICovCis+IF9BQ0VPRgorPiBjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKz4gY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBlbmQgY29uZmRlZnMuaC4gICovCis+ICNpbmNsdWRlIDxsaW1pdHMuaD4KKz4gCis+IGludAorPiBtYWluICgpCis+IHsKKz4gI2lmbmRlZiBfQklHX0VORElBTgorPiAJCSBub3QgYmlnIGVuZGlhbgorPiAJCSNlbmRpZgorPiAKKz4gICA7Cis+ICAgcmV0dXJuIDA7Cis+IH0KKz4gX0FDRU9GCis+IHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKKz4gaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKKz4gY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCis+ICAgYWNfc3RhdHVzPSQ/Cis+ICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKz4gICBybSAtZiBjb25mdGVzdC5lcjEKKz4gICBjYXQgY29uZnRlc3QuZXJyID4mNQorPiAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cis+ICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworPiAJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorPiAJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKz4gICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCisyNjMyYTY1MTksNjUzMQorPiBlbHNlCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCis+IAlhY19jdl9jX2JpZ2VuZGlhbj1ubworPiBmaQorPiAKKz4gcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Cis+IGVsc2UKKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKz4gCisyNjM0YzY1MzMsNjYwMworPCBybSAtZnIgY29uZnRlc3QqCistLS0KKz4gCis+IHJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorPiAgICAgZmkKKz4gICAgIGlmIHRlc3QgJGFjX2N2X2NfYmlnZW5kaWFuID0gdW5rbm93bjsgdGhlbgorPiAgICAgICAjIENvbXBpbGUgYSB0ZXN0IHByb2dyYW0uCis+ICAgICAgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCis+ICAgIyBUcnkgdG8gZ3Vlc3MgYnkgZ3JlcHBpbmcgdmFsdWVzIGZyb20gYW4gb2JqZWN0IGZpbGUuCis+IAkgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGNvbmZkZWZzLmguICAqLworPiBfQUNFT0YKKz4gY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Cis+IGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogZW5kIGNvbmZkZWZzLmguICAqLworPiBzaG9ydCBpbnQgYXNjaWlfbW1bXSA9Cis+IAkJICB7IDB4NDI0OSwgMHg0NzY1LCAweDZFNDQsIDB4Njk2MSwgMHg2RTUzLCAweDc5NTMsIDAgfTsKKz4gCQlzaG9ydCBpbnQgYXNjaWlfaWlbXSA9Cis+IAkJICB7IDB4Njk0QywgMHg1NDU0LCAweDY1NkMsIDB4NkU0NSwgMHg2OTQ0LCAweDZFNjEsIDAgfTsKKz4gCQlpbnQgdXNlX2FzY2lpIChpbnQgaSkgeworPiAJCSAgcmV0dXJuIGFzY2lpX21tW2ldICsgYXNjaWlfaWlbaV07Cis+IAkJfQorPiAJCXNob3J0IGludCBlYmNkaWNfaWlbXSA9Cis+IAkJICB7IDB4ODlEMywgMHhFM0UzLCAweDg1OTMsIDB4OTVDNSwgMHg4OUM0LCAweDk1ODEsIDAgfTsKKz4gCQlzaG9ydCBpbnQgZWJjZGljX21tW10gPQorPiAJCSAgeyAweEMyQzksIDB4Qzc4NSwgMHg5NUM0LCAweDg5ODEsIDB4OTVFMiwgMHhBOEUyLCAwIH07Cis+IAkJaW50IHVzZV9lYmNkaWMgKGludCBpKSB7Cis+IAkJICByZXR1cm4gZWJjZGljX21tW2ldICsgZWJjZGljX2lpW2ldOworPiAJCX0KKz4gCQlleHRlcm4gaW50IGZvbzsKKz4gCis+IGludAorPiBtYWluICgpCis+IHsKKz4gcmV0dXJuIHVzZV9hc2NpaSAoZm9vKSA9PSB1c2VfZWJjZGljIChmb28pOworPiAgIDsKKz4gICByZXR1cm4gMDsKKz4gfQorPiBfQUNFT0YKKz4gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorPiBpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKz4gICBhY19zdGF0dXM9JD8KKz4gICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorPiAgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorPiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Cis+IAkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Cis+IAkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorPiAgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKz4gICBpZiBncmVwIEJJR2VuRGlhblN5UyBjb25mdGVzdC4kYWNfb2JqZXh0ID4vZGV2L251bGw7IHRoZW4KKz4gCSAgICAgIGFjX2N2X2NfYmlnZW5kaWFuPXllcworPiAJICAgIGZpCis+IAkgICAgaWYgZ3JlcCBMaVRUbGVFbkRpYW4gY29uZnRlc3QuJGFjX29iamV4dCA+L2Rldi9udWxsIDsgdGhlbgorPiAJICAgICAgaWYgdGVzdCAiJGFjX2N2X2NfYmlnZW5kaWFuIiA9IHVua25vd247IHRoZW4KKz4gCQlhY19jdl9jX2JpZ2VuZGlhbj1ubworPiAJICAgICAgZWxzZQorPiAJCSMgZmluZGluZyBib3RoIHN0cmluZ3MgaXMgdW5saWtlbHkgdG8gaGFwcGVuLCBidXQgd2hvIGtub3dzPworPiAJCWFjX2N2X2NfYmlnZW5kaWFuPXVua25vd24KKz4gCSAgICAgIGZpCis+IAkgICAgZmkKKz4gZWxzZQorPiAgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Cis+IAorPiAKKzI2MzZhNjYwNiw2NjYxCis+IHJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorPiBlbHNlCis+ICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGNvbmZkZWZzLmguICAqLworPiBfQUNFT0YKKz4gY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Cis+IGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogZW5kIGNvbmZkZWZzLmguICAqLworPiAkYWNfaW5jbHVkZXNfZGVmYXVsdAorPiBpbnQKKz4gbWFpbiAoKQorPiB7Cis+IAorPiAJICAgICAvKiBBcmUgd2UgbGl0dGxlIG9yIGJpZyBlbmRpYW4/ICBGcm9tIEhhcmJpc29uJlN0ZWVsZS4gICovCis+IAkgICAgIHVuaW9uCis+IAkgICAgIHsKKz4gCSAgICAgICBsb25nIGludCBsOworPiAJICAgICAgIGNoYXIgY1tzaXplb2YgKGxvbmcgaW50KV07Cis+IAkgICAgIH0gdTsKKz4gCSAgICAgdS5sID0gMTsKKz4gCSAgICAgcmV0dXJuIHUuY1tzaXplb2YgKGxvbmcgaW50KSAtIDFdID09IDE7Cis+IAorPiAgIDsKKz4gICByZXR1cm4gMDsKKz4gfQorPiBfQUNFT0YKKz4gcm0gLWYgY29uZnRlc3QkYWNfZXhlZXh0Cis+IGlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2xpbmsiKSAyPiY1Cis+ICAgYWNfc3RhdHVzPSQ/Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCis+ICAgeyAoY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfdHJ5IikgMj4mNQorPiAgIGFjX3N0YXR1cz0kPworPiAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cis+ICAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KKz4gICBhY19jdl9jX2JpZ2VuZGlhbj1ubworPiBlbHNlCis+ICAgJGFzX2VjaG8gIiRhc19tZTogcHJvZ3JhbSBleGl0ZWQgd2l0aCBzdGF0dXMgJGFjX3N0YXR1cyIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Cis+IAorPiAoIGV4aXQgJGFjX3N0YXR1cyApCis+IGFjX2N2X2NfYmlnZW5kaWFuPXllcworMjYzN2E2NjYzLDY2NjQKKz4gcm0gLXJmIGNvbmZ0ZXN0LmRTWU0KKz4gcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisyNjQwLDI2NDRkNjY2NgorPCBlY2hvICIkYWNfdCIiJGFjX2N2X2NfYmlnZW5kaWFuIiAxPiY2Cis8IGlmIHRlc3QgJGFjX2N2X2NfYmlnZW5kaWFuID0geWVzOyB0aGVuCis8ICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCis8ICNkZWZpbmUgV09SRFNfQklHRU5ESUFOIDEKKzwgRU9GCisyNjQ1YTY2NjgKKz4gICAgIGZpCisyNjQ2YTY2NzAsNjY5MworPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfY19iaWdlbmRpYW4iID4mNQorPiAkYXNfZWNobyAiJGFjX2N2X2NfYmlnZW5kaWFuIiA+JjY7IH0KKz4gIGNhc2UgJGFjX2N2X2NfYmlnZW5kaWFuIGluICMoCis+ICAgIHllcykKKz4gICAgICBjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorPiAjZGVmaW5lIFdPUkRTX0JJR0VORElBTiAxCis+IF9BQ0VPRgorPiA7OyAjKAorPiAgICBubykKKz4gICAgICAgOzsgIygKKz4gICAgdW5pdmVyc2FsKQorPiAKKz4gY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKz4gI2RlZmluZSBBQ19BUFBMRV9VTklWRVJTQUxfQlVJTEQgMQorPiBfQUNFT0YKKz4gCis+ICAgICAgOzsgIygKKz4gICAgKikKKz4gICAgICB7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogdW5rbm93biBlbmRpYW5uZXNzCis+ICBwcmVzZXR0aW5nIGFjX2N2X2NfYmlnZW5kaWFuPW5vIChvciB5ZXMpIHdpbGwgaGVscCIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiB1bmtub3duIGVuZGlhbm5lc3MKKz4gIHByZXNldHRpbmcgYWNfY3ZfY19iaWdlbmRpYW49bm8gKG9yIHllcykgd2lsbCBoZWxwIiA+JjI7fQorPiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0gOzsKKz4gIGVzYWMKKzI2NTksMjY2NmM2NzA2LDY3MjAKKzwgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG5sX2xhbmdpbmZvIiIuLi4gJGFjX2MiIDE+JjYKKzwgZWNobyAiY29uZmlndXJlOjI2NjE6IGNoZWNraW5nIGZvciBubF9sYW5naW5mbyIgPiY1Cis8IGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX25sX2xhbmdpbmZvJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKzwgICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorPCBlbHNlCis8ICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorPCAjbGluZSAyNjY2ICJjb25maWd1cmUiCis8ICNpbmNsdWRlICJjb25mZGVmcy5oIgorLS0tCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgbmxfbGFuZ2luZm8iID4mNQorPiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgbmxfbGFuZ2luZm8uLi4gIiA+JjY7IH0KKz4gaWYgdGVzdCAiJHthY19jdl9mdW5jX25sX2xhbmdpbmZvK3NldH0iID0gc2V0OyB0aGVuCis+ICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKz4gZWxzZQorPiAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKz4gLyogRGVmaW5lIG5sX2xhbmdpbmZvIHRvIGFuIGlubm9jdW91cyB2YXJpYW50LCBpbiBjYXNlIDxsaW1pdHMuaD4gZGVjbGFyZXMgbmxfbGFuZ2luZm8uCis+ICAgIEZvciBleGFtcGxlLCBIUC1VWCAxMWkgPGxpbWl0cy5oPiBkZWNsYXJlcyBnZXR0aW1lb2ZkYXkuICAqLworPiAjZGVmaW5lIG5sX2xhbmdpbmZvIGlubm9jdW91c19ubF9sYW5naW5mbworPiAKKzI2NjgsMjY3M2M2NzIyLDY3MjQKKzwgICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgbmxfbGFuZ2luZm8oKTsgYmVsb3cuICAqLworPCAjaW5jbHVkZSA8YXNzZXJ0Lmg+Cis8IC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCis8IC8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKzwgICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCis8IGNoYXIgbmxfbGFuZ2luZm8oKTsKKy0tLQorPiAgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciBubF9sYW5naW5mbyAoKTsgYmVsb3cuCis+ICAgICBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCis+ICAgICA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuICAqLworMjY3NWM2NzI2LDY3MzAKKzwgaW50IG1haW4oKSB7CistLS0KKz4gI2lmZGVmIF9fU1REQ19fCis+ICMgaW5jbHVkZSA8bGltaXRzLmg+Cis+ICNlbHNlCis+ICMgaW5jbHVkZSA8YXNzZXJ0Lmg+Cis+ICNlbmRpZgorMjY3NmE2NzMyLDY3NDAKKz4gI3VuZGVmIG5sX2xhbmdpbmZvCis+IAorPiAvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKz4gICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCis+ICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCis+ICNpZmRlZiBfX2NwbHVzcGx1cworPiBleHRlcm4gIkMiCis+ICNlbmRpZgorPiBjaGFyIG5sX2xhbmdpbmZvICgpOworMjY4MGM2NzQ0Cis8ICNpZiBkZWZpbmVkIChfX3N0dWJfbmxfbGFuZ2luZm8pIHx8IGRlZmluZWQgKF9fc3R1Yl9fX25sX2xhbmdpbmZvKQorLS0tCis+ICNpZiBkZWZpbmVkIF9fc3R1Yl9ubF9sYW5naW5mbyB8fCBkZWZpbmVkIF9fc3R1Yl9fX25sX2xhbmdpbmZvCisyNjgyLDI2ODNkNjc0NQorPCAjZWxzZQorPCBubF9sYW5naW5mbygpOworMjY4NiwyNzAxYzY3NDgsNjc5MQorPCA7IHJldHVybiAwOyB9Cis8IEVPRgorPCBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI2ODk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzwgICBldmFsICJhY19jdl9mdW5jX25sX2xhbmdpbmZvPXllcyIKKzwgZWxzZQorPCAgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis8ICAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Cis8ICAgcm0gLXJmIGNvbmZ0ZXN0KgorPCAgIGV2YWwgImFjX2N2X2Z1bmNfbmxfbGFuZ2luZm89bm8iCis8IGZpCis8IHJtIC1mIGNvbmZ0ZXN0KgorPCBmaQorPCAKKzwgaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nbmxfbGFuZ2luZm9gXCIgPSB5ZXMiOyB0aGVuCis8ICAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorLS0tCis+IGludAorPiBtYWluICgpCis+IHsKKz4gcmV0dXJuIG5sX2xhbmdpbmZvICgpOworPiAgIDsKKz4gICByZXR1cm4gMDsKKz4gfQorPiBfQUNFT0YKKz4gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKKz4gaWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKKz4gY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCis+ICAgYWNfc3RhdHVzPSQ/Cis+ICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKz4gICBybSAtZiBjb25mdGVzdC5lcjEKKz4gICBjYXQgY29uZnRlc3QuZXJyID4mNQorPiAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cis+ICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworPiAJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorPiAJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKz4gICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgeworPiAJIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzIHx8Cis+IAkgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQKKz4gICAgICAgIH07IHRoZW4KKz4gICBhY19jdl9mdW5jX25sX2xhbmdpbmZvPXllcworPiBlbHNlCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCis+IAlhY19jdl9mdW5jX25sX2xhbmdpbmZvPW5vCis+IGZpCis+IAorPiBybSAtcmYgY29uZnRlc3QuZFNZTQorPiBybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorPiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorPiBmaQorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfZnVuY19ubF9sYW5naW5mbyIgPiY1Cis+ICRhc19lY2hvICIkYWNfY3ZfZnVuY19ubF9sYW5naW5mbyIgPiY2OyB9Cis+IGlmIHRlc3QgIngkYWNfY3ZfZnVuY19ubF9sYW5naW5mbyIgPSB4IiJ5ZXM7IHRoZW4KKzI3MDQsMjcwNWM2Nzk0Cis8ICAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Cis8IFVfSEFWRV9OTF9MQU5HSU5GTz0wCistLS0KKz4gICBVX0hBVkVfTkxfTEFOR0lORk89MAorMjcxMCwyNzEzYzY3OTksNjgwMgorPCAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBubF9sYW5naW5mbydzIGFyZ3VtZW50IHRvIG9idGFpbiB0aGUgY29kZXNldCIiLi4uICRhY19jIiAxPiY2Cis8IGVjaG8gImNvbmZpZ3VyZToyNzEyOiBjaGVja2luZyBmb3IgbmxfbGFuZ2luZm8ncyBhcmd1bWVudCB0byBvYnRhaW4gdGhlIGNvZGVzZXQiID4mNQorPCBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbmxfbGFuZ2luZm9fY29kZXNldCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCis8ICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKy0tLQorPiAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgbmxfbGFuZ2luZm8ncyBhcmd1bWVudCB0byBvYnRhaW4gdGhlIGNvZGVzZXQiID4mNQorPiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgbmxfbGFuZ2luZm8ncyBhcmd1bWVudCB0byBvYnRhaW4gdGhlIGNvZGVzZXQuLi4gIiA+JjY7IH0KKz4gaWYgdGVzdCAiJHthY19jdl9ubF9sYW5naW5mb19jb2Rlc2V0K3NldH0iID0gc2V0OyB0aGVuCis+ICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKzI3MTcsMjcxOWM2ODA2LDY4MTEKKzwgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCis8ICNsaW5lIDI3MTkgImNvbmZpZ3VyZSIKKzwgI2luY2x1ZGUgImNvbmZkZWZzLmgiCistLS0KKz4gICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogY29uZmRlZnMuaC4gICovCis+IF9BQ0VPRgorPiBjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKz4gY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBlbmQgY29uZmRlZnMuaC4gICovCisyNzIxYzY4MTMsNjgxNQorPCBpbnQgbWFpbigpIHsKKy0tLQorPiBpbnQKKz4gbWFpbiAoKQorPiB7CisyNzIzLDI3MjZjNjgxNyw2ODQxCis8IDsgcmV0dXJuIDA7IH0KKzwgRU9GCis8IGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjcyNjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCis8ICAgcm0gLXJmIGNvbmZ0ZXN0KgorLS0tCis+ICAgOworPiAgIHJldHVybiAwOworPiB9Cis+IF9BQ0VPRgorPiBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorPiBpZiB7IChhY190cnk9IiRhY19saW5rIgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKz4gICBhY19zdGF0dXM9JD8KKz4gICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorPiAgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorPiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Cis+IAkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Cis+IAkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorPiAgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJiB7Cis+IAkgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgfHwKKz4gCSAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorPiAgICAgICAgfTsgdGhlbgorMjcyOSwyNzMwYzY4NDQsNjg0NworPCAgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis8ICAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CistLS0KKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKz4gCisyNzMyYzY4NDksNjg1MgorPCBybSAtZiBjb25mdGVzdCoKKy0tLQorPiAKKz4gcm0gLXJmIGNvbmZ0ZXN0LmRTWU0KKz4gcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKKz4gICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKzI3MzUsMjczNmM2ODU1LDY4NTYKKzwgCis8IGVjaG8gIiRhY190IiIkYWNfY3ZfbmxfbGFuZ2luZm9fY29kZXNldCIgMT4mNgorLS0tCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9ubF9sYW5naW5mb19jb2Rlc2V0IiA+JjUKKz4gJGFzX2VjaG8gIiRhY19jdl9ubF9sYW5naW5mb19jb2Rlc2V0IiA+JjY7IH0KKzI3NDYsMjc0N2M2ODY2Cis8IGFjX2V4dD1DCis8ICMgQ1hYRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgorLS0tCis+IGFjX2V4dD1jcHAKKzI3NDksMjc2MGM2ODY4LDY4ODIKKzwgYWNfY29tcGlsZT0nJHtDWFgtZysrfSAtYyAkQ1hYRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKKzwgYWNfbGluaz0nJHtDWFgtZysrfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKKzwgY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2N4eF9jcm9zcworPCAKKzwgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG5hbWVzcGFjZSBzdXBwb3J0IiIuLi4gJGFjX2MiIDE+JjYKKzwgZWNobyAiY29uZmlndXJlOjI3NTU6IGNoZWNraW5nIGZvciBuYW1lc3BhY2Ugc3VwcG9ydCIgPiY1Cis8IGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9uYW1lc3BhY2Vfb2snK3NldH0nYFwiID0gc2V0IjsgdGhlbgorPCAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Cis8IGVsc2UKKzwgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCis8ICNsaW5lIDI3NjAgImNvbmZpZ3VyZSIKKzwgI2luY2x1ZGUgImNvbmZkZWZzLmgiCistLS0KKz4gYWNfY29tcGlsZT0nJENYWCAtYyAkQ1hYRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworPiBhY19saW5rPSckQ1hYIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ1hYRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworPiBhY19jb21waWxlcl9nbnU9JGFjX2N2X2N4eF9jb21waWxlcl9nbnUKKz4gCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgbmFtZXNwYWNlIHN1cHBvcnQiID4mNQorPiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgbmFtZXNwYWNlIHN1cHBvcnQuLi4gIiA+JjY7IH0KKz4gaWYgdGVzdCAiJHthY19jdl9uYW1lc3BhY2Vfb2src2V0fSIgPSBzZXQ7IHRoZW4KKz4gICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorPiBlbHNlCis+ICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGNvbmZkZWZzLmguICAqLworPiBfQUNFT0YKKz4gY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Cis+IGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogZW5kIGNvbmZkZWZzLmguICAqLworMjc2NCwyNzY1YzY4ODYsNjg4OQorPCAgICAgCis8IGludCBtYWluKCkgeworLS0tCis+IAorPiBpbnQKKz4gbWFpbiAoKQorPiB7CisyNzY3LDI3NzBjNjg5MSw2OTE1Cis8IDsgcmV0dXJuIDA7IH0KKzwgRU9GCis8IGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjc3MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCis8ICAgcm0gLXJmIGNvbmZ0ZXN0KgorLS0tCis+ICAgOworPiAgIHJldHVybiAwOworPiB9Cis+IF9BQ0VPRgorPiBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorPiBpZiB7IChhY190cnk9IiRhY19saW5rIgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKz4gICBhY19zdGF0dXM9JD8KKz4gICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorPiAgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorPiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Cis+IAkgdGVzdCAteiAiJGFjX2N4eF93ZXJyb3JfZmxhZyIgfHwKKz4gCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCis+ICAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmIHsKKz4gCSB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllcyB8fAorPiAJICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0Cis+ICAgICAgICB9OyB0aGVuCisyNzczLDI3NzZjNjkxOCw2OTIxCis8ICAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKzwgICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKzwgICBybSAtcmYgY29uZnRlc3QqCis8ICAgYWNfY3ZfbmFtZXNwYWNlX29rPW5vCistLS0KKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKz4gCWFjX2N2X25hbWVzcGFjZV9vaz1ubworMjc3OGM2OTIzLDY5MjYKKzwgcm0gLWYgY29uZnRlc3QqIAorLS0tCis+IAorPiBybSAtcmYgY29uZnRlc3QuZFNZTQorPiBybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorPiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorMjc4MWM2OTI5LDY5MzAKKzwgZWNobyAiJGFjX3QiIiRhY19jdl9uYW1lc3BhY2Vfb2siIDE+JjYKKy0tLQorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbmFtZXNwYWNlX29rIiA+JjUKKz4gJGFzX2VjaG8gIiRhY19jdl9uYW1lc3BhY2Vfb2siID4mNjsgfQorMjc4OSwyNzkwYzY5MzgsNjkzOQorPCBlY2hvICRhY19uICJjaGVja2luZyBmb3IgcHJvcGVybHkgb3ZlcnJpZGluZyBuZXcgYW5kIGRlbGV0ZSIiLi4uICRhY19jIiAxPiY2Cis8IGVjaG8gImNvbmZpZ3VyZToyNzkxOiBjaGVja2luZyBmb3IgcHJvcGVybHkgb3ZlcnJpZGluZyBuZXcgYW5kIGRlbGV0ZSIgPiY1CistLS0KKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBwcm9wZXJseSBvdmVycmlkaW5nIG5ldyBhbmQgZGVsZXRlIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHByb3Blcmx5IG92ZXJyaWRpbmcgbmV3IGFuZCBkZWxldGUuLi4gIiA+JjY7IH0KKzI3OTMsMjc5NGM2OTQyLDY5NDMKKzwgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X292ZXJyaWRlX2N4eF9hbGxvY2F0aW9uX29rJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKzwgICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorLS0tCis+IGlmIHRlc3QgIiR7YWNfY3Zfb3ZlcnJpZGVfY3h4X2FsbG9jYXRpb25fb2src2V0fSIgPSBzZXQ7IHRoZW4KKz4gICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorMjc5NiwyNzk4YzY5NDUsNjk1MAorPCAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKzwgI2xpbmUgMjc5OCAiY29uZmlndXJlIgorPCAjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy0tLQorPiAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKzI4MDcsMjgxM2M2OTU5LDY5ODgKKzwgICAgIAorPCBpbnQgbWFpbigpIHsKKzwgICAgIAorPCA7IHJldHVybiAwOyB9Cis8IEVPRgorPCBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI4MTM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorPCAgIHJtIC1yZiBjb25mdGVzdCoKKy0tLQorPiAKKz4gaW50Cis+IG1haW4gKCkKKz4geworPiAKKz4gICA7Cis+ICAgcmV0dXJuIDA7Cis+IH0KKz4gX0FDRU9GCis+IHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0Cis+IGlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQorPiAgIGFjX3N0YXR1cz0kPworPiAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCis+ICAgcm0gLWYgY29uZnRlc3QuZXIxCis+ICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKz4gCSB0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIiB8fAorPiAJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKz4gICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgeworPiAJIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzIHx8Cis+IAkgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQKKz4gICAgICAgIH07IHRoZW4KKzI4MTYsMjgxOWM2OTkxLDY5OTQKKzwgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPCAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzwgICBhY19jdl9vdmVycmlkZV9jeHhfYWxsb2NhdGlvbl9vaz1ubworLS0tCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCis+IAlhY19jdl9vdmVycmlkZV9jeHhfYWxsb2NhdGlvbl9vaz1ubworMjgyMWM2OTk2LDY5OTkKKzwgcm0gLWYgY29uZnRlc3QqIAorLS0tCis+IAorPiBybSAtcmYgY29uZnRlc3QuZFNZTQorPiBybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorPiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorMjgyNGM3MDAyLDcwMDMKKzwgZWNobyAiJGFjX3QiIiRhY19jdl9vdmVycmlkZV9jeHhfYWxsb2NhdGlvbl9vayIgMT4mNgorLS0tCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9vdmVycmlkZV9jeHhfYWxsb2NhdGlvbl9vayIgPiY1Cis+ICRhc19lY2hvICIkYWNfY3Zfb3ZlcnJpZGVfY3h4X2FsbG9jYXRpb25fb2siID4mNjsgfQorMjgyOCwyODM1YzcwMDcsNzAxNworPCAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHBsYWNlbWVudCBuZXcgYW5kIGRlbGV0ZSIiLi4uICRhY19jIiAxPiY2Cis8IGVjaG8gImNvbmZpZ3VyZToyODMwOiBjaGVja2luZyBmb3IgcGxhY2VtZW50IG5ldyBhbmQgZGVsZXRlIiA+JjUKKzwgICAgIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9vdmVycmlkZV9wbGFjZW1lbnRfbmV3X29rJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKzwgICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorPCBlbHNlCis8ICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorPCAjbGluZSAyODM1ICJjb25maWd1cmUiCis8ICNpbmNsdWRlICJjb25mZGVmcy5oIgorLS0tCis+ICAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHBsYWNlbWVudCBuZXcgYW5kIGRlbGV0ZSIgPiY1Cis+ICRhc19lY2hvX24gImNoZWNraW5nIGZvciBwbGFjZW1lbnQgbmV3IGFuZCBkZWxldGUuLi4gIiA+JjY7IH0KKz4gICAgIGlmIHRlc3QgIiR7YWNfY3Zfb3ZlcnJpZGVfcGxhY2VtZW50X25ld19vaytzZXR9IiA9IHNldDsgdGhlbgorPiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Cis+IGVsc2UKKz4gICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogY29uZmRlZnMuaC4gICovCis+IF9BQ0VPRgorPiBjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKz4gY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBlbmQgY29uZmRlZnMuaC4gICovCisyODQ2LDI4NTJjNzAyOCw3MDU3Cis8ICAgICAgICAgCis8IGludCBtYWluKCkgeworPCAgICAgICAgIAorPCA7IHJldHVybiAwOyB9Cis8IEVPRgorPCBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI4NTI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorPCAgIHJtIC1yZiBjb25mdGVzdCoKKy0tLQorPiAKKz4gaW50Cis+IG1haW4gKCkKKz4geworPiAKKz4gICA7Cis+ICAgcmV0dXJuIDA7Cis+IH0KKz4gX0FDRU9GCis+IHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0Cis+IGlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQorPiAgIGFjX3N0YXR1cz0kPworPiAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCis+ICAgcm0gLWYgY29uZnRlc3QuZXIxCis+ICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKz4gCSB0ZXN0IC16ICIkYWNfY3h4X3dlcnJvcl9mbGFnIiB8fAorPiAJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKz4gICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgeworPiAJIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzIHx8Cis+IAkgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQKKz4gICAgICAgIH07IHRoZW4KKzI4NTUsMjg1OGM3MDYwLDcwNjMKKzwgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPCAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzwgICBhY19jdl9vdmVycmlkZV9wbGFjZW1lbnRfbmV3X29rPW5vCistLS0KKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKz4gCWFjX2N2X292ZXJyaWRlX3BsYWNlbWVudF9uZXdfb2s9bm8KKzI4NjBjNzA2NSw3MDY4Cis8IHJtIC1mIGNvbmZ0ZXN0KiAKKy0tLQorPiAKKz4gcm0gLXJmIGNvbmZ0ZXN0LmRTWU0KKz4gcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKKz4gICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKzI4NjNjNzA3MSw3MDcyCis8ICAgICBlY2hvICIkYWNfdCIiJGFjX2N2X292ZXJyaWRlX3BsYWNlbWVudF9uZXdfb2siIDE+JjYKKy0tLQorPiAgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X292ZXJyaWRlX3BsYWNlbWVudF9uZXdfb2siID4mNQorPiAkYXNfZWNobyAiJGFjX2N2X292ZXJyaWRlX3BsYWNlbWVudF9uZXdfb2siID4mNjsgfQorMjg3M2Q3MDgxCis8ICMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KKzI4NzUsMjg4NmM3MDgzLDcxMDEKKzwgYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JworPCBhY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCis8IGNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcworPCAKKzwgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHBvcGVuIiIuLi4gJGFjX2MiIDE+JjYKKzwgZWNobyAiY29uZmlndXJlOjI4ODE6IGNoZWNraW5nIGZvciBwb3BlbiIgPiY1Cis8IGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX3BvcGVuJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKzwgICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorPCBlbHNlCis8ICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorPCAjbGluZSAyODg2ICJjb25maWd1cmUiCis8ICNpbmNsdWRlICJjb25mZGVmcy5oIgorLS0tCis+IGFjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKKz4gYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKKz4gYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorPiAKKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBwb3BlbiIgPiY1Cis+ICRhc19lY2hvX24gImNoZWNraW5nIGZvciBwb3Blbi4uLiAiID4mNjsgfQorPiBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfcG9wZW4rc2V0fSIgPSBzZXQ7IHRoZW4KKz4gICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorPiBlbHNlCis+ICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGNvbmZkZWZzLmguICAqLworPiBfQUNFT0YKKz4gY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Cis+IGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogZW5kIGNvbmZkZWZzLmguICAqLworPiAvKiBEZWZpbmUgcG9wZW4gdG8gYW4gaW5ub2N1b3VzIHZhcmlhbnQsIGluIGNhc2UgPGxpbWl0cy5oPiBkZWNsYXJlcyBwb3Blbi4KKz4gICAgRm9yIGV4YW1wbGUsIEhQLVVYIDExaSA8bGltaXRzLmg+IGRlY2xhcmVzIGdldHRpbWVvZmRheS4gICovCis+ICNkZWZpbmUgcG9wZW4gaW5ub2N1b3VzX3BvcGVuCis+IAorMjg4OCwyODkzYzcxMDMsNzExMQorPCAgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciBwb3BlbigpOyBiZWxvdy4gICovCis8ICNpbmNsdWRlIDxhc3NlcnQuaD4KKzwgLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKzwgLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorPCAgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKzwgY2hhciBwb3BlbigpOworLS0tCis+ICAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyIHBvcGVuICgpOyBiZWxvdy4KKz4gICAgIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKz4gICAgIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4gICovCis+IAorPiAjaWZkZWYgX19TVERDX18KKz4gIyBpbmNsdWRlIDxsaW1pdHMuaD4KKz4gI2Vsc2UKKz4gIyBpbmNsdWRlIDxhc3NlcnQuaD4KKz4gI2VuZGlmCisyODk1YzcxMTMKKzwgaW50IG1haW4oKSB7CistLS0KKz4gI3VuZGVmIHBvcGVuCisyODk2YTcxMTUsNzEyMQorPiAvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKz4gICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCis+ICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCis+ICNpZmRlZiBfX2NwbHVzcGx1cworPiBleHRlcm4gIkMiCis+ICNlbmRpZgorPiBjaGFyIHBvcGVuICgpOworMjkwMGM3MTI1Cis8ICNpZiBkZWZpbmVkIChfX3N0dWJfcG9wZW4pIHx8IGRlZmluZWQgKF9fc3R1Yl9fX3BvcGVuKQorLS0tCis+ICNpZiBkZWZpbmVkIF9fc3R1Yl9wb3BlbiB8fCBkZWZpbmVkIF9fc3R1Yl9fX3BvcGVuCisyOTAyLDI5MDNkNzEyNgorPCAjZWxzZQorPCBwb3BlbigpOworMjkwNiwyOTI0YzcxMjksNzE2OAorPCA7IHJldHVybiAwOyB9Cis8IEVPRgorPCBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI5MDk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzwgICBldmFsICJhY19jdl9mdW5jX3BvcGVuPXllcyIKKzwgZWxzZQorPCAgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis8ICAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Cis8ICAgcm0gLXJmIGNvbmZ0ZXN0KgorPCAgIGV2YWwgImFjX2N2X2Z1bmNfcG9wZW49bm8iCis8IGZpCis8IHJtIC1mIGNvbmZ0ZXN0KgorPCBmaQorPCAKKzwgaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18ncG9wZW5gXCIgPSB5ZXMiOyB0aGVuCis8ICAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorPCAgIDoKKzwgZWxzZQorPCAgIGVjaG8gIiRhY190IiJubyIgMT4mNgorLS0tCis+IGludAorPiBtYWluICgpCis+IHsKKz4gcmV0dXJuIHBvcGVuICgpOworPiAgIDsKKz4gICByZXR1cm4gMDsKKz4gfQorPiBfQUNFT0YKKz4gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKKz4gaWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKKz4gY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCis+ICAgYWNfc3RhdHVzPSQ/Cis+ICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKz4gICBybSAtZiBjb25mdGVzdC5lcjEKKz4gICBjYXQgY29uZnRlc3QuZXJyID4mNQorPiAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cis+ICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworPiAJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorPiAJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKz4gICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgeworPiAJIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzIHx8Cis+IAkgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQKKz4gICAgICAgIH07IHRoZW4KKz4gICBhY19jdl9mdW5jX3BvcGVuPXllcworPiBlbHNlCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCis+IAlhY19jdl9mdW5jX3BvcGVuPW5vCis+IGZpCis+IAorPiBybSAtcmYgY29uZnRlc3QuZFNZTQorPiBybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorPiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorMjkyNWE3MTcwLDcxNzEKKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2Z1bmNfcG9wZW4iID4mNQorPiAkYXNfZWNobyAiJGFjX2N2X2Z1bmNfcG9wZW4iID4mNjsgfQorMjkzNSwyOTQyYzcxODEsNzE5NQorPCBlY2hvICRhY19uICJjaGVja2luZyBmb3IgdHpzZXQiIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6MjkzNzogY2hlY2tpbmcgZm9yIHR6c2V0IiA+JjUKKzwgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfdHpzZXQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorPCAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Cis8IGVsc2UKKzwgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCis8ICNsaW5lIDI5NDIgImNvbmZpZ3VyZSIKKzwgI2luY2x1ZGUgImNvbmZkZWZzLmgiCistLS0KKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciB0enNldCIgPiY1Cis+ICRhc19lY2hvX24gImNoZWNraW5nIGZvciB0enNldC4uLiAiID4mNjsgfQorPiBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfdHpzZXQrc2V0fSIgPSBzZXQ7IHRoZW4KKz4gICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorPiBlbHNlCis+ICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGNvbmZkZWZzLmguICAqLworPiBfQUNFT0YKKz4gY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Cis+IGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogZW5kIGNvbmZkZWZzLmguICAqLworPiAvKiBEZWZpbmUgdHpzZXQgdG8gYW4gaW5ub2N1b3VzIHZhcmlhbnQsIGluIGNhc2UgPGxpbWl0cy5oPiBkZWNsYXJlcyB0enNldC4KKz4gICAgRm9yIGV4YW1wbGUsIEhQLVVYIDExaSA8bGltaXRzLmg+IGRlY2xhcmVzIGdldHRpbWVvZmRheS4gICovCis+ICNkZWZpbmUgdHpzZXQgaW5ub2N1b3VzX3R6c2V0Cis+IAorMjk0NCwyOTQ5YzcxOTcsNzE5OQorPCAgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciB0enNldCgpOyBiZWxvdy4gICovCis8ICNpbmNsdWRlIDxhc3NlcnQuaD4KKzwgLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKzwgLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorPCAgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKzwgY2hhciB0enNldCgpOworLS0tCis+ICAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyIHR6c2V0ICgpOyBiZWxvdy4KKz4gICAgIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKz4gICAgIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4gICovCisyOTUxYzcyMDEsNzIwNQorPCBpbnQgbWFpbigpIHsKKy0tLQorPiAjaWZkZWYgX19TVERDX18KKz4gIyBpbmNsdWRlIDxsaW1pdHMuaD4KKz4gI2Vsc2UKKz4gIyBpbmNsdWRlIDxhc3NlcnQuaD4KKz4gI2VuZGlmCisyOTUyYTcyMDcsNzIxNQorPiAjdW5kZWYgdHpzZXQKKz4gCis+IC8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorPiAgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKz4gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKz4gI2lmZGVmIF9fY3BsdXNwbHVzCis+IGV4dGVybiAiQyIKKz4gI2VuZGlmCis+IGNoYXIgdHpzZXQgKCk7CisyOTU2YzcyMTkKKzwgI2lmIGRlZmluZWQgKF9fc3R1Yl90enNldCkgfHwgZGVmaW5lZCAoX19zdHViX19fdHpzZXQpCistLS0KKz4gI2lmIGRlZmluZWQgX19zdHViX3R6c2V0IHx8IGRlZmluZWQgX19zdHViX19fdHpzZXQKKzI5NTgsMjk1OWQ3MjIwCis8ICNlbHNlCis8IHR6c2V0KCk7CisyOTYyLDI5ODBjNzIyMyw3MjYyCis8IDsgcmV0dXJuIDA7IH0KKzwgRU9GCis8IGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjk2NTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCis8ICAgcm0gLXJmIGNvbmZ0ZXN0KgorPCAgIGV2YWwgImFjX2N2X2Z1bmNfdHpzZXQ9eWVzIgorPCBlbHNlCis8ICAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKzwgICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKzwgICBybSAtcmYgY29uZnRlc3QqCis8ICAgZXZhbCAiYWNfY3ZfZnVuY190enNldD1ubyIKKzwgZmkKKzwgcm0gLWYgY29uZnRlc3QqCis8IGZpCis8IAorPCBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyd0enNldGBcIiA9IHllcyI7IHRoZW4KKzwgICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Cis8ICAgOgorPCBlbHNlCis8ICAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CistLS0KKz4gaW50Cis+IG1haW4gKCkKKz4geworPiByZXR1cm4gdHpzZXQgKCk7Cis+ICAgOworPiAgIHJldHVybiAwOworPiB9Cis+IF9BQ0VPRgorPiBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorPiBpZiB7IChhY190cnk9IiRhY19saW5rIgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKz4gICBhY19zdGF0dXM9JD8KKz4gICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorPiAgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorPiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Cis+IAkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Cis+IAkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorPiAgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJiB7Cis+IAkgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgfHwKKz4gCSAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorPiAgICAgICAgfTsgdGhlbgorPiAgIGFjX2N2X2Z1bmNfdHpzZXQ9eWVzCis+IGVsc2UKKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKz4gCWFjX2N2X2Z1bmNfdHpzZXQ9bm8KKz4gZmkKKz4gCis+IHJtIC1yZiBjb25mdGVzdC5kU1lNCis+IHJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCis+ICAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisyOTgxYTcyNjQsNzI2NQorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfZnVuY190enNldCIgPiY1Cis+ICRhc19lY2hvICIkYWNfY3ZfZnVuY190enNldCIgPiY2OyB9CisyOTg5LDI5OTZjNzI3Myw3Mjg3Cis8ICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgX3R6c2V0IiIuLi4gJGFjX2MiIDE+JjYKKzwgZWNobyAiY29uZmlndXJlOjI5OTE6IGNoZWNraW5nIGZvciBfdHpzZXQiID4mNQorPCBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19fdHpzZXQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorPCAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Cis8IGVsc2UKKzwgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCis8ICNsaW5lIDI5OTYgImNvbmZpZ3VyZSIKKzwgI2luY2x1ZGUgImNvbmZkZWZzLmgiCistLS0KKz4gICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgX3R6c2V0IiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIF90enNldC4uLiAiID4mNjsgfQorPiBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfX3R6c2V0K3NldH0iID0gc2V0OyB0aGVuCis+ICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKz4gZWxzZQorPiAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKz4gLyogRGVmaW5lIF90enNldCB0byBhbiBpbm5vY3VvdXMgdmFyaWFudCwgaW4gY2FzZSA8bGltaXRzLmg+IGRlY2xhcmVzIF90enNldC4KKz4gICAgRm9yIGV4YW1wbGUsIEhQLVVYIDExaSA8bGltaXRzLmg+IGRlY2xhcmVzIGdldHRpbWVvZmRheS4gICovCis+ICNkZWZpbmUgX3R6c2V0IGlubm9jdW91c19fdHpzZXQKKz4gCisyOTk4LDMwMDNjNzI4OSw3Mjk3Cis8ICAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyIF90enNldCgpOyBiZWxvdy4gICovCis8ICNpbmNsdWRlIDxhc3NlcnQuaD4KKzwgLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKzwgLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorPCAgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKzwgY2hhciBfdHpzZXQoKTsKKy0tLQorPiAgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciBfdHpzZXQgKCk7IGJlbG93LgorPiAgICAgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQorPiAgICAgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLiAgKi8KKz4gCis+ICNpZmRlZiBfX1NURENfXworPiAjIGluY2x1ZGUgPGxpbWl0cy5oPgorPiAjZWxzZQorPiAjIGluY2x1ZGUgPGFzc2VydC5oPgorPiAjZW5kaWYKKzMwMDVjNzI5OQorPCBpbnQgbWFpbigpIHsKKy0tLQorPiAjdW5kZWYgX3R6c2V0CiszMDA2YTczMDEsNzMwNworPiAvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKz4gICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCis+ICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCis+ICNpZmRlZiBfX2NwbHVzcGx1cworPiBleHRlcm4gIkMiCis+ICNlbmRpZgorPiBjaGFyIF90enNldCAoKTsKKzMwMTBjNzMxMQorPCAjaWYgZGVmaW5lZCAoX19zdHViX190enNldCkgfHwgZGVmaW5lZCAoX19zdHViX19fX3R6c2V0KQorLS0tCis+ICNpZiBkZWZpbmVkIF9fc3R1Yl9fdHpzZXQgfHwgZGVmaW5lZCBfX3N0dWJfX19fdHpzZXQKKzMwMTIsMzAxM2Q3MzEyCis8ICNlbHNlCis8IF90enNldCgpOworMzAxNiwzMDM0YzczMTUsNzM1NAorPCA7IHJldHVybiAwOyB9Cis8IEVPRgorPCBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMwMTk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzwgICBldmFsICJhY19jdl9mdW5jX190enNldD15ZXMiCis8IGVsc2UKKzwgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPCAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzwgICBldmFsICJhY19jdl9mdW5jX190enNldD1ubyIKKzwgZmkKKzwgcm0gLWYgY29uZnRlc3QqCis8IGZpCis8IAorPCBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXydfdHpzZXRgXCIgPSB5ZXMiOyB0aGVuCis8ICAgZWNobyAiJGFjX3QiInllcyIgMT4mNgorPCAgIDoKKzwgZWxzZQorPCAgIGVjaG8gIiRhY190IiJubyIgMT4mNgorLS0tCis+IGludAorPiBtYWluICgpCis+IHsKKz4gcmV0dXJuIF90enNldCAoKTsKKz4gICA7Cis+ICAgcmV0dXJuIDA7Cis+IH0KKz4gX0FDRU9GCis+IHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0Cis+IGlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQorPiAgIGFjX3N0YXR1cz0kPworPiAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCis+ICAgcm0gLWYgY29uZnRlc3QuZXIxCis+ICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKz4gCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKz4gCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCis+ICAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmIHsKKz4gCSB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllcyB8fAorPiAJICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0Cis+ICAgICAgICB9OyB0aGVuCis+ICAgYWNfY3ZfZnVuY19fdHpzZXQ9eWVzCis+IGVsc2UKKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKz4gCWFjX2N2X2Z1bmNfX3R6c2V0PW5vCis+IGZpCis+IAorPiBybSAtcmYgY29uZnRlc3QuZFNZTQorPiBybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorPiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorMzAzNWE3MzU2LDczNTcKKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2Z1bmNfX3R6c2V0IiA+JjUKKz4gJGFzX2VjaG8gIiRhY19jdl9mdW5jX190enNldCIgPiY2OyB9CiszMDQ3LDMwNTRjNzM2OSw3Mzc5Cis8IGVjaG8gJGFjX24gImNoZWNraW5nIGZvciB0em5hbWUiIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6MzA0OTogY2hlY2tpbmcgZm9yIHR6bmFtZSIgPiY1Cis8IGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl92YXJfdHpuYW1lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKzwgICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorPCBlbHNlCis8ICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorPCAjbGluZSAzMDU0ICJjb25maWd1cmUiCis8ICNpbmNsdWRlICJjb25mZGVmcy5oIgorLS0tCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgdHpuYW1lIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHR6bmFtZS4uLiAiID4mNjsgfQorPiBpZiB0ZXN0ICIke2FjX2N2X3Zhcl90em5hbWUrc2V0fSIgPSBzZXQ7IHRoZW4KKz4gICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorPiBlbHNlCis+ICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGNvbmZkZWZzLmguICAqLworPiBfQUNFT0YKKz4gY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Cis+IGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogZW5kIGNvbmZkZWZzLmguICAqLworMzA2M2M3Mzg4LDczOTAKKzwgaW50IG1haW4oKSB7CistLS0KKz4gaW50Cis+IG1haW4gKCkKKz4geworMzA2NSwzMDY4YzczOTIsNzQxNgorPCA7IHJldHVybiAwOyB9Cis8IEVPRgorPCBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMwNjg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorPCAgIHJtIC1yZiBjb25mdGVzdCoKKy0tLQorPiAgIDsKKz4gICByZXR1cm4gMDsKKz4gfQorPiBfQUNFT0YKKz4gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKKz4gaWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKKz4gY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCis+ICAgYWNfc3RhdHVzPSQ/Cis+ICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKz4gICBybSAtZiBjb25mdGVzdC5lcjEKKz4gICBjYXQgY29uZnRlc3QuZXJyID4mNQorPiAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cis+ICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworPiAJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorPiAJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKz4gICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgeworPiAJIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzIHx8Cis+IAkgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQKKz4gICAgICAgIH07IHRoZW4KKzMwNzEsMzA3NmM3NDE5LDc0MjIKKzwgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPCAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzwgICBhY19jdl92YXJfdHpuYW1lPW5vCis8IGZpCis8IHJtIC1mIGNvbmZ0ZXN0KgorLS0tCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCis+IAlhY19jdl92YXJfdHpuYW1lPW5vCiszMDc5Yzc0MjUsNzQzMAorPCBlY2hvICIkYWNfdCIiJGFjX2N2X3Zhcl90em5hbWUiIDE+JjYKKy0tLQorPiBybSAtcmYgY29uZnRlc3QuZFNZTQorPiBybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorPiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorPiBmaQorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdmFyX3R6bmFtZSIgPiY1Cis+ICRhc19lY2hvICIkYWNfY3ZfdmFyX3R6bmFtZSIgPiY2OyB9CiszMDg0LDMwOTFjNzQzNSw3NDQ1Cis8ICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIF90em5hbWUiIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6MzA4NjogY2hlY2tpbmcgZm9yIF90em5hbWUiID4mNQorPCBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdmFyX190em5hbWUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorPCAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Cis8IGVsc2UKKzwgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCis8ICNsaW5lIDMwOTEgImNvbmZpZ3VyZSIKKzwgI2luY2x1ZGUgImNvbmZkZWZzLmgiCistLS0KKz4gICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIF90em5hbWUiID4mNQorPiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgX3R6bmFtZS4uLiAiID4mNjsgfQorPiBpZiB0ZXN0ICIke2FjX2N2X3Zhcl9fdHpuYW1lK3NldH0iID0gc2V0OyB0aGVuCis+ICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKz4gZWxzZQorPiAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKzMwOTUsMzA5NmM3NDQ5LDc0NTIKKzwgICAKKzwgaW50IG1haW4oKSB7CistLS0KKz4gCis+IGludAorPiBtYWluICgpCis+IHsKKzMwOTgsMzEwMWM3NDU0LDc0NzgKKzwgOyByZXR1cm4gMDsgfQorPCBFT0YKKzwgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTAxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKzwgICBybSAtcmYgY29uZnRlc3QqCistLS0KKz4gICA7Cis+ICAgcmV0dXJuIDA7Cis+IH0KKz4gX0FDRU9GCis+IHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0Cis+IGlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQorPiAgIGFjX3N0YXR1cz0kPworPiAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCis+ICAgcm0gLWYgY29uZnRlc3QuZXIxCis+ICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKz4gCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKz4gCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCis+ICAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmIHsKKz4gCSB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllcyB8fAorPiAJICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0Cis+ICAgICAgICB9OyB0aGVuCiszMTA0LDMxMDljNzQ4MSw3NDg0Cis8ICAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKzwgICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKzwgICBybSAtcmYgY29uZnRlc3QqCis8ICAgYWNfY3ZfdmFyX190em5hbWU9bm8KKzwgZmkKKzwgcm0gLWYgY29uZnRlc3QqCistLS0KKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKz4gCWFjX2N2X3Zhcl9fdHpuYW1lPW5vCiszMTEyYzc0ODcsNzQ5MgorPCBlY2hvICIkYWNfdCIiJGFjX2N2X3Zhcl9fdHpuYW1lIiAxPiY2CistLS0KKz4gcm0gLXJmIGNvbmZ0ZXN0LmRTWU0KKz4gcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKKz4gICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKz4gZmkKKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3Zhcl9fdHpuYW1lIiA+JjUKKz4gJGFzX2VjaG8gIiRhY19jdl92YXJfX3R6bmFtZSIgPiY2OyB9CiszMTIxLDMxMjhjNzUwMSw3NTExCis8IGVjaG8gJGFjX24gImNoZWNraW5nIGZvciB0aW1lem9uZSIiLi4uICRhY19jIiAxPiY2Cis8IGVjaG8gImNvbmZpZ3VyZTozMTIzOiBjaGVja2luZyBmb3IgdGltZXpvbmUiID4mNQorPCBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdmFyX3RpbWV6b25lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKzwgICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorPCBlbHNlCis8ICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorPCAjbGluZSAzMTI4ICJjb25maWd1cmUiCis8ICNpbmNsdWRlICJjb25mZGVmcy5oIgorLS0tCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgdGltZXpvbmUiID4mNQorPiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgdGltZXpvbmUuLi4gIiA+JjY7IH0KKz4gaWYgdGVzdCAiJHthY19jdl92YXJfdGltZXpvbmUrc2V0fSIgPSBzZXQ7IHRoZW4KKz4gICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorPiBlbHNlCis+ICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGNvbmZkZWZzLmguICAqLworPiBfQUNFT0YKKz4gY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Cis+IGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogZW5kIGNvbmZkZWZzLmguICAqLworMzEzN2M3NTIwLDc1MjIKKzwgaW50IG1haW4oKSB7CistLS0KKz4gaW50Cis+IG1haW4gKCkKKz4geworMzEzOSwzMTQyYzc1MjQsNzU0OAorPCA7IHJldHVybiAwOyB9Cis8IEVPRgorPCBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMxNDI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorPCAgIHJtIC1yZiBjb25mdGVzdCoKKy0tLQorPiAgIDsKKz4gICByZXR1cm4gMDsKKz4gfQorPiBfQUNFT0YKKz4gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKKz4gaWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKKz4gY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCis+ICAgYWNfc3RhdHVzPSQ/Cis+ICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKz4gICBybSAtZiBjb25mdGVzdC5lcjEKKz4gICBjYXQgY29uZnRlc3QuZXJyID4mNQorPiAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cis+ICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworPiAJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorPiAJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKz4gICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgeworPiAJIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzIHx8Cis+IAkgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQKKz4gICAgICAgIH07IHRoZW4KKzMxNDUsMzE1MGM3NTUxLDc1NTQKKzwgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPCAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzwgICBhY19jdl92YXJfdGltZXpvbmU9bm8KKzwgZmkKKzwgcm0gLWYgY29uZnRlc3QqCistLS0KKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKz4gCWFjX2N2X3Zhcl90aW1lem9uZT1ubworMzE1M2M3NTU3LDc1NjIKKzwgZWNobyAiJGFjX3QiIiRhY19jdl92YXJfdGltZXpvbmUiIDE+JjYKKy0tLQorPiBybSAtcmYgY29uZnRlc3QuZFNZTQorPiBybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAorPiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorPiBmaQorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdmFyX3RpbWV6b25lIiA+JjUKKz4gJGFzX2VjaG8gIiRhY19jdl92YXJfdGltZXpvbmUiID4mNjsgfQorMzE1OSwzMTY2Yzc1NjgsNzU3OAorPCAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBfX3RpbWV6b25lIiIuLi4gJGFjX2MiIDE+JjYKKzwgZWNobyAiY29uZmlndXJlOjMxNjE6IGNoZWNraW5nIGZvciBfX3RpbWV6b25lIiA+JjUKKzwgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Zhcl9fX3RpbWV6b25lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKzwgICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorPCBlbHNlCis8ICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorPCAjbGluZSAzMTY2ICJjb25maWd1cmUiCis8ICNpbmNsdWRlICJjb25mZGVmcy5oIgorLS0tCis+ICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBfX3RpbWV6b25lIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIF9fdGltZXpvbmUuLi4gIiA+JjY7IH0KKz4gaWYgdGVzdCAiJHthY19jdl92YXJfX190aW1lem9uZStzZXR9IiA9IHNldDsgdGhlbgorPiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2Cis+IGVsc2UKKz4gICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogY29uZmRlZnMuaC4gICovCis+IF9BQ0VPRgorPiBjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKz4gY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBlbmQgY29uZmRlZnMuaC4gICovCiszMTY4LDMxNjljNzU4MCw3NTgzCis8ICAgCis8IGludCBtYWluKCkgeworLS0tCis+IAorPiBpbnQKKz4gbWFpbiAoKQorPiB7CiszMTcxLDMxNzRjNzU4NSw3NjA5Cis8IDsgcmV0dXJuIDA7IH0KKzwgRU9GCis8IGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzE3NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCis8ICAgcm0gLXJmIGNvbmZ0ZXN0KgorLS0tCis+ICAgOworPiAgIHJldHVybiAwOworPiB9Cis+IF9BQ0VPRgorPiBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorPiBpZiB7IChhY190cnk9IiRhY19saW5rIgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKz4gICBhY19zdGF0dXM9JD8KKz4gICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorPiAgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorPiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Cis+IAkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Cis+IAkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorPiAgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJiB7Cis+IAkgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgfHwKKz4gCSAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorPiAgICAgICAgfTsgdGhlbgorMzE3NywzMTgyYzc2MTIsNzYxNQorPCAgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis8ICAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Cis8ICAgcm0gLXJmIGNvbmZ0ZXN0KgorPCAgIGFjX2N2X3Zhcl9fX3RpbWV6b25lPW5vCis8IGZpCis8IHJtIC1mIGNvbmZ0ZXN0KgorLS0tCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCis+IAlhY19jdl92YXJfX190aW1lem9uZT1ubworMzE4NWM3NjE4LDc2MjMKKzwgZWNobyAiJGFjX3QiIiRhY19jdl92YXJfX190aW1lem9uZSIgMT4mNgorLS0tCis+IHJtIC1yZiBjb25mdGVzdC5kU1lNCis+IHJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCis+ICAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Cis+IGZpCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl92YXJfX190aW1lem9uZSIgPiY1Cis+ICRhc19lY2hvICIkYWNfY3ZfdmFyX19fdGltZXpvbmUiID4mNjsgfQorMzE5MCwzMTk3Yzc2MjgsNzYzOAorPCAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIF90aW1lem9uZSIiLi4uICRhY19jIiAxPiY2Cis8IGVjaG8gImNvbmZpZ3VyZTozMTkyOiBjaGVja2luZyBmb3IgX3RpbWV6b25lIiA+JjUKKzwgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Zhcl9fdGltZXpvbmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorPCAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Cis8IGVsc2UKKzwgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCis8ICNsaW5lIDMxOTcgImNvbmZpZ3VyZSIKKzwgI2luY2x1ZGUgImNvbmZkZWZzLmgiCistLS0KKz4gICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgX3RpbWV6b25lIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIF90aW1lem9uZS4uLiAiID4mNjsgfQorPiBpZiB0ZXN0ICIke2FjX2N2X3Zhcl9fdGltZXpvbmUrc2V0fSIgPSBzZXQ7IHRoZW4KKz4gICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorPiBlbHNlCis+ICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGNvbmZkZWZzLmguICAqLworPiBfQUNFT0YKKz4gY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Cis+IGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogZW5kIGNvbmZkZWZzLmguICAqLworMzE5OSwzMjAwYzc2NDAsNzY0MworPCAgICAgCis8IGludCBtYWluKCkgeworLS0tCis+IAorPiBpbnQKKz4gbWFpbiAoKQorPiB7CiszMjAyLDMyMDVjNzY0NSw3NjY5Cis8IDsgcmV0dXJuIDA7IH0KKzwgRU9GCis8IGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzIwNTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCis8ICAgcm0gLXJmIGNvbmZ0ZXN0KgorLS0tCis+ICAgOworPiAgIHJldHVybiAwOworPiB9Cis+IF9BQ0VPRgorPiBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorPiBpZiB7IChhY190cnk9IiRhY19saW5rIgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKKz4gICBhY19zdGF0dXM9JD8KKz4gICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorPiAgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorPiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Cis+IAkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Cis+IAkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorPiAgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJiB7Cis+IAkgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgfHwKKz4gCSAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorPiAgICAgICAgfTsgdGhlbgorMzIwOCwzMjEzYzc2NzIsNzY3NQorPCAgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis8ICAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Cis8ICAgcm0gLXJmIGNvbmZ0ZXN0KgorPCAgIGFjX2N2X3Zhcl9fdGltZXpvbmU9bm8KKzwgZmkKKzwgcm0gLWYgY29uZnRlc3QqCistLS0KKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKz4gCWFjX2N2X3Zhcl9fdGltZXpvbmU9bm8KKzMyMTZjNzY3OCw3NjgzCis8IGVjaG8gIiRhY190IiIkYWNfY3ZfdmFyX190aW1lem9uZSIgMT4mNgorLS0tCis+IHJtIC1yZiBjb25mdGVzdC5kU1lNCis+IHJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCis+ICAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Cis+IGZpCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl92YXJfX3RpbWV6b25lIiA+JjUKKz4gJGFzX2VjaG8gIiRhY19jdl92YXJfX3RpbWV6b25lIiA+JjY7IH0KKzMyMjYsMzI0NGM3NjkzLDc2OTYKKzwgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6MzIyODogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQorPCBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX3N0ZGMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorPCAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Cis8IGVsc2UKKzwgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCis8ICNsaW5lIDMyMzMgImNvbmZpZ3VyZSIKKzwgI2luY2x1ZGUgImNvbmZkZWZzLmgiCis8ICNpbmNsdWRlIDxzdGRsaWIuaD4KKzwgI2luY2x1ZGUgPHN0ZGFyZy5oPgorPCAjaW5jbHVkZSA8c3RyaW5nLmg+Cis8ICNpbmNsdWRlIDxmbG9hdC5oPgorPCBFT0YKKzwgYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKKzwgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMjQxOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorPCBhY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCis8IGlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCis8ICAgcm0gLXJmIGNvbmZ0ZXN0KgorPCAgIGFjX2N2X2hlYWRlcl9zdGRjPXllcworLS0tCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgaW50OF90IiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGludDhfdC4uLiAiID4mNjsgfQorPiBpZiB0ZXN0ICIke2FjX2N2X3R5cGVfaW50OF90K3NldH0iID0gc2V0OyB0aGVuCis+ICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKzMyNDYsMzI2MmM3Njk4LDc3NjYKKzwgICBlY2hvICIkYWNfZXJyIiA+JjUKKzwgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPCAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzwgICBhY19jdl9oZWFkZXJfc3RkYz1ubworPCBmaQorPCBybSAtZiBjb25mdGVzdCoKKzwgCis8IGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCis8ICAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgorPCBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCis8ICNsaW5lIDMyNTggImNvbmZpZ3VyZSIKKzwgI2luY2x1ZGUgImNvbmZkZWZzLmgiCis8ICNpbmNsdWRlIDxzdHJpbmcuaD4KKzwgRU9GCis8IGlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKzwgICBlZ3JlcCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKy0tLQorPiAgIGFjX2N2X3R5cGVfaW50OF90PW5vCis+IGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKz4gJGFjX2luY2x1ZGVzX2RlZmF1bHQKKz4gaW50Cis+IG1haW4gKCkKKz4geworPiBpZiAoc2l6ZW9mIChpbnQ4X3QpKQorPiAgICAgICAgcmV0dXJuIDA7Cis+ICAgOworPiAgIHJldHVybiAwOworPiB9Cis+IF9BQ0VPRgorPiBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Cis+IGlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorPiAgIGFjX3N0YXR1cz0kPworPiAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCis+ICAgcm0gLWYgY29uZnRlc3QuZXIxCis+ICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKz4gCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKz4gCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCis+ICAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorPiAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKz4gJGFjX2luY2x1ZGVzX2RlZmF1bHQKKz4gaW50Cis+IG1haW4gKCkKKz4geworPiBpZiAoc2l6ZW9mICgoaW50OF90KSkpCis+IAkgIHJldHVybiAwOworPiAgIDsKKz4gICByZXR1cm4gMDsKKz4gfQorPiBfQUNFT0YKKz4gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorPiBpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKz4gICBhY19zdGF0dXM9JD8KKz4gICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorPiAgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorPiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Cis+IAkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Cis+IAkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorPiAgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKzMyNjUsMzI2OGM3NzY5LDc3NzAKKzwgICBybSAtcmYgY29uZnRlc3QqCis8ICAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KKzwgZmkKKzwgcm0gLWYgY29uZnRlc3QqCistLS0KKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorMzI2OWE3NzcyCis+IAlhY19jdl90eXBlX2ludDhfdD15ZXMKKzMyNzIsMzI4MWM3Nzc1Cis8IGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCis8ICAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgorPCBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCis8ICNsaW5lIDMyNzYgImNvbmZpZ3VyZSIKKzwgI2luY2x1ZGUgImNvbmZkZWZzLmgiCis8ICNpbmNsdWRlIDxzdGRsaWIuaD4KKzwgRU9GCis8IGlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKzwgICBlZ3JlcCAiZnJlZSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCis8ICAgOgorLS0tCis+IHJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorMzI4MywzMjg2Yzc3NzcsNzc3OQorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzwgICBhY19jdl9oZWFkZXJfc3RkYz1ubworPCBmaQorPCBybSAtZiBjb25mdGVzdCoKKy0tLQorPiAgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Cis+IAorMzI5MCwzMjkyYzc3ODMsNzc4NworPCBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorPCAgICMgL2Jpbi9jYyBpbiBJcml4LTQuMC41IGdldHMgbm9uLUFOU0kgY3R5cGUgbWFjcm9zIHVubGVzcyB1c2luZyAtYW5zaS4KKzwgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKy0tLQorPiBybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKz4gZmkKKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfaW50OF90IiA+JjUKKz4gJGFzX2VjaG8gIiRhY19jdl90eXBlX2ludDhfdCIgPiY2OyB9Cis+IGlmIHRlc3QgIngkYWNfY3ZfdHlwZV9pbnQ4X3QiID0geCIieWVzOyB0aGVuCiszMjk1LDMzMDRkNzc4OQorPCAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKzwgI2xpbmUgMzI5NyAiY29uZmlndXJlIgorPCAjaW5jbHVkZSAiY29uZmRlZnMuaCIKKzwgI2luY2x1ZGUgPGN0eXBlLmg+Cis8ICNkZWZpbmUgSVNMT1dFUihjKSAoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ3onKQorPCAjZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAnQScgKyAoKGMpIC0gJ2EnKSA6IChjKSkKKzwgI2RlZmluZSBYT1IoZSwgZikgKCgoZSkgJiYgIShmKSkgfHwgKCEoZSkgJiYgKGYpKSkKKzwgaW50IG1haW4gKCkgeyBpbnQgaTsgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorPCBpZiAoWE9SIChpc2xvd2VyIChpKSwgSVNMT1dFUiAoaSkpIHx8IHRvdXBwZXIgKGkpICE9IFRPVVBQRVIgKGkpKSBleGl0KDIpOworPCBleGl0ICgwKTsgfQorMzMwNiwzMzE3Yzc3OTEsNzc5MworPCBFT0YKKzwgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMzA4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCis8IHRoZW4KKzwgICA6Cis8IGVsc2UKKzwgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPCAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorPCAgIHJtIC1mciBjb25mdGVzdCoKKzwgICBhY19jdl9oZWFkZXJfc3RkYz1ubworPCBmaQorPCBybSAtZnIgY29uZnRlc3QqCis8IGZpCistLS0KKz4gY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorPiAjZGVmaW5lIGludDhfdCBzaWduZWQgY2hhcgorPiBfQUNFT0YKKzMzMjBkNzc5NQorPCBmaQorMzMyMiwzMzI2Yzc3OTcsNzg3NAorPCBlY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9zdGRjIiAxPiY2Cis8IGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCis8ICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCis8ICNkZWZpbmUgU1REQ19IRUFERVJTIDEKKzwgRU9GCistLS0KKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciB1aW50OF90IiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHVpbnQ4X3QuLi4gIiA+JjY7IH0KKz4gaWYgdGVzdCAiJHthY19jdl90eXBlX3VpbnQ4X3Qrc2V0fSIgPSBzZXQ7IHRoZW4KKz4gICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorPiBlbHNlCis+ICAgYWNfY3ZfdHlwZV91aW50OF90PW5vCis+IGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKz4gJGFjX2luY2x1ZGVzX2RlZmF1bHQKKz4gaW50Cis+IG1haW4gKCkKKz4geworPiBpZiAoc2l6ZW9mICh1aW50OF90KSkKKz4gICAgICAgIHJldHVybiAwOworPiAgIDsKKz4gICByZXR1cm4gMDsKKz4gfQorPiBfQUNFT0YKKz4gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorPiBpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKz4gICBhY19zdGF0dXM9JD8KKz4gICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorPiAgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorPiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Cis+IAkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Cis+IAkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorPiAgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKz4gICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogY29uZmRlZnMuaC4gICovCis+IF9BQ0VPRgorPiBjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKz4gY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBlbmQgY29uZmRlZnMuaC4gICovCis+ICRhY19pbmNsdWRlc19kZWZhdWx0Cis+IGludAorPiBtYWluICgpCis+IHsKKz4gaWYgKHNpemVvZiAoKHVpbnQ4X3QpKSkKKz4gCSAgcmV0dXJuIDA7Cis+ICAgOworPiAgIHJldHVybiAwOworPiB9Cis+IF9BQ0VPRgorPiBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Cis+IGlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorPiAgIGFjX3N0YXR1cz0kPworPiAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCis+ICAgcm0gLWYgY29uZnRlc3QuZXIxCis+ICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKz4gCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKz4gCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCis+ICAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorPiAgIDoKKz4gZWxzZQorPiAgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CiszMzI3YTc4NzYKKz4gCWFjX2N2X3R5cGVfdWludDhfdD15ZXMKKzMzMzAsMzMzM2M3ODc5Cis8IGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBpbnQ4X3QiIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6MzMzMjogY2hlY2tpbmcgZm9yIGludDhfdCIgPiY1Cis8IGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX2ludDhfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCis8ICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKy0tLQorPiBybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKzMzMzUsMzM1MmM3ODgxLDc4ODIKKzwgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCis8ICNsaW5lIDMzMzcgImNvbmZpZ3VyZSIKKzwgI2luY2x1ZGUgImNvbmZkZWZzLmgiCis8ICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKzwgI2lmIFNURENfSEVBREVSUworPCAjaW5jbHVkZSA8c3RkbGliLmg+Cis8ICNpbmNsdWRlIDxzdGRkZWYuaD4KKzwgI2VuZGlmCis8IEVPRgorPCBpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Cis8ICAgZWdyZXAgIihefFteYS16QS1aXzAtOV0paW50OF90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCis8ICAgcm0gLXJmIGNvbmZ0ZXN0KgorPCAgIGFjX2N2X3R5cGVfaW50OF90PXllcworPCBlbHNlCis8ICAgcm0gLXJmIGNvbmZ0ZXN0KgorPCAgIGFjX2N2X3R5cGVfaW50OF90PW5vCis8IGZpCis8IHJtIC1mIGNvbmZ0ZXN0KgorLS0tCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKzMzNTQsMzM1OWQ3ODgzCis8IGZpCis8IGVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9pbnQ4X3QiIDE+JjYKKzwgaWYgdGVzdCAkYWNfY3ZfdHlwZV9pbnQ4X3QgPSBubzsgdGhlbgorPCAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorPCAjZGVmaW5lIGludDhfdCBzaWduZWQgY2hhcgorPCBFT0YKKzMzNjMsMzM4M2M3ODg3Cis8IGVjaG8gJGFjX24gImNoZWNraW5nIGZvciB1aW50OF90IiIuLi4gJGFjX2MiIDE+JjYKKzwgZWNobyAiY29uZmlndXJlOjMzNjU6IGNoZWNraW5nIGZvciB1aW50OF90IiA+JjUKKzwgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfdWludDhfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCis8ICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKzwgZWxzZQorPCAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKzwgI2xpbmUgMzM3MCAiY29uZmlndXJlIgorPCAjaW5jbHVkZSAiY29uZmRlZnMuaCIKKzwgI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorPCAjaWYgU1REQ19IRUFERVJTCis8ICNpbmNsdWRlIDxzdGRsaWIuaD4KKzwgI2luY2x1ZGUgPHN0ZGRlZi5oPgorPCAjZW5kaWYKKzwgRU9GCis8IGlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKzwgICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSl1aW50OF90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCis8ICAgcm0gLXJmIGNvbmZ0ZXN0KgorPCAgIGFjX2N2X3R5cGVfdWludDhfdD15ZXMKKzwgZWxzZQorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzwgICBhY19jdl90eXBlX3VpbnQ4X3Q9bm8KKy0tLQorPiBybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKzMzODVjNzg4OSw3ODkzCis8IHJtIC1mIGNvbmZ0ZXN0KgorLS0tCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX3VpbnQ4X3QiID4mNQorPiAkYXNfZWNobyAiJGFjX2N2X3R5cGVfdWludDhfdCIgPiY2OyB9Cis+IGlmIHRlc3QgIngkYWNfY3ZfdHlwZV91aW50OF90IiA9IHgiInllczsgdGhlbgorPiAgIDoKKz4gZWxzZQorMzM4NywzMzkwYzc4OTUKKzwgZmkKKzwgZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX3VpbnQ4X3QiIDE+JjYKKzwgaWYgdGVzdCAkYWNfY3ZfdHlwZV91aW50OF90ID0gbm87IHRoZW4KKzwgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKy0tLQorPiBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCiszMzkyYzc4OTcKKzwgRU9GCistLS0KKz4gX0FDRU9GCiszMzk2LDM0MTNjNzkwMSw3OTA0Cis8IGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBpbnQxNl90IiIuLi4gJGFjX2MiIDE+JjYKKzwgZWNobyAiY29uZmlndXJlOjMzOTg6IGNoZWNraW5nIGZvciBpbnQxNl90IiA+JjUKKzwgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfaW50MTZfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCis8ICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKzwgZWxzZQorPCAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKzwgI2xpbmUgMzQwMyAiY29uZmlndXJlIgorPCAjaW5jbHVkZSAiY29uZmRlZnMuaCIKKzwgI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorPCAjaWYgU1REQ19IRUFERVJTCis8ICNpbmNsdWRlIDxzdGRsaWIuaD4KKzwgI2luY2x1ZGUgPHN0ZGRlZi5oPgorPCAjZW5kaWYKKzwgRU9GCis8IGlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKzwgICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlpbnQxNl90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCis8ICAgcm0gLXJmIGNvbmZ0ZXN0KgorPCAgIGFjX2N2X3R5cGVfaW50MTZfdD15ZXMKKy0tLQorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGludDE2X3QiID4mNQorPiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgaW50MTZfdC4uLiAiID4mNjsgfQorPiBpZiB0ZXN0ICIke2FjX2N2X3R5cGVfaW50MTZfdCtzZXR9IiA9IHNldDsgdGhlbgorPiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiszNDE1ZDc5MDUKKzwgICBybSAtcmYgY29uZnRlc3QqCiszNDE2YTc5MDcsNzk4MAorPiBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogY29uZmRlZnMuaC4gICovCis+IF9BQ0VPRgorPiBjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKz4gY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBlbmQgY29uZmRlZnMuaC4gICovCis+ICRhY19pbmNsdWRlc19kZWZhdWx0Cis+IGludAorPiBtYWluICgpCis+IHsKKz4gaWYgKHNpemVvZiAoaW50MTZfdCkpCis+ICAgICAgICByZXR1cm4gMDsKKz4gICA7Cis+ICAgcmV0dXJuIDA7Cis+IH0KKz4gX0FDRU9GCis+IHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKKz4gaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKKz4gY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCis+ICAgYWNfc3RhdHVzPSQ/Cis+ICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKz4gICBybSAtZiBjb25mdGVzdC5lcjEKKz4gICBjYXQgY29uZnRlc3QuZXJyID4mNQorPiAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cis+ICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworPiAJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorPiAJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKz4gICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCis+ICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGNvbmZkZWZzLmguICAqLworPiBfQUNFT0YKKz4gY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Cis+IGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogZW5kIGNvbmZkZWZzLmguICAqLworPiAkYWNfaW5jbHVkZXNfZGVmYXVsdAorPiBpbnQKKz4gbWFpbiAoKQorPiB7Cis+IGlmIChzaXplb2YgKChpbnQxNl90KSkpCis+IAkgIHJldHVybiAwOworPiAgIDsKKz4gICByZXR1cm4gMDsKKz4gfQorPiBfQUNFT0YKKz4gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorPiBpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKz4gICBhY19zdGF0dXM9JD8KKz4gICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorPiAgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorPiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Cis+IAkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Cis+IAkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorPiAgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKz4gICA6Cis+IGVsc2UKKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKz4gCWFjX2N2X3R5cGVfaW50MTZfdD15ZXMKKzM0MThjNzk4Miw3OTg3Cis8IHJtIC1mIGNvbmZ0ZXN0KgorLS0tCis+IAorPiBybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKz4gZWxzZQorPiAgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Cis+IAorMzQyMSwzNDIzYzc5OTAsNzk5OQorPCBlY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfaW50MTZfdCIgMT4mNgorPCBpZiB0ZXN0ICRhY19jdl90eXBlX2ludDE2X3QgPSBubzsgdGhlbgorPCAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgorLS0tCis+IAorPiBybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKz4gZmkKKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfaW50MTZfdCIgPiY1Cis+ICRhc19lY2hvICIkYWNfY3ZfdHlwZV9pbnQxNl90IiA+JjY7IH0KKz4gaWYgdGVzdCAieCRhY19jdl90eXBlX2ludDE2X3QiID0geCIieWVzOyB0aGVuCis+ICAgOgorPiBlbHNlCis+IAorPiBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCiszNDI1YzgwMDEKKzwgRU9GCistLS0KKz4gX0FDRU9GCiszNDI5LDM0NDZjODAwNSw4MDA4Cis8IGVjaG8gJGFjX24gImNoZWNraW5nIGZvciB1aW50MTZfdCIiLi4uICRhY19jIiAxPiY2Cis8IGVjaG8gImNvbmZpZ3VyZTozNDMxOiBjaGVja2luZyBmb3IgdWludDE2X3QiID4mNQorPCBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV91aW50MTZfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCis8ICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKzwgZWxzZQorPCAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKzwgI2xpbmUgMzQzNiAiY29uZmlndXJlIgorPCAjaW5jbHVkZSAiY29uZmRlZnMuaCIKKzwgI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorPCAjaWYgU1REQ19IRUFERVJTCis8ICNpbmNsdWRlIDxzdGRsaWIuaD4KKzwgI2luY2x1ZGUgPHN0ZGRlZi5oPgorPCAjZW5kaWYKKzwgRU9GCis8IGlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKzwgICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSl1aW50MTZfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzwgICBhY19jdl90eXBlX3VpbnQxNl90PXllcworLS0tCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgdWludDE2X3QiID4mNQorPiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgdWludDE2X3QuLi4gIiA+JjY7IH0KKz4gaWYgdGVzdCAiJHthY19jdl90eXBlX3VpbnQxNl90K3NldH0iID0gc2V0OyB0aGVuCis+ICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKzM0NDhkODAwOQorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzM0NDlhODAxMSw4MDg0Cis+IGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKz4gJGFjX2luY2x1ZGVzX2RlZmF1bHQKKz4gaW50Cis+IG1haW4gKCkKKz4geworPiBpZiAoc2l6ZW9mICh1aW50MTZfdCkpCis+ICAgICAgICByZXR1cm4gMDsKKz4gICA7Cis+ICAgcmV0dXJuIDA7Cis+IH0KKz4gX0FDRU9GCis+IHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKKz4gaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKKz4gY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCis+ICAgYWNfc3RhdHVzPSQ/Cis+ICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKz4gICBybSAtZiBjb25mdGVzdC5lcjEKKz4gICBjYXQgY29uZnRlc3QuZXJyID4mNQorPiAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cis+ICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworPiAJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorPiAJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKz4gICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCis+ICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGNvbmZkZWZzLmguICAqLworPiBfQUNFT0YKKz4gY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Cis+IGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogZW5kIGNvbmZkZWZzLmguICAqLworPiAkYWNfaW5jbHVkZXNfZGVmYXVsdAorPiBpbnQKKz4gbWFpbiAoKQorPiB7Cis+IGlmIChzaXplb2YgKCh1aW50MTZfdCkpKQorPiAJICByZXR1cm4gMDsKKz4gICA7Cis+ICAgcmV0dXJuIDA7Cis+IH0KKz4gX0FDRU9GCis+IHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKKz4gaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKKz4gY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCis+ICAgYWNfc3RhdHVzPSQ/Cis+ICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKz4gICBybSAtZiBjb25mdGVzdC5lcjEKKz4gICBjYXQgY29uZnRlc3QuZXJyID4mNQorPiAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cis+ICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworPiAJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorPiAJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKz4gICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCis+ICAgOgorPiBlbHNlCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCis+IAlhY19jdl90eXBlX3VpbnQxNl90PXllcworMzQ1MWM4MDg2LDgwOTEKKzwgcm0gLWYgY29uZnRlc3QqCistLS0KKz4gCis+IHJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorPiBlbHNlCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCiszNDU0LDM0NTZjODA5NCw4MTAzCis8IGVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV91aW50MTZfdCIgMT4mNgorPCBpZiB0ZXN0ICRhY19jdl90eXBlX3VpbnQxNl90ID0gbm87IHRoZW4KKzwgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKy0tLQorPiAKKz4gcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Cis+IGZpCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX3VpbnQxNl90IiA+JjUKKz4gJGFzX2VjaG8gIiRhY19jdl90eXBlX3VpbnQxNl90IiA+JjY7IH0KKz4gaWYgdGVzdCAieCRhY19jdl90eXBlX3VpbnQxNl90IiA9IHgiInllczsgdGhlbgorPiAgIDoKKz4gZWxzZQorPiAKKz4gY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorMzQ1OGM4MTA1Cis8IEVPRgorLS0tCis+IF9BQ0VPRgorMzQ2MiwzNDc5YzgxMDksODExMgorPCBlY2hvICRhY19uICJjaGVja2luZyBmb3IgaW50MzJfdCIiLi4uICRhY19jIiAxPiY2Cis8IGVjaG8gImNvbmZpZ3VyZTozNDY0OiBjaGVja2luZyBmb3IgaW50MzJfdCIgPiY1Cis8IGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX2ludDMyX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorPCAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Cis8IGVsc2UKKzwgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCis8ICNsaW5lIDM0NjkgImNvbmZpZ3VyZSIKKzwgI2luY2x1ZGUgImNvbmZkZWZzLmgiCis8ICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKzwgI2lmIFNURENfSEVBREVSUworPCAjaW5jbHVkZSA8c3RkbGliLmg+Cis8ICNpbmNsdWRlIDxzdGRkZWYuaD4KKzwgI2VuZGlmCis8IEVPRgorPCBpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Cis8ICAgZWdyZXAgIihefFteYS16QS1aXzAtOV0paW50MzJfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzwgICBhY19jdl90eXBlX2ludDMyX3Q9eWVzCistLS0KKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBpbnQzMl90IiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGludDMyX3QuLi4gIiA+JjY7IH0KKz4gaWYgdGVzdCAiJHthY19jdl90eXBlX2ludDMyX3Qrc2V0fSIgPSBzZXQ7IHRoZW4KKz4gICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorMzQ4MWQ4MTEzCis8ICAgcm0gLXJmIGNvbmZ0ZXN0KgorMzQ4MmE4MTE1LDgxODgKKz4gY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGNvbmZkZWZzLmguICAqLworPiBfQUNFT0YKKz4gY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Cis+IGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogZW5kIGNvbmZkZWZzLmguICAqLworPiAkYWNfaW5jbHVkZXNfZGVmYXVsdAorPiBpbnQKKz4gbWFpbiAoKQorPiB7Cis+IGlmIChzaXplb2YgKGludDMyX3QpKQorPiAgICAgICAgcmV0dXJuIDA7Cis+ICAgOworPiAgIHJldHVybiAwOworPiB9Cis+IF9BQ0VPRgorPiBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Cis+IGlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorPiAgIGFjX3N0YXR1cz0kPworPiAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCis+ICAgcm0gLWYgY29uZnRlc3QuZXIxCis+ICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKz4gCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKz4gCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCis+ICAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorPiAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKz4gJGFjX2luY2x1ZGVzX2RlZmF1bHQKKz4gaW50Cis+IG1haW4gKCkKKz4geworPiBpZiAoc2l6ZW9mICgoaW50MzJfdCkpKQorPiAJICByZXR1cm4gMDsKKz4gICA7Cis+ICAgcmV0dXJuIDA7Cis+IH0KKz4gX0FDRU9GCis+IHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKKz4gaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKKz4gY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCis+ICAgYWNfc3RhdHVzPSQ/Cis+ICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKz4gICBybSAtZiBjb25mdGVzdC5lcjEKKz4gICBjYXQgY29uZnRlc3QuZXJyID4mNQorPiAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cis+ICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworPiAJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorPiAJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKz4gICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCis+ICAgOgorPiBlbHNlCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCis+IAlhY19jdl90eXBlX2ludDMyX3Q9eWVzCiszNDg0YzgxOTAsODE5NQorPCBybSAtZiBjb25mdGVzdCoKKy0tLQorPiAKKz4gcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Cis+IGVsc2UKKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKzM0ODcsMzQ4OWM4MTk4LDgyMDcKKzwgZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX2ludDMyX3QiIDE+JjYKKzwgaWYgdGVzdCAkYWNfY3ZfdHlwZV9pbnQzMl90ID0gbm87IHRoZW4KKzwgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKy0tLQorPiAKKz4gcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Cis+IGZpCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX2ludDMyX3QiID4mNQorPiAkYXNfZWNobyAiJGFjX2N2X3R5cGVfaW50MzJfdCIgPiY2OyB9Cis+IGlmIHRlc3QgIngkYWNfY3ZfdHlwZV9pbnQzMl90IiA9IHgiInllczsgdGhlbgorPiAgIDoKKz4gZWxzZQorPiAKKz4gY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorMzQ5MWM4MjA5Cis8IEVPRgorLS0tCis+IF9BQ0VPRgorMzQ5NSwzNTEyYzgyMTMsODIxNgorPCBlY2hvICRhY19uICJjaGVja2luZyBmb3IgdWludDMyX3QiIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6MzQ5NzogY2hlY2tpbmcgZm9yIHVpbnQzMl90IiA+JjUKKzwgaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfdWludDMyX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgorPCAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Cis8IGVsc2UKKzwgICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCis8ICNsaW5lIDM1MDIgImNvbmZpZ3VyZSIKKzwgI2luY2x1ZGUgImNvbmZkZWZzLmgiCis8ICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKzwgI2lmIFNURENfSEVBREVSUworPCAjaW5jbHVkZSA8c3RkbGliLmg+Cis8ICNpbmNsdWRlIDxzdGRkZWYuaD4KKzwgI2VuZGlmCis8IEVPRgorPCBpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Cis8ICAgZWdyZXAgIihefFteYS16QS1aXzAtOV0pdWludDMyX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKzwgICBybSAtcmYgY29uZnRlc3QqCis8ICAgYWNfY3ZfdHlwZV91aW50MzJfdD15ZXMKKy0tLQorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHVpbnQzMl90IiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHVpbnQzMl90Li4uICIgPiY2OyB9Cis+IGlmIHRlc3QgIiR7YWNfY3ZfdHlwZV91aW50MzJfdCtzZXR9IiA9IHNldDsgdGhlbgorPiAgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CiszNTE0ZDgyMTcKKzwgICBybSAtcmYgY29uZnRlc3QqCiszNTE1YTgyMTksODI5MgorPiBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogY29uZmRlZnMuaC4gICovCis+IF9BQ0VPRgorPiBjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKz4gY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBlbmQgY29uZmRlZnMuaC4gICovCis+ICRhY19pbmNsdWRlc19kZWZhdWx0Cis+IGludAorPiBtYWluICgpCis+IHsKKz4gaWYgKHNpemVvZiAodWludDMyX3QpKQorPiAgICAgICAgcmV0dXJuIDA7Cis+ICAgOworPiAgIHJldHVybiAwOworPiB9Cis+IF9BQ0VPRgorPiBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Cis+IGlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorPiAgIGFjX3N0YXR1cz0kPworPiAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCis+ICAgcm0gLWYgY29uZnRlc3QuZXIxCis+ICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKz4gCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKz4gCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCis+ICAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorPiAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKz4gJGFjX2luY2x1ZGVzX2RlZmF1bHQKKz4gaW50Cis+IG1haW4gKCkKKz4geworPiBpZiAoc2l6ZW9mICgodWludDMyX3QpKSkKKz4gCSAgcmV0dXJuIDA7Cis+ICAgOworPiAgIHJldHVybiAwOworPiB9Cis+IF9BQ0VPRgorPiBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Cis+IGlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorPiAgIGFjX3N0YXR1cz0kPworPiAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCis+ICAgcm0gLWYgY29uZnRlc3QuZXIxCis+ICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKz4gCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKz4gCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCis+ICAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorPiAgIDoKKz4gZWxzZQorPiAgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Cis+IAorPiAJYWNfY3ZfdHlwZV91aW50MzJfdD15ZXMKKzM1MTdjODI5NCw4Mjk5Cis8IHJtIC1mIGNvbmZ0ZXN0KgorLS0tCis+IAorPiBybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKz4gZWxzZQorPiAgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Cis+IAorMzUyMCwzNTIyYzgzMDIsODMxMQorPCBlY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfdWludDMyX3QiIDE+JjYKKzwgaWYgdGVzdCAkYWNfY3ZfdHlwZV91aW50MzJfdCA9IG5vOyB0aGVuCis8ICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCistLS0KKz4gCis+IHJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorPiBmaQorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdHlwZV91aW50MzJfdCIgPiY1Cis+ICRhc19lY2hvICIkYWNfY3ZfdHlwZV91aW50MzJfdCIgPiY2OyB9Cis+IGlmIHRlc3QgIngkYWNfY3ZfdHlwZV91aW50MzJfdCIgPSB4IiJ5ZXM7IHRoZW4KKz4gICA6Cis+IGVsc2UKKz4gCis+IGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKzM1MjRjODMxMworPCBFT0YKKy0tLQorPiBfQUNFT0YKKzM1MjgsMzU0NWM4MzE3LDgzMjAKKzwgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGludDY0X3QiIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6MzUzMDogY2hlY2tpbmcgZm9yIGludDY0X3QiID4mNQorPCBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9pbnQ2NF90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKzwgICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorPCBlbHNlCis8ICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorPCAjbGluZSAzNTM1ICJjb25maWd1cmUiCis8ICNpbmNsdWRlICJjb25mZGVmcy5oIgorPCAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Cis8ICNpZiBTVERDX0hFQURFUlMKKzwgI2luY2x1ZGUgPHN0ZGxpYi5oPgorPCAjaW5jbHVkZSA8c3RkZGVmLmg+Cis8ICNlbmRpZgorPCBFT0YKKzwgaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAorPCAgIGVncmVwICIoXnxbXmEtekEtWl8wLTldKWludDY0X3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKzwgICBybSAtcmYgY29uZnRlc3QqCis8ICAgYWNfY3ZfdHlwZV9pbnQ2NF90PXllcworLS0tCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgaW50NjRfdCIgPiY1Cis+ICRhc19lY2hvX24gImNoZWNraW5nIGZvciBpbnQ2NF90Li4uICIgPiY2OyB9Cis+IGlmIHRlc3QgIiR7YWNfY3ZfdHlwZV9pbnQ2NF90K3NldH0iID0gc2V0OyB0aGVuCis+ICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKzM1NDdkODMyMQorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzM1NDhhODMyMyw4NDA0Cis+IGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKz4gJGFjX2luY2x1ZGVzX2RlZmF1bHQKKz4gaW50Cis+IG1haW4gKCkKKz4geworPiBpZiAoc2l6ZW9mIChpbnQ2NF90KSkKKz4gICAgICAgIHJldHVybiAwOworPiAgIDsKKz4gICByZXR1cm4gMDsKKz4gfQorPiBfQUNFT0YKKz4gcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAorPiBpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKz4gICBhY19zdGF0dXM9JD8KKz4gICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorPiAgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorPiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Cis+IAkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Cis+IAkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorPiAgICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KKz4gICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogY29uZmRlZnMuaC4gICovCis+IF9BQ0VPRgorPiBjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKz4gY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBlbmQgY29uZmRlZnMuaC4gICovCis+ICRhY19pbmNsdWRlc19kZWZhdWx0Cis+IGludAorPiBtYWluICgpCis+IHsKKz4gaWYgKHNpemVvZiAoKGludDY0X3QpKSkKKz4gCSAgcmV0dXJuIDA7Cis+ICAgOworPiAgIHJldHVybiAwOworPiB9Cis+IF9BQ0VPRgorPiBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Cis+IGlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorPiAgIGFjX3N0YXR1cz0kPworPiAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCis+ICAgcm0gLWYgY29uZnRlc3QuZXIxCis+ICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKKz4gCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKz4gCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCis+ICAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgorPiAgIDoKKz4gZWxzZQorPiAgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Cis+IAorPiAJYWNfY3ZfdHlwZV9pbnQ2NF90PXllcworPiBmaQorPiAKKz4gcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Cis+IGVsc2UKKz4gICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKz4gc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorPiAKKz4gCiszNTUwZDg0MDUKKzwgcm0gLWYgY29uZnRlc3QqCiszNTUxYTg0MDcKKz4gcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiszNTUzLDM1NTVjODQwOSw4NDE1Cis8IGVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9pbnQ2NF90IiAxPiY2Cis8IGlmIHRlc3QgJGFjX2N2X3R5cGVfaW50NjRfdCA9IG5vOyB0aGVuCis8ICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCistLS0KKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfaW50NjRfdCIgPiY1Cis+ICRhc19lY2hvICIkYWNfY3ZfdHlwZV9pbnQ2NF90IiA+JjY7IH0KKz4gaWYgdGVzdCAieCRhY19jdl90eXBlX2ludDY0X3QiID0geCIieWVzOyB0aGVuCis+ICAgOgorPiBlbHNlCis+IAorPiBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCiszNTU3Yzg0MTcKKzwgRU9GCistLS0KKz4gX0FDRU9GCiszNTYxLDM1NzhjODQyMSw4NDI0Cis8IGVjaG8gJGFjX24gImNoZWNraW5nIGZvciB1aW50NjRfdCIiLi4uICRhY19jIiAxPiY2Cis8IGVjaG8gImNvbmZpZ3VyZTozNTYzOiBjaGVja2luZyBmb3IgdWludDY0X3QiID4mNQorPCBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV91aW50NjRfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCis8ICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKzwgZWxzZQorPCAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKzwgI2xpbmUgMzU2OCAiY29uZmlndXJlIgorPCAjaW5jbHVkZSAiY29uZmRlZnMuaCIKKzwgI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorPCAjaWYgU1REQ19IRUFERVJTCis8ICNpbmNsdWRlIDxzdGRsaWIuaD4KKzwgI2luY2x1ZGUgPHN0ZGRlZi5oPgorPCAjZW5kaWYKKzwgRU9GCis8IGlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKzwgICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSl1aW50NjRfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzwgICBhY19jdl90eXBlX3VpbnQ2NF90PXllcworLS0tCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgdWludDY0X3QiID4mNQorPiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgdWludDY0X3QuLi4gIiA+JjY7IH0KKz4gaWYgdGVzdCAiJHthY19jdl90eXBlX3VpbnQ2NF90K3NldH0iID0gc2V0OyB0aGVuCis+ICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKzM1ODBkODQyNQorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzM1ODFhODQyNyw4NTAwCis+IGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKz4gJGFjX2luY2x1ZGVzX2RlZmF1bHQKKz4gaW50Cis+IG1haW4gKCkKKz4geworPiBpZiAoc2l6ZW9mICh1aW50NjRfdCkpCis+ICAgICAgICByZXR1cm4gMDsKKz4gICA7Cis+ICAgcmV0dXJuIDA7Cis+IH0KKz4gX0FDRU9GCis+IHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKKz4gaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKKz4gY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCis+ICAgYWNfc3RhdHVzPSQ/Cis+ICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKz4gICBybSAtZiBjb25mdGVzdC5lcjEKKz4gICBjYXQgY29uZnRlc3QuZXJyID4mNQorPiAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cis+ICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworPiAJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorPiAJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKz4gICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCis+ICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGNvbmZkZWZzLmguICAqLworPiBfQUNFT0YKKz4gY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Cis+IGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogZW5kIGNvbmZkZWZzLmguICAqLworPiAkYWNfaW5jbHVkZXNfZGVmYXVsdAorPiBpbnQKKz4gbWFpbiAoKQorPiB7Cis+IGlmIChzaXplb2YgKCh1aW50NjRfdCkpKQorPiAJICByZXR1cm4gMDsKKz4gICA7Cis+ICAgcmV0dXJuIDA7Cis+IH0KKz4gX0FDRU9GCis+IHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKKz4gaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKKz4gY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCis+ICAgYWNfc3RhdHVzPSQ/Cis+ICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKz4gICBybSAtZiBjb25mdGVzdC5lcjEKKz4gICBjYXQgY29uZnRlc3QuZXJyID4mNQorPiAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cis+ICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworPiAJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorPiAJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKz4gICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCis+ICAgOgorPiBlbHNlCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCis+IAlhY19jdl90eXBlX3VpbnQ2NF90PXllcworMzU4M2M4NTAyLDg1MDcKKzwgcm0gLWYgY29uZnRlc3QqCistLS0KKz4gCis+IHJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorPiBlbHNlCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCiszNTg2LDM1ODhjODUxMCw4NTE5Cis8IGVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV91aW50NjRfdCIgMT4mNgorPCBpZiB0ZXN0ICRhY19jdl90eXBlX3VpbnQ2NF90ID0gbm87IHRoZW4KKzwgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKy0tLQorPiAKKz4gcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Cis+IGZpCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX3VpbnQ2NF90IiA+JjUKKz4gJGFzX2VjaG8gIiRhY19jdl90eXBlX3VpbnQ2NF90IiA+JjY7IH0KKz4gaWYgdGVzdCAieCRhY19jdl90eXBlX3VpbnQ2NF90IiA9IHgiInllczsgdGhlbgorPiAgIDoKKz4gZWxzZQorPiAKKz4gY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorMzU5MGM4NTIxCis8IEVPRgorLS0tCis+IF9BQ0VPRgorMzY1MSwzNjU5Yzg1ODIsODYwMAorPCBhY19zYWZlPWBlY2hvICJ3Y2hhci5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKKzwgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdjaGFyLmgiIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6MzY1NDogY2hlY2tpbmcgZm9yIHdjaGFyLmgiID4mNQorPCBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KKzwgICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgorPCBlbHNlCis8ICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgorPCAjbGluZSAzNjU5ICJjb25maWd1cmUiCis8ICNpbmNsdWRlICJjb25mZGVmcy5oIgorLS0tCis+IGlmIHRlc3QgIiR7YWNfY3ZfaGVhZGVyX3djaGFyX2grc2V0fSIgPSBzZXQ7IHRoZW4KKz4gICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHdjaGFyLmgiID4mNQorPiAkYXNfZWNob19uICJjaGVja2luZyBmb3Igd2NoYXIuaC4uLiAiID4mNjsgfQorPiBpZiB0ZXN0ICIke2FjX2N2X2hlYWRlcl93Y2hhcl9oK3NldH0iID0gc2V0OyB0aGVuCis+ICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKz4gZmkKKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2hlYWRlcl93Y2hhcl9oIiA+JjUKKz4gJGFzX2VjaG8gIiRhY19jdl9oZWFkZXJfd2NoYXJfaCIgPiY2OyB9Cis+IGVsc2UKKz4gICAjIElzIHRoZSBoZWFkZXIgY29tcGlsYWJsZT8KKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdjaGFyLmggdXNhYmlsaXR5IiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2NoYXIuaCB1c2FiaWxpdHkuLi4gIiA+JjY7IH0KKz4gY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGNvbmZkZWZzLmguICAqLworPiBfQUNFT0YKKz4gY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Cis+IGNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogZW5kIGNvbmZkZWZzLmguICAqLworPiAkYWNfaW5jbHVkZXNfZGVmYXVsdAorMzY2MSwzNjc5Yzg2MDIsODcwMQorPCBFT0YKKzwgYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKKzwgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNjY0OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQorPCBhY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCis8IGlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCis8ICAgcm0gLXJmIGNvbmZ0ZXN0KgorPCAgIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCis8IGVsc2UKKzwgICBlY2hvICIkYWNfZXJyIiA+JjUKKzwgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPCAgIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzwgICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCis8IGZpCis8IHJtIC1mIGNvbmZ0ZXN0KgorPCBmaQorPCBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgorPCAgIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKKzwgICA6CistLS0KKz4gX0FDRU9GCis+IHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKKz4gaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKKz4gY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCis+ICAgYWNfc3RhdHVzPSQ/Cis+ICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKz4gICBybSAtZiBjb25mdGVzdC5lcjEKKz4gICBjYXQgY29uZnRlc3QuZXJyID4mNQorPiAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cis+ICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworPiAJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorPiAJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKz4gICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCis+ICAgYWNfaGVhZGVyX2NvbXBpbGVyPXllcworPiBlbHNlCis+ICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis+IHNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKz4gCis+IAlhY19oZWFkZXJfY29tcGlsZXI9bm8KKz4gZmkKKz4gCis+IHJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjUKKz4gJGFzX2VjaG8gIiRhY19oZWFkZXJfY29tcGlsZXIiID4mNjsgfQorPiAKKz4gIyBJcyB0aGUgaGVhZGVyIHByZXNlbnQ/Cis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3Y2hhci5oIHByZXNlbmNlIiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2NoYXIuaCBwcmVzZW5jZS4uLiAiID4mNjsgfQorPiBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKz4gLyogY29uZmRlZnMuaC4gICovCis+IF9BQ0VPRgorPiBjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKKz4gY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBlbmQgY29uZmRlZnMuaC4gICovCis+ICNpbmNsdWRlIDx3Y2hhci5oPgorPiBfQUNFT0YKKz4gaWYgeyAoYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiCis+IGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj5jb25mdGVzdC5lcjEKKz4gICBhY19zdGF0dXM9JD8KKz4gICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgorPiAgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorPiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1Cis+ICAgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKz4gICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsICYmIHsKKz4gCSB0ZXN0IC16ICIkYWNfY19wcmVwcm9jX3dhcm5fZmxhZyRhY19jX3dlcnJvcl9mbGFnIiB8fAorPiAJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKz4gICAgICAgIH07IHRoZW4KKz4gICBhY19oZWFkZXJfcHJlcHJvYz15ZXMKKz4gZWxzZQorPiAgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Cis+IAorPiAgIGFjX2hlYWRlcl9wcmVwcm9jPW5vCis+IGZpCis+IAorPiBybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfaGVhZGVyX3ByZXByb2MiID4mNQorPiAkYXNfZWNobyAiJGFjX2hlYWRlcl9wcmVwcm9jIiA+JjY7IH0KKz4gCis+ICMgU28/ICBXaGF0IGFib3V0IHRoaXMgaGVhZGVyPworPiBjYXNlICRhY19oZWFkZXJfY29tcGlsZXI6JGFjX2hlYWRlcl9wcmVwcm9jOiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluCis+ICAgeWVzOm5vOiApCis+ICAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogd2NoYXIuaDogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHdjaGFyLmg6IGFjY2VwdGVkIGJ5IHRoZSBjb21waWxlciwgcmVqZWN0ZWQgYnkgdGhlIHByZXByb2Nlc3NvciEiID4mMjt9Cis+ICAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogd2NoYXIuaDogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHdjaGFyLmg6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mMjt9Cis+ICAgICBhY19oZWFkZXJfcHJlcHJvYz15ZXMKKz4gICAgIDs7Cis+ICAgbm86eWVzOiogKQorPiAgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IHdjaGFyLmg6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHdjaGFyLmg6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiYyO30KKz4gICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiB3Y2hhci5oOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogd2NoYXIuaDogICAgIGNoZWNrIGZvciBtaXNzaW5nIHByZXJlcXVpc2l0ZSBoZWFkZXJzPyIgPiYyO30KKz4gICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiB3Y2hhci5oOiBzZWUgdGhlIEF1dG9jb25mIGRvY3VtZW50YXRpb24iID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB3Y2hhci5oOiBzZWUgdGhlIEF1dG9jb25mIGRvY3VtZW50YXRpb24iID4mMjt9Cis+ICAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogd2NoYXIuaDogICAgIHNlY3Rpb24gXCJQcmVzZW50IEJ1dCBDYW5ub3QgQmUgQ29tcGlsZWRcIiIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHdjaGFyLmg6ICAgICBzZWN0aW9uIFwiUHJlc2VudCBCdXQgQ2Fubm90IEJlIENvbXBpbGVkXCIiID4mMjt9Cis+ICAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogd2NoYXIuaDogcHJvY2VlZGluZyB3aXRoIHRoZSBwcmVwcm9jZXNzb3IncyByZXN1bHQiID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB3Y2hhci5oOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiYyO30KKz4gICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiB3Y2hhci5oOiBpbiB0aGUgZnV0dXJlLCB0aGUgY29tcGlsZXIgd2lsbCB0YWtlIHByZWNlZGVuY2UiID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB3Y2hhci5oOiBpbiB0aGUgZnV0dXJlLCB0aGUgY29tcGlsZXIgd2lsbCB0YWtlIHByZWNlZGVuY2UiID4mMjt9Cis+IAorPiAgICAgOzsKKz4gZXNhYworPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHdjaGFyLmgiID4mNQorPiAkYXNfZWNob19uICJjaGVja2luZyBmb3Igd2NoYXIuaC4uLiAiID4mNjsgfQorPiBpZiB0ZXN0ICIke2FjX2N2X2hlYWRlcl93Y2hhcl9oK3NldH0iID0gc2V0OyB0aGVuCis+ICAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKKzM2ODFjODcwMyw4NzA3Cis8ICAgZWNobyAiJGFjX3QiIm5vIiAxPiY2CistLS0KKz4gICBhY19jdl9oZWFkZXJfd2NoYXJfaD0kYWNfaGVhZGVyX3ByZXByb2MKKz4gZmkKKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2hlYWRlcl93Y2hhcl9oIiA+JjUKKz4gJGFzX2VjaG8gIiRhY19jdl9oZWFkZXJfd2NoYXJfaCIgPiY2OyB9Cis+IAorMzY4M2E4NzEwCis+IAorMzY4OWM4NzE2Cis8ICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKy0tLQorPiAgICAgY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKzM2OTFjODcxOAorPCBFT0YKKy0tLQorPiBfQUNFT0YKKzM2OTQsMzcxOWM4NzIxLDg3ODIKKzwgICAgICAgICAKKzwgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyB3Y3NjcHkiIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6MzY5NzogY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyB3Y3NjcHkiID4mNQorPCBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfc2VhcmNoX3djc2NweScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCis8ICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKzwgZWxzZQorPCAgIGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUz0iJExJQlMiCis8IGFjX2N2X3NlYXJjaF93Y3NjcHk9Im5vIgorPCBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCis8ICNsaW5lIDM3MDQgImNvbmZpZ3VyZSIKKzwgI2luY2x1ZGUgImNvbmZkZWZzLmgiCis8IC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCis8IC8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKKzwgICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCis8IGNoYXIgd2NzY3B5KCk7Cis8IAorPCBpbnQgbWFpbigpIHsKKzwgd2NzY3B5KCkKKzwgOyByZXR1cm4gMDsgfQorPCBFT0YKKzwgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNzE1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KKzwgICBybSAtcmYgY29uZnRlc3QqCis8ICAgYWNfY3Zfc2VhcmNoX3djc2NweT0ibm9uZSByZXF1aXJlZCIKKzwgZWxzZQorPCAgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Cis8ICAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1CistLS0KKz4gICAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyB3Y3NjcHkiID4mNQorPiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIHdjc2NweS4uLiAiID4mNjsgfQorPiBpZiB0ZXN0ICIke2FjX2N2X3NlYXJjaF93Y3NjcHkrc2V0fSIgPSBzZXQ7IHRoZW4KKz4gICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorPiBlbHNlCis+ICAgYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTPSRMSUJTCis+IGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKz4gCis+IC8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorPiAgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKz4gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKz4gI2lmZGVmIF9fY3BsdXNwbHVzCis+IGV4dGVybiAiQyIKKz4gI2VuZGlmCis+IGNoYXIgd2NzY3B5ICgpOworPiBpbnQKKz4gbWFpbiAoKQorPiB7Cis+IHJldHVybiB3Y3NjcHkgKCk7Cis+ICAgOworPiAgIHJldHVybiAwOworPiB9Cis+IF9BQ0VPRgorPiBmb3IgYWNfbGliIGluICcnIHdjcyB3OyBkbworPiAgIGlmIHRlc3QgLXogIiRhY19saWIiOyB0aGVuCis+ICAgICBhY19yZXM9Im5vbmUgcmVxdWlyZWQiCis+ICAgZWxzZQorPiAgICAgYWNfcmVzPS1sJGFjX2xpYgorPiAgICAgTElCUz0iLWwkYWNfbGliICAkYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTIgorPiAgIGZpCis+ICAgcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKKz4gaWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKKz4gY2FzZSAiKCgkYWNfdHJ5IiBpbgorPiAgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworPiAgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworPiBlc2FjCis+IGV2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIKKz4gJGFzX2VjaG8gIiRhY190cnlfZWNobyIpID4mNQorPiAgIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCis+ICAgYWNfc3RhdHVzPSQ/Cis+ICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKz4gICBybSAtZiBjb25mdGVzdC5lcjEKKz4gICBjYXQgY29uZnRlc3QuZXJyID4mNQorPiAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cis+ICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeworPiAJIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAorPiAJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKz4gICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgeworPiAJIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzIHx8Cis+IAkgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQKKz4gICAgICAgIH07IHRoZW4KKz4gICBhY19jdl9zZWFyY2hfd2NzY3B5PSRhY19yZXMKKz4gZWxzZQorPiAgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Cis+IAorPiAKKzM3MjEsMzc0MmM4Nzg0LDg3ODkKKzwgcm0gLWYgY29uZnRlc3QqCis8IHRlc3QgIiRhY19jdl9zZWFyY2hfd2NzY3B5IiA9ICJubyIgJiYgZm9yIGkgaW4gd2NzIHc7IGRvCis8IExJQlM9Ii1sJGkgICRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMiCis8IGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKzwgI2xpbmUgMzcyNiAiY29uZmlndXJlIgorPCAjaW5jbHVkZSAiY29uZmRlZnMuaCIKKzwgLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KKzwgLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorPCAgICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKzwgY2hhciB3Y3NjcHkoKTsKKzwgCis8IGludCBtYWluKCkgeworPCB3Y3NjcHkoKQorPCA7IHJldHVybiAwOyB9Cis8IEVPRgorPCBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM3Mzc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgorPCAgIHJtIC1yZiBjb25mdGVzdCoKKzwgICBhY19jdl9zZWFyY2hfd2NzY3B5PSItbCRpIgorPCBicmVhaworPCBlbHNlCis8ICAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKzwgICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKy0tLQorPiAKKz4gcm0gLXJmIGNvbmZ0ZXN0LmRTWU0KKz4gcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKKz4gICAgICAgY29uZnRlc3QkYWNfZXhlZXh0Cis+ICAgaWYgdGVzdCAiJHthY19jdl9zZWFyY2hfd2NzY3B5K3NldH0iID0gc2V0OyB0aGVuCis+ICAgYnJlYWsKKzM3NDRkODc5MAorPCBybSAtZiBjb25mdGVzdCoKKzM3NDZjODc5Miw4Nzk4Cis8IExJQlM9IiRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMiCistLS0KKz4gaWYgdGVzdCAiJHthY19jdl9zZWFyY2hfd2NzY3B5K3NldH0iID0gc2V0OyB0aGVuCis+ICAgOgorPiBlbHNlCis+ICAgYWNfY3Zfc2VhcmNoX3djc2NweT1ubworPiBmaQorPiBybSBjb25mdGVzdC4kYWNfZXh0Cis+IExJQlM9JGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUworMzc0N2E4ODAwLDg4MDQKKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3NlYXJjaF93Y3NjcHkiID4mNQorPiAkYXNfZWNobyAiJGFjX2N2X3NlYXJjaF93Y3NjcHkiID4mNjsgfQorPiBhY19yZXM9JGFjX2N2X3NlYXJjaF93Y3NjcHkKKz4gaWYgdGVzdCAiJGFjX3JlcyIgIT0gbm87IHRoZW4KKz4gICB0ZXN0ICIkYWNfcmVzIiA9ICJub25lIHJlcXVpcmVkIiB8fCBMSUJTPSIkYWNfcmVzICRMSUJTIgorMzc0OSwzNzU0ZDg4MDUKKzwgZWNobyAiJGFjX3QiIiRhY19jdl9zZWFyY2hfd2NzY3B5IiAxPiY2Cis8IGlmIHRlc3QgIiRhY19jdl9zZWFyY2hfd2NzY3B5IiAhPSAibm8iOyB0aGVuCis8ICAgdGVzdCAiJGFjX2N2X3NlYXJjaF93Y3NjcHkiID0gIm5vbmUgcmVxdWlyZWQiIHx8IExJQlM9IiRhY19jdl9zZWFyY2hfd2NzY3B5ICRMSUJTIgorPCAgIAorPCBlbHNlIDoKKzwgICAKKzM3NTVhODgwNworPiAKKzM3NjYsMzc2OWM4ODE4LDg4MjEKKzwgZWNobyAkYWNfbiAiY2hlY2tpbmcgc2l6ZSBvZiB3Y2hhcl90IiIuLi4gJGFjX2MiIDE+JjYKKzwgZWNobyAiY29uZmlndXJlOjM3Njg6IGNoZWNraW5nIHNpemUgb2Ygd2NoYXJfdCIgPiY1Cis8IGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9zaXplb2Zfd2NoYXJfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCis8ICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKKy0tLQorPiB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgc2l6ZSBvZiB3Y2hhcl90IiA+JjUKKz4gJGFzX2VjaG9fbiAiY2hlY2tpbmcgc2l6ZSBvZiB3Y2hhcl90Li4uICIgPiY2OyB9Cis+IGlmIHRlc3QgIiR7YWNfY3Zfc2l6ZW9mX3djaGFyX3Qrc2V0fSIgPSBzZXQ7IHRoZW4KKz4gICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorMzc3NCwzNzc2Yzg4MjYsODgzMQorPCAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKKzwgI2xpbmUgMzc3NiAiY29uZmlndXJlIgorPCAjaW5jbHVkZSAiY29uZmRlZnMuaCIKKy0tLQorPiAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorPiAvKiBjb25mZGVmcy5oLiAgKi8KKz4gX0FDRU9GCis+IGNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorPiBjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCis+IC8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKzM3OTIsMzc5NGM4ODQ3LDg4NjkKKzwgRU9GCis8IGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mzc5NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAorPCB0aGVuCistLS0KKz4gX0FDRU9GCis+IHJtIC1mIGNvbmZ0ZXN0JGFjX2V4ZWV4dAorPiBpZiB7IChhY190cnk9IiRhY19saW5rIgorPiBjYXNlICIoKCRhY190cnkiIGluCis+ICAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Cis+ICAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Cis+IGVzYWMKKz4gZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIgorPiAkYXNfZWNobyAiJGFjX3RyeV9lY2hvIikgPiY1Cis+ICAgKGV2YWwgIiRhY19saW5rIikgMj4mNQorPiAgIGFjX3N0YXR1cz0kPworPiAgICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Cis+ICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeyBhY190cnk9Jy4vY29uZnRlc3QkYWNfZXhlZXh0JworPiAgIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KKz4gICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKz4gICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKKz4gZXNhYworPiBldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiCis+ICRhc19lY2hvICIkYWNfdHJ5X2VjaG8iKSA+JjUKKz4gICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKKz4gICBhY19zdGF0dXM9JD8KKz4gICAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorPiAgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCiszNzk3LDM4MDBjODg3Miw4ODc3Cis8ICAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKKzwgICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKKzwgICBybSAtZnIgY29uZnRlc3QqCis8ICAgYWNfY3Zfc2l6ZW9mX3djaGFyX3Q9MAorLS0tCis+ICAgJGFzX2VjaG8gIiRhc19tZTogcHJvZ3JhbSBleGl0ZWQgd2l0aCBzdGF0dXMgJGFjX3N0YXR1cyIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorPiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Cis+IAorPiAoIGV4aXQgJGFjX3N0YXR1cyApCis+IGFjX2N2X3NpemVvZl93Y2hhcl90PTAKKzM4MDJjODg3OSw4ODgwCis8IHJtIC1mciBjb25mdGVzdCoKKy0tLQorPiBybSAtcmYgY29uZnRlc3QuZFNZTQorPiBybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKzM4MDRhODg4MworPiAKKzM4MDYsMzgwN2M4ODg1LDg4ODcKKzwgZWNobyAiJGFjX3QiIiRhY19jdl9zaXplb2Zfd2NoYXJfdCIgMT4mNgorPCBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgorLS0tCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9zaXplb2Zfd2NoYXJfdCIgPiY1Cis+ICRhc19lY2hvICIkYWNfY3Zfc2l6ZW9mX3djaGFyX3QiID4mNjsgfQorPiBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCiszODA5Yzg4ODkKKzwgRU9GCistLS0KKz4gX0FDRU9GCiszODE1Yzg4OTUsODg5NworPCAJICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBUaGVyZSBpcyB3Y2hhci5oIGJ1dCB0aGUgc2l6ZSBvZiB3Y2hhcl90IGlzIDAiIDE+JjI7IGV4aXQgMTsgfQorLS0tCis+IAkgICB7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogVGhlcmUgaXMgd2NoYXIuaCBidXQgdGhlIHNpemUgb2Ygd2NoYXJfdCBpcyAwIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IFRoZXJlIGlzIHdjaGFyLmggYnV0IHRoZSBzaXplIG9mIHdjaGFyX3QgaXMgMCIgPiYyO30KKz4gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CiszODI2Yzg5MDgKKzwgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWV4dHJhcyBvciAtLWRpc2FibGUtZXh0cmFzIHdhcyBnaXZlbi4KKy0tLQorPiAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZXh0cmFzIHdhcyBnaXZlbi4KKzM4MjgsMzgyOWM4OTEwCis8ICAgZW5hYmxldmFsPSIkZW5hYmxlX2V4dHJhcyIKKzwgICBjYXNlICIke2VuYWJsZXZhbH0iIGluCistLS0KKz4gICBlbmFibGV2YWw9JGVuYWJsZV9leHRyYXM7IGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKzM4MzJjODkxMyw4OTE1Cis8IAkJKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGZvciAtLWVuYWJsZS1leHRyYXMiIDE+JjI7IGV4aXQgMTsgfSA7OworLS0tCis+IAkJKikgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGJhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIC0tZW5hYmxlLWV4dHJhcyIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGZvciAtLWVuYWJsZS1leHRyYXMiID4mMjt9Cis+ICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfSA7OworMzg0NGM4OTI3Cis8ICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1leHRyYXMgb3IgLS1kaXNhYmxlLWV4dHJhcyB3YXMgZ2l2ZW4uCistLS0KKz4gIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWV4dHJhcyB3YXMgZ2l2ZW4uCiszODQ2LDM4NDdjODkyOQorPCAgIGVuYWJsZXZhbD0iJGVuYWJsZV9leHRyYXMiCis8ICAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorLS0tCis+ICAgZW5hYmxldmFsPSRlbmFibGVfZXh0cmFzOyBjYXNlICIke2VuYWJsZXZhbH0iIGluCiszODUwYzg5MzIsODkzNAorPCAJCSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgLS1lbmFibGUtaWN1aW8iIDE+JjI7IGV4aXQgMTsgfSA7OworLS0tCis+IAkJKikgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGJhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIC0tZW5hYmxlLWljdWlvIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGJhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIC0tZW5hYmxlLWljdWlvIiA+JjI7fQorPiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0gOzsKKzM4NjNjODk0NworPCAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbGF5b3V0IG9yIC0tZGlzYWJsZS1sYXlvdXQgd2FzIGdpdmVuLgorLS0tCis+ICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1sYXlvdXQgd2FzIGdpdmVuLgorMzg2NSwzODY2Yzg5NDkKKzwgICBlbmFibGV2YWw9IiRlbmFibGVfbGF5b3V0IgorPCAgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKy0tLQorPiAgIGVuYWJsZXZhbD0kZW5hYmxlX2xheW91dDsgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorMzg2OWM4OTUyLDg5NTQKKzwgCQkqKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGJhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIC0tZW5hYmxlLWxheW91dCIgMT4mMjsgZXhpdCAxOyB9IDs7CistLS0KKz4gCQkqKSB7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgLS1lbmFibGUtbGF5b3V0IiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGJhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIC0tZW5hYmxlLWxheW91dCIgPiYyO30KKz4gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9IDs7CiszODgyYzg5NjcsODk2OAorPCAjIENoZWNrIHdoZXRoZXIgLS13aXRoLWRhdGEtcGFja2FnaW5nIG9yIC0td2l0aG91dC1kYXRhLXBhY2thZ2luZyB3YXMgZ2l2ZW4uCistLS0KKz4gCis+ICMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZGF0YS1wYWNrYWdpbmcgd2FzIGdpdmVuLgorMzg4NCwzODg1Yzg5NzAKKzwgICB3aXRodmFsPSIkd2l0aF9kYXRhX3BhY2thZ2luZyIKKzwgICBjYXNlICIke3dpdGh2YWx9IiBpbgorLS0tCis+ICAgd2l0aHZhbD0kd2l0aF9kYXRhX3BhY2thZ2luZzsgY2FzZSAiJHt3aXRodmFsfSIgaW4KKzM4OTFjODk3Niw4OTc4Cis8IAkJKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBiYWQgdmFsdWUgJHt3aXRodmFsfSBmb3IgLS13aXRoLWRhdGEtcGFja2FnaW5nIiAxPiYyOyBleGl0IDE7IH0gOzsKKy0tLQorPiAJCSopIHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBiYWQgdmFsdWUgJHt3aXRodmFsfSBmb3IgLS13aXRoLWRhdGEtcGFja2FnaW5nIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGJhZCB2YWx1ZSAke3dpdGh2YWx9IGZvciAtLXdpdGgtZGF0YS1wYWNrYWdpbmciID4mMjt9Cis+ICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfSA7OworMzkxMGM4OTk3Cis8ICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1tYXBwZWQgb3IgLS1kaXNhYmxlLW1hcHBlZCB3YXMgZ2l2ZW4uCistLS0KKz4gIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW1hcHBlZCB3YXMgZ2l2ZW4uCiszOTEyLDM5MTNjODk5OQorPCAgIGVuYWJsZXZhbD0iJGVuYWJsZV9tYXBwZWQiCis8ICAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgorLS0tCis+ICAgZW5hYmxldmFsPSRlbmFibGVfbWFwcGVkOyBjYXNlICIke2VuYWJsZXZhbH0iIGluCiszOTE2YzkwMDIsOTAwNAorPCAgICAgICAgICAgICAgICAqKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGJhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIC0tZW5hYmxlLW1hcHBlZDsgdXNlIC0td2l0aC1kYXRhLXBhY2thZ2luZyBub3ciIDE+JjI7IGV4aXQgMTsgfSA7OworLS0tCis+ICAgICAgICAgICAgICAgICopIHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGZvciAtLWVuYWJsZS1tYXBwZWQ7IHVzZSAtLXdpdGgtZGF0YS1wYWNrYWdpbmcgbm93IiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGJhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIC0tZW5hYmxlLW1hcHBlZDsgdXNlIC0td2l0aC1kYXRhLXBhY2thZ2luZyBub3ciID4mMjt9Cis+ICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfSA7OworMzkyNmM5MDE0LDkwMTUKKzwgICAgIAkgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiB1c2UgLS13aXRoLWRhdGEtcGFja2FnaW5nPWFyY2hpdmUgaW5zdGVhZCBvZiAtLWVuYWJsZS1tYXBwZWQiIDE+JjIKKy0tLQorPiAgICAgCSAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogdXNlIC0td2l0aC1kYXRhLXBhY2thZ2luZz1hcmNoaXZlIGluc3RlYWQgb2YgLS1lbmFibGUtbWFwcGVkIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNlIC0td2l0aC1kYXRhLXBhY2thZ2luZz1hcmNoaXZlIGluc3RlYWQgb2YgLS1lbmFibGUtbWFwcGVkIiA+JjI7fQorMzkyOWM5MDE4LDkwMTkKKzwgICAgIAkgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiB1c2UgLS13aXRoLWRhdGEtcGFja2FnaW5nPWxpYnJhcnkgaW5zdGVhZCBvZiAtLWRpc2FibGUtbWFwcGVkIiAxPiYyCistLS0KKz4gICAgIAkgICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IHVzZSAtLXdpdGgtZGF0YS1wYWNrYWdpbmc9bGlicmFyeSBpbnN0ZWFkIG9mIC0tZGlzYWJsZS1tYXBwZWQiID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2UgLS13aXRoLWRhdGEtcGFja2FnaW5nPWxpYnJhcnkgaW5zdGVhZCBvZiAtLWRpc2FibGUtbWFwcGVkIiA+JjI7fQorMzkzM2M5MDIzLDkwMjUKKzwgCXsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY29uZmxpY3RpbmcgdmFsdWVzIHVzZWQgZm9yIC0td2l0aC1kYXRhLXBhY2thZ2luZyBhbmQgZGVwcmVjYXRlZCAtLWVuYWJsZS1tYXBwZWQiIDE+JjI7IGV4aXQgMTsgfQorLS0tCis+IAl7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY29uZmxpY3RpbmcgdmFsdWVzIHVzZWQgZm9yIC0td2l0aC1kYXRhLXBhY2thZ2luZyBhbmQgZGVwcmVjYXRlZCAtLWVuYWJsZS1tYXBwZWQiID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogY29uZmxpY3RpbmcgdmFsdWVzIHVzZWQgZm9yIC0td2l0aC1kYXRhLXBhY2thZ2luZyBhbmQgZGVwcmVjYXRlZCAtLWVuYWJsZS1tYXBwZWQiID4mMjt9Cis+ICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorMzk1OSwzOTYxYzkwNTEsOTA1NAorPCBlY2hvICRhY19uICJjaGVja2luZyBmb3IgYSBsaWJyYXJ5IHN1ZmZpeCB0byB1c2UiIi4uLiAkYWNfYyIgMT4mNgorPCBlY2hvICJjb25maWd1cmU6Mzk2MTogY2hlY2tpbmcgZm9yIGEgbGlicmFyeSBzdWZmaXggdG8gdXNlIiA+JjUKKzwgIyBDaGVjayB3aGV0aGVyIC0td2l0aC1saWJyYXJ5LXN1ZmZpeCBvciAtLXdpdGhvdXQtbGlicmFyeS1zdWZmaXggd2FzIGdpdmVuLgorLS0tCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgYSBsaWJyYXJ5IHN1ZmZpeCB0byB1c2UiID4mNQorPiAkYXNfZWNob19uICJjaGVja2luZyBmb3IgYSBsaWJyYXJ5IHN1ZmZpeCB0byB1c2UuLi4gIiA+JjY7IH0KKz4gCis+ICMgQ2hlY2sgd2hldGhlciAtLXdpdGgtbGlicmFyeS1zdWZmaXggd2FzIGdpdmVuLgorMzk2MywzOTY0YzkwNTYKKzwgICB3aXRodmFsPSIkd2l0aF9saWJyYXJ5X3N1ZmZpeCIKKzwgICBJQ1VMSUJTVUZGSVg9IiR7d2l0aHZhbH0iCistLS0KKz4gICB3aXRodmFsPSR3aXRoX2xpYnJhcnlfc3VmZml4OyBJQ1VMSUJTVUZGSVg9IiR7d2l0aHZhbH0iCiszOTczYzkwNjUsOTA2NgorPCBlY2hvICIkYWNfdCIiJG1zZyIgMT4mNgorLS0tCis+IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRtc2ciID4mNQorPiAkYXNfZWNobyAiJG1zZyIgPiY2OyB9CiszOTg1YzkwNzgKKzwgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXRlc3RzIG9yIC0tZGlzYWJsZS10ZXN0cyB3YXMgZ2l2ZW4uCistLS0KKz4gIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXRlc3RzIHdhcyBnaXZlbi4KKzM5ODcsMzk4OGM5MDgwCis8ICAgZW5hYmxldmFsPSIkZW5hYmxlX3Rlc3RzIgorPCAgIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KKy0tLQorPiAgIGVuYWJsZXZhbD0kZW5hYmxlX3Rlc3RzOyBjYXNlICIke2VuYWJsZXZhbH0iIGluCiszOTkxYzkwODMsOTA4NQorPCAJCSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgLS1lbmFibGUtdGVzdHMiIDE+JjI7IGV4aXQgMTsgfSA7OworLS0tCis+IAkJKikgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGJhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIC0tZW5hYmxlLXRlc3RzIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGJhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIC0tZW5hYmxlLXRlc3RzIiA+JjI7fQorPiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0gOzsKKzQwMDRjOTA5OAorPCAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc2FtcGxlcyBvciAtLWRpc2FibGUtc2FtcGxlcyB3YXMgZ2l2ZW4uCistLS0KKz4gIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNhbXBsZXMgd2FzIGdpdmVuLgorNDAwNiw0MDA3YzkxMDAKKzwgICBlbmFibGV2YWw9IiRlbmFibGVfc2FtcGxlcyIKKzwgICBjYXNlICIke2VuYWJsZXZhbH0iIGluCistLS0KKz4gICBlbmFibGV2YWw9JGVuYWJsZV9zYW1wbGVzOyBjYXNlICIke2VuYWJsZXZhbH0iIGluCis0MDEwYzkxMDMsOTEwNQorPCAJCSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgLS1lbmFibGUtc2FtcGxlcyIgMT4mMjsgZXhpdCAxOyB9IDs7CistLS0KKz4gCQkqKSB7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgLS1lbmFibGUtc2FtcGxlcyIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGZvciAtLWVuYWJsZS1zYW1wbGVzIiA+JjI7fQorPiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0gOzsKKzQwNjdjOTE2MgorPCAJKi0qLWhwdXgqKSAJCistLS0KKz4gCSotKi1ocHV4KikKKzQxMTMsNDExNGM5MjA4LDkyMTAKKzwgdHJhcCAnJyAxIDIgMTUKKzwgY2F0ID4gY29uZmNhY2hlIDw8XEVPRgorLS0tCis+IGFjX2NvbmZpZ19maWxlcz0iJGFjX2NvbmZpZ19maWxlcyBpY3VkZWZzLm1rIE1ha2VmaWxlIGRhdGEvaWN1cGtnLmluYyBjb25maWcvTWFrZWZpbGUuaW5jIGRhdGEvTWFrZWZpbGUgc3R1YmRhdGEvTWFrZWZpbGUgY29tbW9uL01ha2VmaWxlIGkxOG4vTWFrZWZpbGUgbGF5b3V0L01ha2VmaWxlIGxheW91dGV4L01ha2VmaWxlIGlvL01ha2VmaWxlIGV4dHJhL01ha2VmaWxlIGV4dHJhL3Vjb252L01ha2VmaWxlIGV4dHJhL3NjcnB0cnVuL01ha2VmaWxlIHRvb2xzL01ha2VmaWxlIHRvb2xzL2N0ZXN0ZncvTWFrZWZpbGUgdG9vbHMvbWFrZWNvbnYvTWFrZWZpbGUgdG9vbHMvZ2VucmIvTWFrZWZpbGUgdG9vbHMvZ2VudWNhL01ha2VmaWxlIHRvb2xzL2dlbmNjb2RlL01ha2VmaWxlIHRvb2xzL2dlbmNtbi9NYWtlZmlsZSB0b29scy9nZW5jbnZhbC9NYWtlZmlsZSB0b29scy9nZW5uYW1lcy9NYWtlZmlsZSB0b29scy9nZW50ZXN0L01ha2VmaWxlIHRvb2xzL2dlbm5vcm0vTWFrZWZpbGUgdG9vbHMvZ2VucHJvcHMvTWFrZWZpbGUgdG9vbHMvZ2VuY2FzZS9NYWtlZmlsZSB0b29scy9nZW5wbmFtZS9NYWtlZmlsZSB0b29scy9nZW5icmsvTWFrZWZpbGUgdG9vbHMvZ2Vuc3ByZXAvTWFrZWZpbGUgdG9vbHMvaWN1c3dhcC9NYWtlZmlsZSB0b29scy9wa2dkYXRhL01ha2VmaWxlIHRvb2xzL3Rvb2x1dGlsL01ha2VmaWxlIHRvb2xzL2R1bXBjZS9NYWtlZmlsZSB0ZXN0L01ha2VmaWxlIHRlc3QvdGVzdGRhdGEvTWFrZWZpbGUgdGVzdC90ZXN0ZGF0YS9wa2dkYXRhLmluYyB0ZXN0L2hkcnRzdC9NYWtlZmlsZSB0ZXN0L2ludGx0ZXN0L01ha2VmaWxlIHRlc3QvY2ludGx0c3QvTWFrZWZpbGUgdGVzdC9pb3Rlc3QvTWFrZWZpbGUgdGVzdC90aGFpdGVzdC9NYWtlZmlsZSB0ZXN0L3Rlc3RtYXAvTWFrZWZpbGUgdGVzdC9sZXRlc3QvTWFrZWZpbGUgdGVzdC90aHJlYWR0ZXN0L01ha2VmaWxlIHNhbXBsZXMvTWFrZWZpbGUgc2FtcGxlcy9kYXRlL01ha2VmaWxlIHNhbXBsZXMvY2FsL01ha2VmaWxlIHNhbXBsZXMvbGF5b3V0L01ha2VmaWxlIGNvbW1vbi91bmljb2RlL3BsYXRmb3JtLmgiCis+IAorPiBjYXQgPmNvbmZjYWNoZSA8PFxfQUNFT0YKKzQxMTcsNDExOGM5MjEzLDkyMTUKKzwgIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KKzwgIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCistLS0KKz4gIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucywgc2VlIGNvbmZpZ3VyZSdzIG9wdGlvbiAtLWNvbmZpZy1jYWNoZS4KKz4gIyBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuICBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndAorPiAjIHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KKzQxMjAsNDEyN2M5MjE3LDkyMTgKKzwgIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKKzwgIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQorPCAjIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKKzwgIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KKzwgIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCis8ICMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCis8ICMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQorPCAjIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgorLS0tCis+ICMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0Cis+ICMgdGhlIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgorNDEyOWM5MjIwLDkyMjUKKzwgRU9GCistLS0KKz4gIyBgYWNfY3ZfZW52X2ZvbycgdmFyaWFibGVzIChzZXQgb3IgdW5zZXQpIHdpbGwgYmUgb3ZlcnJpZGRlbiB3aGVuCis+ICMgbG9hZGluZyB0aGlzIGZpbGUsIG90aGVyICp1bnNldCogYGFjX2N2X2Zvbycgd2lsbCBiZSBhc3NpZ25lZCB0aGUKKz4gIyBmb2xsb3dpbmcgdmFsdWVzLgorPiAKKz4gX0FDRU9GCis+IAorNDEzMmM5MjI4Cis8ICMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KKy0tLQorPiAjIFNvLCB3ZSBraWxsIHZhcmlhYmxlcyBjb250YWluaW5nIG5ld2xpbmVzLgorNDEzNSw0MTU0YzkyMzEsOTI3NworPCAoc2V0KSAyPiYxIHwKKzwgICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQgfCBncmVwIGFjX3NwYWNlKSAyPiYxYCBpbgorPCAgICphY19zcGFjZT1cICopCis8ICAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgorPCAgICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KKzwgICAgIHNlZCAtbiBcCis8ICAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCis8ICAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKKzwgICAgIDs7Cis8ICAgKikKKzwgICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCis8ICAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCis8ICAgICA7OworPCAgIGVzYWMgPj4gY29uZmNhY2hlCis8IGlmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KKzwgICA6Cis8IGVsc2UKKzwgICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCis8ICAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKKzwgICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQorLS0tCis+ICgKKz4gICBmb3IgYWNfdmFyIGluIGAoc2V0KSAyPiYxIHwgc2VkIC1uICdzL15cKFthLXpBLVpfXVthLXpBLVowLTlfXSpcKT0uKi9cMS9wJ2A7IGRvCis+ICAgICBldmFsIGFjX3ZhbD1cJCRhY192YXIKKz4gICAgIGNhc2UgJGFjX3ZhbCBpbiAjKAorPiAgICAgKiR7YXNfbmx9KikKKz4gICAgICAgY2FzZSAkYWNfdmFyIGluICMoCis+ICAgICAgICpfY3ZfKikgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IGNhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogY2FjaGUgdmFyaWFibGUgJGFjX3ZhciBjb250YWlucyBhIG5ld2xpbmUiID4mMjt9IDs7Cis+ICAgICAgIGVzYWMKKz4gICAgICAgY2FzZSAkYWNfdmFyIGluICMoCis+ICAgICAgIF8gfCBJRlMgfCBhc19ubCkgOzsgIygKKz4gICAgICAgQkFTSF9BUkdWIHwgQkFTSF9TT1VSQ0UpIGV2YWwgJGFjX3Zhcj0gOzsgIygKKz4gICAgICAgKikgJGFzX3Vuc2V0ICRhY192YXIgOzsKKz4gICAgICAgZXNhYyA7OworPiAgICAgZXNhYworPiAgIGRvbmUKKz4gCis+ICAgKHNldCkgMj4mMSB8Cis+ICAgICBjYXNlICRhc19ubGAoYWNfc3BhY2U9JyAnOyBzZXQpIDI+JjFgIGluICMoCis+ICAgICAqJHthc19ubH1hY19zcGFjZT1cICopCis+ICAgICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUKKz4gICAgICAgIyBzdWJzdGl0dXRpb24gdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCis+ICAgICAgIHNlZCAtbiBcCis+IAkicy8nLydcXFxcJycvZzsKKz4gCSAgcy9eXFwoW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qXFwpPVxcKC4qXFwpL1xcMT0nXFwyJy9wIgorPiAgICAgICA7OyAjKAorPiAgICAgKikKKz4gICAgICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KKz4gICAgICAgc2VkIC1uICIvXltfJGFzX2NyX2FsbnVtXSpfY3ZfW18kYXNfY3JfYWxudW1dKj0vcCIKKz4gICAgICAgOzsKKz4gICAgIGVzYWMgfAorPiAgICAgc29ydAorPiApIHwKKz4gICBzZWQgJworPiAgICAgIC9eYWNfY3ZfZW52Xy9iIGVuZAorPiAgICAgIHQgY2xlYXIKKz4gICAgICA6Y2xlYXIKKz4gICAgICBzL15cKFtePV0qXCk9XCguKlt7fV0uKlwpJC90ZXN0ICIke1wxK3NldH0iID0gc2V0IHx8ICYvCis+ICAgICAgdCBlbmQKKz4gICAgICBzL15cKFtePV0qXCk9XCguKlwpJC9cMT0ke1wxPVwyfS8KKz4gICAgICA6ZW5kJyA+PmNvbmZjYWNoZQorPiBpZiBkaWZmICIkY2FjaGVfZmlsZSIgY29uZmNhY2hlID4vZGV2L251bGwgMj4mMTsgdGhlbiA6OyBlbHNlCis+ICAgaWYgdGVzdCAtdyAiJGNhY2hlX2ZpbGUiOyB0aGVuCis+ICAgICB0ZXN0ICJ4JGNhY2hlX2ZpbGUiICE9ICJ4L2Rldi9udWxsIiAmJgorPiAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogdXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiB1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KKz4gICAgIGNhdCBjb25mY2FjaGUgPiRjYWNoZV9maWxlCis0MTU2YzkyNzksOTI4MAorPCAgICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCistLS0KKz4gICAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IG5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQorNDE2MSw0MTYyZDkyODQKKzwgdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKKzwgCis0MTY3LDQxNzJjOTI4OQorPCAjIEFueSBhc3NpZ25tZW50IHRvIFZQQVRIIGNhdXNlcyBTdW4gbWFrZSB0byBvbmx5IGV4ZWN1dGUKKzwgIyB0aGUgZmlyc3Qgc2V0IG9mIGRvdWJsZS1jb2xvbiBydWxlcywgc28gcmVtb3ZlIGl0IGlmIG5vdCBuZWVkZWQuCis8ICMgSWYgdGhlcmUgaXMgYSBjb2xvbiBpbiB0aGUgcGF0aCwgd2UgbmVlZCB0byBrZWVwIGl0LgorPCBpZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgorPCAgIGFjX3Zwc3ViPScvXlsgCV0qVlBBVEhbIAldKj1bXjpdKiQvZCcKKzwgZmkKKy0tLQorPiBERUZTPS1ESEFWRV9DT05GSUdfSAorNDE3NGM5MjkxLDkzMDIKKzwgdHJhcCAncm0gLWYgJENPTkZJR19TVEFUVVMgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQorLS0tCis+IGFjX2xpYm9ianM9Cis+IGFjX2x0bGlib2Jqcz0KKz4gZm9yIGFjX2kgaW4gOiAkTElCT0JKUzsgZG8gdGVzdCAieCRhY19pIiA9IHg6ICYmIGNvbnRpbnVlCis+ICAgIyAxLiBSZW1vdmUgdGhlIGV4dGVuc2lvbiwgYW5kICRVIGlmIGFscmVhZHkgaW5zdGFsbGVkLgorPiAgIGFjX3NjcmlwdD0ncy9cJFVcLi8uLztzL1wubyQvLztzL1wub2JqJC8vJworPiAgIGFjX2k9YCRhc19lY2hvICIkYWNfaSIgfCBzZWQgIiRhY19zY3JpcHQiYAorPiAgICMgMi4gUHJlcGVuZCBMSUJPQkpESVIuICBXaGVuIHVzZWQgd2l0aCBhdXRvbWFrZT49MS4xMCBMSUJPQkpESVIKKz4gICAjICAgIHdpbGwgYmUgc2V0IHRvIHRoZSBkaXJlY3Rvcnkgd2hlcmUgTElCT0JKUyBvYmplY3RzIGFyZSBidWlsdC4KKz4gICBhY19saWJvYmpzPSIkYWNfbGlib2JqcyBcJHtMSUJPQkpESVJ9JGFjX2lcJFUuJGFjX29iamV4dCIKKz4gICBhY19sdGxpYm9ianM9IiRhY19sdGxpYm9ianMgXCR7TElCT0JKRElSfSRhY19pIickVS5sbycKKz4gZG9uZQorPiBMSUJPQkpTPSRhY19saWJvYmpzCis0MTc2YzkzMDQKKzwgREVGUz0tREhBVkVfQ09ORklHX0gKKy0tLQorPiBMVExJQk9CSlM9JGFjX2x0bGlib2JqcworNDE3OCw0MTc5ZDkzMDUKKzwgIyBXaXRob3V0IHRoZSAiLi8iLCBzb21lIHNoZWxscyBsb29rIGluIFBBVEggZm9yIGNvbmZpZy5zdGF0dXMuCis8IDogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KKzQxODEsNDE4NWM5MzA3LDkzMTcKKzwgZWNobyBjcmVhdGluZyAkQ09ORklHX1NUQVRVUworPCBybSAtZiAkQ09ORklHX1NUQVRVUworPCBjYXQgPiAkQ09ORklHX1NUQVRVUyA8PEVPRgorPCAjISAvYmluL3NoCis8ICMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLgorLS0tCis+IAorPiAKKz4gOiAke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfQorPiBhY193cml0ZV9mYWlsPTAKKz4gYWNfY2xlYW5fZmlsZXNfc2F2ZT0kYWNfY2xlYW5fZmlsZXMKKz4gYWNfY2xlYW5fZmlsZXM9IiRhY19jbGVhbl9maWxlcyAkQ09ORklHX1NUQVRVUyIKKz4geyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGNyZWF0aW5nICRDT05GSUdfU1RBVFVTIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogY3JlYXRpbmcgJENPTkZJR19TVEFUVVMiID4mNjt9Cis+IGNhdCA+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCis+ICMhICRTSEVMTAorPiAjIEdlbmVyYXRlZCBieSAkYXNfbWUuCis0MTg3LDQxOTFkOTMxOAorPCAjIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3MsCis8ICMgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6Cis8ICMKKzwgIyAkMCAkYWNfY29uZmlndXJlX2FyZ3MKKzwgIworNDE5M2M5MzIwCis8ICMgY29uZmlndXJlLCBpcyBpbiAuL2NvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgorLS0tCis+ICMgY29uZmlndXJlLCBpcyBpbiBjb25maWcubG9nIGlmIGl0IGV4aXN0cy4KKzQxOTUsNDE5NmM5MzIyLDk0MjAKKzwgYWNfY3NfdXNhZ2U9IlVzYWdlOiAkQ09ORklHX1NUQVRVUyBbLS1yZWNoZWNrXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSIKKzwgZm9yIGFjX29wdGlvbgorLS0tCis+IGRlYnVnPWZhbHNlCis+IGFjX2NzX3JlY2hlY2s9ZmFsc2UKKz4gYWNfY3Nfc2lsZW50PWZhbHNlCis+IFNIRUxMPVwke0NPTkZJR19TSEVMTC0kU0hFTEx9Cis+IF9BQ0VPRgorPiAKKz4gY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorPiAjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKz4gIyMgTTRzaCBJbml0aWFsaXphdGlvbi4gICMjCis+ICMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworPiAKKz4gIyBCZSBtb3JlIEJvdXJuZSBjb21wYXRpYmxlCis+IERVQUxDQVNFPTE7IGV4cG9ydCBEVUFMQ0FTRSAjIGZvciBNS1Mgc2gKKz4gaWYgdGVzdCAtbiAiJHtaU0hfVkVSU0lPTitzZXR9IiAmJiAoZW11bGF0ZSBzaCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCis+ICAgZW11bGF0ZSBzaAorPiAgIE5VTExDTUQ9OgorPiAgICMgUHJlLTQuMiB2ZXJzaW9ucyBvZiBac2ggZG8gd29yZCBzcGxpdHRpbmcgb24gJHsxKyIkQCJ9LCB3aGljaAorPiAgICMgaXMgY29udHJhcnkgdG8gb3VyIHVzYWdlLiAgRGlzYWJsZSB0aGlzIGZlYXR1cmUuCis+ICAgYWxpYXMgLWcgJyR7MSsiJEAifSc9JyIkQCInCis+ICAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKKz4gZWxzZQorPiAgIGNhc2UgYChzZXQgLW8pIDI+L2Rldi9udWxsYCBpbgorPiAgICpwb3NpeCopIHNldCAtbyBwb3NpeCA7OworPiBlc2FjCis+IAorPiBmaQorPiAKKz4gCis+IAorPiAKKz4gIyBQQVRIIG5lZWRzIENSCis+ICMgQXZvaWQgZGVwZW5kaW5nIHVwb24gQ2hhcmFjdGVyIFJhbmdlcy4KKz4gYXNfY3JfbGV0dGVycz0nYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonCis+IGFzX2NyX0xFVFRFUlM9J0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJworPiBhc19jcl9MZXR0ZXJzPSRhc19jcl9sZXR0ZXJzJGFzX2NyX0xFVFRFUlMKKz4gYXNfY3JfZGlnaXRzPScwMTIzNDU2Nzg5JworPiBhc19jcl9hbG51bT0kYXNfY3JfTGV0dGVycyRhc19jcl9kaWdpdHMKKz4gCis+IGFzX25sPScKKz4gJworPiBleHBvcnQgYXNfbmwKKz4gIyBQcmludGluZyBhIGxvbmcgc3RyaW5nIGNyYXNoZXMgU29sYXJpcyA3IC91c3IvYmluL3ByaW50Zi4KKz4gYXNfZWNobz0nXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXCcKKz4gYXNfZWNobz0kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvCis+IGFzX2VjaG89JGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvCis+IGlmICh0ZXN0ICJYYHByaW50ZiAlcyAkYXNfZWNob2AiID0gIlgkYXNfZWNobyIpIDI+L2Rldi9udWxsOyB0aGVuCis+ICAgYXNfZWNobz0ncHJpbnRmICVzXG4nCis+ICAgYXNfZWNob19uPSdwcmludGYgJXMnCis+IGVsc2UKKz4gICBpZiB0ZXN0ICJYYCgvdXNyL3VjYi9lY2hvIC1uIC1uICRhc19lY2hvKSAyPi9kZXYvbnVsbGAiID0gIlgtbiAkYXNfZWNobyI7IHRoZW4KKz4gICAgIGFzX2VjaG9fYm9keT0nZXZhbCAvdXNyL3VjYi9lY2hvIC1uICIkMSRhc19ubCInCis+ICAgICBhc19lY2hvX249Jy91c3IvdWNiL2VjaG8gLW4nCis+ICAgZWxzZQorPiAgICAgYXNfZWNob19ib2R5PSdldmFsIGV4cHIgIlgkMSIgOiAiWFxcKC4qXFwpIicKKz4gICAgIGFzX2VjaG9fbl9ib2R5PSdldmFsCis+ICAgICAgIGFyZz0kMTsKKz4gICAgICAgY2FzZSAkYXJnIGluCis+ICAgICAgICoiJGFzX25sIiopCis+IAlleHByICJYJGFyZyIgOiAiWFxcKC4qXFwpJGFzX25sIjsKKz4gCWFyZz1gZXhwciAiWCRhcmciIDogIi4qJGFzX25sXFwoLipcXCkiYDs7Cis+ICAgICAgIGVzYWM7Cis+ICAgICAgIGV4cHIgIlgkYXJnIiA6ICJYXFwoLipcXCkiIHwgdHIgLWQgIiRhc19ubCIKKz4gICAgICcKKz4gICAgIGV4cG9ydCBhc19lY2hvX25fYm9keQorPiAgICAgYXNfZWNob19uPSdzaCAtYyAkYXNfZWNob19uX2JvZHkgYXNfZWNobycKKz4gICBmaQorPiAgIGV4cG9ydCBhc19lY2hvX2JvZHkKKz4gICBhc19lY2hvPSdzaCAtYyAkYXNfZWNob19ib2R5IGFzX2VjaG8nCis+IGZpCis+IAorPiAjIFRoZSB1c2VyIGlzIGFsd2F5cyByaWdodC4KKz4gaWYgdGVzdCAiJHtQQVRIX1NFUEFSQVRPUitzZXR9IiAhPSBzZXQ7IHRoZW4KKz4gICBQQVRIX1NFUEFSQVRPUj06Cis+ICAgKFBBVEg9Jy9iaW47L2Jpbic7IEZQQVRIPSRQQVRIOyBzaCAtYyA6KSA+L2Rldi9udWxsIDI+JjEgJiYgeworPiAgICAgKFBBVEg9Jy9iaW46L2Jpbic7IEZQQVRIPSRQQVRIOyBzaCAtYyA6KSA+L2Rldi9udWxsIDI+JjEgfHwKKz4gICAgICAgUEFUSF9TRVBBUkFUT1I9JzsnCis+ICAgfQorPiBmaQorPiAKKz4gIyBTdXBwb3J0IHVuc2V0IHdoZW4gcG9zc2libGUuCis+IGlmICggKE1BSUw9NjA7IHVuc2V0IE1BSUwpIHx8IGV4aXQpID4vZGV2L251bGwgMj4mMTsgdGhlbgorPiAgIGFzX3Vuc2V0PXVuc2V0Cis+IGVsc2UKKz4gICBhc191bnNldD1mYWxzZQorPiBmaQorPiAKKz4gCis+ICMgSUZTCis+ICMgV2UgbmVlZCBzcGFjZSwgdGFiIGFuZCBuZXcgbGluZSwgaW4gcHJlY2lzZWx5IHRoYXQgb3JkZXIuICBRdW90aW5nIGlzCis+ICMgdGhlcmUgdG8gcHJldmVudCBlZGl0b3JzIGZyb20gY29tcGxhaW5pbmcgYWJvdXQgc3BhY2UtdGFiLgorPiAjIChJZiBfQVNfUEFUSF9XQUxLIHdlcmUgY2FsbGVkIHdpdGggSUZTIHVuc2V0LCBpdCB3b3VsZCBkaXNhYmxlIHdvcmQKKz4gIyBzcGxpdHRpbmcgYnkgc2V0dGluZyBJRlMgdG8gZW1wdHkgdmFsdWUuKQorPiBJRlM9IiAiIgkkYXNfbmwiCis+IAorPiAjIEZpbmQgd2hvIHdlIGFyZS4gIExvb2sgaW4gdGhlIHBhdGggaWYgd2UgY29udGFpbiBubyBkaXJlY3Rvcnkgc2VwYXJhdG9yLgorPiBjYXNlICQwIGluCis+ICAgKltcXC9dKiApIGFzX215c2VsZj0kMCA7OworPiAgICopIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKKz4gZm9yIGFzX2RpciBpbiAkUEFUSAorNDE5OCw0MjA4Yzk0MjIsOTQyNAorPCAgIGNhc2UgIlwkYWNfb3B0aW9uIiBpbgorPCAgIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQorPCAgICAgZWNobyAicnVubmluZyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIgorPCAgICAgZXhlYyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIDs7Cis8ICAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYpCis8ICAgICBlY2hvICIkQ09ORklHX1NUQVRVUyBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgorPCAgICAgZXhpdCAwIDs7Cis8ICAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtLWgpCis8ICAgICBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAwIDs7Cis8ICAgKikgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMSA7OworPCAgIGVzYWMKKy0tLQorPiAgIElGUz0kYXNfc2F2ZV9JRlMKKz4gICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorPiAgIHRlc3QgLXIgIiRhc19kaXIvJDAiICYmIGFzX215c2VsZj0kYXNfZGlyLyQwICYmIGJyZWFrCis0MjA5YTk0MjYKKz4gSUZTPSRhc19zYXZlX0lGUworNDIxMSw0MjEyYzk0MjgsOTQzOAorPCBhY19naXZlbl9zcmNkaXI9JHNyY2RpcgorPCBhY19naXZlbl9JTlNUQUxMPSIkSU5TVEFMTCIKKy0tLQorPiAgICAgIDs7Cis+IGVzYWMKKz4gIyBXZSBkaWQgbm90IGZpbmQgb3Vyc2VsdmVzLCBtb3N0IHByb2JhYmx5IHdlIHdlcmUgcnVuIGFzIGBzaCBDT01NQU5EJworPiAjIGluIHdoaWNoIGNhc2Ugd2UgYXJlIG5vdCB0byBiZSBmb3VuZCBpbiB0aGUgcGF0aC4KKz4gaWYgdGVzdCAieCRhc19teXNlbGYiID0geDsgdGhlbgorPiAgIGFzX215c2VsZj0kMAorPiBmaQorPiBpZiB0ZXN0ICEgLWYgIiRhc19teXNlbGYiOyB0aGVuCis+ICAgJGFzX2VjaG8gIiRhc19teXNlbGY6IGVycm9yOiBjYW5ub3QgZmluZCBteXNlbGY7IHJlcnVuIHdpdGggYW4gYWJzb2x1dGUgZmlsZSBuYW1lIiA+JjIKKz4gICB7IChleGl0IDEpOyBleGl0IDE7IH0KKz4gZmkKKzQyMTQsNDM5M2M5NDQwLDk1NzcKKzwgdHJhcCAncm0gLWZyIGBlY2hvICJpY3VkZWZzLm1rIFwKKzwgCQlNYWtlZmlsZSBcCis8IAkJZGF0YS9pY3Vwa2cuaW5jIFwKKzwgCQljb25maWcvTWFrZWZpbGUuaW5jIFwKKzwgCQlkYXRhL01ha2VmaWxlIFwKKzwgCQlzdHViZGF0YS9NYWtlZmlsZSBcCis8IAkJY29tbW9uL01ha2VmaWxlIFwKKzwgCQlpMThuL01ha2VmaWxlIFwKKzwgCQlsYXlvdXQvTWFrZWZpbGUgXAorPCAJCWxheW91dGV4L01ha2VmaWxlIFwKKzwgCQlpby9NYWtlZmlsZSBcCis8IAkJZXh0cmEvTWFrZWZpbGUgXAorPCAJCWV4dHJhL3Vjb252L01ha2VmaWxlIGV4dHJhL3NjcnB0cnVuL01ha2VmaWxlIFwKKzwgCQl0b29scy9NYWtlZmlsZSB0b29scy9jdGVzdGZ3L01ha2VmaWxlIFwKKzwgCQl0b29scy9tYWtlY29udi9NYWtlZmlsZSBcCis8IAkJdG9vbHMvZ2VucmIvTWFrZWZpbGUgXAorPCAJCXRvb2xzL2dlbnVjYS9NYWtlZmlsZSBcCis8IAkJdG9vbHMvZ2VuY2NvZGUvTWFrZWZpbGUgXAorPCAJCXRvb2xzL2dlbmNtbi9NYWtlZmlsZSBcCis8IAkJdG9vbHMvZ2VuY252YWwvTWFrZWZpbGUgXAorPCAJCXRvb2xzL2dlbm5hbWVzL01ha2VmaWxlIFwKKzwgCQl0b29scy9nZW50ZXN0L01ha2VmaWxlIFwKKzwgCQl0b29scy9nZW5ub3JtL01ha2VmaWxlIFwKKzwgCQl0b29scy9nZW5wcm9wcy9NYWtlZmlsZSBcCis8IAkJdG9vbHMvZ2VuY2FzZS9NYWtlZmlsZSBcCis8IAkJdG9vbHMvZ2VucG5hbWUvTWFrZWZpbGUgXAorPCAJCXRvb2xzL2dlbmJyay9NYWtlZmlsZSBcCis8IAkJdG9vbHMvZ2Vuc3ByZXAvTWFrZWZpbGUgXAorPCAJCXRvb2xzL2ljdXN3YXAvTWFrZWZpbGUgXAorPCAJCXRvb2xzL3BrZ2RhdGEvTWFrZWZpbGUgXAorPCAJCXRvb2xzL3Rvb2x1dGlsL01ha2VmaWxlIFwKKzwgCQl0b29scy9kdW1wY2UvTWFrZWZpbGUgXAorPCAJCXRlc3QvTWFrZWZpbGUgXAorPCAJCXRlc3QvdGVzdGRhdGEvTWFrZWZpbGUgXAorPCAJCXRlc3QvdGVzdGRhdGEvcGtnZGF0YS5pbmMgXAorPCAJCXRlc3QvaGRydHN0L01ha2VmaWxlIFwKKzwgCQl0ZXN0L2ludGx0ZXN0L01ha2VmaWxlIFwKKzwgCQl0ZXN0L2NpbnRsdHN0L01ha2VmaWxlIFwKKzwgCQl0ZXN0L2lvdGVzdC9NYWtlZmlsZSBcCis8IAkJdGVzdC90aGFpdGVzdC9NYWtlZmlsZSBcCis8IAkJdGVzdC90ZXN0bWFwL01ha2VmaWxlIFwKKzwgCQl0ZXN0L2xldGVzdC9NYWtlZmlsZSBcCis8IAkJdGVzdC90aHJlYWR0ZXN0L01ha2VmaWxlIFwKKzwgCQlzYW1wbGVzL01ha2VmaWxlIHNhbXBsZXMvZGF0ZS9NYWtlZmlsZSBcCis8IAkJc2FtcGxlcy9jYWwvTWFrZWZpbGUgc2FtcGxlcy9sYXlvdXQvTWFrZWZpbGUgXAorPCAJCWNvbW1vbi91bmljb2RlL3BsYXRmb3JtLmggY29tbW9uL2ljdWNmZy5oIiB8IHNlZCAicy86W14gXSovL2ciYCBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Cis8IEVPRgorPCBjYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKKzwgCis8ICMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCis8IHNlZCAncy8lQC9AQC87IHMvQCUvQEAvOyBzLyVnXCQvQGcvOyAvQGdcJC9zL1tcXFxcJiVdL1xcXFwmL2c7Cis8ICBzL0BALyVALzsgcy9AQC9AJS87IHMvQGdcJC8lZy8nID4gY29uZnRlc3Quc3VicyA8PFxcQ0VPRgorPCAkYWNfdnBzdWIKKzwgJGV4dHJhc3ViCis8IHMlQFNIRUxMQCUkU0hFTEwlZworPCBzJUBDRkxBR1NAJSRDRkxBR1MlZworPCBzJUBDUFBGTEFHU0AlJENQUEZMQUdTJWcKKzwgcyVAQ1hYRkxBR1NAJSRDWFhGTEFHUyVnCis8IHMlQEZGTEFHU0AlJEZGTEFHUyVnCis8IHMlQERFRlNAJSRERUZTJWcKKzwgcyVATERGTEFHU0AlJExERkxBR1MlZworPCBzJUBMSUJTQCUkTElCUyVnCis8IHMlQGV4ZWNfcHJlZml4QCUkZXhlY19wcmVmaXglZworPCBzJUBwcmVmaXhAJSRwcmVmaXglZworPCBzJUBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQCUkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSVnCis8IHMlQGJpbmRpckAlJGJpbmRpciVnCis8IHMlQHNiaW5kaXJAJSRzYmluZGlyJWcKKzwgcyVAbGliZXhlY2RpckAlJGxpYmV4ZWNkaXIlZworPCBzJUBkYXRhZGlyQCUkZGF0YWRpciVnCis8IHMlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKKzwgcyVAc2hhcmVkc3RhdGVkaXJAJSRzaGFyZWRzdGF0ZWRpciVnCis8IHMlQGxvY2Fsc3RhdGVkaXJAJSRsb2NhbHN0YXRlZGlyJWcKKzwgcyVAbGliZGlyQCUkbGliZGlyJWcKKzwgcyVAaW5jbHVkZWRpckAlJGluY2x1ZGVkaXIlZworPCBzJUBvbGRpbmNsdWRlZGlyQCUkb2xkaW5jbHVkZWRpciVnCis8IHMlQGluZm9kaXJAJSRpbmZvZGlyJWcKKzwgcyVAbWFuZGlyQCUkbWFuZGlyJWcKKzwgcyVAUEFDS0FHRUAlJFBBQ0tBR0UlZworPCBzJUBWRVJTSU9OQCUkVkVSU0lPTiVnCis8IHMlQExJQl9WRVJTSU9OQCUkTElCX1ZFUlNJT04lZworPCBzJUBMSUJfVkVSU0lPTl9NQUpPUkAlJExJQl9WRVJTSU9OX01BSk9SJWcKKzwgcyVAVU5JQ09ERV9WRVJTSU9OQCUkVU5JQ09ERV9WRVJTSU9OJWcKKzwgcyVAQ0NAJSRDQyVnCis8IHMlQENYWEAlJENYWCVnCis8IHMlQElOU1RBTExfUFJPR1JBTUAlJElOU1RBTExfUFJPR1JBTSVnCis8IHMlQElOU1RBTExfU0NSSVBUQCUkSU5TVEFMTF9TQ1JJUFQlZworPCBzJUBJTlNUQUxMX0RBVEFAJSRJTlNUQUxMX0RBVEElZworPCBzJUBTVFJJUEAlJFNUUklQJWcKKzwgcyVAVV9NQUtFQCUkVV9NQUtFJWcKKzwgcyVARE9YWUdFTkAlJERPWFlHRU4lZworPCBzJUBob3N0QCUkaG9zdCVnCis8IHMlQGhvc3RfYWxpYXNAJSRob3N0X2FsaWFzJWcKKzwgcyVAaG9zdF9jcHVAJSRob3N0X2NwdSVnCis8IHMlQGhvc3RfdmVuZG9yQCUkaG9zdF92ZW5kb3IlZworPCBzJUBob3N0X29zQCUkaG9zdF9vcyVnCis8IHMlQEVYRUVYVEAlJEVYRUVYVCVnCis8IHMlQEFSRkxBR1NAJSRBUkZMQUdTJWcKKzwgcyVAQ09NUElMRV9MSU5LX0VOVlZBUkAlJENPTVBJTEVfTElOS19FTlZWQVIlZworPCBzJUBMSUJfTUAlJExJQl9NJWcKKzwgcyVARU5BQkxFX1NIQVJFREAlJEVOQUJMRV9TSEFSRUQlZworPCBzJUBFTkFCTEVfU1RBVElDQCUkRU5BQkxFX1NUQVRJQyVnCis8IHMlQEVOQUJMRV9ERUJVR0AlJEVOQUJMRV9ERUJVRyVnCis8IHMlQEVOQUJMRV9SRUxFQVNFQCUkRU5BQkxFX1JFTEVBU0UlZworPCBzJUBSQU5MSUJAJSRSQU5MSUIlZworPCBzJUBBUkAlJEFSJWcKKzwgcyVAVV9ESVNBQkxFX1JFTkFNSU5HQCUkVV9ESVNBQkxFX1JFTkFNSU5HJWcKKzwgcyVAVV9FTkFCTEVfVFJBQ0lOR0AlJFVfRU5BQkxFX1RSQUNJTkclZworPCBzJUBFTkFCTEVfUlBBVEhAJSRFTkFCTEVfUlBBVEglZworPCBzJUBVX0lOTElORUAlJFVfSU5MSU5FJWcKKzwgcyVAVEhSRUFEU19UUlVFQCUkVEhSRUFEU19UUlVFJWcKKzwgcyVASUNVX1VTRV9USFJFQURTQCUkSUNVX1VTRV9USFJFQURTJWcKKzwgcyVASEFWRV9NTUFQQCUkSEFWRV9NTUFQJWcKKzwgcyVAR0VOQ0NPREVfQVNTRU1CTFlAJSRHRU5DQ09ERV9BU1NFTUJMWSVnCis8IHMlQENQUEAlJENQUCVnCis8IHMlQFVfSEFWRV9JTlRUWVBFU19IQCUkVV9IQVZFX0lOVFRZUEVTX0glZworPCBzJUBDWFhDUFBAJSRDWFhDUFAlZworPCBzJUBVX0lPU1RSRUFNX1NPVVJDRUAlJFVfSU9TVFJFQU1fU09VUkNFJWcKKzwgcyVAVV9JU19CSUdfRU5ESUFOQCUkVV9JU19CSUdfRU5ESUFOJWcKKzwgcyVAVV9IQVZFX05MX0xBTkdJTkZPQCUkVV9IQVZFX05MX0xBTkdJTkZPJWcKKzwgcyVAVV9IQVZFX05MX0xBTkdJTkZPX0NPREVTRVRAJSRVX0hBVkVfTkxfTEFOR0lORk9fQ09ERVNFVCVnCis8IHMlQFVfTkxfTEFOR0lORk9fQ09ERVNFVEAlJFVfTkxfTEFOR0lORk9fQ09ERVNFVCVnCis8IHMlQFVfSEFWRV9OQU1FU1BBQ0VAJSRVX0hBVkVfTkFNRVNQQUNFJWcKKzwgcyVAVV9PVkVSUklERV9DWFhfQUxMT0NBVElPTkAlJFVfT1ZFUlJJREVfQ1hYX0FMTE9DQVRJT04lZworPCBzJUBVX0hBVkVfUExBQ0VNRU5UX05FV0AlJFVfSEFWRV9QTEFDRU1FTlRfTkVXJWcKKzwgcyVAVV9IQVZFX1BPUEVOQCUkVV9IQVZFX1BPUEVOJWcKKzwgcyVAVV9IQVZFX1RaU0VUQCUkVV9IQVZFX1RaU0VUJWcKKzwgcyVAVV9UWlNFVEAlJFVfVFpTRVQlZworPCBzJUBVX0hBVkVfVFpOQU1FQCUkVV9IQVZFX1RaTkFNRSVnCis8IHMlQFVfVFpOQU1FQCUkVV9UWk5BTUUlZworPCBzJUBVX0hBVkVfVElNRVpPTkVAJSRVX0hBVkVfVElNRVpPTkUlZworPCBzJUBVX1RJTUVaT05FQCUkVV9USU1FWk9ORSVnCis8IHMlQEhBVkVfSU5UOF9UQCUkSEFWRV9JTlQ4X1QlZworPCBzJUBIQVZFX1VJTlQ4X1RAJSRIQVZFX1VJTlQ4X1QlZworPCBzJUBIQVZFX0lOVDE2X1RAJSRIQVZFX0lOVDE2X1QlZworPCBzJUBIQVZFX1VJTlQxNl9UQCUkSEFWRV9VSU5UMTZfVCVnCis8IHMlQEhBVkVfSU5UMzJfVEAlJEhBVkVfSU5UMzJfVCVnCis8IHMlQEhBVkVfVUlOVDMyX1RAJSRIQVZFX1VJTlQzMl9UJWcKKzwgcyVASEFWRV9JTlQ2NF9UQCUkSEFWRV9JTlQ2NF9UJWcKKzwgcyVASEFWRV9VSU5UNjRfVEAlJEhBVkVfVUlOVDY0X1QlZworPCBzJUBVX0hBVkVfV0NIQVJfSEAlJFVfSEFWRV9XQ0hBUl9IJWcKKzwgcyVAVV9IQVZFX1dDU0NQWUAlJFVfSEFWRV9XQ1NDUFklZworPCBzJUBVX1NJWkVPRl9XQ0hBUl9UQCUkVV9TSVpFT0ZfV0NIQVJfVCVnCis8IHMlQEVYVFJBU19UUlVFQCUkRVhUUkFTX1RSVUUlZworPCBzJUBJQ1VJT19UUlVFQCUkSUNVSU9fVFJVRSVnCis8IHMlQExBWU9VVF9UUlVFQCUkTEFZT1VUX1RSVUUlZworPCBzJUB0aGVzeXNjb25mZGlyQCUkdGhlc3lzY29uZmRpciVnCis8IHMlQHRoZWRhdGFkaXJAJSR0aGVkYXRhZGlyJWcKKzwgcyVAdGhlbGliZGlyQCUkdGhlbGliZGlyJWcKKzwgcyVAcGtnaWN1ZGF0YWRpckAlJHBrZ2ljdWRhdGFkaXIlZworPCBzJUB0aGVwa2dpY3VkYXRhZGlyQCUkdGhlcGtnaWN1ZGF0YWRpciVnCis8IHMlQERBVEFfUEFDS0FHSU5HX0NQUEZMQUdTQCUkREFUQV9QQUNLQUdJTkdfQ1BQRkxBR1MlZworPCBzJUBEQVRBX1BBQ0tBR0lOR19NT0RFQCUkREFUQV9QQUNLQUdJTkdfTU9ERSVnCis8IHMlQElDVUxJQlNVRkZJWEAlJElDVUxJQlNVRkZJWCVnCis8IHMlQFVfSEFWRV9MSUJfU1VGRklYQCUkVV9IQVZFX0xJQl9TVUZGSVglZworPCBzJUBJQ1VMSUJTVUZGSVhDTkFNRUAlJElDVUxJQlNVRkZJWENOQU1FJWcKKzwgcyVAVEVTVFNfVFJVRUAlJFRFU1RTX1RSVUUlZworPCBzJUBTQU1QTEVTX1RSVUVAJSRTQU1QTEVTX1RSVUUlZworPCBzJUBJQ1VEQVRBX0NIQVJAJSRJQ1VEQVRBX0NIQVIlZworPCBzJUBwbGF0Zm9ybUAlJHBsYXRmb3JtJWcKKzwgcyVAcGxhdGZvcm1fbWFrZV9mcmFnbWVudF9uYW1lQCUkcGxhdGZvcm1fbWFrZV9mcmFnbWVudF9uYW1lJWcKKzwgcyVAcGxhdGZvcm1fbWFrZV9mcmFnbWVudEAlJHBsYXRmb3JtX21ha2VfZnJhZ21lbnQlZworPCBzJUBsZF9ycGF0aF9zdWZAJSRsZF9ycGF0aF9zdWYlZworPCBzJUBBSVhfU0hMSUJAJSRBSVhfU0hMSUIlZworPCAKKzwgQ0VPRgorPCBFT0YKKzwgCis8IGNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKKzwgCis8ICMgU3BsaXQgdGhlIHN1YnN0aXR1dGlvbnMgaW50byBiaXRlLXNpemVkIHBpZWNlcyBmb3Igc2VkcyB3aXRoCis8ICMgc21hbGwgY29tbWFuZCBudW1iZXIgbGltaXRzLCBsaWtlIG9uIERpZ2l0YWwgT1NGLzEgYW5kIEhQLVVYLgorPCBhY19tYXhfc2VkX2NtZHM9OTAgIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzZWQgc2NyaXB0LgorPCBhY19maWxlPTEgIyBOdW1iZXIgb2YgY3VycmVudCBmaWxlLgorPCBhY19iZWc9MSAjIEZpcnN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KKzwgYWNfZW5kPSRhY19tYXhfc2VkX2NtZHMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgorPCBhY19tb3JlX2xpbmVzPToKKzwgYWNfc2VkX2NtZHM9IiIKKzwgd2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCis8ICAgaWYgdGVzdCAkYWNfYmVnIC1ndCAxOyB0aGVuCis8ICAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQorLS0tCis+ICMgV29yayBhcm91bmQgYnVncyBpbiBwcmUtMy4wIFVXSU4ga3NoLgorPiBmb3IgYXNfdmFyIGluIEVOViBNQUlMIE1BSUxQQVRICis+IGRvICgkYXNfdW5zZXQgJGFzX3ZhcikgPi9kZXYvbnVsbCAyPiYxICYmICRhc191bnNldCAkYXNfdmFyCis+IGRvbmUKKz4gUFMxPSckICcKKz4gUFMyPSc+ICcKKz4gUFM0PScrICcKKz4gCis+ICMgTkxTIG51aXNhbmNlcy4KKz4gTENfQUxMPUMKKz4gZXhwb3J0IExDX0FMTAorPiBMQU5HVUFHRT1DCis+IGV4cG9ydCBMQU5HVUFHRQorPiAKKz4gIyBSZXF1aXJlZCB0byB1c2UgYmFzZW5hbWUuCis+IGlmIGV4cHIgYSA6ICdcKGFcKScgPi9kZXYvbnVsbCAyPiYxICYmCis+ICAgIHRlc3QgIlhgZXhwciAwMDAwMSA6ICcuKlwoLi4uXCknYCIgPSBYMDAxOyB0aGVuCis+ICAgYXNfZXhwcj1leHByCis+IGVsc2UKKz4gICBhc19leHByPWZhbHNlCis+IGZpCis+IAorPiBpZiAoYmFzZW5hbWUgLS0gLykgPi9kZXYvbnVsbCAyPiYxICYmIHRlc3QgIlhgYmFzZW5hbWUgLS0gLyAyPiYxYCIgPSAiWC8iOyB0aGVuCis+ICAgYXNfYmFzZW5hbWU9YmFzZW5hbWUKKz4gZWxzZQorPiAgIGFzX2Jhc2VuYW1lPWZhbHNlCis+IGZpCis+IAorPiAKKz4gIyBOYW1lIG9mIHRoZSBleGVjdXRhYmxlLgorPiBhc19tZT1gJGFzX2Jhc2VuYW1lIC0tICIkMCIgfHwKKz4gJGFzX2V4cHIgWC8iJDAiIDogJy4qL1woW14vXVteL10qXCkvKiQnIFx8IFwKKz4gCSBYIiQwIiA6ICdYXCgvL1wpJCcgXHwgXAorPiAJIFgiJDAiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorPiAkYXNfZWNobyBYLyIkMCIgfAorPiAgICAgc2VkICcvXi4qXC9cKFteL11bXi9dKlwpXC8qJC97Cis+IAkgICAgcy8vXDEvCis+IAkgICAgcQorPiAJICB9Cis+IAkgIC9eWFwvXChcL1wvXCkkL3sKKz4gCSAgICBzLy9cMS8KKz4gCSAgICBxCis+IAkgIH0KKz4gCSAgL15YXC9cKFwvXCkuKi97Cis+IAkgICAgcy8vXDEvCis+IAkgICAgcQorPiAJICB9Cis+IAkgIHMvLiovLi87IHEnYAorPiAKKz4gIyBDRFBBVEguCis+ICRhc191bnNldCBDRFBBVEgKKz4gCis+IAorPiAKKz4gICBhc19saW5lbm9fMT0kTElORU5PCis+ICAgYXNfbGluZW5vXzI9JExJTkVOTworPiAgIHRlc3QgIngkYXNfbGluZW5vXzEiICE9ICJ4JGFzX2xpbmVub18yIiAmJgorPiAgIHRlc3QgInhgZXhwciAkYXNfbGluZW5vXzEgKyAxYCIgPSAieCRhc19saW5lbm9fMiIgfHwgeworPiAKKz4gICAjIENyZWF0ZSAkYXNfbWUubGluZW5vIGFzIGEgY29weSBvZiAkYXNfbXlzZWxmLCBidXQgd2l0aCAkTElORU5PCis+ICAgIyB1bmlmb3JtbHkgcmVwbGFjZWQgYnkgdGhlIGxpbmUgbnVtYmVyLiAgVGhlIGZpcnN0ICdzZWQnIGluc2VydHMgYQorPiAgICMgbGluZS1udW1iZXIgbGluZSBhZnRlciBlYWNoIGxpbmUgdXNpbmcgJExJTkVOTzsgdGhlIHNlY29uZCAnc2VkJworPiAgICMgZG9lcyB0aGUgcmVhbCB3b3JrLiAgVGhlIHNlY29uZCBzY3JpcHQgdXNlcyAnTicgdG8gcGFpciBlYWNoCis+ICAgIyBsaW5lLW51bWJlciBsaW5lIHdpdGggdGhlIGxpbmUgY29udGFpbmluZyAkTElORU5PLCBhbmQgYXBwZW5kcworPiAgICMgdHJhaWxpbmcgJy0nIGR1cmluZyBzdWJzdGl0dXRpb24gc28gdGhhdCAkTElORU5PIGlzIG5vdCBhIHNwZWNpYWwKKz4gICAjIGNhc2UgYXQgbGluZSBlbmQuCis+ICAgIyAoUmFqYSBSIEhhcmluYXRoIHN1Z2dlc3RlZCBzZWQgJz0nLCBhbmQgUGF1bCBFZ2dlcnQgd3JvdGUgdGhlCis+ICAgIyBzY3JpcHRzIHdpdGggb3B0aW1pemF0aW9uIGhlbHAgZnJvbSBQYW9sbyBCb256aW5pLiAgQmxhbWUgTGVlCis+ICAgIyBFLiBNY01haG9uICgxOTMxLTE5ODkpIGZvciBzZWQncyBzeW50YXguICA6LSkKKz4gICBzZWQgLW4gJworPiAgICAgcAorPiAgICAgL1skXUxJTkVOTy89Cis+ICAgJyA8JGFzX215c2VsZiB8Cis+ICAgICBzZWQgJworPiAgICAgICBzL1skXUxJTkVOTy4qLyYtLworPiAgICAgICB0IGxpbmVubworPiAgICAgICBiCis+ICAgICAgIDpsaW5lbm8KKz4gICAgICAgTgorPiAgICAgICA6bG9vcAorPiAgICAgICBzL1skXUxJTkVOT1woW14nJGFzX2NyX2FsbnVtJ19dLipcblwpXCguKlwpL1wyXDFcMi8KKz4gICAgICAgdCBsb29wCis+ICAgICAgIHMvLVxuLiovLworPiAgICAgJyA+JGFzX21lLmxpbmVubyAmJgorPiAgIGNobW9kICt4ICIkYXNfbWUubGluZW5vIiB8fAorPiAgICAgeyAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNyZWF0ZSAkYXNfbWUubGluZW5vOyByZXJ1biB3aXRoIGEgUE9TSVggc2hlbGwiID4mMgorPiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKz4gCis+ICAgIyBEb24ndCB0cnkgdG8gZXhlYyBhcyBpdCBjaGFuZ2VzICRbMF0sIGNhdXNpbmcgYWxsIHNvcnQgb2YgcHJvYmxlbXMKKz4gICAjICh0aGUgZGlybmFtZSBvZiAkWzBdIGlzIG5vdCB0aGUgcGxhY2Ugd2hlcmUgd2UgbWlnaHQgZmluZCB0aGUKKz4gICAjIG9yaWdpbmFsIGFuZCBzbyBvbi4gIEF1dG9jb25mIGlzIGVzcGVjaWFsbHkgc2Vuc2l0aXZlIHRvIHRoaXMpLgorPiAgIC4gIi4vJGFzX21lLmxpbmVubyIKKz4gICAjIEV4aXQgc3RhdHVzIGlzIHRoYXQgb2YgdGhlIGxhc3QgY29tbWFuZC4KKz4gICBleGl0Cis+IH0KKz4gCis+IAorPiBpZiAoYXNfZGlyPWBkaXJuYW1lIC0tIC9gICYmIHRlc3QgIlgkYXNfZGlyIiA9IFgvKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKz4gICBhc19kaXJuYW1lPWRpcm5hbWUKKz4gZWxzZQorPiAgIGFzX2Rpcm5hbWU9ZmFsc2UKKz4gZmkKKz4gCis+IEVDSE9fQz0gRUNIT19OPSBFQ0hPX1Q9Cis+IGNhc2UgYGVjaG8gLW4geGAgaW4KKz4gLW4qKQorPiAgIGNhc2UgYGVjaG8gJ3hcYydgIGluCis+ICAgKmMqKSBFQ0hPX1Q9JwknOzsJIyBFQ0hPX1QgaXMgc2luZ2xlIHRhYiBjaGFyYWN0ZXIuCis+ICAgKikgICBFQ0hPX0M9J1xjJzs7Cis+ICAgZXNhYzs7Cis+ICopCis+ICAgRUNIT19OPSctbic7OworPiBlc2FjCis+IGlmIGV4cHIgYSA6ICdcKGFcKScgPi9kZXYvbnVsbCAyPiYxICYmCis+ICAgIHRlc3QgIlhgZXhwciAwMDAwMSA6ICcuKlwoLi4uXCknYCIgPSBYMDAxOyB0aGVuCis+ICAgYXNfZXhwcj1leHByCis+IGVsc2UKKz4gICBhc19leHByPWZhbHNlCis+IGZpCis+IAorPiBybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZmlsZQorPiBpZiB0ZXN0IC1kIGNvbmYkJC5kaXI7IHRoZW4KKz4gICBybSAtZiBjb25mJCQuZGlyL2NvbmYkJC5maWxlCis+IGVsc2UKKz4gICBybSAtZiBjb25mJCQuZGlyCis+ICAgbWtkaXIgY29uZiQkLmRpciAyPi9kZXYvbnVsbAorPiBmaQorPiBpZiAoZWNobyA+Y29uZiQkLmZpbGUpIDI+L2Rldi9udWxsOyB0aGVuCis+ICAgaWYgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCis+ICAgICBhc19sbl9zPSdsbiAtcycKKz4gICAgICMgLi4uIGJ1dCB0aGVyZSBhcmUgdHdvIGdvdGNoYXM6Cis+ICAgICAjIDEpIE9uIE1TWVMsIGJvdGggYGxuIC1zIGZpbGUgZGlyJyBhbmQgYGxuIGZpbGUgZGlyJyBmYWlsLgorPiAgICAgIyAyKSBESkdQUCA8IDIuMDQgaGFzIG5vIHN5bWxpbmtzOyBgbG4gLXMnIGNyZWF0ZXMgYSB3cmFwcGVyIGV4ZWN1dGFibGUuCis+ICAgICAjIEluIGJvdGggY2FzZXMsIHdlIGhhdmUgdG8gZGVmYXVsdCB0byBgY3AgLXAnLgorPiAgICAgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkLmRpciAyPi9kZXYvbnVsbCAmJiB0ZXN0ICEgLWYgY29uZiQkLmV4ZSB8fAorPiAgICAgICBhc19sbl9zPSdjcCAtcCcKKz4gICBlbGlmIGxuIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgorPiAgICAgYXNfbG5fcz1sbgorNDM5NWM5NTc5Cis8ICAgICBzZWQgIiR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKKy0tLQorPiAgICAgYXNfbG5fcz0nY3AgLXAnCis0Mzk3LDQ0NzJjOTU4MSw5NTg1Cis8ICAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LnMkYWNfZmlsZTsgdGhlbgorPCAgICAgYWNfbW9yZV9saW5lcz1mYWxzZQorPCAgICAgcm0gLWYgY29uZnRlc3QucyRhY19maWxlCis8ICAgZWxzZQorPCAgICAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgorPCAgICAgICBhY19zZWRfY21kcz0ic2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKKzwgICAgIGVsc2UKKzwgICAgICAgYWNfc2VkX2NtZHM9IiRhY19zZWRfY21kcyB8IHNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCis8ICAgICBmaQorPCAgICAgYWNfZmlsZT1gZXhwciAkYWNfZmlsZSArIDFgCis8ICAgICBhY19iZWc9JGFjX2VuZAorPCAgICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9jbWRzYAorPCAgIGZpCis8IGRvbmUKKzwgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgorPCAgIGFjX3NlZF9jbWRzPWNhdAorPCBmaQorPCBFT0YKKzwgCis8IGNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorPCAKKzwgQ09ORklHX0ZJTEVTPVwke0NPTkZJR19GSUxFUy0iaWN1ZGVmcy5tayBcCis8IAkJTWFrZWZpbGUgXAorPCAJCWRhdGEvaWN1cGtnLmluYyBcCis8IAkJY29uZmlnL01ha2VmaWxlLmluYyBcCis8IAkJZGF0YS9NYWtlZmlsZSBcCis8IAkJc3R1YmRhdGEvTWFrZWZpbGUgXAorPCAJCWNvbW1vbi9NYWtlZmlsZSBcCis8IAkJaTE4bi9NYWtlZmlsZSBcCis8IAkJbGF5b3V0L01ha2VmaWxlIFwKKzwgCQlsYXlvdXRleC9NYWtlZmlsZSBcCis8IAkJaW8vTWFrZWZpbGUgXAorPCAJCWV4dHJhL01ha2VmaWxlIFwKKzwgCQlleHRyYS91Y29udi9NYWtlZmlsZSBleHRyYS9zY3JwdHJ1bi9NYWtlZmlsZSBcCis8IAkJdG9vbHMvTWFrZWZpbGUgdG9vbHMvY3Rlc3Rmdy9NYWtlZmlsZSBcCis8IAkJdG9vbHMvbWFrZWNvbnYvTWFrZWZpbGUgXAorPCAJCXRvb2xzL2dlbnJiL01ha2VmaWxlIFwKKzwgCQl0b29scy9nZW51Y2EvTWFrZWZpbGUgXAorPCAJCXRvb2xzL2dlbmNjb2RlL01ha2VmaWxlIFwKKzwgCQl0b29scy9nZW5jbW4vTWFrZWZpbGUgXAorPCAJCXRvb2xzL2dlbmNudmFsL01ha2VmaWxlIFwKKzwgCQl0b29scy9nZW5uYW1lcy9NYWtlZmlsZSBcCis8IAkJdG9vbHMvZ2VudGVzdC9NYWtlZmlsZSBcCis8IAkJdG9vbHMvZ2Vubm9ybS9NYWtlZmlsZSBcCis8IAkJdG9vbHMvZ2VucHJvcHMvTWFrZWZpbGUgXAorPCAJCXRvb2xzL2dlbmNhc2UvTWFrZWZpbGUgXAorPCAJCXRvb2xzL2dlbnBuYW1lL01ha2VmaWxlIFwKKzwgCQl0b29scy9nZW5icmsvTWFrZWZpbGUgXAorPCAJCXRvb2xzL2dlbnNwcmVwL01ha2VmaWxlIFwKKzwgCQl0b29scy9pY3Vzd2FwL01ha2VmaWxlIFwKKzwgCQl0b29scy9wa2dkYXRhL01ha2VmaWxlIFwKKzwgCQl0b29scy90b29sdXRpbC9NYWtlZmlsZSBcCis8IAkJdG9vbHMvZHVtcGNlL01ha2VmaWxlIFwKKzwgCQl0ZXN0L01ha2VmaWxlIFwKKzwgCQl0ZXN0L3Rlc3RkYXRhL01ha2VmaWxlIFwKKzwgCQl0ZXN0L3Rlc3RkYXRhL3BrZ2RhdGEuaW5jIFwKKzwgCQl0ZXN0L2hkcnRzdC9NYWtlZmlsZSBcCis8IAkJdGVzdC9pbnRsdGVzdC9NYWtlZmlsZSBcCis8IAkJdGVzdC9jaW50bHRzdC9NYWtlZmlsZSBcCis8IAkJdGVzdC9pb3Rlc3QvTWFrZWZpbGUgXAorPCAJCXRlc3QvdGhhaXRlc3QvTWFrZWZpbGUgXAorPCAJCXRlc3QvdGVzdG1hcC9NYWtlZmlsZSBcCis8IAkJdGVzdC9sZXRlc3QvTWFrZWZpbGUgXAorPCAJCXRlc3QvdGhyZWFkdGVzdC9NYWtlZmlsZSBcCis8IAkJc2FtcGxlcy9NYWtlZmlsZSBzYW1wbGVzL2RhdGUvTWFrZWZpbGUgXAorPCAJCXNhbXBsZXMvY2FsL01ha2VmaWxlIHNhbXBsZXMvbGF5b3V0L01ha2VmaWxlIFwKKzwgCQljb21tb24vdW5pY29kZS9wbGF0Zm9ybS5oIn0KKzwgRU9GCis8IGNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKKzwgZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19GSUxFUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KKzwgICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCis8ICAgY2FzZSAiJGFjX2ZpbGUiIGluCis8ICAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKKzwgICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OworPCAgICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7Cis8ICAgZXNhYworLS0tCis+IGVsc2UKKz4gICBhc19sbl9zPSdjcCAtcCcKKz4gZmkKKz4gcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmRpci9jb25mJCQuZmlsZSBjb25mJCQuZmlsZQorPiBybWRpciBjb25mJCQuZGlyIDI+L2Rldi9udWxsCis0NDc0Yzk1ODcsOTU5MgorPCAgICMgQWRqdXN0IGEgcmVsYXRpdmUgc3JjZGlyLCB0b3Bfc3JjZGlyLCBhbmQgSU5TVEFMTCBmb3Igc3ViZGlyZWN0b3JpZXMuCistLS0KKz4gaWYgbWtkaXIgLXAgLiAyPi9kZXYvbnVsbDsgdGhlbgorPiAgIGFzX21rZGlyX3A9OgorPiBlbHNlCis+ICAgdGVzdCAtZCAuLy1wICYmIHJtZGlyIC4vLXAKKz4gICBhc19ta2Rpcl9wPWZhbHNlCis+IGZpCis0NDc2LDQ0ODNjOTU5NCw5NTk4Cis8ICAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCis8ICAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKKzwgICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KKzwgICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCis8ICAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgorPCAgICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzJV5cLi8lJSdgIgorPCAgICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KKzwgICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCistLS0KKz4gaWYgdGVzdCAteCAvID4vZGV2L251bGwgMj4mMTsgdGhlbgorPiAgIGFzX3Rlc3RfeD0ndGVzdCAteCcKKz4gZWxzZQorPiAgIGlmIGxzIC1kTCAvID4vZGV2L251bGwgMj4mMTsgdGhlbgorPiAgICAgYXNfbHNfTF9vcHRpb249TAorNDQ4NWM5NjAwCis8ICAgICBhY19kaXJfc3VmZml4PSBhY19kb3RzPQorLS0tCis+ICAgICBhc19sc19MX29wdGlvbj0KKzQ0ODZhOTYwMiw5NjM3Cis+ICAgYXNfdGVzdF94PScKKz4gICAgIGV2YWwgc2ggLWMgJ1wnJworPiAgICAgICBpZiB0ZXN0IC1kICIkMSI7IHRoZW4KKz4gCXRlc3QgLWQgIiQxLy4iOworPiAgICAgICBlbHNlCis+IAljYXNlICQxIGluCis+IAktKilzZXQgIi4vJDEiOzsKKz4gCWVzYWM7Cis+IAljYXNlIGBscyAtbGQnJGFzX2xzX0xfb3B0aW9uJyAiJDEiIDI+L2Rldi9udWxsYCBpbgorPiAJPz8/W3N4XSopOjs7KilmYWxzZTs7ZXNhYztmaQorPiAgICAgJ1wnJyBzaAorPiAgICcKKz4gZmkKKz4gYXNfZXhlY3V0YWJsZV9wPSRhc190ZXN0X3gKKz4gCis+ICMgU2VkIGV4cHJlc3Npb24gdG8gbWFwIGEgc3RyaW5nIG9udG8gYSB2YWxpZCBDUFAgbmFtZS4KKz4gYXNfdHJfY3BwPSJldmFsIHNlZCAneSUqJGFzX2NyX2xldHRlcnMlUCRhc19jcl9MRVRURVJTJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKKz4gCis+ICMgU2VkIGV4cHJlc3Npb24gdG8gbWFwIGEgc3RyaW5nIG9udG8gYSB2YWxpZCB2YXJpYWJsZSBuYW1lLgorPiBhc190cl9zaD0iZXZhbCBzZWQgJ3klKislcHAlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgorPiAKKz4gCis+IGV4ZWMgNj4mMQorPiAKKz4gIyBTYXZlIHRoZSBsb2cgbWVzc2FnZSwgdG8ga2VlcCAkWzBdIGFuZCBzbyBvbiBtZWFuaW5nZnVsLCBhbmQgdG8KKz4gIyByZXBvcnQgYWN0dWFsIGlucHV0IHZhbHVlcyBvZiBDT05GSUdfRklMRVMgZXRjLiBpbnN0ZWFkIG9mIHRoZWlyCis+ICMgdmFsdWVzIGFmdGVyIG9wdGlvbnMgaGFuZGxpbmcuCis+IGFjX2xvZz0iCis+IFRoaXMgZmlsZSB3YXMgZXh0ZW5kZWQgYnkgJGFzX21lLCB3aGljaCB3YXMKKz4gZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjYzLiAgSW52b2NhdGlvbiBjb21tYW5kIGxpbmUgd2FzCis+IAorPiAgIENPTkZJR19GSUxFUyAgICA9ICRDT05GSUdfRklMRVMKKz4gICBDT05GSUdfSEVBREVSUyAgPSAkQ09ORklHX0hFQURFUlMKKz4gICBDT05GSUdfTElOS1MgICAgPSAkQ09ORklHX0xJTktTCis+ICAgQ09ORklHX0NPTU1BTkRTID0gJENPTkZJR19DT01NQU5EUworPiAgICQgJDAgJEAKKzQ0ODgsNDQ5NmM5NjM5LDk2NTAKKzwgICBjYXNlICIkYWNfZ2l2ZW5fc3JjZGlyIiBpbgorPCAgIC4pICBzcmNkaXI9LgorPCAgICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCis8ICAgICAgIGVsc2UgdG9wX3NyY2Rpcj1gZWNobyAkYWNfZG90c3xzZWQgJ3MlLyQlJSdgOyBmaSA7OworPCAgIC8qKSBzcmNkaXI9IiRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCI7IHRvcF9zcmNkaXI9IiRhY19naXZlbl9zcmNkaXIiIDs7Cis8ICAgKikgIyBSZWxhdGl2ZSBwYXRoLgorPCAgICAgc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCIKKzwgICAgIHRvcF9zcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciIgOzsKKzwgICBlc2FjCistLS0KKz4gb24gYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgCis+ICIKKz4gCis+IF9BQ0VPRgorPiAKKz4gY2FzZSAkYWNfY29uZmlnX2ZpbGVzIGluICoiCis+ICIqKSBzZXQgeCAkYWNfY29uZmlnX2ZpbGVzOyBzaGlmdDsgYWNfY29uZmlnX2ZpbGVzPSQqOzsKKz4gZXNhYworPiAKKz4gY2FzZSAkYWNfY29uZmlnX2hlYWRlcnMgaW4gKiIKKz4gIiopIHNldCB4ICRhY19jb25maWdfaGVhZGVyczsgc2hpZnQ7IGFjX2NvbmZpZ19oZWFkZXJzPSQqOzsKKz4gZXNhYworNDQ5OCw0NTAxZDk2NTEKKzwgICBjYXNlICIkYWNfZ2l2ZW5fSU5TVEFMTCIgaW4KKzwgICBbLyRdKikgSU5TVEFMTD0iJGFjX2dpdmVuX0lOU1RBTEwiIDs7Cis8ICAgKikgSU5TVEFMTD0iJGFjX2RvdHMkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKKzwgICBlc2FjCis0NTAzLDQ1MDljOTY1Myw5NzE4Cis8ICAgZWNobyBjcmVhdGluZyAiJGFjX2ZpbGUiCis8ICAgcm0gLWYgIiRhY19maWxlIgorPCAgIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBgZWNobyAkYWNfZmlsZV9pbnxzZWQgJ3MlLiovJSUnYCBieSBjb25maWd1cmUuIgorPCAgIGNhc2UgIiRhY19maWxlIiBpbgorPCAgICpNYWtlZmlsZSopIGFjX2NvbXN1Yj0iMWlcXAorPCAjICRjb25maWd1cmVfaW5wdXQiIDs7Cis8ICAgKikgYWNfY29tc3ViPSA7OworLS0tCis+IGNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorPiAjIEZpbGVzIHRoYXQgY29uZmlnLnN0YXR1cyB3YXMgbWFkZSBmb3IuCis+IGNvbmZpZ19maWxlcz0iJGFjX2NvbmZpZ19maWxlcyIKKz4gY29uZmlnX2hlYWRlcnM9IiRhY19jb25maWdfaGVhZGVycyIKKz4gCis+IF9BQ0VPRgorPiAKKz4gY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorPiBhY19jc191c2FnZT0iXAorPiBcYCRhc19tZScgaW5zdGFudGlhdGVzIGZpbGVzIGZyb20gdGVtcGxhdGVzIGFjY29yZGluZyB0byB0aGUKKz4gY3VycmVudCBjb25maWd1cmF0aW9uLgorPiAKKz4gVXNhZ2U6ICQwIFtPUFRJT05dLi4uIFtGSUxFXS4uLgorPiAKKz4gICAtaCwgLS1oZWxwICAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0Cis+ICAgLVYsIC0tdmVyc2lvbiAgICBwcmludCB2ZXJzaW9uIG51bWJlciBhbmQgY29uZmlndXJhdGlvbiBzZXR0aW5ncywgdGhlbiBleGl0Cis+ICAgLXEsIC0tcXVpZXQsIC0tc2lsZW50Cis+ICAgICAgICAgICAgICAgICAgICBkbyBub3QgcHJpbnQgcHJvZ3Jlc3MgbWVzc2FnZXMKKz4gICAtZCwgLS1kZWJ1ZyAgICAgIGRvbid0IHJlbW92ZSB0ZW1wb3JhcnkgZmlsZXMKKz4gICAgICAgLS1yZWNoZWNrICAgIHVwZGF0ZSAkYXNfbWUgYnkgcmVjb25maWd1cmluZyBpbiB0aGUgc2FtZSBjb25kaXRpb25zCis+ICAgICAgIC0tZmlsZT1GSUxFWzpURU1QTEFURV0KKz4gICAgICAgICAgICAgICAgICAgIGluc3RhbnRpYXRlIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgRklMRQorPiAgICAgICAtLWhlYWRlcj1GSUxFWzpURU1QTEFURV0KKz4gICAgICAgICAgICAgICAgICAgIGluc3RhbnRpYXRlIHRoZSBjb25maWd1cmF0aW9uIGhlYWRlciBGSUxFCis+IAorPiBDb25maWd1cmF0aW9uIGZpbGVzOgorPiAkY29uZmlnX2ZpbGVzCis+IAorPiBDb25maWd1cmF0aW9uIGhlYWRlcnM6Cis+ICRjb25maWdfaGVhZGVycworPiAKKz4gUmVwb3J0IGJ1Z3MgdG8gPGJ1Zy1hdXRvY29uZkBnbnUub3JnPi4iCis+IAorPiBfQUNFT0YKKz4gY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCis+IGFjX2NzX3ZlcnNpb249IlxcCis+IGNvbmZpZy5zdGF0dXMKKz4gY29uZmlndXJlZCBieSAkMCwgZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjYzLAorPiAgIHdpdGggb3B0aW9ucyBcXCJgJGFzX2VjaG8gIiRhY19jb25maWd1cmVfYXJncyIgfCBzZWQgJ3MvXiAvLzsgcy9bXFwiIlxgXCRdL1xcXFwmL2cnYFxcIgorPiAKKz4gQ29weXJpZ2h0IChDKSAyMDA4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorPiBUaGlzIGNvbmZpZy5zdGF0dXMgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKz4gZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LiIKKz4gCis+IGFjX3B3ZD0nJGFjX3B3ZCcKKz4gc3JjZGlyPSckc3JjZGlyJworPiBJTlNUQUxMPSckSU5TVEFMTCcKKz4gdGVzdCAtbiAiXCRBV0siIHx8IEFXSz1hd2sKKz4gX0FDRU9GCis+IAorPiBjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCis+ICMgVGhlIGRlZmF1bHQgbGlzdHMgYXBwbHkgaWYgdGhlIHVzZXIgZG9lcyBub3Qgc3BlY2lmeSBhbnkgZmlsZS4KKz4gYWNfbmVlZF9kZWZhdWx0cz06Cis+IHdoaWxlIHRlc3QgJCMgIT0gMAorPiBkbworPiAgIGNhc2UgJDEgaW4KKz4gICAtLSo9KikKKz4gICAgIGFjX29wdGlvbj1gZXhwciAiWCQxIiA6ICdYXChbXj1dKlwpPSdgCis+ICAgICBhY19vcHRhcmc9YGV4cHIgIlgkMSIgOiAnWFtePV0qPVwoLipcKSdgCis+ICAgICBhY19zaGlmdD06Cis+ICAgICA7OworPiAgICopCis+ICAgICBhY19vcHRpb249JDEKKz4gICAgIGFjX29wdGFyZz0kMgorPiAgICAgYWNfc2hpZnQ9c2hpZnQKKz4gICAgIDs7Cis0NTEyLDQ1MjBjOTcyMSw5NzYwCis8ICAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKKzwgICBzZWQgLWUgIiRhY19jb21zdWIKKzwgcyVAY29uZmlndXJlX2lucHV0QCUkY29uZmlndXJlX2lucHV0JWcKKzwgcyVAc3JjZGlyQCUkc3JjZGlyJWcKKzwgcyVAdG9wX3NyY2RpckAlJHRvcF9zcmNkaXIlZworPCBzJUBJTlNUQUxMQCUkSU5TVEFMTCVnCis8ICIgJGFjX2ZpbGVfaW5wdXRzIHwgKGV2YWwgIiRhY19zZWRfY21kcyIpID4gJGFjX2ZpbGUKKzwgZmk7IGRvbmUKKzwgcm0gLWYgY29uZnRlc3QucyoKKy0tLQorPiAgIGNhc2UgJGFjX29wdGlvbiBpbgorPiAgICMgSGFuZGxpbmcgb2YgdGhlIG9wdGlvbnMuCis+ICAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCis+ICAgICBhY19jc19yZWNoZWNrPTogOzsKKz4gICAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYgfCAtViApCis+ICAgICAkYXNfZWNobyAiJGFjX2NzX3ZlcnNpb24iOyBleGl0IDs7Cis+ICAgLS1kZWJ1ZyB8IC0tZGVidSB8IC0tZGViIHwgLS1kZSB8IC0tZCB8IC1kICkKKz4gICAgIGRlYnVnPTogOzsKKz4gICAtLWZpbGUgfCAtLWZpbCB8IC0tZmkgfCAtLWYgKQorPiAgICAgJGFjX3NoaWZ0Cis+ICAgICBjYXNlICRhY19vcHRhcmcgaW4KKz4gICAgICpcJyopIGFjX29wdGFyZz1gJGFzX2VjaG8gIiRhY19vcHRhcmciIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7Cis+ICAgICBlc2FjCis+ICAgICBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgJyRhY19vcHRhcmcnIgorPiAgICAgYWNfbmVlZF9kZWZhdWx0cz1mYWxzZTs7Cis+ICAgLS1oZWFkZXIgfCAtLWhlYWRlIHwgLS1oZWFkIHwgLS1oZWEgKQorPiAgICAgJGFjX3NoaWZ0Cis+ICAgICBjYXNlICRhY19vcHRhcmcgaW4KKz4gICAgICpcJyopIGFjX29wdGFyZz1gJGFzX2VjaG8gIiRhY19vcHRhcmciIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7Cis+ICAgICBlc2FjCis+ICAgICBDT05GSUdfSEVBREVSUz0iJENPTkZJR19IRUFERVJTICckYWNfb3B0YXJnJyIKKz4gICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2U7OworPiAgIC0taGUgfCAtLWgpCis+ICAgICAjIENvbmZsaWN0IGJldHdlZW4gLS1oZWxwIGFuZCAtLWhlYWRlcgorPiAgICAgeyAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogYW1iaWd1b3VzIG9wdGlvbjogJDEKKz4gVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iID4mMgorPiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07OworPiAgIC0taGVscCB8IC0taGVsIHwgLWggKQorPiAgICAgJGFzX2VjaG8gIiRhY19jc191c2FnZSI7IGV4aXQgOzsKKz4gICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAorPiAgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsIHwgLS1zaSB8IC0tcykKKz4gICAgIGFjX2NzX3NpbGVudD06IDs7Cis+IAorPiAgICMgVGhpcyBpcyBhbiBlcnJvci4KKz4gICAtKikgeyAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogdW5yZWNvZ25pemVkIG9wdGlvbjogJDEKKz4gVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iID4mMgorPiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0gOzsKKz4gCis+ICAgKikgYWNfY29uZmlnX3RhcmdldHM9IiRhY19jb25maWdfdGFyZ2V0cyAkMSIKKz4gICAgICBhY19uZWVkX2RlZmF1bHRzPWZhbHNlIDs7Cis0NTIyLDQ1NTNkOTc2MQorPCAjIFRoZXNlIHNlZCBjb21tYW5kcyBhcmUgcGFzc2VkIHRvIHNlZCBhcyAiQSBOQU1FIEIgTkFNRSBDIFZBTFVFIEQiLCB3aGVyZQorPCAjIE5BTUUgaXMgdGhlIGNwcCBtYWNybyBiZWluZyBkZWZpbmVkIGFuZCBWQUxVRSBpcyB0aGUgdmFsdWUgaXQgaXMgYmVpbmcgZ2l2ZW4uCis8ICMKKzwgIyBhY19kIHNldHMgdGhlIHZhbHVlIGluICIjZGVmaW5lIE5BTUUgVkFMVUUiIGxpbmVzLgorPCBhY19kQT0ncyVeXChbIAldKlwpI1woWyAJXSpkZWZpbmVbIAldWyAJXSpcKScKKzwgYWNfZEI9J1woWyAJXVsgCV0qXClbXiAJXSolXDEjXDInCis8IGFjX2RDPSdcMycKKzwgYWNfZEQ9JyVnJworPCAjIGFjX3UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRoIHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgorPCBhY191QT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKKzwgYWNfdUI9J1woWyAJXVwpJVwxI1wyZGVmaW5lXDMnCis8IGFjX3VDPScgJworPCBhY191RD0nXDQlZycKKzwgIyBhY19lIHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aG91dCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KKzwgYWNfZUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCis8IGFjX2VCPSckJVwxI1wyZGVmaW5lXDMnCis8IGFjX2VDPScgJworPCBhY19lRD0nJWcnCis8IAorPCBpZiB0ZXN0ICIke0NPTkZJR19IRUFERVJTK3NldH0iICE9IHNldDsgdGhlbgorPCBFT0YKKzwgY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCis8ICAgQ09ORklHX0hFQURFUlM9ImNvbW1vbi9pY3VjZmcuaCIKKzwgRU9GCis8IGNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKKzwgZmkKKzwgZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19IRUFERVJTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgorPCAgICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KKzwgICBjYXNlICIkYWNfZmlsZSIgaW4KKzwgICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAorPCAgICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7Cis8ICAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKKzQ1NTRhOTc2Myw5NzY2Cis+ICAgc2hpZnQKKz4gZG9uZQorPiAKKz4gYWNfY29uZmlndXJlX2V4dHJhX2FyZ3M9Cis0NTU2Yzk3NjgsOTc4MgorPCAgIGVjaG8gY3JlYXRpbmcgJGFjX2ZpbGUKKy0tLQorPiBpZiAkYWNfY3Nfc2lsZW50OyB0aGVuCis+ICAgZXhlYyA2Pi9kZXYvbnVsbAorPiAgIGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzPSIkYWNfY29uZmlndXJlX2V4dHJhX2FyZ3MgLS1zaWxlbnQiCis+IGZpCis+IAorPiBfQUNFT0YKKz4gY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCis+IGlmIFwkYWNfY3NfcmVjaGVjazsgdGhlbgorPiAgIHNldCBYICckU0hFTEwnICckMCcgJGFjX2NvbmZpZ3VyZV9hcmdzIFwkYWNfY29uZmlndXJlX2V4dHJhX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24KKz4gICBzaGlmdAorPiAgIFwkYXNfZWNobyAicnVubmluZyBDT05GSUdfU0hFTEw9JFNIRUxMIFwkKiIgPiY2Cis+ICAgQ09ORklHX1NIRUxMPSckU0hFTEwnCis+ICAgZXhwb3J0IENPTkZJR19TSEVMTAorPiAgIGV4ZWMgIlwkQCIKKz4gZmkKKzQ1NTgsNDU4NGM5Nzg0LDk3OTcKKzwgICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0Lm91dAorPCAgIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCis8ICAgY2F0ICRhY19maWxlX2lucHV0cyA+IGNvbmZ0ZXN0LmluCis8IAorPCBFT0YKKzwgCis8ICMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBhIHNlZCBzY3JpcHQgY29uZnRlc3QudmFscyB0aGF0IHN1YnN0aXR1dGVzCis8ICMgdGhlIHByb3BlciB2YWx1ZXMgaW50byBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLiAgQW5kIGZpcnN0OgorPCAjIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgorPCAjIFByb3RlY3QgYWdhaW5zdCBiZWluZyBpbiBhbiB1bnF1b3RlZCBoZXJlIGRvY3VtZW50IGluIGNvbmZpZy5zdGF0dXMuCis8IHJtIC1mIGNvbmZ0ZXN0LnZhbHMKKzwgY2F0ID4gY29uZnRlc3QuaGRyIDw8XEVPRgorPCBzL1tcXCYlXS9cXCYvZworPCBzJVtcXCRgXSVcXCYlZworPCBzJSNkZWZpbmUgXChbQS1aYS16X11bQS1aYS16MC05X10qXCkgKlwoLipcKSUke2FjX2RBfVwxJHthY19kQn1cMSR7YWNfZEN9XDIke2FjX2REfSVncAorPCBzJWFjX2QlYWNfdSVncAorPCBzJWFjX3UlYWNfZSVncAorPCBFT0YKKzwgc2VkIC1uIC1mIGNvbmZ0ZXN0LmhkciBjb25mZGVmcy5oID4gY29uZnRlc3QudmFscworPCBybSAtZiBjb25mdGVzdC5oZHIKKzwgCis8ICMgVGhpcyBzZWQgY29tbWFuZCByZXBsYWNlcyAjdW5kZWYgd2l0aCBjb21tZW50cy4gIFRoaXMgaXMgbmVjZXNzYXJ5LCBmb3IKKzwgIyBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAorPCAjIG9uIHNvbWUgc3lzdGVtcyB3aGVyZSBjb25maWd1cmUgd2lsbCBub3QgZGVjaWRlIHRvIGRlZmluZSBpdC4KKzwgY2F0ID4+IGNvbmZ0ZXN0LnZhbHMgPDxcRU9GCis8IHMlXlsgCV0qI1sgCV0qdW5kZWZbIAldWyAJXSpbYS16QS1aX11bYS16QS1aXzAtOV0qJS8qICYgKi8lCis8IEVPRgorLS0tCis+IF9BQ0VPRgorPiBjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCis+IGV4ZWMgNT4+Y29uZmlnLmxvZworPiB7Cis+ICAgZWNobworPiAgIHNlZCAnaDtzLy4vLS9nO3MvXi4uLi8jIyAvO3MvLi4uJC8gIyMvO3A7eDtwO3gnIDw8X0FTQk9YCis+ICMjIFJ1bm5pbmcgJGFzX21lLiAjIworPiBfQVNCT1gKKz4gICAkYXNfZWNobyAiJGFjX2xvZyIKKz4gfSA+JjUKKz4gCis+IF9BQ0VPRgorPiBjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKz4gX0FDRU9GCis0NTg2LDQ1ODdjOTc5OQorPCAjIEJyZWFrIHVwIGNvbmZ0ZXN0LnZhbHMgYmVjYXVzZSBzb21lIHNoZWxscyBoYXZlIGEgbGltaXQgb24KKzwgIyB0aGUgc2l6ZSBvZiBoZXJlIGRvY3VtZW50cywgYW5kIG9sZCBzZWRzIGhhdmUgc21hbGwgbGltaXRzIHRvby4KKy0tLQorPiBjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCis0NTg5LDQ1OTBjOTgwMSw5ODAyCis8IHJtIC1mIGNvbmZ0ZXN0LnRhaWwKKzwgd2hpbGUgOgorLS0tCis+ICMgSGFuZGxpbmcgb2YgYXJndW1lbnRzLgorPiBmb3IgYWNfY29uZmlnX3RhcmdldCBpbiAkYWNfY29uZmlnX3RhcmdldHMKKzQ1OTIsNDYxNmM5ODA0LDEwMDc2Cis8ICAgYWNfbGluZXM9YGdyZXAgLWMgLiBjb25mdGVzdC52YWxzYAorPCAgICMgZ3JlcCAtYyBnaXZlcyBlbXB0eSBvdXRwdXQgZm9yIGFuIGVtcHR5IGZpbGUgb24gc29tZSBBSVggc3lzdGVtcy4KKzwgICBpZiB0ZXN0IC16ICIkYWNfbGluZXMiIHx8IHRlc3QgIiRhY19saW5lcyIgLWVxIDA7IHRoZW4gYnJlYWs7IGZpCis8ICAgIyBXcml0ZSBhIGxpbWl0ZWQtc2l6ZSBoZXJlIGRvY3VtZW50IHRvIGNvbmZ0ZXN0LmZyYWcuCis8ICAgZWNobyAnICBjYXQgPiBjb25mdGVzdC5mcmFnIDw8Q0VPRicgPj4gJENPTkZJR19TVEFUVVMKKzwgICBzZWQgJHthY19tYXhfaGVyZV9saW5lc31xIGNvbmZ0ZXN0LnZhbHMgPj4gJENPTkZJR19TVEFUVVMKKzwgICBlY2hvICdDRU9GCis8ICAgc2VkIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gPiBjb25mdGVzdC5vdXQKKzwgICBybSAtZiBjb25mdGVzdC5pbgorPCAgIG12IGNvbmZ0ZXN0Lm91dCBjb25mdGVzdC5pbgorPCAnID4+ICRDT05GSUdfU1RBVFVTCis8ICAgc2VkIDEsJHthY19tYXhfaGVyZV9saW5lc31kIGNvbmZ0ZXN0LnZhbHMgPiBjb25mdGVzdC50YWlsCis8ICAgcm0gLWYgY29uZnRlc3QudmFscworPCAgIG12IGNvbmZ0ZXN0LnRhaWwgY29uZnRlc3QudmFscworPCBkb25lCis8IHJtIC1mIGNvbmZ0ZXN0LnZhbHMKKzwgCis8IGNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKKzwgICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmgKKzwgICBlY2hvICIvKiAkYWNfZmlsZS4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gICovIiA+IGNvbmZ0ZXN0LmgKKzwgICBjYXQgY29uZnRlc3QuaW4gPj4gY29uZnRlc3QuaAorPCAgIHJtIC1mIGNvbmZ0ZXN0LmluCis8ICAgaWYgY21wIC1zICRhY19maWxlIGNvbmZ0ZXN0LmggMj4vZGV2L251bGw7IHRoZW4KKzwgICAgIGVjaG8gIiRhY19maWxlIGlzIHVuY2hhbmdlZCIKKzwgICAgIHJtIC1mIGNvbmZ0ZXN0LmgKKy0tLQorPiAgIGNhc2UgJGFjX2NvbmZpZ190YXJnZXQgaW4KKz4gICAgICJjb21tb24vaWN1Y2ZnLmgiKSBDT05GSUdfSEVBREVSUz0iJENPTkZJR19IRUFERVJTIGNvbW1vbi9pY3VjZmcuaCIgOzsKKz4gICAgICJpY3VkZWZzLm1rIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGljdWRlZnMubWsiIDs7Cis+ICAgICAiTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgTWFrZWZpbGUiIDs7Cis+ICAgICAiZGF0YS9pY3Vwa2cuaW5jIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGRhdGEvaWN1cGtnLmluYyIgOzsKKz4gICAgICJjb25maWcvTWFrZWZpbGUuaW5jIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIGNvbmZpZy9NYWtlZmlsZS5pbmMiIDs7Cis+ICAgICAiZGF0YS9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBkYXRhL01ha2VmaWxlIiA7OworPiAgICAgInN0dWJkYXRhL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHN0dWJkYXRhL01ha2VmaWxlIiA7OworPiAgICAgImNvbW1vbi9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBjb21tb24vTWFrZWZpbGUiIDs7Cis+ICAgICAiaTE4bi9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBpMThuL01ha2VmaWxlIiA7OworPiAgICAgImxheW91dC9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBsYXlvdXQvTWFrZWZpbGUiIDs7Cis+ICAgICAibGF5b3V0ZXgvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgbGF5b3V0ZXgvTWFrZWZpbGUiIDs7Cis+ICAgICAiaW8vTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgaW8vTWFrZWZpbGUiIDs7Cis+ICAgICAiZXh0cmEvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgZXh0cmEvTWFrZWZpbGUiIDs7Cis+ICAgICAiZXh0cmEvdWNvbnYvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgZXh0cmEvdWNvbnYvTWFrZWZpbGUiIDs7Cis+ICAgICAiZXh0cmEvc2NycHRydW4vTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgZXh0cmEvc2NycHRydW4vTWFrZWZpbGUiIDs7Cis+ICAgICAidG9vbHMvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgdG9vbHMvTWFrZWZpbGUiIDs7Cis+ICAgICAidG9vbHMvY3Rlc3Rmdy9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB0b29scy9jdGVzdGZ3L01ha2VmaWxlIiA7OworPiAgICAgInRvb2xzL21ha2Vjb252L01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRvb2xzL21ha2Vjb252L01ha2VmaWxlIiA7OworPiAgICAgInRvb2xzL2dlbnJiL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRvb2xzL2dlbnJiL01ha2VmaWxlIiA7OworPiAgICAgInRvb2xzL2dlbnVjYS9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB0b29scy9nZW51Y2EvTWFrZWZpbGUiIDs7Cis+ICAgICAidG9vbHMvZ2VuY2NvZGUvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgdG9vbHMvZ2VuY2NvZGUvTWFrZWZpbGUiIDs7Cis+ICAgICAidG9vbHMvZ2VuY21uL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRvb2xzL2dlbmNtbi9NYWtlZmlsZSIgOzsKKz4gICAgICJ0b29scy9nZW5jbnZhbC9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB0b29scy9nZW5jbnZhbC9NYWtlZmlsZSIgOzsKKz4gICAgICJ0b29scy9nZW5uYW1lcy9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB0b29scy9nZW5uYW1lcy9NYWtlZmlsZSIgOzsKKz4gICAgICJ0b29scy9nZW50ZXN0L01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRvb2xzL2dlbnRlc3QvTWFrZWZpbGUiIDs7Cis+ICAgICAidG9vbHMvZ2Vubm9ybS9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB0b29scy9nZW5ub3JtL01ha2VmaWxlIiA7OworPiAgICAgInRvb2xzL2dlbnByb3BzL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRvb2xzL2dlbnByb3BzL01ha2VmaWxlIiA7OworPiAgICAgInRvb2xzL2dlbmNhc2UvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgdG9vbHMvZ2VuY2FzZS9NYWtlZmlsZSIgOzsKKz4gICAgICJ0b29scy9nZW5wbmFtZS9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB0b29scy9nZW5wbmFtZS9NYWtlZmlsZSIgOzsKKz4gICAgICJ0b29scy9nZW5icmsvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgdG9vbHMvZ2VuYnJrL01ha2VmaWxlIiA7OworPiAgICAgInRvb2xzL2dlbnNwcmVwL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRvb2xzL2dlbnNwcmVwL01ha2VmaWxlIiA7OworPiAgICAgInRvb2xzL2ljdXN3YXAvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgdG9vbHMvaWN1c3dhcC9NYWtlZmlsZSIgOzsKKz4gICAgICJ0b29scy9wa2dkYXRhL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRvb2xzL3BrZ2RhdGEvTWFrZWZpbGUiIDs7Cis+ICAgICAidG9vbHMvdG9vbHV0aWwvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgdG9vbHMvdG9vbHV0aWwvTWFrZWZpbGUiIDs7Cis+ICAgICAidG9vbHMvZHVtcGNlL01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRvb2xzL2R1bXBjZS9NYWtlZmlsZSIgOzsKKz4gICAgICJ0ZXN0L01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRlc3QvTWFrZWZpbGUiIDs7Cis+ICAgICAidGVzdC90ZXN0ZGF0YS9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB0ZXN0L3Rlc3RkYXRhL01ha2VmaWxlIiA7OworPiAgICAgInRlc3QvdGVzdGRhdGEvcGtnZGF0YS5pbmMiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgdGVzdC90ZXN0ZGF0YS9wa2dkYXRhLmluYyIgOzsKKz4gICAgICJ0ZXN0L2hkcnRzdC9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB0ZXN0L2hkcnRzdC9NYWtlZmlsZSIgOzsKKz4gICAgICJ0ZXN0L2ludGx0ZXN0L01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRlc3QvaW50bHRlc3QvTWFrZWZpbGUiIDs7Cis+ICAgICAidGVzdC9jaW50bHRzdC9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB0ZXN0L2NpbnRsdHN0L01ha2VmaWxlIiA7OworPiAgICAgInRlc3QvaW90ZXN0L01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRlc3QvaW90ZXN0L01ha2VmaWxlIiA7OworPiAgICAgInRlc3QvdGhhaXRlc3QvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgdGVzdC90aGFpdGVzdC9NYWtlZmlsZSIgOzsKKz4gICAgICJ0ZXN0L3Rlc3RtYXAvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgdGVzdC90ZXN0bWFwL01ha2VmaWxlIiA7OworPiAgICAgInRlc3QvbGV0ZXN0L01ha2VmaWxlIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHRlc3QvbGV0ZXN0L01ha2VmaWxlIiA7OworPiAgICAgInRlc3QvdGhyZWFkdGVzdC9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyB0ZXN0L3RocmVhZHRlc3QvTWFrZWZpbGUiIDs7Cis+ICAgICAic2FtcGxlcy9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBzYW1wbGVzL01ha2VmaWxlIiA7OworPiAgICAgInNhbXBsZXMvZGF0ZS9NYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBzYW1wbGVzL2RhdGUvTWFrZWZpbGUiIDs7Cis+ICAgICAic2FtcGxlcy9jYWwvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgc2FtcGxlcy9jYWwvTWFrZWZpbGUiIDs7Cis+ICAgICAic2FtcGxlcy9sYXlvdXQvTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgc2FtcGxlcy9sYXlvdXQvTWFrZWZpbGUiIDs7Cis+ICAgICAiY29tbW9uL3VuaWNvZGUvcGxhdGZvcm0uaCIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBjb21tb24vdW5pY29kZS9wbGF0Zm9ybS5oIiA7OworPiAKKz4gICAqKSB7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogaW52YWxpZCBhcmd1bWVudDogJGFjX2NvbmZpZ190YXJnZXQiID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCBhcmd1bWVudDogJGFjX2NvbmZpZ190YXJnZXQiID4mMjt9Cis+ICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTs7Cis+ICAgZXNhYworPiBkb25lCis+IAorPiAKKz4gIyBJZiB0aGUgdXNlciBkaWQgbm90IHVzZSB0aGUgYXJndW1lbnRzIHRvIHNwZWNpZnkgdGhlIGl0ZW1zIHRvIGluc3RhbnRpYXRlLAorPiAjIHRoZW4gdGhlIGVudnZhciBpbnRlcmZhY2UgaXMgdXNlZC4gIFNldCBvbmx5IHRob3NlIHRoYXQgYXJlIG5vdC4KKz4gIyBXZSB1c2UgdGhlIGxvbmcgZm9ybSBmb3IgdGhlIGRlZmF1bHQgYXNzaWdubWVudCBiZWNhdXNlIG9mIGFuIGV4dHJlbWVseQorPiAjIGJpemFycmUgYnVnIG9uIFN1bk9TIDQuMS4zLgorPiBpZiAkYWNfbmVlZF9kZWZhdWx0czsgdGhlbgorPiAgIHRlc3QgIiR7Q09ORklHX0ZJTEVTK3NldH0iID0gc2V0IHx8IENPTkZJR19GSUxFUz0kY29uZmlnX2ZpbGVzCis+ICAgdGVzdCAiJHtDT05GSUdfSEVBREVSUytzZXR9IiA9IHNldCB8fCBDT05GSUdfSEVBREVSUz0kY29uZmlnX2hlYWRlcnMKKz4gZmkKKz4gCis+ICMgSGF2ZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgZm9yIGNvbnZlbmllbmNlLiAgTWFrZSBpdCBpbiB0aGUgYnVpbGQgdHJlZQorPiAjIHNpbXBseSBiZWNhdXNlIHRoZXJlIGlzIG5vIHJlYXNvbiBhZ2FpbnN0IGhhdmluZyBpdCBoZXJlLCBhbmQgaW4gYWRkaXRpb24sCis+ICMgY3JlYXRpbmcgYW5kIG1vdmluZyBmaWxlcyBmcm9tIC90bXAgY2FuIHNvbWV0aW1lcyBjYXVzZSBwcm9ibGVtcy4KKz4gIyBIb29rIGZvciBpdHMgcmVtb3ZhbCB1bmxlc3MgZGVidWdnaW5nLgorPiAjIE5vdGUgdGhhdCB0aGVyZSBpcyBhIHNtYWxsIHdpbmRvdyBpbiB3aGljaCB0aGUgZGlyZWN0b3J5IHdpbGwgbm90IGJlIGNsZWFuZWQ6Cis+ICMgYWZ0ZXIgaXRzIGNyZWF0aW9uIGJ1dCBiZWZvcmUgaXRzIG5hbWUgaGFzIGJlZW4gYXNzaWduZWQgdG8gYCR0bXAnLgorPiAkZGVidWcgfHwKKz4geworPiAgIHRtcD0KKz4gICB0cmFwICdleGl0X3N0YXR1cz0kPworPiAgIHsgdGVzdCAteiAiJHRtcCIgfHwgdGVzdCAhIC1kICIkdG1wIiB8fCBybSAtZnIgIiR0bXAiOyB9ICYmIGV4aXQgJGV4aXRfc3RhdHVzCis+ICcgMAorPiAgIHRyYXAgJ3sgKGV4aXQgMSk7IGV4aXQgMTsgfScgMSAyIDEzIDE1Cis+IH0KKz4gIyBDcmVhdGUgYSAoc2VjdXJlKSB0bXAgZGlyZWN0b3J5IGZvciB0bXAgZmlsZXMuCis+IAorPiB7Cis+ICAgdG1wPWAodW1hc2sgMDc3ICYmIG1rdGVtcCAtZCAiLi9jb25mWFhYWFhYIikgMj4vZGV2L251bGxgICYmCis+ICAgdGVzdCAtbiAiJHRtcCIgJiYgdGVzdCAtZCAiJHRtcCIKKz4gfSAgfHwKKz4geworPiAgIHRtcD0uL2NvbmYkJC0kUkFORE9NCis+ICAgKHVtYXNrIDA3NyAmJiBta2RpciAiJHRtcCIpCis+IH0gfHwKKz4geworPiAgICAkYXNfZWNobyAiJGFzX21lOiBjYW5ub3QgY3JlYXRlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiAuIiA+JjIKKz4gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9Cis+IH0KKz4gCis+ICMgU2V0IHVwIHRoZSBzY3JpcHRzIGZvciBDT05GSUdfRklMRVMgc2VjdGlvbi4KKz4gIyBObyBuZWVkIHRvIGdlbmVyYXRlIHRoZW0gaWYgdGhlcmUgYXJlIG5vIENPTkZJR19GSUxFUy4KKz4gIyBUaGlzIGhhcHBlbnMgZm9yIGluc3RhbmNlIHdpdGggYC4vY29uZmlnLnN0YXR1cyBjb25maWcuaCcuCis+IGlmIHRlc3QgLW4gIiRDT05GSUdfRklMRVMiOyB0aGVuCis+IAorPiAKKz4gYWNfY3I9JworJworPiBhY19jc19hd2tfY3I9YCRBV0sgJ0JFR0lOIHsgcHJpbnQgImFccmIiIH0nIDwvZGV2L251bGwgMj4vZGV2L251bGxgCis+IGlmIHRlc3QgIiRhY19jc19hd2tfY3IiID0gImEke2FjX2NyfWIiOyB0aGVuCis+ICAgYWNfY3NfYXdrX2NyPSdcXHInCis+IGVsc2UKKz4gICBhY19jc19hd2tfY3I9JGFjX2NyCis+IGZpCis+IAorPiBlY2hvICdCRUdJTiB7JyA+IiR0bXAvc3ViczEuYXdrIiAmJgorPiBfQUNFT0YKKz4gCis+IAorPiB7Cis+ICAgZWNobyAiY2F0ID5jb25mJCRzdWJzLmF3ayA8PF9BQ0VPRiIgJiYKKz4gICBlY2hvICIkYWNfc3Vic3RfdmFycyIgfCBzZWQgJ3MvLiovJiEkJiRhY19kZWxpbS8nICYmCis+ICAgZWNobyAiX0FDRU9GIgorPiB9ID5jb25mJCRzdWJzLnNoIHx8Cis+ICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNvdWxkIG5vdCBtYWtlICRDT05GSUdfU1RBVFVTIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGNvdWxkIG5vdCBtYWtlICRDT05GSUdfU1RBVFVTIiA+JjI7fQorPiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKz4gYWNfZGVsaW1fbnVtPWBlY2hvICIkYWNfc3Vic3RfdmFycyIgfCBncmVwIC1jICckJ2AKKz4gYWNfZGVsaW09JyUhXyEjICcKKz4gZm9yIGFjX2xhc3RfdHJ5IGluIGZhbHNlIGZhbHNlIGZhbHNlIGZhbHNlIGZhbHNlIDo7IGRvCis+ICAgLiAuL2NvbmYkJHN1YnMuc2ggfHwKKz4gICAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjb3VsZCBub3QgbWFrZSAkQ09ORklHX1NUQVRVUyIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBjb3VsZCBub3QgbWFrZSAkQ09ORklHX1NUQVRVUyIgPiYyO30KKz4gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Cis+IAorPiAgIGFjX2RlbGltX249YHNlZCAtbiAicy8uKiRhY19kZWxpbVwkL1gvcCIgY29uZiQkc3Vicy5hd2sgfCBncmVwIC1jIFhgCis+ICAgaWYgdGVzdCAkYWNfZGVsaW1fbiA9ICRhY19kZWxpbV9udW07IHRoZW4KKz4gICAgIGJyZWFrCis+ICAgZWxpZiAkYWNfbGFzdF90cnk7IHRoZW4KKz4gICAgIHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjb3VsZCBub3QgbWFrZSAkQ09ORklHX1NUQVRVUyIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBjb3VsZCBub3QgbWFrZSAkQ09ORklHX1NUQVRVUyIgPiYyO30KKz4gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Cis+ICAgZWxzZQorPiAgICAgYWNfZGVsaW09IiRhY19kZWxpbSEkYWNfZGVsaW0gXyRhY19kZWxpbSEhICIKKz4gICBmaQorPiBkb25lCis+IHJtIC1mIGNvbmYkJHN1YnMuc2gKKz4gCis+IGNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorPiBjYXQgPj4iXCR0bXAvc3ViczEuYXdrIiA8PFxcX0FDQVdLICYmCis+IF9BQ0VPRgorPiBzZWQgLW4gJworPiBoCis+IHMvXi9TWyIvOyBzLyEuKi8iXT0vCis+IHAKKz4gZworPiBzL15bXiFdKiEvLworPiA6cmVwbAorPiB0IHJlcGwKKz4gcy8nIiRhY19kZWxpbSInJC8vCis+IHQgZGVsaW0KKz4gOm5sCis+IGgKKz4gcy9cKC5cezE0OFx9XCkuKi9cMS8KKz4gdCBtb3JlMQorPiBzL1siXFxdL1xcJi9nOyBzL14vIi87IHMvJC9cXG4iXFwvCis+IHAKKz4gbgorPiBiIHJlcGwKKz4gOm1vcmUxCis+IHMvWyJcXF0vXFwmL2c7IHMvXi8iLzsgcy8kLyJcXC8KKz4gcAorPiBnCis+IHMvLlx7MTQ4XH0vLworPiB0IG5sCis+IDpkZWxpbQorPiBoCis+IHMvXCguXHsxNDhcfVwpLiovXDEvCis+IHQgbW9yZTIKKz4gcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvIi8KKz4gcAorPiBiCis+IDptb3JlMgorPiBzL1siXFxdL1xcJi9nOyBzL14vIi87IHMvJC8iXFwvCis+IHAKKz4gZworPiBzLy5cezE0OFx9Ly8KKz4gdCBkZWxpbQorPiAnIDxjb25mJCRzdWJzLmF3ayB8IHNlZCAnCis+IC9eW14iIl0veworPiAgIE4KKz4gICBzL1xuLy8KKz4gfQorPiAnID4+JENPTkZJR19TVEFUVVMgfHwgYWNfd3JpdGVfZmFpbD0xCis+IHJtIC1mIGNvbmYkJHN1YnMuYXdrCis+IGNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorPiBfQUNBV0sKKz4gY2F0ID4+IlwkdG1wL3N1YnMxLmF3ayIgPDxfQUNBV0sgJiYKKz4gICBmb3IgKGtleSBpbiBTKSBTX2lzX3NldFtrZXldID0gMQorPiAgIEZTID0gIgciCis+IAorPiB9Cis+IHsKKz4gICBsaW5lID0gJCAwCis+ICAgbmZpZWxkcyA9IHNwbGl0KGxpbmUsIGZpZWxkLCAiQCIpCis+ICAgc3Vic3RlZCA9IDAKKz4gICBsZW4gPSBsZW5ndGgoZmllbGRbMV0pCis+ICAgZm9yIChpID0gMjsgaSA8IG5maWVsZHM7IGkrKykgeworPiAgICAga2V5ID0gZmllbGRbaV0KKz4gICAgIGtleWxlbiA9IGxlbmd0aChrZXkpCis+ICAgICBpZiAoU19pc19zZXRba2V5XSkgeworPiAgICAgICB2YWx1ZSA9IFNba2V5XQorPiAgICAgICBsaW5lID0gc3Vic3RyKGxpbmUsIDEsIGxlbikgIiIgdmFsdWUgIiIgc3Vic3RyKGxpbmUsIGxlbiArIGtleWxlbiArIDMpCis+ICAgICAgIGxlbiArPSBsZW5ndGgodmFsdWUpICsgbGVuZ3RoKGZpZWxkWysraV0pCis+ICAgICAgIHN1YnN0ZWQgPSAxCis+ICAgICB9IGVsc2UKKz4gICAgICAgbGVuICs9IDEgKyBrZXlsZW4KKz4gICB9Cis+IAorPiAgIHByaW50IGxpbmUKKz4gfQorPiAKKz4gX0FDQVdLCis+IF9BQ0VPRgorPiBjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCis+IGlmIHNlZCAicy8kYWNfY3IvLyIgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgorPiAgIHNlZCAicy8kYWNfY3JcJC8vOyBzLyRhY19jci8kYWNfY3NfYXdrX2NyL2ciCis+IGVsc2UKKz4gICBjYXQKKz4gZmkgPCAiJHRtcC9zdWJzMS5hd2siID4gIiR0bXAvc3Vicy5hd2siIFwKKz4gICB8fCB7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY291bGQgbm90IHNldHVwIGNvbmZpZyBmaWxlcyBtYWNoaW5lcnkiID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogY291bGQgbm90IHNldHVwIGNvbmZpZyBmaWxlcyBtYWNoaW5lcnkiID4mMjt9Cis+ICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorPiBfQUNFT0YKKz4gCis+ICMgVlBBVEggbWF5IGNhdXNlIHRyb3VibGUgd2l0aCBzb21lIG1ha2VzLCBzbyB3ZSByZW1vdmUgJChzcmNkaXIpLAorPiAjICR7c3JjZGlyfSBhbmQgQHNyY2RpckAgZnJvbSBWUEFUSCBpZiBzcmNkaXIgaXMgIi4iLCBzdHJpcCBsZWFkaW5nIGFuZAorPiAjIHRyYWlsaW5nIGNvbG9ucyBhbmQgdGhlbiByZW1vdmUgdGhlIHdob2xlIGxpbmUgaWYgVlBBVEggYmVjb21lcyBlbXB0eQorPiAjIChhY3R1YWxseSB3ZSBsZWF2ZSBhbiBlbXB0eSBsaW5lIHRvIHByZXNlcnZlIGxpbmUgbnVtYmVycykuCis+IGlmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCis+ICAgYWNfdnBzdWI9Jy9eWwkgXSpWUEFUSFsJIF0qPS97Cis+IHMvOipcJChzcmNkaXIpOiovOi8KKz4gcy86Klwke3NyY2Rpcn06Ki86LworPiBzLzoqQHNyY2RpckA6Ki86LworPiBzL15cKFtePV0qPVsJIF0qXCk6Ki9cMS8KKz4gcy86KiQvLworPiBzL15bXj1dKj1bCSBdKiQvLworPiB9JworPiBmaQorPiAKKz4gY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorPiBmaSAjIHRlc3QgLW4gIiRDT05GSUdfRklMRVMiCis+IAorPiAjIFNldCB1cCB0aGUgc2NyaXB0cyBmb3IgQ09ORklHX0hFQURFUlMgc2VjdGlvbi4KKz4gIyBObyBuZWVkIHRvIGdlbmVyYXRlIHRoZW0gaWYgdGhlcmUgYXJlIG5vIENPTkZJR19IRUFERVJTLgorPiAjIFRoaXMgaGFwcGVucyBmb3IgaW5zdGFuY2Ugd2l0aCBgLi9jb25maWcuc3RhdHVzIE1ha2VmaWxlJy4KKz4gaWYgdGVzdCAtbiAiJENPTkZJR19IRUFERVJTIjsgdGhlbgorPiBjYXQgPiIkdG1wL2RlZmluZXMuYXdrIiA8PFxfQUNBV0sgfHwKKz4gQkVHSU4geworPiBfQUNFT0YKKz4gCis+ICMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBhbiBhd2sgc2NyaXB0IGBkZWZpbmVzLmF3aycsIGVtYmVkZGVkIGFzCis+ICMgaGVyZS1kb2N1bWVudCBpbiBjb25maWcuc3RhdHVzLCB0aGF0IHN1YnN0aXR1dGVzIHRoZSBwcm9wZXIgdmFsdWVzIGludG8KKz4gIyBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLgorPiAKKz4gIyBDcmVhdGUgYSBkZWxpbWl0ZXIgc3RyaW5nIHRoYXQgZG9lcyBub3QgZXhpc3QgaW4gY29uZmRlZnMuaCwgdG8gZWFzZQorPiAjIGhhbmRsaW5nIG9mIGxvbmcgbGluZXMuCis+IGFjX2RlbGltPSclIV8hIyAnCis+IGZvciBhY19sYXN0X3RyeSBpbiBmYWxzZSBmYWxzZSA6OyBkbworPiAgIGFjX3Q9YHNlZCAtbiAiLyRhY19kZWxpbS9wIiBjb25mZGVmcy5oYAorPiAgIGlmIHRlc3QgLXogIiRhY190IjsgdGhlbgorPiAgICAgYnJlYWsKKz4gICBlbGlmICRhY19sYXN0X3RyeTsgdGhlbgorPiAgICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNvdWxkIG5vdCBtYWtlICRDT05GSUdfSEVBREVSUyIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBjb3VsZCBub3QgbWFrZSAkQ09ORklHX0hFQURFUlMiID4mMjt9Cis+ICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorNDYxOCw0NjIyYzEwMDc4LDEwNDUxCis8ICAgICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KKzwgICAgICAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKKzwgICAgICAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCis8ICAgICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCis8ICAgICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCistLS0KKz4gICAgIGFjX2RlbGltPSIkYWNfZGVsaW0hJGFjX2RlbGltIF8kYWNfZGVsaW0hISAiCis+ICAgZmkKKz4gZG9uZQorPiAKKz4gIyBGb3IgdGhlIGF3ayBzY3JpcHQsIEQgaXMgYW4gYXJyYXkgb2YgbWFjcm8gdmFsdWVzIGtleWVkIGJ5IG5hbWUsCis+ICMgbGlrZXdpc2UgUCBjb250YWlucyBtYWNybyBwYXJhbWV0ZXJzIGlmIGFueS4gIFByZXNlcnZlIGJhY2tzbGFzaAorPiAjIG5ld2xpbmUgc2VxdWVuY2VzLgorPiAKKz4gYWNfd29yZF9yZT1bXyRhc19jcl9MZXR0ZXJzXVtfJGFzX2NyX2FsbnVtXSoKKz4gc2VkIC1uICcKKz4gcy8uXHsxNDhcfS8mJyIkYWNfZGVsaW0iJy9nCis+IHQgcnNldAorPiA6cnNldAorPiBzL15bCSBdKiNbCSBdKmRlZmluZVsJIF1bCSBdKi8gLworPiB0IGRlZgorPiBkCis+IDpkZWYKKz4gcy9cXCQvLworPiB0IGJzbmwKKz4gcy9bIlxcXS9cXCYvZworPiBzL14gXCgnIiRhY193b3JkX3JlIidcKVwoKFteKCldKilcKVsJIF0qXCguKlwpL1BbIlwxIl09IlwyIlwKKz4gRFsiXDEiXT0iIFwzIi9wCis+IHMvXiBcKCciJGFjX3dvcmRfcmUiJ1wpWwkgXSpcKC4qXCkvRFsiXDEiXT0iIFwyIi9wCis+IGQKKz4gOmJzbmwKKz4gcy9bIlxcXS9cXCYvZworPiBzL14gXCgnIiRhY193b3JkX3JlIidcKVwoKFteKCldKilcKVsJIF0qXCguKlwpL1BbIlwxIl09IlwyIlwKKz4gRFsiXDEiXT0iIFwzXFxcXFxcbiJcXC9wCis+IHQgY29udAorPiBzL14gXCgnIiRhY193b3JkX3JlIidcKVsJIF0qXCguKlwpL0RbIlwxIl09IiBcMlxcXFxcXG4iXFwvcAorPiB0IGNvbnQKKz4gZAorPiA6Y29udAorPiBuCis+IHMvLlx7MTQ4XH0vJiciJGFjX2RlbGltIicvZworPiB0IGNsZWFyCis+IDpjbGVhcgorPiBzL1xcJC8vCis+IHQgYnNubGMKKz4gcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvIi9wCis+IGQKKz4gOmJzbmxjCis+IHMvWyJcXF0vXFwmL2c7IHMvXi8iLzsgcy8kL1xcXFxcXG4iXFwvcAorPiBiIGNvbnQKKz4gJyA8Y29uZmRlZnMuaCB8IHNlZCAnCis+IHMvJyIkYWNfZGVsaW0iJy8iXFxcCis+ICIvZycgPj4kQ09ORklHX1NUQVRVUyB8fCBhY193cml0ZV9mYWlsPTEKKz4gCis+IGNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorPiAgIGZvciAoa2V5IGluIEQpIERfaXNfc2V0W2tleV0gPSAxCis+ICAgRlMgPSAiByIKKz4gfQorPiAvXltcdCBdKiNbXHQgXSooZGVmaW5lfHVuZGVmKVtcdCBdKyRhY193b3JkX3JlKFtcdCAoXXxcJCkvIHsKKz4gICBsaW5lID0gXCQgMAorPiAgIHNwbGl0KGxpbmUsIGFyZywgIiAiKQorPiAgIGlmIChhcmdbMV0gPT0gIiMiKSB7Cis+ICAgICBkZWZ1bmRlZiA9IGFyZ1syXQorPiAgICAgbWFjMSA9IGFyZ1szXQorPiAgIH0gZWxzZSB7Cis+ICAgICBkZWZ1bmRlZiA9IHN1YnN0cihhcmdbMV0sIDIpCis+ICAgICBtYWMxID0gYXJnWzJdCis+ICAgfQorPiAgIHNwbGl0KG1hYzEsIG1hYzIsICIoIikgIykKKz4gICBtYWNybyA9IG1hYzJbMV0KKz4gICBwcmVmaXggPSBzdWJzdHIobGluZSwgMSwgaW5kZXgobGluZSwgZGVmdW5kZWYpIC0gMSkKKz4gICBpZiAoRF9pc19zZXRbbWFjcm9dKSB7Cis+ICAgICAjIFByZXNlcnZlIHRoZSB3aGl0ZSBzcGFjZSBzdXJyb3VuZGluZyB0aGUgIiMiLgorPiAgICAgcHJpbnQgcHJlZml4ICJkZWZpbmUiLCBtYWNybyBQW21hY3JvXSBEW21hY3JvXQorPiAgICAgbmV4dAorPiAgIH0gZWxzZSB7Cis+ICAgICAjIFJlcGxhY2UgI3VuZGVmIHdpdGggY29tbWVudHMuICBUaGlzIGlzIG5lY2Vzc2FyeSwgZm9yIGV4YW1wbGUsCis+ICAgICAjIGluIHRoZSBjYXNlIG9mIF9QT1NJWF9TT1VSQ0UsIHdoaWNoIGlzIHByZWRlZmluZWQgYW5kIHJlcXVpcmVkCis+ICAgICAjIG9uIHNvbWUgc3lzdGVtcyB3aGVyZSBjb25maWd1cmUgd2lsbCBub3QgZGVjaWRlIHRvIGRlZmluZSBpdC4KKz4gICAgIGlmIChkZWZ1bmRlZiA9PSAidW5kZWYiKSB7Cis+ICAgICAgIHByaW50ICIvKiIsIHByZWZpeCBkZWZ1bmRlZiwgbWFjcm8sICIqLyIKKz4gICAgICAgbmV4dAorPiAgICAgfQorPiAgIH0KKz4gfQorPiB7IHByaW50IH0KKz4gX0FDQVdLCis+IF9BQ0VPRgorPiBjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCis+ICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNvdWxkIG5vdCBzZXR1cCBjb25maWcgaGVhZGVycyBtYWNoaW5lcnkiID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogY291bGQgbm90IHNldHVwIGNvbmZpZyBoZWFkZXJzIG1hY2hpbmVyeSIgPiYyO30KKz4gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Cis+IGZpICMgdGVzdCAtbiAiJENPTkZJR19IRUFERVJTIgorPiAKKz4gCis+IGV2YWwgc2V0IFggIiAgOkYgJENPTkZJR19GSUxFUyAgOkggJENPTkZJR19IRUFERVJTICAgICIKKz4gc2hpZnQKKz4gZm9yIGFjX3RhZworPiBkbworPiAgIGNhc2UgJGFjX3RhZyBpbgorPiAgIDpbRkhMQ10pIGFjX21vZGU9JGFjX3RhZzsgY29udGludWU7OworPiAgIGVzYWMKKz4gICBjYXNlICRhY19tb2RlJGFjX3RhZyBpbgorPiAgIDpbRkhMXSo6Kik7OworPiAgIDpMKiB8IDpDKjoqKSB7IHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogaW52YWxpZCB0YWcgJGFjX3RhZyIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIHRhZyAkYWNfdGFnIiA+JjI7fQorPiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07OworPiAgIDpbRkhdLSkgYWNfdGFnPS06LTs7Cis+ICAgOltGSF0qKSBhY190YWc9JGFjX3RhZzokYWNfdGFnLmluOzsKKz4gICBlc2FjCis+ICAgYWNfc2F2ZV9JRlM9JElGUworPiAgIElGUz06Cis+ICAgc2V0IHggJGFjX3RhZworPiAgIElGUz0kYWNfc2F2ZV9JRlMKKz4gICBzaGlmdAorPiAgIGFjX2ZpbGU9JDEKKz4gICBzaGlmdAorPiAKKz4gICBjYXNlICRhY19tb2RlIGluCis+ICAgOkwpIGFjX3NvdXJjZT0kMTs7Cis+ICAgOltGSF0pCis+ICAgICBhY19maWxlX2lucHV0cz0KKz4gICAgIGZvciBhY19mCis+ICAgICBkbworPiAgICAgICBjYXNlICRhY19mIGluCis+ICAgICAgIC0pIGFjX2Y9IiR0bXAvc3RkaW4iOzsKKz4gICAgICAgKikgIyBMb29rIGZvciB0aGUgZmlsZSBmaXJzdCBpbiB0aGUgYnVpbGQgdHJlZSwgdGhlbiBpbiB0aGUgc291cmNlIHRyZWUKKz4gCSAjIChpZiB0aGUgcGF0aCBpcyBub3QgYWJzb2x1dGUpLiAgVGhlIGFic29sdXRlIHBhdGggY2Fubm90IGJlIERPUy1zdHlsZSwKKz4gCSAjIGJlY2F1c2UgJGFjX2YgY2Fubm90IGNvbnRhaW4gYDonLgorPiAJIHRlc3QgLWYgIiRhY19mIiB8fAorPiAJICAgY2FzZSAkYWNfZiBpbgorPiAJICAgW1xcLyRdKikgZmFsc2U7OworPiAJICAgKikgdGVzdCAtZiAiJHNyY2Rpci8kYWNfZiIgJiYgYWNfZj0iJHNyY2Rpci8kYWNfZiI7OworPiAJICAgZXNhYyB8fAorPiAJICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBmaW5kIGlucHV0IGZpbGU6ICRhY19mIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBmaW5kIGlucHV0IGZpbGU6ICRhY19mIiA+JjI7fQorPiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07OworPiAgICAgICBlc2FjCis+ICAgICAgIGNhc2UgJGFjX2YgaW4gKlwnKikgYWNfZj1gJGFzX2VjaG8gIiRhY19mIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYDs7IGVzYWMKKz4gICAgICAgYWNfZmlsZV9pbnB1dHM9IiRhY19maWxlX2lucHV0cyAnJGFjX2YnIgorPiAgICAgZG9uZQorPiAKKz4gICAgICMgTGV0J3Mgc3RpbGwgcHJldGVuZCBpdCBpcyBgY29uZmlndXJlJyB3aGljaCBpbnN0YW50aWF0ZXMgKGkuZS4sIGRvbid0Cis+ICAgICAjIHVzZSAkYXNfbWUpLCBwZW9wbGUgd291bGQgYmUgc3VycHJpc2VkIHRvIHJlYWQ6Cis+ICAgICAjICAgIC8qIGNvbmZpZy5oLiAgR2VuZXJhdGVkIGJ5IGNvbmZpZy5zdGF0dXMuICAqLworPiAgICAgY29uZmlndXJlX2lucHV0PSdHZW5lcmF0ZWQgZnJvbSAnYAorPiAJICAkYXNfZWNobyAiJCoiIHwgc2VkICdzfF5bXjpdKi98fDtzfDpbXjpdKi98LCB8ZycKKz4gCWAnIGJ5IGNvbmZpZ3VyZS4nCis+ICAgICBpZiB0ZXN0IHgiJGFjX2ZpbGUiICE9IHgtOyB0aGVuCis+ICAgICAgIGNvbmZpZ3VyZV9pbnB1dD0iJGFjX2ZpbGUuICAkY29uZmlndXJlX2lucHV0IgorPiAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogY3JlYXRpbmcgJGFjX2ZpbGUiID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBjcmVhdGluZyAkYWNfZmlsZSIgPiY2O30KKz4gICAgIGZpCis+ICAgICAjIE5ldXRyYWxpemUgc3BlY2lhbCBjaGFyYWN0ZXJzIGludGVycHJldGVkIGJ5IHNlZCBpbiByZXBsYWNlbWVudCBzdHJpbmdzLgorPiAgICAgY2FzZSAkY29uZmlndXJlX2lucHV0IGluICMoCis+ICAgICAqXCYqIHwgKlx8KiB8ICpcXCogKQorPiAgICAgICAgYWNfc2VkX2NvbmZfaW5wdXQ9YCRhc19lY2hvICIkY29uZmlndXJlX2lucHV0IiB8Cis+ICAgICAgICBzZWQgJ3MvW1xcXFwmfF0vXFxcXCYvZydgOzsgIygKKz4gICAgICopIGFjX3NlZF9jb25mX2lucHV0PSRjb25maWd1cmVfaW5wdXQ7OworPiAgICAgZXNhYworPiAKKz4gICAgIGNhc2UgJGFjX3RhZyBpbgorPiAgICAgKjotOiogfCAqOi0pIGNhdCA+IiR0bXAvc3RkaW4iIFwKKz4gICAgICAgfHwgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogY291bGQgbm90IGNyZWF0ZSAkYWNfZmlsZSIgPiYyO30KKz4gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9IDs7Cis+ICAgICBlc2FjCis+ICAgICA7OworPiAgIGVzYWMKKz4gCis+ICAgYWNfZGlyPWAkYXNfZGlybmFtZSAtLSAiJGFjX2ZpbGUiIHx8Cis+ICRhc19leHByIFgiJGFjX2ZpbGUiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCis+IAkgWCIkYWNfZmlsZSIgOiAnWFwoLy9cKVteL10nIFx8IFwKKz4gCSBYIiRhY19maWxlIiA6ICdYXCgvL1wpJCcgXHwgXAorPiAJIFgiJGFjX2ZpbGUiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorPiAkYXNfZWNobyBYIiRhY19maWxlIiB8Cis+ICAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveworPiAJICAgIHMvL1wxLworPiAJICAgIHEKKz4gCSAgfQorPiAJICAvXlhcKFwvXC9cKVteL10uKi97Cis+IAkgICAgcy8vXDEvCis+IAkgICAgcQorPiAJICB9Cis+IAkgIC9eWFwoXC9cL1wpJC97Cis+IAkgICAgcy8vXDEvCis+IAkgICAgcQorPiAJICB9Cis+IAkgIC9eWFwoXC9cKS4qL3sKKz4gCSAgICBzLy9cMS8KKz4gCSAgICBxCis+IAkgIH0KKz4gCSAgcy8uKi8uLzsgcSdgCis+ICAgeyBhc19kaXI9IiRhY19kaXIiCis+ICAgY2FzZSAkYXNfZGlyIGluICMoCis+ICAgLSopIGFzX2Rpcj0uLyRhc19kaXI7OworPiAgIGVzYWMKKz4gICB0ZXN0IC1kICIkYXNfZGlyIiB8fCB7ICRhc19ta2Rpcl9wICYmIG1rZGlyIC1wICIkYXNfZGlyIjsgfSB8fCB7Cis+ICAgICBhc19kaXJzPQorPiAgICAgd2hpbGUgOjsgZG8KKz4gICAgICAgY2FzZSAkYXNfZGlyIGluICMoCis+ICAgICAgICpcJyopIGFzX3FkaXI9YCRhc19lY2hvICIkYXNfZGlyIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYDs7ICMnKAorPiAgICAgICAqKSBhc19xZGlyPSRhc19kaXI7OworPiAgICAgICBlc2FjCis+ICAgICAgIGFzX2RpcnM9IickYXNfcWRpcicgJGFzX2RpcnMiCis+ICAgICAgIGFzX2Rpcj1gJGFzX2Rpcm5hbWUgLS0gIiRhc19kaXIiIHx8Cis+ICRhc19leHByIFgiJGFzX2RpciIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKKz4gCSBYIiRhc19kaXIiIDogJ1hcKC8vXClbXi9dJyBcfCBcCis+IAkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpJCcgXHwgXAorPiAJIFgiJGFzX2RpciIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8Cis+ICRhc19lY2hvIFgiJGFzX2RpciIgfAorPiAgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKKz4gCSAgICBzLy9cMS8KKz4gCSAgICBxCis+IAkgIH0KKz4gCSAgL15YXChcL1wvXClbXi9dLioveworPiAJICAgIHMvL1wxLworPiAJICAgIHEKKz4gCSAgfQorPiAJICAvXlhcKFwvXC9cKSQveworPiAJICAgIHMvL1wxLworPiAJICAgIHEKKz4gCSAgfQorPiAJICAvXlhcKFwvXCkuKi97Cis+IAkgICAgcy8vXDEvCis+IAkgICAgcQorPiAJICB9Cis+IAkgIHMvLiovLi87IHEnYAorPiAgICAgICB0ZXN0IC1kICIkYXNfZGlyIiAmJiBicmVhaworPiAgICAgZG9uZQorPiAgICAgdGVzdCAteiAiJGFzX2RpcnMiIHx8IGV2YWwgIm1rZGlyICRhc19kaXJzIgorPiAgIH0gfHwgdGVzdCAtZCAiJGFzX2RpciIgfHwgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5ICRhc19kaXIiID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgJGFzX2RpciIgPiYyO30KKz4gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OyB9Cis+ICAgYWNfYnVpbGRkaXI9LgorPiAKKz4gY2FzZSAiJGFjX2RpciIgaW4KKz4gLikgYWNfZGlyX3N1ZmZpeD0gYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7Cis+ICopCis+ICAgYWNfZGlyX3N1ZmZpeD0vYCRhc19lY2hvICIkYWNfZGlyIiB8IHNlZCAnc3xeXC5bXFwvXXx8J2AKKz4gICAjIEEgIi4uIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCis+ICAgYWNfdG9wX2J1aWxkZGlyX3N1Yj1gJGFzX2VjaG8gIiRhY19kaXJfc3VmZml4IiB8IHNlZCAnc3wvW15cXC9dKnwvLi58ZztzfC98fCdgCis+ICAgY2FzZSAkYWNfdG9wX2J1aWxkZGlyX3N1YiBpbgorPiAgICIiKSBhY190b3BfYnVpbGRkaXJfc3ViPS4gYWNfdG9wX2J1aWxkX3ByZWZpeD0gOzsKKz4gICAqKSAgYWNfdG9wX2J1aWxkX3ByZWZpeD0kYWNfdG9wX2J1aWxkZGlyX3N1Yi8gOzsKKz4gICBlc2FjIDs7Cis+IGVzYWMKKz4gYWNfYWJzX3RvcF9idWlsZGRpcj0kYWNfcHdkCis+IGFjX2Fic19idWlsZGRpcj0kYWNfcHdkJGFjX2Rpcl9zdWZmaXgKKz4gIyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eToKKz4gYWNfdG9wX2J1aWxkZGlyPSRhY190b3BfYnVpbGRfcHJlZml4Cis+IAorPiBjYXNlICRzcmNkaXIgaW4KKz4gICAuKSAgIyBXZSBhcmUgYnVpbGRpbmcgaW4gcGxhY2UuCis+ICAgICBhY19zcmNkaXI9LgorPiAgICAgYWNfdG9wX3NyY2Rpcj0kYWNfdG9wX2J1aWxkZGlyX3N1YgorPiAgICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZCA7OworPiAgIFtcXC9dKiB8ID86W1xcL10qICkgICMgQWJzb2x1dGUgbmFtZS4KKz4gICAgIGFjX3NyY2Rpcj0kc3JjZGlyJGFjX2Rpcl9zdWZmaXg7Cis+ICAgICBhY190b3Bfc3JjZGlyPSRzcmNkaXIKKz4gICAgIGFjX2Fic190b3Bfc3JjZGlyPSRzcmNkaXIgOzsKKz4gICAqKSAjIFJlbGF0aXZlIG5hbWUuCis+ICAgICBhY19zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyJGFjX2Rpcl9zdWZmaXgKKz4gICAgIGFjX3RvcF9zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyCis+ICAgICBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfcHdkLyRzcmNkaXIgOzsKKz4gZXNhYworPiBhY19hYnNfc3JjZGlyPSRhY19hYnNfdG9wX3NyY2RpciRhY19kaXJfc3VmZml4Cis+IAorPiAKKz4gICBjYXNlICRhY19tb2RlIGluCis+ICAgOkYpCis+ICAgIworPiAgICMgQ09ORklHX0ZJTEUKKz4gICAjCis+IAorPiAgIGNhc2UgJElOU1RBTEwgaW4KKz4gICBbXFwvJF0qIHwgPzpbXFwvXSogKSBhY19JTlNUQUxMPSRJTlNUQUxMIDs7Cis+ICAgKikgYWNfSU5TVEFMTD0kYWNfdG9wX2J1aWxkX3ByZWZpeCRJTlNUQUxMIDs7Cis+ICAgZXNhYworPiBfQUNFT0YKKz4gCis+IGNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKz4gIyBJZiB0aGUgdGVtcGxhdGUgZG9lcyBub3Qga25vdyBhYm91dCBkYXRhcm9vdGRpciwgZXhwYW5kIGl0LgorPiAjIEZJWE1FOiBUaGlzIGhhY2sgc2hvdWxkIGJlIHJlbW92ZWQgYSBmZXcgeWVhcnMgYWZ0ZXIgMi42MC4KKz4gYWNfZGF0YXJvb3RkaXJfaGFjaz07IGFjX2RhdGFyb290ZGlyX3NlZW49Cis+IAorPiBhY19zZWRfZGF0YXJvb3Q9JworPiAvZGF0YXJvb3RkaXIvIHsKKz4gICBwCis+ICAgcQorPiB9Cis+IC9AZGF0YWRpckAvcAorPiAvQGRvY2RpckAvcAorPiAvQGluZm9kaXJAL3AKKz4gL0Bsb2NhbGVkaXJAL3AKKz4gL0BtYW5kaXJAL3AKKz4gJworPiBjYXNlIGBldmFsICJzZWQgLW4gXCJcJGFjX3NlZF9kYXRhcm9vdFwiICRhY19maWxlX2lucHV0cyJgIGluCis+ICpkYXRhcm9vdGRpciopIGFjX2RhdGFyb290ZGlyX3NlZW49eWVzOzsKKz4gKkBkYXRhZGlyQCp8KkBkb2NkaXJAKnwqQGluZm9kaXJAKnwqQGxvY2FsZWRpckAqfCpAbWFuZGlyQCopCis+ICAgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19maWxlX2lucHV0cyBzZWVtcyB0byBpZ25vcmUgdGhlIC0tZGF0YXJvb3RkaXIgc2V0dGluZyIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19maWxlX2lucHV0cyBzZWVtcyB0byBpZ25vcmUgdGhlIC0tZGF0YXJvb3RkaXIgc2V0dGluZyIgPiYyO30KKz4gX0FDRU9GCis+IGNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorPiAgIGFjX2RhdGFyb290ZGlyX2hhY2s9JworPiAgIHMmQGRhdGFkaXJAJiRkYXRhZGlyJmcKKz4gICBzJkBkb2NkaXJAJiRkb2NkaXImZworPiAgIHMmQGluZm9kaXJAJiRpbmZvZGlyJmcKKz4gICBzJkBsb2NhbGVkaXJAJiRsb2NhbGVkaXImZworPiAgIHMmQG1hbmRpckAmJG1hbmRpciZnCis+ICAgICBzJlxcXCR7ZGF0YXJvb3RkaXJ9JiRkYXRhcm9vdGRpciZnJyA7OworPiBlc2FjCis+IF9BQ0VPRgorPiAKKz4gIyBOZXV0cmFsaXplIFZQQVRIIHdoZW4gYCRzcmNkaXInID0gYC4nLgorPiAjIFNoZWxsIGNvZGUgaW4gY29uZmlndXJlLmFjIG1pZ2h0IHNldCBleHRyYXN1Yi4KKz4gIyBGSVhNRTogZG8gd2UgcmVhbGx5IHdhbnQgdG8gbWFpbnRhaW4gdGhpcyBmZWF0dXJlPworPiBjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKKz4gYWNfc2VkX2V4dHJhPSIkYWNfdnBzdWIKKz4gJGV4dHJhc3ViCis+IF9BQ0VPRgorPiBjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCis+IDp0Cis+IC9AW2EtekEtWl9dW2EtekEtWl8wLTldKkAvIWIKKz4gc3xAY29uZmlndXJlX2lucHV0QHwkYWNfc2VkX2NvbmZfaW5wdXR8O3QgdAorPiBzJkB0b3BfYnVpbGRkaXJAJiRhY190b3BfYnVpbGRkaXJfc3ViJjt0IHQKKz4gcyZAdG9wX2J1aWxkX3ByZWZpeEAmJGFjX3RvcF9idWlsZF9wcmVmaXgmO3QgdAorPiBzJkBzcmNkaXJAJiRhY19zcmNkaXImO3QgdAorPiBzJkBhYnNfc3JjZGlyQCYkYWNfYWJzX3NyY2RpciY7dCB0Cis+IHMmQHRvcF9zcmNkaXJAJiRhY190b3Bfc3JjZGlyJjt0IHQKKz4gcyZAYWJzX3RvcF9zcmNkaXJAJiRhY19hYnNfdG9wX3NyY2RpciY7dCB0Cis+IHMmQGJ1aWxkZGlyQCYkYWNfYnVpbGRkaXImO3QgdAorPiBzJkBhYnNfYnVpbGRkaXJAJiRhY19hYnNfYnVpbGRkaXImO3QgdAorPiBzJkBhYnNfdG9wX2J1aWxkZGlyQCYkYWNfYWJzX3RvcF9idWlsZGRpciY7dCB0Cis+IHMmQElOU1RBTExAJiRhY19JTlNUQUxMJjt0IHQKKz4gJGFjX2RhdGFyb290ZGlyX2hhY2sKKz4gIgorPiBldmFsIHNlZCBcIlwkYWNfc2VkX2V4dHJhXCIgIiRhY19maWxlX2lucHV0cyIgfCAkQVdLIC1mICIkdG1wL3N1YnMuYXdrIiA+JHRtcC9vdXQgXAorPiAgIHx8IHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjb3VsZCBub3QgY3JlYXRlICRhY19maWxlIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiID4mMjt9Cis+ICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorPiAKKz4gdGVzdCAteiAiJGFjX2RhdGFyb290ZGlyX2hhY2skYWNfZGF0YXJvb3RkaXJfc2VlbiIgJiYKKz4gICB7IGFjX291dD1gc2VkIC1uICcvXCR7ZGF0YXJvb3RkaXJ9L3AnICIkdG1wL291dCJgOyB0ZXN0IC1uICIkYWNfb3V0IjsgfSAmJgorPiAgIHsgYWNfb3V0PWBzZWQgLW4gJy9eWwkgXSpkYXRhcm9vdGRpclsJIF0qOio9L3AnICIkdG1wL291dCJgOyB0ZXN0IC16ICIkYWNfb3V0IjsgfSAmJgorPiAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfZmlsZSBjb250YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgdmFyaWFibGUgXGBkYXRhcm9vdGRpcicKKz4gd2hpY2ggc2VlbXMgdG8gYmUgdW5kZWZpbmVkLiAgUGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBkZWZpbmVkLiIgPiY1Cis+ICRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19maWxlIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSB2YXJpYWJsZSBcYGRhdGFyb290ZGlyJworPiB3aGljaCBzZWVtcyB0byBiZSB1bmRlZmluZWQuICBQbGVhc2UgbWFrZSBzdXJlIGl0IGlzIGRlZmluZWQuIiA+JjI7fQorPiAKKz4gICBybSAtZiAiJHRtcC9zdGRpbiIKKz4gICBjYXNlICRhY19maWxlIGluCis+ICAgLSkgY2F0ICIkdG1wL291dCIgJiYgcm0gLWYgIiR0bXAvb3V0Ijs7Cis+ICAgKikgcm0gLWYgIiRhY19maWxlIiAmJiBtdiAiJHRtcC9vdXQiICIkYWNfZmlsZSI7OworPiAgIGVzYWMgXAorPiAgIHx8IHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjb3VsZCBub3QgY3JlYXRlICRhY19maWxlIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiID4mMjt9Cis+ICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorPiAgOzsKKz4gICA6SCkKKz4gICAjCis+ICAgIyBDT05GSUdfSEVBREVSCis+ICAgIworPiAgIGlmIHRlc3QgeCIkYWNfZmlsZSIgIT0geC07IHRoZW4KKz4gICAgIHsKKz4gICAgICAgJGFzX2VjaG8gIi8qICRjb25maWd1cmVfaW5wdXQgICovIiBcCis+ICAgICAgICYmIGV2YWwgJyRBV0sgLWYgIiR0bXAvZGVmaW5lcy5hd2siJyAiJGFjX2ZpbGVfaW5wdXRzIgorPiAgICAgfSA+IiR0bXAvY29uZmlnLmgiIFwKKz4gICAgICAgfHwgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogY291bGQgbm90IGNyZWF0ZSAkYWNfZmlsZSIgPiYyO30KKz4gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Cis+ICAgICBpZiBkaWZmICIkYWNfZmlsZSIgIiR0bXAvY29uZmlnLmgiID4vZGV2L251bGwgMj4mMTsgdGhlbgorPiAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIiA+JjY7fQorPiAgICAgZWxzZQorPiAgICAgICBybSAtZiAiJGFjX2ZpbGUiCis+ICAgICAgIG12ICIkdG1wL2NvbmZpZy5oIiAiJGFjX2ZpbGUiIFwKKz4gCXx8IHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjb3VsZCBub3QgY3JlYXRlICRhY19maWxlIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiID4mMjt9Cis+ICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQorNDYyNCw0NjI1YzEwNDUzLDEwNDU4Cis8ICAgICBybSAtZiAkYWNfZmlsZQorPCAgICAgbXYgY29uZnRlc3QuaCAkYWNfZmlsZQorLS0tCis+ICAgZWxzZQorPiAgICAgJGFzX2VjaG8gIi8qICRjb25maWd1cmVfaW5wdXQgICovIiBcCis+ICAgICAgICYmIGV2YWwgJyRBV0sgLWYgIiR0bXAvZGVmaW5lcy5hd2siJyAiJGFjX2ZpbGVfaW5wdXRzIiBcCis+ICAgICAgIHx8IHsgeyAkYXNfZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjb3VsZCBub3QgY3JlYXRlIC0iID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogY291bGQgbm90IGNyZWF0ZSAtIiA+JjI7fQorPiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KKzQ2MjdjMTA0NjAsMTA0NjEKKzwgZmk7IGRvbmUKKy0tLQorPiAgOzsKKz4gCis0NjI5LDQ2MzBjMTA0NjMsMTA0NjUKKzwgRU9GCis8IGNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgorLS0tCis+ICAgZXNhYworPiAKKz4gZG9uZSAjIGZvciBhY190YWcKKzQ2MzIsNDYzM2QxMDQ2NgorPCBFT0YKKzwgY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgorNDYzNSw0NjM2YzEwNDY4LDEwNDY5Cis8IGV4aXQgMAorPCBFT0YKKy0tLQorPiB7IChleGl0IDApOyBleGl0IDA7IH0KKz4gX0FDRU9GCis0NjM4LDQ2MzljMTA0NzEsMTA1MDIKKzwgcm0gLWZyIGNvbmZkZWZzKiAkYWNfY2xlYW5fZmlsZXMKKzwgdGVzdCAiJG5vX2NyZWF0ZSIgPSB5ZXMgfHwgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJENPTkZJR19TVEFUVVMgfHwgZXhpdCAxCistLS0KKz4gYWNfY2xlYW5fZmlsZXM9JGFjX2NsZWFuX2ZpbGVzX3NhdmUKKz4gCis+IHRlc3QgJGFjX3dyaXRlX2ZhaWwgPSAwIHx8Cis+ICAgeyB7ICRhc19lY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IHdyaXRlIGZhaWx1cmUgY3JlYXRpbmcgJENPTkZJR19TVEFUVVMiID4mNQorPiAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogd3JpdGUgZmFpbHVyZSBjcmVhdGluZyAkQ09ORklHX1NUQVRVUyIgPiYyO30KKz4gICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Cis+IAorPiAKKz4gIyBjb25maWd1cmUgaXMgd3JpdGluZyB0byBjb25maWcubG9nLCBhbmQgdGhlbiBjYWxscyBjb25maWcuc3RhdHVzLgorPiAjIGNvbmZpZy5zdGF0dXMgZG9lcyBpdHMgb3duIHJlZGlyZWN0aW9uLCBhcHBlbmRpbmcgdG8gY29uZmlnLmxvZy4KKz4gIyBVbmZvcnR1bmF0ZWx5LCBvbiBET1MgdGhpcyBmYWlscywgYXMgY29uZmlnLmxvZyBpcyBzdGlsbCBrZXB0IG9wZW4KKz4gIyBieSBjb25maWd1cmUsIHNvIGNvbmZpZy5zdGF0dXMgd29uJ3QgYmUgYWJsZSB0byB3cml0ZSB0byBpdDsgaXRzCis+ICMgb3V0cHV0IGlzIHNpbXBseSBkaXNjYXJkZWQuICBTbyB3ZSBleGVjIHRoZSBGRCB0byAvZGV2L251bGwsCis+ICMgZWZmZWN0aXZlbHkgY2xvc2luZyBjb25maWcubG9nLCBzbyBpdCBjYW4gYmUgcHJvcGVybHkgKHJlKW9wZW5lZCBhbmQKKz4gIyBhcHBlbmRlZCB0byBieSBjb25maWcuc3RhdHVzLiAgV2hlbiBjb21pbmcgYmFjayB0byBjb25maWd1cmUsIHdlCis+ICMgbmVlZCB0byBtYWtlIHRoZSBGRCBhdmFpbGFibGUgYWdhaW4uCis+IGlmIHRlc3QgIiRub19jcmVhdGUiICE9IHllczsgdGhlbgorPiAgIGFjX2NzX3N1Y2Nlc3M9OgorPiAgIGFjX2NvbmZpZ19zdGF0dXNfYXJncz0KKz4gICB0ZXN0ICIkc2lsZW50IiA9IHllcyAmJgorPiAgICAgYWNfY29uZmlnX3N0YXR1c19hcmdzPSIkYWNfY29uZmlnX3N0YXR1c19hcmdzIC0tcXVpZXQiCis+ICAgZXhlYyA1Pi9kZXYvbnVsbAorPiAgICRTSEVMTCAkQ09ORklHX1NUQVRVUyAkYWNfY29uZmlnX3N0YXR1c19hcmdzIHx8IGFjX2NzX3N1Y2Nlc3M9ZmFsc2UKKz4gICBleGVjIDU+PmNvbmZpZy5sb2cKKz4gICAjIFVzZSB8fCwgbm90ICYmLCB0byBhdm9pZCBleGl0aW5nIGZyb20gdGhlIGlmIHdpdGggJD8gPSAxLCB3aGljaAorPiAgICMgd291bGQgbWFrZSBjb25maWd1cmUgZmFpbCBpZiB0aGlzIGlzIHRoZSBsYXN0IGluc3RydWN0aW9uLgorPiAgICRhY19jc19zdWNjZXNzIHx8IHsgKGV4aXQgMSk7IGV4aXQgMTsgfQorPiBmaQorPiBpZiB0ZXN0IC1uICIkYWNfdW5yZWNvZ25pemVkX29wdHMiICYmIHRlc3QgIiRlbmFibGVfb3B0aW9uX2NoZWNraW5nIiAhPSBubzsgdGhlbgorPiAgIHsgJGFzX2VjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiB1bnJlY29nbml6ZWQgb3B0aW9uczogJGFjX3VucmVjb2duaXplZF9vcHRzIiA+JjUKKz4gJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdW5yZWNvZ25pemVkIG9wdGlvbnM6ICRhY191bnJlY29nbml6ZWRfb3B0cyIgPiYyO30KKz4gZmkKZGlmZiAtLWdpdCBhL211bHRpL2MvcGF0Y2gvM180XzEgYi9tdWx0aS9jL3BhdGNoLzNfNF8xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NmVkMmIKLS0tIC9kZXYvbnVsbAorKysgYi9tdWx0aS9jL3BhdGNoLzNfNF8xCkBAIC0wLDAgKzEsMTcgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgSUJNIENvcnAuIGFuZCBPdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKK09ubHkgaW4gM18wL2ljdS9zb3VyY2U6IGJpbgorT25seSBpbiAzXzAub3JpZy9pY3Uvc291cmNlOiBjb25mZGVmcy5oCitkaWZmIC1ydSAzXzAub3JpZy9pY3Uvc291cmNlL2NvbmZpZy9taC1kYXJ3aW4gM18wL2ljdS9zb3VyY2UvY29uZmlnL21oLWRhcndpbgorLS0tIDNfMC5vcmlnL2ljdS9zb3VyY2UvY29uZmlnL21oLWRhcndpbgkyMDA4LTEwLTIwIDE0OjU3OjUyLjAwMDAwMDAwMCAtMDcwMAorKysrIDNfMC9pY3Uvc291cmNlL2NvbmZpZy9taC1kYXJ3aW4JMjAwOC0xMC0yMCAxNTo1NzoyOC4wMDAwMDAwMDAgLTA3MDAKK0BAIC0xNSw2ICsxNSw4IEBACisgIyMgQ29tbWFuZHMgdG8gZ2VuZXJhdGUgZGVwZW5kZW5jeSBmaWxlcworIEdFTl9ERVBTLmM9CSQoQ0MpIC1FIC1NTUQgICQoREVGUykgJChDUFBGTEFHUykKKyBHRU5fREVQUy5jYz0JJChDWFgpIC1FIC1NTUQgICQoREVGUykgJChDUFBGTEFHUykKKytHRU5fREVQUy5jPQllY2hvCisrR0VOX0RFUFMuY2M9CWVjaG8KKyAKKyAjIyBDb21tYW5kcyB0byBjb21waWxlCisgQ09NUElMRS5jPQkkKENDKSAkKERFRlMpICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAtZm5vLWNvbW1vbiAtYworT25seSBpbiAzXzAub3JpZy9pY3Uvc291cmNlOiBjb25maWcuY2FjaGUKK09ubHkgaW4gM18wLm9yaWcvaWN1L3NvdXJjZTogY29uZmlnLmxvZwpkaWZmIC0tZ2l0IGEvbXVsdGkvYy9wYXRjaC9yZWFkbWUudHh0IGIvbXVsdGkvYy9wYXRjaC9yZWFkbWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlOTIzOTUKLS0tIC9kZXYvbnVsbAorKysgYi9tdWx0aS9jL3BhdGNoL3JlYWRtZS50eHQKQEAgLTAsMCArMSw1IEBACisjIS9iaW4vY2F0CisjIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycC4gYW5kIE90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZAorIworCitDb250YWlucyBJQ1U0QyBwYXRjaGVzIHRvIG1ha2Ugb2xkIHZlcnNpb25zIGJ1aWxkLgpkaWZmIC0tZ2l0IGEvbXVsdGkvYy9zdXBlcmNvbmYuc2ggYi9tdWx0aS9jL3N1cGVyY29uZi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iYzk0YjMwCi0tLSAvZGV2L251bGwKKysrIGIvbXVsdGkvYy9zdXBlcmNvbmYuc2gKQEAgLTAsMCArMSw2NiBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycC4gYW5kIE90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZAorIworIyBTYW1wbGUgInN1cGVyIGNvbmZpZ3VyZSIgCisjIHRoaXMgc2NyaXB0IGlzIHJlc3BvbnNpYmxlIGZvciBjb25maWd1cmluZyBJQ1UuCisKKyMgaW5wdXQgdmFyaWFibGVzOworIyAkSUNVX1ZFUiAgLSB0aGUgSUNVIHZlcnNpb24gaW4gdW5kZXJzY29yZSBmb3JtYXQgKDRfMl8wXzEpCisKK0lDVV9TUkM9IiQxIgorSUNVX1ZFUj0iJDIiCisKK1VfSE9TVD1gaG9zdG5hbWVgCitVX1NZUz1gdW5hbWUgfHwgZWNobyB1bmtub3duYAorI2VjaG8gJEhPU1QKKworZXhwb3J0IHJjcz1ub25lCisKK2Nhc2UgJFVfU1lTIGluCisJQUlYKQorCQkjIHRoZSBwcmVmZXJyZWQgJ0FJWCcgdHlwZSB0byB1c2UKKwkJQUlYPUFJWAorCQljYXNlICRJQ1VfVkVSIGluIAorCQk0KikKKwkJCSNBSVg9QUlYNC4zVkEKKwkJCUFJWD1BSVgKKwkJCTs7CisJCSopCisJCQlBSVg9QUlYNC4zVkEKKwkJCTs7CisJICAgICAgICAxKnwyKnwzXzAqfDNfMSopCisJCQlBSVg9QUlYNC4zeGxDCisJCQlQQVRIPS91c3IvdmFjcHAvYmluLzokUEFUSAorCQkJOzsKKwkJZXNhYworCQlyY3M9JHtBSVh9CisJCTs7CisJKikKKwkJcmNzPW5vbmUKKwkJOzsKK2VzYWMKKworCisKK2Nhc2UgJEhPU1QgaW4KKyAgICAgICAgc3lzOTgqKQorICAgICAgICAgICAgICAgIHJjcz0kQUlYCisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgaHAqKQorICAgICAgICAgICAgICAgIHJjcz0nSFAtVVgvQUNDJworICAgICAgICAgICAgICAgIDs7CisgICAgICAgIG1lcmlsbCp8cmVkaGF0KnxzdW5saWdodCopCisgICAgICAgICAgICAgICAgcmNzPSdMaW51eFJlZEhhdCcKKyAgICAgICAgICAgICAgICA7OworICAgICAgICAqKQorCQllY2hvIHNoICR7SUNVX1NSQ30vY29uZmlndXJlCisgICAgICAgICAgICAgICAgI2VjaG8gVW5rbm93biBob3N0ICRIT1NULCBlZGl0ICQwCisgICAgICAgICAgICAgICAgZXhpdCAwCisgICAgICAgICAgICAgICAgOzsKK2VzYWMKKworZWNobyBzaCAke0lDVV9TUkN9L3J1bkNvbmZpZ3VyZUlDVSAiJHtyY3N9IgorCisKKworCmRpZmYgLS1naXQgYS9tdWx0aS9jb21tb24vTWFrZWZpbGUtbXVsdGkuaW5jIGIvbXVsdGkvY29tbW9uL01ha2VmaWxlLW11bHRpLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzNjMTY1Ci0tLSAvZGV2L251bGwKKysrIGIvbXVsdGkvY29tbW9uL01ha2VmaWxlLW11bHRpLmluYwpAQCAtMCwwICsxLDIyIEBACisjIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IElCTSBDb3JwLiBhbmQgT3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkCisKK0NfUk9PVD0kKE1VTFRJQ1VfUk9PVCkvYworSl9ST09UPSQoTVVMVElDVV9ST09UKS9qCitNX1RNUD0kKE1VTFRJQ1VfUk9PVCkvdG1wCitDX0lOUz0kKE1fVE1QKS9pbnMKK0NfQkxEPSQoTV9UTVApL2J1aWxkCitDX1NSQz0kKE1fVE1QKS9zcmMKKworIyBDIGRlZnMKK1NfSU5TPWluY2x1ZGUvdW5pY29kZS91dHlwZXMuaAorU19TUkNESVI9aWN1L3NvdXJjZQorU19CTEQ9JChTX1NSQ0RJUikvY29uZmlnLnN0YXR1cworU19TUkM9JChTX1NSQ0RJUikvY29uZmlndXJlCisKKy1pbmNsdWRlICQoTVVMVElDVV9ST09UKS9jb21tb24vTWFrZWZpbGUtbG9jYWwuaW5jCisKK0lDVVM9JChNVUxUSUNVX1JPT1QpL3BhY2thZ2VzCisKK1RPUD0kKHNoZWxsIHB3ZCkKKworIyBKIGRlZnMKZGlmZiAtLWdpdCBhL211bHRpL2ovTWFrZWZpbGUtai5pbmMgYi9tdWx0aS9qL01ha2VmaWxlLWouaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMDdhOTcKLS0tIC9kZXYvbnVsbAorKysgYi9tdWx0aS9qL01ha2VmaWxlLWouaW5jCkBAIC0wLDAgKzEsOCBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBJQk0gQ29ycC4gYW5kIE90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitpbmNsdWRlICQoTVVMVElDVV9ST09UKS9NYWtlZmlsZS1tdWx0aS5pbmMKK0lDVVM9JChNVUxUSUNVX1JPT1QpL2ljdXMKK0pfR09PRDo9JChzaGVsbCBbIC1kICQoSUNVUykgXSAmJiAoY2QgJChJQ1VTKSA7ICBscyAtZCBpY3U0ai0qLmphciB8IGN1dCAtZC0gLWYyIHwgY3V0IC1kLiAtZjEpKQorI0pfR09PRD0kKElDVTRKVkVSUzolPSQoSUNVUykvaWN1NGotJS5qYXIpCisKKwpkaWZmIC0tZ2l0IGEvbXVsdGkvai9vbGQtaWN1NGoudHh0IGIvbXVsdGkvai9vbGQtaWN1NGoudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NjdlN2QKLS0tIC9kZXYvbnVsbAorKysgYi9tdWx0aS9qL29sZC1pY3U0ai50eHQKQEAgLTAsMCArMSwyIEBACisjIENvcHlyaWdodCAoYykgMjAwOSBJQk0gQ29ycC4gYW5kIE90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZAorIyBhIGxpc3Qgb2YgSUNVNENzIHRvbyBvbGQgdG8gYnVpbGQgd2l0aCB0aGUgY3VycmVudCBwYXRjaHNldC4KZGlmZiAtLWdpdCBhL211bHRpL3Byb2ovY2hlbGxvL01ha2VmaWxlIGIvbXVsdGkvcHJvai9jaGVsbG8vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRkNTRiMQotLS0gL2Rldi9udWxsCisrKyBiL211bHRpL3Byb2ovY2hlbGxvL01ha2VmaWxlCkBAIC0wLDAgKzEsNTEgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgSUJNIENvcnAuIGFuZCBPdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyMgTWFrZWZpbGUgZm9yIG11bHRpY3Uvc2FtcGxlL2NoZWxsbworIyBDL0MrKyBoZWxsbworCisjIyBOYW1lIG9mIHRoZSBhcHAKK1RBUkdFVD1jaGVsbG8KKworIyMgU291cmNlcyBsaXN0IChDIGFuZCBDKysganVzdCB0byBiZSBkaWZmaWN1bHQpCitDX1NPVVJDRVM9ZGF0ZS5jCitDWFhfU09VUkNFUz11cHJpbnQuY3BwCitTUkNTPSQoQ19TT1VSQ0VTKSAkKENYWF9TT1VSQ0VTKQorSEVBREVSUz11cHJpbnQuaAorCithbGw6CisJQGVjaG8gVG8gYnVpbGQgYW5kIGxpc3QgIiciICQoT1VURklMRVMpICInIiAgaW4gIiciICQoQ19HT09EKSAiJyIgdXNlICIkKE1BS0UpIGNoZWNrIgorCisjIyBTZXR1cCBtdWx0aWN1CitNVUxUSUNVX1JPT1Q9Li4vLi4vCitpbmNsdWRlICQoTVVMVElDVV9ST09UKS9jL01ha2VmaWxlLWMuaW5jCisKK09VVD1vdXQKKworJChPVVQpOgorCW1rZGlyICQoT1VUKQorCisjIyBUaGUgb3V0cHV0IGZpbGVzLiAgV2lsbCByZXN1bHQgaW46ICAgb3V0LzNfOC50eHQgIG91dC80XzAudHh0ICBldGMuCitPVVRGSUxFUz0kKENfR09PRDolPSQoT1VUKS8lLnR4dCkKKworLlBSRUNJT1VTOiAkKENfQ0xFQU5fVEFSR0VUKQorCisjIyBHZW5lcmF0ZSBhIGZpbGUKKyQoT1VUKS8lLnR4dDogJChPVVQpICQoQ19JTlMpLyUvYmluLyQoVEFSR0VUKQorCSQoc2hlbGwgJChDX0lOUykvJCovYmluL2ljdS1jb25maWcgLS1pbnZva2UpICQoQ19JTlMpLyQqL2Jpbi8kKFRBUkdFVCkgID4gJEAKKworIyMgY2xlYW4KK2NsZWFuOgorCS1ybSAtZiAkKENfQ0xFQU5fVEFSR0VUKQorCS1ybSAtZiAuLyQoT1VUKS8qCisJLXJtZGlyICQoT1VUKQorCisjIyBKdXN0IGdlbmVyYXRlCitvdXRmaWxlczogJChPVVRGSUxFUykKKworIyMgVGVzdDogZ2VuZXJhdGUgb3V0IGZpbGVzLCBhbmQgcHJpbnQgdGhlbS4KK2NoZWNrOiAkKE9VVEZJTEVTKQorCUBmb3IgZmlsZSBpbiAkKE9VVEZJTEVTKTsgXAorCWRvIFwKKwkJZWNobzsgXAorCQlzZWQgLWUgInMlXiUkJGZpbGU6ICVnIiA8ICQkZmlsZTsgXAorCWRvbmUKKwpkaWZmIC0tZ2l0IGEvbXVsdGkvcHJvai9jaGVsbG8vZGF0ZS5jIGIvbXVsdGkvcHJvai9jaGVsbG8vZGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MjRhMmEKLS0tIC9kZXYvbnVsbAorKysgYi9tdWx0aS9wcm9qL2NoZWxsby9kYXRlLmMKQEAgLTAsMCArMSwyMDQgQEAKKy8qCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgQ29weXJpZ2h0IChDKSAxOTk4LTIwMDksIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMKKyogICBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogRmlsZSBkYXRlLmMKKyoKKyogTW9kaWZpY2F0aW9uIEhpc3Rvcnk6CisqCisqICAgRGF0ZSAgICAgICAgTmFtZSAgICAgICAgRGVzY3JpcHRpb24KKyogICAwNi8xMS85OSAgICBzdGVwaGVuICAgICBDcmVhdGlvbi4KKyogICAwNi8xNi85OSAgICBzdGVwaGVuICAgICBNb2RpZmllZCB0byB1c2UgdXByaW50LgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJ1bmljb2RlL3V0eXBlcy5oIgorI2luY2x1ZGUgInVuaWNvZGUvdXN0cmluZy5oIgorI2luY2x1ZGUgInVuaWNvZGUvdWNsZWFuLmgiCisKKyNpbmNsdWRlICJ1bmljb2RlL3VjbnYuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3VkYXQuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3VjYWwuaCIKKworI2luY2x1ZGUgInVwcmludC5oIgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpOworCisjaWYgVUNPTkZJR19OT19GT1JNQVRUSU5HCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgcHJpbnRmKCIlczogU29ycnksIFVDT05GSUdfTk9fRk9STUFUVElORyB3YXMgdHVybmVkIG9uIChzZWUgdWNvbmZpZy5oKS4gTm8gZm9ybWF0dGluZyBjYW4gYmUgZG9uZS4gXG4iLCBhcmd2WzBdKTsKKyAgcmV0dXJuIDA7Cit9CisjZWxzZQorCisKKy8qIFByb3RvcyAqLworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCk7CitzdGF0aWMgdm9pZCB2ZXJzaW9uKHZvaWQpOworc3RhdGljIHZvaWQgZGF0ZShjb25zdCBVQ2hhciAqdHosIFVEYXRlRm9ybWF0U3R5bGUgc3R5bGUsIGNoYXIgKmZvcm1hdCwgVUVycm9yQ29kZSAqc3RhdHVzKTsKKworCisvKiBUaGUgdmVyc2lvbiBvZiBkYXRlICovCisjZGVmaW5lIERBVEVfVkVSU0lPTiAiMS4wIgorCisvKiAiR01UIiAqLworc3RhdGljIGNvbnN0IFVDaGFyIEdNVF9JRCBbXSA9IHsgMHgwMDQ3LCAweDAwNGQsIDB4MDA1NCwgMHgwMDAwIH07CisKKworaW50CittYWluKGludCBhcmdjLAorICAgICBjaGFyICoqYXJndikKK3sKKyAgaW50IHByaW50VXNhZ2UgPSAwOworICBpbnQgcHJpbnRWZXJzaW9uID0gMDsKKyAgaW50IG9wdGluZCA9IDE7CisgIGNoYXIgKmFyZzsKKyAgY29uc3QgVUNoYXIgKnR6ID0gMDsKKyAgVURhdGVGb3JtYXRTdHlsZSBzdHlsZSA9IFVEQVRfREVGQVVMVDsKKyAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisgIGNoYXIgKmZvcm1hdCA9IE5VTEw7CisKKworICAvKiBwYXJzZSB0aGUgb3B0aW9ucyAqLworICBmb3Iob3B0aW5kID0gMTsgb3B0aW5kIDwgYXJnYzsgKytvcHRpbmQpIHsKKyAgICBhcmcgPSBhcmd2W29wdGluZF07CisgICAgCisgICAgLyogdmVyc2lvbiBpbmZvICovCisgICAgaWYoc3RyY21wKGFyZywgIi12IikgPT0gMCB8fCBzdHJjbXAoYXJnLCAiLS12ZXJzaW9uIikgPT0gMCkgeworICAgICAgcHJpbnRWZXJzaW9uID0gMTsKKyAgICB9CisgICAgLyogdXNhZ2UgaW5mbyAqLworICAgIGVsc2UgaWYoc3RyY21wKGFyZywgIi1oIikgPT0gMCB8fCBzdHJjbXAoYXJnLCAiLS1oZWxwIikgPT0gMCkgeworICAgICAgcHJpbnRVc2FnZSA9IDE7CisgICAgfQorICAgIC8qIGRpc3BsYXkgZGF0ZSBpbiBnbXQgKi8KKyAgICBlbHNlIGlmKHN0cmNtcChhcmcsICItdSIpID09IDAgfHwgc3RyY21wKGFyZywgIi0tZ210IikgPT0gMCkgeworICAgICAgdHogPSBHTVRfSUQ7CisgICAgfQorICAgIC8qIGRpc3BsYXkgZGF0ZSBpbiBnbXQgKi8KKyAgICBlbHNlIGlmKHN0cmNtcChhcmcsICItZiIpID09IDAgfHwgc3RyY21wKGFyZywgIi0tZnVsbCIpID09IDApIHsKKyAgICAgIHN0eWxlID0gVURBVF9GVUxMOworICAgIH0KKyAgICAvKiBkaXNwbGF5IGRhdGUgaW4gbG9uZyBmb3JtYXQgKi8KKyAgICBlbHNlIGlmKHN0cmNtcChhcmcsICItbCIpID09IDAgfHwgc3RyY21wKGFyZywgIi0tbG9uZyIpID09IDApIHsKKyAgICAgIHN0eWxlID0gVURBVF9MT05HOworICAgIH0KKyAgICAvKiBkaXNwbGF5IGRhdGUgaW4gbWVkaXVtIGZvcm1hdCAqLworICAgIGVsc2UgaWYoc3RyY21wKGFyZywgIi1tIikgPT0gMCB8fCBzdHJjbXAoYXJnLCAiLS1tZWRpdW0iKSA9PSAwKSB7CisgICAgICBzdHlsZSA9IFVEQVRfTUVESVVNOworICAgIH0KKyAgICAvKiBkaXNwbGF5IGRhdGUgaW4gc2hvcnQgZm9ybWF0ICovCisgICAgZWxzZSBpZihzdHJjbXAoYXJnLCAiLXMiKSA9PSAwIHx8IHN0cmNtcChhcmcsICItLXNob3J0IikgPT0gMCkgeworICAgICAgc3R5bGUgPSBVREFUX1NIT1JUOworICAgIH0KKyAgICBlbHNlIGlmKHN0cmNtcChhcmcsICItRiIpID09IDAgfHwgc3RyY21wKGFyZywgIi0tZm9ybWF0IikgPT0gMCkgeworICAgICAgaWYgKCBvcHRpbmQgKyAxIDwgYXJnYyApIHsgCisgICAgICAgICBvcHRpbmQrKzsKKyAgICAgICAgIGZvcm1hdCA9IGFyZ3Zbb3B0aW5kXTsKKyAgICAgIH0KKyAgICB9CisgICAgLyogUE9TSVguMSBzYXlzIGFsbCBhcmd1bWVudHMgYWZ0ZXIgLS0gYXJlIG5vdCBvcHRpb25zICovCisgICAgZWxzZSBpZihzdHJjbXAoYXJnLCAiLS0iKSA9PSAwKSB7CisgICAgICAvKiBza2lwIHRoZSAtLSAqLworICAgICAgKytvcHRpbmQ7CisgICAgICBicmVhazsKKyAgICB9CisgICAgLyogdW5yZWNvZ25pemVkIG9wdGlvbiAqLworICAgIGVsc2UgaWYoc3RybmNtcChhcmcsICItIiwgc3RybGVuKCItIikpID09IDApIHsKKyAgICAgIHByaW50ZigiaWN1ZGF0ZTogaW52YWxpZCBvcHRpb24gLS0gJXNcbiIsIGFyZysxKTsKKyAgICAgIHByaW50VXNhZ2UgPSAxOworICAgIH0KKyAgICAvKiBkb25lIHdpdGggb3B0aW9ucywgZGlzcGxheSBkYXRlICovCisgICAgZWxzZSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICAvKiBwcmludCB1c2FnZSBpbmZvICovCisgIGlmKHByaW50VXNhZ2UpIHsKKyAgICB1c2FnZSgpOworICAgIHJldHVybiAwOworICB9CisKKyAgLyogcHJpbnQgdmVyc2lvbiBpbmZvICovCisgIGlmKHByaW50VmVyc2lvbikgeworICAgIHZlcnNpb24oKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8qIHByaW50IHRoZSBkYXRlICovCisgIGRhdGUodHosIHN0eWxlLCBmb3JtYXQsICZzdGF0dXMpOworCisgIHVfY2xlYW51cCgpOworICByZXR1cm4gKFVfRkFJTFVSRShzdGF0dXMpID8gMSA6IDApOworfQorCisvKiBVc2FnZSBpbmZvcm1hdGlvbiAqLworc3RhdGljIHZvaWQKK3VzYWdlKCkKK3sgIAorICBwdXRzKCJVc2FnZTogaWN1ZGF0ZSBbT1BUSU9OU10iKTsKKyAgcHV0cygiT3B0aW9uczoiKTsKKyAgcHV0cygiICAtaCwgLS1oZWxwICAgICAgICBQcmludCB0aGlzIG1lc3NhZ2UgYW5kIGV4aXQuIik7CisgIHB1dHMoIiAgLXYsIC0tdmVyc2lvbiAgICAgUHJpbnQgdGhlIHZlcnNpb24gbnVtYmVyIG9mIGRhdGUgYW5kIGV4aXQuIik7CisgIHB1dHMoIiAgLXUsIC0tZ210ICAgICAgICAgRGlzcGxheSB0aGUgZGF0ZSBpbiBHcmVlbndpY2ggTWVhbiBUaW1lLiIpOworICBwdXRzKCIgIC1mLCAtLWZ1bGwgICAgICAgIFVzZSBmdWxsIGRpc3BsYXkgZm9ybWF0LiIpOworICBwdXRzKCIgIC1sLCAtLWxvbmcgICAgICAgIFVzZSBsb25nIGRpc3BsYXkgZm9ybWF0LiIpOworICBwdXRzKCIgIC1tLCAtLW1lZGl1bSAgICAgIFVzZSBtZWRpdW0gZGlzcGxheSBmb3JtYXQuIik7CisgIHB1dHMoIiAgLXMsIC0tc2hvcnQgICAgICAgVXNlIHNob3J0IGRpc3BsYXkgZm9ybWF0LiIpOworfQorCisvKiBWZXJzaW9uIGluZm9ybWF0aW9uICovCitzdGF0aWMgdm9pZAordmVyc2lvbigpCit7CisgIHByaW50ZigiaWN1ZGF0ZSB2ZXJzaW9uICVzIChJQ1UgdmVyc2lvbiAlcyksIGNyZWF0ZWQgYnkgU3RlcGhlbiBGLiBCb290aC5cbiIsIAorCSBEQVRFX1ZFUlNJT04sIFVfSUNVX1ZFUlNJT04pOworICBwdXRzKFVfQ09QWVJJR0hUX1NUUklORyk7Cit9CisKKy8qIEZvcm1hdCB0aGUgZGF0ZSAqLworc3RhdGljIHZvaWQKK2RhdGUoY29uc3QgVUNoYXIgKnR6LAorICAgICBVRGF0ZUZvcm1hdFN0eWxlIHN0eWxlLAorICAgICBjaGFyICpmb3JtYXQsCisgICAgIFVFcnJvckNvZGUgKnN0YXR1cykKK3sKKyAgVUNoYXIgKnMgPSAwOworICBpbnQzMl90IGxlbiA9IDA7CisgIFVEYXRlRm9ybWF0ICpmbXQ7CisgIFVDaGFyIHVGb3JtYXRbMTAwXTsKKworICBmbXQgPSB1ZGF0X29wZW4oc3R5bGUsIHN0eWxlLCAwLCB0eiwgLTEsTlVMTCwwLCBzdGF0dXMpOworICBpZiAoIGZvcm1hdCAhPSBOVUxMICkgeworICAgICB1X2NoYXJzVG9VQ2hhcnMoZm9ybWF0LHVGb3JtYXQsc3RybGVuKGZvcm1hdCkpLAorICAgICB1ZGF0X2FwcGx5UGF0dGVybihmbXQsRkFMU0UsdUZvcm1hdCxzdHJsZW4oZm9ybWF0KSk7CisgIH0KKyAgbGVuID0gdWRhdF9mb3JtYXQoZm10LCB1Y2FsX2dldE5vdygpLCAwLCBsZW4sIDAsIHN0YXR1cyk7CisgIGlmKCpzdGF0dXMgPT0gVV9CVUZGRVJfT1ZFUkZMT1dfRVJST1IpIHsKKyAgICAqc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICAgIHMgPSAoVUNoYXIqKSBtYWxsb2Moc2l6ZW9mKFVDaGFyKSAqIChsZW4rMSkpOworICAgIGlmKHMgPT0gMCkgZ290byBmaW5pc2g7CisgICAgdWRhdF9mb3JtYXQoZm10LCB1Y2FsX2dldE5vdygpLCBzLCBsZW4gKyAxLCAwLCBzdGF0dXMpOworICAgIGlmKFVfRkFJTFVSRSgqc3RhdHVzKSkgZ290byBmaW5pc2g7CisgIH0KKworICAvKiBwcmludCB0aGUgZGF0ZSBzdHJpbmcgKi8KKyAgdXByaW50KHMsIHN0ZG91dCwgc3RhdHVzKTsKKworICAvKiBwcmludCBhIHRyYWlsaW5nIG5ld2xpbmUgKi8KKyAgcHJpbnRmKCIgQCBJQ1UgIiBVX0lDVV9WRVJTSU9OICJcbiIpOworCisgZmluaXNoOgorICB1ZGF0X2Nsb3NlKGZtdCk7CisgIGZyZWUocyk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL211bHRpL3Byb2ovY2hlbGxvL3VwcmludC5jcHAgYi9tdWx0aS9wcm9qL2NoZWxsby91cHJpbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0N2RlYTkKLS0tIC9kZXYvbnVsbAorKysgYi9tdWx0aS9wcm9qL2NoZWxsby91cHJpbnQuY3BwCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uCisqIGFuZCBvdGhlcnMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBGaWxlIHVwcmludC5jcHAKKyoKKyogTW9kaWZpY2F0aW9uIEhpc3Rvcnk6CisqCisqCURhdGUJCU5hbWUJCURlc2NyaXB0aW9uCisqCTA2LzE0Lzk5CXN0ZXBoZW4gCUNyZWF0aW9uLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworI2luY2x1ZGUgInVwcmludC5oIgorCisjaW5jbHVkZSAidW5pY29kZS91Y252LmgiCisjaW5jbHVkZSAidW5pY29kZS91c3RyaW5nLmgiCisKKyNkZWZpbmUgQlVGX1NJWkUgMTI4CisKKy8qIFByaW50IGEgdXN0cmluZyB0byB0aGUgc3BlY2lmaWVkIEZJTEUqIGluIHRoZSBkZWZhdWx0IGNvZGVwYWdlICovCitVX0NBUEkgdm9pZAordXByaW50KGNvbnN0IFVDaGFyICpzLAorCSAgIEZJTEUgKmYsCisJICAgVUVycm9yQ29kZSAqc3RhdHVzKQoreworICAvKiBjb252ZXJ0ZXIgKi8KKyAgVUNvbnZlcnRlciAqY29udmVydGVyOworICBjaGFyIGJ1ZiBbQlVGX1NJWkVdOworICBpbnQzMl90IHNvdXJjZUxlbjsKKyAgY29uc3QgVUNoYXIgKm15U291cmNlOworICBjb25zdCBVQ2hhciAqbXlTb3VyY2VFbmQ7CisgIGNoYXIgKm15VGFyZ2V0OworICBpbnQzMl90IGFycmF5U2l6ZTsKKworICBpZihzID09IDApIHJldHVybjsKKworICAvKiBzZXQgdXAgdGhlIGNvbnZlcnNpb24gcGFyYW1ldGVycyAqLworICBzb3VyY2VMZW4gICAgPSB1X3N0cmxlbihzKTsKKyAgbXlTb3VyY2UJICAgPSBzOworICBteVNvdXJjZUVuZCAgPSBteVNvdXJjZSArIHNvdXJjZUxlbjsKKyAgbXlUYXJnZXQJICAgPSBidWY7CisgIGFycmF5U2l6ZSAgICA9IEJVRl9TSVpFOworCisgIC8qIG9wZW4gYSBkZWZhdWx0IGNvbnZlcnRlciAqLworICBjb252ZXJ0ZXIgPSB1Y252X29wZW4oMCwgc3RhdHVzKTsKKyAgCisgIC8qIGlmIHdlIGZhaWxlZCwgY2xlYW4gdXAgYW5kIGV4aXQgKi8KKyAgaWYoVV9GQUlMVVJFKCpzdGF0dXMpKSBnb3RvIGZpbmlzaDsKKyAgCisgIC8qIHBlcmZvcm0gdGhlIGNvbnZlcnNpb24gKi8KKyAgZG8geworCS8qIHJlc2V0IHRoZSBlcnJvciBjb2RlICovCisJKnN0YXR1cyA9IFVfWkVST19FUlJPUjsKKworCS8qIHBlcmZvcm0gdGhlIGNvbnZlcnNpb24gKi8KKwl1Y252X2Zyb21Vbmljb2RlKGNvbnZlcnRlciwgJm15VGFyZ2V0LAlteVRhcmdldCArIGFycmF5U2l6ZSwKKwkJCSAmbXlTb3VyY2UsIG15U291cmNlRW5kLCBOVUxMLAorCQkJIFRSVUUsIHN0YXR1cyk7CisKKwkvKiBXcml0ZSB0aGUgY29udmVydGVkIGRhdGEgdG8gdGhlIEZJTEUqICovCisJZndyaXRlKGJ1Ziwgc2l6ZW9mKGNoYXIpLCBteVRhcmdldCAtIGJ1ZiwgZik7CisKKwkvKiB1cGRhdGUgdGhlIGNvbnZlcnNpb24gcGFyYW1ldGVycyovCisJbXlUYXJnZXQJID0gYnVmOworCWFycmF5U2l6ZQkgPSBCVUZfU0laRTsKKyAgfQorICB3aGlsZSgqc3RhdHVzID09IFVfQlVGRkVSX09WRVJGTE9XX0VSUk9SKTsgCisKKyBmaW5pc2g6CisgIAorICAvKiBjbG9zZSB0aGUgY29udmVydGVyICovCisgIHVjbnZfY2xvc2UoY29udmVydGVyKTsKK30KZGlmZiAtLWdpdCBhL211bHRpL3Byb2ovY2hlbGxvL3VwcmludC5oIGIvbXVsdGkvcHJvai9jaGVsbG8vdXByaW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM1M2U2NQotLS0gL2Rldi9udWxsCisrKyBiL211bHRpL3Byb2ovY2hlbGxvL3VwcmludC5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uCisqIGFuZCBvdGhlcnMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBGaWxlIHVwcmludC5oCisqCisqIE1vZGlmaWNhdGlvbiBIaXN0b3J5OgorKgorKiAgIERhdGUgICAgICAgIE5hbWUgICAgICAgIERlc2NyaXB0aW9uCisqICAgMDYvMTQvOTkgICAgc3RlcGhlbiAgICAgQ3JlYXRpb24uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisjaWZuZGVmIFVQUklOVF9ICisjZGVmaW5lIFVQUklOVF9IIDEKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJ1bmljb2RlL3V0eXBlcy5oIgorCisvKiBQcmludCBhIHVzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBGSUxFKiBpbiB0aGUgZGVmYXVsdCBjb2RlcGFnZSAqLworVV9DRlVOQyB2b2lkIHVwcmludChjb25zdCBVQ2hhciAqcywgRklMRSAqZiwgVUVycm9yQ29kZSAqc3RhdHVzKTsKKworI2VuZGlmIC8qICEgVVBSSU5UX0ggKi8KZGlmZiAtLWdpdCBhL211bHRpL3Byb2ovcHJvdmlkZXIvTWFrZWZpbGUgYi9tdWx0aS9wcm9qL3Byb3ZpZGVyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMjRiMTAKLS0tIC9kZXYvbnVsbAorKysgYi9tdWx0aS9wcm9qL3Byb3ZpZGVyL01ha2VmaWxlCkBAIC0wLDAgKzEsMjk2IEBACisjCisjIENvcHlyaWdodCAoQykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycywgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKK2FsbDogZ2x1cmVucyBpaSBwbHVncyB0ZXN0cHJvZworCitVTkFNRT0kKHNoZWxsIHVuYW1lKQorCitpZmVxICgkKFVOQU1FKSxMaW51eCkKK0xJQlBBVEhfVkFSPUxEX0xJQlJBUllfUEFUSAorUExVR19FWFRSQV9MREZMQUdTPS1mUElDCitQQkxEX0VYVFJBX0ZMQUdTPS1mUElDCitHTFVFX0VYVFJBX0NGTEFHUz0gLWZQSUMKK1BMVUdMSUJfU089c28KK2Vsc2UKK2lmZXEgKCQoVU5BTUUpLERhcndpbikKK0xJQlBBVEhfVkFSPURZTERfTElCUkFSWV9QQVRICitQTFVHX0VYVFJBX0xERkxBR1M9LWV4cG9ydGVkX3N5bWJvbHNfbGlzdCBnbHVlL2V4cG9ydC50eHQgLWR5bmFtaWNsaWIgLWR5bmFtaWMKK1BMVUdMSUJfU089ZHlsaWIKK2Vsc2UKKyQod2FybmluZyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKQorJCh3YXJuaW5nIHRoaXMgc2NyaXB0IG1heSBub3Qga25vdyBob3cgdG8gaGFuZGxlIHlvdXIgJChVTkFNRSkgc3lzdGVtKQorZW5kaWYKK2VuZGlmCisKKworUFJPVklERVI9cHJvdmlkZXIKK0xJQlBST1ZJREVSPWxpYiQoUFJPVklERVIpLmEKKworI2xpYnM6ICQoSUNVX1RBUkJBTExTX1ZFUlM6JT0kKE9VVCkvJS9saWIvJChMSUJQUk9WSURFUikpCisKK1BMVUdMSUI9JChzaGVsbCBlY2hvICQoUFJPVklERVJfVEFSR0VUKSAgfCB0ciAnLicgJ18nICkKK1BMVUdMSUJfTUFKPSQoc2hlbGwgZWNobyAkKFBST1ZJREVSX1RBUkdFVCkgfCBjdXQgLWQuIC1mMS0yIHwgdHIgLWQgJy4nICkKK1BMVUdMSUJfSUNVX0NPTkZJRz0kKENfSU5TKS9yJChQTFVHTElCKS9iaW4vaWN1LWNvbmZpZworI1BMVUdMSUJfU089JChzaGVsbCAkKFBMVUdMSUJfSUNVX0NPTkZJRykgLS1zbyAyPi9kZXYvbnVsbCApCitQTFVHTElCX05BTUU9bGliaWN1cHJvdi4kKFBMVUdMSUJfTUFKKS4kKFBMVUdMSUJfU08pCisjUExVR0xJQl9NQUo9JChlY2hvICQoUExVR0xJQikgfCBjdXQgLWRfIC1mLTEgfCB0ciAtZCBfICkKKyNHTE9VVF9JQ1U9JChJQ1VfVEFSQkFMTFNfVkVSUzolPSQoR0xPVVQpLyUvJChPSykpCitQTFVHTElCX0FWQUlMQUJMRT0kKHNoZWxsIGVjaG8gJChQUk9WSURFUl9BVkFJTEFCTEUpIHwgdHIgJy4nICdfJykKK1BMVUdMSUJfQVZBSUxBQkxFX0RBVEE9JChQTFVHTElCX0FWQUlMQUJMRTolPSQoQlVJTEQpLyUvZGF0YS9vdXQvdG1wLyoubykKK1BMVUdMSUJfQVZBSUxBQkxFX1NUQVRJQ1M9JChQTFVHTElCX0FWQUlMQUJMRTolPSQoQlVJTEQpLyUvW2NpXSovKi5hbykKK1BMVUdMSUJfT1VUTElCUz0kKFBMVUdMSUI6JT0kKE9VVCkvJS9saWIvJChQTFVHTElCX05BTUUpKQorCisKKworIyMgY29uZmlndXJhdGlvbgorIyBBYnNvbHV0ZSBwYXRoIHRvIHRoaXMgZGlyLiAKKyMgZGlyIGhvbGRpbmcgSUNVcyB0byBiZSBidWlsdAorTVVMVElDVV9ST09UPS4uLy4uCitpbmNsdWRlICQoTVVMVElDVV9ST09UKS9jL01ha2VmaWxlLWMuaW5jCitJQ1VfQ09ORklHPWljdS1jb25maWctbm9zYW5pdHkKK0lDVV9DT05GSUdfT1JJRz1pY3UtY29uZmlnCisKKyMgc3ViZGlycy4uLgorIyBwcmVmaXggdG8gZGlzdGluZ3Vpc2ggaXQgZnJvbSBub24tcHJvdmlkZXIgYnVpbGRzCitQX1BSRUZJWD1wCitCVUlMRD0kKE1fVE1QKS8kKFBfUFJFRklYKWJsZAorSU5TVD0kKE1fVE1QKS8kKFBfUFJFRklYKWlucworU1JDPSQoTV9UTVApLyQoUF9QUkVGSVgpc3JjCitPVVQ9JChUT1ApL291dAorU09VUkNFPSQoU19TUkNESVIpCitHTFVFPWdsdWUKK0dMT1VUPSQoTV9UTVApLyQoUF9QUkVGSVgpZ2xvdXQKKyMgaGVhZGVyIGxvY2F0aW9ucworSU5DR0xVRT0kKFRPUCkvJChHTFVFKS9pbmNsdWRlCisjIHJlbGF0aXZlIHBhdGggdG8gaWN1Z2x1ZSB3aXRoaW4gZ2xvdXQKK0dMVVJFTj1nbHVyZW4vaW5jbHVkZS9pY3VnbHVlCisjIHJlbGF0aXZlIHBhdGggdG8gZ2x1cmVuLmgKK0dMVVJFTl9IPSQoR0xVUkVOKS9nbHVyZW4uaAorIyBTcGVjaWFsICdjb25maWd1cmUnIGNhbGxlcgorU1VQRVJDT05GPSQoVE9QKS8kKE1VTFRJQ1VfUk9PVCkvYy9zdXBlcmNvbmYuc2gKKyMgb3B0aW9ucyB0byBjb21waWxhdGlvbiAoc3VjaCBhcywgZGVidWcpCitYT1BUUz0kKEVYVFJBX0NPTVBJTEVfT1BUUykKK09LPW9rCitNT1BUUz0KKworIyBkaXJlY3RvcmllcyB0aGF0IG5lZWQgdG8gYmUgYnVpbHQKK0FMTERJUlM9JChJTlNUKSAkKEJVSUxEKSAkKFNSQykgJChHTE9VVCkgJChPVVQpCisjIFRoZSAnb2snIGZsYWcgZmlsZSBmb3IgaW5zdGFsbGF0aW9ucworSU5TVF9JQ1U9JChQTFVHTElCX0FWQUlMQUJMRTolPSQoSU5TVCkvJS8kKE9LKSkKK0JVSUxEX0lDVT0kKFBMVUdMSUJfQVZBSUxBQkxFOiU9JChCVUlMRCkvJS8kKE9LKSkKKyMgdGhpcyBoYXMgdG8gZG8gd2l0aCB0aGUgcGx1Z2xpYgorR0xPVVRfSUNVPSQoUExVR0xJQjolPSQoR0xPVVQpLyUvb2JqLSQoT0spKQorI1NSQ19JQ1U9JChJQ1VfVEFSQkFMTFNfVkVSUzolPSQoU1JDKS8lLyQoT0spKQorIyBnbHVyZW4uaCBmaWxlcyBmb3IgZWFjaCB2ZXJzaW9uCitHTFVSRU5fSUNVPSQoUExVR0xJQl9BVkFJTEFCTEU6JT0kKEJVSUxEKS8lLyQoR0xVUkVOX0gpKQorIz8KK0NPTkZJR1VSRV9DTUQ9CisjIE9wdGlvbnMgcGFzc2VkIHRvIGNvbmZpZ3VyZQorQ09ORklHVVJFX09QVFM9LS1lbmFibGUtc3RhdGljIC0tZGlzYWJsZS1zaGFyZWQgLS13aXRoLWRhdGEtcGFja2FnaW5nPXN0YXRpYyAtLWRpc2FibGUtZXh0cmFzIC0tZGlzYWJsZS1pY3VpbyAtLWRpc2FibGUtbGF5b3V0IC0tZGlzYWJsZS10ZXN0cyAtLWRpc2FibGUtc2FtcGxlcyAgJChFWFRSQV9DT05GSUdVUkVfT1BUUykgCisjIGFkZGl0aW9uYWwgb3B0aW9ucyBwYXNzZWQgdG8gbWFrZQorTUFLRV9YVFJBX09QVFM9IlBLR0RBVEFfTU9ERT1zdGF0aWMiCisjIGFkZGl0aW9uYWwgb3B0aW9ucyBwYXNzZWQgdG8gbWFrZSBpbnN0YWxsCitNQUtFX0lOU1RBTExfWFRSQV9PUFRTPSQoTUFLRV9YVFJBX09QVFMpCisKKyMgTXVuZ2VkIHNvdXJjZSBuYW1lczogbGlzdCBvZiBDLCBDKyssIE8gZXRjIGZpbGVzIGZvciBCYWNrZW5kCitHTF9CRV9DPSQoc2hlbGwgY2QgJChHTFVFKSA7IGxzICpfYmUuYykKK0dMX0JFX0NYWD0kKHNoZWxsIGNkICQoR0xVRSkgOyBscyAqX2JlLmNwcCkKK0dMX0JFX089JChHTF9CRV9DOiUuYz0lLm8pICQoR0xfQkVfQ1BQOiUuY3BwPSUubykKKyMgTXVuZ2VkIHNvdXJjZSBuYW1lczogbGlzdCBvZiBDLCBDKyssIE8gZXRjIGZpbGVzIGZvciBGcm9udGVuZAorR0xfRkVfQz0kKHNoZWxsIGNkICQoR0xVRSkgOyBscyAqX2ZlLmMpCitHTF9GRV9DWFg9JChzaGVsbCBjZCAkKEdMVUUpIDsgbHMgKl9mZS5jcHApCitHTF9GRV9PPSQoR0xfRkVfQzolLmM9JS5vKSAkKEdMX0ZFX0NQUDolLmNwcD0lLm8pCisjIEMgZmxhZ3MgdXNlZCBpbiBHbHVlIGNvbXBpbGF0aW9uCitHTFVFX0NGTEFHUz0tSSQoSU5DR0xVRSkgJChHTFVFX0VYVFJBX0NGTEFHUykKKworCisjIGljdS1jb25maWcgc3dpdGNoZXMgZm9yIGNvbXBpbGluZzogQyBhbmQgQysrCitJQ1VfQ09ORklHX0NPTU1PTj0tLWNwcGZsYWdzCisjIGljdS1jb25maWcgc3dpdGNoZXMgZm9yIEMKK0lDVV9DT05GSUdfQ0M9LS1jYyAkKElDVV9DT05GSUdfQ09NTU9OKSAtLWNmbGFncyAKKyMgaWN1LWNvbmZpZyBzd2l0Y2hlcyBmb3IgQysrCitJQ1VfQ09ORklHX0NYWD0tLWN4eCAkKElDVV9DT05GSUdfQ09NTU9OKSAtLWN4eGZsYWdzCisKK2luY2x1ZGUgTWFrZWZpbGUubG9jYWwKKworCisjIyBAYnVpbGQgQWxsIGluc3RhbGxlZCBJQ1VzCitpaTogJChHTE9VVF9JQ1UpCisKKyMgRG9uJ3QgZGVsZXRlIHRoZXNlIGZpbGVzCisuUFJFQ0lPVVM6IChJTlNUX0lDVSkgJChCVUlMRF9JQ1UpICQoU1JDX0lDVSkgJChJQ1VfVEFSQkFMTFNfVkVSUzolPSQoQlVJTEQpLyUvY29uZmlnLnN0YXR1cykgJChJQ1VfVEFSQkFMTFNfVkVSUzolPSQoR0xPVVQpLyUvb2JqLSQoT0spKSAgJChJQ1VfVEFSQkFMTFNfVkVSUzolPSQoQlVJTEQpLyUvY29uZmlnLyQoSUNVX0NPTkZJRykpICQoUExVR0xJQl9JQ1VfQ09ORklHKQorCisjIGNsZWFudXAKK2NsZWFuOgorCS1ybSAtcmYgJChBTExESVJTKQorCS0kKE1BS0UpIC1DIC4uLy4uIGNsZWFuCisKKyMgY3JlYXRlIGFsbCBlbXB0eSB3b3JrIGRpcnMKKyQoQUxMRElSUyk6CisJLW1rZGlyIC1wICQoQCkKKworIyBCdWlsZCByJChQTFVHTElCKSBmcm9tIC4uLy4uL2MKKyQoUExVR0xJQl9JQ1VfQ09ORklHKToKKwkkKE1BS0UpIC1DIC4uLy4uL2MgSUNVVkVSUz0kKFBMVUdMSUIpIHJpY3VzCisKKyMgYnVpbGQgdGhlIGdsdWUgb2JqZWN0cyBmb3IgVEFSR0VUCisjIHVzZWQgdG8gYmUgJS8qIGluc3RlYWQgb2YgJChQTFVHTElCKSAtIG5vdywgd2lyZSBpdCBkb3duIHRvIHBsdWdsaWIuCiskKEdMT1VUKS8kKFBMVUdMSUIpL29iai0kKE9LKTogJChHTE9VVCkgZ2x1cmVucyAgJChQTFVHTElCX0lDVV9DT05GSUcpCisJLW1rZGlyICQoR0xPVVQpLyQoUExVR0xJQikKKyMJJChzaGVsbCAkKEJVSUxEKS8kKFBMVUdMSUIpL2NvbmZpZy8kKElDVV9DT05GSUcpICQoSUNVX0NPTkZJR19DQykpICQoR0xVRV9DRkxBR1MpIC1jIC1ESUNVR0xVRV9WRVI9JChQTFVHTElCKSAtbyAkKEdMT1VUKS8kKFBMVUdMSUIpL2dsX2JlX2NfJChQTFVHTElCKS5vICQoR0xfQkVfQzolLmM9JChHTFVFKS8lLmMpCisjCSQoc2hlbGwgJChCVUlMRCkvJChQTFVHTElCKS9jb25maWcvJChJQ1VfQ09ORklHKSAkKElDVV9DT05GSUdfQ1hYKSkgJChHTFVFX0NGTEFHUykgLWMgLURJQ1VHTFVFX1ZFUj0kKFBMVUdMSUIpIC1vICQoR0xPVVQpLyQoUExVR0xJQikvZ2xfYmVfY3h4XyQoUExVR0xJQikubyAkKEdMX0JFX0NYWDolLmNwcD0kKEdMVUUpLyUuY3BwKQorCS1ybSAtcmYgJChHTE9VVCkvJChQTFVHTElCKS9pbmNsdWRlCisJbWtkaXIgLXAgJChHTE9VVCkvJChQTFVHTElCKS9pbmNsdWRlL2ljdWdsdWUvaW5jbHVkZQorIyBmb3IgZWFjaCB2ZXJzaW9uLi4gIGJ1aWxkIGFsbCBPVEhFUiBGRSBmaWxlcworIyBUT0RPOiBjaGVjayBpcyB1bm5lY2Vzc2FyeSwgbm90IHBlcm1pdHRlZC4KKyMgVE9ETzogY2hhbmdlIHRvIGRlcGVuZCBpbnN0ZWFkIG9mIGZvciBsaXN0LiAKKwlmb3IgdmVyIGluICQoUExVR0xJQl9BVkFJTEFCTEUpIDsgXAorCWRvIFwKKwkJZWNobyBidWlsZGluZyAkJHZlciBmb3IgJChQTFVHTElCKSA7IFwKKwkJaWYgWyAhICIkJHZlciIgPSAiJChQTFVHTElCKSIgXTsgXAorCQl0aGVuIFwKKwkJCWVjaG8gJChHTE9VVCkvJChQTFVHTElCKS9nbF9mZV9jXyQke3Zlcn1feF8kKFBMVUdMSUIpLm8gXAorCQkJJChzaGVsbCAkKFBMVUdMSUJfSUNVX0NPTkZJRykgLS1ub3ZlcmlmeSAkKElDVV9DT05GSUdfQ0MpKSAkKEdMVUVfQ0ZMQUdTKSAtYyAtSSQoVE9QKS8kKEJVSUxEKS8kJHZlci9nbHVyZW4vaW5jbHVkZSAtRElDVUdMVUVfVkVSPSQkdmVyICItRElDVUdMVUVfVkVSX1NUUj1cIiQkdmVyXCIiICItREdMVUVfU1lNKHgpPWdsdWUgIyMgeCAjIyAkJHZlciIgLW8gJChHTE9VVCkvJChQTFVHTElCKS9nbF9mZV9jXyQke3Zlcn1feF8kKFBMVUdMSUIpLm8gJChHTF9GRV9DOiUuYz0kKEdMVUUpLyUuYykgJChYT1BUUykgOyAgXAorCQkJJChzaGVsbCAkKFBMVUdMSUJfSUNVX0NPTkZJRykgLS1ub3ZlcmlmeSAkKElDVV9DT05GSUdfQ1hYKSkgJChHTFVFX0NGTEFHUykgLWMgLUkkKFRPUCkvJChCVUlMRCkvJCR2ZXIvZ2x1cmVuL2luY2x1ZGUgLURJQ1VHTFVFX1ZFUj0kJHZlciAiLURJQ1VHTFVFX1ZFUl9TVFI9XCIkJHZlclwiIiAiLURHTFVFX1NZTSh4KT1nbHVlICMjIHggIyMgJCR2ZXIiIC1vICQoR0xPVVQpLyQoUExVR0xJQikvZ2xfZmVfY3h4XyQke3Zlcn1feF8kKFBMVUdMSUIpLm8gJChHTF9GRV9DWFg6JS5jcHA9JChHTFVFKS8lLmNwcCkgJChYT1BUUykgOyBcCisJCQllY2hvICIgR0xVRV9WRVIoICQkdmVyICkgIiA+PiAkKEdMT1VUKS8kKFBMVUdMSUIpL2luY2x1ZGUvaWN1Z2x1ZS9nbHZlci5oOyBcCisJCWZpIFwKKwlkb25lCisjIGJ1aWxkICd0aGlzIHZlcnNpb24nIEZFIGZpbGVzCisJQGVjaG8gQnVpbGRpbmcgRkUgZm9yICQoUExVR0xJQikKKwkkKHNoZWxsICQoUExVR0xJQl9JQ1VfQ09ORklHKSAtLW5vdmVyaWZ5ICQoSUNVX0NPTkZJR19DQykpICQoR0xVRV9DRkxBR1MpIC1JJChHTE9VVCkvJChQTFVHTElCKS9pbmNsdWRlIC1jIC1vICQoR0xPVVQpLyQoUExVR0xJQikvZ2xfZmVfY18kKFBMVUdMSUIpLm8gJChHTF9GRV9DOiUuYz0kKEdMVUUpLyUuYykgJChYT1BUUykKKwkkKHNoZWxsICQoUExVR0xJQl9JQ1VfQ09ORklHKSAtLW5vdmVyaWZ5ICQoSUNVX0NPTkZJR19DWFgpKSAkKEdMVUVfQ0ZMQUdTKSAtSSQoR0xPVVQpLyQoUExVR0xJQikvaW5jbHVkZSAtYyAtbyAkKEdMT1VUKS8kKFBMVUdMSUIpL2dsX2ZlX2N4eF8kKFBMVUdMSUIpLm8gJChHTF9GRV9DWFg6JS5jcHA9JChHTFVFKS8lLmNwcCkgJChYT1BUUykKKyMgYnVpbGQgJ3RoaXMgdmVyc2lvbicgQkUgZmlsZXMgKGRpc2FibGVkIGZvciBub3cpCisjCSQoc2hlbGwgJChCVUlMRCkvJChQTFVHTElCKS9jb25maWcvJChJQ1VfQ09ORklHKSAkKElDVV9DT05GSUdfQ0MpKSAkKEdMVUVfQ0ZMQUdTKSAtYyAtRElDVUdMVUVfVkVSPSQoUExVR0xJQikgLW8gJChHTE9VVCkvJChQTFVHTElCKS9nbF9iZV9jXyQoUExVR0xJQikubyAkKEdMX0JFX0M6JS5jPSQoR0xVRSkvJS5jKQorIwkkKHNoZWxsICQoQlVJTEQpLyQoUExVR0xJQikvY29uZmlnLyQoSUNVX0NPTkZJRykgJChJQ1VfQ09ORklHX0NYWCkpICQoR0xVRV9DRkxBR1MpIC1jIC1ESUNVR0xVRV9WRVI9JChQTFVHTElCKSAtbyAkKEdMT1VUKS8kKFBMVUdMSUIpL2dsX2JlX2N4eF8kKFBMVUdMSUIpLm8gJChHTF9CRV9DWFg6JS5jcHA9JChHTFVFKS8lLmNwcCkKKwl0b3VjaCAkQAorCitwbHVnczogJChQTFVHTElCX09VVExJQlMpICQoT1VUKS8kKFBMVUdMSUJfTUFKOiU9aWN1cGx1Z2lucyUudHh0KQorCitpbnN0YWxsLXBsdWdzOiAkKENfSU5TKS9yJChQTFVHTElCKS9saWIvJChQTFVHTElCX05BTUUpICQoQ19JTlMpL3IkKFBMVUdMSUIpL2xpYi9pY3UvaWN1cGx1Z2lucyQoUExVR0xJQl9NQUopLnR4dAorCWVjaG8gIlBsdWdpbnMgaW5zdGFsbGVkIGZvciB0ZXN0aW5nLiIKKworI1RPRE86IHNob3VsZCBiZSAnaW5zdGFsbCcgbm90ICdjcCcKKyQoQ19JTlMpL3IkKFBMVUdMSUIpL2xpYi8kKFBMVUdMSUJfTkFNRSkgJChDX0lOUykvciQoUExVR0xJQikvbGliL2ljdS9pY3VwbHVnaW5zJChQTFVHTElCX01BSikudHh0OiAkKFBMVUdMSUJfT1VUTElCUykKKwljcCAkKFBMVUdMSUJfT1VUTElCUykgJChDX0lOUykvciQoUExVR0xJQikvbGliCisJZWNobyAiJChQTFVHTElCX05BTUUpCWNvbGxfcHJvdmlkZXJfcGx1Z2luIiA+ICQoQ19JTlMpL3IkKFBMVUdMSUIpL2xpYi9pY3UvaWN1cGx1Z2lucyQoUExVR0xJQl9NQUopLnR4dAorCiskKE9VVCkvaWN1cGx1Z2lucyQoUExVR0xJQl9NQUopLnR4dDogJChQTFVHTElCX09VVExJQlMpCisJZWNobyAiJChQTFVHTElCX05BTUUpCWNvbGxfcHJvdmlkZXJfcGx1Z2luIiA+ICRACisKK1RFU1RQUk9HPWNvbGRpZmYKKwordGVzdHByb2c6ICQoUExVR0xJQjolPSQoT1VUKS8lL2Jpbi8kKFRFU1RQUk9HKSkgCisKK2NoZWNrOiBhbGwgdGVzdHByb2cgJChPVVQpL2ljdXBsdWdpbnMkKFBMVUdMSUJfTUFKKS50eHQKKwlJQ1VfUExVR0lOUz0kKE9VVCkgJChMSUJQQVRIX1ZBUik9JChDX0lOUykvciQoUExVR0xJQikvbGliOm91dC8kKFBMVUdMSUIpL2xpYiAkKENfSU5TKS9yJChQTFVHTElCKS9iaW4vaWN1aW5mbyB8fCAoIGVjaG8gIklDVSBicm9rZW4uIiA7IC9iaW4vZmFsc2UgKQorCUlDVV9QTFVHSU5TPSQoT1VUKSAkKExJQlBBVEhfVkFSKT0kKENfSU5TKS9yJChQTFVHTElCKS9saWI6b3V0LyQoUExVR0xJQikvbGliICQoQ19JTlMpL3IkKFBMVUdMSUIpL2Jpbi9pY3VpbmZvIC1MIHx8ICggZWNobyAiUGx1Z2luIGJyb2tlbi4iIDsgL2Jpbi9mYWxzZSApCisJSUNVX1BMVUdJTlM9JChPVVQpICQoTElCUEFUSF9WQVIpPSQoQ19JTlMpL3IkKFBMVUdMSUIpL2xpYjpvdXQvJChQTFVHTElCKS9saWIgb3V0LyQoUExVR0xJQikvYmluL2NvbGRpZmYgfHwgKCBlY2hvICJjb2xkaWZmIGZhaWxlZC4iIDsgL2Jpbi9mYWxzZSApCisKK2luc3RhbGwtY2hlY2s6IGluc3RhbGwtcGx1Z3MKKwkkKExJQlBBVEhfVkFSKT0kKENfSU5TKS9yJChQTFVHTElCKS9saWIgJChDX0lOUykvciQoUExVR0xJQikvYmluL2ljdWluZm8gLUwgfHwgKCBlY2hvICJQbHVnaW4gYnJva2VuLiIgOyAvYmluL2ZhbHNlICkKKwkkKExJQlBBVEhfVkFSKT0kKENfSU5TKS9yJChQTFVHTElCKS9saWIgb3V0LyQoUExVR0xJQikvYmluL2NvbGRpZmYgfHwgKCBlY2hvICJjb2xkaWZmIGZhaWxlZC4iIDsgL2Jpbi9mYWxzZSApCisKKyQoT1VUKS8lL2Jpbi8kKFRFU1RQUk9HKTogJChURVNUUFJPRykuY3BwICQoT1VUKS8kKFBMVUdMSUIpL3Byb3ZpZGVyX3ZlcnNpb24uaAorCS1ta2RpciAtcCAkKE9VVCkvJCovYmluCisJJChzaGVsbCAkKFBMVUdMSUJfSUNVX0NPTkZJRykgLS1jeHggLS1jeHhmbGFncyAtLWNwcGZsYWdzIC0tbGRmbGFncykgLW8gJEAgLUkkKE9VVCkvJChQTFVHTElCKSAkKFRFU1RQUk9HKS5jcHAKKworJChPVVQpLyUvbGliLyQoUExVR0xJQl9OQU1FKTogICQoR0xPVVQpLyUvb2JqLSQoT0spCisJLW1rZGlyIC1wICQoT1VUKS8kKi9saWIKKwkkKHNoZWxsICQoUExVR0xJQl9JQ1VfQ09ORklHKSAtLWN4eCAtLWN4eGZsYWdzIC0tY3BwZmxhZ3MgLS1sZGZsYWdzKSAkKFBMVUdfRVhUUkFfTERGTEFHUykgLXNoYXJlZCAtbyAkQCAkKEdMT1VUKS8kKi8qLm8gJChQTFVHTElCX0FWQUlMQUJMRV9EQVRBKSAkKFBMVUdMSUJfQVZBSUxBQkxFX1NUQVRJQ1MpCisKKyMJY3AgJEAgJChDX0lOUykvciQqL2xpYi8KKworJChPVVQpLyUvbGliLyQoTElCUFJPVklERVIpOiAgJChHTE9VVCkvJS9vYmotJChPSykKKwktbWtkaXIgLXAgJChPVVQpLyQqL2xpYgorCWVjaG8gY29weSBpbmNsdWRlcworCWFyIC1ydiAkQCAkKEdMT1VUKS8kKi8qLm8KKwlyYW5saWIgJEAKKworIyMgQEAgYnVpbGQgZ2x1IHJlbmFtZSBmaWxlcworZ2x1cmVuczogJChHTFVSRU5fSUNVKQorCisjIGJ1aWxkIHNpbmdsZSBnbHVyZW4uaCAKKyQoQlVJTEQpLyUvJChHTFVSRU5fSCk6ICQoQlVJTEQpLyUvb2sgTWFrZWZpbGUKKwktbWtkaXIgLXAgJChCVUlMRCkvJCovJChHTFVSRU4pCisJY2F0ICQoR0xVRSkvZ2x1cmVuLXRvcC5oID4gJEAKKwllY2hvICIjZGVmaW5lIEdMVVJFTl9WRVIiICQqID4+ICRACisJZWNobyAiI2RlZmluZSBHTFVSRU5fVElOWSIgJChzaGVsbCBlY2hvICQqIHwgY3V0IC1kXyAtZjEtMikgPj4gJEAKKwllY2hvID4+ICRACisJZWNobyA+PiAkQAorCWVjaG8gPj4gJEAKKwlncmVwICJeI2RlZmluZS4qJChzaGVsbCBlY2hvICQqIHwgY3V0IC1kXyAtZjEtMikkJCIgJChTUkMpLyQqLyQoU09VUkNFKS9jb21tb24vdW5pY29kZS91cmVuYW1lLmggICB8IGZncmVwIC12ICcqJyB8IFwKKwkJc2VkIC1lICJzQF4jZGVmaW5lIFwoW14gXSpcKSBcKFteIF0qXClAI2RlZmluZSBPSUNVX1wxIFwyQCIgPj4gJEAKKwljYXQgJChHTFVFKS9nbHVyZW4tYm90dG9tLmggPj4gJEAKKworCiskKEJVSUxEKS8lL2NvbmZpZy8kKElDVV9DT05GSUcpOiAkKEJVSUxEKS8lL2NvbmZpZy8kKElDVV9DT05GSUdfT1JJRykgaWN1LWNvbmZpZy5zZWQgJChCVUlMRCkvJS9vayAKKwlzZWQgLWYgaWN1LWNvbmZpZy5zZWQgPCAkKEJVSUxEKS8kKi9jb25maWcvJChJQ1VfQ09ORklHX09SSUcpID4gICQoQlVJTEQpLyQqL2NvbmZpZy8kKElDVV9DT05GSUcpICYmIGNobW9kIGErcnggICQoQlVJTEQpLyQqL2NvbmZpZy8kKElDVV9DT05GSUcpCisKKyMgc21pbGluZyBub3cuCisjIHBlcmZvcm0gaW5zdGFsbGF0aW9uCiskKElOU1QpLyUvb2s6ICQoQlVJTEQpLyUvb2sKKwllY2hvICJJTlNUICIgIlsiICQqICJdIgorCW1rZGlyIC1wICQoSU5TVCkvJCoKKwktJChNQUtFKSAkKE1PUFRTKSAtQyAkKEJVSUxEKS8kKiBpbnN0YWxsICQoTUFLRV9JTlNUQUxMX1hUUkFfT1BUUykgCisJdG91Y2ggJEAKKworIyB1bnBhY2sgSUNVIGFuZCBwYXRjaAorJChTUkMpLyUvb2s6ICQoSUNVUykvaWN1NGMtJS1zcmMudGd6CisJLVsgLWQgJChTUkMpLyQqIF0gJiYgcm0gLXJmICQoU1JDKS8kKgorCUBlY2hvICJVbnBhY2tpbmciICQqCisJbWtkaXIgLXAgJChTUkMpLyQqCisJKCBjZCAkKFNSQykvJCogJiYgdGFyIHhmcHogJChUT1ApLyQoSUNVUykvaWN1NGMtJCotc3JjLnRneiApCisJQGVjaG8gU2hvdWxkIHBhdGNoICQqIGhlcmUKKwl0b3VjaCAkQAorCisjIGNvbmZpZyAKKyQoQlVJTEQpLyUvY29uZmlnLnN0YXR1czogJChTUkMpLyUvb2sKKwlAZWNobyAiQ29uZmlnZ2luZyIgJCoKKwktWyAtZCAkKEJVSUxEKS8kKiBdICYmIHJtIC1yZiAkKEJVSUxEKS8kKgorCW1rZGlyIC1wICQoQlVJTEQpLyQqCisJKCBjZCAkKEJVSUxEKS8kKiAmJiBlbnYgQ0ZMQUdTPSQoUEJMRF9FWFRSQV9GTEFHUykgQ1hYRkxBR1M9JChQQkxEX0VYVFJBX0ZMQUdTKSAkKHNoZWxsICQoU1VQRVJDT05GKSAkKFRPUCkvJChTUkMpLyQqLyQoU09VUkNFKSAkKikgJChDT05GSUdVUkVfT1BUUykgLS1zcmNkaXI9JChUT1ApLyQoU1JDKS8kKi8kKFNPVVJDRSkgLS1wcmVmaXg9JChUT1ApLyQoSU5TVCkvJCogKQorCisjIGJ1aWxkIAorIyBub3RlOiByZWdleCBoYWQgcmVuYW1pbmcgcHJvYmxlbXMsIGFuZCBzcG9vZiBkZXBlbmRzIG9uIHJlZ2V4LiBOdWtlIHRoZW0uCiskKEJVSUxEKS8lL29rOiAkKEJVSUxEKS8lL2NvbmZpZy5zdGF0dXMKKwlAZWNobyAiQnVpbGRpbmciICQqCisJKCAkKE1BS0UpICAkKE1PUFRTKSAtQyAkKEJVSUxEKS8kKiBhbGwgJChNQUtFX1hUUkFfT1BUUykgKQorCUBpZiBbICEgLWYgJChCVUlMRCkvJCovY29tbW9uL3B1dGlsLmFvIF07IFwKKwl0aGVuIFwKKwkJZWNobyByZS11bnBhY2tpbmcgJChCVUlMRCkvJCovY29tbW9uIDsgXAorCQkoIGNkICQoQlVJTEQpLyQqL2NvbW1vbiAmJiBhciB4ZiAuLi9saWIvbGlic2ljdXVjLmEgfHwgZWNobyBjb3VsZCBub3QgdW5wYWNrIC4uL2xpYi9saWJzaWN1dWMuYSApIDsgXAorCQllY2hvIHJlLXVucGFja2luZyAkKEJVSUxEKS8kKi9pMThuIDsgXAorCQkoIGNkICQoQlVJTEQpLyQqL2kxOG4gJiYgYXIgeGYgLi4vbGliL2xpYnNpY3VpMThuLmEgfHwgZWNobyBjb3VsZCBub3QgdW5wYWNrIC4uL2xpYi9saWJzaWN1aTE4bi5hICkgOyBcCisJZmkKKwlAaWYgWyAhIC1mICQoQlVJTEQpLyQqL2NvbW1vbi9wdXRpbC5hbyBdOyBcCisJdGhlbiBcCisJCWVjaG8gRVJST1I6IHN0aWxsIGNvdWxkIG5vdCBmaW5kICQoQlVJTEQpLyQqL2NvbW1vbi9wdXRpbC5hbyAtIGJ1aWxkIG1heSBmYWlsLjsgXAorCWZpCisJLXJtIC1mICQoQlVJTEQpLyQqL2kxOG4vdXJlZ2V4Ki4qICQoQlVJTEQpLyQqL2kxOG4vdXNwb29mKi4qbyoKKwl0b3VjaCAkQAorCitpbmZvIGhlbHA6CisJQGVjaG8gSUNVIFByb3ZpZGVyIEJ1aWxkCisJQGVjaG8gIlRhcmdldHRpbmcgUHJvdmlkZXIgYWdhaW5zdCBJQ1UgJChQUk9WSURFUl9UQVJHRVQpICgkKFBMVUdMSUIpLCBtYWpvciAkKFBMVUdMSUJfTUFKKSkiCisJQGVjaG8gIkF2YWlsYWJsZSBwbHVnaW5zOiAkKFBST1ZJREVSX0FWQUlMQUJMRSkgKCQoUExVR0xJQl9BVkFJTEFCTEUpKSIKKwlAZWNobyAiQXZhaWxhYmxlIGtleXdvcmRzOiIKKwlAZm9yIHZlciBpbiAkKFBST1ZJREVSX0FWQUlMQUJMRSk7IGRvIFwKKwkJZWNobyAiICAgLi4uQHByb3ZpZGVyPWljdSJgZWNobyAkJHZlciB8IGN1dCAtZC4gLWYxLTIgfCB0ciAtZCAuYDsgXAorCWRvbmUKKwlAZWNobyAiUGx1Z2luIGxpYnJhcnkgd2lsbCBiZSAkKFBMVUdMSUJfTkFNRSkiCisJQGVjaG8KKwlAZWNobyBBdmFpbGFibGUgSUNVIHRhcmJhbGxzOiAgJChJQ1VfVEFSQkFMTFMpCisJQGVjaG8gQXZhaWxhYmxlIElDVSB2ZXJzaW9uczogJChzaGVsbCBlY2hvICQoSUNVX1RBUkJBTExTX1ZFUlMpIHwgdHIgJ18nICcuJykKKworJChPVVQpLyQoUExVR0xJQikvcHJvdmlkZXJfdmVyc2lvbi5oOiBNYWtlZmlsZS5sb2NhbCBNYWtlZmlsZQorCUBlY2hvIEdlbmVyYXRpbmcgJEAgLi4KKwlAZWNobyAiLyogR2VuZXJhdGVkIGZpbGUuICovIiA+ICRACisJQGVjaG8gImNvbnN0IGNoYXIgKnByb3ZpZGVyX3ZlcnNpb25bXSA9IHsiID4+ICRACisJQGZvciB2ZXIgaW4gJChQUk9WSURFUl9BVkFJTEFCTEUpOyBkbyBcCisJCWVjaG8gJyInYGVjaG8gJCR2ZXIgfCBjdXQgLWQuIC1mMS0yIHwgdHIgLWQgLmAnIiwnID4+ICRAIDsgXAorCWRvbmUKKwlAZWNobyAiIH07ICIgPj4gJEAKKwlAZWNobyAiI2RlZmluZSBQUk9WSURFUl9DT1VOVCAoc2l6ZW9mKHByb3ZpZGVyX3ZlcnNpb24pL3NpemVvZihwcm92aWRlcl92ZXJzaW9uWzBdKSkiID4+ICRACisJQGVjaG8gPj4gJEAKKworIy0tIGZvciB0aGUgcHJvdG90eXBlCmRpZmYgLS1naXQgYS9tdWx0aS9wcm9qL3Byb3ZpZGVyL01ha2VmaWxlLmxvY2FsLXNhbXBsZSBiL211bHRpL3Byb2ovcHJvdmlkZXIvTWFrZWZpbGUubG9jYWwtc2FtcGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ZThjOGEKLS0tIC9kZXYvbnVsbAorKysgYi9tdWx0aS9wcm9qL3Byb3ZpZGVyL01ha2VmaWxlLmxvY2FsLXNhbXBsZQpAQCAtMCwwICsxLDMyIEBACisjCisjIENvcHlyaWdodCAoQykgMjAwOC0yMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkCisKKyMgbG9jYWwgZGVmaW5pdGlvbnMgbXVzdCBnbyBpbiBNYWtlZmlsZS5sb2NhbAorIyBleGFtcGxlOgorCisjIworIyMgVGhlc2UgdHdvIGFyZSBSRVFVSVJFRC4KKyMjCisKKyMgVGhlIHZlcnNpb24gb2YgSUNVIHlvdSB3aWxsIGJ1aWxkIGFnYWluc3QsIHN1Y2ggYXM6ICAKKyMgRVhBTVBMRTogNC40LjIKK1BST1ZJREVSX1RBUkdFVD00LjQuMgorCisjIFRoZSB2ZXJzaW9ucyBvZiBJQ1UgeW91IHdhbnQgdG8gaGF2ZSBhdmFpbGFibGUgaW4gdGhlIHBsdWdpbi4gU3BhY2Ugc2VwYXJhdGVkLiAgRG9uJ3QgaW5jbHVkZSB0aGUgUFJPVklERVJfVEFSR0VUIHZlcnNpb24uCisjIEVYQU1QTEU6IDMuOC4xICA0LjIuMC4xCitQUk9WSURFUl9BVkFJTEFCTEU9My44LjEgNC4yLjAuMQorCisKKworCisKKyMjCisjIyBmb2xsb3dpbmcgYXJlIE9QVElPTkFMCisjIworCisjIyBkZWJ1ZyBvcHRpb25zCisjRVhUUkFfQ09NUElMRV9PUFRTPS1nCisKKyMjIGNvbmZpZ3VyZSBvcHRpb25zCisjRVhUUkFfQ09ORklHVVJFX09QVFM9LS13aXRoLWxpYnJhcnktc3VmZml4PXNybAorCmRpZmYgLS1naXQgYS9tdWx0aS9wcm9qL3Byb3ZpZGVyL2NvbGRpZmYuY3BwIGIvbXVsdGkvcHJvai9wcm92aWRlci9jb2xkaWZmLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmViYmJiCi0tLSAvZGV2L251bGwKKysrIGIvbXVsdGkvcHJvai9wcm92aWRlci9jb2xkaWZmLmNwcApAQCAtMCwwICsxLDEyMSBAQAorLyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcworKiAgIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworI2luY2x1ZGUgPHVuaWNvZGUvY29sbC5oPgorI2luY2x1ZGUgPHVuaWNvZGUvdWNsZWFuLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworCisvKiBTdHJpbmcgdG8gdXNlLiAqLworY29uc3QgVUNoYXIgc3R1ZmZbXSA9IHsgMHgzMEJCLCAweDBkNGMsIDB4NTMsIDB4NzQsIDB4NzUsIDB4NjYsIDB4NjYsIDB4MDAgfTsgLyogU3R1ZmYgKi8KKworI2luY2x1ZGUgInByb3ZpZGVyX3ZlcnNpb24uaCIKKworCisjZGVmaW5lIExPQ0FMRV9DT1VOVCA0Citjb25zdCBjaGFyICpsb2NhbGVbTE9DQUxFX0NPVU5UXSA9IHsgImZpIiwgImVuX1VTIiwgImphIiwgIm1sIiB9OyAvKiBMaXN0IG9mIGxvY2FsZXMgdG8gdGVzdCAqLworCisvKioKKyAqIFNldCB1cCBJQ1UsIHByaW50ICMgb2YgYXZhaWxhYmxlIGNvbGxhdG9ycworICovCit2b2lkIHNldHVwKFVFcnJvckNvZGUgJnN0YXR1cykgeworICAgIHVfaW5pdCgmc3RhdHVzKTsKKyAgCisgICAgZnByaW50ZihzdGRlcnIsICJJQ1UgJXMgaW5pdDogJXNcbiIsIFVfSUNVX1ZFUlNJT04sIHVfZXJyb3JOYW1lKHN0YXR1cykpOworCisgICAgaW50MzJfdCBjb3VudDsKKyAgICBTdHJpbmdFbnVtZXJhdGlvbiAqc2UgPSBDb2xsYXRvcjo6Z2V0QXZhaWxhYmxlTG9jYWxlcygpOworICAgIGNvdW50ID0gc2UtPmNvdW50KHN0YXR1cyk7CisgICAgZnByaW50ZihzdGRlcnIsICIjIENvbGxhdG9ycyBub3cgYXZhaWxhYmxlOiAlZCxcdCVzIC0gJWQgcHJvdmlkZXJzIGV4cGVjdGVkLlxuIiwgY291bnQsIHVfZXJyb3JOYW1lKHN0YXR1cyksIFBST1ZJREVSX0NPVU5UKTsKK30KKworaW50IG1haW4oaW50IC8qIGFyZ2MqLyAsIGNvbnN0IGNoYXIgKiAvKmFyZ3YqLyBbXSkgeworICAgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworICAgIGludCBkaWZmcyA9IDA7CisgICAgc2V0dXAoc3RhdHVzKTsKKyAgICBpZihVX0ZBSUxVUkUoc3RhdHVzKSkgcmV0dXJuIDE7CisKKyAgICBpbnQgZXhwZWN0ZWQgPSBQUk9WSURFUl9DT1VOVDsKKworICAgIGZvcihpbnQgbD0wO2w8TE9DQUxFX0NPVU5UO2wrKykgeworICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIHVpbnQ4X3Qgb2xkQnl0ZXNbMjAwXTsKKyAgICAgICAgaW50MzJfdCBvbGRMZW4gPSAtMTsKKyAgICAgICAgZm9yKGludCB2PTA7djw9ZXhwZWN0ZWQ7disrKSB7CisKKyAgICAgICAgICAgIC8vIENvbnN0cnVjdCB0aGUgbG9jYWxlIElECisgICAgICAgICAgICBjaGFyIGxvY0lEWzIwMF07CisgICAgICAgICAgICBzdHJjcHkobG9jSUQsIGxvY2FsZVtsXSk7CisgICAgICAgICAgICBpZigodiE9ZXhwZWN0ZWQpKSB7IC8vIC0xID0gbm8gdmVyc2lvbgorICAgICAgICAgICAgICAgIHN0cmNhdChsb2NJRCwgIkBzcD1pY3UiKTsKKyAgICAgICAgICAgICAgICBzdHJjYXQobG9jSUQsIHByb3ZpZGVyX3ZlcnNpb25bdl0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBwcmludGYoIiUyOHMgOiAiLCBsb2NJRCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFVFcnJvckNvZGUgc3ViU3RhdHVzID0gVV9aRVJPX0VSUk9SOworICAgICAgICAgICAgdWludDhfdCBieXRlc1syMDBdOworI2RlZmluZSBVU0VfQ1hYIDAKKworI2lmIFVTRV9DWFgKKyAgICAgICAgICAgIENvbGxhdG9yICpjb2wgPSBDb2xsYXRvcjo6Y3JlYXRlSW5zdGFuY2UoTG9jYWxlKGxvY0lEKSxzdWJTdGF0dXMpOworICAgICAgICAgICAgaWYoVV9GQUlMVVJFKHN1YlN0YXR1cykpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIkVSUjogJXNcbiIsIHVfZXJyb3JOYW1lKHN1YlN0YXR1cykpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50MzJfdCBsZW4gPSBjb2wtPmdldFNvcnRLZXkoc3R1ZmYsIC0xLCBieXRlcywgMjAwKTsKKyNlbHNlCisjaWYgMQorICAgICAgICAgICAgY2hhciB4YnVmMlsyMDBdOworICAgICAgICAgICAgc3RyY3B5KHhidWYyLCJYLyIpOworICAgICAgICAgICAgc3RyY2F0KHhidWYyLGxvY0lEKTsKKyAgICAgICAgICAgIHN0cmNhdCh4YnVmMiwiLyIpOworICAgICAgICAgICAgcHJpbnRmKCIgLT4gJXNcbiIsIHhidWYyKTsKKyAgICAgICAgICAgIFVDb2xsYXRvciAqY29sID0gdWNvbF9vcGVuRnJvbVNob3J0U3RyaW5nKHhidWYyLCBGQUxTRSxOVUxMLCAmc3ViU3RhdHVzKTsKKyNlbHNlCisgICAgICAgICAgICBVQ29sbGF0b3IgKmNvbCA9IHVjb2xfb3Blbihsb2NJRCwgJnN1YlN0YXR1cyk7CisjZW5kaWYKKyAgICAgICAgICAgIGlmKFVfRkFJTFVSRShzdWJTdGF0dXMpKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJFUlI6ICVzXG4iLCB1X2Vycm9yTmFtZShzdWJTdGF0dXMpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludDMyX3QgbGVuID0gdWNvbF9nZXRTb3J0S2V5KGNvbCwgc3R1ZmYsIC0xLCBieXRlcywgMjAwKTsKKyNlbmRpZgorCisgICAgICAgICAgICBmb3IoaW50IGk9MDtpPGxlbjtpKyspIHsKKwkgICAgICBpZihpPG9sZExlbiYmYnl0ZXNbaV0hPW9sZEJ5dGVzW2ldKSB7CisgICAgICAgICAgICAgICAgICBkaWZmcysrOworICAgICAgICAgICAgICAgICAgcHJpbnRmKCIqIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIHByaW50ZigiICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcmludGYoIiUwMlgiLCAoMHhGRiZieXRlc1tpXSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworI2lmIFVTRV9DWFgKKyAgICAgICAgICAgIGRlbGV0ZSBjb2w7CisjZWxzZQorICAgICAgICAgICAgdWNvbF9jbG9zZShjb2wpOworI2VuZGlmCisKKyAgICAgICAgICAgIG9sZExlbiA9IGxlbjsKKyAgICAgICAgICAgIG1lbWNweShvbGRCeXRlcywgYnl0ZXMsIGxlbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZihkaWZmcz09MCkgeworICAgICAgcHJpbnRmKCJFUlJPUjogMCBkaWZmZXJlbmNlcyBmb3VuZCBiZXR3ZWVuIHBsYXRmb3Jtcy4uIGFyZSB0aGUgcGxhdGZvcm1zIGluc3RhbGxlZD8gVHJ5ICdpY3VpbmZvIC1MJ1xuIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50ZigiJWQgZGlmZmVyZW5jZXMgZm91bmQgYW1vbmcgcHJvdmlkZXIgdmVyc2lvbnMuIFN1Y2Nlc3MhXG4iLCBkaWZmcyk7CisgICAgfQorICAgIAorICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbXVsdGkvcHJvai9wcm92aWRlci9leHBvcnQudHh0IGIvbXVsdGkvcHJvai9wcm92aWRlci9leHBvcnQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YWI3ODQKLS0tIC9kZXYvbnVsbAorKysgYi9tdWx0aS9wcm9qL3Byb3ZpZGVyL2V4cG9ydC50eHQKQEAgLTAsMCArMSwyIEBACisjIENvcHlyaWdodCAoQykgMjAxMCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAorX2NvbGxfcHJvdmlkZXJfcGx1Z2luCmRpZmYgLS1naXQgYS9tdWx0aS9wcm9qL3Byb3ZpZGVyL2dsdWUvX3ZlcnNpb25saXN0Xy5jcHAgYi9tdWx0aS9wcm9qL3Byb3ZpZGVyL2dsdWUvX3ZlcnNpb25saXN0Xy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAxMDYwOQotLS0gL2Rldi9udWxsCisrKyBiL211bHRpL3Byb2ovcHJvdmlkZXIvZ2x1ZS9fdmVyc2lvbmxpc3RfLmNwcApAQCAtMCwwICsxLDM2IEBACisvKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIENvcHlyaWdodCAoQykgMjAwOSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcworKiAgIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworI2luY2x1ZGUgPGljdWdsdWUvaWN1Z2x1ZS5oPgorI2luY2x1ZGUgPHVuaWNvZGUvY29sbC5oPgorCisKKyNpZiBkZWZpbmVkICggSUNVR0xVRV9WRVIgKQorLy8jZXJyb3IgREVGSU5FRCEKKyNlbHNlCisKKyNkZWZpbmUgR0xVRV9WRVIoeCkgcHV0cygiVmVyc2lvbiAiICMgeCApOworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworLy8gZ2VuZXJhdGUgbGlzdCBvZiB2ZXJzaW9ucworI2luY2x1ZGUgPGljdWdsdWUvZmVfdmVybGlzdC5oPgorCitpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqYXJndltdKSB7CitwcmludGYoIkknbSBvbiAiIFVfSUNVX1ZFUlNJT04gIiBidXQgaSBoYXZlIG1vZHVsZXMgZm9yOiBcbiIpOworICBmb3IoaW50IGk9MDtmZV92ZXJsaXN0W2ldO2krKykgeworICAgICAgcHJpbnRmKCIlZDogJXNcbiIsIGksIGZlX3Zlcmxpc3RbaV0pOworICB9Cit9CisKKyNlbmRpZgorCisKKworCmRpZmYgLS1naXQgYS9tdWx0aS9wcm9qL3Byb3ZpZGVyL2dsdWUvY29sbF9iZS5jIGIvbXVsdGkvcHJvai9wcm92aWRlci9nbHVlL2NvbGxfYmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGUyZjIyCi0tLSAvZGV2L251bGwKKysrIGIvbXVsdGkvcHJvai9wcm92aWRlci9nbHVlL2NvbGxfYmUuYwpAQCAtMCwwICsxLDEwIEBACisvKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIENvcHlyaWdodCAoQykgMjAwOSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcworKiAgIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworLyogKi8KZGlmZiAtLWdpdCBhL211bHRpL3Byb2ovcHJvdmlkZXIvZ2x1ZS9jb2xsX2JlLmNwcCBiL211bHRpL3Byb2ovcHJvdmlkZXIvZ2x1ZS9jb2xsX2JlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGVkMjczCi0tLSAvZGV2L251bGwKKysrIGIvbXVsdGkvcHJvai9wcm92aWRlci9nbHVlL2NvbGxfYmUuY3BwCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgQ29weXJpZ2h0IChDKSAyMDA5LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzCisqICAgQ29ycG9yYXRpb24gYW5kIG90aGVycy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisKKworI2luY2x1ZGUgPHVuaWNvZGUvY29sbC5oPgorI2luY2x1ZGUgPGljdWdsdWUvY29sbF9iZS5oPgorWFBfQ1BMVVNQTFVTCisKKworCitleHRlcm4gIkMiIHsKKyAgICAKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tdWx0aS9wcm9qL3Byb3ZpZGVyL2dsdWUvY29sbF9mZS5jIGIvbXVsdGkvcHJvai9wcm92aWRlci9nbHVlL2NvbGxfZmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjY3MmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbXVsdGkvcHJvai9wcm92aWRlci9nbHVlL2NvbGxfZmUuYwpAQCAtMCwwICsxLDE5IEBACisvKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIENvcHlyaWdodCAoQykgMjAwOSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcworKiAgIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworLyoKK25vdCBuZWVkZWQuCisqLworCisKK2V4dGVybiB2b2lkIG5vdF9uZWVkZWQgKCkgeworCXJldHVybjsKK30KKworCmRpZmYgLS1naXQgYS9tdWx0aS9wcm9qL3Byb3ZpZGVyL2dsdWUvY29sbF9mZS5jcHAgYi9tdWx0aS9wcm9qL3Byb3ZpZGVyL2dsdWUvY29sbF9mZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJhYjJjZgotLS0gL2Rldi9udWxsCisrKyBiL211bHRpL3Byb2ovcHJvdmlkZXIvZ2x1ZS9jb2xsX2ZlLmNwcApAQCAtMCwwICsxLDQ5OSBAQAorLyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcworKiAgIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworI2lmbmRlZiBDT0xMX0ZFX0RFQlVHCisjZGVmaW5lIENPTExfRkVfREVCVUcgMAorI2VuZGlmCisKKyNpbmNsdWRlIDxpY3VnbHVlL2ljdWdsdWUuaD4KKyNpbmNsdWRlIDx1bmljb2RlL2NvbGwuaD4KKy8vI2luY2x1ZGUgPHVuaWNvZGUvdGJsY29sbC5oPgorI2luY2x1ZGUgPHVuaWNvZGUvdWNvbC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAidW5pY29kZS91c3RyaW5nLmgiCisKKy8vIHRoZXNlIGZyb20gdGJsY29sbC5oCitzdGF0aWMgQ29sbGF0b3I6OkVDb2xsYXRpb25TdHJlbmd0aCBfZ2V0RUNvbGxhdGlvblN0cmVuZ3RoKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUNvbGxhdGlvblN0cmVuZ3RoICZzdHJlbmd0aCkgCit7CisgICAgc3dpdGNoIChzdHJlbmd0aCkKKyAgICB7CisgICAgY2FzZSBVQ09MX1BSSU1BUlkgOgorICAgICAgICByZXR1cm4gQ29sbGF0b3I6OlBSSU1BUlk7CisgICAgY2FzZSBVQ09MX1NFQ09OREFSWSA6CisgICAgICAgIHJldHVybiBDb2xsYXRvcjo6U0VDT05EQVJZOworICAgIGNhc2UgVUNPTF9URVJUSUFSWSA6CisgICAgICAgIHJldHVybiBDb2xsYXRvcjo6VEVSVElBUlk7CisgICAgY2FzZSBVQ09MX1FVQVRFUk5BUlkgOgorICAgICAgICByZXR1cm4gQ29sbGF0b3I6OlFVQVRFUk5BUlk7CisgICAgZGVmYXVsdCA6CisgICAgICAgIHJldHVybiBDb2xsYXRvcjo6SURFTlRJQ0FMOworICAgIH0KK30KKworc3RhdGljIFVDb2xsYXRpb25TdHJlbmd0aCBfZ2V0VUNvbGxhdGlvblN0cmVuZ3RoKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb2xsYXRvcjo6RUNvbGxhdGlvblN0cmVuZ3RoICZzdHJlbmd0aCkgCit7CisgICAgc3dpdGNoIChzdHJlbmd0aCkKKyAgICB7CisgICAgY2FzZSBDb2xsYXRvcjo6UFJJTUFSWSA6CisgICAgICAgIHJldHVybiBVQ09MX1BSSU1BUlk7CisgICAgY2FzZSBDb2xsYXRvcjo6U0VDT05EQVJZIDoKKyAgICAgICAgcmV0dXJuIFVDT0xfU0VDT05EQVJZOworICAgIGNhc2UgQ29sbGF0b3I6OlRFUlRJQVJZIDoKKyAgICAgICAgcmV0dXJuIFVDT0xfVEVSVElBUlk7CisgICAgY2FzZSBDb2xsYXRvcjo6UVVBVEVSTkFSWSA6CisgICAgICAgIHJldHVybiBVQ09MX1FVQVRFUk5BUlk7CisgICAgZGVmYXVsdCA6CisgICAgICAgIHJldHVybiBVQ09MX0lERU5USUNBTDsKKyAgICB9Cit9CisKKworLyoqCisgKiBNYWNybyB0byBkZWZpbmUgdGhlIENvbGxhdG9yX2dsdWVfNF8yIGNsYXNzIAorICovCisjZGVmaW5lIEdMVUVfVkVSKHgpIGNsYXNzIEdMVUVfU1lNX1YoIENvbGxhdG9yLCB4ICkgOiBwdWJsaWMgQ29sbGF0b3IgeyAgXAorICAgIFwKKyAgcHVibGljOiAgc3RhdGljIENvbGxhdG9yICpjcmVhdGUoY29uc3QgTG9jYWxlICZsb2MsIGNvbnN0IGNoYXIgKnZlcik7IFwKKyAgcHJpdmF0ZTogVUNvbGxhdG9yICpfdGhpczsgR0xVRV9TWU1fViggQ29sbGF0b3IsIHggKSAoIFVDb2xsYXRvciogdG4gKSA6IF90aGlzKHRuKXt9IFwKKyAgICB2aXJ0dWFsIH4gR0xVRV9TWU1fViAoIENvbGxhdG9yLCB4KSAoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2aXJ0dWFsIHZvaWQqIGdldER5bmFtaWNDbGFzc0lEKCkgY29uc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0aWMgdm9pZCogZ2V0U3RhdGljQ2xhc3NJRCgpIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2aXJ0dWFsIENvbGxhdG9yKiBjbG9uZSgpIGNvbnN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2aXJ0dWFsIFVDb2xsYXRpb25SZXN1bHQgY29tcGFyZShjb25zdCBVbmljb2RlU3RyaW5nJiwgY29uc3QgVW5pY29kZVN0cmluZyYsIFVFcnJvckNvZGUmKSBjb25zdDsgXAorICAgIHZpcnR1YWwgVUNvbGxhdGlvblJlc3VsdCBjb21wYXJlKGNvbnN0IFVuaWNvZGVTdHJpbmcmLCBjb25zdCBVbmljb2RlU3RyaW5nJiwgaW50MzJfdCwgVUVycm9yQ29kZSYpIGNvbnN0OyBcCisgICAgdmlydHVhbCBVQ29sbGF0aW9uUmVzdWx0IGNvbXBhcmUoY29uc3QgVUNoYXIqLCBpbnQzMl90LCBjb25zdCBVQ2hhciosIGludDMyX3QsIFVFcnJvckNvZGUmKSBjb25zdDsgXAorICAgIHZpcnR1YWwgQ29sbGF0aW9uS2V5JiBnZXRDb2xsYXRpb25LZXkoY29uc3QgVW5pY29kZVN0cmluZyYsIENvbGxhdGlvbktleSYsIFVFcnJvckNvZGUmKSBjb25zdDsgXAorICAgIHZpcnR1YWwgQ29sbGF0aW9uS2V5JiBnZXRDb2xsYXRpb25LZXkoY29uc3QgVUNoYXIqLCBpbnQzMl90LCBDb2xsYXRpb25LZXkmLCBVRXJyb3JDb2RlJikgY29uc3Q7IFwKKyAgICB2aXJ0dWFsIGludDMyX3QgaGFzaENvZGUoKSBjb25zdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2aXJ0dWFsIGNvbnN0IExvY2FsZSBnZXRMb2NhbGUoVUxvY0RhdGFMb2NhbGVUeXBlLCBVRXJyb3JDb2RlJikgY29uc3Q7IFwKKyAgICB2aXJ0dWFsIEVDb2xsYXRpb25TdHJlbmd0aCBnZXRTdHJlbmd0aCgpIGNvbnN0OyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2aXJ0dWFsIHZvaWQgc2V0U3RyZW5ndGgoRUNvbGxhdGlvblN0cmVuZ3RoKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2aXJ0dWFsIHZvaWQgZ2V0VmVyc2lvbih1aW50OF90KikgY29uc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2aXJ0dWFsIHZvaWQgc2V0QXR0cmlidXRlKFVDb2xBdHRyaWJ1dGUsIFVDb2xBdHRyaWJ1dGVWYWx1ZSwgVUVycm9yQ29kZSYpOyBcCisgICAgdmlydHVhbCBVQ29sQXR0cmlidXRlVmFsdWUgZ2V0QXR0cmlidXRlKFVDb2xBdHRyaWJ1dGUsIFVFcnJvckNvZGUmKTsgXAorICAgIHZpcnR1YWwgdWludDMyX3Qgc2V0VmFyaWFibGVUb3AoY29uc3QgVUNoYXIqLCBpbnQzMl90LCBVRXJyb3JDb2RlJik7IFwKKyAgICB2aXJ0dWFsIHVpbnQzMl90IHNldFZhcmlhYmxlVG9wKFVuaWNvZGVTdHJpbmcsIFVFcnJvckNvZGUmKTsgICAgICAgIFwKKyAgICB2aXJ0dWFsIHZvaWQgc2V0VmFyaWFibGVUb3AodWludDMyX3QsIFVFcnJvckNvZGUmKTsgICAgICAgICAgICAgICAgIFwKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFZhcmlhYmxlVG9wKFVFcnJvckNvZGUmKSBjb25zdDsgICAgICAgICAgICAgICAgIFwKKyAgICB2aXJ0dWFsIENvbGxhdG9yKiBzYWZlQ2xvbmUoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2aXJ0dWFsIGludDMyX3QgZ2V0U29ydEtleShjb25zdCBVbmljb2RlU3RyaW5nJiwgdWludDhfdCosIGludDMyX3QpIGNvbnN0OyBcCisgICAgdmlydHVhbCBpbnQzMl90IGdldFNvcnRLZXkoY29uc3QgVUNoYXIqLCBpbnQzMl90LCB1aW50OF90KiwgaW50MzJfdCkgY29uc3Q7IFwKKyAgcHVibGljOiBzdGF0aWMgaW50MzJfdCBjb3VudEF2YWlsYWJsZSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHVibGljOiBzdGF0aWMgaW50MzJfdCBhcHBlbmRBdmFpbGFibGUoVW5pY29kZVN0cmluZyogc3RycywgaW50MzJfdCBpLCBpbnQzMl90IGNvdW50KTsgXAorICB9OworCisvKiogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFRoZSBmb2xsb3dpbmcgY29kZSBydW5zIGluc2lkZSB0aGUgJ3RhcmdldCcgdmVyc2lvbiAoaS5lLiBvbGQgSUNVKSA9PT09PT09PT09ICoqLworI2lmIGRlZmluZWQgKCBJQ1VHTFVFX1ZFUiApCisKKy8qIGNvZGUgZm9yIHNvbWUgdmVyc2lvbiAqLworI2luY2x1ZGUgPGljdWdsdWUvZ2x1cmVuLmg+CisKKy8qKgorICAgdWNsZWFuLmgKKyovCitVX1NUQUJMRSB2b2lkIFVfRVhQT1JUMgorT0lDVV91X2luaXQoVUVycm9yQ29kZSAqc3RhdHVzKTsKKworLyoqCisgdWNvbC5oCisqLworVV9TVEFCTEUgVUNvbGxhdG9yKiBVX0VYUE9SVDIgCitPSUNVX3Vjb2xfb3Blbihjb25zdCBjaGFyICpsb2MsIFVFcnJvckNvZGUmIHN0YXR1cyk7CisKK1VfU1RBQkxFIHZvaWQgVV9FWFBPUlQyIAorT0lDVV91Y29sX2Nsb3NlKFVDb2xsYXRvciopOworCitVX1NUQUJMRSBVQ29sbGF0aW9uUmVzdWx0IE9JQ1VfdWNvbF9zdHJjb2xsCSgJY29uc3QgVUNvbGxhdG9yICogCWNvbGwsCitjb25zdCBVQ2hhciAqIAlzb3VyY2UsCitpbnQzMl90IAlzb3VyY2VMZW5ndGgsCitjb25zdCBVQ2hhciAqIAl0YXJnZXQsCitpbnQzMl90IAl0YXJnZXRMZW5ndGgJIAorKTsKKworVV9TVEFCTEUgaW50MzJfdCBVX0VYUE9SVDIgCitPSUNVX3Vjb2xfY291bnRBdmFpbGFibGUoKTsKKworVV9TVEFCTEUgdm9pZCBVX0VYUE9SVDIgCitPSUNVX3Vjb2xfc2V0U3RyZW5ndGgoY29uc3QgVUNvbGxhdG9yICosIFVDb2xsYXRpb25TdHJlbmd0aCApOworCitVX1NUQUJMRSBjb25zdCBjaGFyICogVV9FWFBPUlQyIAorT0lDVV91Y29sX2dldEF2YWlsYWJsZShpbnQzMl90IGkpOworCitVX1NUQUJMRSBVQ29sbGF0aW9uU3RyZW5ndGggVV9FWFBPUlQyIAorT0lDVV91Y29sX2dldFN0cmVuZ3RoKFVDb2xsYXRvciAqY29sKTsKKworVV9TVEFCTEUgaW50MzJfdCBVX0VYUE9SVDIgCitPSUNVX3Vjb2xfZ2V0U29ydEtleShjb25zdCAgICBVQ29sbGF0b3IgICAgKmNvbGwsCisgICAgICAgIGNvbnN0ICAgIFVDaGFyICAgICAgICAqc291cmNlLAorICAgICAgICBpbnQzMl90ICAgICAgICBzb3VyY2VMZW5ndGgsCisgICAgICAgIHVpbnQ4X3QgICAgICAgICpyZXN1bHQsCisgICAgICAgIGludDMyX3QgICAgICAgIHJlc3VsdExlbmd0aCk7CisKKworVV9TVEFCTEUgVUNvbGxhdG9yKiBVX0VYUE9SVDIgCitPSUNVX3Vjb2xfc2FmZUNsb25lKGNvbnN0IFVDb2xsYXRvciAqY29sbCwKKyAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAqc3RhY2tCdWZmZXIsCisgICAgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgKnBCdWZmZXJTaXplLAorICAgICAgICAgICAgICAgVUVycm9yQ29kZSAgICAgICpzdGF0dXMpOworCisKKy8qKgorIGVuZCB1Y29sLmgKKyovCisKKy8vIGRlZmluZSB2ZXJzaW9uCitHTFVFX1ZFUiggSUNVR0xVRV9WRVIgKQorCitHTFVFX1NZTSAoIENvbGxhdG9yICkgOjogfiBHTFVFX1NZTShDb2xsYXRvcikgKCkgeworI2lmIENPTExfRkVfREVCVUcKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlZDRiAiIElDVUdMVUVfVkVSX1NUUiAiIHVjb2xfY2xvc2UiKTsKKyNlbmRpZgorICAgIE9JQ1VfdWNvbF9jbG9zZShfdGhpcyk7Cit9CisKKyNpZiAwCitVX0NGVU5DIGludDMyX3QgVV9DQUxMQ09OVgorR0xVRV9TWU0gKCBnbHVlX2NhbGNTb3J0S2V5KSAoY29uc3QgICAgVUNvbGxhdG9yICAgICpjb2xsLAorICAgICAgICBjb25zdCAgICBVQ2hhciAgICAgICAgKnNvdXJjZSwKKyAgICAgICAgaW50MzJfdCAgICAgICAgc291cmNlTGVuZ3RoLAorICAgICAgICB1aW50OF90ICAgICAgICAqKnJlc3VsdCwKKyAgICAgICAgdWludDMyX3QgICAgICAgIHJlc3VsdExlbmd0aCwKKyAgICAgICAgVUJvb2wgYWxsb2NhdGVTS0J1ZmZlciwKKyAgICAgICAgVUVycm9yQ29kZSAqc3RhdHVzKTsKKworI2VuZGlmCisKK0NvbGxhdG9yICoKK0dMVUVfU1lNICggQ29sbGF0b3IgKSA6OiBjcmVhdGUgKGNvbnN0IExvY2FsZSAmbG9jLCBjb25zdCBjaGFyICp2ZXIpIHsKKyAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyAgICBjaGFyIGxvY0J1ZlsyMDBdOworICAgIGNoYXIga3d2QnVmWzIwMF07CisgICAgaW50MzJfdCBsZW4gPSBsb2MuZ2V0S2V5d29yZFZhbHVlKCJjb2xsYXRpb24iLCBrd3ZCdWYsIDIwMCwgc3RhdHVzKTsKKyAgICBzdHJjcHkobG9jQnVmLGxvYy5nZXRCYXNlTmFtZSgpKTsKKyAgICBpZihsZW4+MCkgeworICAgICAgICBzdHJjYXQobG9jQnVmLCJAY29sbGF0b3I9Iik7CisgICAgICAgIHN0cmNhdChsb2NCdWYsa3d2QnVmKTsKKyAgICB9CisgICAgVUNvbGxhdG9yICogdWMgPSAgT0lDVV91Y29sX29wZW4oIGxvY0J1Ziwgc3RhdHVzKTsKKyAgICBpZihVX0ZBSUxVUkUoc3RhdHVzKSkgcmV0dXJuIE5VTEw7IC8vIFRPRE86IEVSUj8KKyAgICBDb2xsYXRvciAqYyA9ICBuZXcgR0xVRV9TWU0oIENvbGxhdG9yICkgKCB1YyApOworI2lmIENPTExfRkVfREVCVUcKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlZDRiAiIElDVUdMVUVfVkVSX1NUUiAiIHVjb2xfb3Blbj0lcyAtPj4gJXBcbiIsIGxvY0J1ZiwgYyk7CisjZW5kaWYKKyAgICByZXR1cm4gYzsKK30KKworVU9CSkVDVF9ERUZJTkVfUlRUSV9JTVBMRU1FTlRBVElPTiggR0xVRV9TWU0oIENvbGxhdG9yICkgKQorCitDb2xsYXRvciogR0xVRV9TWU0gKCBDb2xsYXRvciApIDo6IGNsb25lKCkgY29uc3QgIHsKKyAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyNpZiBDT0xMX0ZFX0RFQlVHCisgICAgZnByaW50ZihzdGRlcnIsICJWQ0YgIiBJQ1VHTFVFX1ZFUl9TVFIgIiBjbG9uZSAlcCAtPiAiICwgdGhpcyk7CisjZW5kaWYKKyAgICBVQ29sbGF0b3IgKmNsYyA9IE9JQ1VfdWNvbF9zYWZlQ2xvbmUoIF90aGlzLCBOVUxMLCAwLCAmc3RhdHVzKTsKKyNpZiBDT0xMX0ZFX0RFQlVHCisgICAgZnByaW50ZihzdGRlcnIsICJWQ0YgIiBJQ1VHTFVFX1ZFUl9TVFIgIiAuLiBzYWZlY2xvbmUgJXMgX3RoaXMgJXAtPiAlcCAiICwgdV9lcnJvck5hbWUoc3RhdHVzKSwgX3RoaXMsIGNsYyk7CisjZW5kaWYKKyAgICBpZihVX0ZBSUxVUkUoc3RhdHVzKXx8Y2xjPT1OVUxMKSByZXR1cm4gTlVMTDsKKyAgICBDb2xsYXRvciAqYyA9IG5ldyBHTFVFX1NZTSggQ29sbGF0b3IgKSAoIGNsYyApOworI2lmIENPTExfRkVfREVCVUcKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlZDRiAiIElDVUdMVUVfVkVSX1NUUiAiIC4uIHdyYXAoJXApIC0+ICVwXG4iLCBjbGMsIGMpOworI2VuZGlmCisKKyAgICByZXR1cm4gYzsKK30KKworCitVQ29sbGF0aW9uUmVzdWx0IEdMVUVfU1lNICggQ29sbGF0b3IgKSA6OiBjb21wYXJlKGNvbnN0IFVuaWNvZGVTdHJpbmcmLCBjb25zdCBVbmljb2RlU3RyaW5nJiwgVUVycm9yQ29kZSYpIGNvbnN0ICB7CisgICAgcmV0dXJuIChVQ29sbGF0aW9uUmVzdWx0KTA7Cit9CisKKworVUNvbGxhdGlvblJlc3VsdCBHTFVFX1NZTSAoIENvbGxhdG9yICkgOjogY29tcGFyZShjb25zdCBVbmljb2RlU3RyaW5nJiwgY29uc3QgVW5pY29kZVN0cmluZyYsIGludDMyX3QsIFVFcnJvckNvZGUmKSBjb25zdCAgeworICAgIHJldHVybiAoVUNvbGxhdGlvblJlc3VsdCkwOworfQorCisKK1VDb2xsYXRpb25SZXN1bHQgR0xVRV9TWU0gKCBDb2xsYXRvciApIDo6IGNvbXBhcmUoY29uc3QgVUNoYXIqIHMsIGludDMyX3Qgc2wsIGNvbnN0IFVDaGFyKiBkICwgaW50MzJfdCBkbCwgVUVycm9yQ29kZSZlICkgY29uc3QgIHsKKyAgICByZXR1cm4gT0lDVV91Y29sX3N0cmNvbGwoX3RoaXMsIHMsIHNsLCBkLCBkbCk7Cit9CisKKyNpbmNsdWRlICJ1bmljb2RlL3NvcnRrZXkuaCIKKworc3RhdGljIENvbGxhdGlvbktleSBrazsKKworQ29sbGF0aW9uS2V5JiBHTFVFX1NZTSAoIENvbGxhdG9yICkgOjogZ2V0Q29sbGF0aW9uS2V5KGNvbnN0IFVuaWNvZGVTdHJpbmcmLCBDb2xsYXRpb25LZXkmLCBVRXJyb3JDb2RlJikgY29uc3QgIHsKKyAgLy8jaWYgQ09MTF9GRV9ERUJVRworICAgIGZwcmludGYoc3RkZXJyLCAgIlZDRiAiIElDVUdMVUVfVkVSX1NUUiAiIEdDSyAtIG5vdGltcCIpOworICAgIC8vI2VuZGlmCityZXR1cm4ga2s7Cit9CisKKworQ29sbGF0aW9uS2V5JiBHTFVFX1NZTSAoIENvbGxhdG9yICkgOjogZ2V0Q29sbGF0aW9uS2V5KGNvbnN0IFVDaGFyKiwgaW50MzJfdCwgQ29sbGF0aW9uS2V5JiwgVUVycm9yQ29kZSYpIGNvbnN0ICB7CisgICAgZnByaW50ZihzdGRlcnIsICAiVkNGICIgSUNVR0xVRV9WRVJfU1RSICIgR0tLMiAtIG5vdGltcCIpOworcmV0dXJuIGtrOworfQorCisKK2ludDMyX3QgR0xVRV9TWU0gKCBDb2xsYXRvciApIDo6IGhhc2hDb2RlKCkgY29uc3QgIHsKKyAgICByZXR1cm4gMDsKK30KKworCitjb25zdCBMb2NhbGUgR0xVRV9TWU0gKCBDb2xsYXRvciApIDo6IGdldExvY2FsZShVTG9jRGF0YUxvY2FsZVR5cGUsIFVFcnJvckNvZGUmKSBjb25zdCAgeworICAgIHJldHVybiBMb2NhbGUoKTsKK30KKworCitDb2xsYXRvcjo6RUNvbGxhdGlvblN0cmVuZ3RoCisgR0xVRV9TWU0gKCBDb2xsYXRvciApIDo6IGdldFN0cmVuZ3RoKCkgY29uc3QgIHsKKyAgICByZXR1cm4gX2dldEVDb2xsYXRpb25TdHJlbmd0aChPSUNVX3Vjb2xfZ2V0U3RyZW5ndGgoX3RoaXMpKTsKK30KKworCit2b2lkIEdMVUVfU1lNICggQ29sbGF0b3IgKSA6OiBzZXRTdHJlbmd0aChFQ29sbGF0aW9uU3RyZW5ndGggcykgIHsKKyAgICBPSUNVX3Vjb2xfc2V0U3RyZW5ndGgoX3RoaXMsIF9nZXRVQ29sbGF0aW9uU3RyZW5ndGgocykpOworfQorCisKK3ZvaWQgR0xVRV9TWU0gKCBDb2xsYXRvciApIDo6IGdldFZlcnNpb24odWludDhfdCopIGNvbnN0ICB7Cit9CisKKwordm9pZCBHTFVFX1NZTSAoIENvbGxhdG9yICkgOjogc2V0QXR0cmlidXRlKFVDb2xBdHRyaWJ1dGUsIFVDb2xBdHRyaWJ1dGVWYWx1ZSwgVUVycm9yQ29kZSYpICB7Cit9CisKKworVUNvbEF0dHJpYnV0ZVZhbHVlIEdMVUVfU1lNICggQ29sbGF0b3IgKSA6OiBnZXRBdHRyaWJ1dGUoVUNvbEF0dHJpYnV0ZSwgVUVycm9yQ29kZSYpICB7CityZXR1cm4gKFVDb2xBdHRyaWJ1dGVWYWx1ZSkwOworfQorCisKK3VpbnQzMl90IEdMVUVfU1lNICggQ29sbGF0b3IgKSA6OiBzZXRWYXJpYWJsZVRvcChjb25zdCBVQ2hhciosIGludDMyX3QsIFVFcnJvckNvZGUmKSAgeworcmV0dXJuIDA7Cit9CisKKwordWludDMyX3QgR0xVRV9TWU0gKCBDb2xsYXRvciApIDo6IHNldFZhcmlhYmxlVG9wKFVuaWNvZGVTdHJpbmcsIFVFcnJvckNvZGUmKSAgeworcmV0dXJuIDA7Cit9CisKKwordm9pZCBHTFVFX1NZTSAoIENvbGxhdG9yICkgOjogc2V0VmFyaWFibGVUb3AodWludDMyX3QsIFVFcnJvckNvZGUmKSAgeworfQorCisKK3VpbnQzMl90IEdMVUVfU1lNICggQ29sbGF0b3IgKSA6OiBnZXRWYXJpYWJsZVRvcChVRXJyb3JDb2RlJikgY29uc3QgIHsKK3JldHVybiAwOworfQorCisKK0NvbGxhdG9yKiBHTFVFX1NZTSAoIENvbGxhdG9yICkgOjogc2FmZUNsb25lKCkgIHsKKyAgICByZXR1cm4gY2xvbmUoKTsKK30KKworCitpbnQzMl90IEdMVUVfU1lNICggQ29sbGF0b3IgKSA6OiBnZXRTb3J0S2V5KGNvbnN0IFVuaWNvZGVTdHJpbmcmIHMsIHVpbnQ4X3QqYnVmLCBpbnQzMl90IGxlbikgY29uc3QgIHsKKyNpZiBDT0xMX0ZFX0RFQlVHCisgIGZwcmludGYoc3RkZXJyLCAgIlZDRiAiIElDVUdMVUVfVkVSX1NUUiAiIEdTSyIpOworI2VuZGlmCisgICAgcmV0dXJuIGdldFNvcnRLZXkocy5nZXRCdWZmZXIoKSxzLmxlbmd0aCgpLCBidWYsIGxlbik7Cit9CisKKworCisKK2ludDMyX3QgR0xVRV9TWU0gKCBDb2xsYXRvciApIDo6IGdldFNvcnRLZXkoY29uc3QgVUNoYXIqcywgaW50MzJfdCBsLCB1aW50OF90KmQsIGludDMyX3QgYikgY29uc3QgIHsKKyNpZiBDT0xMX0ZFX0RFQlVHCisgICAgZnByaW50ZihzdGRlcnIsICAiVkNGICIgSUNVR0xVRV9WRVJfU1RSICIgR0tTIik7CisjZW5kaWYKKyAgICByZXR1cm4gT0lDVV91Y29sX2dldFNvcnRLZXkoX3RoaXMsIHMsbCxkLGIpOworfQorCisgaW50MzJfdCBHTFVFX1NZTSAoIENvbGxhdG9yICkgOjogY291bnRBdmFpbGFibGUoKSB7CisgICAgaW50MzJfdCBjb3VudCA9ICBPSUNVX3Vjb2xfY291bnRBdmFpbGFibGUoKTsKKyAgICByZXR1cm4gY291bnQ7CisgfQorIAorIAorIGludDMyX3QgR0xVRV9TWU0gKCBDb2xsYXRvciApIDo6IGFwcGVuZEF2YWlsYWJsZShVbmljb2RlU3RyaW5nKiBzdHJzLCBpbnQzMl90IGksIGludDMyX3QgY291bnQpIHsKKyAgIGludCBhdmFpbCA9IE9JQ1VfdWNvbF9jb3VudEF2YWlsYWJsZSgpOworICAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisgICBPSUNVX3VfaW5pdCgmc3RhdHVzKTsKKyNpZiBDT0xMX0ZFX0RFQlVHCisgICBmcHJpbnRmKHN0ZGVyciwgICJWQ0YgIiBJQ1VHTFVFX1ZFUl9TVFIgIiBhdmFpbCAlZCAtIGluaXQgJXNcbiIsIGF2YWlsLCB1X2Vycm9yTmFtZShzdGF0dXMpKTsKKyNlbmRpZiAgIAorICAgIGZvcihpbnQgaj0wO2o8YXZhaWw7aisrKSB7CisgICAgICAgICBzdHJzW2kral0uYXBwZW5kKE9JQ1VfdWNvbF9nZXRBdmFpbGFibGUoaikpOworICAgICAgICAgc3Ryc1tpK2pdLmFwcGVuZCgiQHNwPWljdSIpOworICAgICAgICAgc3Ryc1tpK2pdLmFwcGVuZCggSUNVR0xVRV9WRVJfU1RSWzBdICk7ICAvLyBYX3kKKyAgICAgICAgIHN0cnNbaStqXS5hcHBlbmQoIElDVUdMVUVfVkVSX1NUUlsyXSApOyAgLy8geF9ZCisjaWYgQ09MTF9GRV9ERUJVRworICAgICAgICAgeyAKKyAgICAgICAgICAgIGNoYXIgZm9vWzk5OV07CisgICAgICAgICAgICBjb25zdCBVQ2hhciAqc3MgPSBzdHJzW2kral0uZ2V0VGVybWluYXRlZEJ1ZmZlcigpOworICAgICAgICAgICAgdV9hdXN0cmNweShmb28sIHNzKTsKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICAiVkNGICIgSUNVR0xVRV9WRVJfU1RSICIgYXBwZW5kaW5nIFslZCslZD0lZF0gPDwlcz4+XG4iLCBpLCBqLCBpK2osIGZvbyk7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKyAgICByZXR1cm4gT0lDVV91Y29sX2NvdW50QXZhaWxhYmxlKCk7CisgfQorCisKKworCisjZWxzZQorLyoqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBUaGUgZm9sbG93aW5nIGNvZGUgcnVucyBpbnNpZGUgdGhlICdwcm92aWRlcicgdmVyc2lvbiAoaS5lLiBjdXJyZW50IElDVSkgPT09PT09PT09PSAqKi8KKworLy8gZGVmaW5lIENvbGxhdG9yX1hYCisjaW5jbHVkZSAiaWN1Z2x1ZS9nbHZlci5oIgorCisvLyBnZW5lcmF0ZSBsaXN0IG9mIHZlcnNpb25zCitzdGF0aWMKKyNpbmNsdWRlIDxpY3VnbHVlL2ZlX3Zlcmxpc3QuaD4KKworY2xhc3MgVmVyc2lvbkNvbGxhdG9yRmFjdG9yeSA6IHB1YmxpYyBDb2xsYXRvckZhY3RvcnkgeworcHVibGljOgorICB2aXJ0dWFsIENvbGxhdG9yICpjcmVhdGVDb2xsYXRvcihjb25zdCBMb2NhbGUgJmxvYyk7CisgIHZpcnR1YWwgY29uc3QgVW5pY29kZVN0cmluZyAqZ2V0U3VwcG9ydGVkSURzKGludDMyX3QgJmNvdW50LCBVRXJyb3JDb2RlICZzdGF0dXMpOworICB2aXJ0dWFsIHZvaWQqIGdldER5bmFtaWNDbGFzc0lEKCkgY29uc3Q7IAorICBzdGF0aWMgdm9pZCogZ2V0U3RhdGljQ2xhc3NJRCgpIDsgCit9OworCitVT0JKRUNUX0RFRklORV9SVFRJX0lNUExFTUVOVEFUSU9OKCBWZXJzaW9uQ29sbGF0b3JGYWN0b3J5ICkKKworQ29sbGF0b3IgKlZlcnNpb25Db2xsYXRvckZhY3Rvcnk6OmNyZWF0ZUNvbGxhdG9yKGNvbnN0IExvY2FsZSAmbG9jKSB7CisgICAgLy8gcHVsbCBvZmYgcHJvdmlkZXIgIworICAgIGNoYXIgcHJvdmlkZXJbMjAwXTsKKyAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKyNpZiBDT0xMX0ZFX0RFQlVHCisgICAgZnByaW50ZihzdGRlcnIsICAiVkNGOkNDICVzXG4iLCBsb2MuZ2V0TmFtZSgpKTsKKyNlbmRpZgorICAgIGludDMyX3QgbGVuID0gbG9jLmdldEtleXdvcmRWYWx1ZSgic3AiLCBwcm92aWRlciwgMjAwLCBzdGF0dXMpOworICAgIGlmKFVfRkFJTFVSRShzdGF0dXMpfHxsZW49PTApIHJldHVybiBOVUxMOworI2lmIENPTExfRkVfREVCVUcKKyAgICBmcHJpbnRmKHN0ZGVyciwgICJWQ0Y6S1dWPiAlcy8lZFxuIiwgdV9lcnJvck5hbWUoc3RhdHVzKSwgbGVuKTsKKyNlbmRpZgorICAgIHByb3ZpZGVyW2xlbl09MDsKKyNpZiBDT0xMX0ZFX0RFQlVHCisgICAgZnByaW50ZihzdGRlcnIsICAiVkNGOktXViAlc1xuIiwgcHJvdmlkZXIpOworI2VuZGlmCisgICAgaWYoc3RybmNtcChwcm92aWRlciwiaWN1IiwzKSkgcmV0dXJuIE5VTEw7CisgICAgY29uc3QgY2hhciAqaWN1dmVyPXByb3ZpZGVyKzM7CisjaWYgQ09MTF9GRV9ERUJVRworICAgIGZwcmludGYoc3RkZXJyLCAgIlZDRjpJQ1VWICVzXG4iLCBpY3V2ZXIpOworI2VuZGlmCisgICAgCisjaWYgZGVmaW5lZChHTFVFX1ZFUikKKyN1bmRlZiBHTFVFX1ZFUgorI2VuZGlmCisjZGVmaW5lIEdMVUVfVkVSKHgpIC8qcHJpbnRmKCIlYy8lY3wlYy8lY1xuIiwgaWN1dmVyWzBdLCgjeClbMF0saWN1dmVyWzFdLCgjeClbMl0pOyovICBpZihpY3V2ZXJbMF09PSAoI3gpWzBdICYmIGljdXZlclsxXT09KCN4KVsyXSkgeyBDb2xsYXRvciAqYyA9IGdsdWUgIyMgQ29sbGF0b3IgIyMgeCA6OiBjcmVhdGUobG9jLCBpY3V2ZXIpOyAvKmZwcmludGYoc3RkZXJyLCAiVkNGOjpDQyAlcyAtPiAlcFxuIiwgbG9jLmdldE5hbWUoKSwgYyk7Ki8gcmV0dXJuIGM7IH0KKyNpbmNsdWRlICJpY3VnbHVlL2dsdmVyLmgiCisjaWYgQ09MTF9GRV9ERUJVRworICAgIGZwcmludGYoc3RkZXJyLCAgIlZDRjpDQyAlcyBmYWlsZWRcbiIsIGxvYy5nZXROYW1lKCkpOworI2VuZGlmCisKKyAgICByZXR1cm4gTlVMTDsKK30KKworCitzdGF0aWMgY29uc3QgVW5pY29kZVN0cmluZyAqZ0xvY2FsZXMgPSBOVUxMOworc3RhdGljICBpbnQzMl90IGdMb2NDb3VudCA9IDA7IAorCitjb25zdCBVbmljb2RlU3RyaW5nCisqVmVyc2lvbkNvbGxhdG9yRmFjdG9yeTo6Z2V0U3VwcG9ydGVkSURzKGludDMyX3QgJmNvdW50LCBVRXJyb3JDb2RlICZzdGF0dXMpIHsKKyAgaWYoZ0xvY2FsZXM9PU5VTEwpIHsKKyAgICBjb3VudCA9IDA7CisgICAgCisgICAgCisgICAgLyogZ2F0aGVyIGNvdW50cyAqLworI2lmIGRlZmluZWQoR0xVRV9WRVIpCisjdW5kZWYgR0xVRV9WRVIKKyNlbmRpZgorI2RlZmluZSBHTFVFX1ZFUih4KSBjb3VudCArPSBnbHVlICMjIENvbGxhdG9yICMjIHggOjogY291bnRBdmFpbGFibGUoKTsKKyNpbmNsdWRlICJpY3VnbHVlL2dsdmVyLmgiCisKKyNpZiBDT0xMX0ZFX0RFQlVHCisgICAgcHJpbnRmKCJWQ0Y6IGNvdW50PSVkXG4iLCBjb3VudCk7CisjZW5kaWYKKyAgICBVbmljb2RlU3RyaW5nICpzdHJzID0gbmV3ICBVbmljb2RlU3RyaW5nW2NvdW50XTsKKyAgICBpbnQzMl90IGkgPSAwOworCisjaWYgZGVmaW5lZChHTFVFX1ZFUikKKyN1bmRlZiBHTFVFX1ZFUgorI2VuZGlmCisjZGVmaW5lIEdMVUVfVkVSKHgpIGkgKz0gZ2x1ZSAjIyBDb2xsYXRvciAjIyB4IDo6IGFwcGVuZEF2YWlsYWJsZShzdHJzLCBpLCBjb3VudCk7CisjaW5jbHVkZSAiaWN1Z2x1ZS9nbHZlci5oIgorCisjaWYgQ09MTF9GRV9ERUJVRworICAgIHByaW50ZigiVkNGOiBhcHBlbmRlZCBjb3VudD0lZFxuIiwgY291bnQpOworI2VuZGlmCisKKyAgICBnTG9jQ291bnQgPSBjb3VudDsKKyAgICBnTG9jYWxlcyA9IHN0cnM7CisgIH0KKyAgY291bnQgPSBnTG9jQ291bnQ7CisgIHJldHVybiBnTG9jYWxlczsKK30KKworCisvKiBQbHVnaW4gQ29kZSAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmljb2RlL3V2ZXJzaW9uLmg+CisKK3N0YXRpYyBVUmVnaXN0cnlLZXkgcmsgPSBOVUxMOworCit2b2lkIGNvbGxfcHJvdmlkZXJfcmVnaXN0ZXIoVUVycm9yQ29kZSAmc3RhdHVzKSB7CisgIHJrID0gQ29sbGF0b3I6OnJlZ2lzdGVyRmFjdG9yeShuZXcgVmVyc2lvbkNvbGxhdG9yRmFjdG9yeSgpLCBzdGF0dXMpOworfQorCit2b2lkIGNvbGxfcHJvdmlkZXJfdW5yZWdpc3RlcihVRXJyb3JDb2RlICZzdGF0dXMpIHsKKyAgQ29sbGF0b3I6OnVucmVnaXN0ZXIocmssIHN0YXR1cyk7Cit9CisKKy8qIFBsdWdpbi0gb25seSBJQ1UgNC40KyAqLworI2lmIChVX0lDVV9WRVJTSU9OX01BSk9SX05VTSA+IDQpIHx8ICgoVV9JQ1VfVkVSU0lPTl9NQUpPUl9OVU09PTQpJiYoVV9JQ1VfVkVSU0lPTl9NSU5PUl9OVU0+MykpCisjaW5jbHVkZSAidW5pY29kZS9pY3VwbHVnLmgiCisKK1VfQ0FQSSBVUGx1Z1Rva2VuUmV0dXJuIFVfRVhQT1JUMiBjb2xsX3Byb3ZpZGVyX3BsdWdpbiAoVVBsdWdEYXRhICpkYXRhLCBVUGx1Z1JlYXNvbiByZWFzb24sIFVFcnJvckNvZGUgKnN0YXR1cyk7CisKK1VfQ0FQSSBVUGx1Z1Rva2VuUmV0dXJuIFVfRVhQT1JUMiBjb2xsX3Byb3ZpZGVyX3BsdWdpbiAoVVBsdWdEYXRhICpkYXRhLCBVUGx1Z1JlYXNvbiByZWFzb24sIFVFcnJvckNvZGUgKnN0YXR1cykKK3sKKyAgc3dpdGNoKHJlYXNvbikgeworICBjYXNlIFVQTFVHX1JFQVNPTl9RVUVSWToKKyAgICB1cGx1Z19zZXRQbHVnTmFtZShkYXRhLCAiQ29sbGF0aW9uIFByb3ZpZGVyIFBsdWdpbiIpOworICAgIHVwbHVnX3NldFBsdWdMZXZlbChkYXRhLCBVUExVR19MRVZFTF9ISUdIKTsKKyAgICBicmVhazsKKyAgY2FzZSBVUExVR19SRUFTT05fTE9BRDoKKyAgICBjb2xsX3Byb3ZpZGVyX3JlZ2lzdGVyKCpzdGF0dXMpOworICAgIGJyZWFrOworICBjYXNlIFVQTFVHX1JFQVNPTl9VTkxPQUQ6CisgICAgY29sbF9wcm92aWRlcl91bnJlZ2lzdGVyKCpzdGF0dXMpOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIGJyZWFrOyAvKiBub3QgaGFuZGxlZCAqLworICB9CisgIHJldHVybiBVUExVR19UT0tFTjsKK30KKyNlbHNlCisKKy8qIAorICAgTm90ZTogdGhpcyBJQ1UgdmVyc2lvbiBtdXN0IGV4cGxpY2l0bHkgY2FsbCAnY29sbF9wcm92aWRlcl9wbHVnaW4nCisqLworCisjZW5kaWYgLyogcGx1Z2luICovCisKKyNlbmRpZiAvKiBwcm92aWRlciBzaWRlICh2cyB0YXJnZXQpICovCmRpZmYgLS1naXQgYS9tdWx0aS9wcm9qL3Byb3ZpZGVyL2dsdWUvZXhwb3J0LnR4dCBiL211bHRpL3Byb2ovcHJvdmlkZXIvZ2x1ZS9leHBvcnQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YWI3ODQKLS0tIC9kZXYvbnVsbAorKysgYi9tdWx0aS9wcm9qL3Byb3ZpZGVyL2dsdWUvZXhwb3J0LnR4dApAQCAtMCwwICsxLDIgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDEwIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kIE90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCitfY29sbF9wcm92aWRlcl9wbHVnaW4KZGlmZiAtLWdpdCBhL211bHRpL3Byb2ovcHJvdmlkZXIvZ2x1ZS9nbHVyZW4tYm90dG9tLmggYi9tdWx0aS9wcm9qL3Byb3ZpZGVyL2dsdWUvZ2x1cmVuLWJvdHRvbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhYmZiNjgKLS0tIC9kZXYvbnVsbAorKysgYi9tdWx0aS9wcm9qL3Byb3ZpZGVyL2dsdWUvZ2x1cmVuLWJvdHRvbS5oCkBAIC0wLDAgKzEsMTIgQEAKKworI2VuZGlmCisKKy8qCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgQ29weXJpZ2h0IChDKSAyMDA5LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzCisqICAgQ29ycG9yYXRpb24gYW5kIG90aGVycy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCmRpZmYgLS1naXQgYS9tdWx0aS9wcm9qL3Byb3ZpZGVyL2dsdWUvZ2x1cmVuLXRvcC5oIGIvbXVsdGkvcHJvai9wcm92aWRlci9nbHVlL2dsdXJlbi10b3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTI4YmYxCi0tLSAvZGV2L251bGwKKysrIGIvbXVsdGkvcHJvai9wcm92aWRlci9nbHVlL2dsdXJlbi10b3AuaApAQCAtMCwwICsxLDEyIEBACisvKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIENvcHlyaWdodCAoQykgMjAwOSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcworKiAgIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworI2lmbmRlZiBfR0xVUkVOX0gKKyNkZWZpbmUgX0dMVVJFTl9ICisKZGlmZiAtLWdpdCBhL211bHRpL3Byb2ovcHJvdmlkZXIvZ2x1ZS9pbmNsdWRlL2ljdWdsdWUvY29sbF9iZS5oIGIvbXVsdGkvcHJvai9wcm92aWRlci9nbHVlL2luY2x1ZGUvaWN1Z2x1ZS9jb2xsX2JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhjYzdkMwotLS0gL2Rldi9udWxsCisrKyBiL211bHRpL3Byb2ovcHJvdmlkZXIvZ2x1ZS9pbmNsdWRlL2ljdWdsdWUvY29sbF9iZS5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgQ29weXJpZ2h0IChDKSAyMDA5LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzCisqICAgQ29ycG9yYXRpb24gYW5kIG90aGVycy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisjaWZuZGVmIF9DT0xMX0JFCisjZGVmaW5lIF9DT0xMX0JFCisKKyNpbmNsdWRlIDxpY3VnbHVlL2ljdWdsdWUuaD4KKyNpbmNsdWRlIDx1bmljb2RlL3Vjb2xsLmg+IC8qIGZvciBkZWZpbml0aW9ucyAqLworCisjaWYgZGVmaW5lZChYUF9DUExVU1BMVVMpCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCit2b2lkICogR0xVRV9TWU0odWNvbF9vcGVuKSAoY29uc3QgY2hhciAqbG9jYWxlKTsKK3ZvaWQgKiBHTFVFX1NZTSh1Y29sX2Nsb3NlKSAodm9pZCAqY29sbCk7Cit2b2lkICogR0xVRV9TWU0oCisKKworI2lmIGRlZmluZWQoWFBfQ1BMVVNQTFVTKSAKK30KKyNlbmRpZgorCisjZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tdWx0aS9wcm9qL3Byb3ZpZGVyL2dsdWUvaW5jbHVkZS9pY3VnbHVlL2NvbGxfZmUuaCBiL211bHRpL3Byb2ovcHJvdmlkZXIvZ2x1ZS9pbmNsdWRlL2ljdWdsdWUvY29sbF9mZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZjJmODUKLS0tIC9kZXYvbnVsbAorKysgYi9tdWx0aS9wcm9qL3Byb3ZpZGVyL2dsdWUvaW5jbHVkZS9pY3VnbHVlL2NvbGxfZmUuaApAQCAtMCwwICsxLDI0IEBACisvKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIENvcHlyaWdodCAoQykgMjAwOSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcworKiAgIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworI2lmbmRlZiBfQ09MTF9GRQorI2RlZmluZSBfQ09MTF9GRQorCisjaW5jbHVkZSA8aWN1Z2x1ZS9pY3VnbHVlLmg+CisjaW5jbHVkZSA8dW5pY29kZS9jb2xsLmg+CisKKyNpZiBkZWZpbmVkKFhQX0NQTFVTUExVUykKKworY2xhc3MgR0xVRV9TWU0oIEdsdWVGRUNvbGxhdG9yICkgOiBwdWJsaWMgQ29sbGF0b3IgeworCit9OworCisjZW5kaWYgLyogWFBfQ1BMVVNQTFVTICovCisKKyNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL211bHRpL3Byb2ovcHJvdmlkZXIvZ2x1ZS9pbmNsdWRlL2ljdWdsdWUvZmVfdmVybGlzdC5oIGIvbXVsdGkvcHJvai9wcm92aWRlci9nbHVlL2luY2x1ZGUvaWN1Z2x1ZS9mZV92ZXJsaXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIyNzNjMwotLS0gL2Rldi9udWxsCisrKyBiL211bHRpL3Byb2ovcHJvdmlkZXIvZ2x1ZS9pbmNsdWRlL2ljdWdsdWUvZmVfdmVybGlzdC5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgQ29weXJpZ2h0IChDKSAyMDA5LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzCisqICAgQ29ycG9yYXRpb24gYW5kIG90aGVycy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisvKioKKyAqIFB1cnBvc2U6IGNyZWF0ZSBsb2NhbCBvciBzdGF0aWMgZmVfdmVybGlzdCBzdWNoIGFzOgorICogCisgKiAgIGNvbnN0IGNoYXIgKmZlX3Zlcmxpc3RbXSA9IHsgIjRfMiIsICI0XzJfMyIsIC4uLiwgTlVMTCB9OyAKKyAqLworCisjaWYgZGVmaW5lZChHTFVFX1ZFUikKKyN1bmRlZiBHTFVFX1ZFUgorI2VuZGlmCisKK2NvbnN0IGNoYXIgKmZlX3Zlcmxpc3RbXSA9IHsgCisjZGVmaW5lIEdMVUVfVkVSKHgpICAjeCAgLAorI2luY2x1ZGUgImljdWdsdWUvZ2x2ZXIuaCIKKyN1bmRlZiBHTFVFX1ZFUgorICAgIE5VTEwKK307CisKZGlmZiAtLWdpdCBhL211bHRpL3Byb2ovcHJvdmlkZXIvZ2x1ZS9pbmNsdWRlL2ljdWdsdWUvaWN1Z2x1ZS5oIGIvbXVsdGkvcHJvai9wcm92aWRlci9nbHVlL2luY2x1ZGUvaWN1Z2x1ZS9pY3VnbHVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ5MTZjNQotLS0gL2Rldi9udWxsCisrKyBiL211bHRpL3Byb2ovcHJvdmlkZXIvZ2x1ZS9pbmNsdWRlL2ljdWdsdWUvaWN1Z2x1ZS5oCkBAIC0wLDAgKzEsMTggQEAKKy8qCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMKKyogICBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKKyNpZm5kZWYgX0lDVUdMVUVfSAorI2RlZmluZSBfSUNVR0xVRV9ICisKKy8qIEdldCB1dHlwZXMuaCBmcm9tIHdoYXRldmVyIElDVSB3ZSBhcmUgdW5kZXIgKi8KKyNpbmNsdWRlIDx1bmljb2RlL3V0eXBlcy5oPgorCisjZGVmaW5lIEdMVUVfU1lNX1YoeCwgdikgZ2x1ZSAjIyB4ICMjIHYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9tdWx0aS9wcm9qL3Byb3ZpZGVyL2ljdS1jb25maWcuc2VkIGIvbXVsdGkvcHJvai9wcm92aWRlci9pY3UtY29uZmlnLnNlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDlmZTk2Ci0tLSAvZGV2L251bGwKKysrIGIvbXVsdGkvcHJvai9wcm92aWRlci9pY3UtY29uZmlnLnNlZApAQCAtMCwwICsxLDQgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgSUJNIENvcnAuIGFuZCBPdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyMgbXVuZ2UKK3MlXnNhbml0eSQlIyBzYW5pdHkgZGlzYWJsZWQuJQorCmRpZmYgLS1naXQgYS9tdWx0aS9wcm9qL3Byb3ZpZGVyL3JlYWRtZS50eHQgYi9tdWx0aS9wcm9qL3Byb3ZpZGVyL3JlYWRtZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE0YjMzYgotLS0gL2Rldi9udWxsCisrKyBiL211bHRpL3Byb2ovcHJvdmlkZXIvcmVhZG1lLnR4dApAQCAtMCwwICsxLDY2IEBACisjIS9iaW4vY2F0CisjIENvcHlyaWdodCAoYykgMjAwOS0yMDEwIElCTSBDb3JwLiBhbmQgT3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkCisKKyMgSUNVIFByb3ZpZGVyIEZlYXR1cmUuIC0gJElkJAorCitCVUlMRElORzoKKworMWEuIERvd25sb2FkIHRoZSBJQ1Ugc291cmNlICgudGd6KSB5b3Ugd2lzaCB0byBUQVJHRVQgKGkuZS4gbGluayB5b3VyIGFwcGxpY2F0aW9uIGFnYWluc3QpLiAgVGhpcyBtdXN0IGJlIGluIHRoZSA0LjQuIHNlcmllcy4gCisKKyAgICA0LjQsIDQuNC4xLCBhbmQgNC40LjIgaGF2ZSBiZWVuIHRlc3RlZC4gIFRoZSBsYXRlc3QgYXZhaWxhYmxlIGlzIHJlY29tbWVuZGVkICg0LjQuMiBhcyBvZiB0aGlzIHdyaXRpbmcpLgorCisxYi4gRG93bmxvYWQgb25lIG9yIG1vcmUgSUNVcyAoLnRneikgeW91IHdpc2ggdG8gaGF2ZSBBVkFJTEFCTEUgKHZpYSB0aGUgcHJvdmlkZXIgaW50ZXJmYWNlKS4gIEFzIG9mIHRoaXMgd3JpdGluZywgNC4yLjAuMSwgMy44LjEsIDMuNiwgMy40LjEsIGFuZCAzLjIuMSBoYXZlIGJlZW4gdGVzdGVkLgorCisgICAoS25vd24gaXNzdWU6IEFzIG9mIHRoaXMgd3JpdGluZywgSUNVIDQuNCssNC41KyBldGMgbWF5IE5PVCBiZSBhbiBBVkFJTEFCTEUgbG9jYWxlIChpdCBtYXkgYmUgYSBUQVJHRVQpLiApCisKKworICAgTm90ZSB0aGF0IHRoZSBNQUpPUitNSU5PUiB2ZXJzaW9uIG51bWJlcnMgbXVzdCBub3QgY29uZmxpY3QgYmV0d2VlbiB0aGUgVEFSR0VUICBhbmQgQVZBSUxBQkxFIElDVXMuIE9ubHkgb25lIElDVSBvZiBlYWNoIG1ham9yK21pbm9yIGlzIGFsbG93ZWQuIAorICAgU28sIG9ubHkgb25lIDQuNC5YLCBvbmUgMy44LlgsIGV0Yy4gIFRoaXMgaXMgZHVlIHRvIElDVSBiaW5hcnkgY29tcGF0aWJpbGl0eSBydWxlcy4KKworCisxYy4gQ29weSB0aGUgSUNVcyAobmFtZWQgYXMgdGhleSB3ZXJlIGRvd25sb2FkZWQpIGludG8gdGhlIC4uLy4uL3BhY2thZ2VzLyBkaXJlY3RvcnkgcmVsYXRpdmUgdG8gdGhpcyByZWFkbWUuCisKKworMmEuIENvcHkgdGhlIGZpbGUgIk1ha2VmaWxlLWxvY2FsLnNhbXBsZSIgaW50byBhIG5ldyBmaWxlICJNYWtlZmlsZS5sb2NhbCIuCisKKzJiLiBFZGl0IHRoZSBNYWtlZmlsZS5sb2NhbCB0byBtb2RpZnkgdGhlIFBST1ZJREVSX1RBUkdFVCBhbmQgUFJPVklERVJfQVZBSUxBQkxFIHNldHRpbmdzLgorCisKKzMuIENoZWNrIHRoZSBtYWtlZmlsZSBzZXR0aW5ncyBieSBydW5uaW5nICdtYWtlIGluZm8nLCB5b3Ugc2hvdWxkIHNlZSBvdXRwdXQgc2ltaWxhciB0byB0aGUgZm9sbG93aW5nOgorCisgICBJQ1UgUHJvdmlkZXIgQnVpbGQKKyAgIFRhcmdldHRpbmcgUHJvdmlkZXIgYWdhaW5zdCBJQ1UgNC40LjIgKDRfNF8yLCBtYWpvciA0NCkKKyAgIEF2YWlsYWJsZSBwbHVnaW5zOiAzLjguMSA0LjIuMC4xICAoM184XzEgNF8yXzBfMSkKKyAgIEF2YWlsYWJsZSBrZXl3b3JkczoKKyAgICAgIC4uLkBwcm92aWRlcj1pY3UzOAorICAgICAgLi4uQHByb3ZpZGVyPWljdTQyCisgICBQbHVnaW4gbGlicmFyeSB3aWxsIGJlIGxpYmljdXByb3YuNDQuc28KKworICAgQXZhaWxhYmxlIElDVSB0YXJiYWxsczogaWN1NGMtM184XzEtc3JjLnRneiBpY3U0Yy00XzJfMF8xLXNyYy50Z3ogaWN1NGMtNF80XzItc3JjLnRneiAKKyAgIEF2YWlsYWJsZSBJQ1UgdmVyc2lvbnM6IDMuOC4xIDQuMi4wLjEgNC40LjIgCisKKworIFRoZSBsYXN0IHR3byBsaW5lcyBzaG93IHdoaWNoIElDVSAudGd6IGZpbGVzIGFyZSBhdmFpbGFibGUuIElmIGEgdmVyc2lvbiBpcyBub3QgbGlzdGVkLCBtYWtlIHN1cmUgdGhlIGZpbGVuYW1lIGlzIGFzIGFib3ZlLgorCis0LiBOb3csIHlvdSBhcmUgcmVhZHkgdG8gYnVpbGQgYW5kIHRlc3Q6CisKKyAgICAgbWFrZSBjaGVjaworCisgICBUaGlzIHdpbGwgdGFrZSBxdWl0ZSBhIHdoaWxlIGFzIGl0IGhhcyB0byBidWlsZCBOIGNvcGllcyBvZiBJQ1UuCisKKyAgIFdoZW4gZG9uZSwgaXQgc2hvdWxkIHNob3cgYSBsaXN0IG9mIGNvbGxhdGlvbiBrZXlzLCBhbmQgaW5kaWNhdGUgdGhhdCB0aGVyZSB3ZXJlIGRpZmZlcmVuY2VzIGJldHdlZW4gSUNVIDMuOCwgNC40LCA0LjIuICAgWW91IG1heSBuZWVkIHRvIG1vZGlmeSBjb2xkaWZmLmNwcCBpZiB5b3UgYXJlIHVzaW5nIGEgZGlmZmVyZW50IHNldCBvZiBJQ1UgdmVyc2lvbnMuCisKKzUuIFlvdSBjYW4gdGVzdCBpbiBhbiAnaW5zdGFsbGVkJyBJQ1UgKG5vdCB0aGUgc3lzdGVtIGluc3RhbGwpIHdpdGggdGhpcyBjb21tYW5kOgorCisgICAgICBtYWtlIGluc3RhbGwtY2hlY2sKKworREVQTE9ZSU5HOgorCis2LiAgVG8gaW5zdGFsbCB0aGUgcGx1Z2luIGluIHlvdXIgb3duIElDVSwgY29weSAgb3V0L2ljdXBsdWdpbnM0NC50eHQgaW50byB5b3VyIGxpYi9pY3UsICBhbmQgb3V0L2xpYi9saWJpY3Vwcm92LjQ0LnNvIGludG8geW91ciBsaWIvIGRpcmVjdG9yaWVzIHdoZXJlIElDVSBpcyBpbnN0YWxsZWQuIAorCisgTm90ZSB0aGF0IHJ1bm5pbmcgJ2ljdWluZm8nIHdpbGwgdGVsbCB5b3Ugd2hlcmUgdGhlIHBsdWdpbiBmaWxlIGlzIGV4cGVjdGVkIHRvIGJlIGxvY2F0ZWQsIGFuZCAnaWN1aW5mbyAtTCcgd2lsbCBkZWJ1ZyBhbnkgbG9hZCBpc3N1ZXMuCisKK1VTSU5HOgorCitDb2xsYXRvcnMgb3BlbmVkIHdpdGggYW4gaWQgc3VjaCBhcyB0aGF0IHNob3duIGluICdtYWtlIGluZm8nLCBzdWNoIGFzICAnZW5fVVNAcHJvdmlkZXI9aWN1MzgnIHdpbGwgbG9hZCwgZm9yIGV4YW1wbGUsIGFuIElDVSAzLjggY29sbGF0b3IuCisKZGlmZiAtLWdpdCBhL211bHRpL3JlYWRtZS50eHQgYi9tdWx0aS9yZWFkbWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjY2I3NmQKLS0tIC9kZXYvbnVsbAorKysgYi9tdWx0aS9yZWFkbWUudHh0CkBAIC0wLDAgKzEsNTYgQEAKKyMhL2Jpbi9jYXQKKyMgQ29weXJpZ2h0IChjKSAyMDA5LTIwMTAgSUJNIENvcnAuIGFuZCBPdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyMKKworCitOT1RFOgorTk9URTogRm9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSAnUHJvdmlkZXInIGZlYXR1cmUsIHNlZSBwcm9qL3Byb3ZpZGVyL3JlYWRtZS50eHQKK05PVEU6CisKKworCisgVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgcGllY2VzIG9mIHRoZSAnTXVsdGlJY3UnIGZlYXR1cmUsIHdoaWNoIGNvbnRhaW5zCitzY3JpcHRzIGZvciBidWlsZGluZyBtdWx0aXBsZSB2ZXJzaW9ucyBvZiBJQ1UgYXQgdGhlIHNhbWUgdGltZSwgYW5kIHJ1bm5pbmcKK3ZhcmlvdXMgcGllY2VzIG9mIGNvZGUgYWdhaW5zdCBpdC4KKworIE5vdGUsIGlmIHlvdSBjb3B5IG9uZSBvZiB0aGVzZSBwcm9qZWN0cyBvdXRzaWRlIHRoZSBtdWx0aS8gZGlyZWN0b3J5LAoreW91IG11c3QgZW5zdXJlIHRoYXQgdGhlICdNVUxUSUlDVV9ST09UJyB2YXJpYWJsZSBpbiBidWlsZCBzY3JpcHRzIHBvaW50cwordG8gdGhlIHRvcCBsZXZlbCBkaXJlY3RvcnkgaGVyZSwgJ211bHRpLycuCisKKyBtdWx0aS8gICAgICAgICAgICAgICggWW91IGFyZSBIZXJlICkKKyBtdWx0aS9wYWNrYWdlcy8gICAgIC50Z3ogYW5kIC5qYXIgZmlsZXMgZm9yIEMgYW5kIEogcmVzcGVjdGl2ZWx5CisgICAgICAgICAgICAgICAgICAgICAgICAoc2VlIHRoZSByZWFkbWUgaW4gdGhhdCBkaXJlY3RvcnkpCisgbXVsdGkvYy8gICAgICAgICAgICBTY3JpcHRzIGZvciBidWlsZGluZyBhZ2FpbnN0IElDVTRDCisgbXVsdGkvYy9wYXRjaC8gICAgICAgICBQYXRjaGVzIGZvciBidWlsZGluZyBvbGQgSUNVIHZlcnNpb25zCisgCisgbXVsdGkvY29tbW9uLyAgICAgICBDb21tb24gbWFrZWZpbGVzCisKKyBtdWx0aS9qLyAgICAgICAgICAgIFNjcmlwdHMgZm9yIGJ1aWxkaW5nIGFnYWluc3QgSUNVNEoKKworIG11bHRpL3RtcC8gICAgICAgICAgVGVtcG9yYXJ5IGRpcmVjdG9yeSwgY29udGFpbnMgaW50ZXJtZWRpYXRlIGJ1aWxkcworIG11bHRpL3RtcC9zcmMvICAgICAgICAgVW5wYWNrZWQgYW5kIHBhdGNoZWQgc291cmNlCisgbXVsdGkvdG1wL2J1aWxkLyAgICAgICBCdWlsdCBJQ1VzCisgbXVsdGkvdG1wL2luc3QvICAgICAgICBJbnN0YWxsZWQgSUNVcworCisgbXVsdGkvcHJvai8gICAgICAgICBDb250YWlucyB2YXJpb3VzIHByb2plY3RzIHdoaWNoIG1ha2UgdXNlIG9mIG11bHRpLWljdS4KKyAgICAgICAgICAgICAgICAgICAgICAgKFNlZSBpbmRpdmlkdWFsIHJlYWRtZXMgdW5kZXIgZWFjaCBwcm9qZWN0LikKKyBtdWx0aS9wcm9qL2NoZWxsby8gIEMgImhlbGxvIHdvcmxkIiBhZ2FpbnN0IG11bHRpcGxlIElDVXMKKyBtdWx0aS9wcm9qL2poZWxsby8gIEogImhlbGxvIHdvcmxkIiBhZ2FpbnN0IG11bHRpcGxlIElDVXMKKworLS0KK0hPVyBUTyBVU0UKKworMS4gQ29weSBzb21lIElDVSBzb3VyY2UgZmlsZXMgaW50byBtdWx0aS9wYWNrYWdlcy8KKworMi4gaW4gIm11bHRpL2MiICBydW4gIm1ha2UgaWljdXMiIC0gdGhpcyB3aWxsIHRha2UgYSB3aGlsZS4KKworMy5UbyB2ZXJpZnkgdGhlIElDVSBidWlsZCwgaW4gIm11bHRpL3Byb2ovY2hlbGxvIiwgIHJ1biAibWFrZSBjaGVjayIuCisKKyAgIFlvdSBzaG91bGQgc2VlIG91dHB1dCBsaWtlIHRoaXM6CisKKyAgICAgICBvdXQvM184XzEudHh0OiAgSUNVIDMuOC4xCisgICAgICAgb3V0LzRfMl8wXzEudHh0OiAgSUNVIDQuMgorICAgICAgIG91dC80XzRfMS50eHQ6ICBJQ1UgNC40LjEKKworNC4gVGhlICdQcm92aWRlcicgcHJvamVjdCBpcyBtb3JlIGNvbXBsZXguIFRvIHNlZSBpdHMgaW5mb3JtYXRpb24sIHNlZQordGhlIHJlYWRtZSBpbiB0aGF0IGRpcmVjdG9yeS4gCmRpZmYgLS1naXQgYS9yZWxlYXNlL2MvYWxsTG9jYWxlVGVzdC5zaCBiL3JlbGVhc2UvYy9hbGxMb2NhbGVUZXN0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmUzYTA3NGYKLS0tIC9kZXYvbnVsbAorKysgYi9yZWxlYXNlL2MvYWxsTG9jYWxlVGVzdC5zaApAQCAtMCwwICsxLDE0IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA2LTIwMDggSUJNIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyMKK2VjaG8gIlRlc3RpbmcgJDEgaW4gYWxsIGxvY2FsZXMiCitvdXRmaWxlPSQxLWxvY2FsZS50eHQKK2VjaG8gIiIgPiAkb3V0ZmlsZQorZm9yIGxvYyBpbiBgbG9jYWxlIC1hYDsgZG8KK2VjaG8gTENfQUxMPSRsb2MgPj4gJG91dGZpbGUKK0xDX0FMTD0kbG9jIG1ha2UgY2hlY2sgJDIgPj4gJG91dGZpbGUgMj4mMQorZG9uZQorCitlY2hvICJEb25lIHRlc3RpbmcgJDEgaW4gYWxsIGxvY2FsZXMiCisKZGlmZiAtLWdpdCBhL3JlbGVhc2UvYy9hbGxUaW1lem9uZVRlc3Quc2ggYi9yZWxlYXNlL2MvYWxsVGltZXpvbmVUZXN0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjkyMzE0OGUKLS0tIC9kZXYvbnVsbAorKysgYi9yZWxlYXNlL2MvYWxsVGltZXpvbmVUZXN0LnNoCkBAIC0wLDAgKzEsMTUgQEAKKyMhL2Jpbi9iYXNoCisjCisjIENvcHlyaWdodCAoYykgMjAwNi0yMDA4IElCTSBBbGwgUmlnaHRzIFJlc2VydmVkCisjCitlY2hvICJUZXN0aW5nICQxIGluIGFsbCB0aW1lem9uZXMiCitvdXRmaWxlPSQxLXRpbWV6b25lLnR4dAorZWNobyAiIiA+ICRvdXRmaWxlCitmb3IgdGltZXpvbmUgaW4gYGxvY2F0ZSAvdXNyL3NoYXJlL3pvbmVpbmZvL3xmZ3JlcCAtdiAvcmlnaHQvfGZncmVwIC12IC9wb3NpeC9gOyBkbwordGltZXpvbmU9JHt0aW1lem9uZSMvdXNyL3NoYXJlL3pvbmVpbmZvL30KK2VjaG8gVFo9JHRpbWV6b25lID4+ICRvdXRmaWxlCitUWj0kdGltZXpvbmUgbWFrZSBjaGVjayAkMiA+PiAkb3V0ZmlsZSAyPiYxCitkb25lCisKK2VjaG8gIkRvbmUgdGVzdGluZyAkMSBpbiBhbGwgdGltZXpvbmVzIgorCmRpZmYgLS1naXQgYS9yZWxlYXNlL2MvYm9tZml4LnB5IGIvcmVsZWFzZS9jL2JvbWZpeC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmNkNzlhCi0tLSAvZGV2L251bGwKKysrIGIvcmVsZWFzZS9jL2JvbWZpeC5weQpAQCAtMCwwICsxLDg4IEBACisjIS91c3IvYmluL3B5dGhvbgorCisjIENvcHlyaWdodCAoQykgMjAxMSBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgUnVuIHRoaXMgbGlrZSBzbzoKKyMgIGNkIC9wYXRoL3RvL0lDVQorIyAgcHl0aG9uIC9wYXRoL3RvL3RoaXNzY3JpcHQvYm9tZml4LnB5CisjCisjIGl0IHdpbGwgZml4dXAgYW55IGZpbGVzIHRoYXQgaGF2ZSBhIG1pbWUtdHlwZSBvZiAidXRmLTgiIGJ1dCBubyBCT00uCisKK2ltcG9ydCBvcworaW1wb3J0IHN2bi5jb3JlLCBzdm4uY2xpZW50LCBzdm4ud2MKK2ltcG9ydCBjb2RlY3MKKworCitwcmludCAiRml4aW5nIGJvbSBpbiAuXG4iCisKK2N0eCA9IHN2bi5jbGllbnQuc3ZuX2NsaWVudF9jdHhfdCgpCisKK3RyZWUgPSBvcy53YWxrKCIuIikKKworbm90cz0wCitub3R1dGY4PTAKK25vcHJvcHM9MAordXRmOD0wCitmaXhlZD0wCit0ZmlsZXM9MAorYm9tPWNvZGVjcy5CT01fVVRGOAorCisKK2ZvciBlbnQgaW4gdHJlZToKKyAgICAocGF0aCxkaXJzLGZpbGVzKSA9IGVudAorICAgIGlmKHBhdGguZmluZCgiLy5zdm4iKSAhPSAtMSk6CisgICAgICAgIGNvbnRpbnVlCisgICAgZm9yIGZpbGUgaW4gZmlsZXM6CisgICAgICAgIHRmaWxlcz10ZmlsZXMrMQorICAgICAgICByZXZpc2lvbiA9IHN2bi5jb3JlLnN2bl9vcHRfcmV2aXNpb25fdCgpCisgICAgICAgIGZwID0gb3MucGF0aC5hYnNwYXRoKHBhdGggKyAiLyIgKyBmaWxlKQorICAgICAgICAjcHJpbnQgInRlc3RpbmcgIiArIGZwCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHByb3BzID0gc3ZuLmNsaWVudC5wcm9wZ2V0KCJzdm46bWltZS10eXBlIiwgZnAsIHJldmlzaW9uLCAwLCBjdHgpCisgICAgICAgICAgICBpZiAobm90IHByb3BzIG9yIG5vdCBwcm9wc1tmcF0pOiAKKyAgICAgICAgICAgICAgICBub3Byb3BzID0gbm9wcm9wcyArIDEKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgCisgICAgICAgICAgICB0eXBlID0gcHJvcHNbZnBdCisKKyAgICAgICAgICAgIGlmIChub3QgdHlwZSA9PSAidGV4dC9wbGFpbjtjaGFyc2V0PXV0Zi04Iik6CisgICAgICAgICAgICAgICAgbm90dXRmOCA9IG5vdHV0ZjggKyAxCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgIyBmcCBpcyB1dGYtOAorICAgICAgICAgICAgdXRmOD11dGY4KzEKKworICAgICAgICAgICAgZiA9IG9wZW4oZnAsICdyYicpCisgICAgICAgICAgICBieXRlcz1mLnJlYWQoMykKKyAgICAgICAgICAgIGlmIG5vdCBieXRlczoKKyAgICAgICAgICAgICAgICBwcmludCBmcCArICI6IGNvdWxkIG5vdCByZWFkIDMgYnl0ZXMiCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGVsaWYgKGJ5dGVzID09IGJvbSk6CisgICAgICAgICAgICAgICAgI3ByaW50IGZwICsgIjogT0siCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgZi5zZWVrKDApCisgICAgICAgICAgICAKKyAgICAgICAgICAgIG9zLnJlbmFtZShmcCxmcCsiLnRtcCIpCisgICAgICAgICAgICBvPW9wZW4oZnAsJ3diJykKKyAgICAgICAgICAgIG8ud3JpdGUoYm9tKQorICAgICAgICAgICAgd2hpbGUoMSk6CisgICAgICAgICAgICAgICAgYnl0ZXMgPSBmLnJlYWQoMjA0OCkKKyAgICAgICAgICAgICAgICBpZiBieXRlczoKKyAgICAgICAgICAgICAgICAgICAgby53cml0ZShieXRlcykKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgby5jbG9zZSgpCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIG9zLnJlbW92ZShmcCsiLnRtcCIpCisgICAgICAgICAgICBmaXhlZD1maXhlZCsxCisgICAgICAgICAgICAKKworICAgICAgICAgICAgcHJpbnQgZnAKKyAgICAgICAgICAgIAorICAgICAgICBleGNlcHQgc3ZuLmNvcmUuU3VidmVyc2lvbkV4Y2VwdGlvbjoKKyAgICAgICAgICAgIG5vdHMgPSBub3RzICsgMQorICAgICAgICAgICAgI3ByaW50ICJOb3QgdW5kZXIgdmM6ICIgKyBmcAorCisKK3ByaW50ICIlZCBmaWxlcywgJWQgbm90IHVuZGVyIHN2biwgJWQgd2l0aCBubyBwcm9wcywgJWQgbm90IHV0Zjg6ICVkIHV0ZjgsICVkIGZpeGVkXG4iICUgKHRmaWxlcyxub3RzLG5vcHJvcHMsbm90dXRmOCx1dGY4LGZpeGVkKQpkaWZmIC0tZ2l0IGEvcmVsZWFzZS9jL2Vudmlyb25tZW50VGVzdC5zaCBiL3JlbGVhc2UvYy9lbnZpcm9ubWVudFRlc3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTU0MjA2YwotLS0gL2Rldi9udWxsCisrKyBiL3JlbGVhc2UvYy9lbnZpcm9ubWVudFRlc3Quc2gKQEAgLTAsMCArMSwyMiBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAwNi0yMDA4IElCTSBBbGwgUmlnaHRzIFJlc2VydmVkCisjCisjIFRoaXMgdGVzdCBzY3JpcHQgZW51bWVyYXRlcyBhbGwgbG9jYWxlcyBhbmQgYWxsIHRpbWV6b25lcyBpbnN0YWxsZWQgb24gYQorIyBtYWNoaW5lICh1c3VhbGx5IExpbnV4KSwgYW5kIHJ1bnMgdGhlIGV4aXN0aW5nIElDVTRDIHRlc3RzIHRvIG1ha2Ugc3VyZSB0aGF0CisjIHRoZSB0ZXN0cyBwYXNzLiBOb3QgZXZlcnlvbmUgaXMgdXNpbmcgYW5kIHRlc3RpbmcgSUNVNEMgaW4gdGhlIGVuX1VTIGxvY2FsZQorIyB3aXRoIHRoZSBQYWNpZmljIHRpbWV6b25lLgordG9wX2ljdV9kaXI9Li4vLi4vLi4vaWN1CityZWxlYXNlX3Rvb2xzX2Rpcj0uLi8uLi8uLi8uLi90b29scy9yZWxlYXNlL2MKK2NkICR0b3BfaWN1X2Rpci9zb3VyY2UvdGVzdC9pbnRsdGVzdAorJHJlbGVhc2VfdG9vbHNfZGlyL2FsbExvY2FsZVRlc3Quc2ggaW50bHRlc3QgJgorJHJlbGVhc2VfdG9vbHNfZGlyL2FsbFRpbWV6b25lVGVzdC5zaCBpbnRsdGVzdCAmCitjZCAuLi9pb3Rlc3QKKyRyZWxlYXNlX3Rvb2xzX2Rpci9hbGxMb2NhbGVUZXN0LnNoIGlvdGVzdCBJT1RFU1RfT1BUUz1pb3Rlc3QtYy1sb2MudHh0ICYKKyRyZWxlYXNlX3Rvb2xzX2Rpci9hbGxUaW1lem9uZVRlc3Quc2ggaW90ZXN0IElPVEVTVF9PUFRTPWlvdGVzdC1jLXR6LnR4dCAmCitjZCAuLi9jaW50bHRzdAorJHJlbGVhc2VfdG9vbHNfZGlyL2FsbExvY2FsZVRlc3Quc2ggY2ludGx0c3QgJgorJHJlbGVhc2VfdG9vbHNfZGlyL2FsbFRpbWV6b25lVGVzdC5zaCBjaW50bHRzdCAmCisKK2VjaG8gIkFsbCB0ZXN0cyBoYXZlIGJlZW4gc3Bhd25lZC4iCitlY2hvICJQbGVhc2Ugd2FpdCB3aGlsZSB0aGUgdGVzdHMgcnVuLiBUaGlzIG1heSB0YWtlIGEgd2hpbGUuIgpkaWZmIC0tZ2l0IGEvcmVsZWFzZS9jL29zLW1hcHBpbmcvTWFrZWZpbGUgYi9yZWxlYXNlL2Mvb3MtbWFwcGluZy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjIyMzg3Ci0tLSAvZGV2L251bGwKKysrIGIvcmVsZWFzZS9jL29zLW1hcHBpbmcvTWFrZWZpbGUKQEAgLTAsMCArMSw3MCBAQAorIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjCisjICAgQ29weXJpZ2h0IChDKSAyMDA2LTIwMDgsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMKKyMgICBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIworIyAgRklMRSBOQU1FIDogTWFrZWZpbGUKKyMKKyMgICBEYXRlICAgICAgICBOYW1lICAgICAgICBEZXNjcmlwdGlvbgorIyAgIDAzLzAyLzIwMDYgIGdyaG90ZW4gICAgIENyZWF0aW9uLgorIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyMjIExpc3Qgb2YgcGhvbnkgdGFyZ2V0cworLlBIT05ZIDogYWxsIGFsbC1sb2NhbCBpbnN0YWxsIGluc3RhbGwtbG9jYWwgY2xlYW4gY2xlYW4tbG9jYWwJXAorZGlzdGNsZWFuIGRpc3RjbGVhbi1sb2NhbCBpbnN0YWxsLWxpYnJhcnkgaW5zdGFsbC1oZWFkZXJzIGRpc3QJXAorZGlzdC1sb2NhbCBjaGVjayBjaGVjay1sb2NhbAorCisjIyBDbGVhciBzdWZmaXggbGlzdAorLlNVRkZJWEVTIDoKKworIyMgTGlzdCBvZiBzdGFuZGFyZCB0YXJnZXRzCithbGw6IGFsbC1sb2NhbAoraW5zdGFsbDogaW5zdGFsbC1sb2NhbAorY2xlYW46IGNsZWFuLWxvY2FsCitkaXN0Y2xlYW4gOiBkaXN0Y2xlYW4tbG9jYWwKK2Rpc3Q6IGRpc3QtbG9jYWwKK2NoZWNrOiBhbGwgY2hlY2stbG9jYWwKKworQUxMX1RBUkdFVFMgPSBkaXNwbGF5TG9jYWxlQ29udiB0ZXN0VGltZXpvbmUKKyNJQ1VfQkFTRSA9IC9ob21lL2J1aWxkL0J1aWxkX0lDVV9IUDExaUFDQworI0lDVV9CQVNFID0gL2hvbWUvYnVpbGQvQnVpbGRfSUNVX1NvbGFyaXM5Q0MKK0lDVV9CQVNFID0gL2hvbWUvYnVpbGQvQnVpbGRfSUNVX0xpbnV4UkhFTDQuMgorI0lDVV9CQVNFID0gL2hvbWUvYnVpbGQvQnVpbGRfSUNVX01hY09TWAorI0lDVV9CQVNFID0gL2hvbWUvYnVpbGQvQnVpbGRfSUNVX0FJWDUuMlZBNgorCithbGwtbG9jYWw6ICQoQUxMX1RBUkdFVFMpCisKK2Rpc3BsYXlMb2NhbGVDb252OiBkaXNwbGF5TG9jYWxlQ29udi5jCisJI2FDQyArREQ2NCAtSSQoSUNVX0JBU0UpL2ljdS9zb3VyY2UvY29tbW9uLyAtTCQoSUNVX0JBU0UpL2ljdS9zb3VyY2UvbGliLyAtbGljdXVjIC1saWN1ZGF0YSAtbyAkQCAkPAorCSNDQyAteHRhcmdldD11bHRyYSAteGFyY2g9djkgLUkkKElDVV9CQVNFKS9pY3Uvc291cmNlL2NvbW1vbi8gLUwkKElDVV9CQVNFKS9pY3Uvc291cmNlL2xpYi8gLWxpY3V1YyAtbGljdWRhdGEgLW8gJEAgJDwKKwlnY2MgLUkgJChJQ1VfQkFTRSkvaWN1L3NvdXJjZS9jb21tb24vIC1MJChJQ1VfQkFTRSkvaWN1L3NvdXJjZS9saWIvIC1saWN1dWMgLWxpY3VkYXRhIC1vICRAICQ8CisJI2djYyAtSSAkKElDVV9CQVNFKS9pY3Uvc291cmNlL2NvbW1vbi8gLUwkKElDVV9CQVNFKS9pY3Uvc291cmNlL2xpYi8gLWxpY3V1YyAtbGljdWRhdGEgLW8gJEAgJDwKKwkjeGxjIC1xNjQgLUkgJChJQ1VfQkFTRSkvaWN1L3NvdXJjZS9jb21tb24vIC1MJChJQ1VfQkFTRSkvaWN1L3NvdXJjZS9saWIvIC1saWN1dWMzNSAtbGljdWRhdGEzNSAtbyAkQCAkPAorCit0ZXN0VGltZXpvbmU6IHRlc3RUaW1lem9uZS5jCisJI2FDQyArREQ2NCAtSSQoSUNVX0JBU0UpL2ljdS9zb3VyY2UvY29tbW9uLyAtSSQoSUNVX0JBU0UpL2ljdS9zb3VyY2UvaTE4bi8gLUwkKElDVV9CQVNFKS9pY3Uvc291cmNlL2xpYi8gLWxpY3V1YyAtbGljdWRhdGEgLW8gJEAgJDwKKwkjQ0MgLXh0YXJnZXQ9dWx0cmEgLXhhcmNoPXY5IC1JJChJQ1VfQkFTRSkvaWN1L3NvdXJjZS9jb21tb24vIC1JJChJQ1VfQkFTRSkvaWN1L3NvdXJjZS9pMThuLyAtTCQoSUNVX0JBU0UpL2ljdS9zb3VyY2UvbGliLyAtbGljdXVjIC1saWN1ZGF0YSAtbyAkQCAkPAorCWdjYyAtSSAkKElDVV9CQVNFKS9pY3Uvc291cmNlL2NvbW1vbi8gLUkkKElDVV9CQVNFKS9pY3Uvc291cmNlL2kxOG4vIC1MJChJQ1VfQkFTRSkvaWN1L3NvdXJjZS9saWIvIC1saWN1dWMgLWxpY3VkYXRhIC1vICRAICQ8CisJI2djYyAtSSAkKElDVV9CQVNFKS9pY3Uvc291cmNlL2NvbW1vbi8gLUkkKElDVV9CQVNFKS9pY3Uvc291cmNlL2kxOG4vIC1MJChJQ1VfQkFTRSkvaWN1L3NvdXJjZS9saWIvIC1saWN1dWMgLWxpY3VkYXRhIC1vICRAICQ8CisJI3hsYyAtcTY0IC1JICQoSUNVX0JBU0UpL2ljdS9zb3VyY2UvY29tbW9uLyAtSSQoSUNVX0JBU0UpL2ljdS9zb3VyY2UvaTE4bi8gLUwkKElDVV9CQVNFKS9pY3Uvc291cmNlL2xpYi8gLWxpY3V1YzM1IC1saWN1ZGF0YTM1IC1vICRAICQ8CisKKworaW5zdGFsbC1sb2NhbDogaW5zdGFsbC1oZWFkZXJzIGluc3RhbGwtbGlicmFyeQorCitpbnN0YWxsLWxpYnJhcnk6IGFsbC1sb2NhbAorCitpbnN0YWxsLWhlYWRlcnM6CisKK2Rpc3QtbG9jYWw6CisKK2NsZWFuLWxvY2FsOgorIwl0ZXN0IC16ICIkKENMRUFORklMRVMpIiB8fCAkKFJNVikgJChDTEVBTkZJTEVTKQorCXJtICQoT0JKRUNUUykgJChBTExfVEFSR0VUUykgJChTT19WRVJTSU9OX0RBVEEpCisKK2Rpc3RjbGVhbi1sb2NhbDogY2xlYW4tbG9jYWwKKworY2hlY2stbG9jYWw6CisKKwpkaWZmIC0tZ2l0IGEvcmVsZWFzZS9jL29zLW1hcHBpbmcvZGlzcGxheUxvY2FsZUNvbnYuYyBiL3JlbGVhc2UvYy9vcy1tYXBwaW5nL2Rpc3BsYXlMb2NhbGVDb252LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM4MDUyNgotLS0gL2Rldi9udWxsCisrKyBiL3JlbGVhc2UvYy9vcy1tYXBwaW5nL2Rpc3BsYXlMb2NhbGVDb252LmMKQEAgLTAsMCArMSwzNSBAQAorLyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIENvcHlyaWdodCAoQykgMjAwNi0yMDA4LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzCisqICAgQ29ycG9yYXRpb24gYW5kIG90aGVycy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogIEZJTEUgTkFNRSA6IHRlc3RUaW1lem9uZS5jCisqCisqICAgRGF0ZSAgICAgICAgTmFtZSAgICAgICAgRGVzY3JpcHRpb24KKyogICAwMy8wMi8yMDA2ICBncmhvdGVuICAgICBDcmVhdGlvbi4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKyNpbmNsdWRlICJ1bmljb2RlL3B1dGlsLmgiCisjaW5jbHVkZSAidW5pY29kZS91Y252LmgiCisjaW5jbHVkZSAidW5pY29kZS91bG9jLmgiCisjaW5jbHVkZSAidW5pY29kZS91cmVzLmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIqIGNvbnN0IGFyZ3ZbXSkgeworICAgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOworCisgICAgdXJlc19jbG9zZSh1cmVzX29wZW4oTlVMTCwgTlVMTCwgJnN0YXR1cykpOworICAgIGlmIChzdGF0dXMgIT0gVV9aRVJPX0VSUk9SKSB7CisgICAgICAgIHByaW50ZigidWxvY19nZXREZWZhdWx0ID0gJXNcbiIsIHVsb2NfZ2V0RGVmYXVsdCgpKTsKKyAgICAgICAgcHJpbnRmKCJMb2NhbGUgYXZhaWxhYmxlIGluIElDVSA9ICVzXG4iLCBzdGF0dXMgPT0gVV9aRVJPX0VSUk9SID8gIlRSVUUiIDogIkZBTFNFIik7CisgICAgfQorICAgIGlmIChzdHJjbXAodWNudl9nZXREZWZhdWx0TmFtZSgpLCAiVVMtQVNDSUkiKSA9PSAwKSB7CisgICAgICAgIHByaW50ZigidXBydl9nZXREZWZhdWx0Q29kZXBhZ2UgPSAlc1xuIiwgdXBydl9nZXREZWZhdWx0Q29kZXBhZ2UoKSk7CisgICAgICAgIHByaW50ZigidWNudl9nZXREZWZhdWx0TmFtZSA9ICVzXG4iLCB1Y252X2dldERlZmF1bHROYW1lKCkpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3JlbGVhc2UvYy9vcy1tYXBwaW5nL3JlYWRtZS50eHQgYi9yZWxlYXNlL2Mvb3MtbWFwcGluZy9yZWFkbWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYmI2MzgKLS0tIC9kZXYvbnVsbAorKysgYi9yZWxlYXNlL2Mvb3MtbWFwcGluZy9yZWFkbWUudHh0CkBAIC0wLDAgKzEsMTIgQEAKKyMKKyMgICBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOCwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcworIyAgIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworCitUaGVzZSB0ZXN0cyBhbGxvdyB5b3UgdG8gc2VlIGhvdyB0aW1lem9uZXMsIGxvY2FsZXMsIGNoYXJzZXRzIGFuZCBvdGhlciBzaW1pbGFyIHN0dWZmIGFyZSBtYXBwZWQgZnJvbSB0aGUgT1MgdmFsdWVzIHRvIElDVSBzcGVjaWZpYyB2YWx1ZXMuCisKK1NvbWUgdHdlYWtpbmcgbWF5IGJlIHJlcXVpcmVkIHRvIGdldCB0aGVzZSB0b29scyB0byB3b3JrLgorCitJZiB0aGUgY2hhcnNldCBtYXBzIHRvIFVTLUFTQ0lJLCBpdCBtYXkgYmUgYW4gaW5kaWNhdGlvbiB0aGF0IHRoZSBhbGlhcyBvciBtYXBwaW5nIHRhYmxlIGRvIG5vdCBleGlzdCBpbiBJQ1UuCitJZiB0aGUgbG9jYWxlIGRvZXNuJ3QgZXhpc3QsIHRoZSB0ZXN0IHdpbGwgc3RhdGUgdGhhdCB0aGUgbG9jYWxlIGlzIG5vdCBhdmFpbGFibGUuCitJZiB0aGUgdGltZXpvbmUgZG9lc24ndCBtYXRjaCwgaXQgd2lsbCBiZSBsaXN0ZWQgYXMgYSBkaWZmZXJlbmNlLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3JlbGVhc2UvYy9vcy1tYXBwaW5nL3Rlc3RMb2NhbGVzLnNoIGIvcmVsZWFzZS9jL29zLW1hcHBpbmcvdGVzdExvY2FsZXMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTE1ZTA5OAotLS0gL2Rldi9udWxsCisrKyBiL3JlbGVhc2UvYy9vcy1tYXBwaW5nL3Rlc3RMb2NhbGVzLnNoCkBAIC0wLDAgKzEsOCBAQAorIyEvYmluL3NoCisjKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMKKyMgICBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwOCwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcworIyAgIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitmb3IgbG9jIGluIGBsb2NhbGUgLWFgOyBkbyBlY2hvIDsgZWNobyBMQ19BTEw9JGxvYyA7IExDX0FMTD0kbG9jIC4vZGlzcGxheUxvY2FsZUNvbnYgOyBkb25lCmRpZmYgLS1naXQgYS9yZWxlYXNlL2Mvb3MtbWFwcGluZy90ZXN0VGltZXpvbmUuYyBiL3JlbGVhc2UvYy9vcy1tYXBwaW5nL3Rlc3RUaW1lem9uZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NjdjYTYKLS0tIC9kZXYvbnVsbAorKysgYi9yZWxlYXNlL2Mvb3MtbWFwcGluZy90ZXN0VGltZXpvbmUuYwpAQCAtMCwwICsxLDM1IEBACisvKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgQ29weXJpZ2h0IChDKSAyMDA2LTIwMDgsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMKKyogICBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgRklMRSBOQU1FIDogdGVzdFRpbWV6b25lLmMKKyoKKyogICBEYXRlICAgICAgICBOYW1lICAgICAgICBEZXNjcmlwdGlvbgorKiAgIDAzLzAyLzIwMDYgIGdyaG90ZW4vbW93IENyZWF0aW9uLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisjaW5jbHVkZSAidW5pY29kZS9wdXRpbC5oIgorI2luY2x1ZGUgInVuaWNvZGUvdWRhdC5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGltZS5oPgorCitpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciogY29uc3QgYXJndltdKSB7CisgICAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisgICAgY2hhciBzeXNUaW1lU3RyWzI1Nl07CisgICAgc3RydWN0IHRtIHN1bW1lclRpbWVUTTsKKyAgICBzdHJ1Y3QgdG0gd2ludGVyVGltZVRNOworCisgICAgbWVtc2V0KHN5c1RpbWVTdHIsIDAsIHNpemVvZihzeXNUaW1lU3RyKSk7CisgICAgbWVtc2V0KCZzdW1tZXJUaW1lVE0sIDAsIHNpemVvZihzdW1tZXJUaW1lVE0pKTsKKyAgICBtZW1zZXQoJndpbnRlclRpbWVUTSwgMCwgc2l6ZW9mKHdpbnRlclRpbWVUTSkpOworCisgICAgc3RycHRpbWUoIjIwMDYtMDYtMDEgMTI6MDAiLCAiJVktJW0tJWQgJUg6JU0iLCAmc3VtbWVyVGltZVRNKTsKKyAgICBzdHJmdGltZShzeXNUaW1lU3RyLCBzaXplb2Yoc3lzVGltZVN0ciktMSwgIiVZLSVtLSVkICVIOiVNIiwgJnN1bW1lclRpbWVUTSk7CisgICAgcHV0cyhzeXNUaW1lU3RyKTsKK30KZGlmZiAtLWdpdCBhL3JlbGVhc2UvYy9vcy1tYXBwaW5nL3Rlc3RUaW1lem9uZXMuc2ggYi9yZWxlYXNlL2Mvb3MtbWFwcGluZy90ZXN0VGltZXpvbmVzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA0OTViNTEKLS0tIC9kZXYvbnVsbAorKysgYi9yZWxlYXNlL2Mvb3MtbWFwcGluZy90ZXN0VGltZXpvbmVzLnNoCkBAIC0wLDAgKzEsNDUgQEAKKyMhL2Jpbi9zaAorIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjCisjICAgQ29weXJpZ2h0IChDKSAyMDA2LTIwMDgsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMKKyMgICBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgordGltZXpvbmVzPWBsb2NhdGUgem9uZWluZm8gfCBmZ3JlcCAtdiBldm9sdXRpb24tZGF0YS1zZXJ2ZXJgCitmb3IgdHpvbmUgaW4gJHRpbWV6b25lcworZG8gCisgICAgaWYgWyAtZiAkdHpvbmUgXTsgdGhlbgorICAgICAgICB0em5hbWU9JHt0em9uZSMvdXNyL3NoYXJlL3pvbmVpbmZvL30KKyAgICAgICAgSUNVVGltZT1gTERfTElCUkFSWV9QQVRIPS4uL2Rldi1pY3UvaWN1L3NvdXJjZS9saWIvIFRaPSR0em5hbWUgLi9jaGVja1RpbWV6b25lYAorICAgICAgICBzeXN0ZW1Ib3VyPWBUWj0kdHpuYW1lIGRhdGUgKyVJYAorICAgICAgICAjIE9TIFggZG9lcyBub3QgYWxsb3cgJS1JIHNvIHRoaXMgdWdseSBtZXNzIG5lZWRzIHRvIG9jY3VyCisgICAgICAgIGlmIFsgIiR7c3lzdGVtSG91cjowOjF9IiA9PSAiMCIgXTsgdGhlbgorICAgICAgICAgICAgc3lzdGVtSG91cj0ke3N5c3RlbUhvdXI6MToxfQorICAgICAgICBmaQorICAgICAgICBzeXN0ZW1UaW1lU2hvcnQ9YFRaPSR0em5hbWUgZGF0ZSArJWJcICVkLFwgJVlgCisgICAgICAgIHN5c3RlbVRpbWVTaG9ydD0iJHtzeXN0ZW1UaW1lU2hvcnR9ICR7c3lzdGVtSG91cn0iCisgICAgICAgIHN5c3RlbVRpbWVBTVBNPWBUWj0kdHpuYW1lIGRhdGUgKyVwYAorICAgICAgICBpbmRleDE9YGV4cHIgIiRzeXN0ZW1UaW1lU2hvcnQiIDogJy4qJ2AKKyAgICAgICAgaW5kZXgyPWBleHByICIkSUNVVGltZSIgOiAnLionYC0yCisgICAgICAgIElDVVRpbWVTaG9ydD0ke0lDVVRpbWU6MDoke2luZGV4MX19CisgICAgICAgIElDVUFNUE09JHtJQ1VUaW1lOiR7aW5kZXgyfToyfQorICAgICAgICBzeXN0ZW1UaW1lPWBUWj0kdHpuYW1lIGRhdGUgKyViXCAlZCxcICVZXCAlcmAKKyAgICAgICAgaWYgWyAiJHN5c3RlbVRpbWVTaG9ydCIgPT0gIiRJQ1VUaW1lU2hvcnQiIF0gJiYgWyAiJHN5c3RlbVRpbWVBTVBNIiA9PSAiJElDVUFNUE0iIF07IHRoZW4KKyAgICAgICAgICAgIGlmIFsgIiRvcHQxIiAhPSAiLWJhZCIgXTsgdGhlbgorICAgICAgICAgICAgICAgIGVjaG8gVFo9JHR6bmFtZQorICAgICAgICAgICAgICAgIGVjaG8gU3lzdGVtOiAkc3lzdGVtVGltZQorICAgICAgICAgICAgICAgIGVjaG8gSUNVOiAkSUNVVGltZQorICAgICAgICAgICAgZmkKKyAgICAgICAgZWxzZSAKKyAgICAgICAgICAgIGlmIFsgIiRvcHQxIiA9PSAiLWFsbCIgXTsgdGhlbgorICAgICAgICAgICAgICAgIGVjaG8gLS1UWj0kdHpuYW1lCisgICAgICAgICAgICAgICAgZWNobyAtLVN5c3RlbTogJHN5c3RlbVRpbWUKKyAgICAgICAgICAgICAgICBlY2hvIC0tSUNVOiAkSUNVVGltZQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGVjaG8gVFo9JHR6bmFtZQorICAgICAgICAgICAgICAgIGVjaG8gU3lzdGVtOiAkc3lzdGVtVGltZQorICAgICAgICAgICAgICAgIGVjaG8gSUNVOiAkSUNVVGltZQorICAgICAgICAgICAgZmkKKyAgICAgICAgZmkKKyAgICBmaQorZG9uZQpkaWZmIC0tZ2l0IGEvcmVsZWFzZS9jL3Vjb25maWd0ZXN0LnNoIGIvcmVsZWFzZS9jL3Vjb25maWd0ZXN0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFkN2NiZWYKLS0tIC9kZXYvbnVsbAorKysgYi9yZWxlYXNlL2MvdWNvbmZpZ3Rlc3Quc2gKQEAgLTAsMCArMSwyODYgQEAKKyMhL2Jpbi9zaAorIyBFeGhhdXN0KGl2ZSwgaW5nKSAgKE1lYW4sIE11bHRpKSAgKFRlc3QsIFRyb3VibGUpCisjIENvcHlyaWdodCAoYykgMjAwMi0yMDEwIElCTSBBbGwgUmlnaHRzIFJlc2VydmVkCisjCisKKyMgQnVpbGRzIElDVSBhIHdob2xlIGxvdHRhIHRpbWVzIGFuZCB3aXRoIGRpZmZlcmVudCBvcHRpb25zCisjIFNldCB0aGUgb3B0aW9ucyBiZWxvdyBhbmQgZXhlY3V0ZSB0aGlzIHNjcmlwdCB3aXRoIHRoZSBzaGVsbC4KKworIyBUaGlzIHNjcmlwdCBpcyBjaGVja2VkIGludG8gdG9vbHMvdHJ1bmsvcmVsZWFzZS9jLiBJdCBhc3N1bWVzIHRoYXQgdGhlCisjIGljdSBkaXJlY3RvcnkgaXMgYXQgdGhlIHNhbWUgbGV2ZWwgYXMgdGhlIHRvb2xzICBkaXJlY3RvcnkuIElmIHRoaXMKKyMgaXMgbm90IHRoZSBjYXNlLCB1c2UgdGhlIHVjb25maWd0ZXN0LmxvY2FsIGZpbGUgdG8gc2V0IHRoZQorIyBTUkNfRElSIHZhcmlhYmxlIHRvIHBvaW50IGF0IHRoZSBJQ1Ugc291cmNlIGRpcmVjdG9yeS4gCisjIE9yLCBhbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIG1ha2UgYSBzeW1saW5rIHRvb2xzL2ljdSAtPiB5b3VyX2ljdV9kaXIKKyMgWW91IGNhbiBhbHNvIHVzZSB0aGUgdWNvbmZpZ3Rlc3QubG9jYWwgZmlsZSB0byBvdmVycmlkZSB0aGUgQlVJTERfRElSCisjIGFuZCBJQ1VQTEFURk9STSB2YXJpYWJsZXMuCisKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0gRmluZCBmdWxsIHBhdGggbmFtZXMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgY2hlY2sgZm9yIHVjb25maWd0ZXN0LmxvY2FsCitpZiBbIC1mIC4vdWNvbmZpZ3Rlc3QubG9jYWwgXQordGhlbgorICAgIC4gLi91Y29uZmlndGVzdC5sb2NhbAorZmkKKworIyBsb2NhdGlvbiBvZiB0aGlzIHNjcmlwdAorUz0kKHB3ZCkKKworIyBCdWlsZCByb290IC0gdG9vbHMvcmVsZWFzZS9jL3Vjb25maWd0ZXN0CitCVUlMRF9ESVI9JHtCVUlMRF9ESVI6LSR7U30vdWNvbmZpZ3Rlc3R9CisKKyMgdGhlIHJ1bkNvbmZpZ3VyZUlDVSBwbGF0Zm9ybSBuYW1lCitJQ1VQTEFURk9STT0ke0lDVVBMQVRGT1JNOi1MaW51eH0KKworIyBHbG9iYWwgQ29uZmlnIG9wdGlvbnMgdG8gdXNlCisjZXhwb3J0IENPUFRTPSIgLS13aXRoLWRhdGEtcGFja2FnaW5nPWFyY2hpdmUiCitleHBvcnQgQ09QVFM9CisKKyMgR2xvYmFsIHRlc3Rpbmcgb3B0aW9ucyB0byB1c2UKK2V4cG9ydCBJTlRMVEVTVE9QVFM9LXcgCitleHBvcnQgQ0lOVExURVNUX09QVFM9LXcKKyMgLS0tIFByb2JhYmx5IHdpbGwgbm90IG5lZWQgdG8gbW9kaWZ5IHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIC0tLQorCisjIElDVSBkaXJlY3RvcnkgaXMgJFMvLi4vLi4vLi4vaWN1CitJQ1U9JChkaXJuYW1lICQoZGlybmFtZSAkKGRpcm5hbWUgJHtTfSkpKS9pY3UKKworIyBTb3VyY2UgZGlyZWN0b3J5CitTUkNfRElSPSR7U1JDX0RJUjotJHtJQ1V9L3NvdXJjZX0KKworIyAtLS0tLS0tLS0tLS0gRW5kIG9mIGNvbmZpZyB2YXJpYWJsZXMKKworIyBQcmVwYXJlIHVjb25maWcuaAorVUNPTkZJR19IPSRTUkNfRElSL2NvbW1vbi91bmljb2RlL3Vjb25maWcuaAoraWYgZ3JlcCAtcSBteWNvbmZpZy5oICAkVUNPTkZJR19IIDsKK3RoZW4KKyAgICBlY2hvICIjICRVQ09ORklHX0ggYWxyZWFkeSBjb250YWlucyBvdXIgcGF0Y2gsIG5vIGNoYW5nZSIKK2Vsc2UKKyAgICBtdiAkVUNPTkZJR19IICR7VUNPTkZJR19IfS5vcmlnCisgICAgY2F0ID4gJFVDT05GSUdfSCAgPDxFT0YKKyNpZiBkZWZpbmVkKElOX1VDT05GSUdURVNUKQorI2luY2x1ZGUgIm15Y29uZmlnLmgiCisjZW5kaWYKKy8qIGZvciB1Y29uZmlndGVzdC5zaCAtIHlvdSBtYXkgUkVNT1ZFIGFib3ZlIHRoaXMgbGluZSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK0VPRgorY2F0ICR7VUNPTkZJR19IfS5vcmlnID4+ICR7VUNPTkZJR19IfQorICAgIGVjaG8gIiMgJFVDT05GSUdfSCB1cGRhdGVkIgorZmkKKworCisjIFN0YXJ0LCAgc2V0IGEgZGVmYXVsdCBuYW1lIHRvIHN0YXJ0IHdpdGggaW4gY2FzZSBzb21ldGhpbmcgZ29lcyB3cm9uZworCitleHBvcnQgTkFNRT1mb28KK21rZGlyIC1wICR7QlVJTERfRElSfSAke0JVSUxEX0RJUn0vdGltZXMgMj4vZGV2L251bGwKKworIyBCYW5uZXIgZnVuY3Rpb24gLSBwcmludCBhIHNlcGFyYXRvciB0byBzcGxpdCB0aGUgb3V0cHV0CitiYW4oKQoreworICAgIGVjaG8KKyAgICBlY2hvCisgICAgZWNobyAiIy0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0kTkFNRS0tLS0tLS0tLS0tLS0gLSMiCisgICAgZWNobworICAgIGVjaG8gIkNQUEZMQUdTID0gJENQUEZMQUdTIgorICAgIGVjaG8gIlVDT05GSUdTID0gJFVDT05GSUdTIgorICAgIGVjaG8KKyAgICBlY2hvICIgYnVpbGQgdG8gJHtCVUlMRF9ESVJ9LyR7TkFNRX0gYW5kIGluc3RhbGwgaW4gJHtCVUlMRF9ESVJ9L0kke05BTUV9ICIKKyAgICBlY2hvCit9CisKKyMgQ2xlYW4gdXAgdGhlIG9sZCB0cmVlIGJlZm9yZSBidWlsZGluZyBhZ2FpbgorY2xlYW4oKQoreworICAgIGVjaG8gY2xlYW5pbmcgJHtCVUlMRF9ESVJ9LyR7TkFNRX0gYW5kICR7QlVJTERfRElSfS9JJHtOQU1FfQorICAgIHJtIC1yZiAke0JVSUxEX0RJUn0vSSR7TkFNRX0gJHtCVUlMRF9ESVJ9LyR7TkFNRX0KKyAgICBta2RpciAtcCAke0JVSUxEX0RJUn0vJHtOQU1FfQorfQorCisjIFJ1biBjb25maWd1cmUgd2l0aCB0aGUgYXBwcm9wcmlhdGUgb3B0aW9ucyAob3V0IG9mIHNvdXJjZSBidWlsZCkKK2NvbmZpZygpCit7CisgICAgbWtkaXIgLXAgJHtCVUlMRF9ESVJ9LyR7TkFNRX0gMj4vZGV2L251bGwKKyAgICBjZCAke0JVSUxEX0RJUn0vJHtOQU1FfQorICAgIG1rZGlyIGVtdGluYyAyPi9kZXYvbnVsbAorCisgICAgIyBteWNvbmZpZy5oCisgICAgY2F0ID4gZW10aW5jL215Y29uZmlnLmggPDxFT0YKKy8qIE5BTUU9JHtOQU1FfSAgICAgICAgICAgICovCisvKiBVQ09ORklHUz0ke1VDT05GSUdTfSAgICAqLworLyogQ1BQRkxBR1M9JHtDUFBGTEFHU30gICAgKi8KKyNpZm5kZWYgX01ZQ09ORklHX0gKKyNkZWZpbmUgX01ZQ09ORklHX0gKKworRU9GCisgICAgZm9yIHdoYXQgaW4gYGVjaG8gJFVDT05GSUdTYDsKKyAgICBkbworICAgICAgICBlY2hvICIjZGVmaW5lIFVDT05GSUdfJHt3aGF0fSAxIiA+PiBlbXRpbmMvbXljb25maWcuaAorICAgIGRvbmUKKyAgICBjYXQgPj4gZW10aW5jL215Y29uZmlnLmggPDxFT0YKKyNlbmRpZgorRU9GCisgICAgQ1BQRkxBR1M9IiR7Q1BQRkxBR1N9IC1ESU5fVUNPTkZJR1RFU1QgLUkke0JVSUxEX0RJUn0vJHtOQU1FfS9lbXRpbmMiCisgICAgZWNobyAiQ1BQRkxBR1M9XCIkQ1BQRkxBR1NcIiBDb25maWd1cmUgJENPUFRTIC0tc3JjZGlyPSRTUkNfRElSIgorICAgICRTUkNfRElSL3J1bkNvbmZpZ3VyZUlDVSAke0lDVVBMQVRGT1JNfSAkQ09QVFMgLS1wcmVmaXg9JHtCVUlMRF9ESVJ9L0kke05BTUV9IC0tc3JjZGlyPSRTUkNfRElSIDI+JjEgPiAke0JVSUxEX0RJUn0vJHtOQU1FfS9jb25maWcub3V0Cit9CisKKyMgRG8gYW4gYWN0dWFsIGJ1aWxkCitibGQoKQoreworIyMqIyMgIFN0cmVhbSBmaWx0ZXIgdG8gcHV0ICdOQU1FOiAnIGluIGZyb250IG9mCisjIyojIyAgZXZlcnkgbGluZToKKyMjKiMjICAgICAgLiAuIC4gICAyPiYxIHwgdGVlIC1hIC4vYmxkLmxvZyB8IHNlZCAtZSAicy9eLyR7TkFNRX06IC8iCisgICAgY2QgJHtCVUlMRF9ESVJ9LyR7TkFNRX0KKyAgICAvdXNyL2Jpbi90aW1lIC1vICR7QlVJTERfRElSfS90aW1lcy8ke05BTUV9LmFsbCAgICAgbWFrZSAtayAtajIgYWxsICAgICAgICAgICAgICAgICAgICAgIAorICAgIC91c3IvYmluL3RpbWUgLW8gJHtCVUlMRF9ESVJ9L3RpbWVzLyR7TkFNRX0uaW5zdGFsbCBtYWtlIC1rIGluc3RhbGwgICAgICAgICAgICAgICAgICAKKyAgICAvdXNyL2Jpbi90aW1lIC1vICR7QlVJTERfRElSfS90aW1lcy8ke05BTUV9LmlsICAgICAgbWFrZSAtayBpbnN0YWxsLWxvY2FsICAgICAgICAgICAgCisgICAgL3Vzci9iaW4vdGltZSAtbyAke0JVSUxEX0RJUn0vdGltZXMvJHtOQU1FfS5jaGsgICAgIG1ha2UgLWsgLWoyIGNoZWNrIElOVExURVNUX09QVFM9LXcgQ0lOVExUU1RfT1BUUz0tdworICAgIFBBVEg9JHtCVUlMRF9ESVJ9L0kke05BTUV9L2JpbjokUEFUSCBtYWtlIC1DICR7QlVJTERfRElSfS8ke05BTUV9L3Rlc3QvaGRydHN0LyAgY2hlY2sgICAgCit9CisKKyMgRG8gYSBjb21wbGV0ZSBjeWNsZSBmb3IgYSBydW4KK2RvaXQoKQoreworYmFuIDsgY2xlYW4gOyBjb25maWcgOyBibGQKK30KKworIyBTZXQgdXAgdGhlIHZhcmlhYmxlcyBmb3IgY29udmVuaWVuY2UKK05PX0NPTD0iTk9fQ09MTEFUSU9OIgorTk9fQlJLPSJOT19CUkVBS19JVEVSQVRJT04iCitOT19GTVQ9Ik5PX0ZPUk1BVFRJTkciCitOT19VQ009Ik5PX0xFR0FDWV9DT05WRVJTSU9OIgorIyBTaW5jZSBOT19DT05WRVJTSU9OIGlzIG9ubHkgbWVhbnQgdG8gYWxsb3cgdGhlIGNvbW1vbiBhbmQgaTE4bgorIyBsaWJyYXJpZXMgdG8gYmUgYnVpbHQsIHdlIGRvbid0IHRlc3QgdGhpcyBjb25maWd1cmF0aW9uLgorI05PX0NOVj0iTk9fQ09OVkVSU0lPTiIKK05PX0ZJTz0iTk9fRklMRV9JTyIKK05PX1hMVD0iTk9fVFJBTlNMSVRFUkFUSU9OIgorTk9fUkdYPSJOT19SRUdVTEFSX0VYUFJFU1NJT05TIgorSlNfQ09MPSJPTkxZX0NPTExBVElPTiIKK05PX05STT0iTk9fTk9STUFMSVpBVElPTiIKK05PX0lETj0iTk9fSUROQSIKK05PX1NWQz0iTk9fU0VSVklDRSIKK05PX01TVD0iJE5PX0NPTCAkTk9fQlJLICROT19GTVQgJE5PX1VDTSAkTk9fRklPICROT19SR1ggJE5PX1hMVCAkTk9fTlJNICROT19JRE4gJE5PX1NWQyIKK05PX0FMTD0iJE5PX01TVCAkTk9fU1ZDIgorCisjIE5vdywgY29tZSB0aGUgYWN0dWFsIHRlc3QgcnVucworIyBFYWNoIG9uZSBzZXRzIGEgTkFNRSwgYW5kIENQUEZMQUdTIG9yIG90aGVyIGZsYWdzLCBhbmQgY2FsbHMgZG9pdAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIE5PX01TVAorZXhwb3J0IE5BTUU9Tk9fTVNUCitleHBvcnQgVUNPTkZJR1M9IiROT19NU1QiCitleHBvcnQgQ1BQRkxBR1M9IiIKK2RvaXQKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBOT19SR1gKK2V4cG9ydCBOQU1FPU5PX1JHWAorZXhwb3J0IFVDT05GSUdTPSIkTk9fUkdYIgorZXhwb3J0IENQUEZMQUdTPSIiCitkb2l0CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgTk9fQ09MCitleHBvcnQgTkFNRT1OT19DT0wKK2V4cG9ydCBVQ09ORklHUz0iJE5PX0NPTCIKK2V4cG9ydCBDUFBGTEFHUz0iIgorZG9pdAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIE5PX0JSSworZXhwb3J0IE5BTUU9Tk9fQlJLCitleHBvcnQgVUNPTkZJR1M9IiROT19CUksiCitleHBvcnQgQ1BQRkxBR1M9IiIKK2RvaXQKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBOT19GTVQKK2V4cG9ydCBOQU1FPU5PX0ZNVAorZXhwb3J0IFVDT05GSUdTPSIkTk9fRk1UIgorZXhwb3J0IENQUEZMQUdTPSIiCitkb2l0CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgTk9fVUNNCitleHBvcnQgTkFNRT1OT19VQ00KK2V4cG9ydCBVQ09ORklHUz0iJE5PX1VDTSIKK2V4cG9ydCBDUFBGTEFHUz0iIgorZG9pdAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIE5PX0ZJTworZXhwb3J0IE5BTUU9Tk9fRklPCitleHBvcnQgVUNPTkZJR1M9IiROT19GSU8iCitleHBvcnQgQ1BQRkxBR1M9IiIKK2RvaXQKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBOT19YTFQKK2V4cG9ydCBOQU1FPU5PX1hMVAorZXhwb3J0IFVDT05GSUdTPSIkTk9fWExUIgorZXhwb3J0IENQUEZMQUdTPSIiCitkb2l0CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgTk9fSUROCitleHBvcnQgTkFNRT1OT19JRE4KK2V4cG9ydCBVQ09ORklHUz0iJE5PX0lETiIKK2V4cG9ydCBDUFBGTEFHUz0iIgorZG9pdAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIE5PX05STQorZXhwb3J0IE5BTUU9Tk9fTlJNCitleHBvcnQgVUNPTkZJR1M9IiROT19OUk0iCitleHBvcnQgQ1BQRkxBR1M9IiIKK2RvaXQKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBOT19TVkMKK2V4cG9ydCBOQU1FPU5PX1NWQworZXhwb3J0IFVDT05GSUdTPSIkTk9fU1ZDIgorZXhwb3J0IENQUEZMQUdTPSIiCitkb2l0CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgSlNfQ09MCitleHBvcnQgTkFNRT1KU19DT0wKK2V4cG9ydCBVQ09ORklHUz0iJEpTX0NPTCIKK2V4cG9ydCBDUFBGTEFHUz0iIgorZG9pdAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIE5PX0FMTAorZXhwb3J0IE5BTUU9Tk9fQUxMCitleHBvcnQgVUNPTkZJR1M9IiROT19BTEwiCitleHBvcnQgQ1BQRkxBR1M9IiIKK2RvaXQKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBERUZBVUxUCitleHBvcnQgTkFNRT1ERUZBVUxUCitleHBvcnQgVUNPTkZJR1M9IiIKK2V4cG9ydCBDUFBGTEFHUz0iIgorZG9pdAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisKK05BTUU9ZG9uZQorYmFuCitlY2hvICJBbGwgYnVpbGRzIGZpbmlzaGVkISBUaW1lcyBhcmUgaW4gJHtCVUlMRF9ESVJ9L3RpbWVzIgorZWNobyAiVGhlcmUgd2VyZSBlcnJvcnMgaWYgdGhlIGZvbGxvd2luZyBncmVwIGZpbmRzIGFueXRoaW5nLiIKK2VjaG8gImdyZXAgc3RhdHVzICR7QlVJTERfRElSfS90aW1lcy8qIgorZ3JlcCBzdGF0dXMgJHtCVUlMRF9ESVJ9L3RpbWVzLyoKKwpkaWZmIC0tZ2l0IGEvcmVsZWFzZS9qYXZhLy5jbGFzc3BhdGggYi9yZWxlYXNlL2phdmEvLmNsYXNzcGF0aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzU1OGM0Ci0tLSAvZGV2L251bGwKKysrIGIvcmVsZWFzZS9qYXZhLy5jbGFzc3BhdGgKQEAgLTAsMCArMSw5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorIyBDb3B5cmlnaHQgKEMpIDIwMDkgSUJNIGFuZCBPdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKy0tPgorPGNsYXNzcGF0aD4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJjbGFzc2VzIi8+Cis8L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3JlbGVhc2UvamF2YS8ucHJvamVjdCBiL3JlbGVhc2UvamF2YS8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDdmZGNlCi0tLSAvZGV2L251bGwKKysrIGIvcmVsZWFzZS9qYXZhLy5wcm9qZWN0CkBAIC0wLDAgKzEsMjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisjIENvcHlyaWdodCAoQykgMjAwOSBJQk0gYW5kIE90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZAorLS0+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPnRvb2xzajwvbmFtZT4KKwk8Y29tbWVudD48L2NvbW1lbnQ+CisJPHByb2plY3RzPgorCTwvcHJvamVjdHM+CisJPGJ1aWxkU3BlYz4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwk8L2J1aWxkU3BlYz4KKwk8bmF0dXJlcz4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+CisJPC9uYXR1cmVzPgorPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9yZWxlYXNlL2phdmEvTWFrZWZpbGUgYi9yZWxlYXNlL2phdmEvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAzMTcyMAotLS0gL2Rldi9udWxsCisrKyBiL3JlbGVhc2UvamF2YS9NYWtlZmlsZQpAQCAtMCwwICsxLDgxIEBACisjIENvcHlyaWdodCAoQykgMjAwOS0yMDExIElCTSBhbmQgT3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkCisKKyMKKyMKKyMKKyNVc2FnZToKKyMgbWFrZSBPTERfSUNVPS94c3JsL0UvNDAxbTQwICBORVdfSUNVPS94c3JsL0UvaWN1NGN0NDIKKyMKKyMgeW91IGNhbiBwdXQgdGhlIE9MRF9JQ1U9eHggYW5kIE5FV19JQ1U9eXkgaW4gc2VwYXJhdGUgbGluZXMgaW4gTWFrZWZpbGUubG9jYWwgCisjCisKK0FOVD1hbnQKK0FOVF9UQVJHRVQ9YXBpcmVwb3J0CitET1hZR0VOPWRveHlnZW4KKworLWluY2x1ZGUgTWFrZWZpbGUubG9jYWwKKworVEFSR0VUPUFQSUNoYW5nZVJlcG9ydC5odG1sCisKK05PVFNFVD0KKworaWZlcSAoJChPTERfSUNVKSwpCitOT1RTRVQ6PSIkKE5PVFNFVCkgT0xEX0lDVSIKK2VuZGlmCisKK2lmZXEgKCQoTkVXX0lDVSksKQorTk9UU0VUOj0iJChOT1RTRVQpIE5FV19JQ1UiCitlbmRpZgorCitpZmVxICgkKE5FV19JQ1VfQlVJTEQpLCkKK05FV19JQ1VfQlVJTEQ6PSQoTkVXX0lDVSkvc291cmNlCitlbmRpZgorCitpZmVxICgkKE9MRF9JQ1VfQlVJTEQpLCkKK09MRF9JQ1VfQlVJTEQ6PSQoT0xEX0lDVSkvc291cmNlCitlbmRpZgorCithbGw6ICQoVEFSR0VUKSAkKExPQ0FMX1RBUkdFVCkKKworCitpZm5lcSAoJChOT1RTRVQpLCkKK2NoZWNrLXZhcnM6CisJQGVjaG8gIkVycm9yOiBwbGVhc2Ugc2V0ICQoTk9UU0VUKSBpbiBNYWtlZmlsZS5sb2NhbCBvciBvbiB0aGUgY29tbWFuZCBsaW5lLiIKKwlmYWxzZQorZWxzZQorY2hlY2stdmFyczoKK2VuZGlmCisKKy5QSE9OWTogY2hlY2stdmFycyBjbGFzc2VzIGNsZWFuLWRvY3MKKworLlBSRUNJT1VTOiAkKFRBUkdFVCkgJChPTERfSUNVX0JVSUxEKS8kKERPWFlGSUxFKSAkKE5FV19JQ1VfQlVJTEQpLyQoRE9YWUZJTEUpCisKKyMjIyMjIyMKK0RPWFlGSUxFPURveHlmaWxlCitYTUw9ZG9jL3htbAorVVZFUlNJT05IPSQoWE1MKS91dmVyc2lvbl84aC54bWwKKworY2xlYW4tZG9jczogfCBjaGVjay12YXJzCisJLXJtIC1yZiAiJChPTERfSUNVX0JVSUxEKS8kKFhNTCkiICIkKE5FV19JQ1VfQlVJTEQpLyQoWE1MKSIKKworJChUQVJHRVQpOiBjaGVjay12YXJzICQoT0xEX0lDVV9CVUlMRCkvJChYTUwpICQoTkVXX0lDVV9CVUlMRCkvJChYTUwpIAorCWVjaG8gIlJlbWVtYmVyIHRvIHJ1biB0aGUgbm9uLWFzY2lpIGZpbGUgZGV0ZWN0b3IgaWYgeW91IGdldCBlcnJvcnMuIgorCSQoQU5UKSAtRG9sZGRpcj0iJChPTERfSUNVX0JVSUxEKS8kKFhNTCkiIC1EbmV3ZGlyPSIkKE5FV19JQ1VfQlVJTEQpLyQoWE1MKSIgJChBTlRfVEFSR0VUKQorCisjIGNoZWNrLXZhcnMgJChPTERfSUNVX0JVSUxEKS8kKFhNTCkgJChORVdfSUNVX0JVSUxEKS8kKFhNTCkgCitBUElDaGFuZ2VSZXBvcnQueG1sOgorCWVjaG8gIlJlbWVtYmVyIHRvIHJ1biB0aGUgbm9uLWFzY2lpIGZpbGUgZGV0ZWN0b3IgaWYgeW91IGdldCBlcnJvcnMuIgorCSQoQU5UKSAtRG9sZGRpcj0iJChPTERfSUNVX0JVSUxEKS8kKFhNTCkiIC1EbmV3ZGlyPSIkKE5FV19JQ1VfQlVJTEQpLyQoWE1MKSIgJChBTlRfVEFSR0VUKV94bWwKKworJS9kb2MveG1sOgklL0RveHlmaWxlCisjIGRvbid0IGNhcmUgd2hhdCBHRU5FUkFURV9YTUwgaXMgc2V0IHRvIHByZXZpb3VzbHkgLSBzZXQgaXQgdG8geWVzLgorCUBlY2hvIHJ1bm5pbmcgZG94eXVnZW4gLi4gCisJKCBjZCAiJCovIiAmJiAoIChjYXQgLi9Eb3h5ZmlsZSB8IGdyZXAgLXYgJ15HRU5FUkFURV8nKSA7ICBlY2hvICdHRU5FUkFURV9YTUw9WUVTJykgIHwgJChET1hZR0VOKSAtICApCisJQGVjaG8gZG94eWdlbiBkb25lIGluICQqCisKKyUvRG94eWZpbGU6CSUvTWFrZWZpbGUKKwlAZWNobyBnZW5lcmF0aW5nICRACisJQCQoTUFLRSkgLUMgICIkKi8iIERveHlmaWxlIHx8ICggZWNobyAiY291bGQgbm90IG1ha2UgRG94eWZpbGUgaW4gJCogIC0gd2FzIGRveHlnZW4gYXZhaWxhYmxlPyIgOyBmYWxzZSApCisKKyMlL3NvdXJjZS9NYWtlZmlsZTogJS9zb3VyY2UvTWFrZWZpbGUuaW4KKyMJQGVjaG8gIiRAIGRvZXMgbm90IHNlZW0gdG8gZXhpc3QgLSB3YXMgY29uZmlndXJlIHJ1bj8iIDsgZmFsc2UKZGlmZiAtLWdpdCBhL3JlbGVhc2UvamF2YS9idWlsZC54bWwgYi9yZWxlYXNlL2phdmEvYnVpbGQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYTA1OWEKLS0tIC9kZXYvbnVsbAorKysgYi9yZWxlYXNlL2phdmEvYnVpbGQueG1sCkBAIC0wLDAgKzEsMTIwIEBACis8IS0tCisvKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMCwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgICAgKgorKiBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBUaGlzIGlzIHRoZSBhbnQgYnVpbGQgZmlsZSBmb3IgSUNVIHRvb2xzLiAKKyovCistLT4KKzxwcm9qZWN0IG5hbWU9InJlbGVhc2UtdG9vbHMiIGRlZmF1bHQ9InRvb2xzIiBiYXNlZGlyPSIuIj4KKyAgICA8dGFyZ2V0IG5hbWU9ImluaXQiPgorICAgICAgICA8dHN0YW1wLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9InNyYy5kaXIiIHZhbHVlPSJzcmMiLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImxpYi5kaXIiIHZhbHVlPSJsaWIiLz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmRpciIgdmFsdWU9ImNsYXNzZXMiLz4KKyAgICAgICAgPHByb3BlcnR5IGZpbGU9ImFwaS1yZXBvcnQucHJvcGVydGllcyIgLz4KKworICAgICAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmRpcn0iLz4KKyAgICAgICAgPGVjaG8gbWVzc2FnZT0iamF2YSBob21lOiAke2phdmEuaG9tZX0iLz4KKyAgICAgICAgPGVjaG8gbWVzc2FnZT0iamF2YSB2ZXJzaW9uOiAke2phdmEudmVyc2lvbn0iLz4KKyAgICAgICAgPGVjaG8gbWVzc2FnZT0iamF2YSB2ZW5kb3I6ICR7amF2YS52bS52ZW5kb3J9Ii8+CisgICAgICAgIDxlY2hvIG1lc3NhZ2U9ImFudCBqYXZhIHZlcnNpb246ICR7YW50LmphdmEudmVyc2lvbn0iLz4KKyAgICAgICAgPGVjaG8gbWVzc2FnZT0iJHthbnQudmVyc2lvbn0iLz4KKyAgICAgICAgPGVjaG8gbWVzc2FnZT0iJHtiYXNlZGlyfSIvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJ0b29scyIgIGRlcGVuZHM9ImluaXQiIGRlc2NyaXB0aW9uPSJjb21waWxlIHJlbGVhc2UgdG9vbHMiPgorICAgICAgICA8amF2YWMgaW5jbHVkZXM9IioqLyouamF2YSIKKyAgICAgICAgICAgIHNyY2Rpcj0iJHtzcmMuZGlyfSIKKyAgICAgICAgICAgIGRlc3RkaXI9IiR7YnVpbGQuZGlyfSIKKyAgICAgICAgICAgIHNvdXJjZT0iMS41IgorICAgICAgICAgICAgZGVidWc9Im9uIiBkZXByZWNhdGlvbj0ib2ZmIgorICAgICAgICAgICAgZW5jb2Rpbmc9ImFzY2lpIi8+CisgICAgPC90YXJnZXQ+ICAgICAgICAgICAgIAorCisgICAgPHRhcmdldCBuYW1lPSJjbGVhbiIgZGVwZW5kcz0iaW5pdCIgZGVzY3JpcHRpb249InJlbW92ZSBhbGwgYnVpbGQgdGFyZ2V0cyI+CisgICAgICAgIDxkZWxldGUgZGlyPSIke2J1aWxkLmRpcn0iLz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iYXBpcmVwb3J0IiBkZXBlbmRzPSJ0b29scyI+ICAgIAorICAgICAgICA8amF2YSBjbGFzc25hbWU9ImNvbS5pYm0uaWN1LmRldi50b29scy5kb2NzLlN0YWJsZUFQSSIgZm9yaz0ieWVzIiBmYWlsb25lcnJvcj0idHJ1ZSI+CisgICAgICAgICAgIAorPCEtLQorICAgICAgICAgICAgPGFyZyB2YWx1ZSA9ICItREVMRVRFTUUtbmV3dmVyIi8+CisgICAgICAgICAgICA8YXJnIHZhbHVlID0gIjQuNiIvPgorLS0+CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDxhcmcgdmFsdWUgPSAiLS1vbGRkaXIiLz4gCisgICAgICAgICAgICA8YXJnIHZhbHVlID0gIiR7b2xkZGlyfSIvPgorICAgICAgICAgICAgCis8IS0tCisJISEgT25seSBuZWVkIHRoZXNlIGlmIHlvdSBtdXN0IG92ZXJyaWRlLiBSZW1vdmUgdGhlIERFTEVURU1FCisgICAgICAgICAgICA8YXJnIHZhbHVlID0gIi1ERUxFVEVNRS1uZXd2ZXIiLz4KKyAgICAgICAgICAgIDxhcmcgdmFsdWUgPSAiJHtuZXd2ZXJ9Ii8+CistLT4KKyAgICAgICAgICAgIAorICAgICAgICAgICAgPGFyZyB2YWx1ZSA9ICItLW5ld2RpciIvPgorICAgICAgICAgICAgPGFyZyB2YWx1ZSA9ICIke25ld2Rpcn0iLz4KKyAgICAgICAgICAgIAorICAgICAgICAgICAgPGFyZyB2YWx1ZSA9ICItLXJlc3VsdGZpbGUiLz4KKyAgICAgICAgICAgIDxhcmcgdmFsdWUgPSAiJHtiYXNlZGlyfS9BUElDaGFuZ2VSZXBvcnQuaHRtbCIvPgorCisgICAgICAgICAgICA8Y2xhc3NwYXRoPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtidWlsZC5kaXJ9Ii8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7amF2YS5jbGFzcy5wYXRofS8iLz4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7bGliLmRpcn0veGFsYW4uamFyIi8+CisJCTxmaWxlc2V0IGRpcj0iJHtsaWIuZGlyfSIvPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtsaWIuZGlyfS94ZXJjZXNJbXBsLmphciIvPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIuIi8+CisgICAgICAgICAgICA8L2NsYXNzcGF0aD4KKyAgICAgICAgPC9qYXZhPgorICAgIDwvdGFyZ2V0PgorICAgIDx0YXJnZXQgbmFtZT0iYXBpcmVwb3J0X3htbCIgZGVwZW5kcz0idG9vbHMiPiAgICAKKyAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJjb20uaWJtLmljdS5kZXYudG9vbHMuZG9jcy5TdGFibGVBUEkiIGZvcms9InllcyIgZmFpbG9uZXJyb3I9InRydWUiPgorCis8IS0tCisgICAgICAgICAgICA8YXJnIHZhbHVlID0gIi1ERUxFVEVNRS1uZXd2ZXIiLz4KKyAgICAgICAgICAgIDxhcmcgdmFsdWUgPSAiNC40LjEiLz4KKyAgICAKKy0tPgorCis8IS0tICAgICAgICAKKyAgICAgICAgICAgIDxhcmcgdmFsdWUgPSAiLURFTEVURU1FLW5ld3ZlciIvPgorICAgICAgICAgICAgPGFyZyB2YWx1ZSA9ICI0LjYiLz4KKy0tPiAgICAgICAgICAgIAorCisgICAgICAgICAgICA8YXJnIHZhbHVlID0gIi0tb2xkZGlyIi8+IAorICAgICAgICAgICAgPGFyZyB2YWx1ZSA9ICIke29sZGRpcn0iLz4KKyAgICAgICAgICAgIAorPCEtLQorCSEhIE9ubHkgbmVlZCB0aGVzZSBpZiB5b3UgbXVzdCBvdmVycmlkZS4gUmVtb3ZlIHRoZSBERUxFVEVNRQorICAgICAgICAgICAgPGFyZyB2YWx1ZSA9ICItREVMRVRFTUUtbmV3dmVyIi8+CisgICAgICAgICAgICA8YXJnIHZhbHVlID0gIiR7bmV3dmVyfSIvPgorLS0+CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDxhcmcgdmFsdWUgPSAiLS1uZXdkaXIiLz4KKyAgICAgICAgICAgIDxhcmcgdmFsdWUgPSAiJHtuZXdkaXJ9Ii8+CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDxhcmcgdmFsdWUgPSAiLS1jcHB4c2x0Ii8+CisgICAgICAgICAgICA8YXJnIHZhbHVlID0gIiR7YmFzZWRpcn0vc3JjL2NvbS9pYm0vaWN1L2Rldi90b29scy9kb2NzL2R1bXBBbGxDcHBGdW5jX3htbC54c2x0Ii8+CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDxhcmcgdmFsdWUgPSAiLS1jeHNsdCIvPgorICAgICAgICAgICAgPGFyZyB2YWx1ZSA9ICIke2Jhc2VkaXJ9L3NyYy9jb20vaWJtL2ljdS9kZXYvdG9vbHMvZG9jcy9kdW1wQWxsQ0Z1bmNfeG1sLnhzbHQiLz4KKyAgICAgICAgICAgIAorICAgICAgICAgICAgPGFyZyB2YWx1ZSA9ICItLXJlcG9ydHhzbHQiLz4KKyAgICAgICAgICAgIDxhcmcgdmFsdWUgPSAiJHtiYXNlZGlyfS9zcmMvY29tL2libS9pY3UvZGV2L3Rvb2xzL2RvY3MvZ2VuUmVwb3J0X3htbC54c2x0Ii8+CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDxhcmcgdmFsdWUgPSAiLS1yZXN1bHRmaWxlIi8+CisgICAgICAgICAgICA8YXJnIHZhbHVlID0gIiR7YmFzZWRpcn0vQVBJQ2hhbmdlUmVwb3J0LnhtbCIvPgorCisgICAgICAgICAgICA8Y2xhc3NwYXRoPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtidWlsZC5kaXJ9Ii8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7amF2YS5jbGFzcy5wYXRofS8iLz4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7bGliLmRpcn0veGFsYW4uamFyIi8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2xpYi5kaXJ9L3hlcmNlc0ltcGwuamFyIi8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9Ii4iLz4KKyAgICAgICAgICAgIDwvY2xhc3NwYXRoPgorICAgICAgICA8L2phdmE+CisgICAgPC90YXJnZXQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9yZWxlYXNlL2phdmEvaWN1NGMuY3NzIGIvcmVsZWFzZS9qYXZhL2ljdTRjLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGU4NjA1Ci0tLSAvZGV2L251bGwKKysrIGIvcmVsZWFzZS9qYXZhL2ljdTRjLmNzcwpAQCAtMCwwICsxLDQ0NyBAQAorLyoKKyAqIERlZmF1bHQgQ1NTIHN0eWxlIHNoZWV0IGZvciB0aGUgSUNVNEMgT3BlbiBTb3VyY2UgcmVhZG1lCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMCwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcworICogQ29ycG9yYXRpb24gYW5kIG90aGVycy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKi8KKworLyogR2xvYmFsIHN0eWxlcyAqLworCitib2R5LHAsbGksb2wsdWwsdGgsdGQgeworCWZvbnQtc2l6ZTogMTBwdDsKKwlmb250LWZhbWlseTogIkFyaWFsIiwgIkhlbHZldGljYSIsIHNhbnMtc2VyaWY7Cit9CisKK2JvZHkgeworCW1hcmdpbjogMWVtOworfQorCitib2R5LmRyYWZ0IHsKKwliYWNrZ3JvdW5kLWltYWdlOiB1cmwoaW1hZ2VzL2RyYWZ0YmcucG5nKTsKK30KKworLm1haW5ib2R5IHsKKwlwYWRkaW5nOiAxZW07Cit9CisKKy8qCisgKiBDdXN0b21pemUgdGhlIGhlYWRlcnMgdG8gaGF2ZSBsZXNzIHNwYWNlIGFyb3VuZCB0aGVtIHRoYW4gdXN1YWwKKyAqLworCitoMSB7CisJbWFyZ2luLWJvdHRvbTogLjVlbTsKKwltYXJnaW4tdG9wOiAuNWVtOworCXBhZGRpbmctYm90dG9tOiAuNWVtOworCXBhZGRpbmctdG9wOiAuNWVtOworCWZvbnQtd2VpZ2h0OiA3MDA7CisJZm9udC1zaXplOiAyMHB0OworCWZvbnQtZmFtaWx5OiBHZW9yZ2lhLCAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOworCWJvcmRlci13aWR0aDogMnB4OworCWJvcmRlci1zdHlsZTogc29saWQ7CisJdGV4dC1hbGlnbjogY2VudGVyOworCXdpZHRoOiAxMDAlOworCWZvbnQtc2l6ZTogMjAwJTsKKwlmb250LXdlaWdodDogYm9sZDsKK30KKworaDIgeworCWJvcmRlci10b3A6IDJweCBzb2xpZCAjMjJkOworCWJvcmRlci1sZWZ0OiAycHggc29saWQgIzIyZDsKKwltYXJnaW4tYm90dG9tOiAwLjVlbTsKKwlwYWRkaW5nLWxlZnQ6IDRweDsKKwltYXJnaW4tdG9wOiAxMnB0OworCWZvbnQtd2VpZ2h0OiA3MDA7CisJZm9udC1zaXplOiAyZW07CisJZm9udC1mYW1pbHk6IEdlb3JnaWEsICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7CisJYmFja2dyb3VuZC1jb2xvcjogI2VlZTsKKwlwYWdlLWJyZWFrLWJlZm9yZTogYWx3YXlzOworfQorCitoMiBhIHsKKwl0ZXh0LWRlY29yYXRpb246IG5vbmU7CisJY29sb3I6IGJsYWNrOworfQorCitoMiBhOmhvdmVyIHsKKwljb2xvcjogYmx1ZTsKKwl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKK30KKworaDMgeworCWJvcmRlci10b3A6IDFweCBzb2xpZCBncmF5OworCWNvbG9yOiAjMWUxYzQ2OworCW1hcmdpbi1ib3R0b206IDBwdDsKKwltYXJnaW4tdG9wOiAxMnB0OworCXBhZGRpbmctbGVmdDogMDsKKwltYXJnaW4tbGVmdDogMWVtOworCW1hcmdpbi10b3A6IDAuMmVtOworCXBhZGRpbmctYm90dG9tOiAwLjRlbTsKKwlmb250LXNpemU6IDEuNWVtOworCWZvbnQtZmFtaWx5OiBHZW9yZ2lhLCAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOworfQorCitoMyBhIHsKKwl0ZXh0LWRlY29yYXRpb246IG5vbmU7CisJY29sb3I6IGJsYWNrOworfQorCitoMyBhOmhvdmVyIHsKKwljb2xvcjogYmx1ZTsKKwl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKK30KKworaDQgeworCW1hcmdpbi1sZWZ0OiAxLjVlbTsKKwltYXJnaW4tYm90dG9tOiAwcHQ7CisJbWFyZ2luLXRvcDogMTJwdDsKKwlmb250LXNpemU6IDEuMGVtOworCWZvbnQtd2VpZ2h0OiBib2xkZXI7CisJZm9udC1mYW1pbHk6IEdlb3JnaWEsICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7Cit9CisKK2g0IGEgeworCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKKwljb2xvcjogYmxhY2s7Cit9CisKK2g0IGE6aG92ZXIgeworCWNvbG9yOiBibHVlOworCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOworfQorCitoNSwgaDYgeworCW1hcmdpbi1sZWZ0OiAxLjhlbTsKKwltYXJnaW4tYm90dG9tOiAwcHQ7CisJbWFyZ2luLXRvcDogMTJwdDsKKwlwYWRkaW5nLWxlZnQ6IDAuNzVlbTsKKwlmb250LXNpemU6IHgtc21hbGw7CisJZm9udC1mYW1pbHk6IEdlb3JnaWEsICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7Cit9CisKK3AscHJlLHRhYmxlLHVsLG9sLGRsIHsKKwltYXJnaW4tbGVmdDogMmVtOworfQorCisvKgorICogTmF2aWdhdGlvbiBzaWRlYmFyIG9uIHRoZSBsZWZ0IGhhbmQgb2YgbW9zdCBwYWdlcworICovCisKK3RkLnNpZGViYXIxIHsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjOTlDQ0ZGOworCWZvbnQtd2VpZ2h0OiA3MDA7CisJbWFyZ2luLXRvcDogMHB4OworCW1hcmdpbi1ib3R0b206IDBweDsKKwlwYWRkaW5nLXRvcDogMWVtOworCXBhZGRpbmctbGVmdDogMC4yZW07CisJd2hpdGUtc3BhY2U6IG5vd3JhcDsKK30KKwordGQuc2lkZWJhcjIgeworCWJhY2tncm91bmQtY29sb3I6ICM5OUNDRkY7CisJbWFyZ2luLXRvcDogMHB4OworCW1hcmdpbi1ib3R0b206IDBweDsKKwltYXJnaW4tbGVmdDogMHB4OworCXBhZGRpbmctdG9wOiAxcHg7CisJcGFkZGluZy1ib3R0b206IDFweDsKKwlwYWRkaW5nLWxlZnQ6IDFweDsKKwlwYWRkaW5nLXJpZ2h0OiAwLjVlbTsKKwl3aGl0ZS1zcGFjZTogbm93cmFwOworCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKKwlkaXNwbGF5OiBibG9jazsKK30KKwordGQuc2lkZWJhcjI6aG92ZXIgeworCWJhY2tncm91bmQtY29sb3I6ICNFRUVFRkY7CisJcGFkZGluZy10b3A6IDFweDsKKwlwYWRkaW5nLWJvdHRvbTogMXB4OworCXBhZGRpbmctbGVmdDogMXB4OworCXBhZGRpbmctcmlnaHQ6IDAuNWVtOworfQorCithLnNpZGViYXIyIHsKKwl0ZXh0LWRlY29yYXRpb246IG5vbmU7CisJZGlzcGxheTogYmxvY2s7CisJd2lkdGg6IDEwMCU7Cit9CisKK2Euc2lkZWJhcjI6bGluayB7CisJY29sb3I6ICMwMDAwOTk7CisJZGlzcGxheTogYmxvY2s7Cit9CisKK2Euc2lkZWJhcjI6aG92ZXIgeworCWJhY2tncm91bmQtY29sb3I6ICNFRUVFRkY7CisJZGlzcGxheTogYmxvY2s7Cit9CisKKy51bmRlcmxpbmVob3Zlcjpob3ZlciB7CisJYmFja2dyb3VuZC1jb2xvcjogI0VFRUVGRjsKKwl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKK30KKworLyogVGhpcyBpcyB0aGUgZmFkZWQgaGVhZGVyIGF0IHRoZSB0b3AgKi8KKwordGQuZmFkZWR0b3AgeworCWJhY2tncm91bmQtY29sb3I6ICMwMDY2OTk7CisJYmFja2dyb3VuZC1pbWFnZTogdXJsKGh0dHA6Ly93d3cuaWN1LXByb2plY3Qub3JnL2ltYWdlcy9ncjEwMC5naWYpOworfQorCisvKiBSZWxhdGVkIHNpdGUgb24gdGhlIGxlZnQgKi8KKworcC5yZWxhdGVkc2l0ZSB7CisJY29sb3I6IFdoaXRlOworCWZvbnQtd2VpZ2h0OiA3MDA7CisJZm9udC1zaXplOiAxMHB0OworCW1hcmdpbi10b3A6IDFlbTsKKwltYXJnaW4tYm90dG9tOiAwOworCXBhZGRpbmctbGVmdDogMC4yZW07CisJd2hpdGUtc3BhY2U6IG5vd3JhcDsKK30KKworLyogUmVsYXRlZCBzaXRlIG9uIHRoZSBsZWZ0ICovCisKK3Auc2lkZWJhcjMgeworCW1hcmdpbi10b3A6IDAuNzVlbTsKKwltYXJnaW4tYm90dG9tOiAwOworCXBhZGRpbmctbGVmdDogMC44ZW07Cit9CisKK2Euc2lkZWJhcjMgeworCWZvbnQtc2l6ZTogMC45ZW07CisJdGV4dC1kZWNvcmF0aW9uOiBub25lOworfQorCithLnNpZGViYXIzOmxpbmsgeworCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKKwljb2xvcjogV2hpdGU7Cit9CisKK2Euc2lkZWJhcjM6aG92ZXIgeworCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOworfQorCisvKiBGQVEgKi8KKworbGkuZmFxX2NvbnRlbnRzIHsKKwlmb250LXdlaWdodDogNTAwOworfQorCitwLmZhcV9xIHsKKwlmb250LXdlaWdodDogNzAwOworCW1hcmdpbi1ib3R0b206IDBweDsKK30KKworcC5mYXFfYSB7CisJbWFyZ2luLXRvcDogMHB4OworfQorCisvKiBOZXdzIGl0ZW1zICovCisKK3RhYmxlLm5ld3NJdGVtIHsKKwlwYWRkaW5nLWxlZnQ6IDFlbTsKKwlwYWRkaW5nLXJpZ2h0OiAxZW07CisJYm9yZGVyLXdpZHRoOiBtZWRpdW07Cit9CisKK3RoLm5ld3NJdGVtIHsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjNjY2NjY2OworCWNvbG9yOiBXaGl0ZTsKK30KKwordGQubmV3c0l0ZW0geworCWJhY2tncm91bmQtY29sb3I6ICNDQ0NDQ0M7Cit9CisKK3RkLnJlbGVhc2UtbGluZSx0aC5yZWxlYXNlLWxpbmUgeworCXBhZGRpbmctbGVmdDogMC41ZW07CisJcGFkZGluZy1yaWdodDogMC41ZW07CisJd2hpdGUtc3BhY2U6IG5vd3JhcDsKKwlib3JkZXI6IDFweDsKK30KKworLm5vdGUgeworCWZvbnQtc3R5bGU6IGl0YWxpYzsKKwlmb250LXNpemU6IHNtYWxsOworCW1hcmdpbi1sZWZ0OiAxZW07Cit9CisKK3NhbXAgeworCW1hcmdpbi1sZWZ0OiAxZW07CisJbWFyZ2luLXJpZ2h0OiAyZW07CisJYm9yZGVyLXN0eWxlOiBncm9vdmU7CisJcGFkZGluZzogMWVtOworCWRpc3BsYXk6IGJsb2NrOworCWJhY2tncm91bmQtY29sb3I6ICNFRUVFRUUKK30KKwordGFibGUucnRhYmxlIGNhcHRpb24geworCW1hcmdpbi1sZWZ0OiAycHg7CisJbWFyZ2luLXJpZ2h0OiAycHg7CisJcGFkZGluZzogM3B4OworCWZvbnQtd2VpZ2h0OiBib2xkOworCWJhY2tncm91bmQtY29sb3I6ICNkZWUyZmY7CisJdGV4dC1hbGlnbjogbGVmdDsKK30KKwordGFibGUucnRhYmxlIHRyIHRoIHsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjZGVlMmZmOworCXRleHQtYWxpZ246IGxlZnQ7Cit9CisKK3RhYmxlLnJ0YWJsZSB0ciB0ZCB7CisJYmFja2dyb3VuZC1jb2xvcjogI2MwYzBmZDsKKwlwYWRkaW5nOiAzcHg7Cit9CisKK3RhYmxlLnJ0YWJsZSB0ci5icm9rZW4gdGQgeworCWJhY2tncm91bmQtY29sb3I6ICNmYmI7CisJYm9yZGVyOiAxcHggZGFzaGVkIGdyYXk7CisJcGFkZGluZzogM3B4OworCWZvbnQtd2VpZ2h0OiBib2xkOworfQorCit0YWJsZS5ydGFibGUgdHIucmFyZWx5IHRkIHsKKwliYWNrZ3JvdW5kLWNvbG9yOiAjZWZlOWMyOworCXBhZGRpbmc6IDNweDsKKwlmb250LXN0eWxlOiBpdGFsaWM7Cit9CisKKy8qICBBUElDaGFuZ2VSZXBvcnQgc3BlY2lmaWMgdGhpbmdzICovCisKKy5yb3cwIHsKKwliYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKK30KKworLnJvdzEgeworCWJhY2tncm91bmQtY29sb3I6ICNkZmQ7Cit9CisKKy52ZXJjaGFuZ2UgeworCWNvbG9yOiByZWQ7CisJZm9udC13ZWlnaHQ6IGJvbGQ7CisJZm9udC1zaXplOiBsYXJnZTsKK30KKworLnN0YWJjaGFuZ2UgeworCWNvbG9yOiByZWQ7CisJZm9udC1zaXplOiBsYXJnZTsKK30KKworLmJpZ3dhcm4geworCWNvbG9yOiByZWQ7CisJYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7CisJZm9udC1zaXplOiB4LWxhcmdlOworCW1hcmdpbjogMC41IGVtOworfQorCit0YWJsZS5nZW5UYWJsZSB7CisJYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKKwlib3JkZXI6IDFweCBzb2xpZCBibGFjazsKK30KKworLyogJ2V2ZXJ5dGhpbmcgaW5jIHZlcnNpb24gKi8KKwordGFibGUuZ2VudGFibGUgdGQgeworCWJvcmRlcjogMXB4IHNvbGlkIGdyYXk7CisJcGFkZGluZzogMC4yNWVtOworCWZvbnQtc2l6ZTogc21hbGw7Cit9CisKKy8qIG5vdCB2ZXJzaW9uICovCisKK3RhYmxlLmdlblRhYmxlIHRkLmZpbGUsCit0YWJsZS5nZW5UYWJsZSB0ZC5wcm90byB7CisJYm9yZGVyOiBub25lOworCWZvbnQtc2l6ZTogbWVkaXVtOworfQorCit0YWJsZS5nZW5UYWJsZSB0ZC5maWxlIHsKKwlmb250LWZhbWlseTogbW9ub3NwYWNlOworCWZvbnQtd2VpZ2h0OiBib2xkOworfQorCitkaXYub3RoZXIgLnJvdzAgeworCWJhY2tncm91bmQtY29sb3I6IHdoaXRlOworfQorCitkaXYub3RoZXIgLnJvdzEgeworCWJhY2tncm91bmQtY29sb3I6ICNkZGY7Cit9CisKK3RhYmxlLmRvY1RhYmxlIHsKKwlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOworCWJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOworfQorCisvKiAnZXZlcnl0aGluZyBpbmMgdmVyc2lvbiAqLworCit0YWJsZS5kb2NUYWJsZSB0ZCwKK3RhYmxlLmRvY1RhYmxlIHRoIHsKKwlib3JkZXI6IDFweCBzb2xpZCBncmF5OworCXBhZGRpbmc6IDAuMjVlbTsKKwlmb250LXNpemU6IHNtYWxsOworfQorCisvKiBub3QgdmVyc2lvbiAqLworCit0YWJsZS5kb2NUYWJsZSB0ZC5maWxlLAordGFibGUuZG9jVGFibGUgdGQucHJvdG8geworCWJvcmRlcjogbm9uZTsKKwlmb250LXNpemU6IG1lZGl1bTsKK30KKwordGFibGUuZG9jVGFibGUgdGQuZmlsZSB7CisJZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKKwlmb250LXdlaWdodDogYm9sZDsKK30KKworYWJiciB7CisJYm9yZGVyLWJvdHRvbTogMXB4IGRhc2hlZCAjMEIwOworfQorCitoMi5UT0MgeworCXBhZ2UtYnJlYWstYmVmb3JlOiBhdXRvOworfQorCitib2R5LnJlYWRtZSB7CisJCit9CisKK2NhcHRpb24geworCWZvbnQtd2VpZ2h0OiBib2xkOworCXRleHQtYWxpZ246IGxlZnQKK30KKworZGl2LmluZGVudCB7CisJbWFyZ2luLWxlZnQ6IDJlbQorfQorCit1bC5UT0MgeworCWxpc3Qtc3R5bGUtdHlwZTogbm9uZTsKKwlwYWRkaW5nLWxlZnQ6IDFlbTsKKwlmb250LXNpemU6IGxhcmdlcjsKK30KKwordWwuVE9DIGxpIGEgeworCWZvbnQtd2VpZ2h0OiBib2xkOworfQorCit1bC5UT0MgbGkgdWwgbGkgYSB7CisJZm9udC13ZWlnaHQ6IG5vcm1hbDsKKwlsaXN0LXN0eWxlLXR5cGU6IG5vbmU7CisJZm9udC1zaXplOiBzbWFsbDsKK30KKwordWwuVE9DIGxpIHVsIHsKKwltYXJnaW4tbGVmdDogMDsKKwlwYWRkaW5nLWxlZnQ6IDJlbTsKKwlmb250LXdlaWdodDogbm9ybWFsOworCWxpc3Qtc3R5bGUtdHlwZTogbm9uZTsKK30KKworcHJlLnNhbXAsc2FtcCB7CisJbWFyZ2luLWxlZnQ6IDFlbTsKKwlib3JkZXItc3R5bGU6IGdyb292ZTsKKwlwYWRkaW5nOiAxZW07CisJZGlzcGxheTogYmxvY2s7CisJYmFja2dyb3VuZC1jb2xvcjogI0VFRUVFRQorfQpkaWZmIC0tZ2l0IGEvcmVsZWFzZS9qYXZhL3JlYWRtZS50eHQgYi9yZWxlYXNlL2phdmEvcmVhZG1lLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGI5ZTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvcmVsZWFzZS9qYXZhL3JlYWRtZS50eHQKQEAgLTAsMCArMSwyNiBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCBJQk0gYW5kIE90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitBUEkgQ2hhbmdlIFJlcG9ydDoKKworQSB0b29sIHRvIGdlbmVyYXRlIGEgcmVwb3J0IG9mIEFQSSBzdGF0dXMgY2hhbmdlcyBiZXR3ZWVuIHR3byBJQ1U0QyByZWxlYXNlcy4KKyhJQ1U0SiBoYXMgYSBidWlsdGluIGNoYW5nZSByZXBvcnQgZ2VuZXJhdG9yKQorCitSZXF1aXJlbWVudHM6CisgIC0gRXZlcnl0aGluZyBuZWVkZWQgdG8gYnVpbGQgSUNVNEMgZnJvbSBhIGNvbW1hbmQgbGluZSAoVU5JWCkgZW52aXJvbm1lbnQKKyAgLSBEb3h5Z2VuIChmb3IgZ2VuZXJhdGluZyBkb2NzKQorICAtIEphdmEgSkRLIDEuNSsKKyAgLSBBcGFjaGUgQW50CisgIC0gWGFsYW4vWGVyY2VzICggcHV0IHRoZSBqYXJzIGluIHRoZSBsaWIvIGRpcmVjdG9yeSApIC0gdGhlIGJ1aWx0IGluIHZlcnNpb24gdG8gSmF2YSBkb2Vzbid0IHNlZW0gdG8gd29yayBwcm9wZXJseS4KKworVG8gdXNlIHRoZSB1dGlsaXR5OgorICAgIDEuIHNldHVwIElDVQorICAgICAgICAgICAgKHB1dCB0aGUgdHdvIElDVSByZWxlYXNlcyBvbiB5b3VyIG1hY2hpbmUgXl9eICApCisgICAgICAgICAgICBydW4gJ2NvbmZpZ3VyZScgaW4gYm90aCByZWxlYXNlcyAob3IgcnVuQ29uZmlndXJlSUNVKQorICAgICAgICAgICAgRG94eWdlbiBtdXN0IGJlIGZvdW5kIGR1cmluZyBjb25maWd1cmUuCisJMi4gY3JlYXRlIGEgTWFrZWZpbGUubG9jYWwgd2l0aCBqdXN0IHRoZXNlIHR3byBsaW5lczoKKwkJCU9MRF9JQ1U9L3hzcmwvRS9pY3UtMS4wCisJCQlORVdfSUNVPS94c3JsL0UvaWN1LTYuOAorCSAgICggd2hlcmUgdGhlc2UgYXJlIHRoZSBwYXRocyB0byB0aGUgcGFyZW50IG9mICdzb3VyY2UnLCBldGMpICAgICAKKyAgICAzLiBCdWlsZCB0aGUgQVBJIGRvY3MKKyAgICAgICAgICAgIG1ha2UKKwk0LiBUaGlzIHdpbGwgY3JlYXRlIGFuICdBUElDaGFuZ2VSZXBvcnQuaHRtbCcgaW4gdGhpcyBkaXJlY3RvcnkuIENoZWNrIGl0IG92ZXIsIHRoZW4gY2hlY2sgaXQgaW4uCmRpZmYgLS1naXQgYS9yZWxlYXNlL2phdmEvc3JjL2NvbS9pYm0vaWN1L2Rldi90b29scy9kb2NzL1N0YWJsZUFQSS5qYXZhIGIvcmVsZWFzZS9qYXZhL3NyYy9jb20vaWJtL2ljdS9kZXYvdG9vbHMvZG9jcy9TdGFibGVBUEkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmE5MmNlCi0tLSAvZGV2L251bGwKKysrIGIvcmVsZWFzZS9qYXZhL3NyYy9jb20vaWJtL2ljdS9kZXYvdG9vbHMvZG9jcy9TdGFibGVBUEkuamF2YQpAQCAtMCwwICsxLDkzNSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxMCwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcworICogQ29ycG9yYXRpb24gYW5kIG90aGVycy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ3JlYXRlZCBvbiAyMDA2LTctMjQgPworICogTW92ZWQgZnJvbSBKYXZhIDEuNCB0byAxLjU/IEFQSSBieSBzcmwgMjAwOS0wMS0xNgorICovCitwYWNrYWdlIGNvbS5pYm0uaWN1LmRldi50b29scy5kb2NzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7CisKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uUmVzdWx0OworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01SZXN1bHQ7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7CitpbXBvcnQgamF2YXgueG1sLnhwYXRoLlhQYXRoOworaW1wb3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aENvbnN0YW50czsKK2ltcG9ydCBqYXZheC54bWwueHBhdGguWFBhdGhFeHByZXNzaW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aEZhY3Rvcnk7CisKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OworaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKKworaW1wb3J0IGNvbS5zdW4ueG1sLmludGVybmFsLmZhc3RpbmZvc2V0LnN0YXguZXZlbnRzLlhNTENvbnN0YW50czsKKworCisvKioKKyBBIHV0aWxpdHkgdG8gcmVwb3J0IHRoZSBzdGF0dXMgY2hhbmdlIGJldHdlZW4gdHdvIElDVSByZWxlYXNlcworCitUbyB1c2UgdGhlIHV0aWxpdHkKKzEuIEdlbmVyYXRlIHRoZSBYTUwgZmlsZXMKKyAgICAocHV0IHRoZSB0d28gSUNVIHJlbGVhc2VzIG9uIHlvdXIgbWFjaGluZSBeX14gKQorICAgIChnZW5lcmF0ZSAnRG94eWdlbicgZmlsZSBvbiBXaW5kb3dzIHBsYXRmb3JtIHdpdGggQ3lnd2luJ3MgaGVscCkKKyAgICBFZGl0IHRoZSBnZW5lcmF0ZWQgJ0RveHlnZW4nIGZpbGUgdW5kZXIgSUNVNEMgc291cmNlIGRpcmVjdG9yeQorICAgIGEpIEdFTkVSQVRFX1hNTCAgICAgICAgICAgPSBZRVMKKyAgICBiKSBTeW5jIHRoZSBBTElBU0VTIGRlZmluaWF0aW9uCisgICAgICAgKEZvciBleGFtcGxlLCBjb3B5IHRoZSBBTElBU0VTIGRlZmluYXRpb24gZnJvbSBJQ1UgMy42CisgICAgICAgRG94eWdlbiBmaWxlIHRvIElDVSAzLjQgRG94eWdlbiBmaWxlLikKKyAgICBjKSBnZXJlbmF0ZSB0aGUgWE1MIGZpbGVzCisyLiBCdWlsZCB0aGUgdG9vbAorICAgIERvd25sb2FkIEFwYWNoZSBYZXJjZXMgSmF2YSBQYXJzZXIKKyAgICBCdWlsZCB0aGlzIGZpbGUgd2l0aCB0aGUgbGlicmFyeQorMy4gRWRpdCB0aGUgYXBpLXJlcG9ydC1jb25maWcueG1sIGZpbGUgJiBDaGFuZ2UgdGhlIGZpbGUgYWNjb3JkaW5nIHlvdXIgcmVhbCBjb25maWd1cmF0aW9uCis0LiBSdW4gdGhlIHRvb2wgdG8gZ2VuZXJhdGUgdGhlIHJlcG9ydC4KKworICogQGF1dGhvciBSYXltb25kIFlhbmcKKyAqLworcHVibGljIGNsYXNzIFN0YWJsZUFQSSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9DX0ZPTERFUiA9ICJkb2NGb2xkZXIiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTkRFWF9YTUwgPSAiaW5kZXgueG1sIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNVX1NQQUNFX1BSRUZJWCA9ICJJQ1UgIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5JVElBTElaRVJfWFBBVEggPSAiaW5pdGlhbGl6ZXIiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1hQQVRIID0gIm5hbWUiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVVkVSU0lPTkEgPSAidXZlcm51bV84aC54bWwiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVVkVSU0lPTkIgPSAidXZlcnNpb25fOGgueG1sIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVV9JQ1VfVkVSU0lPTiA9ICJVX0lDVV9WRVJTSU9OIjsKKyAgICAvKiBJQ1UgNC40KyAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJQ1VfVkVSU0lPTl9YUEFUSEEgPSAiL2RveHlnZW4vY29tcG91bmRkZWZbQGlkPSd1dmVybnVtXzhoJ11bQGtpbmQ9J2ZpbGUnXS9zZWN0aW9uZGVmW0BraW5kPSdkZWZpbmUnXSI7CisJLyogSUNVIDw0LjQgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNVX1ZFUlNJT05fWFBBVEhCID0gIi9kb3h5Z2VuL2NvbXBvdW5kZGVmW0BpZD0ndXZlcnNpb25fOGgnXVtAa2luZD0nZmlsZSddL3NlY3Rpb25kZWZbQGtpbmQ9J2RlZmluZSddIjsKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgSUNVX1ZFUlNJT05fWFBBVEggPSBJQ1VfVkVSU0lPTl9YUEFUSEE7CisKKwlwcml2YXRlIFN0cmluZyBsZWZ0VmVyOworICAgIHByaXZhdGUgRmlsZSBsZWZ0RGlyID0gbnVsbDsKKy8vICAgIHByaXZhdGUgU3RyaW5nIGxlZnRTdGF0dXM7CisgICAgCisgICAgcHJpdmF0ZSBTdHJpbmcgcmlnaHRWZXI7CisgICAgcHJpdmF0ZSBGaWxlIHJpZ2h0RGlyID0gbnVsbDsKKy8vICAgIHByaXZhdGUgU3RyaW5nIHJpZ2h0U3RhdHVzOworCisgICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBkdW1wQ3BwWHNsdFN0cmVhbSA9IG51bGw7IAorCXByaXZhdGUgSW5wdXRTdHJlYW0gZHVtcENYc2x0U3RyZWFtID0gbnVsbDsKKwlwcml2YXRlIElucHV0U3RyZWFtIHJlcG9ydFhzbFN0cmVhbSA9IG51bGw7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENYU0xUID0gImR1bXBBbGxDRnVuYy54c2x0IjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1BQWFNMVCA9ICJkdW1wQWxsQ3BwRnVuYy54c2x0IjsgCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJQVFhTTFQgPSAiZ2VuUmVwb3J0LnhzbHQiOworCisgICAgcHJpdmF0ZSBGaWxlIGR1bXBDcHBYc2x0OworICAgIHByaXZhdGUgRmlsZSBkdW1wQ1hzbHQ7CisgICAgcHJpdmF0ZSBGaWxlIHJlcG9ydFhzbDsKKyAgICBwcml2YXRlIEZpbGUgcmVzdWx0RmlsZTsKKyAgICAKKyAgICBwcml2YXRlIFN0cmluZyBtaWxlc3RvbmVPZiA9ICIiOworICAgIAorICAgIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyBudWwgPSAiTm9uZSI7IAorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uLCBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBYUGF0aEV4cHJlc3Npb25FeGNlcHRpb24geworICAgICAgICAKKyAgICAgICAgU3RhYmxlQVBJIHQgPSBuZXcgU3RhYmxlQVBJKCk7CisgICAgICAgIHQucnVuKGFyZ3MpOyAKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSB2b2lkIHJ1bihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgWFBhdGhFeHByZXNzaW9uRXhjZXB0aW9uLCBUcmFuc2Zvcm1lckV4Y2VwdGlvbiwgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMucGFyc2VBcmdzKGFyZ3MpOworICAgICAgICBTZXQ8Sm9pbmVkRnVuY3Rpb24+IGZ1bGwgPSBuZXcgVHJlZVNldDxKb2luZWRGdW5jdGlvbj4oKTsKKworICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlJlYWRpbmcgQysrLi4uIik7CisgICAgICAgIFNldDxKb2luZWRGdW5jdGlvbj4gc2V0Q3BwID0gdGhpcy5nZXRGdWxsTGlzdChkdW1wQ3BwWHNsdFN0cmVhbSwgQ1BQWFNMVCk7CisgICAgICAgIGZ1bGwuYWRkQWxsKHNldENwcCk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigicmVhZCAiK3NldENwcC5zaXplKCkgKyIgQysrLiAgUmVhZGluZyBDOiIpOworICAgICAgICAKKyAgICAgICAgU2V0PEpvaW5lZEZ1bmN0aW9uPiBzZXRDID0gdGhpcy5nZXRGdWxsTGlzdChkdW1wQ1hzbHRTdHJlYW0sIENYU0xUKTsKKyAgICAgICAgZnVsbC5hZGRBbGwoc2V0Qyk7CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJyZWFkICIrc2V0Qy5zaXplKCkgKyIgQy4gU2V0dGluZyBub2RlOiIpOworICAgICAgICAKKyAgICAgICAgTm9kZSBmdWxsTGlzdCA9IHRoaXMuc2V0VG9Ob2RlKGZ1bGwpOworLy8gICAgICAgIHQuZHVtcE5vZGUoZnVsbExpc3QsIiIpOworICAgICAgICAKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJOb2RlIHNldC4gUmVwb3J0aW5nOiIpOworICAgICAgICAKKyAgICAgICAgdGhpcy5yZXBvcnRTZWxlY3RlZEZ1bihmdWxsTGlzdCk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRG9uZS4gUGxlYXNlIGNoZWNrICIgKyB0aGlzLnJlc3VsdEZpbGUpOworICAgIH0KKworCisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlQXJncyhTdHJpbmdbXSBhcmdzKXsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcgYXJnID0gYXJnc1tpXTsKKyAgICAgICAgICAgIGlmIChhcmcgPT0gbnVsbCB8fCBhcmcubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFyZy5lcXVhbHMoIi0taGVscCIpICkgeworICAgICAgICAgICAgICAgIHByaW50VXNhZ2UoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnLmVxdWFscygiLS1vbGR2ZXIiKSApIHsKKyAgICAgICAgICAgICAgICBsZWZ0VmVyID0gYXJnc1srK2ldOworICAgICAgICAgICAgfSBlbHNlIGlmIChhcmcuZXF1YWxzKCItLW9sZGRpciIpICkgeworICAgICAgICAgICAgICAgIGxlZnREaXIgPSBuZXcgRmlsZShhcmdzWysraV0pOworICAgICAgICAgICAgfSBlbHNlIGlmIChhcmcuZXF1YWxzKCItLW5ld3ZlciIpKSB7CisgICAgICAgICAgICAgICAgcmlnaHRWZXIgPSBhcmdzWysraV07CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZy5lcXVhbHMoIi0tbmV3ZGlyIikpIHsKKyAgICAgICAgICAgICAgICByaWdodERpciA9IG5ldyBGaWxlKGFyZ3NbKytpXSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZy5lcXVhbHMoIi0tY3hzbHQiKSApIHsKKyAgICAgICAgICAgICAgICBkdW1wQ1hzbHQgPSBuZXcgRmlsZShhcmdzWysraV0pOworICAgICAgICAgICAgfSBlbHNlIGlmIChhcmcuZXF1YWxzKCItLWNwcHhzbHQiKSApIHsKKyAgICAgICAgICAgICAgICBkdW1wQ3BwWHNsdCA9IG5ldyBGaWxlKGFyZ3NbKytpXSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZy5lcXVhbHMoIi0tcmVwb3J0eHNsdCIpICkgeworICAgICAgICAgICAgICAgIHJlcG9ydFhzbCA9IG5ldyBGaWxlKGFyZ3NbKytpXSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZy5lcXVhbHMoIi0tcmVzdWx0ZmlsZSIpKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0RmlsZSA9IG5ldyBGaWxlKGFyZ3NbKytpXSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVW5rbm93biBvcHRpb246ICIrYXJnKTsKKyAgICAgICAgICAgICAgIHByaW50VXNhZ2UoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIH0KKworICAgICAgICBkdW1wQ3BwWHNsdFN0cmVhbSA9IGxvYWRTdHJlYW0oQ1BQWFNMVCwgIi0tY3BweHNsdCIsIGR1bXBDcHBYc2x0KTsKKyAgICAgICAgZHVtcENYc2x0U3RyZWFtPSBsb2FkU3RyZWFtKENYU0xULCAiLS1jeHNsdCIsIGR1bXBDWHNsdCk7CisgICAgICAgIHJlcG9ydFhzbFN0cmVhbT0gbG9hZFN0cmVhbShSUFRYU0xULCAiLS1yZXBvcnR4c2x0IiwgcmVwb3J0WHNsKTsKKworICAgICAgICBsZWZ0VmVyID0gdHJpbUlDVShzZXRWZXIobGVmdFZlciwgIm9sZCIsIGxlZnREaXIpKTsKKyAgICAgICAgcmlnaHRWZXIgPSB0cmltSUNVKHNldFZlcihyaWdodFZlciwgIm5ldyIsIHJpZ2h0RGlyKSk7CisgICAgfQorCisKKyAgICBwcml2YXRlIElucHV0U3RyZWFtIGxvYWRTdHJlYW0oU3RyaW5nIG5hbWUsIFN0cmluZyBhcmdOYW1lLCBGaWxlIGFyZ0ZpbGUpIHsKKyAgICAJSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKKyAgICAJaWYoYXJnRmlsZSAhPSBudWxsKSB7CisgICAgCQl0cnkgeworCSAgICAJCXN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oYXJnRmlsZSk7CisJICAgIAl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKwkgICAgCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXJyb3I6IENvdWxkIG5vdCBsb2FkICIgKyBhcmdOYW1lICsiICIgKyBhcmdGaWxlLmdldFBhdGgoKSArICIgLSAiICsgaW9lLnRvU3RyaW5nKCksIGlvZSk7CisJICAgIAl9CisgICAgCX0gZWxzZSB7ICAgIAkKKyAgICAgICAgCXN0cmVhbSA9IFN0YWJsZUFQSS5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKG5hbWUpOworICAgICAgICAJaWYoc3RyZWFtID09IG51bGwpIHsKKyAgICAgICAgCQl0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigiTm8gcmVzb3VyY2UgZm91bmQgZm9yICIgKyBTdGFibGVBUEkuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSsiLyIrIG5hbWUgKyAiIC0gICB1c2UgIiArIGFyZ05hbWUpOworICAgICAgICAJfSBlbHNlIHsKKyAgICAgICAgCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxvYWRlZCByZXNvdXJjZSAiICsgbmFtZSk7CisgICAgICAgIAl9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0cmVhbTsKKwl9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTZXQ8U3RyaW5nPiB3YXJuU2V0ID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOworICAgIAorICAgIHByaXZhdGUgc3RhdGljIHZvaWQgd2FybihTdHJpbmcgd2hhdCkgeworICAgICAgICBpZighd2FyblNldC5jb250YWlucyh3aGF0KSkgeworICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJXYXJuaW5nOiAiK3doYXQpOworICAgICAgICAgICAgICAgaWYod2FyblNldC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAoVGhlc2Ugd2FybmluZ3MgYXJlIG9ubHkgcHJpbnRlZCBvbmUgdGltZSBlYWNoLikiKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIHdhcm5TZXQuYWRkKHdoYXQpOworICAgICAgICB9CisgICAgfSAKKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGRpZFdhcm5TdXBlclRyaW0gPSBmYWxzZTsKKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgdHJpbUlDVShTdHJpbmcgdmVyKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBJQ1VfID0gSUNVX1NQQUNFX1BSRUZJWDsKKyAgICAgICAgZmluYWwgU3RyaW5nIElDVSA9ICJJQ1UiOworICAgICAgICBpZih2ZXIgIT0gbnVsbCkgeyAvLyB0cmltIGV2ZXJ5dGhpbmcgYmVmb3JlIHRoZSAnSUNVLi4uJworICAgICAgICAgICAgdmVyID0gdmVyLnRyaW0oKTsKKyAgICAgICAgICAgIGludCBpY3VpZHggPSB2ZXIubGFzdEluZGV4T2YoSUNVXyk7CisgICAgICAgICAgICBpbnQgaWN1aWR4MSA9IHZlci5sYXN0SW5kZXhPZihJQ1UpOworICAgICAgICAgICAgaWYoaWN1aWR4Pj0wKSB7CisgICAgICAgICAgICAgICAgdmVyID0gdmVyLnN1YnN0cmluZyhpY3VpZHgrSUNVXy5sZW5ndGgoKSkudHJpbSgpOworICAgICAgICAgICAgfSBlbHNlIGlmKGljdWlkeDE+PTApIHsKKyAgICAgICAgICAgICAgICB3YXJuKCJ0cmltbWluZzogJyIgKyB2ZXIgKyAiJyIpOworICAgICAgICAgICAgICAgIHZlciA9IHZlci5zdWJzdHJpbmcoaWN1aWR4MStJQ1UubGVuZ3RoKCkpLnRyaW0oKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IG47CisgICAgICAgICAgICAgICAgZm9yKG49dmVyLmxlbmd0aCgpLTE7bj4wICYmICgodmVyLmNoYXJBdChuKT09Jy4nKSB8fCBDaGFyYWN0ZXIuaXNEaWdpdCh2ZXIuY2hhckF0KG4pKSkgO24tLSkKKyAgICAgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgIHdhcm4oIlRyaW1taW5nIGV4dHJhbmVvdXMgJ3ZlcnNpb24nIHRleHQ6ICciICsgdmVyICsgIiciKTsKKyAgICAgICAgICAgICAgICBpZighZGlkV2FyblN1cGVyVHJpbSkgeworICAgICAgICAgICAgICAgIAlkaWRXYXJuU3VwZXJUcmltID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAJd2FybigiUGxlYXNlIE9OTFkgdXNlOiAgJ0B3aGF0ZXZlciBJQ1UgWC5ZLlonIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKG4+MCkgeworICAgICAgICAgICAgICAgICAgICB2ZXIgPSB2ZXIuc3Vic3RyaW5nKG4rMSkudHJpbSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAKKyAgICAgICAgcmV0dXJuIHZlcjsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBTdHJpbmcgc2V0VmVyKFN0cmluZyBwcmV2VmVyLCBTdHJpbmcgd2hpY2hWZXIsIEZpbGUgZGlyKSB7CisJICAgIFN0cmluZyBVVkVSU0lPTiA9IFVWRVJTSU9OQTsKKyAgICAJaWYoZGlyPT1udWxsKSB7CisgICAgCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tIit3aGljaFZlcisiZGlyIG5vdCBzZXQuIik7CisgICAgCQlwcmludFVzYWdlKCk7IC8qIGV4aXRzICovCisgICAgCX0gZWxzZSBpZighZGlyLmV4aXN0cygpfHwhZGlyLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0iK3doaWNoVmVyKyJkaXI9IitkaXIuZ2V0TmFtZSgpKyIgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IGEgZGlyZWN0b3J5LiIpOworICAgIAkJcHJpbnRVc2FnZSgpOyAvKiBleGl0cyAqLworICAgIAl9CisgICAgICAgIFN0cmluZyByZXN1bHQgPSBudWxsOworICAgICAgICAvLyBsb29raW5nIGZvcjogPG5hbWU+VV9JQ1VfVkVSU0lPTjwvbmFtZT4gaW4gdXZlcnNpb25fOGgueG1sOiAgICAgICAgPGluaXRpYWxpemVyPiZxdW90OzMuOC4xJnF1b3Q7PC9pbml0aWFsaXplcj4KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEZpbGUgdmVyRmlsZSA9IG5ldyBGaWxlKGRpciwgVVZFUlNJT04pOworCQkgICAgaWYoIXZlckZpbGUuZXhpc3RzKCkpIHsKKwkJCQlVVkVSU0lPTj1VVkVSU0lPTkI7CisJCQkJSUNVX1ZFUlNJT05fWFBBVEg9SUNVX1ZFUlNJT05fWFBBVEhCOworCQkJCXZlckZpbGUgPSBuZXcgRmlsZShkaXIsIFVWRVJTSU9OKTsKKwkJICAgIH0gZWxzZSB7CisJCQkJSUNVX1ZFUlNJT05fWFBBVEg9SUNVX1ZFUlNJT05fWFBBVEhBOworCQkgICAgfQorICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gZ2V0RG9jdW1lbnQodmVyRmlsZSk7CisgICAgICAgICAgICBET01Tb3VyY2UgdXZlcm51bV9oID0gbmV3IERPTVNvdXJjZShkb2MpOworICAgICAgICAgICAgWFBhdGggeHBhdGggPSBYUGF0aEZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdYUGF0aCgpOworCisgICAgICAgICAgICBOb2RlIGRlZmluZXMgPSAoTm9kZSl4cGF0aC5ldmFsdWF0ZShJQ1VfVkVSU0lPTl9YUEFUSCwgdXZlcm51bV9oLmdldE5vZGUoKSwgWFBhdGhDb25zdGFudHMuTk9ERSk7CisKKwkgICAgaWYoZGVmaW5lcz09bnVsbCkgeworCSAgICAJU3lzdGVtLmVyci5wcmludGxuKCJjYW4ndCBsb2FkIGZyb20gIit2ZXJGaWxlLmdldE5hbWUoKSsiOiIrSUNVX1ZFUlNJT05fWFBBVEgpOworCSAgICB9CisKKyAgICAgICAgICAgIE5vZGVMaXN0IG5MaXN0ID0gZGVmaW5lcy5nZXRDaGlsZE5vZGVzKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgcmVzdWx0PT1udWxsJiYgKGkgPCBuTGlzdC5nZXRMZW5ndGgoKSk7IGkrKykgeworICAgICAgICAgICAgICAgIE5vZGUgbG4gPSBuTGlzdC5pdGVtKGkpOworICAgICAgICAgICAgICAgIGlmKCEibWVtYmVyZGVmIi5lcXVhbHMobG4uZ2V0Tm9kZU5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIE5vZGUgbmFtZSA9IChOb2RlKXhwYXRoLmV2YWx1YXRlKE5BTUVfWFBBVEgsIGxuLCBYUGF0aENvbnN0YW50cy5OT0RFKTsKKyAgICAgICAgICAgICAgICBpZihuYW1lPT1udWxsKSBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgIC8vIFN5c3RlbS5lcnIucHJpbnRsbigiR290dGEgbm9kZTogIiArIG5hbWUpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIE5vZGUgbmFtZVZhbCA9IG5hbWUuZ2V0Rmlyc3RDaGlsZCgpOworICAgICAgICAgICAgICAgIGlmKG5hbWVWYWw9PW51bGwpIG5hbWVWYWwgPSBuYW1lOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lU3RyID0gbmFtZVZhbC5nZXROb2RlVmFsdWUoKTsKKyAgICAgICAgICAgICAgICBpZihuYW1lU3RyPT1udWxsKSBjb250aW51ZTsKKworICAgICAgICAgICAgICAgLy8gU3lzdGVtLmVyci5wcmludGxuKCJHb3R0YSBuYW1lOiAiICsgbmFtZVN0cik7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYobmFtZVN0ci50cmltKCkuZXF1YWxzKFVfSUNVX1ZFUlNJT04pKSB7CisgICAgICAgICAgICAgICAgICAgIE5vZGUgaW5pdGlhbGl6ZXIgPSAoTm9kZSl4cGF0aC5ldmFsdWF0ZShJTklUSUFMSVpFUl9YUEFUSCwgbG4sIFhQYXRoQ29uc3RhbnRzLk5PREUpOworICAgICAgICAgICAgICAgICAgICBpZihpbml0aWFsaXplcj09bnVsbCkgU3lzdGVtLmVyci5wcmludGxuKCJpbml0aWFsaXplciB3aXRoIG5vIHZhbHVlIik7CisgICAgICAgICAgICAgICAgICAgIE5vZGUgaW5pdFZhbCA9IGluaXRpYWxpemVyLmdldEZpcnN0Q2hpbGQoKTsKKy8vICAgICAgICAgICAgICAgICAgICBpZihpbml0VmFsPT1udWxsKSBpbml0VmFsID0gaW5pdGlhbGl6ZXI7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpbml0U3RyID0gaW5pdFZhbC5nZXROb2RlVmFsdWUoKS50cmltKCkucmVwbGFjZUFsbCgiXCIiLCIiKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gSUNVX1NQQUNFX1BSRUZJWCtpbml0U3RyOworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkRldGVjdGVkICIrd2hpY2hWZXIgKyAiIHZlcnNpb246ICIgKyByZXN1bHQpOworICAgICAgICAgICAgICAgICAgICBpZih3aGljaFZlci5lcXVhbHMoIm5ldyIpICYmIHJlc3VsdC5zdGFydHNXaXRoKCJJQ1UgIikpIHsKKyAgICAgICAgICAgICAgICAgICAgCQlTdHJpbmcgdmVyc1tdID0gcmVzdWx0LnN1YnN0cmluZyg0KS5zcGxpdCgiXFwuIik7CisgICAgICAgICAgICAgICAgICAgIAkJaW50IG1haiA9IEludGVnZXIucGFyc2VJbnQodmVyc1swXSk7CisgICAgICAgICAgICAgICAgICAgIAkJaW50IG1pbiA9IEludGVnZXIucGFyc2VJbnQodmVyc1sxXSk7CisgICAgICAgICAgICAgICAgICAgIAkJaWYoKG1pbiUyKT09MSkgeworICAgICAgICAgICAgICAgICAgICAJCQltaWxlc3RvbmVPZiA9ICIgKCIrcmVzdWx0KyIpIjsKKyAgICAgICAgICAgICAgICAgICAgCQkJcmVzdWx0ID0gIklDVSAiKyhtYWopKyIuIisobWluKzEpOworICAgICAgICAgICAgICAgICAgICAJCQlTeXN0ZW0uZXJyLnByaW50bG4oIiAgICAuLiAiICsgbWlsZXN0b25lT2YgKyAiIGlzIGEgbWlsZXN0b25lIHRvd2FyZHMgIiArIHJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgIAkJfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy9kdW1wTm9kZShkZWZpbmVzLCIiKTsKKyAgICAgICAgfSBjYXRjaChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgdC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiV2FybmluZzogQ291bGRuJ3QgZ2V0ICIgKyB3aGljaFZlcisgICIgdmVyc2lvbiBmcm9tICIrIFVWRVJTSU9OICsgIiAtIHJldmVydGluZyB0byAiICsgcHJldlZlcik7CisgICAgICAgICAgICByZXN1bHQgPSBwcmV2VmVyOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZihyZXN1bHQgIT0gbnVsbCkgeworICAgICAgICAJCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmKHByZXZWZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYocmVzdWx0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZighcmVzdWx0LmVxdWFscyhwcmV2VmVyKSkgeyAKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJOb3RlOiBEZXRlY3RlZCAiICsgcmVzdWx0ICsgIiB2ZXJzaW9uIGJ1dCB3ZSdsbCB1c2UgeW91ciByZXF1ZXN0ZWQgLS0iK3doaWNoVmVyKyJ2ZXIgIitwcmV2VmVyKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcHJldlZlcjsKKyAgICAgICAgICAgICAgICAJaWYoIW1pbGVzdG9uZU9mLmlzRW1wdHkoKSYmd2hpY2hWZXIuZXF1YWxzKCJuZXciKSkgeworICAgICAgICAgICAgICAgIAkJU3lzdGVtLmVyci5wcmludGxuKCIgLi4gaWdub3JpbmcgbWlsZXN0b25lIGluZGljYXRvciAiICsgbWlsZXN0b25lT2YpOworICAgICAgICAgICAgICAgIAkJbWlsZXN0b25lT2YgPSAiIjsKKyAgICAgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiTm90ZTogWW91IGRvbid0IG5lZWQgdG8gdXNlICAnLS0iK3doaWNoVmVyKyJ2ZXIgIityZXN1bHQrIicgYW55bW9yZSAtIHdlIGRldGVjdGVkIGl0IGNvcnJlY3RseS4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiTm90ZTogRGlkbid0IGRldGVjdCB2ZXJzaW9uIHNvIHdlJ2xsIHVzZSB5b3VyIHJlcXVlc3RlZCAtLSIrd2hpY2hWZXIrInZlciAiK3ByZXZWZXIpOworICAgICAgICAgICAgCXJlc3VsdCA9IHByZXZWZXI7CisgICAgICAgICAgICAJaWYoIW1pbGVzdG9uZU9mLmlzRW1wdHkoKSYmd2hpY2hWZXIuZXF1YWxzKCJuZXciKSkgeworICAgICAgICAgICAgCQlTeXN0ZW0uZXJyLnByaW50bG4oIiAuLiBpZ25vcmluZyBtaWxlc3RvbmUgaW5kaWNhdG9yICIgKyBtaWxlc3RvbmVPZik7CisgICAgICAgICAgICAJCW1pbGVzdG9uZU9mID0gIiI7CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZihyZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAJU3lzdGVtLmVyci5wcmludGxuKCJwcmV2VmVyPSIrcHJldlZlcik7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkVycm9yOiBZb3UnbGwgbmVlZCB0byB1c2UgdGhlIG9wdGlvbiAgXCItLSIrd2hpY2hWZXIrInZlclwiICBiZWNhdXNlIHdlIGNvdWxkIG5vdCBkZXRlY3QgYW4gSUNVIHZlcnNpb24gaW4gIiArIFVWRVJTSU9OICk7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigiRXJyb3I6IFlvdSdsbCBuZWVkIHRvIHVzZSB0aGUgb3B0aW9uICBcIi0tIit3aGljaFZlcisidmVyXCIgIGJlY2F1c2Ugd2UgY291bGQgbm90IGRldGVjdCBhbiBJQ1UgdmVyc2lvbiBpbiAiICsgVVZFUlNJT04gKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByaW50VXNhZ2UoKXsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZTogU3RhYmxlQVBJIG9wdGlvbiogdGFyZ2V0KiIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJPcHRpb25zOiIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAtLWhlbHAgICAgICAgICAgUHJpbnQgdGhpcyB0ZXh0Iik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgIC0tb2xkdmVyICAgICAgICBWZXJzaW9uIG9mIG9sZCB2ZXJzaW9uIG9mIElDVSAob3B0aW9uYWwpIik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgIC0tb2xkZGlyICAgICAgICBEaXJlY3RvcnkgdGhhdCBjb250YWlucyB4bWwgZG9jcyBvZiBvbGQgdmVyc2lvbiIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAtLW5ld3ZlciAgICAgICAgVmVyc2lvbiBvZiBuZXcgdmVyc2lvbiBvZiBJQ1UgKG9wdGlvbmFsKSIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAtLW5ld2RpciAgICAgICAgRGlyZWN0b3J5IHRoYXQgY29udGFpbnMgeG1sIGRvY3Mgb2YgbmV3IHZlcnNpb24iKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICAgLS1jeHNsdCAgICAgICAgIFhTTFQgZmlsZSBmb3IgQyBkb2NzIik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgIC0tY3BweHNsdCAgICAgICBYU0xUIGZpbGUgZm9yIEMrKyBkb2NzIik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgIC0tcmVwb3J0eHNsdCAgICBYU0xUIGZpbGUgZm9yIHJlcG9ydCBkb2NzIik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAgIC0tcmVzdWx0ZmlsZSAgICBPdXRwdXQgZmlsZSIpOworICAgICAgICBTeXN0ZW0uZXhpdCgtMSk7CisgICAgfQorCisgICAgc3RhdGljIFN0cmluZyBnZXRBdHRyKE5vZGUgbm9kZSwgU3RyaW5nIGF0dHJOYW1lKXsKKyAgICAJaWYobm9kZS5nZXRBdHRyaWJ1dGVzKCk9PW51bGwgJiYgbm9kZS5nZXROb2RlVHlwZSgpPT0zKSB7CisvLyAgICAJCXJldHVybiAiKHRleHQgbm9kZSAzKSI7CisgICAgCQlyZXR1cm4gIihOb2RlOiAiICsgbm9kZS50b1N0cmluZygpICsgIiApIjsKKy8vICAgIAkJcmV0dXJuIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oYXR0ck5hbWUpLmdldE5vZGVWYWx1ZSgpOworICAgIAl9CisgICAgCQorICAgICAgICB0cnkgeworICAgICAgICAJcmV0dXJuIG5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShhdHRyTmFtZSkuZ2V0Tm9kZVZhbHVlKCk7CisgICAgICAgIH0gY2F0Y2goTnVsbFBvaW50ZXJFeGNlcHRpb24gbnBlKSB7CisgICAgICAgIAlpZihub2RlLmdldEF0dHJpYnV0ZXMoKT09bnVsbCkgIHsKKyAgICAgICAgCQl0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigiW25vIGF0dHJpYnV0ZXMgQ2FuJ3QgZ2V0IGF0dHIgIithdHRyTmFtZSArIiBvdXQgb2Ygbm9kZSAiICsgbm9kZS5nZXROb2RlTmFtZSgpKyI6Iitub2RlLmdldE5vZGVUeXBlKCkrIjoiK25vZGUuZ2V0Tm9kZVZhbHVlKCkrIkAiK25vZGUuZ2V0VGV4dENvbnRlbnQoKSk7CisgICAgICAgIAl9IGVsc2UgaWYobm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKGF0dHJOYW1lKT09bnVsbCkgeworICAgICAgICAJCXJldHVybiBudWxsOyAKKyAgICAgICAgCQkvL3Rocm93IG5ldyBJbnRlcm5hbEVycm9yKCJObyBhdHRyaWJ1dGUgbmFtZWQ6ICIrYXR0ck5hbWUpOworICAgICAgICAJfSBlbHNlIHsKKyAgICAgICAgCQlTeXN0ZW0uZXJyLnByaW50bG4oIkNhbid0IGdldCBhdHRyICIrYXR0ck5hbWUrIjogIitucGUudG9TdHJpbmcoKSk7CisgICAgICAgIAl9CisgICAgICAgIAlucGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIAl0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigiQ2FuJ3QgZ2V0IGF0dHIgIithdHRyTmFtZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgc3RhdGljIFN0cmluZyBnZXRBdHRyKE5hbWVkTm9kZU1hcCBhdHRyTGlzdCwgU3RyaW5nIGF0dHJOYW1lKXsKKyAgICAgICAgcmV0dXJuIGF0dHJMaXN0LmdldE5hbWVkSXRlbShhdHRyTmFtZSkuZ2V0Tm9kZVZhbHVlKCk7CisgICAgfQorICAgIAorICAgIHN0YXRpYyBjbGFzcyBGdW5jdGlvbiBpbXBsZW1lbnRzIENvbXBhcmFibGU8RnVuY3Rpb24+IHsKKyAgICAgICAgcHVibGljIFN0cmluZyBwcm90b3R5cGU7CisgICAgICAgIHB1YmxpYyBTdHJpbmcgaWQ7CisgICAgICAgIHB1YmxpYyBTdHJpbmcgc3RhdHVzOworICAgICAgICBwdWJsaWMgU3RyaW5nIHZlcnNpb247CisgICAgICAgIHB1YmxpYyBTdHJpbmcgZmlsZTsKKyAgICAgICAgcHVibGljIFN0cmluZyBjb21wYXJhYmxlTmFtZTsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKEZ1bmN0aW9uIHJpZ2h0KXsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLnByb3RvdHlwZS5lcXVhbHMocmlnaHQucHJvdG90eXBlKTsKKyAgICAgICAgfQorICAgICAgICBzdGF0aWMgRnVuY3Rpb24gZnJvbVhtbChOb2RlIG4peworICAgICAgICAgICAgRnVuY3Rpb24gZiA9IG5ldyBGdW5jdGlvbigpOworICAgICAgICAgICAgZi5wcm90b3R5cGUgPSBnZXRBdHRyKG4sICJwcm90b3R5cGUiKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYoInllcyIuZXF1YWxzKGdldEF0dHIobiwgInN0YXRpYyIpKSYmIWYucHJvdG90eXBlLmNvbnRhaW5zKCJzdGF0aWMiKSkgeworICAgICAgICAgICAgCWYucHJvdG90eXBlID0gInN0YXRpYyAiLmNvbmNhdChmLnByb3RvdHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAgCisgICAgICAgICAgICBmLmlkID0gZ2V0QXR0cihuLCAiaWQiKTsKKyAgICAgICAgICAgIGYuc3RhdHVzID0gZ2V0QXR0cihuLCAic3RhdHVzIik7CisgICAgICAgICAgICBmLnZlcnNpb24gPSB0cmltSUNVKGdldEF0dHIobiwgInZlcnNpb24iKSk7CisgICAgICAgICAgICBmLmZpbGUgPSBnZXRBdHRyKG4sICJmaWxlIik7CisgICAgICAgICAgICBmLnB1cmlmeVByb3RvdHlwZSgpOworICAgICAgICAgICAgaWYoZi5maWxlID09IG51bGwpIHsKKyAgICAgICAgICAgIAlmLmZpbGUgPSAie251bGx9IjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAJZi5maWxlID0gRnVuY3Rpb24uZ2V0QmFzZW5hbWUoZi5maWxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGYuY29tcGFyYWJsZU5hbWUgPSBmLmNvbXBhcmFibGVOYW1lKCk7CisgICAgICAgICAgICByZXR1cm4gZjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnZlcnQgc3RyaW5nIHRvIGJhc2VuYW1lLgorICAgICAgICAgKiBAcGFyYW0gc3RyCisgICAgICAgICAqIEByZXR1cm4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRCYXNlbmFtZShTdHJpbmcgc3RyKXsKKyAgICAgICAgICAgIGludCBpID0gc3RyLmxhc3RJbmRleE9mKCIvIik7CisgICAgICAgICAgICBzdHIgPSBpID09IC0xID8gc3RyIDogc3RyLnN1YnN0cmluZyhpKzEpOworICAgICAgICAgICAgcmV0dXJuIHN0cjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNwZWNpYWwgY2FzZXM6CisgICAgICAgICAqIAorICAgICAgICAgKiBSZW1vdmUgdGhlIHN0YXR1cyBhdHRyaWJ1dGUgZW1iZWRkZWQgaW4gdGhlIEMgcHJvdG90eXBlCisgICAgICAgICAqIAorICAgICAgICAgKiBSZW1vdmUgdGhlIHZpcnR1YWwga2V5d29yZCBpbiBDcHAgcHJvdG90eXBlCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHZvaWQgcHVyaWZ5UHJvdG90eXBlKCl7CisgICAgICAgICAgICAvL3JlZmVyIHRvICd1bWFjaGluZS5oJworICAgICAgICAgICAgU3RyaW5nIHN0YXR1c0xpc3RbXSA9IHsiVV9DQVBJIiwgIlVfU1RBQkxFIiwgIlVfRFJBRlQiLCAiVV9ERVBSRUNBVEVEIiwgIlVfT0JTT0xFVEUiLCAiVV9JTlRFUk5BTCIsICJ2aXJ0dWFsIiwgIlVfRVhQT1JUMiJ9OworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdGF0dXNMaXN0Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHMgPSBzdGF0dXNMaXN0W2ldOworICAgICAgICAgICAgICAgIHByb3RvdHlwZSA9IHByb3RvdHlwZS5yZXBsYWNlQWxsKHMsIiIpOworICAgICAgICAgICAgICAgIHByb3RvdHlwZSA9IHByb3RvdHlwZS50cmltKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFN0cmluZyByZXBsTGlzdFtdID0geyAgIlsgXSpcXChbIF0qdm9pZFsgXSpcXClbIF0qIiwgICAiKCkiLAorICAgICAgICAgICAgCQkJCSAgICAgICAiICwgIiwgIiwgIiwKKyAgICAgICAgICAgIAkJCQkJCX07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcGxMaXN0Lmxlbmd0aDsgaSs9IDIpIHsKKyAgICAgICAgICAgICAgICBwcm90b3R5cGUgPSBwcm90b3R5cGUucmVwbGFjZUFsbChyZXBsTGlzdFtpKzBdLHJlcGxMaXN0W2krMV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICAKKyAgICAgICAgICAgIHByb3RvdHlwZSA9IHByb3RvdHlwZS50cmltKCk7CisKKyAgICAgICAgICAgIC8vIE5vdywgcmVtb3ZlIHBhcmFtZXRlciBuYW1lcyEKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBvdXQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICBTdHJpbmdCdWZmZXIgaW4gPSBuZXcgU3RyaW5nQnVmZmVyKHByb3RvdHlwZSk7CisgICAgICAgICAgICBpbnQgb3BlblBhcmVuID0gaW4uaW5kZXhPZigiKCIpOworICAgICAgICAgICAgaW50IGNsb3NlUGFyZW4gPSBpbi5sYXN0SW5kZXhPZigiKSIpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZihvcGVuUGFyZW49PS0xIHx8IGNsb3NlUGFyZW49PS0xKSByZXR1cm47IC8vIGV4aXQsIG1hbGZvcm1lZD8KKyAgICAgICAgICAgIGlmKG9wZW5QYXJlbisxPT1jbG9zZVBhcmVuKSByZXR1cm47IC8vIGV4aXQ6ICgpCisgICAgICAgICAgICAKKyAgICAgICAgICAgIG91dC5hcHBlbmQoaW4sIDAsIG9wZW5QYXJlbisxKTsgLy8gcHJlbHVkZQorICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBmb3IoaW50IGxlZnQgPSBvcGVuUGFyZW4rMTsgbGVmdDxjbG9zZVBhcmVuOykgeworICAgICAgICAgICAgCWludCByaWdodCA9IGluLmluZGV4T2YoIiwiLCBsZWZ0KzEpOyAvLyByaWdodCBlZGdlCisgICAgICAgICAgICAJaWYocmlnaHQ+PWNsb3NlUGFyZW4gfHwgcmlnaHQ9PS0xICkgIHJpZ2h0PWNsb3NlUGFyZW47IC8vIGZvdW5kIGxhc3QgY29tbWEKKyAgICAgICAgICAgIAkKKyAgICAgICAgICAgIC8vCVN5c3RlbS5lcnIucHJpbnRsbigiQ29uc2lkZXJpbmcgICIgKyBsZWZ0ICsgIiAvICIgKyByaWdodCArICIgLSAiICsgY2xvc2VQYXJlbiArICAiIDogIiAgKyBpbi5zdWJzdHJpbmcobGVmdCwgcmlnaHQpKTsKKyAgICAgICAgICAgIAkKKyAgICAgICAgICAgIAlpZihsZWZ0PT1yaWdodCkgY29udGludWU7IAorICAgICAgICAgICAgCQorICAgICAgICAgICAgCS8vIGZpbmQgdmFyaWFibGUgbmFtZQorICAgICAgICAgICAgCWludCByaWdodENoID0gcmlnaHQtMTsKKyAgICAgICAgICAgIAlpZihyaWdodENoPT1sZWZ0KSB7IC8vIDEgY2gtIGJyZWFrCisgICAgICAgICAgICAJCW91dC5hcHBlbmQoaW4sbGVmdCxyaWdodCk7CisgICAgICAgICAgICAJCWNvbnRpbnVlOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAkvLyBlYXQgd2hpdGVzcGFjZSBhdCByaWdodAorICAgICAgICAgICAgCWludCBuYW1lRW5kQ2ggPSByaWdodENoOworICAgICAgICAgICAgCXdoaWxlKG5hbWVFbmRDaD5sZWZ0ICYmIENoYXJhY3Rlci5pc1doaXRlc3BhY2UoaW4uY2hhckF0KG5hbWVFbmRDaCkpKSB7CisgICAgICAgICAgICAJCW5hbWVFbmRDaC0tOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAlpbnQgbmFtZVN0YXJ0Q2ggPSBuYW1lRW5kQ2g7CisgICAgICAgICAgICAJd2hpbGUobmFtZVN0YXJ0Q2g+bGVmdCAmJiBDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoaW4uY2hhckF0KG5hbWVTdGFydENoKSkpIHsKKyAgICAgICAgICAgIAkJbmFtZVN0YXJ0Q2gtLTsKKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICAJCisgICAgICAgICAgICAJLy8gbm93LCBkaWQgd2UgZmluZCBzb21ldGhpbmcgdG8gc2tpcD8KKyAgICAgICAgICAgIAlpZihuYW1lU3RhcnRDaD5sZWZ0ICYmIG5hbWVFbmRDaD5uYW1lU3RhcnRDaCkgeworICAgICAgICAgICAgCQlvdXQuYXBwZW5kKGluLCBsZWZ0LCBuYW1lU3RhcnRDaCsxKTsKKyAgICAgICAgICAgIAl9IGVsc2UgeworICAgICAgICAgICAgCQkvLyBwYXNzIHRocm91Z2gKKyAgICAgICAgICAgIAkJb3V0LmFwcGVuZChpbiwgbGVmdCwgcmlnaHQpOworICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAkKKyAgICAgICAgICAgIAlsZWZ0ID0gcmlnaHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG91dC5hcHBlbmQoaW4sIGNsb3NlUGFyZW4sIGluLmxlbmd0aCgpKTsgLy8gcG9zdGx1ZGUKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gRGVsZXRlIGFueSBkb3VibGVkIHdoaXRlc3BhY2UuCisgICAgICAgICAgICBmb3IoaW50IHA9MTtwPG91dC5sZW5ndGgoKTtwKyspIHsKKyAgICAgICAgICAgICAgICBjaGFyIHByZXYgPSBvdXQuY2hhckF0KHAtMSk7IAorICAgICAgICAgICAgCWlmKENoYXJhY3Rlci5pc1doaXRlc3BhY2UocHJldikpIHsKKyAgICAgICAgICAgIAkJd2hpbGUgKG91dC5sZW5ndGgoKT5wJiYoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShvdXQuY2hhckF0KHApKSkpIHsKKyAgICAgICAgICAgIAkJCW91dC5kZWxldGVDaGFyQXQocCk7CisgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgIAkJaWYob3V0Lmxlbmd0aCgpPnApIHsKKyAgICAgICAgICAgIAkJCS8vIGFueSB0cmFpbGluZ3MgdG8gZGVsZXRlPworICAgICAgICAgICAgCQkJY2hhciBjdXJyID0gb3V0LmNoYXJBdChwKTsKKyAgICAgICAgICAgIAkJCWlmKGN1cnI9PScsJyB8fCBjdXJyPT0nKScgfHwgY3Vycj09JyonIHx8IGN1cnI9PScmJykgeyAvLyBkZWxldGUgc3BhY2VzIGJlZm9yZSB0aGVzZS4KKyAgICAgICAgICAgIAkJCQlvdXQuZGVsZXRlQ2hhckF0KC0tcCk7CisgICAgICAgICAgICAJCQkJY29udGludWU7CisgICAgICAgICAgICAJCQl9CisgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAvLyAgU3lzdGVtLmVyci5wcmludGxuKHByb3RvdHlwZSsiIC0+ICIgKyBvdXQudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBwcm90b3R5cGUgPSBvdXQudG9TdHJpbmcoKTsKKyAgICAgICAgfQorLy8gICAgICAgIHByaXZhdGUgRWxlbWVudCB0b1htbChEb2N1bWVudCBkb2MpeworLy8gICAgICAgICAgICBFbGVtZW50ICBlbGUgPSBkb2MuY3JlYXRlRWxlbWVudCgiZnVuYyIpOworLy8gICAgICAgICAgICBlbGUuc2V0QXR0cmlidXRlKCJwcm90b3R5cGUiLCBwcm90b3R5cGUpOworLy8gICAgICAgICAgICBlbGUuc2V0QXR0cmlidXRlKCJpZCIsIGlkKTsKKy8vICAgICAgICAgICAgZWxlLnNldEF0dHJpYnV0ZSgic3RhdHVzIiwgc3RhdHVzKTsKKy8vICAgICAgICAgICAgcmV0dXJuIGVsZTsKKy8vICAgICAgICB9CisJCXB1YmxpYyBpbnQgY29tcGFyZVRvKEZ1bmN0aW9uIG8pIHsKKwkJCXJldHVybiBjb21wYXJhYmxlTmFtZS5jb21wYXJlVG8oKChGdW5jdGlvbilvKS5jb21wYXJhYmxlTmFtZSk7CisJCX0KKwkJcHVibGljIFN0cmluZyBjb21wYXJhYmxlTmFtZSgpIHsgCisJCQlyZXR1cm4gZmlsZSsifCIrcHJvdG90eXBlKyJ8IitzdGF0dXMrInwiK3ZlcnNpb24rInwiK2lkOworCQl9CisgICAgfQorICAgIAorICAgIHN0YXRpYyBjbGFzcyBKb2luZWRGdW5jdGlvbiBpbXBsZW1lbnRzIENvbXBhcmFibGU8Sm9pbmVkRnVuY3Rpb24+IHsKKyAgICAgICAgcHVibGljIFN0cmluZyBwcm90b3R5cGU7CisgICAgICAgIHB1YmxpYyBTdHJpbmcgbGVmdFJlZklkOworICAgICAgICBwdWJsaWMgU3RyaW5nIGxlZnRTdGF0dXM7CisgICAgICAgIHB1YmxpYyBTdHJpbmcgbGVmdFZlcnNpb247CisgICAgICAgIHB1YmxpYyBTdHJpbmcgcmlnaHRWZXJzaW9uOworICAgICAgICBwdWJsaWMgU3RyaW5nIGxlZnRGaWxlOworICAgICAgICBwdWJsaWMgU3RyaW5nIHJpZ2h0UmVmSWQ7CisgICAgICAgIHB1YmxpYyBTdHJpbmcgcmlnaHRTdGF0dXM7CisgICAgICAgIHB1YmxpYyBTdHJpbmcgcmlnaHRGaWxlOworICAgICAgICAKKyAgICAgICAgcHVibGljIFN0cmluZyBjb21wYXJhYmxlTmFtZTsKKyAgICAgICAgCisgICAgICAgIHN0YXRpYyBKb2luZWRGdW5jdGlvbiBmcm9tTGVmdEZ1bihGdW5jdGlvbiBsZWZ0KXsKKyAgICAgICAgICAgIEpvaW5lZEZ1bmN0aW9uIHUgPSBuZXcgSm9pbmVkRnVuY3Rpb24oKTsKKyAgICAgICAgICAgIHUucHJvdG90eXBlID0gbGVmdC5wcm90b3R5cGU7CisgICAgICAgICAgICB1LmxlZnRSZWZJZCA9IGxlZnQuaWQ7CisgICAgICAgICAgICB1LmxlZnRTdGF0dXMgPSBsZWZ0LnN0YXR1czsKKyAgICAgICAgICAgIHUubGVmdEZpbGUgPSBsZWZ0LmZpbGU7CisgICAgICAgICAgICB1LnJpZ2h0UmVmSWQgPSBudWw7CisgICAgICAgICAgIC8vIHUucmlnaHRWZXJzaW9uID0gbnVsOworICAgICAgICAgICAgdS5sZWZ0VmVyc2lvbiA9IGxlZnQudmVyc2lvbjsKKyAgICAgICAgICAgIHUucmlnaHRTdGF0dXMgPSBudWw7CisgICAgICAgICAgICB1LnJpZ2h0RmlsZSA9IG51bDsKKyAgICAgICAgICAgIHUuY29tcGFyYWJsZU5hbWUgPSBsZWZ0LmNvbXBhcmFibGVOYW1lOworICAgICAgICAgICAgcmV0dXJuIHU7CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgc3RhdGljIEpvaW5lZEZ1bmN0aW9uIGZyb21SaWdodEZ1bihGdW5jdGlvbiByaWdodCl7CisgICAgICAgICAgICBKb2luZWRGdW5jdGlvbiB1ID0gbmV3IEpvaW5lZEZ1bmN0aW9uKCk7CisgICAgICAgICAgICB1LnByb3RvdHlwZSA9IHJpZ2h0LnByb3RvdHlwZTsKKyAgICAgICAgICAgIHUubGVmdFJlZklkID0gbnVsOworICAgICAgICAgICAgdS5sZWZ0U3RhdHVzID0gbnVsOworICAgICAgICAgICAgdS5sZWZ0RmlsZSA9IG51bDsKKyAgICAgICAgICAgLy8gdS5sZWZ0VmVyc2lvbiA9IG51bDsKKyAgICAgICAgICAgIHUucmlnaHRWZXJzaW9uID0gcmlnaHQudmVyc2lvbjsKKyAgICAgICAgICAgIHUucmlnaHRSZWZJZCA9IHJpZ2h0LmlkOworICAgICAgICAgICAgdS5yaWdodFN0YXR1cyA9IHJpZ2h0LnN0YXR1czsKKyAgICAgICAgICAgIHUucmlnaHRGaWxlID0gcmlnaHQuZmlsZTsKKyAgICAgICAgICAgIHUuY29tcGFyYWJsZU5hbWUgPSByaWdodC5jb21wYXJhYmxlTmFtZTsKKyAgICAgICAgICAgIHJldHVybiB1OworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBzdGF0aWMgSm9pbmVkRnVuY3Rpb24gZnJvbVR3b0Z1bihGdW5jdGlvbiBsZWZ0LCBGdW5jdGlvbiByaWdodCl7CisgICAgICAgICAgICBpZiAoIWxlZnQuZXF1YWxzKHJpZ2h0KSkgdGhyb3cgbmV3IEVycm9yKCk7CisgICAgICAgICAgICBKb2luZWRGdW5jdGlvbiB1ID0gbmV3IEpvaW5lZEZ1bmN0aW9uKCk7CisgICAgICAgICAgICB1LnByb3RvdHlwZSA9IGxlZnQucHJvdG90eXBlOworICAgICAgICAgICAgdS5sZWZ0UmVmSWQgPSBsZWZ0LmlkOworICAgICAgICAgICAgdS5sZWZ0U3RhdHVzID0gbGVmdC5zdGF0dXM7CisgICAgICAgICAgICB1LmxlZnRGaWxlID0gbGVmdC5maWxlOworICAgICAgICAgICAgdS5yaWdodFJlZklkID0gcmlnaHQuaWQ7CisgICAgICAgICAgICB1LnJpZ2h0U3RhdHVzID0gcmlnaHQuc3RhdHVzOworICAgICAgICAgICAgdS5sZWZ0VmVyc2lvbiA9IGxlZnQudmVyc2lvbjsKKyAgICAgICAgICAgIHUucmlnaHRWZXJzaW9uID0gcmlnaHQudmVyc2lvbjsKKyAgICAgICAgICAgIHUucmlnaHRGaWxlID0gcmlnaHQuZmlsZTsKKyAgICAgICAgICAgIHUuY29tcGFyYWJsZU5hbWUgPSBsZWZ0LmNvbXBhcmFibGVOYW1lKyIrIityaWdodC5jb21wYXJhYmxlTmFtZTsKKyAgICAgICAgICAgIHJldHVybiB1OworICAgICAgICB9CisKKyAgICAgICAgRWxlbWVudCB0b1htbChEb2N1bWVudCBkb2MpeworICAgICAgICAgICAgRWxlbWVudCAgZWxlID0gZG9jLmNyZWF0ZUVsZW1lbnQoImZ1bmMiKTsKKyAgICAgICAgICAgIGVsZS5zZXRBdHRyaWJ1dGUoInByb3RvdHlwZSIsIGZvcm1hdENvZGUocHJvdG90eXBlKSk7CisvLyAgICAgICAgICAgIGVsZS5zZXRBdHRyaWJ1dGUoImxlZnRSZWZJZCIsIGxlZnRSZWZJZCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGVsZS5zZXRBdHRyaWJ1dGUoImxlZnRTdGF0dXMiLCBsZWZ0U3RhdHVzKTsKKy8vICAgICAgICAgICAgZWxlLnNldEF0dHJpYnV0ZSgicmlnaHRSZWZJZCIsIHJpZ2h0UmVmSWQpOworICAgICAgICAgICAgZWxlLnNldEF0dHJpYnV0ZSgicmlnaHRTdGF0dXMiLCByaWdodFN0YXR1cyk7CisgICAgICAgICAgICBlbGUuc2V0QXR0cmlidXRlKCJsZWZ0VmVyc2lvbiIsIGxlZnRWZXJzaW9uKTsKKy8vICAgICAgICAgICAgZWxlLnNldEF0dHJpYnV0ZSgicmlnaHRSZWZJZCIsIHJpZ2h0UmVmSWQpOworICAgICAgICAgICAgZWxlLnNldEF0dHJpYnV0ZSgicmlnaHRWZXJzaW9uIiwgcmlnaHRWZXJzaW9uKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgCisvLyAgICAgICAgICAgIFN0cmluZyBmID0gcmlnaHRSZWZJZC5lcXVhbHMobnVsKSA/IGxlZnRSZWZJZCA6IHJpZ2h0UmVmSWQ7CisvLyAgICAgICAgICAgIGludCB0YWlsID0gZi5pbmRleE9mKCJfIik7CisvLyAgICAgICAgICAgIGYgPSB0YWlsICE9IC0xID8gZi5zdWJzdHJpbmcoMCwgdGFpbCkgOiBmOworLy8gICAgICAgICAgICBmID0gZi5zdGFydHNXaXRoKCJjbGFzcyIpID8gZi5yZXBsYWNlRmlyc3QoImNsYXNzIiwiIikgOiBmOworICAgICAgICAgICAgU3RyaW5nIGYgPSByaWdodEZpbGUuZXF1YWxzKG51bCkgPyBsZWZ0RmlsZSA6IHJpZ2h0RmlsZTsKKyAgICAgICAgICAgIGVsZS5zZXRBdHRyaWJ1dGUoImZpbGUiLCBmKTsKKyAgICAgICAgICAgIHJldHVybiBlbGU7CisgICAgICAgIH0KKyAgICAgICAgCisKKwkJcHVibGljIGludCBjb21wYXJlVG8oSm9pbmVkRnVuY3Rpb24gbykgeworCQkJcmV0dXJuIGNvbXBhcmFibGVOYW1lLmNvbXBhcmVUbyhvLmNvbXBhcmFibGVOYW1lKTsKKwkJfQorCQkKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKEZ1bmN0aW9uIHJpZ2h0KXsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLnByb3RvdHlwZS5lcXVhbHMocmlnaHQucHJvdG90eXBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIFRyYW5zZm9ybWVyRmFjdG9yeSB0cmFuc0ZhYyA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgIFRyYW5zZm9ybWVyIG1ha2VUcmFuc2Zvcm1lcihJbnB1dFN0cmVhbSBpcywgU3RyaW5nIG5hbWUpIHsKKyAgICAJaWYoaXM9PW51bGwpIHsKKyAgICAJCXRocm93IG5ldyBJbnRlcm5hbEVycm9yKCJObyBpbnB1dHN0cmVhbSBzZXQgZm9yICIgKyBuYW1lKTsKKyAgICAJfQorICAgIAlTeXN0ZW0uZXJyLnByaW50bG4oIlRyYW5zZm9ybWluZyBmcm9tOiAiICsgbmFtZSk7CisgICAgCVRyYW5zZm9ybWVyIHQ7CisJCXRyeSB7CisvLwkJCS8vIGNoZWNrIHRoZSBwcm9sb2cKKy8vCQkJaWYoaXMubWFya1N1cHBvcnRlZCgpKSAgdHJ5IHsKKy8vCQkJCWlzLm1hcmsoMTAwKTsKKy8vCQkJCWludCBiID0gaXMucmVhZCgpOworLy8JCQkJaXMucmVzZXQoKTsKKy8vCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiUmVhZCBieXRlOiA9PSAiICsgSW50ZWdlci50b0hleFN0cmluZyhiKSk7CisvLwkJCX0gY2F0Y2goVGhyb3dhYmxlIHRoKSB7CisvLwkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIiAoIGNvdWxkbid0IHJlYWQgYSBieXRlOiAiICsgdGgudG9TdHJpbmcoKSsgIiApIik7CisvLwkJCX0gZWxzZSB7CisvLwkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIiAoIGNvdWxkbid0IHNldCBtYXJrKSIpOworLy8JCQl9CisJCQlTdHJlYW1Tb3VyY2Ugc3MgPSBuZXcgU3RyZWFtU291cmNlKGlzKTsKKwkJCXNzLnNldFN5c3RlbUlkKG5ldyBGaWxlKCIuIikpOworCQkJdCA9IHRyYW5zRmFjLm5ld1RyYW5zZm9ybWVyKHNzKTsKKwkJfSBjYXRjaCAoVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQl0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigiQ291bGRuJ3QgbWFrZSB0cmFuc2Zvcm1lciBmb3IgIiArIG5hbWUgKyAiIC0gIiArIGUuZ2V0TWVzc2FnZUFuZExvY2F0aW9uKCkpOwkJCQorCQl9CisgICAgCWlmKHQgPT0gbnVsbCkgeworICAgIAkJdGhyb3cgbmV3IEludGVybmFsRXJyb3IoIkNvdWxkbid0IG1ha2UgdHJhbnNmb3JtZXIgZm9yICIgKyBuYW1lKTsKKyAgICAJfQorICAgIAlyZXR1cm4gdDsKKyAgICB9CisgICAgcHJpdmF0ZSB2b2lkIHJlcG9ydFNlbGVjdGVkRnVuKE5vZGUgam9pbmVkTm9kZSkgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uLCBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9ueworICAgICAgICBUcmFuc2Zvcm1lciByZXBvcnQgPSBtYWtlVHJhbnNmb3JtZXIocmVwb3J0WHNsU3RyZWFtLCBSUFRYU0xUKTsKKyAgICAgICAgLy9yZXBvcnQuc2V0UGFyYW1ldGVyKCJsZWZ0U3RhdHVzIiwgbGVmdFN0YXR1cyk7CisgICAgICAgIHJlcG9ydC5zZXRQYXJhbWV0ZXIoImxlZnRWZXIiLCBsZWZ0VmVyKTsKKy8vICAgICAgICByZXBvcnQuc2V0UGFyYW1ldGVyKCJyaWdodFN0YXR1cyIsIHJpZ2h0U3RhdHVzKTsKKyAgICAgICAgcmVwb3J0LnNldFBhcmFtZXRlcigib3VyWWVhciIsIG5ldyBJbnRlZ2VyKG5ldyBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXIoKS5nZXQoamF2YS51dGlsLkNhbGVuZGFyLllFQVIpKSk7CisgICAgICAgIHJlcG9ydC5zZXRQYXJhbWV0ZXIoInJpZ2h0VmVyIiwgcmlnaHRWZXIpOworICAgICAgICByZXBvcnQuc2V0UGFyYW1ldGVyKCJyaWdodE1pbGVzdG9uZSIsIG1pbGVzdG9uZU9mKTsKKyAgICAgICAgcmVwb3J0LnNldFBhcmFtZXRlcigiZGF0ZVRpbWUiLCBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoKS5nZXRUaW1lKCkpOworICAgICAgICByZXBvcnQuc2V0UGFyYW1ldGVyKCJudWwiLCBudWwpOworICAgICAgICAKKyAgICAgICAgRE9NU291cmNlIHNyYyA9IG5ldyBET01Tb3VyY2Uoam9pbmVkTm9kZSk7CisKKyAgICAgICAgUmVzdWx0IHJlcyA9IG5ldyBTdHJlYW1SZXN1bHQocmVzdWx0RmlsZSk7CisvLyAgICAgICAgRE9NUmVzdWx0IHJlcyA9IG5ldyBET01SZXN1bHQoKTsKKyAgICAgICAgcmVwb3J0LnRyYW5zZm9ybShzcmMsIHJlcyk7CisvLyAgICAgICAgZHVtcE5vZGUocmVzLmdldE5vZGUoKSwiIik7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgU2V0PEpvaW5lZEZ1bmN0aW9uPiBnZXRGdWxsTGlzdChJbnB1dFN0cmVhbSBkdW1wWHNsdFN0cmVhbSwgU3RyaW5nIGR1bXBYc2x0RmlsZSkgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uLCBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBYUGF0aEV4cHJlc3Npb25FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb257CisgICAgICAgIC8vIHByZXBhcmUgdHJhbnNmb3JtZXIKKyAgICAgICAgWFBhdGggeHBhdGggPSBYUGF0aEZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdYUGF0aCgpOworICAgICAgICBTdHJpbmcgZXhwcmVzc2lvbiA9ICIvbGlzdCI7CisgICAgICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gbWFrZVRyYW5zZm9ybWVyKGR1bXBYc2x0U3RyZWFtLCBkdW1wWHNsdEZpbGUpOworCisgICAgICAgIC8vICAgICAgICBJbnB1dFNvdXJjZSBsZWZ0U291cmNlID0gbmV3IElucHV0U291cmNlKGxlZnREaXIgKyAiaW5kZXgueG1sIik7CisgICAgICAgIERPTVNvdXJjZSBsZWZ0SW5kZXggPSBuZXcgRE9NU291cmNlKGdldERvY3VtZW50KG5ldyBGaWxlKGxlZnREaXIsSU5ERVhfWE1MKSkpOworICAgICAgICBET01SZXN1bHQgbGVmdFJlc3VsdCA9IG5ldyBET01SZXN1bHQoKTsKKyAgICAgICAgdHJhbnNmb3JtZXIuc2V0UGFyYW1ldGVyKERPQ19GT0xERVIsIGxlZnREaXIpOworICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obGVmdEluZGV4LCBsZWZ0UmVzdWx0KTsKKworLy8gICAgICAgIE5vZGUgbGVmdExpc3QgPSBYUGF0aEFQSS5zZWxlY3RTaW5nbGVOb2RlKGxlZnRSZXN1bHQuZ2V0Tm9kZSgpLCIvbGlzdCIpOworICAgICAgICBOb2RlIGxlZnRMaXN0ID0gKE5vZGUpeHBhdGguZXZhbHVhdGUoZXhwcmVzc2lvbiwgbGVmdFJlc3VsdC5nZXROb2RlKCksIFhQYXRoQ29uc3RhbnRzLk5PREUpOworICAgICAgICBpZihsZWZ0TGlzdD09bnVsbCkgeworICAgICAgICAgICAJLy9kdW1wTm9kZSh4c2x0U291cmNlLmdldE5vZGUoKSk7CisgICAgICAgICAgCWR1bXBOb2RlKGxlZnRSZXN1bHQuZ2V0Tm9kZSgpKTsKKy8vICAgICAgICAJZHVtcE5vZGUobGVmdEluZGV4LmdldE5vZGUoKSk7CisgICAgICAgIAlTeXN0ZW0ub3V0LmZsdXNoKCk7CisgICAgICAgIAlTeXN0ZW0uZXJyLmZsdXNoKCk7CisgICAgICAgIAl0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigiZ2V0RnVsbExpc3QoIitkdW1wWHNsdEZpbGUudG9TdHJpbmcoKSsiKSByZXR1cm5lZCBhIG51bGwgbGVmdCAiK2V4cHJlc3Npb24pOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICB4cGF0aC5yZXNldCgpOyAvLyByZXVzZQorICAgICAgICAKKyAgICAgICAgRE9NU291cmNlIHJpZ2h0SW5kZXggPSBuZXcgRE9NU291cmNlKGdldERvY3VtZW50KG5ldyBGaWxlKHJpZ2h0RGlyLElOREVYX1hNTCkpKTsKKyAgICAgICAgRE9NUmVzdWx0IHJpZ2h0UmVzdWx0ID0gbmV3IERPTVJlc3VsdCgpOworICAgICAgICB0cmFuc2Zvcm1lci5zZXRQYXJhbWV0ZXIoRE9DX0ZPTERFUiwgcmlnaHREaXIpOworICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImFiZFRvTG9hZCAiK2R1bXBYc2x0RmlsZS50b1N0cmluZygpKTsKKyAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKHJpZ2h0SW5kZXgsIHJpZ2h0UmVzdWx0KTsKKyAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJkbmxUb0xvYWQgIitkdW1wWHNsdEZpbGUudG9TdHJpbmcoKSk7CisgICAgICAgIE5vZGUgcmlnaHRMaXN0ID0gKE5vZGUpeHBhdGguZXZhbHVhdGUoZXhwcmVzc2lvbiwgcmlnaHRSZXN1bHQuZ2V0Tm9kZSgpLCBYUGF0aENvbnN0YW50cy5OT0RFKTsKKyAgICAgICAgaWYocmlnaHRMaXN0PT1udWxsKSB7CisgICAgICAgIAl0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigiZ2V0RnVsbExpc3QoIitkdW1wWHNsdEZpbGUudG9TdHJpbmcoKSsiKSByZXR1cm5lZCBhIG51bGwgcmlnaHQgIitleHByZXNzaW9uKTsKKyAgICAgICAgfQorLy8gICAgICAgIGR1bXBOb2RlKHJpZ2h0TGlzdCwiIik7CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgU2V0PEZ1bmN0aW9uPiBsZWZ0U2V0ID0gbm9kZVRvU2V0KGxlZnRMaXN0KTsKKyAgICAgICAgU2V0PEZ1bmN0aW9uPiByaWdodFNldCA9IG5vZGVUb1NldChyaWdodExpc3QpOworICAgICAgICBTZXQ8Sm9pbmVkRnVuY3Rpb24+IGpvaW5lZCA9IGZ1bGxKb2luKGxlZnRTZXQsIHJpZ2h0U2V0KTsKKyAgICAgICAgcmV0dXJuIGpvaW5lZDsKKy8vICAgICAgICBqb2luZWROb2RlID0gc2V0VG9Ob2RlKGpvaW5lZCk7CisvLyAgICAgICAgZHVtcE5vZGUoam9pbmVkTm9kZSwiIik7CisvLyAgICAgICAgcmV0dXJuIGpvaW5lZE5vZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIG5vZGUKKyAgICAgKiBAcmV0dXJuICAgICAgU2V0PEZ1bj4KKyAgICAgKi8KKyAgICBwcml2YXRlIFNldDxGdW5jdGlvbj4gbm9kZVRvU2V0KE5vZGUgbm9kZSl7CisgICAgICAgIFNldDxGdW5jdGlvbj4gcyA9IG5ldyBUcmVlU2V0PEZ1bmN0aW9uPigpOworICAgICAgICBOb2RlTGlzdCBsaXN0ID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5nZXRMZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICBOb2RlIG4gPSBsaXN0Lml0ZW0oaSk7CisgICAgICAgICAgICBzLmFkZChGdW5jdGlvbi5mcm9tWG1sKG4pKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gc2V0ICAgICAgIFNldDxKb2luZWRGdW4+CisgICAgICogQHJldHVybgorICAgICAqIEB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgorICAgICAqLworICAgIHByaXZhdGUgTm9kZSBzZXRUb05vZGUoU2V0PEpvaW5lZEZ1bmN0aW9uPiBzZXQpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9ueworICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRiZiA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgRG9jdW1lbnQgZG9jICA9IGRiZi5uZXdEb2N1bWVudEJ1aWxkZXIoKS5uZXdEb2N1bWVudCgpOworICAgICAgICBFbGVtZW50IHJvb3QgPSBkb2MuY3JlYXRlRWxlbWVudCgibGlzdCIpOworICAgICAgICBkb2MuYXBwZW5kQ2hpbGQocm9vdCk7CisgICAgICAgIGZvciAoSXRlcmF0b3I8Sm9pbmVkRnVuY3Rpb24+IGl0ZXIgPSBzZXQuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBKb2luZWRGdW5jdGlvbiBmdW4gPSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIHJvb3QuYXBwZW5kQ2hpbGQoZnVuLnRvWG1sKGRvYykpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBkb2M7CisgICAgfQorCisgICAgLyoqCisgICAgICogZnVsbC1qb2luIHR3byBTZXQgb24gJ3Byb3RvdHlwZScgCisgICAgICogCisgICAgICogQHBhcmFtIGxlZnQgICAgIFNldDxGdW4+CisgICAgICogQHBhcmFtIHJpZ2h0ICAgIFNldDxGdW4+CisgICAgICogQHJldHVybiAgICAgICAgICBTZXQ8Sm9pbmVkRnVuPgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFNldDxKb2luZWRGdW5jdGlvbj4gZnVsbEpvaW4oU2V0PEZ1bmN0aW9uPiBsZWZ0LCBTZXQ8RnVuY3Rpb24+IHJpZ2h0KXsKKworICAgICAgICBTZXQ8Sm9pbmVkRnVuY3Rpb24+IGpvaW5lZCA9IG5ldyBUcmVlU2V0PEpvaW5lZEZ1bmN0aW9uPigpOyAvL1NldDxKb2luZWRGdW4+CisgICAgICAgIFNldDxGdW5jdGlvbj4gY29tbW9uID0gbmV3IFRyZWVTZXQ8RnVuY3Rpb24+KCk7IC8vU2V0PEZ1bj4KKyAgICAgICAgZm9yIChJdGVyYXRvcjxGdW5jdGlvbj4gaXRlcjEgPSBsZWZ0Lml0ZXJhdG9yKCk7IGl0ZXIxLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIEZ1bmN0aW9uIGYxID0gaXRlcjEubmV4dCgpOworLy8gICAgICAgICAgICBpZiAoZjEucHJvdG90eXBlLm1hdGNoZXMoIi4qVHJhbnNsaXRlcmF0b3I6Oi4qIikpeworLy8gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJsZWZ0OiAiICsgZjEucHJvdG90eXBlKTsKKy8vICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigibGVmdDogIiArIGYxLnN0YXR1cyk7CisvLyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3I8RnVuY3Rpb24+IGl0ZXIyID0gcmlnaHQuaXRlcmF0b3IoKTsgaXRlcjIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIEZ1bmN0aW9uIGYyID0gaXRlcjIubmV4dCgpOworLy8gICAgICAgICAgICAgICAgaWYgKCBmMS5wcm90b3R5cGUubWF0Y2hlcygiLipmaWx0ZXJlZFRyYW5zbGl0ZXJhdGUuKiIpCisvLyAgICAgICAgICAgICAgICAgICYmIGYyLnByb3RvdHlwZS5tYXRjaGVzKCIuKmZpbHRlcmVkVHJhbnNsaXRlcmF0ZS4qIikpeworLy8gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigicmlnaHQ6ICIgKyBmMi5wcm90b3R5cGUpOworLy8gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigicmlnaHQ6ICIgKyBmMi5zdGF0dXMpOworLy8gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihmMS5wcm90b3R5cGUuZXF1YWxzKGYyLnByb3RvdHlwZSkpOworLy8gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihmMS5wcm90b3R5cGUuZ2V0Qnl0ZXMoKVswXSk7CisvLyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKGYyLnByb3RvdHlwZS5nZXRCeXRlcygpWzBdKTsKKy8vICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZjEuZXF1YWxzKGYyKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBzaG91bGQgYWRkIGxlZnQgaXRlbSB0byBjb21tb24gc2V0CisgICAgICAgICAgICAgICAgICAgIC8vIHNpbmNlIHdlIHdpbGwgcmVtb3ZlIGNvbW1vbiBpdGVtcyB3aXRoIGxlZnQgc2V0IGxhdGVyCisgICAgICAgICAgICAgICAgICAgIGNvbW1vbi5hZGQoZjEpOworICAgICAgICAgICAgICAgICAgICBqb2luZWQuYWRkKEpvaW5lZEZ1bmN0aW9uLmZyb21Ud29GdW4oZjEsIGYyKSk7CisgICAgICAgICAgICAgICAgICAgIHJpZ2h0LnJlbW92ZShmMik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0gCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKEl0ZXJhdG9yPEZ1bmN0aW9uPiBpdGVyID0gY29tbW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgRnVuY3Rpb24gZiA9IGl0ZXIubmV4dCgpOworICAgICAgICAgICAgbGVmdC5yZW1vdmUoZik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGZvciAoSXRlcmF0b3I8RnVuY3Rpb24+IGl0ZXIgPSBsZWZ0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgRnVuY3Rpb24gZiA9IGl0ZXIubmV4dCgpOworICAgICAgICAgICAgam9pbmVkLmFkZChKb2luZWRGdW5jdGlvbi5mcm9tTGVmdEZ1bihmKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGZvciAoSXRlcmF0b3I8RnVuY3Rpb24+IGl0ZXIgPSByaWdodC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIEZ1bmN0aW9uIGYgPSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIGpvaW5lZC5hZGQoSm9pbmVkRnVuY3Rpb24uZnJvbVJpZ2h0RnVuKGYpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gam9pbmVkOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGR1bXBOb2RlKE5vZGUgbikgeworICAgIAlkdW1wTm9kZShuLCIiKTsKKyAgICB9CisgICAgLyoqCisgICAgICogRHVtcCBvdXQgYSBub2RlIGZvciBkZWJ1Z2dpbmcuIFJlY3Vyc2l2ZSBmY24KKyAgICAgKiBAcGFyYW0gbgorICAgICAqIEBwYXJhbSBwcmUKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGR1bXBOb2RlKE5vZGUgbiwgU3RyaW5nIHByZSkgeworICAgIAlTdHJpbmcgb3ByZSA9IHByZTsKKwkJcHJlICs9ICIgIjsKKwkJU3lzdGVtLm91dC5wcmludChvcHJlICsgIjwiICsgbi5nZXROb2RlTmFtZSgpICk7CisJCS8vIGR1bXAgYXR0cmlidXRlCisJCU5hbWVkTm9kZU1hcCBhdHRyID0gbi5nZXRBdHRyaWJ1dGVzKCk7CisJCWlmIChhdHRyICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0ci5nZXRMZW5ndGgoKTsgaSsrKSB7CisJCQkJU3lzdGVtLm91dC5wcmludCgiXG4iK3ByZSsiICAgIithdHRyLml0ZW0oaSkuZ2V0Tm9kZU5hbWUoKSsiPVwiIiArIGF0dHIuaXRlbShpKS5nZXROb2RlVmFsdWUoKSsiXCIiKTsKKwkJCX0KKwkJfQorCQlTeXN0ZW0ub3V0LnByaW50bG4oIj4iKTsKKworCQkvLyBkdW1wIHZhbHVlCisJCVN0cmluZyB2ID0gcHJlICsgbi5nZXROb2RlVmFsdWUoKTsKKwkJaWYgKG4uZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkKKwkJCVN5c3RlbS5vdXQucHJpbnRsbih2KTsKKworCQkvLyBkdW1wIHN1YiBub2RlcworCQlOb2RlTGlzdCBuTGlzdCA9IG4uZ2V0Q2hpbGROb2RlcygpOworCQlmb3IgKGludCBpID0gMDsgaSA8IG5MaXN0LmdldExlbmd0aCgpOyBpKyspIHsKKwkJCU5vZGUgbG4gPSBuTGlzdC5pdGVtKGkpOworCQkJZHVtcE5vZGUobG4sIHByZSArICIgIik7CisJCX0KKwkJU3lzdGVtLm91dC5wcmludGxuKG9wcmUgKyAiPC8iICsgbi5nZXROb2RlTmFtZSgpICsgIj4iKTsKKwl9CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgRG9jdW1lbnRCdWlsZGVyIHRoZUJ1aWxkZXIgPSBudWxsOworICAgIHByaXZhdGUgc3RhdGljIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZGJmICA9IG51bGw7CisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgc3RhdGljIERvY3VtZW50QnVpbGRlciBnZXREb2N1bWVudEJ1aWxkZXIoKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7CisgICAgCWlmKHRoZUJ1aWxkZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgZGJmID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgdGhlQnVpbGRlciA9IGRiZi5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKKyAgICAJfQorICAgIAlyZXR1cm4gdGhlQnVpbGRlcjsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgRG9jdW1lbnQgZ2V0RG9jdW1lbnQoRmlsZSBmaWxlKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbnsKKyAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7CisgICAgICAgIElucHV0U291cmNlIGlucHV0U291cmNlID0gbmV3IElucHV0U291cmNlKGZpcyk7CisgICAgICAgIERvY3VtZW50IGRvYyA9IGdldERvY3VtZW50QnVpbGRlcigpLnBhcnNlKGlucHV0U291cmNlKTsKKyAgICAgICAgcmV0dXJuIGRvYzsKKyAgICB9CisgICAgc3RhdGljIGJvb2xlYW4gdHJpZWQgPSBmYWxzZTsKKyAgICBzdGF0aWMgRm9ybWF0dGVyIGFGb3JtYXR0ZXIgPSBudWxsOworICAgIAorICAgIHB1YmxpYyBpbnRlcmZhY2UgRm9ybWF0dGVyIHsKKyAgICAJcHVibGljIFN0cmluZyBmb3JtYXRDb2RlKFN0cmluZyBzKTsKKyAgICB9CisgICAgCisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmb3JtYXRfa2V5d29yZHNbXSA9IHsKKyAgICAJImVudW0iLCIjZGVmaW5lIiwic3RhdGljIgorICAgIH07CisgICAgCisgICAgLyoqCisgICAgICogQXR0ZW1wdCB0byB1c2UgYSBwcmV0dHkgZm9ybWF0dGVyCisgICAgICogQHBhcmFtIHByb3RvdHlwZTIKKyAgICAgKiBAcmV0dXJuCisgICAgICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybWF0Q29kZShTdHJpbmcgcHJvdG90eXBlMikgeworCQlpZighdHJpZWQpIHsKKwkJCVN0cmluZyB0aGVGb3JtYXR0ZXIgPSBTdGFibGVBUEkuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSsiLkNvZGVGb3JtYXR0ZXIiOworCQkJdHJ5IHsKKwkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwkJCQlDbGFzczxGb3JtYXR0ZXI+IGZvcm1hdENsYXNzID0gKENsYXNzPEZvcm1hdHRlcj4pIENsYXNzLmZvck5hbWUodGhlRm9ybWF0dGVyKTsKKwkJCQlhRm9ybWF0dGVyID0gKEZvcm1hdHRlcikgZm9ybWF0Q2xhc3MubmV3SW5zdGFuY2UoKTsKKwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJU3lzdGVtLmVyci5wcmludGxuKCJOb3RlOiBDb3VsZG4ndCBsb2FkICIgKyB0aGVGb3JtYXR0ZXIpOworCQkJCWFGb3JtYXR0ZXIgPSBuZXcgRm9ybWF0dGVyKCkgeworCisJCQkJCXB1YmxpYyBTdHJpbmcgZm9ybWF0Q29kZShTdHJpbmcgcykgeworCQkJCQkJU3RyaW5nIHN0ciA9IEhUTUxTYWZlKHMudHJpbSgpKTsKKwkJCQkJCWZvcihTdHJpbmcga2V5d29yZCA6IGZvcm1hdF9rZXl3b3JkcykgeworCQkJCQkJCWlmKHN0ci5zdGFydHNXaXRoKGtleXdvcmQpKSB7CisJCQkJCQkJCXN0ciA9IHN0ci5yZXBsYWNlRmlyc3Qoa2V5d29yZCwgIjx0dD4iK2tleXdvcmQrIjwvdHQ+Iik7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJcmV0dXJuIHN0cjsKKwkJCQkJfQorCQkJCQkKKwkJCQl9OworCQkJfQorCQkJdHJpZWQgPSB0cnVlOworCQl9CisJCWlmKGFGb3JtYXR0ZXIgIT0gbnVsbCkgeworCQkJcmV0dXJuIGFGb3JtYXR0ZXIuZm9ybWF0Q29kZShwcm90b3R5cGUyKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBIVE1MU2FmZShwcm90b3R5cGUyKTsKKwkJfQorCX0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxTYWZlKFN0cmluZyBzKSB7CisgICAgICAgIGlmKHM9PW51bGwpIHJldHVybiBudWxsOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIAorICAgICAgICAgICAgcy5yZXBsYWNlQWxsKCImIiwiJmFtcDsiKQorICAgICAgICAgICAgIC5yZXBsYWNlQWxsKCI8IiwiJmx0OyIpCisgICAgICAgICAgICAgLnJlcGxhY2VBbGwoIj4iLCImZ3Q7IikKKyAgICAgICAgICAgICAucmVwbGFjZUFsbCgiXCIiLCImcXVvdDsiKTsKKyAgICB9CisgICAgCisJCit9CmRpZmYgLS1naXQgYS9yZWxlYXNlL2phdmEvc3JjL2NvbS9pYm0vaWN1L2Rldi90b29scy9kb2NzL2R1bXBBbGxDRnVuYy54c2x0IGIvcmVsZWFzZS9qYXZhL3NyYy9jb20vaWJtL2ljdS9kZXYvdG9vbHMvZG9jcy9kdW1wQWxsQ0Z1bmMueHNsdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTg3OWMzCi0tLSAvZGV2L251bGwKKysrIGIvcmVsZWFzZS9qYXZhL3NyYy9jb20vaWJtL2ljdS9kZXYvdG9vbHMvZG9jcy9kdW1wQWxsQ0Z1bmMueHNsdApAQCAtMCwwICsxLDEwNyBAQAorPCEtLQorLyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQ29weXJpZ2h0IChDKSAyMDA5LTIwMTEsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kICAgICoKKyogb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogVGhpcyBpcyBhbiBYU0xUIGJ1aWxkIGZpbGUgZm9yIElDVSB0b29scy4gCisqLworLS0+Cis8IS0tCisgIExpc3QgYWxsIEMgZnVuY3Rpb25zIGdlbmVyYXRlZCBmcm9tIHRoZSAnaW5kZXgueG1sJworLS0+Cis8eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSI+CisgIDx4c2w6cGFyYW0gbmFtZT0iZG9jRm9sZGVyIiAvPgorCisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iPgorICA8bGlzdD4KKyAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iZmlsZXNfbm9kZSIgc2VsZWN0PSIvZG94eWdlbmluZGV4L2NvbXBvdW5kW0BraW5kPSdmaWxlJ10vQHJlZmlkIiAvPgorICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRmaWxlc19ub2RlIj4KKyAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJmaWxlIiBzZWxlY3Q9ImNvbmNhdCgkZG9jRm9sZGVyLCAnLycsIC4gLCAnLnhtbCcpIiAvPgorICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImZ1bmNzX25vZGUiIHNlbGVjdD0iZG9jdW1lbnQoJGZpbGUpL2RveHlnZW4vY29tcG91bmRkZWYvc2VjdGlvbmRlZi9tZW1iZXJkZWZbQHByb3Q9J3B1YmxpYyddW0BraW5kPSdmdW5jdGlvbiddIiAvPgorICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGZ1bmNzX25vZGUiPgorICAgICAgICAgIDxjcHBmdW5jPgorICAgICAgICAgICAgIDx4c2w6Y29weS1vZiBzZWxlY3Q9IkBpZCIgLz4KKyAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJzdGF0dXMiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJkZXRhaWxlZGRlc2NyaXB0aW9uL3BhcmEveHJlZnNlY3QveHJlZnRpdGxlL3RleHQoKSIvPjwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iZGV0YWlsZWRkZXNjcmlwdGlvbi9wYXJhL3hyZWZzZWN0L3hyZWZkZXNjcmlwdGlvbi9wYXJhL3RleHQoKSIvPjwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJwcm90b3R5cGUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb25jYXQoZGVmaW5pdGlvbi90ZXh0KCksIGFyZ3NzdHJpbmcvdGV4dCgpKSIgLz48L3hzbDphdHRyaWJ1dGU+CisgICAgICAgICAgICAgPHhzbDpjb3B5LW9mIHNlbGVjdD0ibG9jYXRpb24vQGZpbGUiIC8+CisgICAgICAgICAgPC9jcHBmdW5jPgorICAgICAgICA8L3hzbDpmb3ItZWFjaD4KKyAgICAgICAgCisgICAgICAgIDwhLS0gIG5vdyBnZXQgI2RlZmluZXMgIC0tPgorICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImRlZnNfbm9kZSIgc2VsZWN0PSJkb2N1bWVudCgkZmlsZSkvZG94eWdlbi9jb21wb3VuZGRlZi9zZWN0aW9uZGVmL21lbWJlcmRlZltAcHJvdD0ncHVibGljJ11bQGtpbmQ9J2RlZmluZSddIiAvPgorICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGRlZnNfbm9kZSI+CisgICAgICAgICAgPGNwcGZ1bmM+CisgICAgICAgICAgICAgPHhzbDpjb3B5LW9mIHNlbGVjdD0iQGlkIiAvPgorICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InN0YXR1cyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImRldGFpbGVkZGVzY3JpcHRpb24vcGFyYS94cmVmc2VjdC94cmVmdGl0bGUvdGV4dCgpIi8+PC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJkZXRhaWxlZGRlc2NyaXB0aW9uL3BhcmEveHJlZnNlY3QveHJlZmRlc2NyaXB0aW9uL3BhcmEvdGV4dCgpIi8+PC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InByb3RvdHlwZSI+I2RlZmluZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ibmFtZS90ZXh0KCkiIC8+PC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgIDx4c2w6Y29weS1vZiBzZWxlY3Q9ImxvY2F0aW9uL0BmaWxlIiAvPgorICAgICAgICAgIDwvY3BwZnVuYz4KK8KgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KKworCQk8IS0tICBub3cgZW51bXMgLS0+CisJCTx4c2w6dmFyaWFibGUgbmFtZT0iZW51bV9ub2RlIgorCQkJc2VsZWN0PSJkb2N1bWVudCgkZmlsZSkvZG94eWdlbi9jb21wb3VuZGRlZi9zZWN0aW9uZGVmL21lbWJlcmRlZltAa2luZD0nZW51bSddW0Bwcm90PSdwdWJsaWMnXSIgLz4KKwkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRlbnVtX25vZGUiPgorCisJCQk8IS0tICB1c2UgYSBuYW1lLCBlbHNlICcoYW5vbnltb3VzKScgLS0+CisJCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVudW1fbm9kZV9uYW1lIj4KKwkJCQk8eHNsOmNob29zZT4JCQkJCQorCQkJCQk8eHNsOndoZW4gdGVzdD0iY29udGFpbnMobmFtZS90ZXh0KCksICdAJykiPgorCQkJCQkJKGFub255bW91cyk8L3hzbDp3aGVuPgorCQkJCQk8eHNsOm90aGVyd2lzZT4KKwkJCQkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJuYW1lL3RleHQoKSIgLz48L3hzbDpvdGhlcndpc2U+PC94c2w6Y2hvb3NlPgorCQkJPC94c2w6dmFyaWFibGU+CisJCQorCQkJPCEtLSAgZW51bSBvYmplY3QgIC0tPgorCQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbnVtX3N0YXR1cyIgc2VsZWN0PSJkZXRhaWxlZGRlc2NyaXB0aW9uL3BhcmEveHJlZnNlY3QveHJlZnRpdGxlL3RleHQoKSIvPgorCQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbnVtX3ZlcnNpb24iIHNlbGVjdD0iZGV0YWlsZWRkZXNjcmlwdGlvbi9wYXJhL3hyZWZzZWN0L3hyZWZkZXNjcmlwdGlvbi9wYXJhL3RleHQoKSIvPgorCQkJCisJCQkgPCEtLSAgbm8gYW5vbnltb3VzIGZpbGUgbGV2ZWwgZW51bXMgLS0+PCEtLQorCQkJPHhzbDppZiB0ZXN0PSJub3QoY29udGFpbnMobmFtZS90ZXh0KCksICdAJykpIj4KKwkJCQk8Y3BwZnVuYz4gCisJCQkJCTx4c2w6Y29weS1vZiBzZWxlY3Q9IkBpZCIgLz4KKwkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ic3RhdHVzIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVudW1fc3RhdHVzIiAvPjwveHNsOmF0dHJpYnV0ZT4KKwkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbnVtX3N0YXR1cyIgLz48L3hzbDphdHRyaWJ1dGU+CisJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InByb3RvdHlwZSI+ZW51bSA8eHNsOnZhbHVlLW9mCisJCQkJCQlzZWxlY3Q9IiRlbnVtX25vZGVfbmFtZSIgLz4ge308L3hzbDphdHRyaWJ1dGU+CisJCQkJCTx4c2w6Y29weS1vZiBzZWxlY3Q9ImxvY2F0aW9uL0BmaWxlIiAvPgorCQkJCTwvY3BwZnVuYz4KKwkJCTwveHNsOmlmPgorCQkJCisJCQktLT48eHNsOnZhcmlhYmxlIG5hbWU9ImVudW1fbm9kZV9maWxlIiBzZWxlY3Q9ImxvY2F0aW9uL0BmaWxlIiAvPgorCQkJCisKKwkJCTx4c2w6dmFyaWFibGUgbmFtZT0iZW51bV9tZW1iZXIiIHNlbGVjdD0iZW51bXZhbHVlW0Bwcm90PSdwdWJsaWMnXSIvPgorCQkJCisJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGVudW1fbWVtYmVyIj4KKwkJCQk8Y3BwZnVuYz4KKwkJCQkJPHhzbDpjb3B5LW9mIHNlbGVjdD0iQGlkIiAvPgorCQkJCQk8IS0tICBzdGF0dXMgYW5kIHZlcnNpb246IG9ubHkgb3ZlcnJpZGUgaWYgc2V0LiAtLT4KKwkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ic3RhdHVzIj48eHNsOmNob29zZT4KKwkJCQkJCQk8eHNsOndoZW4gdGVzdD0iZGV0YWlsZWRkZXNjcmlwdGlvbi9wYXJhL3hyZWZzZWN0L3hyZWZ0aXRsZS90ZXh0KCkgIT0gJyciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJkZXRhaWxlZGRlc2NyaXB0aW9uL3BhcmEveHJlZnNlY3QveHJlZnRpdGxlL3RleHQoKSIvPjwveHNsOndoZW4+CisJCQkJCQkJPHhzbDpvdGhlcndpc2U+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbnVtX3N0YXR1cyIgLz48L3hzbDpvdGhlcndpc2U+CisJCQkJCQk8L3hzbDpjaG9vc2U+PC94c2w6YXR0cmlidXRlPgorCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIj48eHNsOmNob29zZT4KKwkJCQkJCQk8eHNsOndoZW4gdGVzdD0iZGV0YWlsZWRkZXNjcmlwdGlvbi9wYXJhL3hyZWZzZWN0L3hyZWZkZXNjcmlwdGlvbi9wYXJhL3RleHQoKSAhPSAnJyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImRldGFpbGVkZGVzY3JpcHRpb24vcGFyYS94cmVmc2VjdC94cmVmZGVzY3JpcHRpb24vcGFyYS90ZXh0KCkiLz48L3hzbDp3aGVuPgorCQkJCQkJCTx4c2w6b3RoZXJ3aXNlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZW51bV92ZXJzaW9uIiAvPjwveHNsOm90aGVyd2lzZT4KKwkJCQkJCTwveHNsOmNob29zZT48L3hzbDphdHRyaWJ1dGU+CisJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InByb3RvdHlwZSI+ZW51bSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVudW1fbm9kZV9uYW1lIi8+Ojo8eHNsOnZhbHVlLW9mCisJCQkJCQlzZWxlY3Q9Im5hbWUvdGV4dCgpIiAvPjwveHNsOmF0dHJpYnV0ZT4KKwkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0iZmlsZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbnVtX25vZGVfZmlsZSIgLz48L3hzbDphdHRyaWJ1dGU+CisJCQkJPC9jcHBmdW5jPgorCQkJCisJCQk8L3hzbDpmb3ItZWFjaD4gPCEtLSAgZG9uZSB3aXRoIGVudW0gbWVtYmVyIC0tPgorCQkJCisKKwkJPC94c2w6Zm9yLWVhY2g+IDwhLS0gIGRvbmUgd2l0aCBlbnVtIC0tPgorCisKKyAgICAgIDwveHNsOmZvci1lYWNoPgorICA8L2xpc3Q+CisgIDwveHNsOnRlbXBsYXRlPgorPC94c2w6c3R5bGVzaGVldD4KKworCmRpZmYgLS1naXQgYS9yZWxlYXNlL2phdmEvc3JjL2NvbS9pYm0vaWN1L2Rldi90b29scy9kb2NzL2R1bXBBbGxDRnVuY194bWwueHNsdCBiL3JlbGVhc2UvamF2YS9zcmMvY29tL2libS9pY3UvZGV2L3Rvb2xzL2RvY3MvZHVtcEFsbENGdW5jX3htbC54c2x0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0OTBlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9yZWxlYXNlL2phdmEvc3JjL2NvbS9pYm0vaWN1L2Rldi90b29scy9kb2NzL2R1bXBBbGxDRnVuY194bWwueHNsdApAQCAtMCwwICsxLDM2IEBACis8IS0tCisvKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgICAgKgorKiBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBUaGlzIGlzIGFuIFhTTFQgYnVpbGQgZmlsZSBmb3IgSUNVIHRvb2xzLiAKKyovCistLT4KKzwhLS0KKyAgTGlzdCBhbGwgQyBmdW5jdGlvbnMgZ2VuZXJhdGVkIGZyb20gdGhlICdpbmRleC54bWwnCistLT4KKzx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIj4KKyAgPHhzbDpwYXJhbSBuYW1lPSJkb2NGb2xkZXIiIC8+CisKKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+CisgIDxsaXN0PgorICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJmaWxlc19ub2RlIiBzZWxlY3Q9Ii9kb3h5Z2VuaW5kZXgvY29tcG91bmRbQGtpbmQ9J2ZpbGUnXS9AcmVmaWQiIC8+CisgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGZpbGVzX25vZGUiPgorICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImZpbGUiIHNlbGVjdD0iY29uY2F0KCRkb2NGb2xkZXIsICcvJywgLiAsICcueG1sJykiIC8+CisgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iZnVuY3Nfbm9kZSIgc2VsZWN0PSJkb2N1bWVudCgkZmlsZSkvZG94eWdlbi9jb21wb3VuZGRlZi9zZWN0aW9uZGVmL21lbWJlcmRlZltAcHJvdD0ncHVibGljJ11bQGtpbmQ9J2Z1bmN0aW9uJ10iIC8+CisgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkZnVuY3Nfbm9kZSI+CisgICAgICAgICAgPGNwcGZ1bmM+CisgICAgICAgICAgICAgPHhzbDpjb3B5LW9mIHNlbGVjdD0iQGlkIiAvPgorICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InN0YXR1cyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImRldGFpbGVkZGVzY3JpcHRpb24vcGFyYS94cmVmc2VjdC94cmVmdGl0bGUvdGV4dCgpIi8+PC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJkZXRhaWxlZGRlc2NyaXB0aW9uL3BhcmEveHJlZnNlY3QveHJlZmRlc2NyaXB0aW9uL3BhcmEvdGV4dCgpIi8+PC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InByb3RvdHlwZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvbmNhdChkZWZpbml0aW9uL3RleHQoKSwgYXJnc3N0cmluZy90ZXh0KCkpIiAvPjwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgICA8eHNsOmNvcHktb2Ygc2VsZWN0PSJsb2NhdGlvbi9AZmlsZSIgLz4KKyAgICAgICAgICA8L2NwcGZ1bmM+CisgICAgICAgIDwveHNsOmZvci1lYWNoPgorICAgICAgPC94c2w6Zm9yLWVhY2g+CisgIDwvbGlzdD4KKyAgPC94c2w6dGVtcGxhdGU+Cis8L3hzbDpzdHlsZXNoZWV0PgorCisKZGlmZiAtLWdpdCBhL3JlbGVhc2UvamF2YS9zcmMvY29tL2libS9pY3UvZGV2L3Rvb2xzL2RvY3MvZHVtcEFsbENwcEZ1bmMueHNsdCBiL3JlbGVhc2UvamF2YS9zcmMvY29tL2libS9pY3UvZGV2L3Rvb2xzL2RvY3MvZHVtcEFsbENwcEZ1bmMueHNsdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTk5MjljCi0tLSAvZGV2L251bGwKKysrIGIvcmVsZWFzZS9qYXZhL3NyYy9jb20vaWJtL2ljdS9kZXYvdG9vbHMvZG9jcy9kdW1wQWxsQ3BwRnVuYy54c2x0CkBAIC0wLDAgKzEsMTQ1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAtLT4KKzwhLS0gTGlzdCBhbGwgY3BwIHB1YmxpYyBmdW5jdGlvbnMgZ2VuZXJhdGVkIGZyb20gdGhlICdpbmRleC54bWwnIC0tPgorPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIKKwl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSI+CisJPHhzbDpwYXJhbSBuYW1lPSJkb2NGb2xkZXIiIC8+CisKKwk8eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KKwkJPGxpc3Q+CisJCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImZpbGVzX25vZGUiCisJCQkJc2VsZWN0PSIvZG94eWdlbmluZGV4L2NvbXBvdW5kW0BraW5kPSdjbGFzcyddL0ByZWZpZCIgLz4KKwkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkZmlsZXNfbm9kZSI+CisJCQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJmaWxlIgorCQkJCQlzZWxlY3Q9ImNvbmNhdCgkZG9jRm9sZGVyLCAnLycsIC4gLCAnLnhtbCcpIiAvPgorCQkJCTx4c2w6dmFyaWFibGUgbmFtZT0iZnVuY3Nfbm9kZSIKKwkJCQkJc2VsZWN0PSJkb2N1bWVudCgkZmlsZSkvZG94eWdlbi9jb21wb3VuZGRlZltAcHJvdD0ncHVibGljJ10vc2VjdGlvbmRlZi9tZW1iZXJkZWZbQHByb3Q9J3B1YmxpYyddW0BraW5kPSdmdW5jdGlvbiddIiAvPgorCQkJCTx4c2w6dmFyaWFibGUgbmFtZT0iY29tcG91bmRuYW1lIgorCQkJCQlzZWxlY3Q9ImRvY3VtZW50KCRmaWxlKS9kb3h5Z2VuL2NvbXBvdW5kZGVmW0Bwcm90PSdwdWJsaWMnXS9jb21wb3VuZG5hbWUvdGV4dCgpIiAvPgorCQkJCTx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkZnVuY3Nfbm9kZSI+CisJCQkJCTxjcHBmdW5jPgorCQkJCQkJPHhzbDpjb3B5LW9mIHNlbGVjdD0iQGlkIiAvPgorCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ic3RhdHVzIj48eHNsOnZhbHVlLW9mCisJCQkJCQkJc2VsZWN0PSJkZXRhaWxlZGRlc2NyaXB0aW9uL3BhcmEveHJlZnNlY3QveHJlZnRpdGxlL3RleHQoKSIgLz48L3hzbDphdHRyaWJ1dGU+CisJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIj48eHNsOnZhbHVlLW9mCisJCQkJCQkJc2VsZWN0PSJkZXRhaWxlZGRlc2NyaXB0aW9uL3BhcmEveHJlZnNlY3QveHJlZmRlc2NyaXB0aW9uL3BhcmEvdGV4dCgpIiAvPjwveHNsOmF0dHJpYnV0ZT4KKwkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InByb3RvdHlwZSI+PHhzbDp2YWx1ZS1vZgorCQkJCQkJCXNlbGVjdD0iY29uY2F0KGRlZmluaXRpb24vdGV4dCgpLCBhcmdzc3RyaW5nL3RleHQoKSkiIC8+PC94c2w6YXR0cmlidXRlPgorCQkJCQkJPHhzbDpjb3B5LW9mIHNlbGVjdD0ibG9jYXRpb24vQGZpbGUiIC8+CisJCQkJCQk8eHNsOmNvcHktb2Ygc2VsZWN0PSJAc3RhdGljIiAvPgorCQkJCQkJPHhzbDpjb3B5LW9mIHNlbGVjdD0iQGlubGluZSIgLz4KKwkJCQkJPC9jcHBmdW5jPgorCQkJCTwveHNsOmZvci1lYWNoPgorCQkJCQorCQkJCTwhLS0gIG5vdyBjb25zdCBzdGF0aWMgcHVibGljcyAtLT4KKwkJCQk8eHNsOnZhcmlhYmxlIG5hbWU9InNjb25zdF9ub2RlIgorCQkJCQlzZWxlY3Q9ImRvY3VtZW50KCRmaWxlKS9kb3h5Z2VuL2NvbXBvdW5kZGVmW0Bwcm90PSdwdWJsaWMnXS9zZWN0aW9uZGVmL21lbWJlcmRlZltAcHJvdD0ncHVibGljJ11bQGtpbmQ9J3ZhcmlhYmxlJ11bQHN0YXRpYz0neWVzJ10iIC8+CisJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRzY29uc3Rfbm9kZSI+CisJCQkJCTxjcHBmdW5jPgorCQkJCQkJPHhzbDpjb3B5LW9mIHNlbGVjdD0iQGlkIiAvPgorCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0ic3RhdHVzIj48eHNsOnZhbHVlLW9mCisJCQkJCQkJc2VsZWN0PSJkZXRhaWxlZGRlc2NyaXB0aW9uL3BhcmEveHJlZnNlY3QveHJlZnRpdGxlL3RleHQoKSIgLz48L3hzbDphdHRyaWJ1dGU+CisJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIj48eHNsOnZhbHVlLW9mCisJCQkJCQkJc2VsZWN0PSJkZXRhaWxlZGRlc2NyaXB0aW9uL3BhcmEveHJlZnNlY3QveHJlZmRlc2NyaXB0aW9uL3BhcmEvdGV4dCgpIiAvPjwveHNsOmF0dHJpYnV0ZT4KKwkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InByb3RvdHlwZSI+c3RhdGljIDx4c2w6dmFsdWUtb2YKKwkJCQkJCQlzZWxlY3Q9ImRlZmluaXRpb24vdGV4dCgpIiAvPjwveHNsOmF0dHJpYnV0ZT4KKwkJCQkJCTx4c2w6Y29weS1vZiBzZWxlY3Q9ImxvY2F0aW9uL0BmaWxlIiAvPgorCQkJCQkJPHhzbDpjb3B5LW9mIHNlbGVjdD0iQHN0YXRpYyIgLz4KKwkJCQkJCTx4c2w6Y29weS1vZiBzZWxlY3Q9IkBpbmxpbmUiIC8+CisJCQkJCTwvY3BwZnVuYz4KKwkJCQk8L3hzbDpmb3ItZWFjaD4KKworCQk8IS0tIAorCQkJCS8vTm8gcmVhbCBub24tc3RhdGljIHZhcmlhYmxlcyAtIGFuZCBhbHNvLCBkb3h5Z2VuIGlzIGNvbmZ1c2VkIGFib3V0IG5lc3RlZCBzdHJ1Y3RzL3VuaW9ucworCQkJCQorCQkJCTx4c2w6dmFyaWFibGUgbmFtZT0iY29uc3Rfbm9kZSIKKwkJCQkJc2VsZWN0PSJkb2N1bWVudCgkZmlsZSkvZG94eWdlbi9jb21wb3VuZGRlZltAcHJvdD0ncHVibGljJ10vc2VjdGlvbmRlZi9tZW1iZXJkZWZbQHByb3Q9J3B1YmxpYyddW0BraW5kPSd2YXJpYWJsZSddW0BzdGF0aWM9J25vJ10iIC8+CisJCQkJPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRjb25zdF9ub2RlIj4KKwkJCQkJPGNwcGZ1bmM+CisJCQkJCQk8eHNsOmNvcHktb2Ygc2VsZWN0PSJAaWQiIC8+CisJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJzdGF0dXMiPjx4c2w6dmFsdWUtb2YKKwkJCQkJCQlzZWxlY3Q9ImRldGFpbGVkZGVzY3JpcHRpb24vcGFyYS94cmVmc2VjdC94cmVmdGl0bGUvdGV4dCgpIiAvPjwveHNsOmF0dHJpYnV0ZT4KKwkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iPjx4c2w6dmFsdWUtb2YKKwkJCQkJCQlzZWxlY3Q9ImRldGFpbGVkZGVzY3JpcHRpb24vcGFyYS94cmVmc2VjdC94cmVmZGVzY3JpcHRpb24vcGFyYS90ZXh0KCkiIC8+PC94c2w6YXR0cmlidXRlPgorCQkJCQkJPHhzbDphdHRyaWJ1dGUgbmFtZT0icHJvdG90eXBlIj4vKiBub3Qgc3RhdGljICovIDx4c2w6dmFsdWUtb2YKKwkJCQkJCQlzZWxlY3Q9ImRlZmluaXRpb24vdGV4dCgpIiAvPjwveHNsOmF0dHJpYnV0ZT4KKwkJCQkJCTx4c2w6Y29weS1vZiBzZWxlY3Q9ImxvY2F0aW9uL0BmaWxlIiAvPgorCQkJCQkJPHhzbDpjb3B5LW9mIHNlbGVjdD0iQHN0YXRpYyIgLz4KKwkJCQkJCTx4c2w6Y29weS1vZiBzZWxlY3Q9IkBpbmxpbmUiIC8+CisJCQkJCTwvY3BwZnVuYz4KKwkJCQk8L3hzbDpmb3ItZWFjaD4KKwkJLS0+CisJCQkJPCEtLSAgbm93IGVudW1zIC0tPgorCQkJCTx4c2w6dmFyaWFibGUgbmFtZT0iZW51bV9ub2RlIgorCQkJCQlzZWxlY3Q9ImRvY3VtZW50KCRmaWxlKS9kb3h5Z2VuL2NvbXBvdW5kZGVmW0Bwcm90PSdwdWJsaWMnXS9zZWN0aW9uZGVmL21lbWJlcmRlZltAa2luZD0nZW51bSddW0Bwcm90PSdwdWJsaWMnXSIgLz4KKwkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGVudW1fbm9kZSI+CisKKwkJCQkJPCEtLSAgdXNlIGEgbmFtZSwgZWxzZSAnKGFub255bW91cyknIC0tPgorCQkJCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVudW1fbm9kZV9uYW1lIj48eHNsOmNob29zZT4JCQkJCQorCQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSJjb250YWlucyhuYW1lL3RleHQoKSwgJ0AnKSI+KGFub255bW91cyk8L3hzbDp3aGVuPgorCQkJCQkJCTx4c2w6b3RoZXJ3aXNlPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJuYW1lL3RleHQoKSIgLz48L3hzbDpvdGhlcndpc2U+CisJCQkJCQk8L3hzbDpjaG9vc2U+PC94c2w6dmFyaWFibGU+CisKKwkJCQkJPHhzbDp2YXJpYWJsZSBuYW1lPSJlbnVtX3N0YXR1cyIgc2VsZWN0PSJkZXRhaWxlZGRlc2NyaXB0aW9uL3BhcmEveHJlZnNlY3QveHJlZnRpdGxlL3RleHQoKSIvPgorCQkJCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVudW1fdmVyc2lvbiIgc2VsZWN0PSJkZXRhaWxlZGRlc2NyaXB0aW9uL3BhcmEveHJlZnNlY3QveHJlZmRlc2NyaXB0aW9uL3BhcmEvdGV4dCgpIi8+CisKKwkJCQkJPGNwcGZ1bmM+CisJCQkJCQk8eHNsOmNvcHktb2Ygc2VsZWN0PSJAaWQiIC8+CisJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJzdGF0dXMiPjx4c2w6dmFsdWUtb2YKKwkJCQkJCQlzZWxlY3Q9IiRlbnVtX3N0YXR1cyIgLz48L3hzbDphdHRyaWJ1dGU+CisJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIj48eHNsOnZhbHVlLW9mCisJCQkJCQkJc2VsZWN0PSIkZW51bV92ZXJzaW9uIiAvPjwveHNsOmF0dHJpYnV0ZT4KKwkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9InByb3RvdHlwZSI+ZW51bSAKKwkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNvbXBvdW5kbmFtZSIvPjo6PHhzbDp2YWx1ZS1vZgorCQkJCQkJCXNlbGVjdD0iJGVudW1fbm9kZV9uYW1lIiAvPiB7fTwveHNsOmF0dHJpYnV0ZT4KKwkJCQkJCTx4c2w6Y29weS1vZiBzZWxlY3Q9ImxvY2F0aW9uL0BmaWxlIiAvPgorCQkJCQk8L2NwcGZ1bmM+CisJCQorCQkJCQk8eHNsOnZhcmlhYmxlIG5hbWU9ImVudW1fbm9kZV9maWxlIiBzZWxlY3Q9ImxvY2F0aW9uL0BmaWxlIiAvPgorCQkKKwkJCisJCQkJCTx4c2w6dmFyaWFibGUgbmFtZT0iZW51bV9tZW1iZXIiIHNlbGVjdD0iZW51bXZhbHVlW0Bwcm90PSdwdWJsaWMnXSIvPgorCQkJCQkKKwkJCQkJPCEtLSAgZm9yIGVhY2ggbWVtYmVyIC0tPgorCQkJCQk8eHNsOmZvci1lYWNoIHNlbGVjdD0iJGVudW1fbWVtYmVyIj4KKwkJCQkJCTxjcHBmdW5jPgorCQkJCQkJCTx4c2w6Y29weS1vZiBzZWxlY3Q9IkBpZCIgLz4KKwkJCQkJCQk8IS0tICBzdGF0dXMgYW5kIHZlcnNpb246IG9ubHkgb3ZlcnJpZGUgaWYgc2V0LiAtLT4KKwkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJzdGF0dXMiPgorCQkJCQkJCQk8eHNsOmNob29zZT4KKwkJCQkJCQkJCTx4c2w6d2hlbiB0ZXN0PSJkZXRhaWxlZGRlc2NyaXB0aW9uL3BhcmEveHJlZnNlY3QveHJlZnRpdGxlL3RleHQoKSAhPSAnJyI+CisJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImRldGFpbGVkZGVzY3JpcHRpb24vcGFyYS94cmVmc2VjdC94cmVmdGl0bGUvdGV4dCgpIi8+CisJCQkJCQkJCQk8L3hzbDp3aGVuPgorCQkJCQkJCQkJPHhzbDpvdGhlcndpc2U+CisJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRlbnVtX3N0YXR1cyIgLz4KKwkJCQkJCQkJCTwveHNsOm90aGVyd2lzZT4KKwkJCQkJCQkJPC94c2w6Y2hvb3NlPgorCQkJCQkJCTwveHNsOmF0dHJpYnV0ZT4KKwkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIj4KKwkJCQkJCQkJPHhzbDpjaG9vc2U+CisJCQkJCQkJCQk8eHNsOndoZW4gdGVzdD0iZGV0YWlsZWRkZXNjcmlwdGlvbi9wYXJhL3hyZWZzZWN0L3hyZWZkZXNjcmlwdGlvbi9wYXJhL3RleHQoKSAhPSAnJyI+CisJCQkJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImRldGFpbGVkZGVzY3JpcHRpb24vcGFyYS94cmVmc2VjdC94cmVmZGVzY3JpcHRpb24vcGFyYS90ZXh0KCkiLz4KKwkJCQkJCQkJCTwveHNsOndoZW4+CisJCQkJCQkJCQk8eHNsOm90aGVyd2lzZT4KKwkJCQkJCQkJCQk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVudW1fdmVyc2lvbiIgLz4KKwkJCQkJCQkJCTwveHNsOm90aGVyd2lzZT4KKwkJCQkJCQkJPC94c2w6Y2hvb3NlPgorCQkJCQkJCTwveHNsOmF0dHJpYnV0ZT4KKwkJCQkJCQk8eHNsOmF0dHJpYnV0ZSBuYW1lPSJwcm90b3R5cGUiPmVudW0gCisJCQkJCQkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjb21wb3VuZG5hbWUiLz46Ojx4c2w6dmFsdWUtb2YKKwkJCQkJCQkJc2VsZWN0PSIkZW51bV9ub2RlX25hbWUiIC8+Ojo8eHNsOnZhbHVlLW9mCisJCQkJCQkJCXNlbGVjdD0ibmFtZS90ZXh0KCkiIC8+PC94c2w6YXR0cmlidXRlPgorCQkJCQkJCTx4c2w6YXR0cmlidXRlIG5hbWU9ImZpbGUiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZW51bV9ub2RlX2ZpbGUiIC8+PC94c2w6YXR0cmlidXRlPgorCQkJCQkJPC9jcHBmdW5jPgorCQkJCQkKKwkJCQkJPC94c2w6Zm9yLWVhY2g+IDwhLS0gIGRvbmUgd2l0aCBlbnVtIG1lbWJlciAtLT4KKwkJCQkJwqAKKwkJCQk8L3hzbDpmb3ItZWFjaD4gPCEtLSAgZG9uZSB3aXRoIGVudW1zIC0tPgorCisJCQk8L3hzbDpmb3ItZWFjaD4gPCEtLSAgZG9uZSB3aXRoIGZpbGUgLS0+CisKKwkJPC9saXN0PgorCTwveHNsOnRlbXBsYXRlPgorPC94c2w6c3R5bGVzaGVldD4KKworCmRpZmYgLS1naXQgYS9yZWxlYXNlL2phdmEvc3JjL2NvbS9pYm0vaWN1L2Rldi90b29scy9kb2NzL2R1bXBBbGxDcHBGdW5jX3htbC54c2x0IGIvcmVsZWFzZS9qYXZhL3NyYy9jb20vaWJtL2ljdS9kZXYvdG9vbHMvZG9jcy9kdW1wQWxsQ3BwRnVuY194bWwueHNsdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGMzZmYzCi0tLSAvZGV2L251bGwKKysrIGIvcmVsZWFzZS9qYXZhL3NyYy9jb20vaWJtL2ljdS9kZXYvdG9vbHMvZG9jcy9kdW1wQWxsQ3BwRnVuY194bWwueHNsdApAQCAtMCwwICsxLDM2IEBACis8IS0tCisvKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgICAgKgorKiBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBUaGlzIGlzIGFuIFhTTFQgZmlsZS4gCisqLworLS0+Cis8IS0tCisgIExpc3QgYWxsIGNwcCBwdWJsaWMgZnVuY3Rpb25zIGdlbmVyYXRlZCBmcm9tIHRoZSAnaW5kZXgueG1sJworLS0+Cis8eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSI+CisgIDx4c2w6cGFyYW0gbmFtZT0iZG9jRm9sZGVyIiAvPgorCisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iPgorICA8bGlzdD4KKyAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iZmlsZXNfbm9kZSIgc2VsZWN0PSIvZG94eWdlbmluZGV4L2NvbXBvdW5kW0BraW5kPSdjbGFzcyddL0ByZWZpZCIgLz4KKyAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkZmlsZXNfbm9kZSI+CisgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iZmlsZSIgc2VsZWN0PSJjb25jYXQoJGRvY0ZvbGRlciwgJy8nLCAuICwgJy54bWwnKSIgLz4KKyAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJmdW5jc19ub2RlIiBzZWxlY3Q9ImRvY3VtZW50KCRmaWxlKS9kb3h5Z2VuL2NvbXBvdW5kZGVmL3NlY3Rpb25kZWYvbWVtYmVyZGVmW0Bwcm90PSdwdWJsaWMnXVtAa2luZD0nZnVuY3Rpb24nXSIgLz4KKyAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9IiRmdW5jc19ub2RlIj4KKyAgICAgICAgICA8Y3BwZnVuYz4KKyAgICAgICAgICAgICA8eHNsOmNvcHktb2Ygc2VsZWN0PSJAaWQiIC8+CisgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ic3RhdHVzIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iZGV0YWlsZWRkZXNjcmlwdGlvbi9wYXJhL3hyZWZzZWN0L3hyZWZ0aXRsZS90ZXh0KCkiLz48L3hzbDphdHRyaWJ1dGU+CisgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImRldGFpbGVkZGVzY3JpcHRpb24vcGFyYS94cmVmc2VjdC94cmVmZGVzY3JpcHRpb24vcGFyYS90ZXh0KCkiLz48L3hzbDphdHRyaWJ1dGU+CisgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0icHJvdG90eXBlIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iY29uY2F0KGRlZmluaXRpb24vdGV4dCgpLCBhcmdzc3RyaW5nL3RleHQoKSkiIC8+PC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgIDx4c2w6Y29weS1vZiBzZWxlY3Q9ImxvY2F0aW9uL0BmaWxlIiAvPgorICAgICAgICAgIDwvY3BwZnVuYz4KKyAgICAgICAgPC94c2w6Zm9yLWVhY2g+CisgICAgICA8L3hzbDpmb3ItZWFjaD4KKyAgPC9saXN0PgorICA8L3hzbDp0ZW1wbGF0ZT4KKzwveHNsOnN0eWxlc2hlZXQ+CisKKwpkaWZmIC0tZ2l0IGEvcmVsZWFzZS9qYXZhL3NyYy9jb20vaWJtL2ljdS9kZXYvdG9vbHMvZG9jcy9nZW5SZXBvcnQueHNsdCBiL3JlbGVhc2UvamF2YS9zcmMvY29tL2libS9pY3UvZGV2L3Rvb2xzL2RvY3MvZ2VuUmVwb3J0LnhzbHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU4MDQ4YgotLS0gL2Rldi9udWxsCisrKyBiL3JlbGVhc2UvamF2YS9zcmMvY29tL2libS9pY3UvZGV2L3Rvb2xzL2RvY3MvZ2VuUmVwb3J0LnhzbHQKQEAgLTAsMCArMSwyNjIgQEAKKzwhLS0KKy8qCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIENvcHlyaWdodCAoQykgMjAwOC0yMDEwLCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCAgICAgICAgICoKKyogb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogVGhpcyBpcyB0aGUgWFNMVCBmb3IgdGhlIEFQSSBSZXBvcnQuIAorKi8KKy0tPgorPHhzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iPgorPCEtLQorICA8eHNsOnBhcmFtIG5hbWU9ImxlZnRTdGF0dXMiIC8+CisgIDx4c2w6cGFyYW0gbmFtZT0icmlnaHRTdGF0dXMiIC8+CistLT4KKyAgPHhzbDpwYXJhbSBuYW1lPSJsZWZ0VmVyIiAvPgorICA8eHNsOnBhcmFtIG5hbWU9InJpZ2h0VmVyIiAvPgorICA8eHNsOnBhcmFtIG5hbWU9ImRhdGVUaW1lIiAvPgorICA8eHNsOnBhcmFtIG5hbWU9InJpZ2h0TWlsZXN0b25lIiAvPgorICA8eHNsOnBhcmFtIG5hbWU9Im51bCIgLz4KKworICA8eHNsOnBhcmFtIG5hbWU9Im91clllYXIiIC8+CisKKzx4c2w6b3V0cHV0IG1ldGhvZD0iaHRtbCIgdmVyc2lvbj0iNC4wIiAgZG9jdHlwZS1wdWJsaWM9Ii0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAKK2RvY3R5cGUtc3lzdGVtPSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiCisJb21pdC14bWwtZGVjbGFyYXRpb249InllcyIJZW5jb2Rpbmc9InV0Zi04IiBpbmRlbnQ9InllcyIvPgorICAKKworICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KKyAgICA8aHRtbD4KKwk8eHNsOmNvbW1lbnQ+CisJIENvcHlyaWdodCAoQykgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3VyWWVhciIgLz4sIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAorCTwveHNsOmNvbW1lbnQ+CisgICAgPGhlYWQ+CisgICAgPHRpdGxlPklDVTRDIEFQSSBDb21wYXJpc29uOiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxlZnRWZXIiLz4gd2l0aCA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJpZ2h0VmVyIiAvPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmlnaHRNaWxlc3RvbmUiIC8+IDwvdGl0bGU+CisgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJpY3U0Yy5jc3MiIHR5cGU9InRleHQvY3NzIiAvPgorICAgIDwvaGVhZD4KKyAgICAKKyAgICA8Ym9keT4KKyAgICAKKyAgICA8YSBuYW1lPSIjX3RvcCI+PC9hPgorICAgIAorICAgIDxoMT5JQ1U0QyBBUEkgQ29tcGFyaXNvbjogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsZWZ0VmVyIi8+IHdpdGggPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyaWdodFZlciIgLz48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJpZ2h0TWlsZXN0b25lIiAvPiA8L2gxPgorICAgIAorICAgIDxkaXYgaWQ9InRvYyI+CisJICAgIDx1bD4KKwkgICAgCTxsaT48YSBocmVmPSIjcmVtb3ZlZCI+UmVtb3ZlZCBmcm9tIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbGVmdFZlciIvPjwvYT48L2xpPgorCSAgICAJPGxpPjxhIGhyZWY9IiNkZXByZWNhdGVkIj5EZXByZWNhdGVkIG9yIE9ic29sZXRlZCBpbiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJpZ2h0VmVyIiAvPjwvYT48L2xpPgorCSAgICAJPGxpPjxhIGhyZWY9IiNjaGFuZ2VkIj5DaGFuZ2VkIGluICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJpZ2h0VmVyIiAvPjwvYT48L2xpPgorCSAgICAJPGxpPjxhIGhyZWY9IiNwcm9tb3RlZCI+UHJvbW90ZWQgdG8gc3RhYmxlIGluIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmlnaHRWZXIiIC8+PC9hPjwvbGk+CisJICAgIAk8bGk+PGEgaHJlZj0iI2FkZGVkIj5BZGRlZCBpbiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJpZ2h0VmVyIiAvPjwvYT48L2xpPgorCSAgICAJPGxpPjxhIGhyZWY9IiNvdGhlciI+T3RoZXIgZXhpc3RpbmcgZHJhZnRzIGluIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmlnaHRWZXIiIC8+PC9hPjwvbGk+CisJICAgIDwvdWw+CisJICAgIDxociAvPgorCTwvZGl2PgorCQorCTxhIG5hbWU9InJlbW92ZWQiPjwvYT4KKwkgICAgPGgyPlJlbW92ZWQgZnJvbSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxlZnRWZXIiLz4gPC9oMj4KKyAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImdlblRhYmxlIj4KKyAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJub2RlcyIgc2VsZWN0PSIvbGlzdC9mdW5jW0ByaWdodFN0YXR1cz0kbnVsXSIvPgorICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgIDxQLz48YSBocmVmPSIjX3RvcCI+KGp1bXAgYmFjayB0byB0b3ApPC9hPjxoci8+CisKKwk8YSBuYW1lPSJkZXByZWNhdGVkIj48L2E+CisgICAgPGgyPkRlcHJlY2F0ZWQgb3IgT2Jzb2xldGVkIGluIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmlnaHRWZXIiIC8+PC9oMj4KKyAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImdlblRhYmxlIj4KKyAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJub2RlcyIgc2VsZWN0PSIvbGlzdC9mdW5jWyhAcmlnaHRTdGF0dXM9J0RlcHJlY2F0ZWQnIGFuZCBAbGVmdFN0YXR1cyE9J0RlcHJlY2F0ZWQnKSBvciAoQHJpZ2h0U3RhdHVzPSdPYnNvbGV0ZScgYW5kIEBsZWZ0U3RhdHVzIT0nT2Jzb2xldGUnKV0iLz4KKyAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICA8UC8+PGEgaHJlZj0iI190b3AiPihqdW1wIGJhY2sgdG8gdG9wKTwvYT48aHIvPgorCisJPGEgbmFtZT0iY2hhbmdlZCI+PC9hPgorICAgIDxoMj5DaGFuZ2VkIGluICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJpZ2h0VmVyIiAvPiAob2xkLCBuZXcpPC9oMj4KKyAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImdlblRhYmxlIj4KKyAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJub2RlcyIgc2VsZWN0PSIvbGlzdC9mdW5jWyhAbGVmdFN0YXR1cyAhPSAkbnVsKSBhbmQgKEByaWdodFN0YXR1cyAhPSAkbnVsKSBhbmQgKCAoQGxlZnRTdGF0dXMgIT0gQHJpZ2h0U3RhdHVzKSBvciAoQGxlZnRWZXJzaW9uICE9IEByaWdodFZlcnNpb24pICkgYW5kIG5vdCAoIChAbGVmdFN0YXR1cyA9ICdEcmFmdCcpIGFuZCAoQHJpZ2h0U3RhdHVzID0gJ1N0YWJsZScpIGFuZCAoQHJpZ2h0VmVyc2lvbiA9ICRyaWdodFZlcikgKV0iLz4KKyAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICA8UC8+PGEgaHJlZj0iI190b3AiPihqdW1wIGJhY2sgdG8gdG9wKTwvYT48aHIvPgorCisJPGEgbmFtZT0icHJvbW90ZWQiPjwvYT4KKyAgICA8aDI+UHJvbW90ZWQgdG8gc3RhYmxlIGluIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmlnaHRWZXIiIC8+PC9oMj4KKyAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImdlblRhYmxlIj4KKyAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJub2RlcyIgc2VsZWN0PSIvbGlzdC9mdW5jW0BsZWZ0U3RhdHVzICE9ICdTdGFibGUnIGFuZCAgQHJpZ2h0U3RhdHVzID0gJ1N0YWJsZSddIi8+CisgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgPFAvPjxhIGhyZWY9IiNfdG9wIj4oanVtcCBiYWNrIHRvIHRvcCk8L2E+PGhyLz4KKyAgICAKKyAgICA8YSBuYW1lPSJhZGRlZCI+PC9hPgorICAgIDxoMj5BZGRlZCBpbiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHJpZ2h0VmVyIiAvPjwvaDI+CisgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJnZW5UYWJsZSI+CisgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ibm9kZXMiIHNlbGVjdD0iL2xpc3QvZnVuY1tAbGVmdFN0YXR1cz0kbnVsXSIvPgorICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgIDxQLz48YSBocmVmPSIjX3RvcCI+KGp1bXAgYmFjayB0byB0b3ApPC9hPjxoci8+CisgICAgCisgICAgPGEgbmFtZT0ib3RoZXIiPjwvYT4KKyAgICA8aDI+T3RoZXIgZXhpc3RpbmcgZHJhZnRzIGluIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmlnaHRWZXIiIC8+PC9oMj4KKyAgICA8ZGl2IGNsYXNzPSdvdGhlcic+CisgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJpbmZvVGFibGUiPiA8IS0tICBub3RlOiBub3RlIGdlblRhYmxlIC0tPgorICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im5vZGVzIiBzZWxlY3Q9Ii9saXN0L2Z1bmNbQHJpZ2h0U3RhdHVzID0gJ0RyYWZ0JyBhbmQgQHJpZ2h0VmVyc2lvbiAhPSAkcmlnaHRWZXJdIi8+CisgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgPC9kaXY+CisgICAgPFAvPjxhIGhyZWY9IiNfdG9wIj4oanVtcCBiYWNrIHRvIHRvcCk8L2E+PGhyLz4KKzwhLS0gICAgCisgICAgCistLT4gICAgCisKKyAgICA8cD48aT48Zm9udCBzaXplPSItMSI+Q29udGVudHMgZ2VuZXJhdGVkIGJ5IFN0YWJsZUFQSSB0b29sIG9uIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZGF0ZVRpbWUiIC8+PGJyLz5Db3B5cmlnaHQgKEMpIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3VyWWVhciIgLz4sIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuPC9mb250PjwvaT48L3A+CisgICAgPC9ib2R5PgorICAgIDwvaHRtbD4KKyAgPC94c2w6dGVtcGxhdGU+CisKKyAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJnZW5UYWJsZSI+CisgICAgPHhzbDpwYXJhbSBuYW1lPSJub2RlcyIgLz4KKyAgICA8dGFibGUgY2xhc3M9J2dlblRhYmxlJyBCT1JERVI9IjEiPgorICAgIDxUSEVBRD4KKyAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRoPiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJ0ZpbGUnIiAvPiA8L3RoPgorICAgICAgICAgICAgPHRoPiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJ0FQSSciIC8+IDwvdGg+CisgICAgICAgICAgICA8dGg+IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbGVmdFZlciIgLz4gPC90aD4KKyAgICAgICAgICAgIDx0aD4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyaWdodFZlciIgLz4gPC90aD4KKyAgICAgICAgPC90cj4KKyAgICA8L1RIRUFEPgorCisgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIkbm9kZXMiPgorICAgICAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0iQGZpbGUiIC8+CisgICAgICAgICAgICAKKyAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyI+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIncm93JyIvPgorICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iKHBvc2l0aW9uKCkgbW9kIDIpIi8+CisgICAgICAgICAgICAgICAgICAgIDwhLS0gCisgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9Iihwb3NpdGlvbigpIG1vZCAyKSA9IDAiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJyb3cwIiAvPjwveHNsOndoZW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0icm93MSIgLz48L3hzbDpvdGhlcndpc2U+CisgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KKyAgICAgICAgICAgICAgICAgICAgLS0+CisgICAgICAgICAgICAgICAgPC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0nZmlsZSc+IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAZmlsZSIgLz4gPC90ZD4KKyAgICAgICAgICAgICAgICA8dGQgY2xhc3M9J3Byb3RvJz4gPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IkBwcm90b3R5cGUiIC8+IDwvdGQ+CisgICAgICAgICAgICAgICAgPHRkPgorICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyI+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3QgPSJAbGVmdFN0YXR1cyA9ICdTdGFibGUnIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IidzdGFiY2hhbmdlJyIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgorICAgICAgICAgICAgICAgICAgICA8L3hzbDphdHRyaWJ1dGU+CisgICAgICAgICAgICAgICAgICAgCTx4c2w6aWYgIHRlc3QgPSAiQGxlZnRTdGF0dXMgPSAnRHJhZnQnIGFuZCBAcmlnaHRTdGF0dXMgPSAnU3RhYmxlJyBhbmQgQGxlZnRWZXJzaW9uID0gQHJpZ2h0VmVyc2lvbiI+CisJICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjb2xzcGFuIj4yPC94c2w6YXR0cmlidXRlPgorCSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iYWxpZ24iPmNlbnRlcjwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgICAgICAgICAJPC94c2w6aWY+CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGVmdFN0YXR1cyIgLz48eHNsOmlmICB0ZXN0ID0gIkBsZWZ0U3RhdHVzID0gJ0RyYWZ0JyBhbmQgQHJpZ2h0U3RhdHVzID0gJ1N0YWJsZScgYW5kIEBsZWZ0VmVyc2lvbiA9IEByaWdodFZlcnNpb24iPsK7U3RhYmxlPC94c2w6aWY+CisgICAgICAgICAgICAgICAgICAgIDxici8+IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGVmdFZlcnNpb24iIC8+CisgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgCTx4c2w6aWYgIHRlc3QgPSAiQGxlZnRTdGF0dXMgIT0gJ0RyYWZ0JyBvciBAcmlnaHRTdGF0dXMgIT0gJ1N0YWJsZScgb3IgQGxlZnRWZXJzaW9uICE9IEByaWdodFZlcnNpb24iPgorICAgICAgICAgICAgICAgIDx0ZD4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkByaWdodFN0YXR1cyIgLz4gCisgICAgICAgICAgICAgICAgICAgIDxici8+IAorICAgICAgICAgICAgICAgICAgICA8c3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3QgPSJAbGVmdFZlcnNpb24gIT0gQHJpZ2h0VmVyc2lvbiBhbmQgQGxlZnRWZXJzaW9uICE9ICcnIGFuZCBAcmlnaHRWZXJzaW9uICE9ICcnIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Iid2ZXJjaGFuZ2UnIiAvPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDphdHRyaWJ1dGU+ICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPiAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkByaWdodFZlcnNpb24iIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3QgPSJAbGVmdFZlcnNpb24gIT0gQHJpZ2h0VmVyc2lvbiBhbmQgQGxlZnRWZXJzaW9uICE9ICcnIGFuZCBAcmlnaHRWZXJzaW9uICE9ICcnIGFuZCBAcmlnaHRTdGF0dXMgPSAnU3RhYmxlJyBhbmQgbm90ICggKEBsZWZ0U3RhdHVzID0gJ0RyYWZ0JykgYW5kIChAcmlnaHRTdGF0dXMgPSAnU3RhYmxlJykgYW5kIChAcmlnaHRWZXJzaW9uID0gJHJpZ2h0VmVyKSApIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIvPjxiIHRpdGxlPSdBIHN0YWJsZSBBUEkgY2hhbmdlZCB2ZXJzaW9uLicgY2xhc3M9J2JpZ3dhcm4nPihjaGFuZ2VkKTwvYj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0ID0iQHJpZ2h0U3RhdHVzID0gJ0RyYWZ0JyBhbmQgQHJpZ2h0VmVyc2lvbiAhPSAkcmlnaHRWZXIiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxici8+PGIgdGl0bGU9J0EgZHJhZnQgQVBJIGhhcyB0aGUgd3JvbmcgdmVyc2lvbi4nIGNsYXNzPSdiaWd3YXJuJz4oc2hvdWxkIGJlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmlnaHRWZXIiLz4pPC9iPgorICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkBsZWZ0U3RhdHVzID0gJ05vbmUnIGFuZCBAcmlnaHRWZXJzaW9uID0gJyciPgorICAgICAgICAgICAgICAgICAgICAgICAgCTxici8+PGIgdGl0bGU9J0EgbmV3IEFQSSB3YXMgaW50cm9kdWNlZCB0aGF0IHdhcyBub3QgdGFnZ2VkLicgY2xhc3M9J2JpZ3dhcm4nPih1bnRhZ2dlZCk8L2I+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgICAgICAgICAgICAgPC9zcGFuPgorICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgIDwveHNsOmlmPgorICAgICAgICAgICAJPHhzbDppZiAgdGVzdCA9ICJAcmlnaHRTdGF0dXMgPSAnU3RhYmxlJyBhbmQgQHJpZ2h0VmVyc2lvbiA9ICRyaWdodFZlciI+CisgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSdib3Juc3RhYmxlJz4KKyAgICAgICAgICAgICAgICAgICAgPGIgdGl0bGU9J0EgbmV3IEFQSSB3YXMgaW50cm9kdWNlZCBhcyBzdGFibGUgaW4gJHJpZ2h0VmVyLicgY2xhc3M9J2JpZ3dhcm4nPihCb3JuIFN0YWJsZSk8L2I+CisgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgPC94c2w6aWY+CisgICAgICAgICAgICA8L3RyPgorICAgICAgICA8L3hzbDpmb3ItZWFjaD4KKyAgICA8L3RhYmxlPgorICA8L3hzbDp0ZW1wbGF0ZT4KKyAgCisgICAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJpbmZvVGFibGUiPgorICAgIDx4c2w6cGFyYW0gbmFtZT0ibm9kZXMiIC8+CisgICAgPHRhYmxlIGNsYXNzPSdnZW5UYWJsZScgQk9SREVSPSIxIj4KKyAgICA8VEhFQUQ+CisgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IidGaWxlJyIgLz4gPC90aD4KKyAgICAgICAgICAgIDx0aD4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IidBUEknIiAvPiA8L3RoPgorICAgICAgICAgICAgPHRoPiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxlZnRWZXIiIC8+IDwvdGg+CisgICAgICAgICAgICA8dGg+IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmlnaHRWZXIiIC8+IDwvdGg+CisgICAgICAgIDwvdHI+CisgICAgPC9USEVBRD4KKworICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iJG5vZGVzIj4KKyAgICAgICAgICAgIDx4c2w6c29ydCBzZWxlY3Q9IkBmaWxlIiAvPgorICAgICAgICAgICAgCisgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPgorICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJ3JvdyciLz4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Iihwb3NpdGlvbigpIG1vZCAyKSIvPgorICAgICAgICAgICAgICAgICAgICA8IS0tIAorICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIocG9zaXRpb24oKSBtb2QgMikgPSAwIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0icm93MCIgLz48L3hzbDp3aGVuPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InJvdzEiIC8+PC94c2w6b3RoZXJ3aXNlPgorICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+CisgICAgICAgICAgICAgICAgICAgIC0tPgorICAgICAgICAgICAgICAgIDwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgICAgICA8dGQgY2xhc3M9J2ZpbGUnPiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGZpbGUiIC8+IDwvdGQ+CisgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSdwcm90byc+IDx4c2w6dmFsdWUtb2YgZGlzYWJsZS1vdXRwdXQtZXNjYXBpbmc9InllcyIgc2VsZWN0PSJAcHJvdG90eXBlIiAvPiA8L3RkPgorICAgICAgICAgICAgICAgIDx0ZD4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0ID0iQGxlZnRTdGF0dXMgPSAnU3RhYmxlJyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSInc3RhYmNoYW5nZSciIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgICAgICAgICAgICAgPC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAJPHhzbDppZiAgdGVzdCA9ICJAbGVmdFN0YXR1cyA9IEByaWdodFN0YXR1cyBhbmQgQGxlZnRWZXJzaW9uID0gQHJpZ2h0VmVyc2lvbiI+CisJICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjb2xzcGFuIj4yPC94c2w6YXR0cmlidXRlPgorCSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iYWxpZ24iPmNlbnRlcjwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgICAgICAgICAJPC94c2w6aWY+CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsZWZ0U3RhdHVzIiAvPgorICAgICAgICAgICAgICAgICAgICA8YnIvPiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxlZnRWZXJzaW9uIiAvPgorICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0ID0gIkBsZWZ0U3RhdHVzICE9IEByaWdodFN0YXR1cyBvciBAbGVmdFZlcnNpb24gIT0gQHJpZ2h0VmVyc2lvbiI+CisgICAgICAgICAgICAgICAgPHRkPiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHJpZ2h0U3RhdHVzIiAvPiAKKyAgICAgICAgICAgICAgICAgICAgPGJyLz4gCisgICAgICAgICAgICAgICAgICAgIDxzcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdCA9IkBsZWZ0VmVyc2lvbiAhPSBAcmlnaHRWZXJzaW9uIGFuZCBAbGVmdFZlcnNpb24gIT0gJycgYW5kIEByaWdodFZlcnNpb24gIT0gJyciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJ3ZlcmNoYW5nZSciIC8+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmF0dHJpYnV0ZT4gICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+ICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHJpZ2h0VmVyc2lvbiIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KKyAgICAgICAgICAgICAgICAgICA8IS0tIAorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0ID0iQGxlZnRWZXJzaW9uICE9IEByaWdodFZlcnNpb24gYW5kIEBsZWZ0VmVyc2lvbiAhPSAnJyBhbmQgQHJpZ2h0VmVyc2lvbiAhPSAnJyBhbmQgQHJpZ2h0U3RhdHVzID0gJ1N0YWJsZSciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxici8+PGIgdGl0bGU9J0Egc3RhYmxlIEFQSSBjaGFuZ2VkIHZlcnNpb24uJyBjbGFzcz0nYmlnd2Fybic+KGNoYW5nZWQpPC9iPgorICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3QgPSJAcmlnaHRTdGF0dXMgPSAnRHJhZnQnIGFuZCBAcmlnaHRWZXJzaW9uICE9ICRyaWdodFZlciI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyLz48YiB0aXRsZT0nQSBkcmFmdCBBUEkgaGFzIHRoZSB3cm9uZyB2ZXJzaW9uLicgY2xhc3M9J2JpZ3dhcm4nPihzaG91bGQgYmUgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyaWdodFZlciIvPik8L2I+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQGxlZnRTdGF0dXMgPSAnTm9uZScgYW5kIEByaWdodFZlcnNpb24gPSAnJyI+CisgICAgICAgICAgICAgICAgICAgICAgICAJPGJyLz48YiB0aXRsZT0nQSBuZXcgQVBJIHdhcyBpbnRyb2R1Y2VkIHRoYXQgd2FzIG5vdCB0YWdnZWQuJyBjbGFzcz0nYmlnd2Fybic+KHVudGFnZ2VkKTwvYj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgorICAgICAgICAgICAgICAgICAgICAgLS0+CisgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4KKyAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgIDwveHNsOmlmPgorICAgICAgICAgICAgPC90cj4KKyAgICAgICAgPC94c2w6Zm9yLWVhY2g+CisgICAgPC90YWJsZT4KKyAgPC94c2w6dGVtcGxhdGU+CisgIAorPC94c2w6c3R5bGVzaGVldD4KKworCisKKwpkaWZmIC0tZ2l0IGEvcmVsZWFzZS9qYXZhL3NyYy9jb20vaWJtL2ljdS9kZXYvdG9vbHMvZG9jcy9nZW5yZXBvcnRfeG1sLnhzbHQgYi9yZWxlYXNlL2phdmEvc3JjL2NvbS9pYm0vaWN1L2Rldi90b29scy9kb2NzL2dlbnJlcG9ydF94bWwueHNsdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjAxYjE1Ci0tLSAvZGV2L251bGwKKysrIGIvcmVsZWFzZS9qYXZhL3NyYy9jb20vaWJtL2ljdS9kZXYvdG9vbHMvZG9jcy9nZW5yZXBvcnRfeG1sLnhzbHQKQEAgLTAsMCArMSwyMzkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisvKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMCwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgICAgICAgICAqCisqIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFRoaXMgaXMgdGhlIFhTTFQgZm9yIHRoZSBBUEkgUmVwb3J0LCBYTUwgc3R5bGUKKyovCistLT4KKzx4c2w6c3R5bGVzaGVldCB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIj4KKzwhLS0KKyAgPHhzbDpwYXJhbSBuYW1lPSJsZWZ0U3RhdHVzIiAvPgorICA8eHNsOnBhcmFtIG5hbWU9InJpZ2h0U3RhdHVzIiAvPgorLS0+CisgIDx4c2w6cGFyYW0gbmFtZT0ibGVmdFZlciIgLz4KKyAgPHhzbDpwYXJhbSBuYW1lPSJyaWdodFZlciIgLz4KKyAgPHhzbDpwYXJhbSBuYW1lPSJkYXRlVGltZSIgLz4KKyAgPHhzbDpwYXJhbSBuYW1lPSJudWwiIC8+CisKKyAgPHhzbDpwYXJhbSBuYW1lPSJvdXJZZWFyIiAvPgorICAKKworICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KKyAgICA8eHNsOmNvbW1lbnQ+CisgICAgICBDb3B5cmlnaHQgKEMpICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG91clllYXIiIC8+LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uLCBBbGwgUmlnaHRzIFJlc2VydmVkLiAKKyAgICA8L3hzbDpjb21tZW50PgorICAgIDxjaGFuZ2VSZXBvcnQ+CisgICAgICA8aWRlbnRpdHk+CisJPHhzbDphdHRyaWJ1dGUgbmFtZT0ibGVmdCI+CisJICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRsZWZ0VmVyIi8+CisJPC94c2w6YXR0cmlidXRlPgorCTx4c2w6YXR0cmlidXRlIG5hbWU9InJpZ2h0Ij4KKwkgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmlnaHRWZXIiIC8+CisJPC94c2w6YXR0cmlidXRlPgorCTx4c2w6YXR0cmlidXRlIG5hbWU9ImdlbmVyYXRlZC1kYXRlIj4KKwkgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZGF0ZVRpbWUiIC8+CisJPC94c2w6YXR0cmlidXRlPgorICAgICAgPC9pZGVudGl0eT4KKworICAgICAgPCEtLSA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImljdTRjLmNzcyIgdHlwZT0idGV4dC9jc3MiIC8+IC0tPgorCisgICAgICA8ZnVuY3Rpb25zIG5hbWU9InJlbW92ZWQiPgorICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZ2VuVGFibGUiPgorICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im5vZGVzIiBzZWxlY3Q9Ii9saXN0L2Z1bmNbQHJpZ2h0U3RhdHVzPSRudWxdIi8+CisgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICA8L2Z1bmN0aW9ucz4KKworICAgICAgPGZ1bmN0aW9ucyBuYW1lPSJkZXByZWNhdGVkIj4KKyAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImdlblRhYmxlIj4KKyAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJub2RlcyIgc2VsZWN0PSIvbGlzdC9mdW5jWyhAcmlnaHRTdGF0dXM9J0RlcHJlY2F0ZWQnIGFuZCBAbGVmdFN0YXR1cyE9J0RlcHJlY2F0ZWQnKSBvciAoQHJpZ2h0U3RhdHVzPSdPYnNvbGV0ZScgYW5kIEBsZWZ0U3RhdHVzIT0nT2Jzb2xldGUnKV0iLz4KKyAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgIDwvZnVuY3Rpb25zPgorCisgICAgICA8ZnVuY3Rpb25zIG5hbWU9ImNoYW5nZWQiPgorICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZ2VuVGFibGUiPgorICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im5vZGVzIiBzZWxlY3Q9Ii9saXN0L2Z1bmNbKEBsZWZ0U3RhdHVzICE9ICRudWwpIGFuZCAoQHJpZ2h0U3RhdHVzICE9ICRudWwpIGFuZCAoIChAbGVmdFN0YXR1cyAhPSBAcmlnaHRTdGF0dXMpIG9yIChAbGVmdFZlcnNpb24gIT0gQHJpZ2h0VmVyc2lvbikgKV0iLz4KKyAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgIDwvZnVuY3Rpb25zPgorCisgICAgICA8ZnVuY3Rpb25zIG5hbWU9InByb21vdGVkIj4KKyAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImdlblRhYmxlIj4KKyAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJub2RlcyIgc2VsZWN0PSIvbGlzdC9mdW5jW0BsZWZ0U3RhdHVzICE9ICdTdGFibGUnIGFuZCAgQHJpZ2h0U3RhdHVzID0gJ1N0YWJsZSddIi8+CisgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICA8L2Z1bmN0aW9ucz4KKyAgICAKKyAgICAgIDxmdW5jdGlvbnMgbmFtZT0iYWRkZWQiPgorICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZ2VuVGFibGUiPgorICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im5vZGVzIiBzZWxlY3Q9Ii9saXN0L2Z1bmNbQGxlZnRTdGF0dXM9JG51bF0iLz4KKyAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgIDwvZnVuY3Rpb25zPgorCisgICAgICA8ZnVuY3Rpb25zIG5hbWU9ImRyYWZ0Ij4KKyAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImluZm9UYWJsZSI+CisgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ibm9kZXMiIHNlbGVjdD0iL2xpc3QvZnVuY1tAcmlnaHRTdGF0dXMgPSAnRHJhZnQnIGFuZCBAcmlnaHRWZXJzaW9uICE9ICRyaWdodFZlcl0iLz4KKyAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgIDwvZnVuY3Rpb25zPgorCisgICAgPC9jaGFuZ2VSZXBvcnQ+CisgIDwveHNsOnRlbXBsYXRlPgorCisgIDx4c2w6dGVtcGxhdGUgbmFtZT0iZ2VuVGFibGUiPgorICAgIDx4c2w6cGFyYW0gbmFtZT0ibm9kZXMiIC8+CisgICAgPHRhYmxlIGNsYXNzPSdnZW5UYWJsZScgQk9SREVSPSIxIj4KKyAgICA8VEhFQUQ+CisgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IidGaWxlJyIgLz4gPC90aD4KKyAgICAgICAgICAgIDx0aD4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IidBUEknIiAvPiA8L3RoPgorICAgICAgICAgICAgPHRoPiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxlZnRWZXIiIC8+IDwvdGg+CisgICAgICAgICAgICA8dGg+IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmlnaHRWZXIiIC8+IDwvdGg+CisgICAgICAgIDwvdHI+CisgICAgPC9USEVBRD4KKworICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iJG5vZGVzIj4KKyAgICAgICAgICAgIDx4c2w6c29ydCBzZWxlY3Q9IkBmaWxlIiAvPgorICAgICAgICAgICAgCisgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPgorICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJ3JvdyciLz4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Iihwb3NpdGlvbigpIG1vZCAyKSIvPgorICAgICAgICAgICAgICAgICAgICA8IS0tIAorICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIocG9zaXRpb24oKSBtb2QgMikgPSAwIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0icm93MCIgLz48L3hzbDp3aGVuPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InJvdzEiIC8+PC94c2w6b3RoZXJ3aXNlPgorICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+CisgICAgICAgICAgICAgICAgICAgIC0tPgorICAgICAgICAgICAgICAgIDwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgICAgICA8dGQgY2xhc3M9J2ZpbGUnPiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGZpbGUiIC8+IDwvdGQ+CisgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSdwcm90byc+IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcHJvdG90eXBlIiAvPiA8L3RkPgorICAgICAgICAgICAgICAgIDx0ZD4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0ID0iQGxlZnRTdGF0dXMgPSAnU3RhYmxlJyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSInc3RhYmNoYW5nZSciIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgICAgICAgICAgICAgPC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgICAgICAgIAk8eHNsOmlmICB0ZXN0ID0gIkBsZWZ0U3RhdHVzID0gJ0RyYWZ0JyBhbmQgQHJpZ2h0U3RhdHVzID0gJ1N0YWJsZScgYW5kIEBsZWZ0VmVyc2lvbiA9IEByaWdodFZlcnNpb24iPgorCSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY29sc3BhbiI+CisgICAgICAgCSAgICAgICAgICAgIAkJMgorICAgICAgIAkgICAgICAgICAgICAJPC94c2w6YXR0cmlidXRlPgorCSAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iYWxpZ24iPgorICAgICAgIAkgICAgICAgICAgICAJCWNlbnRlcgorICAgICAgIAkgICAgICAgICAgICAJPC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgICAgICAgIAk8L3hzbDppZj4KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsZWZ0U3RhdHVzIiAvPjx4c2w6aWYgIHRlc3QgPSAiQGxlZnRTdGF0dXMgPSAnRHJhZnQnIGFuZCBAcmlnaHRTdGF0dXMgPSAnU3RhYmxlJyBhbmQgQGxlZnRWZXJzaW9uID0gQHJpZ2h0VmVyc2lvbiI+Jmd0O1N0YWJsZTwveHNsOmlmPgorICAgICAgICAgICAgICAgICAgICA8YnIvPiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxlZnRWZXJzaW9uIiAvPgorICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgIAk8eHNsOmlmICB0ZXN0ID0gIkBsZWZ0U3RhdHVzICE9ICdEcmFmdCcgb3IgQHJpZ2h0U3RhdHVzICE9ICdTdGFibGUnIG9yIEBsZWZ0VmVyc2lvbiAhPSBAcmlnaHRWZXJzaW9uIj4KKyAgICAgICAgICAgICAgICA8dGQ+IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcmlnaHRTdGF0dXMiIC8+IAorICAgICAgICAgICAgICAgICAgICA8YnIvPiAKKyAgICAgICAgICAgICAgICAgICAgPHNwYW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0ID0iQGxlZnRWZXJzaW9uICE9IEByaWdodFZlcnNpb24gYW5kIEBsZWZ0VmVyc2lvbiAhPSAnJyBhbmQgQHJpZ2h0VmVyc2lvbiAhPSAnJyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIndmVyY2hhbmdlJyIgLz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgorICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6YXR0cmlidXRlPiAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj4gICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcmlnaHRWZXJzaW9uIiAvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0ID0iQGxlZnRWZXJzaW9uICE9IEByaWdodFZlcnNpb24gYW5kIEBsZWZ0VmVyc2lvbiAhPSAnJyBhbmQgQHJpZ2h0VmVyc2lvbiAhPSAnJyBhbmQgQHJpZ2h0U3RhdHVzID0gJ1N0YWJsZSciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxici8+PGIgdGl0bGU9J0Egc3RhYmxlIEFQSSBjaGFuZ2VkIHZlcnNpb24uJyBjbGFzcz0nYmlnd2Fybic+KGNoYW5nZWQpPC9iPgorICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3QgPSJAcmlnaHRTdGF0dXMgPSAnRHJhZnQnIGFuZCBAcmlnaHRWZXJzaW9uICE9ICRyaWdodFZlciI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyLz48YiB0aXRsZT0nQSBkcmFmdCBBUEkgaGFzIHRoZSB3cm9uZyB2ZXJzaW9uLicgY2xhc3M9J2JpZ3dhcm4nPihzaG91bGQgYmUgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRyaWdodFZlciIvPik8L2I+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQGxlZnRTdGF0dXMgPSAnTm9uZScgYW5kIEByaWdodFZlcnNpb24gPSAnJyI+CisgICAgICAgICAgICAgICAgICAgICAgICAJPGJyLz48YiB0aXRsZT0nQSBuZXcgQVBJIHdhcyBpbnRyb2R1Y2VkIHRoYXQgd2FzIG5vdCB0YWdnZWQuJyBjbGFzcz0nYmlnd2Fybic+KHVudGFnZ2VkKTwvYj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgorICAgICAgICAgICAgICAgICAgICA8L3NwYW4+CisgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgPC94c2w6aWY+CisgICAgICAgICAgICA8L3RyPgorICAgICAgICA8L3hzbDpmb3ItZWFjaD4KKyAgICA8L3RhYmxlPgorICA8L3hzbDp0ZW1wbGF0ZT4KKyAgCisgICAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJpbmZvVGFibGUiPgorICAgIDx4c2w6cGFyYW0gbmFtZT0ibm9kZXMiIC8+CisgICAgPHRhYmxlIGNsYXNzPSdnZW5UYWJsZScgQk9SREVSPSIxIj4KKyAgICA8VEhFQUQ+CisgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0aD4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IidGaWxlJyIgLz4gPC90aD4KKyAgICAgICAgICAgIDx0aD4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IidBUEknIiAvPiA8L3RoPgorICAgICAgICAgICAgPHRoPiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGxlZnRWZXIiIC8+IDwvdGg+CisgICAgICAgICAgICA8dGg+IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmlnaHRWZXIiIC8+IDwvdGg+CisgICAgICAgIDwvdHI+CisgICAgPC9USEVBRD4KKworICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iJG5vZGVzIj4KKyAgICAgICAgICAgIDx4c2w6c29ydCBzZWxlY3Q9IkBmaWxlIiAvPgorICAgICAgICAgICAgCisgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPgorICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJ3JvdyciLz4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Iihwb3NpdGlvbigpIG1vZCAyKSIvPgorICAgICAgICAgICAgICAgICAgICA8IS0tIAorICAgICAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIocG9zaXRpb24oKSBtb2QgMikgPSAwIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0icm93MCIgLz48L3hzbDp3aGVuPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InJvdzEiIC8+PC94c2w6b3RoZXJ3aXNlPgorICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+CisgICAgICAgICAgICAgICAgICAgIC0tPgorICAgICAgICAgICAgICAgIDwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgICAgICA8dGQgY2xhc3M9J2ZpbGUnPiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGZpbGUiIC8+IDwvdGQ+CisgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSdwcm90byc+IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcHJvdG90eXBlIiAvPiA8L3RkPgorICAgICAgICAgICAgICAgIDx0ZD4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0ID0iQGxlZnRTdGF0dXMgPSAnU3RhYmxlJyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSInc3RhYmNoYW5nZSciIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgICAgICAgICAgICAgPC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAJPHhzbDppZiAgdGVzdCA9ICJAbGVmdFN0YXR1cyA9IEByaWdodFN0YXR1cyBhbmQgQGxlZnRWZXJzaW9uID0gQHJpZ2h0VmVyc2lvbiI+CisJICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjb2xzcGFuIj4KKyAgICAgICAJICAgICAgICAgICAgCQkyCisgICAgICAgCSAgICAgICAgICAgIAk8L3hzbDphdHRyaWJ1dGU+CisJICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJhbGlnbiI+CisgICAgICAgCSAgICAgICAgICAgIAkJY2VudGVyCisgICAgICAgCSAgICAgICAgICAgIAk8L3hzbDphdHRyaWJ1dGU+CisgICAgICAgICAgICAgICAgICAgCTwveHNsOmlmPgorICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbGVmdFN0YXR1cyIgLz4KKyAgICAgICAgICAgICAgICAgICAgPGJyLz4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBsZWZ0VmVyc2lvbiIgLz4KKyAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdCA9ICJAbGVmdFN0YXR1cyAhPSBAcmlnaHRTdGF0dXMgb3IgQGxlZnRWZXJzaW9uICE9IEByaWdodFZlcnNpb24iPgorICAgICAgICAgICAgICAgIDx0ZD4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkByaWdodFN0YXR1cyIgLz4gCisgICAgICAgICAgICAgICAgICAgIDxici8+IAorICAgICAgICAgICAgICAgICAgICA8c3Bhbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3QgPSJAbGVmdFZlcnNpb24gIT0gQHJpZ2h0VmVyc2lvbiBhbmQgQGxlZnRWZXJzaW9uICE9ICcnIGFuZCBAcmlnaHRWZXJzaW9uICE9ICcnIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Iid2ZXJjaGFuZ2UnIiAvPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDphdHRyaWJ1dGU+ICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPiAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkByaWdodFZlcnNpb24iIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+CisgICAgICAgICAgICAgICAgICAgPCEtLSAKKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdCA9IkBsZWZ0VmVyc2lvbiAhPSBAcmlnaHRWZXJzaW9uIGFuZCBAbGVmdFZlcnNpb24gIT0gJycgYW5kIEByaWdodFZlcnNpb24gIT0gJycgYW5kIEByaWdodFN0YXR1cyA9ICdTdGFibGUnIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIvPjxiIHRpdGxlPSdBIHN0YWJsZSBBUEkgY2hhbmdlZCB2ZXJzaW9uLicgY2xhc3M9J2JpZ3dhcm4nPihjaGFuZ2VkKTwvYj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmlmPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0ID0iQHJpZ2h0U3RhdHVzID0gJ0RyYWZ0JyBhbmQgQHJpZ2h0VmVyc2lvbiAhPSAkcmlnaHRWZXIiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxici8+PGIgdGl0bGU9J0EgZHJhZnQgQVBJIGhhcyB0aGUgd3JvbmcgdmVyc2lvbi4nIGNsYXNzPSdiaWd3YXJuJz4oc2hvdWxkIGJlIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcmlnaHRWZXIiLz4pPC9iPgorICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkBsZWZ0U3RhdHVzID0gJ05vbmUnIGFuZCBAcmlnaHRWZXJzaW9uID0gJyciPgorICAgICAgICAgICAgICAgICAgICAgICAgCTxici8+PGIgdGl0bGU9J0EgbmV3IEFQSSB3YXMgaW50cm9kdWNlZCB0aGF0IHdhcyBub3QgdGFnZ2VkLicgY2xhc3M9J2JpZ3dhcm4nPih1bnRhZ2dlZCk8L2I+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgICAgICAgICAgICAgIC0tPgorICAgICAgICAgICAgICAgICAgICA8L3NwYW4+CisgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgICAgIDwvdHI+CisgICAgICAgIDwveHNsOmZvci1lYWNoPgorICAgIDwvdGFibGU+CisgIDwveHNsOnRlbXBsYXRlPgorICAKKzwveHNsOnN0eWxlc2hlZXQ+CisKKworCisKZGlmZiAtLWdpdCBhL3JlbGVhc2UvamF2YS9zcmMvY29tL2libS9pY3UvZGV2L3Rvb2xzL21pc2MvTm9uQXNjaWlGaWxlRGV0ZWN0b3IuamF2YSBiL3JlbGVhc2UvamF2YS9zcmMvY29tL2libS9pY3UvZGV2L3Rvb2xzL21pc2MvTm9uQXNjaWlGaWxlRGV0ZWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjQ5Nzc5Ci0tLSAvZGV2L251bGwKKysrIGIvcmVsZWFzZS9qYXZhL3NyYy9jb20vaWJtL2ljdS9kZXYvdG9vbHMvbWlzYy9Ob25Bc2NpaUZpbGVEZXRlY3Rvci5qYXZhCkBAIC0wLDAgKzEsMTY4IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDEwLCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzCisgKiBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3BhY2thZ2UgY29tLmlibS5pY3UuZGV2LnRvb2xzLm1pc2M7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVuYW1lRmlsdGVyOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitwdWJsaWMgY2xhc3MgTm9uQXNjaWlGaWxlRGV0ZWN0b3IKK3sKKwkKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIFZFUkJPU0UgPSBmYWxzZTsKKwkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIElDVVNvdXJjZUZpbGVGaWx0ZXIgaW1wbGVtZW50cyBGaWxlbmFtZUZpbHRlcgorICAgIHsKKyAgICAJaW50IG1hdGNoZWQgPSAwOworICAgIAlpbnQgc2tpcHBlZCA9IDA7CisgICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGRpciwgU3RyaW5nIG5hbWUpIAorICAgICAgICB7CisgICAgICAgICAgICBib29sZWFuIGRvQWNjZXB0ID0gbmFtZS5lbmRzV2l0aCgiLmNwcCIpIHx8IG5hbWUuZW5kc1dpdGgoIi5jIikgfHwgbmFtZS5lbmRzV2l0aCgiLmgiKSB8fCBuYW1lLmVuZHNXaXRoKCIuamF2YSIpOworICAgICAgICAgICAgaWYoZG9BY2NlcHQpIHsKKyAgICAgICAgICAgIAltYXRjaGVkKys7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgCXNraXBwZWQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBkb0FjY2VwdDsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgU3RyaW5nIHN0YXRzKCkgeworICAgICAgICAJcmV0dXJuICJDaGVja2VkICIgKyBtYXRjaGVkICsgIiBmaWxlcyBhbmQgc2tpcHBlZCAiICsgc2tpcHBlZCArICIgZmlsZXMiOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBpbnQgaXNOb25Bc2NpaShGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgQnVmZmVyZWRSZWFkZXIgaW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoZmlsZSkpOworICAgICAgICBpbnQgbGluZSA9IDA7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBTdHJpbmcgc3RyID0gaW4ucmVhZExpbmUoKTsKKyAgICAgICAgICAgIGlmIChzdHIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGluLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoKCk7IGkgKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RyLmNoYXJBdChpKSA+IDB4N2YgfHwgc3RyLmNoYXJBdChpKT09MHgwNykgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkFzY2lpIHRlc3QgZmFpbGVkIGluICIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiIGxpbmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBsaW5lICsgIiBzdHJpbmdcbiIgKyBzdHIpOworICAgICAgICAgICAgICAgICAgICAvLyBub24tbGF0aW4xCisgICAgICAgICAgICAgICAgICAgIGluLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsaW5lOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxpbmUgKys7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGxpc3RGaWxlcyhGaWxlIGZpbGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZW5hbWVGaWx0ZXIgZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPEZpbGU+IGxpc3QpIHRocm93cyBJT0V4Y2VwdGlvbiAKKyAgICB7CisgICAgCWlmKFZFUkJPU0UpIFN5c3RlbS5lcnIucHJpbnRsbigiIC4uIGNoZWNraW5nICIgKyBmaWxlLmdldFBhdGgoKSApOworICAgICAgICBGaWxlIGZpbGVzW10gPSBmaWxlLmxpc3RGaWxlcygpOworICAgICAgICBpZiAoZmlsZXMgIT0gbnVsbCAmJiBmaWxlcy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSArKykgeworICAgICAgICAgICAgICAgIGlmIChmaWxlc1tpXS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgCWlmKGZpbGVzW2ldLmdldEFic29sdXRlUGF0aCgpLmVxdWFscyhmaWxlc1tpXS5nZXRDYW5vbmljYWxQYXRoKCkpKSB7CisgICAgICAgICAgICAgICAgCQlpZighZmlsZXNbaV0uZ2V0TmFtZSgpLmVxdWFscygiLnN2biIpKSB7IC8vIHNraXAgLnN2biBkaXJzCisgICAgICAgICAgICAgICAgCQkJbGlzdEZpbGVzKGZpbGVzW2ldLCBmaWx0ZXIsIGxpc3QpOyAgICAgICAgICAKKyAgICAgICAgICAgICAgICAJCX0KKyAgICAgICAgICAgICAgICAJfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAJCWlmKFZFUkJPU0UpIHsKKyAgICAgICAgICAgICAgICAJCQlTeXN0ZW0uZXJyLnByaW50bG4oIi4uICAgIHNraXBwaW5nIHN5bWxpbmsgIiArIGZpbGVzW2ldLmdldFBhdGgoKSk7CisgICAgICAgICAgICAgICAgCQl9CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaWx0ZXIuYWNjZXB0KGZpbGUsIGZpbGVzW2ldLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKGZpbGVzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgSW50ZWdlcj4gZ2V0Tm9uQXNjaWlGaWxlcyhGaWxlIGRpcmVjdG9yeSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVuYW1lRmlsdGVyIGZpbHRlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBWZWN0b3I8RmlsZT4gZmlsZXMgPSBuZXcgVmVjdG9yPEZpbGU+KCk7CisgICAgICAgIE1hcDxTdHJpbmcsSW50ZWdlcj4gcmVzdWx0ID0gbmV3IFRyZWVNYXA8U3RyaW5nLEludGVnZXI+KCk7CisgICAgICAgIGxpc3RGaWxlcyhkaXJlY3RvcnksIGZpbHRlciwgZmlsZXMpOworICAgICAgICBpbnQgZmlsZWNvdW50ID0gZmlsZXMuc2l6ZSgpOworICAgICAgICBpZiAoZmlsZWNvdW50ID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZWNvdW50OyBpICsrKSB7CisgICAgICAgICAgICAgaW50IGlzbm9uYXNjaWkgPSBpc05vbkFzY2lpKGZpbGVzLmVsZW1lbnRBdChpKSk7CisgICAgICAgICAgICAgaWYgKGlzbm9uYXNjaWkgIT0gLTEpIHsKKyAgICAgICAgICAgIAkgcmVzdWx0LnB1dChmaWxlcy5lbGVtZW50QXQoaSkuZ2V0QWJzb2x1dGVQYXRoKCksbmV3IEludGVnZXIoaXNub25hc2NpaSkpOworICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdbXSkKKyAgICB7CisgICAgCWludCBuZXh0QXJnID0gMDsKKyAgICAJZm9yKG5leHRBcmcgPSAwO25leHRBcmc8YXJnLmxlbmd0aCAmJiBhcmdbbmV4dEFyZ10uc3RhcnRzV2l0aCgiLSIpO25leHRBcmcrKykgeworICAgIAkJaWYoYXJnW25leHRBcmddLmVxdWFscygiLXYiKSkgeworICAgIAkJCVZFUkJPU0U9dHJ1ZTsKKyAgICAJCQlTeXN0ZW0uZXJyLnByaW50bG4oIiAuLiB2ZXJib3NlIG1vZGUuIik7CisgICAgCQl9CisgICAgCX0KKyAgICAJaWYobmV4dEFyZyA9PSBhcmcubGVuZ3RoKSB7CisgICAgCQlTeXN0ZW0uZXJyLnByaW50bG4oTm9uQXNjaWlGaWxlRGV0ZWN0b3IuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKyI6IGVycm9yLCBubyBkaXJlY3RvcmllcyBzcGVjaWZpZWQhIik7CisgICAgCX0KKyAgICAJaW50IGJhZD0wOworICAgIAlmb3IoO25leHRBcmc8YXJnLmxlbmd0aDtuZXh0QXJnKyspeworCSAgICAgICAgdHJ5IHsKKwkgICAgICAgIAlJQ1VTb3VyY2VGaWxlRmlsdGVyIGlzZmYgPSBuZXcgSUNVU291cmNlRmlsZUZpbHRlcigpOworCSAgICAgICAgCUZpbGUgZGlyID0gbmV3IEZpbGUoYXJnW25leHRBcmddKTsKKwkgICAgICAgICAgICBpZighZGlyLmlzRGlyZWN0b3J5KCkpIHsKKwkgICAgICAgICAgICAJdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigiTm90IGEgZGlyZWN0b3J5OiAiICsgZGlyLmdldEFic29sdXRlUGF0aCgpKTsKKwkgICAgICAgICAgICB9CisJICAgICAgICAgICAgTWFwPFN0cmluZywgSW50ZWdlcj4gbm9uYXNjaWkgPSBnZXROb25Bc2NpaUZpbGVzKGRpciwgaXNmZik7CisJICAgICAgICAgICAgYm9vbGVhbiBub2lzZWQgPSBmYWxzZTsKKwkgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKKwkgICAgICAgICAgICBpZiAobm9uYXNjaWkgIT0gbnVsbCAmJiBub25hc2NpaS5zaXplKCkgPiAwKSB7CisJICAgICAgICAgICAgICAgIGZvciAoRW50cnk8U3RyaW5nLCBJbnRlZ2VyPiBlIDogbm9uYXNjaWkuZW50cnlTZXQoKSkgeworCSAgICAgICAgICAgICAgICAgICAgIGlmKCFub2lzZWQpIHsKKwkgICAgICAgICAgICAgICAgICAgIAkgU3lzdGVtLm91dC5wcmludGxuKCJOb24gYXNjaWkgZmlsZXMgaW4gICIgKyBhcmdbbmV4dEFyZ10gKyAiOiAiKTsKKwkgICAgICAgICAgICAgICAgICAgIAkgbm9pc2VkID0gdHJ1ZTsKKwkgICAgICAgICAgICAgICAgICAgICB9CisJICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIiIAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICArZS5nZXRLZXkoKSArICI6IiAKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgK2UuZ2V0VmFsdWUoKSk7CisJICAgICAgICAgICAgICAgICAgICAgYmFkKys7CisJICAgICAgICAgICAgICAgIH0KKwkgICAgICAgICAgICB9IGVsc2UgeworLy8JICAgICAgICAgICAgCWlmIChWRVJCT1NFPT10cnVlKSB7CisJICAgICAgICAgICAgCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vIG5vbiBhc2NpaSBmaWxlcyBpbiAiICsgYXJnW25leHRBcmddKTsKKy8vCSAgICAgICAgICAgIAl9CisJICAgICAgICAgICAgfQorLy8JICAgICAgICAgICAgaWYoVkVSQk9TRT09dHJ1ZSkgeworCSAgICAgICAgICAgIAlTeXN0ZW0ub3V0LnByaW50bG4oIGlzZmYuc3RhdHMoKSk7CisvLwkgICAgICAgICAgICB9CisJICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJICAgICAgICAJU3lzdGVtLmVyci5wcmludGxuKCJFcnJvciBwcm9jZXNzaW5nICIgKyBhcmdbbmV4dEFyZ10pOworCSAgICAgICAgCWUucHJpbnRTdGFja1RyYWNlKCk7CisJICAgICAgICB9CisgICAgCX0KKyAgICAJaWYoYmFkPjApIHsKKyAgICAJCVN5c3RlbS5lcnIucHJpbnRsbihiYWQrIiBub24tYXNjaWkgZmlsZXMgZm91bmQgaW4gdG90YWwuIik7CisgICAgCX0JCisgICAgfQorfQorICAgICAgICAgICAgIApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9jcHlzZWFyY2gvY3B5c2Nhbi5wbCBiL3NjcmlwdHMvY3B5c2VhcmNoL2NweXNjYW4ucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjM4NmJmZAotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvY3B5c2VhcmNoL2NweXNjYW4ucGwKQEAgLTAsMCArMSwyNSBAQAorIyEvdXNyL2Jpbi9wZXJsIC13CisjICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIyAgKiBDT1BZUklHSFQ6CisjICAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA3LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uCisjICAqIGFuZCBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIyAKKyMgIFNlYXJjaCBmb3IgYW5kIGxpc3QgZmlsZXMgd2hpY2ggZG9uJ3QgaGF2ZSBhIGNvcHlyaWdodCBub3RpY2UsIGFuZCBzaG91bGQuCisjCit1c2Ugc3RyaWN0OworCitteSAkaWN1U291cmNlID0gJEFSR1ZbMF07CitteSAkaWdub3JlID0gImRhdGEvb3V0L2J1aWxkfENWU3xcXC5zdm58XFx+fFxcI3xEZWJ1Z3xSZWxlYXNlfFxcLmRsbHxcXC5pbGt8XFwuaWRifFxcLnBkYnxcXC5kc3B8XFwuZHN3fFxcLm9wdHxcXC5uY2J8XFwudmNwcm9qfFxcLnNsbnxcXC5zdW98XFwuY3ZzaWdub3JlfFxcLmNudnxcXC5yZXN8XFwuaWN1fFxcLmV4ZXxcXC5vYmp8XFwuYmlufFxcLmV4cHxcXC5saWJ8XFwub3V0fFxcLnBsZ3xwb3NpdGlvbnN8dW5pZGF0YXxcXC5qYXJ8XFwuc3BwfFxcLnN0dWJ8XFwucG9saWN5fFxcLm90ZnxcXC50dGZ8XFwuVFRGIjsKKworbXkgJGNvbW1hbmQgPSAiZmluZCAkaWN1U291cmNlIC10eXBlIGYgfCBmZ3JlcCAtdiAtZiBjcHlza2lwLnR4dCI7CitteSBAZmlsZXMgPSBgJGNvbW1hbmRgOworQGZpbGVzID0gZ3JlcCghLyRpZ25vcmUvLCBAZmlsZXMpOworbXkgJGZpbGU7Citmb3JlYWNoICRmaWxlIChAZmlsZXMpIHsKKyAgY2hvbXAgJGZpbGU7CisgIG15IEBsaW5lcyA9IGBoZWFkIC1uIDIwICIkZmlsZSJgOworICBpZiAoZ3JlcCgvY29weXJpZ2h0LiooaW50ZXJuYXRpb25hbHxpYm0pL2ksIEBsaW5lcykgPT0gMCkgeworICAgIHByaW50ICIkZmlsZVxuIjsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9jcHlzZWFyY2gvY3B5c2VhcmNoLnBsIGIvc2NyaXB0cy9jcHlzZWFyY2gvY3B5c2VhcmNoLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjgxMzBmOTMKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2NweXNlYXJjaC9jcHlzZWFyY2gucGwKQEAgLTAsMCArMSwzMyBAQAorIyEvdXNyL2Jpbi9wZXJsIC13CisjICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIyAgKiBDT1BZUklHSFQ6CisjICAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA5LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uCisjICAqIGFuZCBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIworIyBTZWFyY2ggZm9yIGZpbGVzIG1vZGlmaWVkIHRoaXMgeWVhciwgdGhhdCBuZWVkIHRvIGhhdmUgY29weXJpZ2h0IGluZGljYXRpbmcKKyMgdGhpcyBjdXJyZW50IHllYXIgb24gdGhlbS4KKyMKK3VzZSBzdHJpY3Q7CisKK215ICRpY3VTb3VyY2UgPSAkQVJHVlswXTsKK2RpZSAiQ2FuJ3Qgb3BlbiBJQ1UgZGlyOiAkaWN1U291cmNlIiB1bmxlc3MgIC1kICRpY3VTb3VyY2UgOworCitteSAkaWdub3JlID0gIkNWU3xcXC5zdm58XFx+fFxcI3xEZWJ1Z3xSZWxlYXNlfFxcLmRsbHxcXC5pbGt8XFwuaWRifFxcLnBkYnxcXC5kc3B8XFwuZHN3fFxcLm9wdHxcXC5uY2J8XFwudmNwcm9qfFxcLnNsbnxcXC5zdW98XFwuY3ZzaWdub3JlfFxcLmNudnxcXC5yZXN8XFwuaWN1fFxcLmV4ZXxcXC5vYmp8XFwuYmlufFxcLmV4cHxcXC5saWJ8XFwub3V0fFxcLnBsZ3xwb3NpdGlvbnN8dW5pZGF0YXxcXC5qYXJ8XFwuc3BwfFxcLnN0dWJ8XFwucG9saWN5fFxcLnR0ZnxcXC5UVEZ8XFwub3RmIjsKKworbXkgKCRzZWMsICRtaW4sICRob3VyLCAsICRkYXksICRtb24sICR5ZWFyLCAkd2RheSwgJHlkYXksICRpc2RzdCkgPSBsb2NhbHRpbWU7CiskeWVhciArPSAxOTAwOworaWYgKCAhIC1mICJjcHlza2lwLnR4dCIgKSB7CisJZGllICJDYW4ndCBvcGVuIGNweXNraXAudHh0LCBwbGVhc2UgZG93bmxvYWQgZnJvbSBodHRwOi8vc291cmNlLmljdS1wcm9qZWN0Lm9yZy9jcHlza2lwLnR4dCAoc2VlIGh0dHA6Ly9zaXRlLmljdS1wcm9qZWN0Lm9yZy9wcm9jZXNzZXMvY29weXJpZ2h0LXNjYW4gZm9yIG1vcmUgZGV0YWlscykiCit9CitteSAkY29tbWFuZCA9ICJmaW5kICRpY3VTb3VyY2UgLXR5cGUgZiAtbXRpbWUgLSR5ZGF5IHwgZmdyZXAgLXYgLWYgY3B5c2tpcC50eHQiOworbXkgQGZpbGVzID0gYCRjb21tYW5kYDsKK0BmaWxlcyA9IGdyZXAoIS8kaWdub3JlLywgQGZpbGVzKTsKK215ICRmaWxlOworZm9yZWFjaCAkZmlsZSAoQGZpbGVzKSB7CisgIGNob21wICRmaWxlOworICBteSBAbGluZXMgPSBgaGVhZCAtbiAyMCAiJGZpbGUiYDsKKyAgaWYgKGdyZXAoL2NvcHlyaWdodC4qJHllYXIvaSwgQGxpbmVzKSA9PSAwKSB7CisgICAgcHJpbnQgIiRmaWxlXG4iOworICB9Cit9CmRpZmYgLS1naXQgYS9zY3JpcHRzL2NweXNlYXJjaC9yZWFkbWUudHh0IGIvc2NyaXB0cy9jcHlzZWFyY2gvcmVhZG1lLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODdkZTdmCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9jcHlzZWFyY2gvcmVhZG1lLnR4dApAQCAtMCwwICsxLDE4IEBACitDb3B5cmlnaHQgKGMpIDIwMDItMjAwOSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCitjcHlzZWFyY2gucGwgaXMgYSBwZXJsIHNjcmlwdCB1c2VkIHRvIGRldGVjdCB0aGUgZmlsZXMgdGhhdCBtaWdodCBub3QgaGF2ZSB0aGUgY29weXJpZ2h0IG5vdGljZS4gQmVzdCB3aGVuIHVzZWQgb24gd2luZG93cyBvbiBhIGNsZWFuIGNoZWNrb3V0LiBFZGl0ICRpY3VTb3VyY2UgdG8geW91ciBwYXRoLiBJZiB5b3UgYXJlIHdvcmtpbmcgb24gb3RoZXIgcGxhdGZvcm0sIHlvdSBwcm9iYWJseSB3YW50IHRvIGVkaXQgJGlnbm9yZSB0byByZWZsZWN0IGRpZmZlcmVudCB0ZW1wb3JhcnkgZmlsZXMgdGhhdCB5b3UgZG9uJ3Qgd2FudCBpbiB0aGUgc2Nhbi4gVGhlIHJlc3VsdCB3aWxsIGJlIHRoZSBsaXN0IG9mIGZpbGVzIHRoYXQgZG9uJ3QgaGF2ZSB3b3JkIGNvcHlyaWdodCAoY2FzZSBpZ25vcmVkKSBpbiBmaXJzdCAxMCBsaW5lcy4gTG9vayBhdCB0aGVtIGFuZCBmaXggaWYgbmVlZGVkLiAKKworY3B5c2VhcmNoLnBsICBzZWFyY2hlcyBmb3IgZmlsZXMgbW9kaWZpZWQgdGhpcyB5ZWFyIHRoYXQgZG9uJ3QgaGF2ZSB0aGUKKyAgY29ycmVjdCB5ZWFyIGNvcHlyaWdodCAoaS5lLiAnY29weXJpZ2h0IDE5OTUnKSAKKworY3B5c2Nhbi5wbCAgICBzZWFyY2hlcyBmb3IgYWxsIGZpbGVzIHRoYXQgZG9uJ3QgaGF2ZSBhbnkgY29weXJpZ2h0CisKK2NweXNraXAudHh0ICBpcyBwYXJ0IG9mIHRoZSBpZ25vcmUgbGlzdC4gRG93bmxvYWQgdGhlIGxhdGVzdCBmcm9tCisgICBodHRwOi8vc291cmNlLmljdS1wcm9qZWN0Lm9yZy9jcHlza2lwLnR4dAorCittb3JlIGRvY3Mgb24gY29weXJpZ2h0IHNjYW4gYXQ6CisgICBodHRwOi8vc2l0ZS5pY3UtcHJvamVjdC5vcmcvcHJvY2Vzc2VzL2NvcHlyaWdodC1zY2FuCisKKworSGF2ZSBmdW4hCit3ZWl2CmRpZmYgLS1naXQgYS9zY3JpcHRzL2ljdXJ1biBiL3NjcmlwdHMvaWN1cnVuCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM1NTYwODYKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2ljdXJ1bgpAQCAtMCwwICsxLDE0OCBAQAorIyEvYmluL3NoCisKKyMgQ29weXJpZ2h0IChDKSAyMDExIElCTSBDb3Jwb3JhdGlvbiBhbmQgT3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBUaGlzIGlzIGRlc2lnbmVkIGZvciBidWlsZGluZyBhbmQgcnVubmluZyBzaW5nbGUtc291cmNlLWZpbGUgSUNVIHByb2dyYW1zLgorIworIyBJbiBpdHMgc2ltcGxlc3QgdXNhZ2UsICBzaW1wbHkgdHlwZToKKyMKKyMgICAgIGljdXJ1biAgeW91cnByb2dyYW0uYyAKKyMgICAgICAgKG9yIC5jcHAgaWYgaXQgaXMgYSBDKysgcHJvZ3JhbSkgCisjCisjICBUaGUgdG9vbCB3aWxsIGNvbXBpbGUgYW5kIHRoZW4gcnVuIHRoZSBwcm9ncmFtCisjCisjICBGSU5ESU5HIElDVQorIyAgVG8gZmluZCBJQ1UsIHRoZSBmb2xsb3dpbmcgc2VhcmNoIG9yZGVyIGlzIHVzZWQgYnkgcHJpb3JpdHk6CisjCisjICAxKSAgICAiLWkgPHBhdGg+IiAuLiB0aGUgPHBhdGg+IHdpbGwgYmUgc2VhcmNoZWQgZm9yIGVpdGhlciBhIGRpcmVjdCBwYXRoIHRvIGljdS1jb25maWcsCisjICAgICAgICAgICAgb3IgYSBkaXJlY3RvcnkgY29udGFpbmluZyBpdCwgb3IgYSBkaXJlY3RvcnkgY29udGFpbmluZyAnL2JpbicgY29udGFpbmluZyBpdC4KKyMgICAgICAgIEluIG90aGVyIHdvcmRzLCBpZiBpY3UtY29uZmlnIGlzICAvb3B0L2xvY2FsL2Jpbi9pY3UtY29uZmlnLCBhbnkgb2YgdGhlIGZvbGxvd2luZyB3aWxsIHdvcms6CisjICAgICAgICAgICAgICAgICAtaSAvb3B0L2xvY2FsCisjICAgICAgICAgICAgICAgICAtaSAvb3B0L2xvY2FsL2JpbgorIyAgICAgICAgICAgICAgICAgLWkgL29wdC9sb2NhbC9iaW4vaWN1LWNvbmZpZworIworIyAgMikgICAgSWYgdGhlcmUgaXMgYW4gZXhlY3V0YWJsZSB+Ly5pY3VydW5yYyBzY3JpcHQsIGl0IGNhbiBzZXQgdGhlIHZhcmlhYmxlICJJQ1VfQ09ORklHIiB0byBwb2ludAorIyAgICAgICAgZGlyZWN0bHkgdG8gdGhlIGljdS1jb25maWcgZmlsZS4KKyMgICAgICAgIEFuIGV4YW1wbGUgfi8uaWN1cnVucmMgc2NyaXB0ICBjb250YWlucyBqdXN0IHRoaXMgbGluZToKKyMgICAgICAgICAgICAgICAKKyMgICAgICAgICAgICAgIElDVV9DT05GSUc9L2hvbWUvc3JsL0UvSUkvYmluL2ljdS1jb25maWcKKyMKKyMgIDMpICAgIElDVV9DT05GSUcgY2FuIGJlIHNldCBpbiB0aGUgZW52aXJvbm1lbnQgdG8gcG9pbnQgdG8gaWN1LWNvbmZpZyAgKCBpdCdzIG92ZXJyaWRkZW4gYnkgdGhlIC5pY3VydW5yYyBzY3JpcHQgKQorIworIyAgNCkgICAgaWYgImljdS1jb25maWciIGlzIG9uIHRoZSBQQVRILCBpdCB3aWxsIGJlIHVzZWQuCisjCisjIAorIyAgUlVOTklORworIyAgIEFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cyBmb2xsb3dpbmcgdGhlIGZpbGUgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGFwcGxpY2F0aW9uLgorIworIyAgVE9ETworIyAgICogc2hvdWxkIHN1cHBvcnQgcGtnLWNvbmZpZywgd2hpY2ggaXMgcHJlZmVycmVkIG92ZXIgaWN1LWNvbmZpZywgYWx0aG91Z2ggaWN1LWNvbmZpZyBtYWtlcyB0aGlzIHVzYWdlCisjICAgICBlYXNpZXIKKyMKKyMgICAqIG5lZWQgdG8gdGVzdCB0aGUgJFBBVEggYW5kICRJQ1VfQ09ORklHIHVzYWdlIG1vZGVscworCitTQ1JJUFRWRVI9JyRSZXZpc2lvbiQnCisKKworSUNVX09WRVJSSURFPSIiCisKK3VzYWdlKCkKK3sKKyAgICBlY2hvICJTY3JpcHQgVmVyc2lvbiAke1NDUklQVFZFUn0iCisgICAgZWNobyAiVXNhZ2U6ICQwIFsgLWkgL3BhdGgvdG8vaWN1IHwgLWkgL3BhdGgvdG8vaWN1LWNvbmZpZyBdICBmaWxlLmN7cHB9IFsgcHJvZ3JhbSBhcmdzIC4uLl0iCit9CisKK2lmIFsgJCMgLWx0IDEgXTsKK3RoZW4KKyAgICAgICAgdXNhZ2UKKyAgICAgICAgZXhpdCAxCitmaQorCitpZiBbICIkMSIgPT0gIi0/IiAtbyAkMSA9PSAiLWgiIF07Cit0aGVuCisgICAgICAgIHVzYWdlCisgICAgICAgIGV4aXQgMAorZmkKKworCitpZiBbICQxID09ICItaSIgXTsKK3RoZW4KKyAgICAgICAgc2hpZnQKKyAgICAgICAgSUNVX09WRVJSSURFPSQxCisgICAgICAgIHNoaWZ0CitmaQorCitpZiBbICEgLXggIiR7SUNVX0NPTkZJR30iIF07Cit0aGVuCisgICAgSUNVX0NPTkZJRz1gd2hpY2ggaWN1LWNvbmZpZyAyPi9kZXYvbnVsbCB8fCBlY2hvYAorZmkKKworCisjIG5vdywgc2VhcmNoCitpZiBbIC14IH4vLmljdXJ1bnJjIF07Cit0aGVuCisgICAgICAgIC4gfi8uaWN1cnVucmMKK2ZpCisKK2lmIFsgIngke0lDVV9PVkVSUklERX0iICE9ICJ4IiBdOwordGhlbgorICAgICAgICBpZiBbIC1mICIke0lDVV9PVkVSUklERX0iIC1hIC14ICIke0lDVV9PVkVSUklERX0iIF07CisgICAgICAgIHRoZW4KKyAgICAgICAgICAgICAgICBJQ1VfQ09ORklHPSIke0lDVV9PVkVSUklERX0iCisgICAgICAgIGVsaWYgWyAteCAiJHtJQ1VfT1ZFUlJJREV9L2ljdS1jb25maWciIF07CisgICAgICAgIHRoZW4KKyAgICAgICAgICAgICAgICBJQ1VfQ09ORklHPSIke0lDVV9PVkVSUklERX0vaWN1LWNvbmZpZyIKKyAgICAgICAgZWxpZiBbIC14ICIke0lDVV9PVkVSUklERX0vYmluL2ljdS1jb25maWciIF07CisgICAgICAgIHRoZW4KKyAgICAgICAgICAgICAgICBJQ1VfQ09ORklHPSIke0lDVV9PVkVSUklERX0vYmluL2ljdS1jb25maWciCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBlY2hvICIkMDogRG9uJ3Qga25vdyB3aGF0IHRvIGRvIHdpdGggJElDVV9PVkVSUklERSAtIG5vdCBhbiBleGVjdXRhYmxlIG9yIGEgZGlyZWN0b3J5IiA+JjIKKyAgICAgICAgICAgICAgICBleGl0IDEKKyAgICAgICAgZmkKK2ZpCisKK2lmIFsgISAteCAiJHtJQ1VfQ09ORklHfSIgXTsKK3RoZW4KKyAgICAgICAgZWNobyAiJDA6IEVycm9yOiBcIiR7SUNVX0NPTkZJR31cIiBpcyBub3QgYW4gaWN1LWNvbmZpZyBzY3JpcHQuIEJhaWxpbmcuIiA+JjIKKyAgICAgICAgZXhpdCAxCitmaQorCitlY2hvICdJQ1UgJyBgJHtJQ1VfQ09ORklHfSAtLXZlcnNpb25gIGAke0lDVV9DT05GSUd9IC0tcHJlZml4YAorCitGSUxFPSQxCitzaGlmdAorCitpZiBbICEgLWYgIiR7RklMRX0iIF07Cit0aGVuCisgICAgZWNobyAiJDA6IENhbid0IG9wZW4gJHtGSUxFfSIgPiYyCisgICAgdXNhZ2UKKyAgICBleGl0IDEKK2ZpCisKK0NQUE9QVFM9Ii0tY3BwZmxhZ3MiCitMSU5LT1BUUz0iLS1sZGZsYWdzIC0tbGRmbGFncy1pY3VpbyIKKworCitjYXNlICIke0ZJTEV9IiBpbgorICAgICAqLmNwcCkKKyAgICAgICAgQ09NUD1gJHtJQ1VfQ09ORklHfSAtLWN4eCAtLWN4eGZsYWdzICR7Q1BQT1BUU30gJHtMSU5LT1BUU31gCisgICAgICAgIE9VVD1gYmFzZW5hbWUgJHtGSUxFfSAuY3BwYAorICAgICA7OworCisgICAgICouYykKKyAgICAgICAgQ09NUD1gJHtJQ1VfQ09ORklHfSAtLWNjIC0tY2ZsYWdzICR7Q1BQT1BUU30gJHtMSU5LT1BUU31gCisgICAgICAgIE9VVD1gYmFzZW5hbWUgJHtGSUxFfSAuY2AKKyAgICAgOzsKKworICAgICAqKQorICAgICAgICBlY2hvICIkMDogZXJyb3IsIGRvbid0IGtub3cgd2hhdCB0byBkbyB3aXRoICR7RklMRX0iID4mMgorICAgICAgICBleGl0IDEKKyAgICAgOzsKK2VzYWMKKworZWNobyAiIyAke0NPTVB9IiAtbyAiJHtPVVR9IiAiJHtGSUxFfSIKKyR7Q09NUH0gLW8gIiR7T1VUfSIgIiR7RklMRX0iIHx8IChybSAtZiAiJHtPVVR9IiA7IGV4aXQgMSkKK0lOVk9LRT1gJHtJQ1VfQ09ORklHfSAtLWludm9rZT0uLyR7T1VUfWAKK2VjaG8gIiMgJHtJTlZPS0V9IgorIiR7U0hFTEx9IiAtYyAiJHtJTlZPS0V9IiAiJEAiCisKZGlmZiAtLWdpdCBhL3RyYWMvSWN1Q29kZVRvb2xzLzAuMTEvaWN1Y29kZXRvb2xzL19faW5pdF9fLnB5IGIvdHJhYy9JY3VDb2RlVG9vbHMvMC4xMS9pY3Vjb2RldG9vbHMvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODJkNjc1NgotLS0gL2Rldi9udWxsCisrKyBiL3RyYWMvSWN1Q29kZVRvb2xzLzAuMTEvaWN1Y29kZXRvb2xzL19faW5pdF9fLnB5CkBAIC0wLDAgKzEsNSBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KKyMgQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSUJNIGFuZCBPdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyMKKyMKKyNmcm9tIGljdXRyYWN4dG4ud2ViX3VpIGltcG9ydCAqCmRpZmYgLS1naXQgYS90cmFjL0ljdUNvZGVUb29scy8wLjExL2ljdWNvZGV0b29scy9kY3V0LnB5IGIvdHJhYy9JY3VDb2RlVG9vbHMvMC4xMS9pY3Vjb2RldG9vbHMvZGN1dC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wYjc0ODZmCi0tLSAvZGV2L251bGwKKysrIGIvdHJhYy9JY3VDb2RlVG9vbHMvMC4xMS9pY3Vjb2RldG9vbHMvZGN1dC5weQpAQCAtMCwwICsxLDE1MSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBJQk0gYW5kIE90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitpbXBvcnQgcmUKKworZnJvbSB0cmFjLmNvcmUgaW1wb3J0ICoKK2Zyb20gdHJhYy51dGlsIGltcG9ydCBNYXJrdXAKK2Zyb20gdHJhYy53ZWIgaW1wb3J0IElSZXF1ZXN0SGFuZGxlcgorZnJvbSB0cmFjLndlYi5jaHJvbWUgaW1wb3J0IGFkZF9zdHlsZXNoZWV0LCBJTmF2aWdhdGlvbkNvbnRyaWJ1dG9yLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVRlbXBsYXRlUHJvdmlkZXIKK2Zyb20gdHJhYy53ZWIuaHJlZiBpbXBvcnQgSHJlZgorI2Zyb20gdHJhYy52ZXJzaW9uY29udHJvbC53ZWJfdWkuY2hhbmdlc2V0IGltcG9ydCBJQ2hhbmdlc2V0UmFuZ2VMaW5rCitmcm9tIHRyYWMud2lraSBpbXBvcnQgd2lraV90b19odG1sLCB3aWtpX3RvX29uZWxpbmVyLCBJV2lraVN5bnRheFByb3ZpZGVyLCBcCisgICAgICAgICAgICAgICAgICAgICAgRm9ybWF0dGVyCisKKworY2xhc3MgRGN1dE1vZHVsZShDb21wb25lbnQpOgorCisgICAgaW1wbGVtZW50cyhJUmVxdWVzdEhhbmRsZXIpCisjICAgIGltcGxlbWVudHMoSVJlcXVlc3RIYW5kbGVyLElDaGFuZ2VzZXRSYW5nZUxpbmspCisKKyAgICBkZWYgcmV2aXNpb25fcmFuZ2VfbGluayhzZWxmLCByZXEsIGJhc2UsIHN0YXJ0LCBlbmQpOgorICAgICAgICByZXR1cm4gKCdEQ1VUIEhlbHBlcicsIHJlcS5ocmVmKCdkY3V0JyxvbGRfcGF0aD1iYXNlLG5ld19wYXRoPWJhc2Usb2xkPXN0YXJ0LG5ldz1lbmQpKQorCisgICAgX3JlcXVlc3RfcmUgPSByZS5jb21waWxlKHIiL2RjdXQoPzovKFteL10rKSk/KC8uKik/JCIpCisKKyAgICBkZWYgbWF0Y2hfcmVxdWVzdChzZWxmLCByZXEpOgorICAgICAgICBtYXRjaCA9IHJlLm1hdGNoKHNlbGYuX3JlcXVlc3RfcmUsIHJlcS5wYXRoX2luZm8pCisgICAgICAgIGlmIG1hdGNoOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBwcm9jZXNzX3JlcXVlc3Qoc2VsZiwgcmVxKToKKworICAgICAgICBpZHggPSAwCisgICAgICAgICMgc3JsCisjICAgICAgICBzaG93X2ZpbGVzID0gc2VsZi50aW1lbGluZV9zaG93X2ZpbGVzCisgICAgICAgIGRiID0gc2VsZi5lbnYuZ2V0X2RiX2NueCgpCisgICAgICAgIHRpY2tldGxpc3QgPSB7fSAgIyBkaWN0IG9mIHRpY2tldC0+Pz8/CisgICAgICAgIHJldmxpc3QgPSB7fSAjIGRpY3Qgb2YgcmV2aXNpb24tPgorICAgICAgICAjIHdlbGwuIGNoZWNrIGl0IGFnYWluLC4KKyAgICAgICAgICAgIAorICAgICAgICBzcmxkZWJ1Zz1GYWxzZQorICAgICAgICAKKyAgICAgICAgcmVwb3MgPSBzZWxmLmVudi5nZXRfcmVwb3NpdG9yeShyZXEuYXV0aG5hbWUpCisgICAgICAgIAorICAgICAgICBuZXdfcGF0aCA9IHJlcS5hcmdzLmdldCgnbmV3X3BhdGgnKQorICAgICAgICBuZXdfcmV2ID0gcmVxLmFyZ3MuZ2V0KCduZXcnKQorICAgICAgICBvbGRfcGF0aCA9IHJlcS5hcmdzLmdldCgnb2xkX3BhdGgnKQorICAgICAgICBvbGRfcmV2ID0gcmVxLmFyZ3MuZ2V0KCdvbGQnKQorCisgICAgICAgIG5ld19wYXRoID0gcmVwb3Mubm9ybWFsaXplX3BhdGgobmV3X3BhdGgpCisgICAgICAgIG5ld19yZXYgPSByZXBvcy5ub3JtYWxpemVfcmV2KG5ld19yZXYpCisgICAgICAgIG9sZF9wYXRoID0gcmVwb3Mubm9ybWFsaXplX3BhdGgob2xkX3BhdGgpCisgICAgICAgIG9sZF9yZXYgPSByZXBvcy5ub3JtYWxpemVfcmV2KG9sZF9yZXYpCisKKyAgICAgICAgb2xkX3JldiA9IGludChvbGRfcmV2KQorICAgICAgICBuZXdfcmV2ID0gaW50KG5ld19yZXYpCisgICAgICAgIAorICAgICAgICByZXEuaGRmWydjaGFuZ2VzZXQuZGlmZl9ocmVmJ10gPSByZXEuaHJlZignY2hhbmdlc2V0JyxvbGRfcGF0aD1vbGRfcGF0aCxuZXc9bmV3X3JldixuZXdfcGF0aD1uZXdfcGF0aCxvbGQ9b2xkX3JldikKKworICAgICAgICByZXEuaGRmWydpc19kY3V0J109MQorICAgICAgICAKKyAgICAgICAgcmVxLmhkZlsnY2hhbmdlc2V0Lm9sZF9yZXYnXSA9IG9sZF9yZXYKKyAgICAgICAgcmVxLmhkZlsnY2hhbmdlc2V0Lm5ld19yZXYnXSA9IG5ld19yZXYKKyAgICAgICAgcmVxLmhkZlsnY2hhbmdlc2V0Lm9sZF9wYXRoJ10gPSBvbGRfcGF0aAorICAgICAgICByZXEuaGRmWydjaGFuZ2VzZXQubmV3X3BhdGgnXSA9IG5ld19wYXRoCisKKyAgICAgICAgaWYgVHJ1ZToKKyAgICAgICAgICAgIHJlcS5oZGZbJ3RhcmdldF9wYXRoJ10gPSAnLic7CisgICAgICAgICAgICAjIG9rYXkuIG1hbnVhbGx5IHRyb21wIHRocm91Z2ggJ2VtCisgICAgICAgICAgICBucmV2ID0gb2xkX3JldisxCisgICAgICAgICAgICB3aGlsZSBucmV2IDw9IG5ld19yZXY6CisgICAgICAgICAgICAgICAgY2hnc2V0ID0gcmVwb3MuZ2V0X2NoYW5nZXNldChucmV2KQorICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBjaGdzZXQubWVzc2FnZSBvciAnLS0nCisgICAgICAgICAgICAgICAgIyBjYW4gd2UgbG9hZCBhIHRpY2tldCBmcm9tIGl0PworICAgICAgICAgICAgICAgIHNwbGl0cz1tZXNzYWdlLnNwbGl0KCc6JykKKyAgICAgICAgICAgICAgICBpZiBtZXNzYWdlLnN0YXJ0c3dpdGgoJ3RpY2tldDonKSBhbmQgbGVuKHNwbGl0cyk+MjoKKyAgICAgICAgICAgICAgICAgICAgdGlja25hbWU9c3BsaXRzWzFdCisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpY2tudW09aW50KHRpY2tuYW1lKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uLGU6CisgICAgICAgICAgICAgICAgICAgICAgICBucmV2ID0gbnJldisxCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAjIHllcywgd2UgaGF2ZSBhIHRpY2tldCAjCisgICAgICAgICAgICAgICAgICAgIGZpbGVzPVtdCisgICAgICAgICAgICAgICAgICAgIGZvciBjaGcgaW4gY2hnc2V0LmdldF9jaGFuZ2VzKCk6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgY2hnWzBdLnN0YXJ0c3dpdGgob2xkX3BhdGgpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICBmaWxlcy5hcHBlbmQoY2hnKQorICAgICAgICAgICAgICAgICAgICBpZiBsZW4oZmlsZXMpPT0wOgorICAgICAgICAgICAgICAgICAgICAgICAgbnJldiA9IG5yZXYrMQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgIyBubyByZWxldmFudCBmaWxlcworICAgICAgICAgICAgICAgICAgICB0aXRlbT0odGlja251bSxmaWxlcyxjaGdzZXQpCisgICAgICAgICAgICAgICAgICAgIGlmIHRpY2tudW0gaW4gdGlja2V0bGlzdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpY2tldGxpc3RbdGlja251bV0uYXBwZW5kKCB0aXRlbSApCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICB0aWNrZXRsaXN0W3RpY2tudW1dPVsgdGl0ZW0gXQorICAgICAgICAgICAgICAgICAgICByZXZsaXN0W25yZXZdPXRpdGVtCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgIm1hbGZvcm1lZCB0aWNrZXQ/ICVzIGF0ICVkIiAlIChtZXNzYWdlLG5yZXYpICMgZG9uJ3Qga25vdyB0aGUgc3ludGF4IGZvciBkaWUuLgorICAgICAgICAgICAgICAgIG5yZXYgPSBucmV2KzEKKyAgICAgICAgICAgIGlmIGxlbih0aWNrZXRsaXN0KToKKyAgICAgICAgICAgICAgICB0aWNrZXRzPXRpY2tldGxpc3Qua2V5cygpCisgICAgICAgICAgICAgICAgdGlja2V0cy5zb3J0KCkKKyAgICAgICAgICAgICAgICBmb3IgdGlja2V0IGluIHRpY2tldHM6CisgICAgICAgICAgICAgICAgICAgIGF0aWNrZXQ9dGlja2V0bGlzdFt0aWNrZXRdICAjICh0aWNrZXQsZmlsZXMsY2hnKQorICAgICAgICAgICAgICAgICAgICBjbXQgPSAndGlja2V0OiVkIC0gJWQgcmV2czogJyAlICh0aWNrZXQsbGVuKGF0aWNrZXQpKQorICAgICAgICAgICAgICAgICAgICBmb3IgcmV2IGluIGF0aWNrZXQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXZuID0gcmV2WzJdLnJldgorICAgICAgICAgICAgICAgICAgICAgICAgZmlsZWNvdW50ID0gbGVuKHJldlsxXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNtdCA9IGNtdCArICdyJWQgLSAlZCBmaWxlcyAoJyAlIChyZXZuLGZpbGVjb3VudCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciBmaWxlIGluIHJldlsxXToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXQgPSBjbXQgKyBmaWxlWzBdICsgJyAnCisgICAgICAgICAgICAgICAgICAgICAgICBjbXQgPSBjbXQgKyAnKSAnCisgICAgICAgICAgICAgICAgICAgIHJlcS5oZGZbJ3RpY2tldHMuJWQuY29tbWVudCcgJSB0aWNrZXRdID0gd2lraV90b19vbmVsaW5lcihjbXQsIHNlbGYuZW52LCBkYiwgIHNob3J0ZW49RmFsc2UpCisgICAgICAgICAgICAgICAgICAgIHJlcS5oZGZbJ3RpY2tldHMuJWQubnVtYmVyJyAlIHRpY2tldF0gPSB0aWNrZXQKKyAgICAgICAgICAgIGlmIGxlbihyZXZsaXN0KToKKyAgICAgICAgICAgICAgICByZXZzPXJldmxpc3Qua2V5cygpCisgICAgICAgICAgICAgICAgcmV2cy5zb3J0KCkKKyAgICAgICAgICAgICAgICBmb3IgcmV2IGluIHJldnM6CisgICAgICAgICAgICAgICAgICAgIGFyZXY9cmV2bGlzdFtyZXZdICAjICh0aWNrZXQsZmlsZXMsY2hnKQorICAgICAgICAgICAgICAgICAgICBjbXQgPSAnciVkIHRpY2tldDolZCAnICUgKGFyZXZbMl0ucmV2LGFyZXZbMF0pCisgICAgICAgICAgICAgICAgICAgIGZpbGVjb3VudCA9IGxlbihhcmV2WzFdKQorICAgICAgICAgICAgICAgICAgICBjbXQgPSBjbXQgKyAnIC0gJWQgZmlsZXMgKCcgJSBmaWxlY291bnQKKyAgICAgICAgICAgICAgICAgICAgc2hvcnRmaWxlcz0nJworICAgICAgICAgICAgICAgICAgICBqID0gMAorICAgICAgICAgICAgICAgICAgICBmb3IgZmlsZSBpbiBhcmV2WzFdOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVxLmhkZlsncmV2cy4lZC5maWxlcy4lZC5wYXRoJyAlIChyZXYsaildID0gZmlsZVswXQorICAgICAgICAgICAgICAgICAgICAgICAgcmVxLmhkZlsncmV2cy4lZC5maWxlcy4lZC5raW5kJyAlIChyZXYsaildID0gZmlsZVsxXQorICAgICAgICAgICAgICAgICAgICAgICAgcmVxLmhkZlsncmV2cy4lZC5maWxlcy4lZC5jaGFuZ2UnICUgKHJldixqKV0gPSBmaWxlWzJdCisgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydHBhdGg9ZmlsZVswXVtsZW4ob2xkX3BhdGgpKzE6XQorICAgICAgICAgICAgICAgICAgICAgICAgcmVxLmhkZlsncmV2cy4lZC5maWxlcy4lZC5zaG9ydHBhdGgnICUgKHJldixqKV0gPSBzaG9ydHBhdGgKKyAgICAgICAgICAgICAgICAgICAgICAgIGNtdCA9IGNtdCArIGZpbGVbMF0gKyAnICcKKyAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0ZmlsZXMgPSBzaG9ydGZpbGVzICsgJyAnICsgc2hvcnRwYXRoCisgICAgICAgICAgICAgICAgICAgICAgICBqPWorMQorICAgICAgICAgICAgICAgICAgICBjbXQgPSBjbXQgKyAnKSAnCisgICAgICAgICAgICAgICAgICAgIHJlcS5oZGZbJ3JldnMuJWQuY29tbWVudCcgJSByZXZdID0gd2lraV90b19vbmVsaW5lcihjbXQsIHNlbGYuZW52LCBkYiwgIHNob3J0ZW49RmFsc2UpCisgICAgICAgICAgICAgICAgICAgIHJlcS5oZGZbJ3JldnMuJWQubnVtYmVyJyAlIHJldl0gPSByZXYKKyAgICAgICAgICAgICAgICAgICAgcmVxLmhkZlsncmV2cy4lZC5zaG9ydGZpbGVzJyAlIHJldl0gPSBzaG9ydGZpbGVzCisgICAgICAgICAgICAgICAgICAgIHJlcS5oZGZbJ3JldnMuJWQuYmFja251bWJlcicgJSByZXZdID0gKHJldi0xKQorICAgICAgICAgICAgICAgICAgICByZXEuaGRmWydyZXZzLiVkLnRpY2tldCcgJSByZXZdID0gYXJldlswXQorCisKKyMgICAgICAgIGlmIGlzaW5zdGFuY2UodGVtcGxhdGUsIGJhc2VzdHJpbmcpOgorIyAgICAgICAgICAgIHJlcS5oZGZbJ2FkbWluLnBhZ2VfdGVtcGxhdGUnXSA9IHRlbXBsYXRlCisjICAgICAgICBlbHNlOgorIyAgICAgICAgICAgIHJlcS5oZGZbJ2FkbWluLnBhZ2VfY29udGVudCddID0gTWFya3VwKHRlbXBsYXRlLnJlbmRlcigpKQorCisgICAgICAgIGNvbnRlbnRfdHlwZSA9ICJ0ZXh0L2h0bWwiCisgICAgICAgIGFkZF9zdHlsZXNoZWV0KHJlcSwgJ2Nzcy9pY3V4dG4uY3NzJykKKyAgICAgICAgcmV0dXJuICdkY3V0LmNzJywgY29udGVudF90eXBlCisKZGlmZiAtLWdpdCBhL3RyYWMvSWN1Q29kZVRvb2xzLzAuMTEvaWN1Y29kZXRvb2xzL2h0ZG9jcy9jc3MvaWN1eHRuLmNzcyBiL3RyYWMvSWN1Q29kZVRvb2xzLzAuMTEvaWN1Y29kZXRvb2xzL2h0ZG9jcy9jc3MvaWN1eHRuLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmUwOTAzCi0tLSAvZGV2L251bGwKKysrIGIvdHJhYy9JY3VDb2RlVG9vbHMvMC4xMS9pY3Vjb2RldG9vbHMvaHRkb2NzL2Nzcy9pY3V4dG4uY3NzCkBAIC0wLDAgKzEsMzAgQEAKKy8qIENvcHlyaWdodCAoQykgMjAxMCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICovCisKKy8qIEBvdmVycmlkZSBodHRwOi8vdW5pY29kZS5vcmcvY2xkci90cmFjL2Nocm9tZS9pY3Vjb2RldG9vbHMvY3NzL2ljdXh0bi5jc3MgKi8KKworCit0YWJsZS5pY3VyZXZpZXcgeworCWJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7CisJYm9yZGVyOiAgMXB4IHNvbGlkIGdyYXk7Cit9CisKK3RhYmxlLmljdXJldmlldyB0aCwgdGFibGUuaWN1cmV2aWV3IHRkIHsKKwl0ZXh0LWFsaWduOiBsZWZ0OworCWJvcmRlcjogIDFweCBzb2xpZCBncmF5OworCXBhZGRpbmc6ICAycHg7Cit9CisKK3RhYmxlLmljdXJldmlldyB0aGVhZCB0aCB7CisJZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CisKK3RhYmxlLmljdXJldmlldyB0ZC5jaGFuZ2VzIHsKKwl0ZXh0LWFsaWduOiByaWdodDsKK30KKwordGFibGUuaWN1cmV2aWV3IHRkLm92ZXJhbGwgIHsKKwliYWNrZ3JvdW5kLWNvbG9yOiBzaWx2ZXI7CisJZm9udC1zdHlsZTogaXRhbGljOworCXRleHQtYWxpZ246IHJpZ2h0OworfQorCmRpZmYgLS1naXQgYS90cmFjL0ljdUNvZGVUb29scy8wLjExL2ljdWNvZGV0b29scy9yZXZpZXcucHkgYi90cmFjL0ljdUNvZGVUb29scy8wLjExL2ljdWNvZGV0b29scy9yZXZpZXcucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWNiZjY0OQotLS0gL2Rldi9udWxsCisrKyBiL3RyYWMvSWN1Q29kZVRvb2xzLzAuMTEvaWN1Y29kZXRvb2xzL3Jldmlldy5weQpAQCAtMCwwICsxLDI5NiBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyMgUmV2aWV3IG1vZHVsZS4KKyMgVE9ETzogcmVmYWN0b3IgdGlja2V0IG1hbmlwdWxhdGlvbiBpdGVtcyBpbnRvIHRpY2tldG1nci4KKworaW1wb3J0IHJlCisKK2Zyb20gdHJhYy5jb3JlIGltcG9ydCBDb21wb25lbnQsIGltcGxlbWVudHMKK2Zyb20gdHJhYy5jb3JlIGltcG9ydCBDb21wb25lbnRNYW5hZ2VyCitmcm9tIHRyYWMuY29yZSBpbXBvcnQgVHJhY0Vycm9yCitmcm9tIHRyYWMudXRpbCBpbXBvcnQgTWFya3VwCitmcm9tIHRyYWMud2ViIGltcG9ydCBJUmVxdWVzdEhhbmRsZXIKK2Zyb20gdHJhYy53ZWIuY2hyb21lIGltcG9ydCBhZGRfc3R5bGVzaGVldCwgSVRlbXBsYXRlUHJvdmlkZXIsIGFkZF9jdHh0bmF2Citmcm9tIHRyYWMudmVyc2lvbmNvbnRyb2wgaW1wb3J0IENoYW5nZXNldAorZnJvbSB0cmFjLndlYi5hcGkgaW1wb3J0IElSZXF1ZXN0RmlsdGVyCitmcm9tIHRyYWMud2lraSBpbXBvcnQgd2lraV90b19odG1sLCB3aWtpX3RvX29uZWxpbmVyLCBJV2lraVN5bnRheFByb3ZpZGVyCisgICAgICAgICAgICAKK2Zyb20gZ2Vuc2hpLmJ1aWxkZXIgaW1wb3J0IHRhZworI2Zyb20gdHJhYy5lbnYgaW1wb3J0IElFbnZpcm9ubWVudFNldHVwUGFydGljaXBhbnQKK2Zyb20gdHJhYy5wZXJtIGltcG9ydCBJUGVybWlzc2lvblJlcXVlc3RvcgorZnJvbSB0cmFjLmNvbmZpZyBpbXBvcnQgTGlzdE9wdGlvbgorZnJvbSBpY3Vjb2RldG9vbHMudGlja2V0bWdyIGltcG9ydCBUaWNrZXRNYW5hZ2VyCitmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0IHJlc291cmNlX2ZpbGVuYW1lICNAVW5yZXNvbHZlZEltcG9ydAorCitjbGFzcyBSZXZpZXdNb2R1bGUoQ29tcG9uZW50KToKKworICAgIGltcGxlbWVudHMoSVRlbXBsYXRlUHJvdmlkZXIsIElSZXF1ZXN0RmlsdGVyLCBJUmVxdWVzdEhhbmRsZXIsIElQZXJtaXNzaW9uUmVxdWVzdG9yKQorCisgICAgIyBwYXRoIHRvIG1hdGNoIGZvciByZXZpZXcKKyAgICBwYXRoX21hdGNoID0gcmUuY29tcGlsZShyJy9pY3VyZXZpZXcvKFswLTldKyknKQorCisgICAgdm90ZWFibGVfcGF0aHMgPSBMaXN0T3B0aW9uKCdpY3Vjb2RldG9vbHMnLCAncGF0aHMnLCAnL3RpY2tldConLAorICAgICAgICBkb2M9J0xpc3Qgb2YgVVJMIHBhdGhzIHRvIHNob3cgcmV2aWV3cyBvbi4gR2xvYnMgYXJlIHN1cHBvcnRlZC4nKQorCisgICAgIyBJUGVybWlzc2lvblJlcXVlc3RvciBtZXRob2RzCisgICAgZGVmIGdldF9wZXJtaXNzaW9uX2FjdGlvbnMoc2VsZik6CisgICAgICAgIHJldHVybiBbJ0lDVVJFVklFV19WSUVXJ10KKworICAgICMgSVRlbXBsYXRlUHJvdmlkZXIgbWV0aG9kcworICAgIGRlZiBnZXRfdGVtcGxhdGVzX2RpcnMoc2VsZik6CisgICAgICAgIHJldHVybiBbcmVzb3VyY2VfZmlsZW5hbWUoX19uYW1lX18sICd0ZW1wbGF0ZXMnKV0KKworICAgIGRlZiBnZXRfaHRkb2NzX2RpcnMoc2VsZik6CisgICAgICAgIHJldHVybiBbKCdpY3Vjb2RldG9vbHMnLCByZXNvdXJjZV9maWxlbmFtZShfX25hbWVfXywgJ2h0ZG9jcycpKV0KKworICAgICMgSVJlcXVlc3RGaWx0ZXIgbWV0aG9kcworICAgIGRlZiBwcmVfcHJvY2Vzc19yZXF1ZXN0KHNlbGYsIHJlcSwgaGFuZGxlcik6CisgICAgICAgIGlmICdJQ1VSRVZJRVdfVklFVycgbm90IGluIHJlcS5wZXJtOgorICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXIKKworICAgICAgICBpZiBzZWxmLm1hdGNoX3RpY2tldHBhZ2UocmVxKToKKyAgICAgICAgICAgIHNlbGYucmVuZGVyX3Jldmlld2xpbmsocmVxKQorCisgICAgICAgIHJldHVybiBoYW5kbGVyCisKKyAgICBkZWYgcG9zdF9wcm9jZXNzX3JlcXVlc3Qoc2VsZiwgcmVxLCB0ZW1wbGF0ZSwgZGF0YSwgY29udGVudF90eXBlKToKKyAgICAgICAgcmV0dXJuICh0ZW1wbGF0ZSwgZGF0YSwgY29udGVudF90eXBlKQorCisgICAgZGVmIHJlbmRlcl9yZXZpZXdsaW5rKHNlbGYsIHJlcSk6CisgICAgICAgICNhZGRfc3R5bGVzaGVldChyZXEsICdpY3Vjb2RldG9vbHMvY3NzL2ljdXh0bi5jc3MnKQorCisgICAgICAgIGVscyA9IFtdCisKKyAgICAgICAgdGlja2V0X21nciA9IFRpY2tldE1hbmFnZXIoc2VsZi5jb21wbWdyKQorCisgICAgICAgIGRiID0gc2VsZi5lbnYuZ2V0X2RiX2NueCgpCisgICAgICAgIHJlcG9zID0gc2VsZi5lbnYuZ2V0X3JlcG9zaXRvcnkoKQorICAgICAgICBpZiBub3QgcmVwb3M6CisgICAgICAgICAgICByYWlzZSBUcmFjRXJyb3IoIkNvdWxkIG5vdCBnZXQgcmVwb3NpdG9yeSBmb3IgJXMiICUgKHJlcS5hdXRobmFtZSkpCisKKyAgICAgICAgcmV2cyA9IHRpY2tldF9tZ3IudGt0MnJldnMoc2VsZi5sb2csIGRiLCByZXBvcywgcmVxLCByZXEuYXJnc1sndGlja2V0J10pCisKKyAgICAgICAgaWYgbm90IHJldnM6CisgICAgICAgICAgICBzdHIgPSAnTm8gY29tbWl0cy4nCisgICAgICAgICAgICBsaSA9IHRhZy5saShzdHIpCisgICAgICAgICAgICBlbHMuYXBwZW5kKGxpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3RyID0gJyAlZCBjb21taXRzLicgJSBsZW4ocmV2cykKKyAgICAgICAgICAgIGhyZWYgPSByZXEuaHJlZi5yZXZpZXcocmVxLmFyZ3NbJ3RpY2tldCddKQorICAgICAgICAgICAgYSA9IHRhZy5hKCdSZXZpZXcnLCBocmVmPWhyZWYpCisgICAgICAgICAgICBsaSA9IHRhZy5saShhICsgc3RyKQorICAgICAgICAgICAgZWxzLmFwcGVuZChsaSkgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIHVsID0gdGFnLnVsKGVscywgY2xhc3NfPSdyZXZpZXcnKQorICAgICAgICBjbGFzc05hbWUgPSAnJworICAgICAgICB0aXRsZSA9ICJSZXZpZXdzIgorICAgICAgICBhZGRfY3R4dG5hdihyZXEsIHRhZy5zcGFuKHRhZy5vYmplY3QodWwpLCBpZD0naWN1cmV2aWV3JywgdGl0bGU9dGl0bGUsIGNsYXNzXz1jbGFzc05hbWUpKQorCisKKyAgICBkZWYgbWF0Y2hfcmVxdWVzdChzZWxmLCByZXEpOgorICAgICAgICBtYXRjaCA9IHJlLm1hdGNoKCcvcmV2aWV3KD86LyhbXi9dKykpPyg/Oi8oW14vXSspKT8oPzovKC4qKSQpPycsIHJlcS5wYXRoX2luZm8pCisgICAgICAgIGlmIG1hdGNoOgorICAgICAgICAgICAgcmVxLmFyZ3NbJ3RpY2tldCddID0gbWF0Y2guZ3JvdXAoMSkKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgbWF0Y2hfdGlja2V0cGFnZShzZWxmLCByZXEpOgorICAgICAgICBtYXRjaCA9IHJlLm1hdGNoKCcvdGlja2V0KD86LyhbXi9dKykpPyg/Oi8oW14vXSspKT8oPzovKC4qKSQpPycsIHJlcS5wYXRoX2luZm8pCisgICAgICAgIGlmIG1hdGNoOgorICAgICAgICAgICAgcmVxLmFyZ3NbJ3RpY2tldCddID0gbWF0Y2guZ3JvdXAoMSkKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgY2hhbmdlVG9SYW5nZShzZWxmLCBjX25ldywgY2hhbmdlKToKKyAgICAgICAgIyBxOiAodSd0cnVuay9Mb2NhbGUuamF2YScsICdmaWxlJywgJ2FkZCcsIE5vbmUsIHUnLTEnKSAgZnJvbSByMworICAgICAgICAjIHE6ICh1J3RydW5rL3V0aWwuYycsICAgICAgJ2ZpbGUnLCAnZWRpdCcsIHUndHJ1bmsvdXRpbC5jJywgdScyJykgIGZyb20gcjQKKyMgICAgICAgIGNfcGF0aCA9IGNoYW5nZVswXQorIyAgICAgICAgY19pdGVtdHlwZSA9IGNoYW5nZVsxXQorICAgICAgICBjX3R5cGUgPSBjaGFuZ2VbMl0KKyAgICAgICAgY19vbGRwYXRoID0gY2hhbmdlWzNdCisgICAgICAgIGNfb2xkID0gaW50KGNoYW5nZVs0XSBvciAtMSkKKyAgICAgICAgaWYoY190eXBlIGluIChDaGFuZ2VzZXQuQ09QWSxDaGFuZ2VzZXQuTU9WRSkpOgorICAgICAgICAgICAgcmV0dXJuICgtMSwgY19uZXcsIGNfdHlwZSwgY19vbGQsIGNfb2xkcGF0aCkgIyBpZ25vcmUgT0xEIHJldiBmb3IgdGhlc2UKKyAgICAgICAgZWxpZihjX3R5cGUgaW4gKENoYW5nZXNldC5ERUxFVEUpKToKKyAgICAgICAgICAgIHJldHVybiAoY19vbGQsIC0xLCBjX3R5cGUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gKGNfb2xkLCBjX25ldywgY190eXBlKQorICAgICAgICAKKyAgICBkZWYgZGVzY3JpYmVDaGFuZ2Uoc2VsZiwgZmlsZSwgY2hhbmdlLCByZXEsIGRiKToKKyAgICAgICAgd2hhdCA9IGNoYW5nZVsyXSBvciAnY2hhbmdlJworICAgICAgICB3aGVyZSA9ICdyJWQ6JWQnICUgKGNoYW5nZVswXSxjaGFuZ2VbMV0pCisgICAgICAgIGlmKGNoYW5nZVswXSA9PSAtMSk6CisgICAgICAgICAgICBpZihjaGFuZ2VbMV0gPT0gLTEpOgorICAgICAgICAgICAgICAgIHVybCA9IE5vbmUKKyAgICAgICAgICAgICAgICB3aGF0ID0gIm5vb3AiCisgICAgICAgICAgICAgICAgd2hlcmUgPSBOb25lCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICNpZiBjaGFuZ2VbMl0gPT0gJ2FkZCtjb21taXRzJzoKKyAgICAgICAgICAgICAgICB1cmwgPSByZXEuaHJlZi5icm93c2VyKGZpbGUsIHJldj1jaGFuZ2VbMV0pICMgJ2FkZCcKKyAgICAgICAgICAgICAgICB3aGVyZSA9ICdyJWQnICUgY2hhbmdlWzFdCisgICAgICAgICAgICAgICAgd2hhdCA9IGNoYW5nZVsyXQorICAgICAgICBlbGlmKGNoYW5nZVsxXSA9PSAtMSk6CisgICAgICAgICAgICB1cmwgPSBOb25lICMgZGVsZXRlZAorICAgICAgICAgICAgd2hhdCA9ICJkZWxldGVkIgorICAgICAgICAgICAgd2hlcmUgPSBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB1cmwgPSByZXEuaHJlZi5jaGFuZ2VzZXQob2xkX3BhdGg9ZmlsZSwgb2xkPWNoYW5nZVswXSwgbmV3X3BhdGg9ZmlsZSwgbmV3PWNoYW5nZVsxXSkKKyAgICAgICAgaWYgdXJsOgorICAgICAgICAgICAgd2hhdCA9IE1hcmt1cCgnPGEgaHJlZj0iJXMiPiVzPC9hPicgJSAodXJsLHdoYXQpKQorICAgICAgICBpZiB3aGVyZToKKyAgICAgICAgICAgIHJldHVybiAod2hhdCwgdGFnLmEod2hlcmUsIGhyZWY9cmVxLmhyZWYuc2VhcmNoKHE9d2hlcmUpKSkKKyAgICAgICAgICAgICNyZXR1cm4gKHdoYXQsIHdoZXJlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICh3aGF0LCAnJykKKworCisgICAgZGVmIHByb2Nlc3NfcmVxdWVzdChzZWxmLCByZXEpOgorICAgICAgICAjb2ssIHdoYXQgYXJlIHdlIGFib3V0LgorICAgICAgICAjZGIgPSBzZWxmLmVudi5nZXRfZGJfY254KCkKKyAgICAgICAgI3RpY2tldGxpc3QgPSB7fSAgIyBkaWN0IG9mIHRpY2tldC0+Pz8/CisgICAgICAgICNyZXZsaXN0ID0ge30gIyBkaWN0IG9mIHJldmlzaW9uLT4KKyAgICAgICAgcmVwb3MgPSBzZWxmLmVudi5nZXRfcmVwb3NpdG9yeSgpCisKKyAgICAgICAgbmV3X3BhdGggPSByZXEuYXJncy5nZXQoJ25ld19wYXRoJykKKyAgICAgICAgbmV3X3JldiA9IHJlcS5hcmdzLmdldCgnbmV3JykKKyAgICAgICAgb2xkX3BhdGggPSByZXEuYXJncy5nZXQoJ29sZF9wYXRoJykKKyAgICAgICAgb2xkX3JldiA9IHJlcS5hcmdzLmdldCgnb2xkJykKKworICAgICAgICBuZXdfcGF0aCA9IHJlcG9zLm5vcm1hbGl6ZV9wYXRoKG5ld19wYXRoKQorICAgICAgICBuZXdfcmV2ID0gcmVwb3Mubm9ybWFsaXplX3JldihuZXdfcmV2KQorICAgICAgICBvbGRfcGF0aCA9IHJlcG9zLm5vcm1hbGl6ZV9wYXRoKG9sZF9wYXRoKQorICAgICAgICBvbGRfcmV2ID0gcmVwb3Mubm9ybWFsaXplX3JldihvbGRfcmV2KQorICAgICAgICAKKworIyAgICAgICAgaWYgbm90IHJlcS5wZXJtLmhhc19wZXJtaXNzaW9uKCdUSUNLRVRfTU9ESUZZJyk6CisjICAgICAgICAgICAgcmV0dXJuIHJlcS5yZWRpcmVjdChyZXEuaHJlZi5icm93c2VyKCkpCisKKyAgICAgICAgb2xkX3JldiA9IGludChvbGRfcmV2KQorICAgICAgICBuZXdfcmV2ID0gaW50KG5ld19yZXYpCisgICAgICAgIAorICAgICAgICB0aWNrZXQgPSByZXEuYXJncy5nZXQoJ3RpY2tldCcpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRpY2tldCA9IGludCh0aWNrZXQpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICB0aWNrZXQgPSAwCisjICAgICAgICByZXEuaGRmWydyZXZpZXcudGlja2V0J10gPSB0aWNrZXQKKyMgICAgICAgIHJlcS5oZGZbJ3Jldmlldy50aWNrZXRodG1sJ10gPSB0YWcuYSh0aWNrZXQsIHJlcS5ocmVmLnRpY2tldCh0aWNrZXQpKQorCisgICAgICAgIGRhdGEgPSB7fQorCisgICAgICAgIGRhdGFbJ292ZXJhbGxfeSddID0gMAorICAgICAgICBkYXRhWyd0aWNrZXRfaWQnXSA9IHJlcS5hcmdzWyd0aWNrZXQnXQorICAgICAgICBkYXRhWyd0aWNrZXRfaHJlZiddID0gcmVxLmhyZWYudGlja2V0KHJlcS5hcmdzWyd0aWNrZXQnXSkKKworICAgICAgICB0aWNrZXRfbWdyID0gVGlja2V0TWFuYWdlcihzZWxmLmNvbXBtZ3IpCisKKyAgICAgICAgZGIgPSBzZWxmLmVudi5nZXRfZGJfY254KCkKKyAgICAgICAgcmVwb3MgPSBzZWxmLmVudi5nZXRfcmVwb3NpdG9yeSgpCisKKyAgICAgICAgcmV2cyA9IHRpY2tldF9tZ3IudGt0MnJldnMoc2VsZi5sb2csIGRiLCByZXBvcywgcmVxLCByZXEuYXJnc1sndGlja2V0J10pCisgICAgICAgIAorICAgICAgICBpZiAobm90IHJldnMgb3IgbGVuKHJldnMpPT0wKToKKyAgICAgICAgICAgICMgbm90aGluZyB0byByZXZpZXcuIHNob3VsZG4ndCBoYXBwZW4KKyAgICAgICAgICAgIHJldHVybiAoJ25vdGhpbmcuaHRtbCcsIGRhdGEsICd0ZXh0L2h0bWwnKQorICAgICAgICBlbGlmKGxlbihyZXZzKT09MSk6CisgICAgICAgICAgICAjIG9ubHkgb25lIGNoYW5nZSAtIGp1c3QgZG8gYSBjaGFuZ2VzZXQgdmlldworICAgICAgICAgICAgcmV0dXJuIHJlcS5yZWRpcmVjdChyZXEuaHJlZi5jaGFuZ2VzZXQocmV2c1swXSkpCisKKyAgICAgICAgcmV2Y291bnQgPSAwCisgICAgICAgIGJyYW5jaGVzID0ge30KKyAgICAgICAgZmlsZXMgPSB7fQorICAgICAgICAjIG1heSBiZSAwIHJldnMuCisgICAgICAgIHJldmlzaW9ucyA9IFtdCisgICAgICAgIAorICAgICAgICBmb3IgcmV2IGluIHJldnM6CisgICAgICAgICAgICBjaGdzZXQgPSByZXBvcy5nZXRfY2hhbmdlc2V0KHJldikKKyAgICAgICAgICAgICMgcTogKHUndHJ1bmsvTG9jYWxlLmphdmEnLCAnZmlsZScsICdhZGQnLCBOb25lLCB1Jy0xJykgIGZyb20gcjMKKyAgICAgICAgICAgICMgcTogKHUndHJ1bmsvdXRpbC5jJywgJ2ZpbGUnLCAnZWRpdCcsIHUndHJ1bmsvdXRpbC5jJywgdScyJykgIGZyb20gcjQKKyAgICAgICAgICAgIG1lc3NhZ2UgPSBjaGdzZXQubWVzc2FnZSBvciAnLS0nCisgICAgICAgICAgICByZXZjb3VudCA9IHJldmNvdW50ICsgMQorICAgICAgICAgICAgcmV2aXNpb24gPSB7fQorICAgICAgICAgICAgcmV2aXNpb25bJ3JldiddID0gIHRhZy5hKHJldiwgcmVxLmhyZWYuY2hhbmdlc2V0KHJldikpCisgICAgICAgICAgICByZXZpc2lvblsnbnVtJ10gPSAgcmV2CisgICAgICAgICAgICByZXZpc2lvblsnY29tbWVudCddID0gIG1lc3NhZ2UgI3dpa2lfdG9fb25lbGluZXIoIG1lc3NhZ2UsIHNlbGYuZW52LCBkYiwgc2hvcnRlbj1GYWxzZSApCisgICAgICAgICAgICBmb3IgY2hnIGluIGNoZ3NldC5nZXRfY2hhbmdlcygpOgorICAgICAgICAgICAgICAgIHBhdGggPSBjaGdbMF0KKyAgICAgICAgICAgICAgICBpZiBwYXRoIGluIGZpbGVzOgorICAgICAgICAgICAgICAgICAgICBpdGVtID0gZmlsZXNbcGF0aF0KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBpdGVtID0gW10KKyAgICAgICAgICAgICAgICAgICAgZmlsZXNbcGF0aF0gPSBpdGVtOworICAgICAgICAgICAgICAgIGl0ZW0uYXBwZW5kKHNlbGYuY2hhbmdlVG9SYW5nZShyZXYsY2hnKSkKKyAgICAgICAgICAgIHJldmlzaW9ucy5hcHBlbmQocmV2aXNpb24pCisgICAgICAgIGRhdGFbJ3JldmlzaW9ucyddID0gcmV2aXNpb25zCisgICAgICAgIAorICAgICAgICBpZihyZXZjb3VudCA+IDApOgorICAgICAgICAgICAgZGF0YVsncmV2Y291bnQnXSA9IHJldmNvdW50CisgICAgICAgIAorICAgICAgICAjIHByaW50ICJmaWxlczogJWQiICUgbGVuKGZpbGVzKQorICAgICAgICAjIGdvIHRocm91aGcgZWFjaCBmaWxlIGFuZCBjYWxjdWxhdGUgaXRzIG1pbmltdW0gcmFuZ2UKKyAgICAgICAgZmlsZWxpc3QgPSBmaWxlcy5rZXlzKCkKKyAgICAgICAgZmlsZWxpc3Quc29ydCgpCisjICAgICAgICBwcmludCAnYmFyIHRvICVkIGxlbiBvZiAlcycgJSAobGVuKGZpbGVsaXN0KSxzdHIoZmlsZWxpc3QpKQorICAgICAgICBmb3IgZmlsZSBpbiBmaWxlbGlzdDoKKyAgICAgICAgICAgIGNoYW5nZXMgPSBmaWxlc1tmaWxlXQorICAgICAgICAgICAgaSA9IDAKKyMgICAgICAgICAgICBwcmludCAiIGxvb3BpbmcgZnJvbSAlZCB0byAlZCBvdmVyICVkICIgJSAoaSxsZW4oY2hhbmdlcyktMSxsZW4oY2hhbmdlcykpCisgICAgICAgICAgICB3aGlsZSBsZW4oY2hhbmdlcyk+MSBhbmQgaTwobGVuKGNoYW5nZXMpLTEpOgorICAgICAgICAgICAgICAgIGlmIGNoYW5nZXNbaV1bMV0gPT0gY2hhbmdlc1tpKzFdWzBdOgorICAgICAgICAgICAgICAgICAgICBpZiBjaGFuZ2VzW2ldWzBdID09IC0xOgorICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlc1tpKzFdID0gKGNoYW5nZXNbaV1bMF0sY2hhbmdlc1tpKzFdWzFdLCdhZGQrY29tbWl0cycpICMgcmV0YWluICdmaXJzdCcgcmV2CisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzW2krMV0gPSAoY2hhbmdlc1tpXVswXSxjaGFuZ2VzW2krMV1bMV0sJ211bHRpcGxlIGNvbW1pdHMnKSAjIHJldGFpbiAnZmlyc3QnIHJldgorCisgICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgPSBjaGFuZ2VzWzppXSArIGNoYW5nZXNbaSsxOl0gIyBhbmQgc2hpZnQgZG93bgorIyAgICAgICAgICAgICAgICAgICAgcHJpbnQgIm1lcmdlZDogJXMiICUgc3RyKGNoYW5nZXMpCisgICAgICAgICAgICAgICAgICAgIGZpbGVzW2ZpbGVdID0gY2hhbmdlcworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGkgPSBpICsgMQorICAgICAgICAKKyAgICAgICAgIyBub3csIHdyaXRlICdlbSBvdXQKKyAgICAgICAgc2VyYSA9IDAKKyAgICAgICAgI2ZpbGVzX2RhdGEgPSBbXQorICAgICAgICBmb3IgZmlsZSBpbiBmaWxlbGlzdDoKKyAgICAgICAgICAgIHNlcmEgPSBzZXJhKzEKKyAgICAgICAgICAgIGZpbGVfZGF0YSA9IHt9CisgICAgICAgICAgICBmaWxlX2RhdGFbJ25hbWUnXSA9IE1hcmt1cCgnPGEgaHJlZj0iJXMiPiVzPC9hPicgJSAocmVxLmhyZWYuYnJvd3NlcihmaWxlKSxmaWxlKSkKKyAgICAgICAgICAgIGJyYW5jaF9uYW1lID0gJy8nLmpvaW4oZmlsZS5zcGxpdCgnLycpWzA6Ml0pCisgICAgICAgICAgICAjcHJpbnQgImJyYW5jaCBpczogKCVzKSIgJSAoYnJhbmNoX25hbWUpCisgICAgICAgICAgICBicmFuY2hlc19kYXRhID0gYnJhbmNoZXMuZ2V0KGJyYW5jaF9uYW1lLCB7fSkKKyAgICAgICAgICAgIGZpbGVzX2RhdGEgPSBicmFuY2hlc19kYXRhLmdldCgnZmlsZXMnLFtdKQorCisgICAgICAgICAgICBjaGFuZ2VzID0gZmlsZXNbZmlsZV0KKyAgICAgICAgICAgIGNoYSA9IDAKKyAgICAgICAgICAgIGNoYW5nZXNfZGF0YSA9IFtdCisgICAgICAgICAgICBmb3IgY2hhbmdlIGluIGNoYW5nZXM6CisgICAgICAgICAgICAgICAgY2hhID0gY2hhICsgMQorIyAgICAgICAgICAgICAgICBwcmludCAiJXMgb3V0cHV0ICVzICIgJSAoZmlsZSwgc3RyKGNoYW5nZSkpCisgICAgICAgICAgICAgICAgY2hhbmdlc19kYXRhLmFwcGVuZChzZWxmLmRlc2NyaWJlQ2hhbmdlKGZpbGUsIGNoYW5nZSwgcmVxLCBkYikpCisgICAgICAgICAgICBmaWxlX2RhdGFbJ2NoYW5nZXMnXSA9IGNoYW5nZXNfZGF0YQorICAgICAgICAgICAgaWYobGVuKGNoYW5nZXMpPjEpOgorICAgICAgICAgICAgICAgIHdoYXRodG1sID0gc2VsZi5kZXNjcmliZUNoYW5nZShmaWxlLCAoY2hhbmdlc1swXVswXSwgY2hhbmdlc1tsZW4oY2hhbmdlcyktMV1bMV0sICdvdmVyYWxsJyksIHJlcSwgZGIpCisgICAgICAgICAgICAgICAgZmlsZV9kYXRhWydvdmVyYWxsJ10gPSB3aGF0aHRtbAorICAgICAgICAgICAgICAgIGZpbGVfZGF0YVsnb3ZlcmFsbF95J10gPSAxCisgICAgICAgICAgICAgICAgZGF0YVsnb3ZlcmFsbF95J10gPSAxCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZpbGVfZGF0YVsnb3ZlcmFsbF95J10gPSAwCisgICAgICAgICAgICBmaWxlc19kYXRhLmFwcGVuZChmaWxlX2RhdGEpCisgICAgICAgICAgICAjIHNldHMKKyAgICAgICAgICAgIGJyYW5jaGVzX2RhdGFbJ2ZpbGVzJ10gPSBmaWxlc19kYXRhCisgICAgICAgICAgICBicmFuY2hlc19kYXRhWydsZW4nXSA9IGxlbihmaWxlc19kYXRhKQorICAgICAgICAgICAgYnJhbmNoZXNfZGF0YVsnbmFtZSddID0gYnJhbmNoX25hbWUKKyAgICAgICAgICAgIGJyYW5jaGVzW2JyYW5jaF9uYW1lXSA9IGJyYW5jaGVzX2RhdGEKKyAgICAgICAgI2RhdGFbJ2ZpbGVzJ10gPSBmaWxlc19kYXRhCisgICAgICAgICNkYXRhWydicmFuY2hlcyddID0gYnJhbmNoZXMKKworICAgICAgICAjIC4uIGNvbnZlcnQgZGljdCB0byBhcnJheS4KKyAgICAgICAgYnJhbmNoX2xpc3QgPSBbXQorICAgICAgICBmb3IgYnJhbmNoIGluIGJyYW5jaGVzOgorICAgICAgICAgICAgYnJhbmNoX2xpc3QuYXBwZW5kKGJyYW5jaGVzW2JyYW5jaF0pCisgICAgICAgIGRhdGFbJ2JyYW5jaGVzJ10gPSBicmFuY2hfbGlzdAorICAgICAgICBkYXRhWydsYXN0YnJhbmNoJ10gPSBicmFuY2gKKyAgICAgICAgZGF0YVsnYnJhbmNoY291bnQnXSA9IGxlbihicmFuY2hlcykKKyAgICAgICAgCisgICAgICAgIGNvbnRlbnRfdHlwZSA9ICJ0ZXh0L2h0bWwiCisgICAgICAgIGFkZF9zdHlsZXNoZWV0KHJlcSwgJ2ljdWNvZGV0b29scy9jc3MvaWN1eHRuLmNzcycpCisgICAgICAgIHJldHVybiAncmV2aWV3Lmh0bWwnLCBkYXRhLCBjb250ZW50X3R5cGUKKwpkaWZmIC0tZ2l0IGEvdHJhYy9JY3VDb2RlVG9vbHMvMC4xMS9pY3Vjb2RldG9vbHMvdGVtcGxhdGVzL25vdGhpbmcuaHRtbCBiL3RyYWMvSWN1Q29kZVRvb2xzLzAuMTEvaWN1Y29kZXRvb2xzL3RlbXBsYXRlcy9ub3RoaW5nLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZhOWVlNAotLS0gL2Rldi9udWxsCisrKyBiL3RyYWMvSWN1Q29kZVRvb2xzLzAuMTEvaWN1Y29kZXRvb2xzL3RlbXBsYXRlcy9ub3RoaW5nLmh0bWwKQEAgLTAsMCArMSwyNSBAQAorPCFET0NUWVBFIGh0bWwKKyAgICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgorICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KKzwhLS0KKyMgQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSUJNIGFuZCBPdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKy0tPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCisgICAgICB4bWxuczpweT0iaHR0cDovL2dlbnNoaS5lZGdld2FsbC5vcmcvIgorICAgICAgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiPgorICA8eGk6aW5jbHVkZSBocmVmPSJsYXlvdXQuaHRtbCIgLz4KKyAgPGhlYWQ+CisgICAgPHRpdGxlPk5vdGhpbmcgdG8gUmV2aWV3IGZvciB0aWNrZXQgIyR7dGlja2V0X2lkfTwvdGl0bGU+CisgIDwvaGVhZD4KKworICA8Ym9keT4KKyAgICA8ZGl2IGlkPSJjdHh0bmF2IiBjbGFzcz0ibmF2Ij48L2Rpdj4KKworICAgIDxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJpY3Vjb2RlcmV2aWV3Ij4KKyAgICAgIDxoMT5Ob3RoaW5nIHRvIHJldmlldyE8L2gxPgorICAgICAgPHA+CisgICAgICAJTm90aGluZyB0byByZXZpZXcgLSBubyBjaGFuZ2VzZXRzIGluIHRpY2tldCA8YSBocmVmPSIke3RpY2tldF9ocmVmfSI+IyR7dGlja2V0X2lkfTwvYT4KKyAgICAgIDwvcD4KKyAgICA8L2Rpdj4KKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJhYy9JY3VDb2RlVG9vbHMvMC4xMS9pY3Vjb2RldG9vbHMvdGVtcGxhdGVzL3Jldmlldy5odG1sIGIvdHJhYy9JY3VDb2RlVG9vbHMvMC4xMS9pY3Vjb2RldG9vbHMvdGVtcGxhdGVzL3Jldmlldy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NjIwNWUKLS0tIC9kZXYvbnVsbAorKysgYi90cmFjL0ljdUNvZGVUb29scy8wLjExL2ljdWNvZGV0b29scy90ZW1wbGF0ZXMvcmV2aWV3Lmh0bWwKQEAgLTAsMCArMSwxMTcgQEAKKzwhRE9DVFlQRSBodG1sCisgICAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKKyAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Cis8IS0tCisjIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIElCTSBhbmQgT3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkCistLT4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgorICAgICAgeG1sbnM6cHk9Imh0dHA6Ly9nZW5zaGkuZWRnZXdhbGwub3JnLyIKKyAgICAgIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIj4KKyAgPHhpOmluY2x1ZGUgaHJlZj0ibGF5b3V0Lmh0bWwiIC8+CisgIDxoZWFkPgorICAgIDx0aXRsZT5SZXZpZXcgZm9yIHRpY2tldCAjJHt0aWNrZXRfaWR9PC90aXRsZT4KKyAgPC9oZWFkPgorCisgIDxib2R5PgorICAgIDxkaXYgaWQ9ImN0eHRuYXYiIGNsYXNzPSJuYXYiPjwvZGl2PgorCisgICAgPGRpdiBpZD0iY29udGVudCIgY2xhc3M9ImljdWNvZGVyZXZpZXciPgorCisgPGgxPlRpY2tldCA8YSBocmVmPScke2hyZWYudGlja2V0KHRpY2tldF9pZCl9Jz4jJHt0aWNrZXRfaWR9PC9hPjwvaDE+CisKKzxweTppZiB0ZXN0PSJyZXZjb3VudCI+CisKKzxoMj4ke3JldmNvdW50fSBDaGFuZ2VzZXRzPC9oMj4KKzx1bD4KKzxweTpmb3IgZWFjaD0icmV2IGluIHJldmlzaW9ucyI+CisgICAgPGxpPjxhIGhyZWY9IiR7aHJlZi5jaGFuZ2VzZXQocmV2Lm51bSl9Ij5yJHtyZXYubnVtfTwvYT4gJm1kYXNoOyAke3Jldi5jb21tZW50fTwvbGk+Cis8L3B5OmZvcj4KKzwvdWw+CisKKzxweTppZiB0ZXN0PSJicmFuY2hjb3VudCA+IDEiPgorPGgyPkZpbGVzPC9oMj4KKzxoMz5KdW1wIHRvIFNlY3Rpb25zPC9oMz4KKzx1bD4KKzxweTpmb3IgZWFjaD0iYnJhbmNoIGluIGJyYW5jaGVzIj4KKyAgPGxpPjxhIGhyZWY9IiMke2JyYW5jaC5uYW1lfSI+JHticmFuY2gubmFtZX08L2E+ICZtZGFzaDsgJHticmFuY2gubGVufSBmaWxlczwvbGk+Cis8L3B5OmZvcj4KKzwvdWw+Cis8L3B5OmlmPgorCis8cHk6Zm9yIGVhY2g9ImJyYW5jaCBpbiBicmFuY2hlcyI+Cis8aHIvPgorPGEgbmFtZT0iJHticmFuY2gubmFtZX0iPgorICA8aDM+CisgICAgICAgIDxhIGhyZWY9IiR7aHJlZi5icm93c2VyKGJyYW5jaC5uYW1lKX0iPiR7YnJhbmNoLm5hbWV9PC9hPiAmbWRhc2g7ICgke2JyYW5jaC5sZW59IGZpbGVzIGNoYW5nZWQpCisgIDwvaDM+Cis8L2E+CisKKzxzdHlsZSB0eXBlPSd0ZXh0L2Nzcyc+CisKKworPC9zdHlsZT4KKworPGJsb2NrcXVvdGU+CisKKzx0YWJsZSBjbGFzcz0naWN1cmV2aWV3Jz4KKzx0aGVhZD4KKzx0cj4KKyA8dGg+RmlsZTwvdGg+CisgPHRoPkNoYW5nZXM8L3RoPgorIDx0aD5EZXRhaWxzPC90aD4KKyA8cHk6aWYgdGVzdD0ib3ZlcmFsbF95ID4gMCI+IAorICA8dGg+T3ZlcmFsbDxici8+PGk+KGluY2x1ZGluZyBvdGhlciBjaGFuZ2VzKTwvaT48L3RoPgorICA8dGg+RGV0YWlsczwvdGg+CisgPC9weTppZj4KKzwvdHI+Cis8L3RoZWFkPgorPHRib2R5PgorPHB5OmZvciBlYWNoPSJmaWxlIGluIGJyYW5jaC5maWxlcyI+CisgPHRyPgorICAgIDx0aCBjbGFzcz0nbmFtZSc+JHtmaWxlLm5hbWV9PC90aD4KKyAgICA8dGQgY2xhc3M9J2NoYW5nZXMnPgorICAgICAgPHB5OmZvciBlYWNoPSJjaGFuZ2UgaW4gZmlsZS5jaGFuZ2VzIj4KKyAgICAgICAgJHtjaGFuZ2VbMF19PGJyLz4KKyAgICAgIDwvcHk6Zm9yPgorICAgIDwvdGQ+CisgICAgPHRkIGNsYXNzPSdkZXRhaWxzJz4KKyAgICAgIDxweTpmb3IgZWFjaD0iY2hhbmdlIGluIGZpbGUuY2hhbmdlcyI+CisgICAgICAgICR7Y2hhbmdlWzFdfTxici8+CisgICAgICA8L3B5OmZvcj4KKyAgICA8L3RkPgorCSAgCisgICAgPHB5OmlmIHRlc3Q9Im92ZXJhbGxfeSA+IDAiPiAKKyAgICAgPHB5OmlmIHRlc3Q9ImZpbGUub3ZlcmFsbF95ID4gMCI+CisgICAgICA8dGQgY2xhc3M9J292ZXJhbGwnPiR7ZmlsZS5vdmVyYWxsWzBdfTwvdGQ+CisgICAgICA8dGQgY2xhc3M9J292ZXJhbGwnPiR7ZmlsZS5vdmVyYWxsWzFdfTwvdGQ+CisgICAgIDwvcHk6aWY+CisgICAgPC9weTppZj4KKyAgPC90cj4KKzwvcHk6Zm9yPgorPC90Ym9keT4KKzwvdGFibGU+CisKKzwvYmxvY2txdW90ZT4KKworPC9weTpmb3I+CisKKzxoci8+CisKKzxkaXYgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnPgorPGgyPk1lcmdlIENvbW1hbmRzPC9oMj4KK1ZlcnkgZXhwZXJpbWVudGFsLiAgQ2hhbmdlID8/PyB0byB0aGUgdG9wIG9mIHRoZSB0cmVlIHlvdSB3YW50IHRvIG1lcmdlIGZyb20gKGljdSBvciBpY3U0aik8YnIvPgorPHRleHRhcmVhPnN2biBtZXJnZSAtYyA8P2NzIGVhY2g6cmV2ID0gcmV2aXNpb25zID8+PD9jcyB2YXI6cmV2Lm51bSA/Piw8P2NzIC9lYWNoID8+IHN2bitzc2g6Ly9zb3VyY2UuaWN1LXByb2plY3Qub3JnL3JlcG9zL2ljdS8/Pz8vdHJ1bms8L3RleHRhcmVhPgorCis8aHIvPgorPC9kaXY+Cis8aHIvPgorPGlmcmFtZSBzcmM9Imh0dHA6Ly9zaXRlcy5nb29nbGUuY29tL3NpdGUvaWN1Y29kZXRvb2xzL3YxL3JldmlldyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iODAwcHgiPgorPGgxPjxhIGhyZWY9Imh0dHA6Ly9zaXRlcy5nb29nbGUuY29tL3NpdGUvaWN1Y29kZXRvb2xzL3YxL3JldmlldyI+SGVscDwvYT48L2gxPgorPC9pZnJhbWU+CisKKzwvcHk6aWY+Cis8aHIvPgorPGk+JElkOiAkPC9pPgorPC9kaXY+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS90cmFjL0ljdUNvZGVUb29scy8wLjExL2ljdWNvZGV0b29scy90aWNrZXRtZ3IucHkgYi90cmFjL0ljdUNvZGVUb29scy8wLjExL2ljdWNvZGV0b29scy90aWNrZXRtZ3IucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjJlMzFhNQotLS0gL2Rldi9udWxsCisrKyBiL3RyYWMvSWN1Q29kZVRvb2xzLzAuMTEvaWN1Y29kZXRvb2xzL3RpY2tldG1nci5weQpAQCAtMCwwICsxLDE3MCBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSUJNIGFuZCBPdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyMgQXV0aG9yOiA8c3JsQGljdS1wcm9qZWN0Lm9yZz4KKyMKKworIyAKKyMgVGlja2V0IG1hbmFnZW1lbnQuCisjIFRoaXMgY29tcG9uZW50IG1hbmFnZXMgdGhlIHJldmlzaW9uIHRvIHRpY2tldCBtYXAuCisKKworCitmcm9tIHRyYWMuY29yZSBpbXBvcnQgQ29tcG9uZW50LCBpbXBsZW1lbnRzLCBUcmFjRXJyb3IKK2Zyb20gdHJhYy5lbnYgaW1wb3J0IElFbnZpcm9ubWVudFNldHVwUGFydGljaXBhbnQKK2Zyb20gdHJhYy5kYiBpbXBvcnQgVGFibGUsIENvbHVtbiwgSW5kZXgsIERhdGFiYXNlTWFuYWdlcgorZnJvbSB0cmFjLmNvbmZpZyBpbXBvcnQgT3B0aW9uCitmcm9tIHRyYWMudXRpbC50ZXh0IGltcG9ydCBleGNlcHRpb25fdG9fdW5pY29kZQorCitpbXBvcnQgcmUKKwordGt0bWdyX3NjaGVtYSA9IFsKKyAgICBUYWJsZSgncmV2MnRpY2tldCcsIGtleT0ncmV2JylbICAgICAgICAgIyBtYXAgcmV2LT50aWNrZXQKKyAgICAgICAgQ29sdW1uKCdyZXYnLCB0eXBlPSdpbnQnKSwgICAgICAgICAgIyBjaGFuZ2VzZXQgaWQKKyAgICAgICAgQ29sdW1uKCd0aWNrZXQnLCB0eXBlPSdpbnQnKSwgICAgICAgIyB0aWNrZXQgIworICAgICAgICBJbmRleChbJ3RpY2tldCddKV0sICAgICAgICAgICAgICAgICAjIGluZGV4IGJ5IHRpY2tldAorXQorCitjbGFzcyBUaWNrZXRNYW5hZ2VyKENvbXBvbmVudCk6CisgICAgaW1wbGVtZW50cyhJRW52aXJvbm1lbnRTZXR1cFBhcnRpY2lwYW50KQorIyAgICBpbXBsZW1lbnRzKElFbnZpcm9ubWVudFNldHVwUGFydGljaXBhbnQsIElSZXBvc2l0b3J5T2JzZXJ2ZXIpCisKKyAgICB0aWNrZXRfcGF0dGVybiA9IE9wdGlvbignaWN1Y29kZXRvb2xzJywgJ3RpY2tldF9wYXR0ZXJuJywgJ150aWNrZXQ6KFxkKyknLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiJBIHJlZ2V4IG1hdGNoaW5nIHRoZSBjb21taXQgbWVzc2FnZXMuIEdyb3VwIDEgbXVzdCByZXR1cm4gYSBudW1iZXIuIiIiKQorICAgIAorICAgIGRlZiBpY3VfdGt0bWdyKHNlbGYpOgorICAgICAgICByZXR1cm4gMTsKKyAgICAKKyAgICBrbm93bl95b3VuZ2VzdCA9IC0xCisKKyAgICBkZWYgZW52aXJvbm1lbnRfY3JlYXRlZChzZWxmKToKKyAgICAgICAgZGIgPSBzZWxmLmVudi5nZXRfZGJfY254KCkKKyAgICAgICAgY29ubmVjdG9yLCBfID0gRGF0YWJhc2VNYW5hZ2VyKHNlbGYuZW52KS5fZ2V0X2Nvbm5lY3RvcigpCisgICAgICAgIGN1cnNvciA9IGRiLmN1cnNvcigpCisgICAgICAgIGZvciB0YWJsZSBpbiB0a3RtZ3Jfc2NoZW1hOgorICAgICAgICAgICAgZm9yIHN0bXQgaW4gY29ubmVjdG9yLnRvX3NxbCh0YWJsZSk6CisgICAgICAgICAgICAgICAgY3Vyc29yLmV4ZWN1dGUoc3RtdCkKKworICAgICAgICBjdXJzb3IuZXhlY3V0ZSgiSU5TRVJUIElOVE8gc3lzdGVtIChuYW1lLHZhbHVlKSAiCisgICAgICAgICAgICAgICAgICAgICAgICJWQUxVRVMgKCdpY3VfdGt0bWdyJywlcykiLCAoc2VsZi5pY3VfdGt0bWdyKCksKSkKKyAgICAgICAgZGIuY29tbWl0KCkKKyAgICAgICAgc2VsZi5sb2cuaW5mbygnRGF0YWJhc2UgdXBkYXRlOiBpY3VfdGt0bWdyIHRhYmxlcyB2ZXJzaW9uICVkICcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaWN1X3RrdG1ncigpKQorICAgICAgICBwcmludCAnaWN1Y29kZXRvb2xzLnRpY2tldG1ncjogTm90ZSwgZmlyc3QgcmV2aWV3IHdpbGwgdGFrZSBhIHdoaWxlLlxuJworICAgIAorICAgIGRlZiB5b3VuZ2VzdF9yZXYoc2VsZixkYik6CisgICAgICAgIGlmIChzZWxmLmtub3duX3lvdW5nZXN0IDwgMCk6CisgICAgICAgICAgICAjcHJpbnQoJ0RpZCBub3Qga25vdyB5b3VuZ2VzdCB2YWx1ZS4nKQorICAgICAgICAgICAgY3Vyc29yID0gZGIuY3Vyc29yKCkKKyAgICAgICAgICAgIGN1cnNvci5leGVjdXRlKCJTRUxFQ1QgdmFsdWUgRlJPTSBzeXN0ZW0gV0hFUkUgbmFtZT0naWN1X3RrdG1ncl95b3VuZ2VzdCciKQorICAgICAgICAgICAgcm93ID0gY3Vyc29yLmZldGNob25lKCkKKyAgICAgICAgICAgIGlmIG5vdCByb3c6CisgICAgICAgICAgICAgICAgY3Vyc29yLmV4ZWN1dGUoIklOU0VSVCBJTlRPIHN5c3RlbSAobmFtZSx2YWx1ZSkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWQUxVRVMgKCdpY3VfdGt0bWdyX3lvdW5nZXN0JywnLTEnKSIpCisgICAgICAgICAgICAgICAgZGIuY29tbWl0KCkKKyAgICAgICAgICAgICAgICBzZWxmLmtub3duX3lvdW5nZXN0ID0gLTIKKyAgICAgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAga25vd25feW91bmdlc3QgPSBpbnQocm93WzBdKQorICAgICAgICAgICAgICAgIHNlbGYua25vd25feW91bmdlc3QgPSBrbm93bl95b3VuZ2VzdAorICAgICAgICByZXR1cm4gc2VsZi5rbm93bl95b3VuZ2VzdAorICAgICAgICAKKyAgICBkZWYgY2hlY2tfc3luYyhzZWxmLCBsb2csIGRiLCByZXBvcyk6CisgICAgICAgIG91cllvdW5nZXN0ID0gc2VsZi55b3VuZ2VzdF9yZXYoZGIpCisgICAgICAgIHRoZWlyWW91bmdlc3QgPSByZXBvcy5nZXRfeW91bmdlc3RfcmV2KCkKKyAgICAgICAgI2xvZy5pbmZvKCJUS1Q6IGNoZWNrX3N5bmMgJWQvJWQiICUgKG91cllvdW5nZXN0LHRoZWlyWW91bmdlc3QpKQorICAgICAgICBpZihvdXJZb3VuZ2VzdCA8PSB0aGVpcllvdW5nZXN0KToKKyAgICAgICAgICAgIHNlbGYucmVzeW5jKGxvZywgZGIsIHJlcG9zLCBvdXJZb3VuZ2VzdCwgdGhlaXJZb3VuZ2VzdCkKKyAgICAKKyAgICBkZWYgZW52aXJvbm1lbnRfbmVlZHNfdXBncmFkZShzZWxmLCBkYik6CisgICAgICAgIGN1cnNvciA9IGRiLmN1cnNvcigpCisgICAgICAgIGN1cnNvci5leGVjdXRlKCJTRUxFQ1QgdmFsdWUgRlJPTSBzeXN0ZW0gV0hFUkUgbmFtZT0naWN1X3RrdG1nciciKQorICAgICAgICByb3cgPSBjdXJzb3IuZmV0Y2hvbmUoKQorICAgICAgICBpZiBub3Qgcm93IG9yIGludChyb3dbMF0pIDwgc2VsZi5pY3VfdGt0bWdyKCk6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHVwZ3JhZGVfZW52aXJvbm1lbnQoc2VsZiwgZGIpOgorICAgICAgICBjdXJzb3IgPSBkYi5jdXJzb3IoKQorICAgICAgICBjdXJzb3IuZXhlY3V0ZSgiU0VMRUNUIHZhbHVlIEZST00gc3lzdGVtIFdIRVJFIG5hbWU9J2ljdV90a3RtZ3InIikKKyAgICAgICAgcm93ID0gY3Vyc29yLmZldGNob25lKCkKKyAgICAgICAgaWYgbm90IHJvdzoKKyAgICAgICAgICAgIHNlbGYuZW52aXJvbm1lbnRfY3JlYXRlZCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmxvZy5pbmZvKCdEbyBub3Qga25vdyBob3cgdG8gdXBncmFkZSBpY3V0cmF4Y3RuX3RpY2tldG1nciB0YWJsZXMgdG8gJWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmljdV90a3RtZ3IoKSkKKwljdXJzb3IuY2xvc2UoKQorCisgICAgZGVmIHJlc3luYyhzZWxmLCBsb2csIGRiLCByZXBvcywgb3VyWW91bmdlc3QsIHRoZWlyWW91bmdlc3QpOgorICAgICAgICBzZWxmLmxvZy5pbmZvKCdyZXN5bmM6IG91cllvdW5nZXN0PSVkIHRoZWlyWW91bmdlc3Q9JWQnICUgKG91cllvdW5nZXN0LCB0aGVpcllvdW5nZXN0KSkKKyAgICAgICAgaWYgKG91cllvdW5nZXN0IDwgMCk6CisgICAgICAgICAgICAjIHN0YXJ0IGF0IHJldiAxCisgICAgICAgICAgICBvdXJZb3VuZ2VzdCA9IDEKKyAgICAgICAgCisgICAgICAgICNzZWxmLnRpY2tldF9wYXR0ZXJuID0gc2VsZi5lbnYuY29uZmlnLmdldCgnaWN1Y29kZXRvb2xzJywgJ3RpY2tldF9wYXR0ZXJuJywgJ15jbGRyYnVnIChcZCspOicpCisKKyAgICAgICAgIyAgICAgICAgbG9nLmluZm8oIlBhdDogJXMiICUgKHNlbGYudGlja2V0X3BhdHRlcm4pKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnRpY2tldF9tYXRjaCA9IHJlLmNvbXBpbGUoc2VsZi50aWNrZXRfcGF0dGVybikKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgZToKKyAgICAgICAgICAgIGZvdW5kID0gc2VsZi5lbnYuY29uZmlnLmdldCgnaWN1Y29kZXRvb2xzJywgJ3RpY2tldF9wYXR0ZXJuJywgJ05vbmVGb3VuZCcpCisgICAgICAgICAgICByYWlzZSBUcmFjRXJyb3IoJ0NvdWxkIG5vdCBjb21waWxlIGljdWNvZGV0b29scy50aWNrZXRfcGF0dGVybj0vJXMvIGJ1dCAvJXMvOiAlcycgJSAoc2VsZi50aWNrZXRfcGF0dGVybiwgZm91bmQsIGV4Y2VwdGlvbl90b191bmljb2RlKGUsIHRyYWNlYmFjaz1UcnVlKSkpCisKKyMgICAgICAgIHNlbGYudGlja2V0X21hdGNoID0gcmUuY29tcGlsZShzZWxmLnRpY2tldF9wYXR0ZXJuLmdldCgpKQorIyAgICAgICAgc2VsZi50aWNrZXRfbWF0Y2ggPSByZS5jb21waWxlKCcuKicpCisgICAgICAgIGZvciBpIGluIHJhbmdlKG91cllvdW5nZXN0LCB0aGVpcllvdW5nZXN0KzEpOgorICAgICAgICAgICAgI2xvZy53YXJuaW5nKCdzeW5jaW5nOiAlZCBbJWQvJWQrMV0nLCBpLCB0aGVpcllvdW5nZXN0KQorICAgICAgICAgICAgY3NldCA9IHJlcG9zLmdldF9jaGFuZ2VzZXQoaSkKKyAgICAgICAgICAgIHNlbGYucmV2aXNpb25fY2hhbmdlZChsb2csIGNzZXQsIGksIGRiLmN1cnNvcigpKQorICAgICAgICBkYi5jb21taXQoKQorICAgICAgICBjdXJzb3IgPSBkYi5jdXJzb3IoKTsKKyAgICAgICAgY3Vyc29yLmV4ZWN1dGUoInVwZGF0ZSBzeXN0ZW0gc2V0IHZhbHVlPSclcycgd2hlcmUgbmFtZT0naWN1X3RrdG1ncl95b3VuZ2VzdCciICUgKHRoZWlyWW91bmdlc3QpKQorICAgICAgICBkYi5jb21taXQoKQorICAgICAgICAjbG9nLndhcm4oInNlbGYua25vd25feW91bmdlc3Qgd2FzICVkIFslZC8lZF0iICUgKHNlbGYua25vd25feW91bmdlc3Qsb3VyWW91bmdlc3QsdGhlaXJZb3VuZ2VzdCkpIAorICAgICAgICAjIHVwZGF0ZSBrbm93biB5b3VuZ2VzdC4KKyAgICAgICAgc2VsZi5rbm93bl95b3VuZ2VzdCA9IHRoZWlyWW91bmdlc3QKKyAgICAgICAgI2xvZy53YXJuKCJzZWxmLmtub3duX3lvdW5nZXN0IG5vdyAlZCBbJWQvJWRdIiAlIChzZWxmLmtub3duX3lvdW5nZXN0LG91cllvdW5nZXN0LHRoZWlyWW91bmdlc3QpKSAKKyAgICAgICAgcmV0dXJuCisKKyAgICAjIElSZXBvc2l0b3J5T2JzZXJ2ZXIgbWV0aG9kcworICAgIGRlZiByZXZpc2lvbl9jaGFuZ2VkKHNlbGYsIGxvZywgY3NldCwgbmV4dF95b3VuZ2VzdCwgY3Vyc29yKToKKyAgICAgICAgIyBzeW5jIHRoZSAncmV2MnRpY2tldCcgdGFibGUKKyAgICAgICAgbWVzc2FnZSA9IGNzZXQubWVzc2FnZSBvciAnLS0nCisgICAgICAgICMgY2FuIHdlIGxvYWQgYSB0aWNrZXQgZnJvbSBpdD8gICAidGlja2V0OjEyMzQ6IE1lc3NhZ2UiCisgICAgICAgIHJlcyA9IHNlbGYudGlja2V0X21hdGNoLm1hdGNoKG1lc3NhZ2UpCisgICAgICAgIGlmIHJlczoKKyAgICAgICAgICAgIHRpY2tuYW1lID0gcmVzLmdyb3VwKDEpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaW50KHJlcy5ncm91cCgxKSkgIyBzaG91bGQgYmUgaW50CisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uLCBlOgorICAgICAgICAgICAgICAgIGxvZy53YXJuaW5nKCdSZXZpc2lvbiBbJXNdIGhhZCB1bnBhcnNlYWJsZSB0aWNrZXQgbnVtYmVyIFslc106IFslc10nICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZXh0X3lvdW5nZXN0LCB0aWNrbmFtZSwgZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICB0cnk6CisJCSNsb2cud2FybmluZygnciVzPSMlcycgJSAoc3RyKG5leHRfeW91bmdlc3QpLCB0aWNrbmFtZSkpCisgICAgICAgICAgICAgICAgY3Vyc29yLmV4ZWN1dGUoIklOU0VSVCBPUiBJR05PUkUgSU5UTyByZXYydGlja2V0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIChyZXYsdGlja2V0KSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZBTFVFUyAoJXMsJXMpICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cihuZXh0X3lvdW5nZXN0KSwgdGlja25hbWUpKQorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgZTogIyAqYW5vdGhlciogMS4xLiByZXN5bmMgYXR0ZW1wdCB3b24gCisgICAgICAgICAgICAgICAgbG9nLndhcm5pbmcoJ3JldjJ0aWNrZXQgJXMgY291bGQgbm90IGNhY2hlOiAlcycgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5leHRfeW91bmdlc3QsIGUpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGxvZy53YXJuaW5nKCdSZXZpc2lvbiAlcyBoYWQgdW5tYXRjaGVkIG1lc3NhZ2UgJXMnICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZXh0X3lvdW5nZXN0LCBjc2V0Lm1lc3NhZ2UpKQorICAgIAorICAgIGRlZiByZXBvc2l0b3J5X3Jlc3luYyhzZWxmLCBjdXJzb3IpOgorICAgICAgICBjdXJzb3IuZXhlY3V0ZSgiREVMRVRFIEZST00gcmV2MnRpY2tldCIpOworICAgICAgICAKKyAgICBkZWYgdGt0MnJldnMoc2VsZiwgbG9nLCBkYiwgcmVwb3MsIHJlcSwgdGlja2V0KToKKyAgICAgICAgIiIiR2l2ZW4gYSB0aWNrZXQsIHJldHVybiBhIGxpc3Qgb2YgcmV2cy4KKyAgICAgICAgIiIiCisgICAgICAgIAorICAgICAgICBzZWxmLmNoZWNrX3N5bmMobG9nLCBkYiwgcmVwb3MpCisgICAgICAgIGN1cnNvciA9IGRiLmN1cnNvcigpCisgICAgICAgIGN1cnNvci5leGVjdXRlKCJzZWxlY3QgcnQucmV2IGZyb20gcmV2MnRpY2tldCBhcyBydCB3aGVyZSBydC50aWNrZXQgPSAlZCBvcmRlciBieSBydC5yZXYiICUgaW50KHRpY2tldCkpCisgICAgICAgIHJldnMgPSBbXQorICAgICAgICBmb3IgcmV2LCBpbiBjdXJzb3I6CisgICAgICAgICAgICByZXYgPSBpbnQocmV2KQorICAgICAgICAgICAgcmV2cy5hcHBlbmQocmV2KQorCWN1cnNvci5jbG9zZSgpCisgICAgICAgIHJldHVybiByZXZzCmRpZmYgLS1naXQgYS90cmFjL0ljdUNvZGVUb29scy8wLjExL2ljdWNvZGV0b29scy90a3RsaXN0LnB5IGIvdHJhYy9JY3VDb2RlVG9vbHMvMC4xMS9pY3Vjb2RldG9vbHMvdGt0bGlzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hN2RlNDk2Ci0tLSAvZGV2L251bGwKKysrIGIvdHJhYy9JY3VDb2RlVG9vbHMvMC4xMS9pY3Vjb2RldG9vbHMvdGt0bGlzdC5weQpAQCAtMCwwICsxLDE3MSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBJQk0gYW5kIE90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitpbXBvcnQgcmUKKworaW1wb3J0IHN5cworCitmcm9tIHRyYWMuY29yZSBpbXBvcnQgKgorZnJvbSB0cmFjLnV0aWwgaW1wb3J0IE1hcmt1cAorZnJvbSB0cmFjLndlYiBpbXBvcnQgSVJlcXVlc3RIYW5kbGVyCitmcm9tIHRyYWMud2ViLmNocm9tZSBpbXBvcnQgYWRkX3N0eWxlc2hlZXQsIElOYXZpZ2F0aW9uQ29udHJpYnV0b3IsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVGVtcGxhdGVQcm92aWRlcgorZnJvbSB0cmFjLndlYi5ocmVmIGltcG9ydCBIcmVmCisjZnJvbSB0cmFjLnZlcnNpb25jb250cm9sLndlYl91aS5jaGFuZ2VzZXQgaW1wb3J0IElDaGFuZ2VzZXRSYW5nZUxpbmsKK2Zyb20gdHJhYy53aWtpIGltcG9ydCB3aWtpX3RvX2h0bWwsIHdpa2lfdG9fb25lbGluZXIsIElXaWtpU3ludGF4UHJvdmlkZXIsIFwKKyAgICAgICAgICAgICAgICAgICAgICBGb3JtYXR0ZXIKK2Zyb20gdHJhYy50aWNrZXQgaW1wb3J0IFRpY2tldAorCisKKworY2xhc3MgVGlja2V0bGlzdE1vZHVsZShDb21wb25lbnQpOgorCisgICAgaW1wbGVtZW50cyhJUmVxdWVzdEhhbmRsZXIpCisjICAgIGltcGxlbWVudHMoSVJlcXVlc3RIYW5kbGVyLElDaGFuZ2VzZXRSYW5nZUxpbmspCisKKyAgICBkZWYgcmV2aXNpb25fcmFuZ2VfbGluayhzZWxmLCByZXEsIGJhc2UsIHN0YXJ0LCBlbmQpOgorICAgICAgICByZXR1cm4gKCdUaWNrZXQgTGlzdCcsIHJlcS5ocmVmKCd0a3RsaXN0JyxvbGRfcGF0aD1iYXNlLG5ld19wYXRoPWJhc2Usb2xkPXN0YXJ0LG5ldz1lbmQpKQorCisgICAgX3JlcXVlc3RfcmUgPSByZS5jb21waWxlKHIiL3RrdGxpc3QoPzovKFteL10rKSk/KC8uKik/JCIpCisKKyAgICBkZWYgbWF0Y2hfcmVxdWVzdChzZWxmLCByZXEpOgorICAgICAgICBtYXRjaCA9IHJlLm1hdGNoKHNlbGYuX3JlcXVlc3RfcmUsIHJlcS5wYXRoX2luZm8pCisgICAgICAgIGlmIG1hdGNoOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBwcm9jZXNzX3JlcXVlc3Qoc2VsZiwgcmVxKToKKyAgICAgICAgI29rLCB3aGF0IGFyZSB3ZSBhYm91dC4KKyAgICAgICAgZGIgPSBzZWxmLmVudi5nZXRfZGJfY254KCkKKyAgICAgICAgdGlja2V0bGlzdCA9IHt9ICAjIGRpY3Qgb2YgdGlja2V0LT4/Pz8KKyAgICAgICAgcmV2bGlzdCA9IHt9ICMgZGljdCBvZiByZXZpc2lvbi0+CisgICAgICAgIHJlcG9zID0gc2VsZi5lbnYuZ2V0X3JlcG9zaXRvcnkocmVxLmF1dGhuYW1lKQorCisgICAgICAgIGlmIG5vdCByZXEucGVybS5oYXNfcGVybWlzc2lvbignVElDS0VUX01PRElGWScpOgorICAgICAgICAgICAgcmV0dXJuIHJlcS5yZWRpcmVjdChyZXEuaHJlZi5icm93c2VyKCkpCisKKyAgICAgICAgIyBzaG9ydGN1dCAtIGlmICJyZXZzIiBpcyBzZXQsIGp1c3QgdXNlIHRoYXQKKyAgICAgICAgcmV2cyA9IHJlcS5hcmdzLmdldCgncmV2cycpCisgICAgICAgIGlmIHJldnMgYW5kIGxlbihyZXZzKT4wOgorICAgICAgICAgICBjb250ZW50X3R5cGUgPSAidGV4dC9odG1sIgorICAgICAgICAgICBhZGRfc3R5bGVzaGVldChyZXEsICdjc3MvaWN1eHRuLmNzcycpCisgICAgICAgICAgIHJlcS5oZGZbJ3RpeC5yZXZzJ10gPSByZXZzCisgICAgICAgICAgIGl0ZW1zID0gcmV2cy5zcGxpdCgpCisgICAgICAgICAgIG91dHN0ciA9ICcxPTAgJworICAgICAgICAgICBmb3IgaXRlbSBpbiBpdGVtczoKKyAgICAgICAgICAgICAgIHJldiA9IGludChpdGVtKSAjIG1heSBmYWlsCisgICAgICAgICAgICAgICBvdXRzdHIgPSAncnQucmV2PSVkJyUocmV2KQorICAgICAgICAgICByZXEuaGRmWydpc19kY3V0J109MQorICAgICAgICAgICByZXEuaGRmWyd0aXguc3FsJ10gPSBvdXRzdHIgIAorICAgICAgICAgICAjIHRlc3QgLSBnZXQgcmVsZXZhbnQgcmV2cworICAgIyAgICAgICAgcHJpbnQgIm90aW1lPSVzLCBudGltZT0lcyIlKHR5cGUob3RpbWUpLHR5cGUobnRpbWUpKQorICAgICAgICAgICAjY3Vyc29yLmV4ZWN1dGUoInNlbGVjdCBkaXN0aW5jdCB0LmlkLHQuc3VtbWFyeSBmcm9tIHRpY2tldCBhcyB0LHJldmlzaW9uIGFzIHIsIHJldjJ0aWNrZXQgYXMgcnQgIgorICAgICAgICAgICAjICAgICAgICAgICAgICAgIiB3aGVyZSB0LmlkID0gcnQudGlja2V0IGFuZCAoJXMpIG9yZGVyIGJ5IHQuaWQiJShvdXRzdHIpKQorICAgICAgICAgICBhbGxzcWwgPSAic2VsZWN0IGRpc3RpbmN0IHRpY2tldCBmcm9tIHJldjJ0aWNrZXQgYXMgcnQgd2hlcmUgJXMgb3JkZXIgYnkgcnQudGlja2V0IiUob3V0c3RyKQorICAgICAgICAgICBhbGxzcWwgPSAic2VsZWN0IHRpY2tldCBmcm9tIHJldjJ0aWNrZXQgd2hlcmUgcmV2PSVzIG9yZGVyIGJ5IHRpY2tldCIKKyAgICAgICAgICAgY3Vyc29yID0gZGIuY3Vyc29yKCkKKyAgICAgICAgICAjIGN1cnNvci5leGVjdXRlKCJzZWxlY3QgdGlja2V0IGZyb20gcmV2MnRpY2tldCB3aGVyZSByZXY9JXMgb3JkZXIgYnkgdGlja2V0IiwoIjIyOTEzIiwpKQorICAgICAgICAgICBjdXJzb3IuZXhlY3V0ZSgic2VsZWN0IHJ0LnJldiBmcm9tIHJldjJ0aWNrZXQgYXMgcnQgd2hlcmUgcnQudGlja2V0ID0gJWQgb3JkZXIgYnkgcnQucmV2IiAlIGludCg2MDEwKSkKKyAgICAgICAgICAgdGlja2V0ID0gMAorICAgICAgICAgICByZXEuaGRmWyd0aXguc3FsJ10gPSBhbGxzcWwgIAorICAgICAgICAgICByZXEuaGRmWyd0aXguc3FsJ109Inplcm8iCisgICAgICAgICAgIGZvciB0a3QgaW4gY3Vyc29yOgorICAgICAgICAgICAgICAgcmVxLmhkZlsndGl4LnNxbCddPXRrdAorICAgICAgICAgICAgICAgc3VtbSA9ICIiOworICAgICAgICAgICAgICAgI3N5cy5zdGRlcnIud3JpdGUoIiB0a3QgJXMgc3VtbSAlcyBmcm9tIChkLWQpIiAlICh0a3Qsc3VtbSkpCisgICAgICAgICAgICAgICB0aWNrZXQgPSB0aWNrZXQgKyAxCisgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgcmVxLmhkZlsndGlja2V0cy4lZC5jb21tZW50JyAlIHRpY2tldF0gPSBzdW1tCisgICAgICAgICAgICAgICAgICAgI3JlcS5oZGZbJ3RpY2tldHMuJWQuY29tbWVudGh0bWwnICUgdGlja2V0XSA9IHdpa2lfdG9fb25lbGluZXIoIHN1bW0sIHNlbGYuZW52LCBkYiwgc2hvcnRlbj1UcnVlICkKKyAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24sZToKKyAgICAgICAgICAgICAgICAgICByZXEuaGRmWyd0aXguc3FsJ109ZQorICAgICAgICAgICAgICAgICAgICNyZXEuaGRmWyd0aWNrZXRzLiVkLmNvbW1lbnRodG1sJyAlIHRpY2tldF0gPSAnJworICAgICAgICAgICAgICAgICAgIHJlcS5oZGZbJ3RpY2tldHMuJWQuY29tbWVudCcgJSB0aWNrZXRdID0gJycKKyAgICAgICAgICAgICAgIHJlcS5oZGZbJ3RpY2tldHMuJWQubnVtYmVyJyAlIHRpY2tldF0gPSB0a3QKKyAgICAgICAgICAgICAgICNhYSA9IE1hcmt1cCgiPGEgY2xhc3M9XCJuZXcgdGlja2V0XCIgaHJlZj1cIiVzXCIgdGl0bGU9XCJUaWNrZXQgeCAobmV3KVwiPiMlczwvYT4iJShyZXEuaHJlZi50aWNrZXQodGt0KSx0a3QpKQorICAgICAgICAgICAgICAgI3JlcS5oZGZbJ3RpY2tldHMuJWQuaHRtbCcgJSB0aWNrZXRdID0gYWEKKyAgICAgICAgICAgIyBzZXQgUkRGIGhlcmUKKyAgICAgICAgICAgcmV0dXJuICd0a3RyZXZzLmNzJywgY29udGVudF90eXBlCisKKyAgICAgICAgbmV3X3BhdGggPSByZXEuYXJncy5nZXQoJ25ld19wYXRoJykKKyAgICAgICAgbmV3X3JldiA9IHJlcS5hcmdzLmdldCgnbmV3JykKKyAgICAgICAgb2xkX3BhdGggPSByZXEuYXJncy5nZXQoJ29sZF9wYXRoJykKKyAgICAgICAgb2xkX3JldiA9IHJlcS5hcmdzLmdldCgnb2xkJykKKworICAgICAgICBuZXdfcGF0aCA9IHJlcG9zLm5vcm1hbGl6ZV9wYXRoKG5ld19wYXRoKQorICAgICAgICBuZXdfcmV2ID0gcmVwb3Mubm9ybWFsaXplX3JldihuZXdfcmV2KQorICAgICAgICBvbGRfcGF0aCA9IHJlcG9zLm5vcm1hbGl6ZV9wYXRoKG9sZF9wYXRoKQorICAgICAgICBvbGRfcmV2ID0gcmVwb3Mubm9ybWFsaXplX3JldihvbGRfcmV2KQorCisKKyAgICAgICAgb2xkX3JldiA9IGludChvbGRfcmV2KQorICAgICAgICBuZXdfcmV2ID0gaW50KG5ld19yZXYpCisgICAgICAgIAorICAgICAgICByZXEuaGRmWydjaGFuZ2VzZXQuZGlmZl9ocmVmJ10gPSByZXEuaHJlZignY2hhbmdlc2V0JyxvbGRfcGF0aD1vbGRfcGF0aCxuZXc9bmV3X3JldixuZXdfcGF0aD1uZXdfcGF0aCxvbGQ9b2xkX3JldikKKworICAgICAgICByZXEuaGRmWydpc19kY3V0J109MQorICAgICAgICAKKyAgICAgICAgcmVxLmhkZlsnY2hhbmdlc2V0Lm9sZF9yZXYnXSA9IG9sZF9yZXYKKyAgICAgICAgcmVxLmhkZlsnY2hhbmdlc2V0Lm5ld19yZXYnXSA9IG5ld19yZXYKKyAgICAgICAgcmVxLmhkZlsnY2hhbmdlc2V0Lm9sZF9wYXRoJ10gPSBvbGRfcGF0aAorICAgICAgICByZXEuaGRmWydjaGFuZ2VzZXQubmV3X3BhdGgnXSA9IG5ld19wYXRoCisgICAgICAgIGNvbnRlbnRfdHlwZSA9ICJ0ZXh0L2h0bWwiCisgICAgICAgIGFkZF9zdHlsZXNoZWV0KHJlcSwgJ2Nzcy9pY3V4dG4uY3NzJykKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgIyBmaXJzdCwgZ2V0IHJlbGV2YW50IGNoYW5nZXMuCisgICAgICAgIHJlcS5oZGZbJ3RhcmdldF9wYXRoJ10gPSAnLic7CisgICAgICAgICMgb2theS4gbWFudWFsbHkgdHJvbXAgdGhyb3VnaCAnZW0KKyAgICAgICAgb3NldCA9IHJlcG9zLmdldF9jaGFuZ2VzZXQob2xkX3Jldik7CisgICAgICAgIG5zZXQgPSByZXBvcy5nZXRfY2hhbmdlc2V0KG5ld19yZXYpOworICAgICAgICBvdGltZSA9IGludChvc2V0LmRhdGUpCisgICAgICAgIG50aW1lID0gaW50KG5zZXQuZGF0ZSkKKyAgICAgICAgCisgICAgICAgIG5vcm1fdHI9InN0eWxlPSdib3JkZXI6IDFweCBkYXNoZWQgZ3JlZW47IGJhY2tncm91bmQtY29sb3I6ICNDRkM7JyIKKyAgICAgICAgY2xvc2VkX3RyPSJzdHlsZT0nY29sb3I6ICM2NjY7JyIKKyAgICAgICAgbm9yZXZfdHI9InN0eWxlPSdiYWNrZ3JvdW5kLWNvbG9yOiNGREQ7IGJvcmRlcjogMXB4IHNvbGlkICNGOTk7IGZvbnQtd2VpZ2h0OiBib2xkOyciCisKKyAgICAgICAgcmVxLmhkZlsnc2FtcGxlLm5vcm0udHInXSA9IG5vcm1fdHIKKyAgICAgICAgcmVxLmhkZlsnc2FtcGxlLmNsb3NlZC50ciddID0gY2xvc2VkX3RyCisgICAgICAgIHJlcS5oZGZbJ3NhbXBsZS5ub3Jldi50ciddID0gbm9yZXZfdHIKKyAgICAgICAgCisjICAgICAgICBwcmludCAiIHNlYXJjaGluZyBpbiAgKCVzLSVzKSIgJSAob3RpbWUsIG50aW1lKQorCisgICAgICAgICMgdGVzdCAtIGdldCByZWxldmFudCByZXZzCisgICAgICAgIGN1cnNvciA9IGRiLmN1cnNvcigpCisjICAgICAgICBwcmludCAib3RpbWU9JXMsIG50aW1lPSVzIiUodHlwZShvdGltZSksdHlwZShudGltZSkpCisgICAgICAgIGN1cnNvci5leGVjdXRlKCJzZWxlY3QgZGlzdGluY3QgdC5pZCx0LnN1bW1hcnksdC5vd25lciwgdC5taWxlc3RvbmUsIHQuc3RhdHVzICIKKyAgICAgICAgICAgICAgICAgICAgICAgIiAsIGMudmFsdWUgIiAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICIgZnJvbSB0aWNrZXQgYXMgdCxyZXZpc2lvbiBhcyByLCByZXYydGlja2V0IGFzIHJ0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgIiBsZWZ0IGpvaW4gdGlja2V0X2N1c3RvbSBhcyBjICIKKyAgICAgICAgICAgICAgICAgICAgICAgIiBvbiAgKCBjLm5hbWUgPSAncmV2dycgQU5EIGMudGlja2V0ID0gdC5pZCApICIKKyMgICAgICAgICAgICAgICAgICAgICAgICIgLCB0aWNrZXRfY3VzdG9tIGFzIGMgIgorICAgICAgICAgICAgICAgICAgICAgICAiIHdoZXJlIHQuaWQgPSBydC50aWNrZXQgYW5kIHJ0LnJldiA9IHIucmV2IGFuZCByLnRpbWUgPiAlcyBhbmQgci50aW1lIDw9ICVzICIKKyAgICAgICAgICAgICAgICAgICAgICAgImFuZCBleGlzdHMgKCBzZWxlY3QgbmMucmV2IGZyb20gbm9kZV9jaGFuZ2UgYXMgbmMgd2hlcmUgbmMucmV2PXIucmV2IGFuZCBuYy5wYXRoIGxpa2UgJXMgKSAiCisgICAgICAgICAgICAgICAgICAgICAgICJvcmRlciBieSB0LmlkIiwgKHN0cihvdGltZSksIHN0cihudGltZSksIChvbGRfcGF0aCArICIlIikpKQorICAgICAgICB0aWNrZXQgPSAwCisgICAgICAgIGZvciB0a3Qsc3VtbSxvd25yLG1pbGVzdG9uZSxzdGF0dXMsIHJldncgaW4gY3Vyc29yOgorIyAgICAgICAgICAgIHByaW50ICIgdGt0ICVzIHN1bW0gJXMgZnJvbSAoJWQtJWQpIiAlICh0a3Qsc3VtbSwgb3RpbWUsIG50aW1lKQorICAgICAgICAgICAgdGlja2V0ID0gdGlja2V0ICsgMQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJlcS5oZGZbJ3RpY2tldHMuJWQuY29tbWVudCcgJSB0aWNrZXRdID0gc3VtbQorICAgICAgICAgICAgICAgIHJlcS5oZGZbJ3RpY2tldHMuJWQuY29tbWVudGh0bWwnICUgdGlja2V0XSA9IHdpa2lfdG9fb25lbGluZXIoIHN1bW0sIHNlbGYuZW52LCBkYiwgc2hvcnRlbj1UcnVlICkKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24sZToKKyAgICAgICAgICAgICAgICByZXEuaGRmWyd0aWNrZXRzLiVkLmNvbW1lbnRodG1sJyAlIHRpY2tldF0gPSAnJworICAgICAgICAgICAgICAgIHJlcS5oZGZbJ3RpY2tldHMuJWQuY29tbWVudCcgJSB0aWNrZXRdID0gJycKKyAgICAgICAgICAgIHJlcS5oZGZbJ3RpY2tldHMuJWQubnVtYmVyJyAlIHRpY2tldF0gPSB0a3QKKyAgICAgICAgICAgIGFhID0gTWFya3VwKCI8YSBjbGFzcz1cIm5ldyB0aWNrZXRcIiBocmVmPVwiJXNcIiB0aXRsZT1cIlRpY2tldCB4IChuZXcpXCI+IyVzPC9hPiIlKHJlcS5ocmVmLnRpY2tldCh0a3QpLHRrdCkpCisgICAgICAgICAgICByZXEuaGRmWyd0aWNrZXRzLiVkLmh0bWwnICUgdGlja2V0XSA9IGFhCisgICAgICAgICAgICBhYSA9IE1hcmt1cCgiPGEgY2xhc3M9XCJuZXcgdGlja2V0XCIgaHJlZj1cIiVzXCIgdGl0bGU9XCJUaWNrZXQgeCAobmV3KVwiPiMlczwvYT4iJShyZXEuaHJlZi50aWNrZXQodGt0KSx0a3QpKQorICAgICAgICAgICAgcmVxLmhkZlsndGlja2V0cy4lZC5vd25lcicgJSB0aWNrZXRdID0gb3ducgorICAgICAgICAgICAgcmVxLmhkZlsndGlja2V0cy4lZC5taWxlc3RvbmUnICUgdGlja2V0XSA9IHdpa2lfdG9fb25lbGluZXIoICJtaWxlc3RvbmU6JXMiJW1pbGVzdG9uZSAsIHNlbGYuZW52LCBkYiwgc2hvcnRlbj1GYWxzZSApCisgICAgICAgICAgICByZXEuaGRmWyd0aWNrZXRzLiVkLnJldmlld2VyJyAlIHRpY2tldF0gPSByZXZ3CisgICAgICAgICAgICByZXEuaGRmWyd0aWNrZXRzLiVkLnN0YXR1c2h0bWwnICUgdGlja2V0XSA9IHdpa2lfdG9fb25lbGluZXIoICIjJXMiJSh0a3QpLCBzZWxmLmVudiwgZGIsIHNob3J0ZW49RmFsc2UgKQorICAgICAgICAgICAgcmVxLmhkZlsndGlja2V0cy4lZC5odG1sJyAlIHRpY2tldF0gPSBhYQorICAgICAgICAgICAgcmVxLmhkZlsndGlja2V0cy4lZC50cicgJSB0aWNrZXRdID0gbm9ybV90cgorICAgICAgICAgICAgaWYgc3RhdHVzIGFuZCBzdGF0dXMuc3RhcnRzd2l0aCgnY2xvc2VkJyk6CisgICAgICAgICAgICAgICAgcmVxLmhkZlsndGlja2V0cy4lZC50cicgJSB0aWNrZXRdID0gY2xvc2VkX3RyCisgICAgICAgICAgICBpZiAoIG5vdCByZXZ3ICkgb3IgbGVuKHJldncpPDE6CisgICAgICAgICAgICAgICAgcmVxLmhkZlsndGlja2V0cy4lZC50cicgJSB0aWNrZXRdID0gbm9yZXZfdHIKKyAgICAgICAgCisgICAgICAgIHJldHVybiAndGt0bGlzdC5jcycsIGNvbnRlbnRfdHlwZQorCmRpZmYgLS1naXQgYS90cmFjL0ljdUNvZGVUb29scy8wLjExL2xpY2Vuc2UuaHRtbCBiL3RyYWMvSWN1Q29kZVRvb2xzLzAuMTEvbGljZW5zZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhZTAyNTIKLS0tIC9kZXYvbnVsbAorKysgYi90cmFjL0ljdUNvZGVUb29scy8wLjExL2xpY2Vuc2UuaHRtbApAQCAtMCwwICsxLDUxIEBACis8aHRtbD4KKworPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSI+PC9tZXRhPgorPHRpdGxlPklDVSBMaWNlbnNlIC0gSUNVIDEuOC4xIGFuZCBsYXRlcjwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5IEJHQ09MT1I9IiNmZmZmZmYiPgorPGgyPklDVSBMaWNlbnNlIC0gSUNVIDEuOC4xIGFuZCBsYXRlcjwvaDI+CisKKzxwPkNPUFlSSUdIVCBBTkQgUEVSTUlTU0lPTiBOT1RJQ0U8L3A+CisKKzxwPgorQ29weXJpZ2h0IChjKSAxOTk1LTIwMTAgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzCis8L3A+Cis8cD4KK0FsbCByaWdodHMgcmVzZXJ2ZWQuCis8L3A+Cis8cD4KK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKK29mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAordG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgordGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIGFuZC9vciBzZWxsCitjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMKK3RvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKK2NvcHlyaWdodCBub3RpY2UocykgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMKK29mIHRoZSBTb2Z0d2FyZSBhbmQgdGhhdCBib3RoIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlKHMpIGFuZCB0aGlzCitwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLgorPC9wPgorPHA+CitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUiBJTVBMSUVELCAKK0lOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBCitQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVCBPRiBUSElSRCBQQVJUWSBSSUdIVFMuIElOIE5PIEVWRU5UIFNIQUxMCitUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBIT0xERVJTIElOQ0xVREVEIElOIFRISVMgTk9USUNFIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLAorT1IgQU5ZIFNQRUNJQUwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTLCBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSCitSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKK05FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCitVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKzwvcD4KKzxwPgorRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgYSBjb3B5cmlnaHQgaG9sZGVyIHNoYWxsIG5vdCBiZQordXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzIGluCit0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVyLgorPC9wPgorCis8aHI+Cis8cD48c21hbGw+CitBbGwgdHJhZGVtYXJrcyBhbmQgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG1lbnRpb25lZCBoZXJlaW4gYXJlIHRoZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKzwvc21hbGw+PC9wPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJhYy9JY3VDb2RlVG9vbHMvMC4xMS9yZWFkbWUudHh0IGIvdHJhYy9JY3VDb2RlVG9vbHMvMC4xMS9yZWFkbWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1NDlkOTEKLS0tIC9kZXYvbnVsbAorKysgYi90cmFjL0ljdUNvZGVUb29scy8wLjExL3JlYWRtZS50eHQKQEAgLTAsMCArMSw3NCBAQAorSUNVIENvZGUgVG9vbHMgcGx1Z2luCisKK0NvcHlyaWdodCAoQykgMjAxMCBJQk0gQ29ycG9yYXRpb24gYW5kIE90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KK1NlZSBsaWNlbnNlLmh0bWwgZm9yIHRoZSBsaWNlbnNlIGZpbGUuIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZQorSUNVIHByb2plY3QgYW5kIGlzIHVuZGVyIHRoZSBzYW1lIGxpY2Vuc2UuCisKK1JlcXVpcmVtZW50czoKKwlUcmFjICgwLjExIG9yIDAuMTIrPykKKwlSZXBvc2l0b3J5CisKK0luc3RhbGxpbmc6CisJMS4gaW5zdGFsbCB0aGUgcGx1Z2luIC0gYXQgbGVhc3QgdGhlIHRpY2tldG1hbmFnZXIgYW5kIHJldmlldyBwb3J0aW9uLgorCisgICAgICAgICBhLiBUaGVyZSBpcyBubyBzb3VyY2UgcmVsZWFzZSBhdCB0aGlzIHRpbWU6IEkgcmVjb21tZW5kCisgICAgICAgICAgICAgdGhhdCB5b3UgY2hlY2sgb3V0IHRoaXMgY29kZSB3aXRoIHN2bgorICAgICAgICAgICAgIGFuZCBpbiB0aGlzIGRpcmVjdG9yeSwgcnVuOiAKKyAgICAgICAgICAgICAgICAicHl0aG9uIHNldHVwLnB5IGRldmVsb3AiCisJCisJIGIuIEluIHRyYWMuaW5pIHVuZGVyICdbY29tcG9uZW50c10nIGFkZDoKKwkJaWN1Y29kZXRvb2xzLnJldmlldy5yZXZpZXdtb2R1bGUgPSBlbmFibGVkCisJCWljdWNvZGV0b29scy50aWNrZXRtZ3IudGlja2V0bWFuYWdlciA9IGVuYWJsZWQKKwkKKwlOT1RFOiBEQ1VUIGFuZCBUS1RMSVNUIHBhcnRzIGFyZSBub3Qgd29ya2luZyB5ZXQuIAorCURvbid0IGJvdGhlciB0byBlbmFibGUgdGhlbS4KKworCTIuIGluIHlvdXIgdHJhYy5pbmkgZGVzY3JpYmUgaG93IHlvdXIgY2hhbmdlc2V0cyBkZXNjcmliZSBhIHRpY2tldC4gCisJT3VyIGNoYW5nZXNldHMgbG9vayBsaWtlIHRoaXM6ICAidGlja2V0OjEyMzQ6IGZpeGVkIHRoZSBicm9rZW4gY29kZSIKKwlXZSB1c2UgdGhpcyByZWdleDoKKworCSAgIFtpY3Vjb2RldG9vbHNdCisJICAgdGlja2V0X3BhdHRlcm4gPSBedGlja2V0OihcZCspCisKKwkzLiB5b3UgbWF5IG5lZWQgdG8gcnVuIHRyYWMtYWRtaW4gPGVudmlyb25tZW50PiB1cGdyYWRlIAorCisJNC4gR3JhbnQgcGVybWlzc2lvbiBvZiBJQ1VSRVZJRVdfVklFVyB0byB3aG9tZXZlciB5b3Ugd2FudCB0byAKKwkgICBiZSBhYmxlIHRvIHJldmlldyB0aWNrZXRzLiAKKworCTUuIE5vdywgYW55IHRpY2tldCB3aWxsIGhhdmUgc29tZXRoaW5nIGluIHRoZSB0b3AgcmlnaHQgY29ybmVyIHdoaWNoIHNheXM6CisJICAgICAiTm8gY29tbWl0cyIgLSBubyBjb21taXRzIGFnYWluc3QgdGhpcyB0aWNrZXQKKworCSAgICAgIlJldmlldyAxIGNvbW1pdHMiICAtIHRoZXJlIGlzIG9ubHkgb25lIGNvbW1pdC4gQ2xpY2tpbmcgdGhpcyBsaW5rCisJICAgICAgICAgICAgIHdpbGwganVzdCB0YWtlIHlvdSB0byB0aGF0IHNpbmdsZSBjaGFuZ2VzZXQuCisKKwkgICAgICAiUmV2aWV3IG4gY29tbWl0cyIgIC0gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgY29tbWl0cyBhZ2FpbnN0IHRoaXMKKwkgICAgICAgICAgICAgdGlja2V0LgorCisgCitUcm91Ymxlc2hvb3Rpbmc6CisKK1E6IE15IGNvbW1pdHMgYXJlbid0IGJlaW5nIGZvdW5kIQorQTogQ2hlY2sgdGhlIGRlYnVnIGxvZy4gSXQgd2lsbCBub3RlIGNvbW1pdHMgd2l0aCB1bnBhcnNlYWJsZSBtZXNzYWdlcworCitROiBIb3cgZG8gSSByZXN5bmMgdGhlIGNvbW1pdHM/CitBOiBVbnRpbCB3ZSBpbXBsZW1lbnQgdHJhYyAwLjEyIGNoYW5nZXNldCBsaXN0ZW5lcnMsIHlvdSBjYW4gZG8gdGhpczoKKworICAgIDAuICBiYWNrIHVwIHlvdXIgcGF0aC90by9lbnYvZGIvdHJhYy5kYgorCisgICAgMS4gJCBzcWxpdGUzICBwYXRoL3RvL2Vudi9kYi90cmFjLmRiCisgICAgCisgICAgMi4gc3FsaXRlPiBkZWxldGUgZnJvbSByZXYydGlja2V0OworCisgICAgMy4gc3FsaXRlPiB1cGRhdGUgc3lzdGVtIHNldCB2YWx1ZT0nLTEnIHdoZXJlIG5hbWU9J2ljdV90a3RtZ3JfeW91bmdlc3QnOworCisgICAgNC4gc3FsaXRlPiAgLnF1aXQKKworTm93IHRoZSB0aWNrZXQgbWFuYWdlciB3aWxsIHJlLXN5bmMgdGhlIGZpcnN0IHRpbWUgeW91IGhpdCBhIHRpY2tldC4KKworRklMSU5HIEJVR1MvRkVBVFVSRSBSRVFVRVNUUzoKKyAtIFVzZSBJQ1UncyB0cmFjIHJlcG9zaXRvcnkgYXQgaHR0cDovL2J1Z3MuaWN1LXByb2plY3Qub3JnL3RyYWMKKyAtIFVzZSB0aGUgJ2luZnJhc3RydWN0dXJlJyBjb21wb25lbnQgYW5kIGNsZWFybHkgaWRlbnRpZnkgdGhlICdJQ1UgQ29kZSBUb29scworICAgZm9yIFRyYWMnIHdoZW4geW91IGZpbGUgdGhlIGJ1Zy4KKworCisKZGlmZiAtLWdpdCBhL3RyYWMvSWN1Q29kZVRvb2xzLzAuMTEvc2V0dXAuY2ZnIGIvdHJhYy9JY3VDb2RlVG9vbHMvMC4xMS9zZXR1cC5jZmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIyM2YyYgotLS0gL2Rldi9udWxsCisrKyBiL3RyYWMvSWN1Q29kZVRvb2xzLzAuMTEvc2V0dXAuY2ZnCkBAIC0wLDAgKzEsNCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBJQk0gYW5kIE90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZAorW2VnZ19pbmZvXQordGFnX2J1aWxkID0gZGV2Cit0YWdfc3ZuX3JldmlzaW9uID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvdHJhYy9JY3VDb2RlVG9vbHMvMC4xMS9zZXR1cC5weSBiL3RyYWMvSWN1Q29kZVRvb2xzLzAuMTEvc2V0dXAucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWIzZjE4OQotLS0gL2Rldi9udWxsCisrKyBiL3RyYWMvSWN1Q29kZVRvb2xzLzAuMTEvc2V0dXAucHkKQEAgLTAsMCArMSwzNSBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorIworIyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBJQk0gYW5kIE90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKworZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBzZXR1cCwgZmluZF9wYWNrYWdlcworCitQQUNLQUdFID0gJ0ljdUNvZGVUb29scycKK1ZFUlNJT04gPSAnMC4wLjEnCisKK3NldHVwKAorICAgIG5hbWU9UEFDS0FHRSwgdmVyc2lvbj1WRVJTSU9OLAorICAgIGRlc2NyaXB0aW9uPSdNaXNjZWxsYW5lb3VzIElDVSBFeHRlbnNpb25zIHRvIFRyYWMnLAorICAgIGF1dGhvcj0iU3RldmVuIFIuIExvb21pcyIsIGF1dGhvcl9lbWFpbD0ic3JsQGljdS1wcm9qZWN0Lm9yZyIsCisgICAgbGljZW5zZT0nQlNEJywgdXJsPSdodHRwOi8vaWN1LXByb2plY3Qub3JnJywKKyAgICBwYWNrYWdlcz1maW5kX3BhY2thZ2VzKGV4Y2x1ZGU9Wydlel9zZXR1cCcsICcqLnRlc3RzKiddKSwKKyAgICBwYWNrYWdlX2RhdGE9eworICAgICAgICAnaWN1Y29kZXRvb2xzJzogWworICAgICAgICAgICAgJ2h0ZG9jcy9jc3MvKi5jc3MnLAorICAgICAgICAgICAgJ3RlbXBsYXRlcy8qLmh0bWwnLAorIyMgICAgICAgICAgICAnaHRkb2NzL2ltZy8qLnBuZycsCisjICAgICAgICAgICAgJ2h0ZG9jcy9qcy8qLmpzJywKKyAgICAgICAgXQorICAgIH0sCisgICAgZW50cnlfcG9pbnRzID0geworICAgICAgICAndHJhYy5wbHVnaW5zJzogWworICAgICAgICAgICAgJ2ljdWNvZGV0b29scy50aWNrZXRtZ3IgPSBpY3Vjb2RldG9vbHMudGlja2V0bWdyJywKKyAgICAgICAgICAgICdpY3Vjb2RldG9vbHMucmV2aWV3ID0gaWN1Y29kZXRvb2xzLnJldmlldycsCisgICAgICAgICAgICAnaWN1Y29kZXRvb2xzLnRrdGxpc3QgPSBpY3Vjb2RldG9vbHMudGt0bGlzdCcsCisgICAgICAgICAgICAnaWN1Y29kZXRvb2xzLmRjdXQgPSBpY3Vjb2RldG9vbHMuZGN1dCcKKyAgICAgICAgXQorICAgIH0KKykKZGlmZiAtLWdpdCBhL3RyYWMvSWN1Q29kZVRvb2xzLzAuMTIvaWN1Y29kZXRvb2xzL19faW5pdF9fLnB5IGIvdHJhYy9JY3VDb2RlVG9vbHMvMC4xMi9pY3Vjb2RldG9vbHMvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODJkNjc1NgotLS0gL2Rldi9udWxsCisrKyBiL3RyYWMvSWN1Q29kZVRvb2xzLzAuMTIvaWN1Y29kZXRvb2xzL19faW5pdF9fLnB5CkBAIC0wLDAgKzEsNSBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KKyMgQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSUJNIGFuZCBPdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyMKKyMKKyNmcm9tIGljdXRyYWN4dG4ud2ViX3VpIGltcG9ydCAqCmRpZmYgLS1naXQgYS90cmFjL0ljdUNvZGVUb29scy8wLjEyL2ljdWNvZGV0b29scy9kY3V0LnB5IGIvdHJhYy9JY3VDb2RlVG9vbHMvMC4xMi9pY3Vjb2RldG9vbHMvZGN1dC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wYjc0ODZmCi0tLSAvZGV2L251bGwKKysrIGIvdHJhYy9JY3VDb2RlVG9vbHMvMC4xMi9pY3Vjb2RldG9vbHMvZGN1dC5weQpAQCAtMCwwICsxLDE1MSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBJQk0gYW5kIE90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZAorCitpbXBvcnQgcmUKKworZnJvbSB0cmFjLmNvcmUgaW1wb3J0ICoKK2Zyb20gdHJhYy51dGlsIGltcG9ydCBNYXJrdXAKK2Zyb20gdHJhYy53ZWIgaW1wb3J0IElSZXF1ZXN0SGFuZGxlcgorZnJvbSB0cmFjLndlYi5jaHJvbWUgaW1wb3J0IGFkZF9zdHlsZXNoZWV0LCBJTmF2aWdhdGlvbkNvbnRyaWJ1dG9yLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVRlbXBsYXRlUHJvdmlkZXIKK2Zyb20gdHJhYy53ZWIuaHJlZiBpbXBvcnQgSHJlZgorI2Zyb20gdHJhYy52ZXJzaW9uY29udHJvbC53ZWJfdWkuY2hhbmdlc2V0IGltcG9ydCBJQ2hhbmdlc2V0UmFuZ2VMaW5rCitmcm9tIHRyYWMud2lraSBpbXBvcnQgd2lraV90b19odG1sLCB3aWtpX3RvX29uZWxpbmVyLCBJV2lraVN5bnRheFByb3ZpZGVyLCBcCisgICAgICAgICAgICAgICAgICAgICAgRm9ybWF0dGVyCisKKworY2xhc3MgRGN1dE1vZHVsZShDb21wb25lbnQpOgorCisgICAgaW1wbGVtZW50cyhJUmVxdWVzdEhhbmRsZXIpCisjICAgIGltcGxlbWVudHMoSVJlcXVlc3RIYW5kbGVyLElDaGFuZ2VzZXRSYW5nZUxpbmspCisKKyAgICBkZWYgcmV2aXNpb25fcmFuZ2VfbGluayhzZWxmLCByZXEsIGJhc2UsIHN0YXJ0LCBlbmQpOgorICAgICAgICByZXR1cm4gKCdEQ1VUIEhlbHBlcicsIHJlcS5ocmVmKCdkY3V0JyxvbGRfcGF0aD1iYXNlLG5ld19wYXRoPWJhc2Usb2xkPXN0YXJ0LG5ldz1lbmQpKQorCisgICAgX3JlcXVlc3RfcmUgPSByZS5jb21waWxlKHIiL2RjdXQoPzovKFteL10rKSk/KC8uKik/JCIpCisKKyAgICBkZWYgbWF0Y2hfcmVxdWVzdChzZWxmLCByZXEpOgorICAgICAgICBtYXRjaCA9IHJlLm1hdGNoKHNlbGYuX3JlcXVlc3RfcmUsIHJlcS5wYXRoX2luZm8pCisgICAgICAgIGlmIG1hdGNoOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBwcm9jZXNzX3JlcXVlc3Qoc2VsZiwgcmVxKToKKworICAgICAgICBpZHggPSAwCisgICAgICAgICMgc3JsCisjICAgICAgICBzaG93X2ZpbGVzID0gc2VsZi50aW1lbGluZV9zaG93X2ZpbGVzCisgICAgICAgIGRiID0gc2VsZi5lbnYuZ2V0X2RiX2NueCgpCisgICAgICAgIHRpY2tldGxpc3QgPSB7fSAgIyBkaWN0IG9mIHRpY2tldC0+Pz8/CisgICAgICAgIHJldmxpc3QgPSB7fSAjIGRpY3Qgb2YgcmV2aXNpb24tPgorICAgICAgICAjIHdlbGwuIGNoZWNrIGl0IGFnYWluLC4KKyAgICAgICAgICAgIAorICAgICAgICBzcmxkZWJ1Zz1GYWxzZQorICAgICAgICAKKyAgICAgICAgcmVwb3MgPSBzZWxmLmVudi5nZXRfcmVwb3NpdG9yeShyZXEuYXV0aG5hbWUpCisgICAgICAgIAorICAgICAgICBuZXdfcGF0aCA9IHJlcS5hcmdzLmdldCgnbmV3X3BhdGgnKQorICAgICAgICBuZXdfcmV2ID0gcmVxLmFyZ3MuZ2V0KCduZXcnKQorICAgICAgICBvbGRfcGF0aCA9IHJlcS5hcmdzLmdldCgnb2xkX3BhdGgnKQorICAgICAgICBvbGRfcmV2ID0gcmVxLmFyZ3MuZ2V0KCdvbGQnKQorCisgICAgICAgIG5ld19wYXRoID0gcmVwb3Mubm9ybWFsaXplX3BhdGgobmV3X3BhdGgpCisgICAgICAgIG5ld19yZXYgPSByZXBvcy5ub3JtYWxpemVfcmV2KG5ld19yZXYpCisgICAgICAgIG9sZF9wYXRoID0gcmVwb3Mubm9ybWFsaXplX3BhdGgob2xkX3BhdGgpCisgICAgICAgIG9sZF9yZXYgPSByZXBvcy5ub3JtYWxpemVfcmV2KG9sZF9yZXYpCisKKyAgICAgICAgb2xkX3JldiA9IGludChvbGRfcmV2KQorICAgICAgICBuZXdfcmV2ID0gaW50KG5ld19yZXYpCisgICAgICAgIAorICAgICAgICByZXEuaGRmWydjaGFuZ2VzZXQuZGlmZl9ocmVmJ10gPSByZXEuaHJlZignY2hhbmdlc2V0JyxvbGRfcGF0aD1vbGRfcGF0aCxuZXc9bmV3X3JldixuZXdfcGF0aD1uZXdfcGF0aCxvbGQ9b2xkX3JldikKKworICAgICAgICByZXEuaGRmWydpc19kY3V0J109MQorICAgICAgICAKKyAgICAgICAgcmVxLmhkZlsnY2hhbmdlc2V0Lm9sZF9yZXYnXSA9IG9sZF9yZXYKKyAgICAgICAgcmVxLmhkZlsnY2hhbmdlc2V0Lm5ld19yZXYnXSA9IG5ld19yZXYKKyAgICAgICAgcmVxLmhkZlsnY2hhbmdlc2V0Lm9sZF9wYXRoJ10gPSBvbGRfcGF0aAorICAgICAgICByZXEuaGRmWydjaGFuZ2VzZXQubmV3X3BhdGgnXSA9IG5ld19wYXRoCisKKyAgICAgICAgaWYgVHJ1ZToKKyAgICAgICAgICAgIHJlcS5oZGZbJ3RhcmdldF9wYXRoJ10gPSAnLic7CisgICAgICAgICAgICAjIG9rYXkuIG1hbnVhbGx5IHRyb21wIHRocm91Z2ggJ2VtCisgICAgICAgICAgICBucmV2ID0gb2xkX3JldisxCisgICAgICAgICAgICB3aGlsZSBucmV2IDw9IG5ld19yZXY6CisgICAgICAgICAgICAgICAgY2hnc2V0ID0gcmVwb3MuZ2V0X2NoYW5nZXNldChucmV2KQorICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBjaGdzZXQubWVzc2FnZSBvciAnLS0nCisgICAgICAgICAgICAgICAgIyBjYW4gd2UgbG9hZCBhIHRpY2tldCBmcm9tIGl0PworICAgICAgICAgICAgICAgIHNwbGl0cz1tZXNzYWdlLnNwbGl0KCc6JykKKyAgICAgICAgICAgICAgICBpZiBtZXNzYWdlLnN0YXJ0c3dpdGgoJ3RpY2tldDonKSBhbmQgbGVuKHNwbGl0cyk+MjoKKyAgICAgICAgICAgICAgICAgICAgdGlja25hbWU9c3BsaXRzWzFdCisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpY2tudW09aW50KHRpY2tuYW1lKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uLGU6CisgICAgICAgICAgICAgICAgICAgICAgICBucmV2ID0gbnJldisxCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAjIHllcywgd2UgaGF2ZSBhIHRpY2tldCAjCisgICAgICAgICAgICAgICAgICAgIGZpbGVzPVtdCisgICAgICAgICAgICAgICAgICAgIGZvciBjaGcgaW4gY2hnc2V0LmdldF9jaGFuZ2VzKCk6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgY2hnWzBdLnN0YXJ0c3dpdGgob2xkX3BhdGgpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICBmaWxlcy5hcHBlbmQoY2hnKQorICAgICAgICAgICAgICAgICAgICBpZiBsZW4oZmlsZXMpPT0wOgorICAgICAgICAgICAgICAgICAgICAgICAgbnJldiA9IG5yZXYrMQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgIyBubyByZWxldmFudCBmaWxlcworICAgICAgICAgICAgICAgICAgICB0aXRlbT0odGlja251bSxmaWxlcyxjaGdzZXQpCisgICAgICAgICAgICAgICAgICAgIGlmIHRpY2tudW0gaW4gdGlja2V0bGlzdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpY2tldGxpc3RbdGlja251bV0uYXBwZW5kKCB0aXRlbSApCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICB0aWNrZXRsaXN0W3RpY2tudW1dPVsgdGl0ZW0gXQorICAgICAgICAgICAgICAgICAgICByZXZsaXN0W25yZXZdPXRpdGVtCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgIm1hbGZvcm1lZCB0aWNrZXQ/ICVzIGF0ICVkIiAlIChtZXNzYWdlLG5yZXYpICMgZG9uJ3Qga25vdyB0aGUgc3ludGF4IGZvciBkaWUuLgorICAgICAgICAgICAgICAgIG5yZXYgPSBucmV2KzEKKyAgICAgICAgICAgIGlmIGxlbih0aWNrZXRsaXN0KToKKyAgICAgICAgICAgICAgICB0aWNrZXRzPXRpY2tldGxpc3Qua2V5cygpCisgICAgICAgICAgICAgICAgdGlja2V0cy5zb3J0KCkKKyAgICAgICAgICAgICAgICBmb3IgdGlja2V0IGluIHRpY2tldHM6CisgICAgICAgICAgICAgICAgICAgIGF0aWNrZXQ9dGlja2V0bGlzdFt0aWNrZXRdICAjICh0aWNrZXQsZmlsZXMsY2hnKQorICAgICAgICAgICAgICAgICAgICBjbXQgPSAndGlja2V0OiVkIC0gJWQgcmV2czogJyAlICh0aWNrZXQsbGVuKGF0aWNrZXQpKQorICAgICAgICAgICAgICAgICAgICBmb3IgcmV2IGluIGF0aWNrZXQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXZuID0gcmV2WzJdLnJldgorICAgICAgICAgICAgICAgICAgICAgICAgZmlsZWNvdW50ID0gbGVuKHJldlsxXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNtdCA9IGNtdCArICdyJWQgLSAlZCBmaWxlcyAoJyAlIChyZXZuLGZpbGVjb3VudCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciBmaWxlIGluIHJldlsxXToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXQgPSBjbXQgKyBmaWxlWzBdICsgJyAnCisgICAgICAgICAgICAgICAgICAgICAgICBjbXQgPSBjbXQgKyAnKSAnCisgICAgICAgICAgICAgICAgICAgIHJlcS5oZGZbJ3RpY2tldHMuJWQuY29tbWVudCcgJSB0aWNrZXRdID0gd2lraV90b19vbmVsaW5lcihjbXQsIHNlbGYuZW52LCBkYiwgIHNob3J0ZW49RmFsc2UpCisgICAgICAgICAgICAgICAgICAgIHJlcS5oZGZbJ3RpY2tldHMuJWQubnVtYmVyJyAlIHRpY2tldF0gPSB0aWNrZXQKKyAgICAgICAgICAgIGlmIGxlbihyZXZsaXN0KToKKyAgICAgICAgICAgICAgICByZXZzPXJldmxpc3Qua2V5cygpCisgICAgICAgICAgICAgICAgcmV2cy5zb3J0KCkKKyAgICAgICAgICAgICAgICBmb3IgcmV2IGluIHJldnM6CisgICAgICAgICAgICAgICAgICAgIGFyZXY9cmV2bGlzdFtyZXZdICAjICh0aWNrZXQsZmlsZXMsY2hnKQorICAgICAgICAgICAgICAgICAgICBjbXQgPSAnciVkIHRpY2tldDolZCAnICUgKGFyZXZbMl0ucmV2LGFyZXZbMF0pCisgICAgICAgICAgICAgICAgICAgIGZpbGVjb3VudCA9IGxlbihhcmV2WzFdKQorICAgICAgICAgICAgICAgICAgICBjbXQgPSBjbXQgKyAnIC0gJWQgZmlsZXMgKCcgJSBmaWxlY291bnQKKyAgICAgICAgICAgICAgICAgICAgc2hvcnRmaWxlcz0nJworICAgICAgICAgICAgICAgICAgICBqID0gMAorICAgICAgICAgICAgICAgICAgICBmb3IgZmlsZSBpbiBhcmV2WzFdOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVxLmhkZlsncmV2cy4lZC5maWxlcy4lZC5wYXRoJyAlIChyZXYsaildID0gZmlsZVswXQorICAgICAgICAgICAgICAgICAgICAgICAgcmVxLmhkZlsncmV2cy4lZC5maWxlcy4lZC5raW5kJyAlIChyZXYsaildID0gZmlsZVsxXQorICAgICAgICAgICAgICAgICAgICAgICAgcmVxLmhkZlsncmV2cy4lZC5maWxlcy4lZC5jaGFuZ2UnICUgKHJldixqKV0gPSBmaWxlWzJdCisgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydHBhdGg9ZmlsZVswXVtsZW4ob2xkX3BhdGgpKzE6XQorICAgICAgICAgICAgICAgICAgICAgICAgcmVxLmhkZlsncmV2cy4lZC5maWxlcy4lZC5zaG9ydHBhdGgnICUgKHJldixqKV0gPSBzaG9ydHBhdGgKKyAgICAgICAgICAgICAgICAgICAgICAgIGNtdCA9IGNtdCArIGZpbGVbMF0gKyAnICcKKyAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0ZmlsZXMgPSBzaG9ydGZpbGVzICsgJyAnICsgc2hvcnRwYXRoCisgICAgICAgICAgICAgICAgICAgICAgICBqPWorMQorICAgICAgICAgICAgICAgICAgICBjbXQgPSBjbXQgKyAnKSAnCisgICAgICAgICAgICAgICAgICAgIHJlcS5oZGZbJ3JldnMuJWQuY29tbWVudCcgJSByZXZdID0gd2lraV90b19vbmVsaW5lcihjbXQsIHNlbGYuZW52LCBkYiwgIHNob3J0ZW49RmFsc2UpCisgICAgICAgICAgICAgICAgICAgIHJlcS5oZGZbJ3JldnMuJWQubnVtYmVyJyAlIHJldl0gPSByZXYKKyAgICAgICAgICAgICAgICAgICAgcmVxLmhkZlsncmV2cy4lZC5zaG9ydGZpbGVzJyAlIHJldl0gPSBzaG9ydGZpbGVzCisgICAgICAgICAgICAgICAgICAgIHJlcS5oZGZbJ3JldnMuJWQuYmFja251bWJlcicgJSByZXZdID0gKHJldi0xKQorICAgICAgICAgICAgICAgICAgICByZXEuaGRmWydyZXZzLiVkLnRpY2tldCcgJSByZXZdID0gYXJldlswXQorCisKKyMgICAgICAgIGlmIGlzaW5zdGFuY2UodGVtcGxhdGUsIGJhc2VzdHJpbmcpOgorIyAgICAgICAgICAgIHJlcS5oZGZbJ2FkbWluLnBhZ2VfdGVtcGxhdGUnXSA9IHRlbXBsYXRlCisjICAgICAgICBlbHNlOgorIyAgICAgICAgICAgIHJlcS5oZGZbJ2FkbWluLnBhZ2VfY29udGVudCddID0gTWFya3VwKHRlbXBsYXRlLnJlbmRlcigpKQorCisgICAgICAgIGNvbnRlbnRfdHlwZSA9ICJ0ZXh0L2h0bWwiCisgICAgICAgIGFkZF9zdHlsZXNoZWV0KHJlcSwgJ2Nzcy9pY3V4dG4uY3NzJykKKyAgICAgICAgcmV0dXJuICdkY3V0LmNzJywgY29udGVudF90eXBlCisKZGlmZiAtLWdpdCBhL3RyYWMvSWN1Q29kZVRvb2xzLzAuMTIvaWN1Y29kZXRvb2xzL2h0ZG9jcy9jc3MvaWN1eHRuLmNzcyBiL3RyYWMvSWN1Q29kZVRvb2xzLzAuMTIvaWN1Y29kZXRvb2xzL2h0ZG9jcy9jc3MvaWN1eHRuLmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmUwOTAzCi0tLSAvZGV2L251bGwKKysrIGIvdHJhYy9JY3VDb2RlVG9vbHMvMC4xMi9pY3Vjb2RldG9vbHMvaHRkb2NzL2Nzcy9pY3V4dG4uY3NzCkBAIC0wLDAgKzEsMzAgQEAKKy8qIENvcHlyaWdodCAoQykgMjAxMCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICovCisKKy8qIEBvdmVycmlkZSBodHRwOi8vdW5pY29kZS5vcmcvY2xkci90cmFjL2Nocm9tZS9pY3Vjb2RldG9vbHMvY3NzL2ljdXh0bi5jc3MgKi8KKworCit0YWJsZS5pY3VyZXZpZXcgeworCWJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7CisJYm9yZGVyOiAgMXB4IHNvbGlkIGdyYXk7Cit9CisKK3RhYmxlLmljdXJldmlldyB0aCwgdGFibGUuaWN1cmV2aWV3IHRkIHsKKwl0ZXh0LWFsaWduOiBsZWZ0OworCWJvcmRlcjogIDFweCBzb2xpZCBncmF5OworCXBhZGRpbmc6ICAycHg7Cit9CisKK3RhYmxlLmljdXJldmlldyB0aGVhZCB0aCB7CisJZm9udC13ZWlnaHQ6IGJvbGQ7Cit9CisKK3RhYmxlLmljdXJldmlldyB0ZC5jaGFuZ2VzIHsKKwl0ZXh0LWFsaWduOiByaWdodDsKK30KKwordGFibGUuaWN1cmV2aWV3IHRkLm92ZXJhbGwgIHsKKwliYWNrZ3JvdW5kLWNvbG9yOiBzaWx2ZXI7CisJZm9udC1zdHlsZTogaXRhbGljOworCXRleHQtYWxpZ246IHJpZ2h0OworfQorCmRpZmYgLS1naXQgYS90cmFjL0ljdUNvZGVUb29scy8wLjEyL2ljdWNvZGV0b29scy9yZXZpZXcucHkgYi90cmFjL0ljdUNvZGVUb29scy8wLjEyL2ljdWNvZGV0b29scy9yZXZpZXcucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWNiZjY0OQotLS0gL2Rldi9udWxsCisrKyBiL3RyYWMvSWN1Q29kZVRvb2xzLzAuMTIvaWN1Y29kZXRvb2xzL3Jldmlldy5weQpAQCAtMCwwICsxLDI5NiBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyMgUmV2aWV3IG1vZHVsZS4KKyMgVE9ETzogcmVmYWN0b3IgdGlja2V0IG1hbmlwdWxhdGlvbiBpdGVtcyBpbnRvIHRpY2tldG1nci4KKworaW1wb3J0IHJlCisKK2Zyb20gdHJhYy5jb3JlIGltcG9ydCBDb21wb25lbnQsIGltcGxlbWVudHMKK2Zyb20gdHJhYy5jb3JlIGltcG9ydCBDb21wb25lbnRNYW5hZ2VyCitmcm9tIHRyYWMuY29yZSBpbXBvcnQgVHJhY0Vycm9yCitmcm9tIHRyYWMudXRpbCBpbXBvcnQgTWFya3VwCitmcm9tIHRyYWMud2ViIGltcG9ydCBJUmVxdWVzdEhhbmRsZXIKK2Zyb20gdHJhYy53ZWIuY2hyb21lIGltcG9ydCBhZGRfc3R5bGVzaGVldCwgSVRlbXBsYXRlUHJvdmlkZXIsIGFkZF9jdHh0bmF2Citmcm9tIHRyYWMudmVyc2lvbmNvbnRyb2wgaW1wb3J0IENoYW5nZXNldAorZnJvbSB0cmFjLndlYi5hcGkgaW1wb3J0IElSZXF1ZXN0RmlsdGVyCitmcm9tIHRyYWMud2lraSBpbXBvcnQgd2lraV90b19odG1sLCB3aWtpX3RvX29uZWxpbmVyLCBJV2lraVN5bnRheFByb3ZpZGVyCisgICAgICAgICAgICAKK2Zyb20gZ2Vuc2hpLmJ1aWxkZXIgaW1wb3J0IHRhZworI2Zyb20gdHJhYy5lbnYgaW1wb3J0IElFbnZpcm9ubWVudFNldHVwUGFydGljaXBhbnQKK2Zyb20gdHJhYy5wZXJtIGltcG9ydCBJUGVybWlzc2lvblJlcXVlc3RvcgorZnJvbSB0cmFjLmNvbmZpZyBpbXBvcnQgTGlzdE9wdGlvbgorZnJvbSBpY3Vjb2RldG9vbHMudGlja2V0bWdyIGltcG9ydCBUaWNrZXRNYW5hZ2VyCitmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0IHJlc291cmNlX2ZpbGVuYW1lICNAVW5yZXNvbHZlZEltcG9ydAorCitjbGFzcyBSZXZpZXdNb2R1bGUoQ29tcG9uZW50KToKKworICAgIGltcGxlbWVudHMoSVRlbXBsYXRlUHJvdmlkZXIsIElSZXF1ZXN0RmlsdGVyLCBJUmVxdWVzdEhhbmRsZXIsIElQZXJtaXNzaW9uUmVxdWVzdG9yKQorCisgICAgIyBwYXRoIHRvIG1hdGNoIGZvciByZXZpZXcKKyAgICBwYXRoX21hdGNoID0gcmUuY29tcGlsZShyJy9pY3VyZXZpZXcvKFswLTldKyknKQorCisgICAgdm90ZWFibGVfcGF0aHMgPSBMaXN0T3B0aW9uKCdpY3Vjb2RldG9vbHMnLCAncGF0aHMnLCAnL3RpY2tldConLAorICAgICAgICBkb2M9J0xpc3Qgb2YgVVJMIHBhdGhzIHRvIHNob3cgcmV2aWV3cyBvbi4gR2xvYnMgYXJlIHN1cHBvcnRlZC4nKQorCisgICAgIyBJUGVybWlzc2lvblJlcXVlc3RvciBtZXRob2RzCisgICAgZGVmIGdldF9wZXJtaXNzaW9uX2FjdGlvbnMoc2VsZik6CisgICAgICAgIHJldHVybiBbJ0lDVVJFVklFV19WSUVXJ10KKworICAgICMgSVRlbXBsYXRlUHJvdmlkZXIgbWV0aG9kcworICAgIGRlZiBnZXRfdGVtcGxhdGVzX2RpcnMoc2VsZik6CisgICAgICAgIHJldHVybiBbcmVzb3VyY2VfZmlsZW5hbWUoX19uYW1lX18sICd0ZW1wbGF0ZXMnKV0KKworICAgIGRlZiBnZXRfaHRkb2NzX2RpcnMoc2VsZik6CisgICAgICAgIHJldHVybiBbKCdpY3Vjb2RldG9vbHMnLCByZXNvdXJjZV9maWxlbmFtZShfX25hbWVfXywgJ2h0ZG9jcycpKV0KKworICAgICMgSVJlcXVlc3RGaWx0ZXIgbWV0aG9kcworICAgIGRlZiBwcmVfcHJvY2Vzc19yZXF1ZXN0KHNlbGYsIHJlcSwgaGFuZGxlcik6CisgICAgICAgIGlmICdJQ1VSRVZJRVdfVklFVycgbm90IGluIHJlcS5wZXJtOgorICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXIKKworICAgICAgICBpZiBzZWxmLm1hdGNoX3RpY2tldHBhZ2UocmVxKToKKyAgICAgICAgICAgIHNlbGYucmVuZGVyX3Jldmlld2xpbmsocmVxKQorCisgICAgICAgIHJldHVybiBoYW5kbGVyCisKKyAgICBkZWYgcG9zdF9wcm9jZXNzX3JlcXVlc3Qoc2VsZiwgcmVxLCB0ZW1wbGF0ZSwgZGF0YSwgY29udGVudF90eXBlKToKKyAgICAgICAgcmV0dXJuICh0ZW1wbGF0ZSwgZGF0YSwgY29udGVudF90eXBlKQorCisgICAgZGVmIHJlbmRlcl9yZXZpZXdsaW5rKHNlbGYsIHJlcSk6CisgICAgICAgICNhZGRfc3R5bGVzaGVldChyZXEsICdpY3Vjb2RldG9vbHMvY3NzL2ljdXh0bi5jc3MnKQorCisgICAgICAgIGVscyA9IFtdCisKKyAgICAgICAgdGlja2V0X21nciA9IFRpY2tldE1hbmFnZXIoc2VsZi5jb21wbWdyKQorCisgICAgICAgIGRiID0gc2VsZi5lbnYuZ2V0X2RiX2NueCgpCisgICAgICAgIHJlcG9zID0gc2VsZi5lbnYuZ2V0X3JlcG9zaXRvcnkoKQorICAgICAgICBpZiBub3QgcmVwb3M6CisgICAgICAgICAgICByYWlzZSBUcmFjRXJyb3IoIkNvdWxkIG5vdCBnZXQgcmVwb3NpdG9yeSBmb3IgJXMiICUgKHJlcS5hdXRobmFtZSkpCisKKyAgICAgICAgcmV2cyA9IHRpY2tldF9tZ3IudGt0MnJldnMoc2VsZi5sb2csIGRiLCByZXBvcywgcmVxLCByZXEuYXJnc1sndGlja2V0J10pCisKKyAgICAgICAgaWYgbm90IHJldnM6CisgICAgICAgICAgICBzdHIgPSAnTm8gY29tbWl0cy4nCisgICAgICAgICAgICBsaSA9IHRhZy5saShzdHIpCisgICAgICAgICAgICBlbHMuYXBwZW5kKGxpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3RyID0gJyAlZCBjb21taXRzLicgJSBsZW4ocmV2cykKKyAgICAgICAgICAgIGhyZWYgPSByZXEuaHJlZi5yZXZpZXcocmVxLmFyZ3NbJ3RpY2tldCddKQorICAgICAgICAgICAgYSA9IHRhZy5hKCdSZXZpZXcnLCBocmVmPWhyZWYpCisgICAgICAgICAgICBsaSA9IHRhZy5saShhICsgc3RyKQorICAgICAgICAgICAgZWxzLmFwcGVuZChsaSkgICAgICAgICAgICAKKyAgICAgICAgCisgICAgICAgIHVsID0gdGFnLnVsKGVscywgY2xhc3NfPSdyZXZpZXcnKQorICAgICAgICBjbGFzc05hbWUgPSAnJworICAgICAgICB0aXRsZSA9ICJSZXZpZXdzIgorICAgICAgICBhZGRfY3R4dG5hdihyZXEsIHRhZy5zcGFuKHRhZy5vYmplY3QodWwpLCBpZD0naWN1cmV2aWV3JywgdGl0bGU9dGl0bGUsIGNsYXNzXz1jbGFzc05hbWUpKQorCisKKyAgICBkZWYgbWF0Y2hfcmVxdWVzdChzZWxmLCByZXEpOgorICAgICAgICBtYXRjaCA9IHJlLm1hdGNoKCcvcmV2aWV3KD86LyhbXi9dKykpPyg/Oi8oW14vXSspKT8oPzovKC4qKSQpPycsIHJlcS5wYXRoX2luZm8pCisgICAgICAgIGlmIG1hdGNoOgorICAgICAgICAgICAgcmVxLmFyZ3NbJ3RpY2tldCddID0gbWF0Y2guZ3JvdXAoMSkKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgbWF0Y2hfdGlja2V0cGFnZShzZWxmLCByZXEpOgorICAgICAgICBtYXRjaCA9IHJlLm1hdGNoKCcvdGlja2V0KD86LyhbXi9dKykpPyg/Oi8oW14vXSspKT8oPzovKC4qKSQpPycsIHJlcS5wYXRoX2luZm8pCisgICAgICAgIGlmIG1hdGNoOgorICAgICAgICAgICAgcmVxLmFyZ3NbJ3RpY2tldCddID0gbWF0Y2guZ3JvdXAoMSkKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgY2hhbmdlVG9SYW5nZShzZWxmLCBjX25ldywgY2hhbmdlKToKKyAgICAgICAgIyBxOiAodSd0cnVuay9Mb2NhbGUuamF2YScsICdmaWxlJywgJ2FkZCcsIE5vbmUsIHUnLTEnKSAgZnJvbSByMworICAgICAgICAjIHE6ICh1J3RydW5rL3V0aWwuYycsICAgICAgJ2ZpbGUnLCAnZWRpdCcsIHUndHJ1bmsvdXRpbC5jJywgdScyJykgIGZyb20gcjQKKyMgICAgICAgIGNfcGF0aCA9IGNoYW5nZVswXQorIyAgICAgICAgY19pdGVtdHlwZSA9IGNoYW5nZVsxXQorICAgICAgICBjX3R5cGUgPSBjaGFuZ2VbMl0KKyAgICAgICAgY19vbGRwYXRoID0gY2hhbmdlWzNdCisgICAgICAgIGNfb2xkID0gaW50KGNoYW5nZVs0XSBvciAtMSkKKyAgICAgICAgaWYoY190eXBlIGluIChDaGFuZ2VzZXQuQ09QWSxDaGFuZ2VzZXQuTU9WRSkpOgorICAgICAgICAgICAgcmV0dXJuICgtMSwgY19uZXcsIGNfdHlwZSwgY19vbGQsIGNfb2xkcGF0aCkgIyBpZ25vcmUgT0xEIHJldiBmb3IgdGhlc2UKKyAgICAgICAgZWxpZihjX3R5cGUgaW4gKENoYW5nZXNldC5ERUxFVEUpKToKKyAgICAgICAgICAgIHJldHVybiAoY19vbGQsIC0xLCBjX3R5cGUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gKGNfb2xkLCBjX25ldywgY190eXBlKQorICAgICAgICAKKyAgICBkZWYgZGVzY3JpYmVDaGFuZ2Uoc2VsZiwgZmlsZSwgY2hhbmdlLCByZXEsIGRiKToKKyAgICAgICAgd2hhdCA9IGNoYW5nZVsyXSBvciAnY2hhbmdlJworICAgICAgICB3aGVyZSA9ICdyJWQ6JWQnICUgKGNoYW5nZVswXSxjaGFuZ2VbMV0pCisgICAgICAgIGlmKGNoYW5nZVswXSA9PSAtMSk6CisgICAgICAgICAgICBpZihjaGFuZ2VbMV0gPT0gLTEpOgorICAgICAgICAgICAgICAgIHVybCA9IE5vbmUKKyAgICAgICAgICAgICAgICB3aGF0ID0gIm5vb3AiCisgICAgICAgICAgICAgICAgd2hlcmUgPSBOb25lCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICNpZiBjaGFuZ2VbMl0gPT0gJ2FkZCtjb21taXRzJzoKKyAgICAgICAgICAgICAgICB1cmwgPSByZXEuaHJlZi5icm93c2VyKGZpbGUsIHJldj1jaGFuZ2VbMV0pICMgJ2FkZCcKKyAgICAgICAgICAgICAgICB3aGVyZSA9ICdyJWQnICUgY2hhbmdlWzFdCisgICAgICAgICAgICAgICAgd2hhdCA9IGNoYW5nZVsyXQorICAgICAgICBlbGlmKGNoYW5nZVsxXSA9PSAtMSk6CisgICAgICAgICAgICB1cmwgPSBOb25lICMgZGVsZXRlZAorICAgICAgICAgICAgd2hhdCA9ICJkZWxldGVkIgorICAgICAgICAgICAgd2hlcmUgPSBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB1cmwgPSByZXEuaHJlZi5jaGFuZ2VzZXQob2xkX3BhdGg9ZmlsZSwgb2xkPWNoYW5nZVswXSwgbmV3X3BhdGg9ZmlsZSwgbmV3PWNoYW5nZVsxXSkKKyAgICAgICAgaWYgdXJsOgorICAgICAgICAgICAgd2hhdCA9IE1hcmt1cCgnPGEgaHJlZj0iJXMiPiVzPC9hPicgJSAodXJsLHdoYXQpKQorICAgICAgICBpZiB3aGVyZToKKyAgICAgICAgICAgIHJldHVybiAod2hhdCwgdGFnLmEod2hlcmUsIGhyZWY9cmVxLmhyZWYuc2VhcmNoKHE9d2hlcmUpKSkKKyAgICAgICAgICAgICNyZXR1cm4gKHdoYXQsIHdoZXJlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICh3aGF0LCAnJykKKworCisgICAgZGVmIHByb2Nlc3NfcmVxdWVzdChzZWxmLCByZXEpOgorICAgICAgICAjb2ssIHdoYXQgYXJlIHdlIGFib3V0LgorICAgICAgICAjZGIgPSBzZWxmLmVudi5nZXRfZGJfY254KCkKKyAgICAgICAgI3RpY2tldGxpc3QgPSB7fSAgIyBkaWN0IG9mIHRpY2tldC0+Pz8/CisgICAgICAgICNyZXZsaXN0ID0ge30gIyBkaWN0IG9mIHJldmlzaW9uLT4KKyAgICAgICAgcmVwb3MgPSBzZWxmLmVudi5nZXRfcmVwb3NpdG9yeSgpCisKKyAgICAgICAgbmV3X3BhdGggPSByZXEuYXJncy5nZXQoJ25ld19wYXRoJykKKyAgICAgICAgbmV3X3JldiA9IHJlcS5hcmdzLmdldCgnbmV3JykKKyAgICAgICAgb2xkX3BhdGggPSByZXEuYXJncy5nZXQoJ29sZF9wYXRoJykKKyAgICAgICAgb2xkX3JldiA9IHJlcS5hcmdzLmdldCgnb2xkJykKKworICAgICAgICBuZXdfcGF0aCA9IHJlcG9zLm5vcm1hbGl6ZV9wYXRoKG5ld19wYXRoKQorICAgICAgICBuZXdfcmV2ID0gcmVwb3Mubm9ybWFsaXplX3JldihuZXdfcmV2KQorICAgICAgICBvbGRfcGF0aCA9IHJlcG9zLm5vcm1hbGl6ZV9wYXRoKG9sZF9wYXRoKQorICAgICAgICBvbGRfcmV2ID0gcmVwb3Mubm9ybWFsaXplX3JldihvbGRfcmV2KQorICAgICAgICAKKworIyAgICAgICAgaWYgbm90IHJlcS5wZXJtLmhhc19wZXJtaXNzaW9uKCdUSUNLRVRfTU9ESUZZJyk6CisjICAgICAgICAgICAgcmV0dXJuIHJlcS5yZWRpcmVjdChyZXEuaHJlZi5icm93c2VyKCkpCisKKyAgICAgICAgb2xkX3JldiA9IGludChvbGRfcmV2KQorICAgICAgICBuZXdfcmV2ID0gaW50KG5ld19yZXYpCisgICAgICAgIAorICAgICAgICB0aWNrZXQgPSByZXEuYXJncy5nZXQoJ3RpY2tldCcpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRpY2tldCA9IGludCh0aWNrZXQpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICB0aWNrZXQgPSAwCisjICAgICAgICByZXEuaGRmWydyZXZpZXcudGlja2V0J10gPSB0aWNrZXQKKyMgICAgICAgIHJlcS5oZGZbJ3Jldmlldy50aWNrZXRodG1sJ10gPSB0YWcuYSh0aWNrZXQsIHJlcS5ocmVmLnRpY2tldCh0aWNrZXQpKQorCisgICAgICAgIGRhdGEgPSB7fQorCisgICAgICAgIGRhdGFbJ292ZXJhbGxfeSddID0gMAorICAgICAgICBkYXRhWyd0aWNrZXRfaWQnXSA9IHJlcS5hcmdzWyd0aWNrZXQnXQorICAgICAgICBkYXRhWyd0aWNrZXRfaHJlZiddID0gcmVxLmhyZWYudGlja2V0KHJlcS5hcmdzWyd0aWNrZXQnXSkKKworICAgICAgICB0aWNrZXRfbWdyID0gVGlja2V0TWFuYWdlcihzZWxmLmNvbXBtZ3IpCisKKyAgICAgICAgZGIgPSBzZWxmLmVudi5nZXRfZGJfY254KCkKKyAgICAgICAgcmVwb3MgPSBzZWxmLmVudi5nZXRfcmVwb3NpdG9yeSgpCisKKyAgICAgICAgcmV2cyA9IHRpY2tldF9tZ3IudGt0MnJldnMoc2VsZi5sb2csIGRiLCByZXBvcywgcmVxLCByZXEuYXJnc1sndGlja2V0J10pCisgICAgICAgIAorICAgICAgICBpZiAobm90IHJldnMgb3IgbGVuKHJldnMpPT0wKToKKyAgICAgICAgICAgICMgbm90aGluZyB0byByZXZpZXcuIHNob3VsZG4ndCBoYXBwZW4KKyAgICAgICAgICAgIHJldHVybiAoJ25vdGhpbmcuaHRtbCcsIGRhdGEsICd0ZXh0L2h0bWwnKQorICAgICAgICBlbGlmKGxlbihyZXZzKT09MSk6CisgICAgICAgICAgICAjIG9ubHkgb25lIGNoYW5nZSAtIGp1c3QgZG8gYSBjaGFuZ2VzZXQgdmlldworICAgICAgICAgICAgcmV0dXJuIHJlcS5yZWRpcmVjdChyZXEuaHJlZi5jaGFuZ2VzZXQocmV2c1swXSkpCisKKyAgICAgICAgcmV2Y291bnQgPSAwCisgICAgICAgIGJyYW5jaGVzID0ge30KKyAgICAgICAgZmlsZXMgPSB7fQorICAgICAgICAjIG1heSBiZSAwIHJldnMuCisgICAgICAgIHJldmlzaW9ucyA9IFtdCisgICAgICAgIAorICAgICAgICBmb3IgcmV2IGluIHJldnM6CisgICAgICAgICAgICBjaGdzZXQgPSByZXBvcy5nZXRfY2hhbmdlc2V0KHJldikKKyAgICAgICAgICAgICMgcTogKHUndHJ1bmsvTG9jYWxlLmphdmEnLCAnZmlsZScsICdhZGQnLCBOb25lLCB1Jy0xJykgIGZyb20gcjMKKyAgICAgICAgICAgICMgcTogKHUndHJ1bmsvdXRpbC5jJywgJ2ZpbGUnLCAnZWRpdCcsIHUndHJ1bmsvdXRpbC5jJywgdScyJykgIGZyb20gcjQKKyAgICAgICAgICAgIG1lc3NhZ2UgPSBjaGdzZXQubWVzc2FnZSBvciAnLS0nCisgICAgICAgICAgICByZXZjb3VudCA9IHJldmNvdW50ICsgMQorICAgICAgICAgICAgcmV2aXNpb24gPSB7fQorICAgICAgICAgICAgcmV2aXNpb25bJ3JldiddID0gIHRhZy5hKHJldiwgcmVxLmhyZWYuY2hhbmdlc2V0KHJldikpCisgICAgICAgICAgICByZXZpc2lvblsnbnVtJ10gPSAgcmV2CisgICAgICAgICAgICByZXZpc2lvblsnY29tbWVudCddID0gIG1lc3NhZ2UgI3dpa2lfdG9fb25lbGluZXIoIG1lc3NhZ2UsIHNlbGYuZW52LCBkYiwgc2hvcnRlbj1GYWxzZSApCisgICAgICAgICAgICBmb3IgY2hnIGluIGNoZ3NldC5nZXRfY2hhbmdlcygpOgorICAgICAgICAgICAgICAgIHBhdGggPSBjaGdbMF0KKyAgICAgICAgICAgICAgICBpZiBwYXRoIGluIGZpbGVzOgorICAgICAgICAgICAgICAgICAgICBpdGVtID0gZmlsZXNbcGF0aF0KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBpdGVtID0gW10KKyAgICAgICAgICAgICAgICAgICAgZmlsZXNbcGF0aF0gPSBpdGVtOworICAgICAgICAgICAgICAgIGl0ZW0uYXBwZW5kKHNlbGYuY2hhbmdlVG9SYW5nZShyZXYsY2hnKSkKKyAgICAgICAgICAgIHJldmlzaW9ucy5hcHBlbmQocmV2aXNpb24pCisgICAgICAgIGRhdGFbJ3JldmlzaW9ucyddID0gcmV2aXNpb25zCisgICAgICAgIAorICAgICAgICBpZihyZXZjb3VudCA+IDApOgorICAgICAgICAgICAgZGF0YVsncmV2Y291bnQnXSA9IHJldmNvdW50CisgICAgICAgIAorICAgICAgICAjIHByaW50ICJmaWxlczogJWQiICUgbGVuKGZpbGVzKQorICAgICAgICAjIGdvIHRocm91aGcgZWFjaCBmaWxlIGFuZCBjYWxjdWxhdGUgaXRzIG1pbmltdW0gcmFuZ2UKKyAgICAgICAgZmlsZWxpc3QgPSBmaWxlcy5rZXlzKCkKKyAgICAgICAgZmlsZWxpc3Quc29ydCgpCisjICAgICAgICBwcmludCAnYmFyIHRvICVkIGxlbiBvZiAlcycgJSAobGVuKGZpbGVsaXN0KSxzdHIoZmlsZWxpc3QpKQorICAgICAgICBmb3IgZmlsZSBpbiBmaWxlbGlzdDoKKyAgICAgICAgICAgIGNoYW5nZXMgPSBmaWxlc1tmaWxlXQorICAgICAgICAgICAgaSA9IDAKKyMgICAgICAgICAgICBwcmludCAiIGxvb3BpbmcgZnJvbSAlZCB0byAlZCBvdmVyICVkICIgJSAoaSxsZW4oY2hhbmdlcyktMSxsZW4oY2hhbmdlcykpCisgICAgICAgICAgICB3aGlsZSBsZW4oY2hhbmdlcyk+MSBhbmQgaTwobGVuKGNoYW5nZXMpLTEpOgorICAgICAgICAgICAgICAgIGlmIGNoYW5nZXNbaV1bMV0gPT0gY2hhbmdlc1tpKzFdWzBdOgorICAgICAgICAgICAgICAgICAgICBpZiBjaGFuZ2VzW2ldWzBdID09IC0xOgorICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlc1tpKzFdID0gKGNoYW5nZXNbaV1bMF0sY2hhbmdlc1tpKzFdWzFdLCdhZGQrY29tbWl0cycpICMgcmV0YWluICdmaXJzdCcgcmV2CisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzW2krMV0gPSAoY2hhbmdlc1tpXVswXSxjaGFuZ2VzW2krMV1bMV0sJ211bHRpcGxlIGNvbW1pdHMnKSAjIHJldGFpbiAnZmlyc3QnIHJldgorCisgICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgPSBjaGFuZ2VzWzppXSArIGNoYW5nZXNbaSsxOl0gIyBhbmQgc2hpZnQgZG93bgorIyAgICAgICAgICAgICAgICAgICAgcHJpbnQgIm1lcmdlZDogJXMiICUgc3RyKGNoYW5nZXMpCisgICAgICAgICAgICAgICAgICAgIGZpbGVzW2ZpbGVdID0gY2hhbmdlcworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGkgPSBpICsgMQorICAgICAgICAKKyAgICAgICAgIyBub3csIHdyaXRlICdlbSBvdXQKKyAgICAgICAgc2VyYSA9IDAKKyAgICAgICAgI2ZpbGVzX2RhdGEgPSBbXQorICAgICAgICBmb3IgZmlsZSBpbiBmaWxlbGlzdDoKKyAgICAgICAgICAgIHNlcmEgPSBzZXJhKzEKKyAgICAgICAgICAgIGZpbGVfZGF0YSA9IHt9CisgICAgICAgICAgICBmaWxlX2RhdGFbJ25hbWUnXSA9IE1hcmt1cCgnPGEgaHJlZj0iJXMiPiVzPC9hPicgJSAocmVxLmhyZWYuYnJvd3NlcihmaWxlKSxmaWxlKSkKKyAgICAgICAgICAgIGJyYW5jaF9uYW1lID0gJy8nLmpvaW4oZmlsZS5zcGxpdCgnLycpWzA6Ml0pCisgICAgICAgICAgICAjcHJpbnQgImJyYW5jaCBpczogKCVzKSIgJSAoYnJhbmNoX25hbWUpCisgICAgICAgICAgICBicmFuY2hlc19kYXRhID0gYnJhbmNoZXMuZ2V0KGJyYW5jaF9uYW1lLCB7fSkKKyAgICAgICAgICAgIGZpbGVzX2RhdGEgPSBicmFuY2hlc19kYXRhLmdldCgnZmlsZXMnLFtdKQorCisgICAgICAgICAgICBjaGFuZ2VzID0gZmlsZXNbZmlsZV0KKyAgICAgICAgICAgIGNoYSA9IDAKKyAgICAgICAgICAgIGNoYW5nZXNfZGF0YSA9IFtdCisgICAgICAgICAgICBmb3IgY2hhbmdlIGluIGNoYW5nZXM6CisgICAgICAgICAgICAgICAgY2hhID0gY2hhICsgMQorIyAgICAgICAgICAgICAgICBwcmludCAiJXMgb3V0cHV0ICVzICIgJSAoZmlsZSwgc3RyKGNoYW5nZSkpCisgICAgICAgICAgICAgICAgY2hhbmdlc19kYXRhLmFwcGVuZChzZWxmLmRlc2NyaWJlQ2hhbmdlKGZpbGUsIGNoYW5nZSwgcmVxLCBkYikpCisgICAgICAgICAgICBmaWxlX2RhdGFbJ2NoYW5nZXMnXSA9IGNoYW5nZXNfZGF0YQorICAgICAgICAgICAgaWYobGVuKGNoYW5nZXMpPjEpOgorICAgICAgICAgICAgICAgIHdoYXRodG1sID0gc2VsZi5kZXNjcmliZUNoYW5nZShmaWxlLCAoY2hhbmdlc1swXVswXSwgY2hhbmdlc1tsZW4oY2hhbmdlcyktMV1bMV0sICdvdmVyYWxsJyksIHJlcSwgZGIpCisgICAgICAgICAgICAgICAgZmlsZV9kYXRhWydvdmVyYWxsJ10gPSB3aGF0aHRtbAorICAgICAgICAgICAgICAgIGZpbGVfZGF0YVsnb3ZlcmFsbF95J10gPSAxCisgICAgICAgICAgICAgICAgZGF0YVsnb3ZlcmFsbF95J10gPSAxCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZpbGVfZGF0YVsnb3ZlcmFsbF95J10gPSAwCisgICAgICAgICAgICBmaWxlc19kYXRhLmFwcGVuZChmaWxlX2RhdGEpCisgICAgICAgICAgICAjIHNldHMKKyAgICAgICAgICAgIGJyYW5jaGVzX2RhdGFbJ2ZpbGVzJ10gPSBmaWxlc19kYXRhCisgICAgICAgICAgICBicmFuY2hlc19kYXRhWydsZW4nXSA9IGxlbihmaWxlc19kYXRhKQorICAgICAgICAgICAgYnJhbmNoZXNfZGF0YVsnbmFtZSddID0gYnJhbmNoX25hbWUKKyAgICAgICAgICAgIGJyYW5jaGVzW2JyYW5jaF9uYW1lXSA9IGJyYW5jaGVzX2RhdGEKKyAgICAgICAgI2RhdGFbJ2ZpbGVzJ10gPSBmaWxlc19kYXRhCisgICAgICAgICNkYXRhWydicmFuY2hlcyddID0gYnJhbmNoZXMKKworICAgICAgICAjIC4uIGNvbnZlcnQgZGljdCB0byBhcnJheS4KKyAgICAgICAgYnJhbmNoX2xpc3QgPSBbXQorICAgICAgICBmb3IgYnJhbmNoIGluIGJyYW5jaGVzOgorICAgICAgICAgICAgYnJhbmNoX2xpc3QuYXBwZW5kKGJyYW5jaGVzW2JyYW5jaF0pCisgICAgICAgIGRhdGFbJ2JyYW5jaGVzJ10gPSBicmFuY2hfbGlzdAorICAgICAgICBkYXRhWydsYXN0YnJhbmNoJ10gPSBicmFuY2gKKyAgICAgICAgZGF0YVsnYnJhbmNoY291bnQnXSA9IGxlbihicmFuY2hlcykKKyAgICAgICAgCisgICAgICAgIGNvbnRlbnRfdHlwZSA9ICJ0ZXh0L2h0bWwiCisgICAgICAgIGFkZF9zdHlsZXNoZWV0KHJlcSwgJ2ljdWNvZGV0b29scy9jc3MvaWN1eHRuLmNzcycpCisgICAgICAgIHJldHVybiAncmV2aWV3Lmh0bWwnLCBkYXRhLCBjb250ZW50X3R5cGUKKwpkaWZmIC0tZ2l0IGEvdHJhYy9JY3VDb2RlVG9vbHMvMC4xMi9pY3Vjb2RldG9vbHMvdGVtcGxhdGVzL25vdGhpbmcuaHRtbCBiL3RyYWMvSWN1Q29kZVRvb2xzLzAuMTIvaWN1Y29kZXRvb2xzL3RlbXBsYXRlcy9ub3RoaW5nLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZhOWVlNAotLS0gL2Rldi9udWxsCisrKyBiL3RyYWMvSWN1Q29kZVRvb2xzLzAuMTIvaWN1Y29kZXRvb2xzL3RlbXBsYXRlcy9ub3RoaW5nLmh0bWwKQEAgLTAsMCArMSwyNSBAQAorPCFET0NUWVBFIGh0bWwKKyAgICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgorICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KKzwhLS0KKyMgQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSUJNIGFuZCBPdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKy0tPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCisgICAgICB4bWxuczpweT0iaHR0cDovL2dlbnNoaS5lZGdld2FsbC5vcmcvIgorICAgICAgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiPgorICA8eGk6aW5jbHVkZSBocmVmPSJsYXlvdXQuaHRtbCIgLz4KKyAgPGhlYWQ+CisgICAgPHRpdGxlPk5vdGhpbmcgdG8gUmV2aWV3IGZvciB0aWNrZXQgIyR7dGlja2V0X2lkfTwvdGl0bGU+CisgIDwvaGVhZD4KKworICA8Ym9keT4KKyAgICA8ZGl2IGlkPSJjdHh0bmF2IiBjbGFzcz0ibmF2Ij48L2Rpdj4KKworICAgIDxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJpY3Vjb2RlcmV2aWV3Ij4KKyAgICAgIDxoMT5Ob3RoaW5nIHRvIHJldmlldyE8L2gxPgorICAgICAgPHA+CisgICAgICAJTm90aGluZyB0byByZXZpZXcgLSBubyBjaGFuZ2VzZXRzIGluIHRpY2tldCA8YSBocmVmPSIke3RpY2tldF9ocmVmfSI+IyR7dGlja2V0X2lkfTwvYT4KKyAgICAgIDwvcD4KKyAgICA8L2Rpdj4KKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdHJhYy9JY3VDb2RlVG9vbHMvMC4xMi9pY3Vjb2RldG9vbHMvdGVtcGxhdGVzL3Jldmlldy5odG1sIGIvdHJhYy9JY3VDb2RlVG9vbHMvMC4xMi9pY3Vjb2RldG9vbHMvdGVtcGxhdGVzL3Jldmlldy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NjIwNWUKLS0tIC9kZXYvbnVsbAorKysgYi90cmFjL0ljdUNvZGVUb29scy8wLjEyL2ljdWNvZGV0b29scy90ZW1wbGF0ZXMvcmV2aWV3Lmh0bWwKQEAgLTAsMCArMSwxMTcgQEAKKzwhRE9DVFlQRSBodG1sCisgICAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKKyAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Cis8IS0tCisjIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIElCTSBhbmQgT3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkCistLT4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgorICAgICAgeG1sbnM6cHk9Imh0dHA6Ly9nZW5zaGkuZWRnZXdhbGwub3JnLyIKKyAgICAgIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIj4KKyAgPHhpOmluY2x1ZGUgaHJlZj0ibGF5b3V0Lmh0bWwiIC8+CisgIDxoZWFkPgorICAgIDx0aXRsZT5SZXZpZXcgZm9yIHRpY2tldCAjJHt0aWNrZXRfaWR9PC90aXRsZT4KKyAgPC9oZWFkPgorCisgIDxib2R5PgorICAgIDxkaXYgaWQ9ImN0eHRuYXYiIGNsYXNzPSJuYXYiPjwvZGl2PgorCisgICAgPGRpdiBpZD0iY29udGVudCIgY2xhc3M9ImljdWNvZGVyZXZpZXciPgorCisgPGgxPlRpY2tldCA8YSBocmVmPScke2hyZWYudGlja2V0KHRpY2tldF9pZCl9Jz4jJHt0aWNrZXRfaWR9PC9hPjwvaDE+CisKKzxweTppZiB0ZXN0PSJyZXZjb3VudCI+CisKKzxoMj4ke3JldmNvdW50fSBDaGFuZ2VzZXRzPC9oMj4KKzx1bD4KKzxweTpmb3IgZWFjaD0icmV2IGluIHJldmlzaW9ucyI+CisgICAgPGxpPjxhIGhyZWY9IiR7aHJlZi5jaGFuZ2VzZXQocmV2Lm51bSl9Ij5yJHtyZXYubnVtfTwvYT4gJm1kYXNoOyAke3Jldi5jb21tZW50fTwvbGk+Cis8L3B5OmZvcj4KKzwvdWw+CisKKzxweTppZiB0ZXN0PSJicmFuY2hjb3VudCA+IDEiPgorPGgyPkZpbGVzPC9oMj4KKzxoMz5KdW1wIHRvIFNlY3Rpb25zPC9oMz4KKzx1bD4KKzxweTpmb3IgZWFjaD0iYnJhbmNoIGluIGJyYW5jaGVzIj4KKyAgPGxpPjxhIGhyZWY9IiMke2JyYW5jaC5uYW1lfSI+JHticmFuY2gubmFtZX08L2E+ICZtZGFzaDsgJHticmFuY2gubGVufSBmaWxlczwvbGk+Cis8L3B5OmZvcj4KKzwvdWw+Cis8L3B5OmlmPgorCis8cHk6Zm9yIGVhY2g9ImJyYW5jaCBpbiBicmFuY2hlcyI+Cis8aHIvPgorPGEgbmFtZT0iJHticmFuY2gubmFtZX0iPgorICA8aDM+CisgICAgICAgIDxhIGhyZWY9IiR7aHJlZi5icm93c2VyKGJyYW5jaC5uYW1lKX0iPiR7YnJhbmNoLm5hbWV9PC9hPiAmbWRhc2g7ICgke2JyYW5jaC5sZW59IGZpbGVzIGNoYW5nZWQpCisgIDwvaDM+Cis8L2E+CisKKzxzdHlsZSB0eXBlPSd0ZXh0L2Nzcyc+CisKKworPC9zdHlsZT4KKworPGJsb2NrcXVvdGU+CisKKzx0YWJsZSBjbGFzcz0naWN1cmV2aWV3Jz4KKzx0aGVhZD4KKzx0cj4KKyA8dGg+RmlsZTwvdGg+CisgPHRoPkNoYW5nZXM8L3RoPgorIDx0aD5EZXRhaWxzPC90aD4KKyA8cHk6aWYgdGVzdD0ib3ZlcmFsbF95ID4gMCI+IAorICA8dGg+T3ZlcmFsbDxici8+PGk+KGluY2x1ZGluZyBvdGhlciBjaGFuZ2VzKTwvaT48L3RoPgorICA8dGg+RGV0YWlsczwvdGg+CisgPC9weTppZj4KKzwvdHI+Cis8L3RoZWFkPgorPHRib2R5PgorPHB5OmZvciBlYWNoPSJmaWxlIGluIGJyYW5jaC5maWxlcyI+CisgPHRyPgorICAgIDx0aCBjbGFzcz0nbmFtZSc+JHtmaWxlLm5hbWV9PC90aD4KKyAgICA8dGQgY2xhc3M9J2NoYW5nZXMnPgorICAgICAgPHB5OmZvciBlYWNoPSJjaGFuZ2UgaW4gZmlsZS5jaGFuZ2VzIj4KKyAgICAgICAgJHtjaGFuZ2VbMF19PGJyLz4KKyAgICAgIDwvcHk6Zm9yPgorICAgIDwvdGQ+CisgICAgPHRkIGNsYXNzPSdkZXRhaWxzJz4KKyAgICAgIDxweTpmb3IgZWFjaD0iY2hhbmdlIGluIGZpbGUuY2hhbmdlcyI+CisgICAgICAgICR7Y2hhbmdlWzFdfTxici8+CisgICAgICA8L3B5OmZvcj4KKyAgICA8L3RkPgorCSAgCisgICAgPHB5OmlmIHRlc3Q9Im92ZXJhbGxfeSA+IDAiPiAKKyAgICAgPHB5OmlmIHRlc3Q9ImZpbGUub3ZlcmFsbF95ID4gMCI+CisgICAgICA8dGQgY2xhc3M9J292ZXJhbGwnPiR7ZmlsZS5vdmVyYWxsWzBdfTwvdGQ+CisgICAgICA8dGQgY2xhc3M9J292ZXJhbGwnPiR7ZmlsZS5vdmVyYWxsWzFdfTwvdGQ+CisgICAgIDwvcHk6aWY+CisgICAgPC9weTppZj4KKyAgPC90cj4KKzwvcHk6Zm9yPgorPC90Ym9keT4KKzwvdGFibGU+CisKKzwvYmxvY2txdW90ZT4KKworPC9weTpmb3I+CisKKzxoci8+CisKKzxkaXYgc3R5bGU9J2Rpc3BsYXk6bm9uZTsnPgorPGgyPk1lcmdlIENvbW1hbmRzPC9oMj4KK1ZlcnkgZXhwZXJpbWVudGFsLiAgQ2hhbmdlID8/PyB0byB0aGUgdG9wIG9mIHRoZSB0cmVlIHlvdSB3YW50IHRvIG1lcmdlIGZyb20gKGljdSBvciBpY3U0aik8YnIvPgorPHRleHRhcmVhPnN2biBtZXJnZSAtYyA8P2NzIGVhY2g6cmV2ID0gcmV2aXNpb25zID8+PD9jcyB2YXI6cmV2Lm51bSA/Piw8P2NzIC9lYWNoID8+IHN2bitzc2g6Ly9zb3VyY2UuaWN1LXByb2plY3Qub3JnL3JlcG9zL2ljdS8/Pz8vdHJ1bms8L3RleHRhcmVhPgorCis8aHIvPgorPC9kaXY+Cis8aHIvPgorPGlmcmFtZSBzcmM9Imh0dHA6Ly9zaXRlcy5nb29nbGUuY29tL3NpdGUvaWN1Y29kZXRvb2xzL3YxL3JldmlldyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iODAwcHgiPgorPGgxPjxhIGhyZWY9Imh0dHA6Ly9zaXRlcy5nb29nbGUuY29tL3NpdGUvaWN1Y29kZXRvb2xzL3YxL3JldmlldyI+SGVscDwvYT48L2gxPgorPC9pZnJhbWU+CisKKzwvcHk6aWY+Cis8aHIvPgorPGk+JElkOiAkPC9pPgorPC9kaXY+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS90cmFjL0ljdUNvZGVUb29scy8wLjEyL2ljdWNvZGV0b29scy90aWNrZXRtZ3IucHkgYi90cmFjL0ljdUNvZGVUb29scy8wLjEyL2ljdWNvZGV0b29scy90aWNrZXRtZ3IucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGQ4YjhiYwotLS0gL2Rldi9udWxsCisrKyBiL3RyYWMvSWN1Q29kZVRvb2xzLzAuMTIvaWN1Y29kZXRvb2xzL3RpY2tldG1nci5weQpAQCAtMCwwICsxLDE5NCBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA3LTIwMTEgSUJNIGFuZCBPdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyMgQXV0aG9yOiA8c3JsQGljdS1wcm9qZWN0Lm9yZz4KKyMKKworIyAKKyMgVGlja2V0IG1hbmFnZW1lbnQuCisjIFRoaXMgY29tcG9uZW50IG1hbmFnZXMgdGhlIHJldmlzaW9uIHRvIHRpY2tldCBtYXAuCisjCisjIDIwMTEtamFuLTI3CXNybAlhZGRpbmcgSVJlcG9zaXRvcnlDaGFuZ2VMaXN0ZW5lciBmdW5jdGlvbmFsaXR5IChyZXF1aXJlcyB0cmFjIDAuMTIpCisKKworCitmcm9tIHRyYWMuY29yZSBpbXBvcnQgQ29tcG9uZW50LCBpbXBsZW1lbnRzLCBUcmFjRXJyb3IKK2Zyb20gdHJhYy5lbnYgaW1wb3J0IElFbnZpcm9ubWVudFNldHVwUGFydGljaXBhbnQKK2Zyb20gdHJhYy5kYiBpbXBvcnQgVGFibGUsIENvbHVtbiwgSW5kZXgsIERhdGFiYXNlTWFuYWdlcgorZnJvbSB0cmFjLmNvbmZpZyBpbXBvcnQgT3B0aW9uCitmcm9tIHRyYWMudXRpbC50ZXh0IGltcG9ydCBleGNlcHRpb25fdG9fdW5pY29kZQorZnJvbSB0cmFjLnZlcnNpb25jb250cm9sLmFwaSBpbXBvcnQgSVJlcG9zaXRvcnlDaGFuZ2VMaXN0ZW5lcgorCitpbXBvcnQgcmUKKwordGt0bWdyX3NjaGVtYSA9IFsKKyAgICBUYWJsZSgncmV2MnRpY2tldCcsIGtleT0ncmV2JylbICAgICAgICAgIyBtYXAgcmV2LT50aWNrZXQKKyAgICAgICAgQ29sdW1uKCdyZXYnLCB0eXBlPSdpbnQnKSwgICAgICAgICAgIyBjaGFuZ2VzZXQgaWQKKyAgICAgICAgQ29sdW1uKCd0aWNrZXQnLCB0eXBlPSdpbnQnKSwgICAgICAgIyB0aWNrZXQgIworICAgICAgICBJbmRleChbJ3RpY2tldCddKV0sICAgICAgICAgICAgICAgICAjIGluZGV4IGJ5IHRpY2tldAorXQorCitjbGFzcyBUaWNrZXRNYW5hZ2VyKENvbXBvbmVudCk6CisgICAgaW1wbGVtZW50cyhJRW52aXJvbm1lbnRTZXR1cFBhcnRpY2lwYW50LCBJUmVwb3NpdG9yeUNoYW5nZUxpc3RlbmVyKQorCisgICAgdGlja2V0X3BhdHRlcm4gPSBPcHRpb24oJ2ljdWNvZGV0b29scycsICd0aWNrZXRfcGF0dGVybicsICdedGlja2V0OihcZCspJywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIiQSByZWdleCBtYXRjaGluZyB0aGUgY29tbWl0IG1lc3NhZ2VzLiBHcm91cCAxIG11c3QgcmV0dXJuIGEgbnVtYmVyLiIiIikKKyAgICAKKyAgICBkZWYgaWN1X3RrdG1ncihzZWxmKToKKyAgICAgICAgcmV0dXJuIDE7CisgICAgCisgICAga25vd25feW91bmdlc3QgPSAtMQorCisgICAgZGVmIGVudmlyb25tZW50X2NyZWF0ZWQoc2VsZik6CisgICAgICAgIGRiID0gc2VsZi5lbnYuZ2V0X2RiX2NueCgpCisgICAgICAgIGNvbm5lY3RvciwgXyA9IERhdGFiYXNlTWFuYWdlcihzZWxmLmVudikuX2dldF9jb25uZWN0b3IoKQorICAgICAgICBjdXJzb3IgPSBkYi5jdXJzb3IoKQorICAgICAgICBmb3IgdGFibGUgaW4gdGt0bWdyX3NjaGVtYToKKyAgICAgICAgICAgIGZvciBzdG10IGluIGNvbm5lY3Rvci50b19zcWwodGFibGUpOgorICAgICAgICAgICAgICAgIGN1cnNvci5leGVjdXRlKHN0bXQpCisKKyAgICAgICAgY3Vyc29yLmV4ZWN1dGUoIklOU0VSVCBJTlRPIHN5c3RlbSAobmFtZSx2YWx1ZSkgIgorICAgICAgICAgICAgICAgICAgICAgICAiVkFMVUVTICgnaWN1X3RrdG1ncicsJXMpIiwgKHNlbGYuaWN1X3RrdG1ncigpLCkpCisgICAgICAgIGRiLmNvbW1pdCgpCisgICAgICAgIHNlbGYubG9nLmluZm8oJ0RhdGFiYXNlIHVwZGF0ZTogaWN1X3RrdG1nciB0YWJsZXMgdmVyc2lvbiAlZCAnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmljdV90a3RtZ3IoKSkKKyAgICAgICAgcHJpbnQgJ2ljdWNvZGV0b29scy50aWNrZXRtZ3I6IE5vdGUsIGZpcnN0IHJldmlldyB3aWxsIHRha2UgYSB3aGlsZS5cbicKKyAgICAKKyAgICBkZWYgeW91bmdlc3RfcmV2KHNlbGYsZGIpOgorICAgICAgICBpZiAoc2VsZi5rbm93bl95b3VuZ2VzdCA8IDApOgorICAgICAgICAgICAgI3ByaW50KCdEaWQgbm90IGtub3cgeW91bmdlc3QgdmFsdWUuJykKKyAgICAgICAgICAgIGN1cnNvciA9IGRiLmN1cnNvcigpCisgICAgICAgICAgICBjdXJzb3IuZXhlY3V0ZSgiU0VMRUNUIHZhbHVlIEZST00gc3lzdGVtIFdIRVJFIG5hbWU9J2ljdV90a3RtZ3JfeW91bmdlc3QnIikKKyAgICAgICAgICAgIHJvdyA9IGN1cnNvci5mZXRjaG9uZSgpCisgICAgICAgICAgICBpZiBub3Qgcm93OgorICAgICAgICAgICAgICAgIGN1cnNvci5leGVjdXRlKCJJTlNFUlQgSU5UTyBzeXN0ZW0gKG5hbWUsdmFsdWUpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVkFMVUVTICgnaWN1X3RrdG1ncl95b3VuZ2VzdCcsJy0xJykiKQorICAgICAgICAgICAgICAgIGRiLmNvbW1pdCgpCisgICAgICAgICAgICAgICAgc2VsZi5rbm93bl95b3VuZ2VzdCA9IC0yCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGtub3duX3lvdW5nZXN0ID0gaW50KHJvd1swXSkKKyAgICAgICAgICAgICAgICBzZWxmLmtub3duX3lvdW5nZXN0ID0ga25vd25feW91bmdlc3QKKyAgICAgICAgcmV0dXJuIHNlbGYua25vd25feW91bmdlc3QKKyAgICAgICAgCisgICAgZGVmIGNoZWNrX3N5bmMoc2VsZiwgbG9nLCBkYiwgcmVwb3MpOgorICAgICAgICBvdXJZb3VuZ2VzdCA9IHNlbGYueW91bmdlc3RfcmV2KGRiKQorICAgICAgICB0aGVpcllvdW5nZXN0ID0gcmVwb3MuZ2V0X3lvdW5nZXN0X3JldigpCisgICAgICAgICNsb2cuaW5mbygiVEtUOiBjaGVja19zeW5jICVkLyVkIiAlIChvdXJZb3VuZ2VzdCx0aGVpcllvdW5nZXN0KSkKKyAgICAgICAgaWYob3VyWW91bmdlc3QgPD0gdGhlaXJZb3VuZ2VzdCk6CisgICAgICAgICAgICBzZWxmLnJlc3luYyhsb2csIGRiLCByZXBvcywgb3VyWW91bmdlc3QsIHRoZWlyWW91bmdlc3QpCisgICAgCisgICAgZGVmIGVudmlyb25tZW50X25lZWRzX3VwZ3JhZGUoc2VsZiwgZGIpOgorICAgICAgICBjdXJzb3IgPSBkYi5jdXJzb3IoKQorICAgICAgICBjdXJzb3IuZXhlY3V0ZSgiU0VMRUNUIHZhbHVlIEZST00gc3lzdGVtIFdIRVJFIG5hbWU9J2ljdV90a3RtZ3InIikKKyAgICAgICAgcm93ID0gY3Vyc29yLmZldGNob25lKCkKKyAgICAgICAgaWYgbm90IHJvdyBvciBpbnQocm93WzBdKSA8IHNlbGYuaWN1X3RrdG1ncigpOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiB1cGdyYWRlX2Vudmlyb25tZW50KHNlbGYsIGRiKToKKyAgICAgICAgY3Vyc29yID0gZGIuY3Vyc29yKCkKKyAgICAgICAgY3Vyc29yLmV4ZWN1dGUoIlNFTEVDVCB2YWx1ZSBGUk9NIHN5c3RlbSBXSEVSRSBuYW1lPSdpY3VfdGt0bWdyJyIpCisgICAgICAgIHJvdyA9IGN1cnNvci5mZXRjaG9uZSgpCisgICAgICAgIGlmIG5vdCByb3c6CisgICAgICAgICAgICBzZWxmLmVudmlyb25tZW50X2NyZWF0ZWQoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5sb2cuaW5mbygnRG8gbm90IGtub3cgaG93IHRvIHVwZ3JhZGUgaWN1dHJheGN0bl90aWNrZXRtZ3IgdGFibGVzIHRvICVkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pY3VfdGt0bWdyKCkpCisJY3Vyc29yLmNsb3NlKCkKKworICAgIGRlZiByZXN5bmMoc2VsZiwgbG9nLCBkYiwgcmVwb3MsIG91cllvdW5nZXN0LCB0aGVpcllvdW5nZXN0KToKKyAgICAgICAgc2VsZi5sb2cuaW5mbygncmVzeW5jOiBvdXJZb3VuZ2VzdD0lZCB0aGVpcllvdW5nZXN0PSVkJyAlIChvdXJZb3VuZ2VzdCwgdGhlaXJZb3VuZ2VzdCkpCisgICAgICAgIGlmIChvdXJZb3VuZ2VzdCA8IDApOgorICAgICAgICAgICAgIyBzdGFydCBhdCByZXYgMQorICAgICAgICAgICAgb3VyWW91bmdlc3QgPSAxCisgICAgICAgIAorICAgICAgICAjc2VsZi50aWNrZXRfcGF0dGVybiA9IHNlbGYuZW52LmNvbmZpZy5nZXQoJ2ljdWNvZGV0b29scycsICd0aWNrZXRfcGF0dGVybicsICdeY2xkcmJ1ZyAoXGQrKTonKQorCisgICAgICAgICMgICAgICAgIGxvZy5pbmZvKCJQYXQ6ICVzIiAlIChzZWxmLnRpY2tldF9wYXR0ZXJuKSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi50aWNrZXRfbWF0Y2ggPSByZS5jb21waWxlKHNlbGYudGlja2V0X3BhdHRlcm4pCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIGU6CisgICAgICAgICAgICBmb3VuZCA9IHNlbGYuZW52LmNvbmZpZy5nZXQoJ2ljdWNvZGV0b29scycsICd0aWNrZXRfcGF0dGVybicsICdOb25lRm91bmQnKQorICAgICAgICAgICAgcmFpc2UgVHJhY0Vycm9yKCdDb3VsZCBub3QgY29tcGlsZSBpY3Vjb2RldG9vbHMudGlja2V0X3BhdHRlcm49LyVzLyBidXQgLyVzLzogJXMnICUgKHNlbGYudGlja2V0X3BhdHRlcm4sIGZvdW5kLCBleGNlcHRpb25fdG9fdW5pY29kZShlLCB0cmFjZWJhY2s9VHJ1ZSkpKQorCisjICAgICAgICBzZWxmLnRpY2tldF9tYXRjaCA9IHJlLmNvbXBpbGUoc2VsZi50aWNrZXRfcGF0dGVybi5nZXQoKSkKKyMgICAgICAgIHNlbGYudGlja2V0X21hdGNoID0gcmUuY29tcGlsZSgnLionKQorICAgICAgICBmb3IgaSBpbiByYW5nZShvdXJZb3VuZ2VzdCwgdGhlaXJZb3VuZ2VzdCsxKToKKyAgICAgICAgICAgICNsb2cud2FybmluZygnc3luY2luZzogJWQgWyVkLyVkKzFdJywgaSwgdGhlaXJZb3VuZ2VzdCkKKyAgICAgICAgICAgIGNzZXQgPSByZXBvcy5nZXRfY2hhbmdlc2V0KGkpCisgICAgICAgICAgICBzZWxmLnJldmlzaW9uX2NoYW5nZWQobG9nLCBjc2V0LCBpLCBkYi5jdXJzb3IoKSkKKyAgICAgICAgZGIuY29tbWl0KCkKKyAgICAgICAgY3Vyc29yID0gZGIuY3Vyc29yKCk7CisgICAgICAgIGN1cnNvci5leGVjdXRlKCJ1cGRhdGUgc3lzdGVtIHNldCB2YWx1ZT0nJXMnIHdoZXJlIG5hbWU9J2ljdV90a3RtZ3JfeW91bmdlc3QnIiAlICh0aGVpcllvdW5nZXN0KSkKKyAgICAgICAgZGIuY29tbWl0KCkKKyAgICAgICAgI2xvZy53YXJuKCJzZWxmLmtub3duX3lvdW5nZXN0IHdhcyAlZCBbJWQvJWRdIiAlIChzZWxmLmtub3duX3lvdW5nZXN0LG91cllvdW5nZXN0LHRoZWlyWW91bmdlc3QpKSAKKyAgICAgICAgIyB1cGRhdGUga25vd24geW91bmdlc3QuCisgICAgICAgIHNlbGYua25vd25feW91bmdlc3QgPSB0aGVpcllvdW5nZXN0CisgICAgICAgICNsb2cud2Fybigic2VsZi5rbm93bl95b3VuZ2VzdCBub3cgJWQgWyVkLyVkXSIgJSAoc2VsZi5rbm93bl95b3VuZ2VzdCxvdXJZb3VuZ2VzdCx0aGVpcllvdW5nZXN0KSkgCisgICAgICAgIHJldHVybgorCisgICAgIyBJUmVwb3NpdG9yeUNoYW5nZUxpc3RlbmVyIG1ldGhvZHMKKyAgICAjIE11c3QgY2FsbCB3aXRoOiB0cmFjLWFkbWluIC9ob21lL2ljdXRyYWMgY2hhbmdlc2V0IG1vZGlmaWVkICcoZGVmYXVsdCknIDI5MzMwIDI5MzMzICAtIHVnbHksIGh0dHA6Ly93d3cubWFpbC1hcmNoaXZlLmNvbS90cmFjLWRldkBnb29nbGVncm91cHMuY29tL21zZzA0NTY4Lmh0bWwKKyAgICBkZWYgY2hhbmdlc2V0X21vZGlmaWVkKHNlbGYsIHJlcG9zLCBjaGFuZ2VzZXQsIG9sZF9jaGFuZ2VzZXQpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnRpY2tldF9tYXRjaCA9IHJlLmNvbXBpbGUoc2VsZi50aWNrZXRfcGF0dGVybikKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgZToKKyAgICAgICAgICAgIGZvdW5kID0gc2VsZi5lbnYuY29uZmlnLmdldCgnaWN1Y29kZXRvb2xzJywgJ3RpY2tldF9wYXR0ZXJuJywgJ05vbmVGb3VuZCcpCisgICAgICAgICAgICByYWlzZSBUcmFjRXJyb3IoJ0NvdWxkIG5vdCBjb21waWxlIGljdWNvZGV0b29scy50aWNrZXRfcGF0dGVybj0vJXMvIGJ1dCAvJXMvOiAlcycgJSAoc2VsZi50aWNrZXRfcGF0dGVybiwgZm91bmQsIGV4Y2VwdGlvbl90b191bmljb2RlKGUsIHRyYWNlYmFjaz1UcnVlKSkpCisgICAgICAgIGRiID0gc2VsZi5lbnYuZ2V0X2RiX2NueCgpCisgICAgICAgIGN1cnNvciA9IGRiLmN1cnNvcigpCisgICAgICAgIGN1cnNvci5leGVjdXRlKCJERUxFVEUgRlJPTSByZXYydGlja2V0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndoZXJlIHJldj0gJXMgIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyKGNoYW5nZXNldC5yZXYpKQorICAgICAgICBzZWxmLnJldmlzaW9uX2NoYW5nZWQoc2VsZi5sb2csIGNoYW5nZXNldCwgY2hhbmdlc2V0LnJldiwgZGIuY3Vyc29yKCkpCisJZGIuY29tbWl0KCkKKwkjc2VsZi5sb2cuZXJyb3IoImNoYW5nZXNldF9hZGRlZDogJXNcbiIgJSBjaGFuZ2VzZXQucmV2KQorCisgICAgZGVmIGNoYW5nZXNldF9hZGRlZChzZWxmLCByZXBvcywgY2hhbmdlc2V0KToKKyAgICAgICAgbWVzc2FnZSA9IGNoYW5nZXNldC5tZXNzYWdlIG9yICctLScKKwkjc2VsZi5sb2cuZXJyb3IoImNoYW5nZXNldF9hZGRlZDogJXNcbiIgJSBjaGFuZ2VzZXQucmV2KQorCisgICAgIyBJUmVwb3NpdG9yeU9ic2VydmVyIGZ1bmN0aW9uCisgICAgZGVmIHJldmlzaW9uX2NoYW5nZWQoc2VsZiwgbG9nLCBjc2V0LCBuZXh0X3lvdW5nZXN0LCBjdXJzb3IpOgorICAgICAgICAjIHN5bmMgdGhlICdyZXYydGlja2V0JyB0YWJsZQorICAgICAgICBtZXNzYWdlID0gY3NldC5tZXNzYWdlIG9yICctLScKKyAgICAgICAgIyBjYW4gd2UgbG9hZCBhIHRpY2tldCBmcm9tIGl0PyAgICJ0aWNrZXQ6MTIzNDogTWVzc2FnZSIKKyAgICAgICAgcmVzID0gc2VsZi50aWNrZXRfbWF0Y2gubWF0Y2gobWVzc2FnZSkKKyAgICAgICAgaWYgcmVzOgorICAgICAgICAgICAgdGlja25hbWUgPSByZXMuZ3JvdXAoMSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpbnQocmVzLmdyb3VwKDEpKSAjIHNob3VsZCBiZSBpbnQKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIGU6CisgICAgICAgICAgICAgICAgc2VsZi5sb2cud2FybmluZygnUmV2aXNpb24gWyVzXSBoYWQgdW5wYXJzZWFibGUgdGlja2V0IG51bWJlciBbJXNdOiBbJXNdJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmV4dF95b3VuZ2VzdCwgdGlja25hbWUsIGUpKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgdHJ5OgorCQkjbG9nLndhcm5pbmcoJ3Ilcz0jJXMnICUgKHN0cihuZXh0X3lvdW5nZXN0KSwgdGlja25hbWUpKQorICAgICAgICAgICAgICAgIGN1cnNvci5leGVjdXRlKCJJTlNFUlQgT1IgSUdOT1JFIElOVE8gcmV2MnRpY2tldCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAocmV2LHRpY2tldCkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWQUxVRVMgKCVzLCVzKSAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHIobmV4dF95b3VuZ2VzdCksIHRpY2tuYW1lKSkKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIGU6ICMgKmFub3RoZXIqIDEuMS4gcmVzeW5jIGF0dGVtcHQgd29uIAorICAgICAgICAgICAgICAgIGxvZy53YXJuaW5nKCdyZXYydGlja2V0ICVzIGNvdWxkIG5vdCBjYWNoZTogJXMnICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZXh0X3lvdW5nZXN0LCBlKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBsb2cud2FybmluZygnUmV2aXNpb24gJXMgaGFkIHVubWF0Y2hlZCBtZXNzYWdlICVzJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmV4dF95b3VuZ2VzdCwgY3NldC5tZXNzYWdlKSkKKyAgICAKKyAgICBkZWYgcmVwb3NpdG9yeV9yZXN5bmMoc2VsZiwgY3Vyc29yKToKKyAgICAgICAgY3Vyc29yLmV4ZWN1dGUoIkRFTEVURSBGUk9NIHJldjJ0aWNrZXQiKTsKKyAgICAgICAgCisgICAgZGVmIHRrdDJyZXZzKHNlbGYsIGxvZywgZGIsIHJlcG9zLCByZXEsIHRpY2tldCk6CisgICAgICAgICIiIkdpdmVuIGEgdGlja2V0LCByZXR1cm4gYSBsaXN0IG9mIHJldnMuCisgICAgICAgICIiIgorICAgICAgICAKKyAgICAgICAgc2VsZi5jaGVja19zeW5jKGxvZywgZGIsIHJlcG9zKQorICAgICAgICBjdXJzb3IgPSBkYi5jdXJzb3IoKQorICAgICAgICBjdXJzb3IuZXhlY3V0ZSgic2VsZWN0IHJ0LnJldiBmcm9tIHJldjJ0aWNrZXQgYXMgcnQgd2hlcmUgcnQudGlja2V0ID0gJWQgb3JkZXIgYnkgcnQucmV2IiAlIGludCh0aWNrZXQpKQorICAgICAgICByZXZzID0gW10KKyAgICAgICAgZm9yIHJldiwgaW4gY3Vyc29yOgorICAgICAgICAgICAgcmV2ID0gaW50KHJldikKKyAgICAgICAgICAgIHJldnMuYXBwZW5kKHJldikKKwljdXJzb3IuY2xvc2UoKQorICAgICAgICByZXR1cm4gcmV2cwpkaWZmIC0tZ2l0IGEvdHJhYy9JY3VDb2RlVG9vbHMvMC4xMi9pY3Vjb2RldG9vbHMvdGt0bGlzdC5weSBiL3RyYWMvSWN1Q29kZVRvb2xzLzAuMTIvaWN1Y29kZXRvb2xzL3RrdGxpc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTdkZTQ5NgotLS0gL2Rldi9udWxsCisrKyBiL3RyYWMvSWN1Q29kZVRvb2xzLzAuMTIvaWN1Y29kZXRvb2xzL3RrdGxpc3QucHkKQEAgLTAsMCArMSwxNzEgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSUJNIGFuZCBPdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKworaW1wb3J0IHJlCisKK2ltcG9ydCBzeXMKKworZnJvbSB0cmFjLmNvcmUgaW1wb3J0ICoKK2Zyb20gdHJhYy51dGlsIGltcG9ydCBNYXJrdXAKK2Zyb20gdHJhYy53ZWIgaW1wb3J0IElSZXF1ZXN0SGFuZGxlcgorZnJvbSB0cmFjLndlYi5jaHJvbWUgaW1wb3J0IGFkZF9zdHlsZXNoZWV0LCBJTmF2aWdhdGlvbkNvbnRyaWJ1dG9yLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVRlbXBsYXRlUHJvdmlkZXIKK2Zyb20gdHJhYy53ZWIuaHJlZiBpbXBvcnQgSHJlZgorI2Zyb20gdHJhYy52ZXJzaW9uY29udHJvbC53ZWJfdWkuY2hhbmdlc2V0IGltcG9ydCBJQ2hhbmdlc2V0UmFuZ2VMaW5rCitmcm9tIHRyYWMud2lraSBpbXBvcnQgd2lraV90b19odG1sLCB3aWtpX3RvX29uZWxpbmVyLCBJV2lraVN5bnRheFByb3ZpZGVyLCBcCisgICAgICAgICAgICAgICAgICAgICAgRm9ybWF0dGVyCitmcm9tIHRyYWMudGlja2V0IGltcG9ydCBUaWNrZXQKKworCisKK2NsYXNzIFRpY2tldGxpc3RNb2R1bGUoQ29tcG9uZW50KToKKworICAgIGltcGxlbWVudHMoSVJlcXVlc3RIYW5kbGVyKQorIyAgICBpbXBsZW1lbnRzKElSZXF1ZXN0SGFuZGxlcixJQ2hhbmdlc2V0UmFuZ2VMaW5rKQorCisgICAgZGVmIHJldmlzaW9uX3JhbmdlX2xpbmsoc2VsZiwgcmVxLCBiYXNlLCBzdGFydCwgZW5kKToKKyAgICAgICAgcmV0dXJuICgnVGlja2V0IExpc3QnLCByZXEuaHJlZigndGt0bGlzdCcsb2xkX3BhdGg9YmFzZSxuZXdfcGF0aD1iYXNlLG9sZD1zdGFydCxuZXc9ZW5kKSkKKworICAgIF9yZXF1ZXN0X3JlID0gcmUuY29tcGlsZShyIi90a3RsaXN0KD86LyhbXi9dKykpPygvLiopPyQiKQorCisgICAgZGVmIG1hdGNoX3JlcXVlc3Qoc2VsZiwgcmVxKToKKyAgICAgICAgbWF0Y2ggPSByZS5tYXRjaChzZWxmLl9yZXF1ZXN0X3JlLCByZXEucGF0aF9pbmZvKQorICAgICAgICBpZiBtYXRjaDoKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgcHJvY2Vzc19yZXF1ZXN0KHNlbGYsIHJlcSk6CisgICAgICAgICNvaywgd2hhdCBhcmUgd2UgYWJvdXQuCisgICAgICAgIGRiID0gc2VsZi5lbnYuZ2V0X2RiX2NueCgpCisgICAgICAgIHRpY2tldGxpc3QgPSB7fSAgIyBkaWN0IG9mIHRpY2tldC0+Pz8/CisgICAgICAgIHJldmxpc3QgPSB7fSAjIGRpY3Qgb2YgcmV2aXNpb24tPgorICAgICAgICByZXBvcyA9IHNlbGYuZW52LmdldF9yZXBvc2l0b3J5KHJlcS5hdXRobmFtZSkKKworICAgICAgICBpZiBub3QgcmVxLnBlcm0uaGFzX3Blcm1pc3Npb24oJ1RJQ0tFVF9NT0RJRlknKToKKyAgICAgICAgICAgIHJldHVybiByZXEucmVkaXJlY3QocmVxLmhyZWYuYnJvd3NlcigpKQorCisgICAgICAgICMgc2hvcnRjdXQgLSBpZiAicmV2cyIgaXMgc2V0LCBqdXN0IHVzZSB0aGF0CisgICAgICAgIHJldnMgPSByZXEuYXJncy5nZXQoJ3JldnMnKQorICAgICAgICBpZiByZXZzIGFuZCBsZW4ocmV2cyk+MDoKKyAgICAgICAgICAgY29udGVudF90eXBlID0gInRleHQvaHRtbCIKKyAgICAgICAgICAgYWRkX3N0eWxlc2hlZXQocmVxLCAnY3NzL2ljdXh0bi5jc3MnKQorICAgICAgICAgICByZXEuaGRmWyd0aXgucmV2cyddID0gcmV2cworICAgICAgICAgICBpdGVtcyA9IHJldnMuc3BsaXQoKQorICAgICAgICAgICBvdXRzdHIgPSAnMT0wICcKKyAgICAgICAgICAgZm9yIGl0ZW0gaW4gaXRlbXM6CisgICAgICAgICAgICAgICByZXYgPSBpbnQoaXRlbSkgIyBtYXkgZmFpbAorICAgICAgICAgICAgICAgb3V0c3RyID0gJ3J0LnJldj0lZCclKHJldikKKyAgICAgICAgICAgcmVxLmhkZlsnaXNfZGN1dCddPTEKKyAgICAgICAgICAgcmVxLmhkZlsndGl4LnNxbCddID0gb3V0c3RyICAKKyAgICAgICAgICAgIyB0ZXN0IC0gZ2V0IHJlbGV2YW50IHJldnMKKyAgICMgICAgICAgIHByaW50ICJvdGltZT0lcywgbnRpbWU9JXMiJSh0eXBlKG90aW1lKSx0eXBlKG50aW1lKSkKKyAgICAgICAgICAgI2N1cnNvci5leGVjdXRlKCJzZWxlY3QgZGlzdGluY3QgdC5pZCx0LnN1bW1hcnkgZnJvbSB0aWNrZXQgYXMgdCxyZXZpc2lvbiBhcyByLCByZXYydGlja2V0IGFzIHJ0ICIKKyAgICAgICAgICAgIyAgICAgICAgICAgICAgICIgd2hlcmUgdC5pZCA9IHJ0LnRpY2tldCBhbmQgKCVzKSBvcmRlciBieSB0LmlkIiUob3V0c3RyKSkKKyAgICAgICAgICAgYWxsc3FsID0gInNlbGVjdCBkaXN0aW5jdCB0aWNrZXQgZnJvbSByZXYydGlja2V0IGFzIHJ0IHdoZXJlICVzIG9yZGVyIGJ5IHJ0LnRpY2tldCIlKG91dHN0cikKKyAgICAgICAgICAgYWxsc3FsID0gInNlbGVjdCB0aWNrZXQgZnJvbSByZXYydGlja2V0IHdoZXJlIHJldj0lcyBvcmRlciBieSB0aWNrZXQiCisgICAgICAgICAgIGN1cnNvciA9IGRiLmN1cnNvcigpCisgICAgICAgICAgIyBjdXJzb3IuZXhlY3V0ZSgic2VsZWN0IHRpY2tldCBmcm9tIHJldjJ0aWNrZXQgd2hlcmUgcmV2PSVzIG9yZGVyIGJ5IHRpY2tldCIsKCIyMjkxMyIsKSkKKyAgICAgICAgICAgY3Vyc29yLmV4ZWN1dGUoInNlbGVjdCBydC5yZXYgZnJvbSByZXYydGlja2V0IGFzIHJ0IHdoZXJlIHJ0LnRpY2tldCA9ICVkIG9yZGVyIGJ5IHJ0LnJldiIgJSBpbnQoNjAxMCkpCisgICAgICAgICAgIHRpY2tldCA9IDAKKyAgICAgICAgICAgcmVxLmhkZlsndGl4LnNxbCddID0gYWxsc3FsICAKKyAgICAgICAgICAgcmVxLmhkZlsndGl4LnNxbCddPSJ6ZXJvIgorICAgICAgICAgICBmb3IgdGt0IGluIGN1cnNvcjoKKyAgICAgICAgICAgICAgIHJlcS5oZGZbJ3RpeC5zcWwnXT10a3QKKyAgICAgICAgICAgICAgIHN1bW0gPSAiIjsKKyAgICAgICAgICAgICAgICNzeXMuc3RkZXJyLndyaXRlKCIgdGt0ICVzIHN1bW0gJXMgZnJvbSAoZC1kKSIgJSAodGt0LHN1bW0pKQorICAgICAgICAgICAgICAgdGlja2V0ID0gdGlja2V0ICsgMQorICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgIHJlcS5oZGZbJ3RpY2tldHMuJWQuY29tbWVudCcgJSB0aWNrZXRdID0gc3VtbQorICAgICAgICAgICAgICAgICAgICNyZXEuaGRmWyd0aWNrZXRzLiVkLmNvbW1lbnRodG1sJyAlIHRpY2tldF0gPSB3aWtpX3RvX29uZWxpbmVyKCBzdW1tLCBzZWxmLmVudiwgZGIsIHNob3J0ZW49VHJ1ZSApCisgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uLGU6CisgICAgICAgICAgICAgICAgICAgcmVxLmhkZlsndGl4LnNxbCddPWUKKyAgICAgICAgICAgICAgICAgICAjcmVxLmhkZlsndGlja2V0cy4lZC5jb21tZW50aHRtbCcgJSB0aWNrZXRdID0gJycKKyAgICAgICAgICAgICAgICAgICByZXEuaGRmWyd0aWNrZXRzLiVkLmNvbW1lbnQnICUgdGlja2V0XSA9ICcnCisgICAgICAgICAgICAgICByZXEuaGRmWyd0aWNrZXRzLiVkLm51bWJlcicgJSB0aWNrZXRdID0gdGt0CisgICAgICAgICAgICAgICAjYWEgPSBNYXJrdXAoIjxhIGNsYXNzPVwibmV3IHRpY2tldFwiIGhyZWY9XCIlc1wiIHRpdGxlPVwiVGlja2V0IHggKG5ldylcIj4jJXM8L2E+IiUocmVxLmhyZWYudGlja2V0KHRrdCksdGt0KSkKKyAgICAgICAgICAgICAgICNyZXEuaGRmWyd0aWNrZXRzLiVkLmh0bWwnICUgdGlja2V0XSA9IGFhCisgICAgICAgICAgICMgc2V0IFJERiBoZXJlCisgICAgICAgICAgIHJldHVybiAndGt0cmV2cy5jcycsIGNvbnRlbnRfdHlwZQorCisgICAgICAgIG5ld19wYXRoID0gcmVxLmFyZ3MuZ2V0KCduZXdfcGF0aCcpCisgICAgICAgIG5ld19yZXYgPSByZXEuYXJncy5nZXQoJ25ldycpCisgICAgICAgIG9sZF9wYXRoID0gcmVxLmFyZ3MuZ2V0KCdvbGRfcGF0aCcpCisgICAgICAgIG9sZF9yZXYgPSByZXEuYXJncy5nZXQoJ29sZCcpCisKKyAgICAgICAgbmV3X3BhdGggPSByZXBvcy5ub3JtYWxpemVfcGF0aChuZXdfcGF0aCkKKyAgICAgICAgbmV3X3JldiA9IHJlcG9zLm5vcm1hbGl6ZV9yZXYobmV3X3JldikKKyAgICAgICAgb2xkX3BhdGggPSByZXBvcy5ub3JtYWxpemVfcGF0aChvbGRfcGF0aCkKKyAgICAgICAgb2xkX3JldiA9IHJlcG9zLm5vcm1hbGl6ZV9yZXYob2xkX3JldikKKworCisgICAgICAgIG9sZF9yZXYgPSBpbnQob2xkX3JldikKKyAgICAgICAgbmV3X3JldiA9IGludChuZXdfcmV2KQorICAgICAgICAKKyAgICAgICAgcmVxLmhkZlsnY2hhbmdlc2V0LmRpZmZfaHJlZiddID0gcmVxLmhyZWYoJ2NoYW5nZXNldCcsb2xkX3BhdGg9b2xkX3BhdGgsbmV3PW5ld19yZXYsbmV3X3BhdGg9bmV3X3BhdGgsb2xkPW9sZF9yZXYpCisKKyAgICAgICAgcmVxLmhkZlsnaXNfZGN1dCddPTEKKyAgICAgICAgCisgICAgICAgIHJlcS5oZGZbJ2NoYW5nZXNldC5vbGRfcmV2J10gPSBvbGRfcmV2CisgICAgICAgIHJlcS5oZGZbJ2NoYW5nZXNldC5uZXdfcmV2J10gPSBuZXdfcmV2CisgICAgICAgIHJlcS5oZGZbJ2NoYW5nZXNldC5vbGRfcGF0aCddID0gb2xkX3BhdGgKKyAgICAgICAgcmVxLmhkZlsnY2hhbmdlc2V0Lm5ld19wYXRoJ10gPSBuZXdfcGF0aAorICAgICAgICBjb250ZW50X3R5cGUgPSAidGV4dC9odG1sIgorICAgICAgICBhZGRfc3R5bGVzaGVldChyZXEsICdjc3MvaWN1eHRuLmNzcycpCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgICMgZmlyc3QsIGdldCByZWxldmFudCBjaGFuZ2VzLgorICAgICAgICByZXEuaGRmWyd0YXJnZXRfcGF0aCddID0gJy4nOworICAgICAgICAjIG9rYXkuIG1hbnVhbGx5IHRyb21wIHRocm91Z2ggJ2VtCisgICAgICAgIG9zZXQgPSByZXBvcy5nZXRfY2hhbmdlc2V0KG9sZF9yZXYpOworICAgICAgICBuc2V0ID0gcmVwb3MuZ2V0X2NoYW5nZXNldChuZXdfcmV2KTsKKyAgICAgICAgb3RpbWUgPSBpbnQob3NldC5kYXRlKQorICAgICAgICBudGltZSA9IGludChuc2V0LmRhdGUpCisgICAgICAgIAorICAgICAgICBub3JtX3RyPSJzdHlsZT0nYm9yZGVyOiAxcHggZGFzaGVkIGdyZWVuOyBiYWNrZ3JvdW5kLWNvbG9yOiAjQ0ZDOyciCisgICAgICAgIGNsb3NlZF90cj0ic3R5bGU9J2NvbG9yOiAjNjY2OyciCisgICAgICAgIG5vcmV2X3RyPSJzdHlsZT0nYmFja2dyb3VuZC1jb2xvcjojRkREOyBib3JkZXI6IDFweCBzb2xpZCAjRjk5OyBmb250LXdlaWdodDogYm9sZDsnIgorCisgICAgICAgIHJlcS5oZGZbJ3NhbXBsZS5ub3JtLnRyJ10gPSBub3JtX3RyCisgICAgICAgIHJlcS5oZGZbJ3NhbXBsZS5jbG9zZWQudHInXSA9IGNsb3NlZF90cgorICAgICAgICByZXEuaGRmWydzYW1wbGUubm9yZXYudHInXSA9IG5vcmV2X3RyCisgICAgICAgIAorIyAgICAgICAgcHJpbnQgIiBzZWFyY2hpbmcgaW4gICglcy0lcykiICUgKG90aW1lLCBudGltZSkKKworICAgICAgICAjIHRlc3QgLSBnZXQgcmVsZXZhbnQgcmV2cworICAgICAgICBjdXJzb3IgPSBkYi5jdXJzb3IoKQorIyAgICAgICAgcHJpbnQgIm90aW1lPSVzLCBudGltZT0lcyIlKHR5cGUob3RpbWUpLHR5cGUobnRpbWUpKQorICAgICAgICBjdXJzb3IuZXhlY3V0ZSgic2VsZWN0IGRpc3RpbmN0IHQuaWQsdC5zdW1tYXJ5LHQub3duZXIsIHQubWlsZXN0b25lLCB0LnN0YXR1cyAiCisgICAgICAgICAgICAgICAgICAgICAgICIgLCBjLnZhbHVlICIgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAiIGZyb20gdGlja2V0IGFzIHQscmV2aXNpb24gYXMgciwgcmV2MnRpY2tldCBhcyBydCAiCisgICAgICAgICAgICAgICAgICAgICAgICIgbGVmdCBqb2luIHRpY2tldF9jdXN0b20gYXMgYyAiCisgICAgICAgICAgICAgICAgICAgICAgICIgb24gICggYy5uYW1lID0gJ3JldncnIEFORCBjLnRpY2tldCA9IHQuaWQgKSAiCisjICAgICAgICAgICAgICAgICAgICAgICAiICwgdGlja2V0X2N1c3RvbSBhcyBjICIKKyAgICAgICAgICAgICAgICAgICAgICAgIiB3aGVyZSB0LmlkID0gcnQudGlja2V0IGFuZCBydC5yZXYgPSByLnJldiBhbmQgci50aW1lID4gJXMgYW5kIHIudGltZSA8PSAlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICJhbmQgZXhpc3RzICggc2VsZWN0IG5jLnJldiBmcm9tIG5vZGVfY2hhbmdlIGFzIG5jIHdoZXJlIG5jLnJldj1yLnJldiBhbmQgbmMucGF0aCBsaWtlICVzICkgIgorICAgICAgICAgICAgICAgICAgICAgICAib3JkZXIgYnkgdC5pZCIsIChzdHIob3RpbWUpLCBzdHIobnRpbWUpLCAob2xkX3BhdGggKyAiJSIpKSkKKyAgICAgICAgdGlja2V0ID0gMAorICAgICAgICBmb3IgdGt0LHN1bW0sb3ducixtaWxlc3RvbmUsc3RhdHVzLCByZXZ3IGluIGN1cnNvcjoKKyMgICAgICAgICAgICBwcmludCAiIHRrdCAlcyBzdW1tICVzIGZyb20gKCVkLSVkKSIgJSAodGt0LHN1bW0sIG90aW1lLCBudGltZSkKKyAgICAgICAgICAgIHRpY2tldCA9IHRpY2tldCArIDEKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXEuaGRmWyd0aWNrZXRzLiVkLmNvbW1lbnQnICUgdGlja2V0XSA9IHN1bW0KKyAgICAgICAgICAgICAgICByZXEuaGRmWyd0aWNrZXRzLiVkLmNvbW1lbnRodG1sJyAlIHRpY2tldF0gPSB3aWtpX3RvX29uZWxpbmVyKCBzdW1tLCBzZWxmLmVudiwgZGIsIHNob3J0ZW49VHJ1ZSApCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uLGU6CisgICAgICAgICAgICAgICAgcmVxLmhkZlsndGlja2V0cy4lZC5jb21tZW50aHRtbCcgJSB0aWNrZXRdID0gJycKKyAgICAgICAgICAgICAgICByZXEuaGRmWyd0aWNrZXRzLiVkLmNvbW1lbnQnICUgdGlja2V0XSA9ICcnCisgICAgICAgICAgICByZXEuaGRmWyd0aWNrZXRzLiVkLm51bWJlcicgJSB0aWNrZXRdID0gdGt0CisgICAgICAgICAgICBhYSA9IE1hcmt1cCgiPGEgY2xhc3M9XCJuZXcgdGlja2V0XCIgaHJlZj1cIiVzXCIgdGl0bGU9XCJUaWNrZXQgeCAobmV3KVwiPiMlczwvYT4iJShyZXEuaHJlZi50aWNrZXQodGt0KSx0a3QpKQorICAgICAgICAgICAgcmVxLmhkZlsndGlja2V0cy4lZC5odG1sJyAlIHRpY2tldF0gPSBhYQorICAgICAgICAgICAgYWEgPSBNYXJrdXAoIjxhIGNsYXNzPVwibmV3IHRpY2tldFwiIGhyZWY9XCIlc1wiIHRpdGxlPVwiVGlja2V0IHggKG5ldylcIj4jJXM8L2E+IiUocmVxLmhyZWYudGlja2V0KHRrdCksdGt0KSkKKyAgICAgICAgICAgIHJlcS5oZGZbJ3RpY2tldHMuJWQub3duZXInICUgdGlja2V0XSA9IG93bnIKKyAgICAgICAgICAgIHJlcS5oZGZbJ3RpY2tldHMuJWQubWlsZXN0b25lJyAlIHRpY2tldF0gPSB3aWtpX3RvX29uZWxpbmVyKCAibWlsZXN0b25lOiVzIiVtaWxlc3RvbmUgLCBzZWxmLmVudiwgZGIsIHNob3J0ZW49RmFsc2UgKQorICAgICAgICAgICAgcmVxLmhkZlsndGlja2V0cy4lZC5yZXZpZXdlcicgJSB0aWNrZXRdID0gcmV2dworICAgICAgICAgICAgcmVxLmhkZlsndGlja2V0cy4lZC5zdGF0dXNodG1sJyAlIHRpY2tldF0gPSB3aWtpX3RvX29uZWxpbmVyKCAiIyVzIiUodGt0KSwgc2VsZi5lbnYsIGRiLCBzaG9ydGVuPUZhbHNlICkKKyAgICAgICAgICAgIHJlcS5oZGZbJ3RpY2tldHMuJWQuaHRtbCcgJSB0aWNrZXRdID0gYWEKKyAgICAgICAgICAgIHJlcS5oZGZbJ3RpY2tldHMuJWQudHInICUgdGlja2V0XSA9IG5vcm1fdHIKKyAgICAgICAgICAgIGlmIHN0YXR1cyBhbmQgc3RhdHVzLnN0YXJ0c3dpdGgoJ2Nsb3NlZCcpOgorICAgICAgICAgICAgICAgIHJlcS5oZGZbJ3RpY2tldHMuJWQudHInICUgdGlja2V0XSA9IGNsb3NlZF90cgorICAgICAgICAgICAgaWYgKCBub3QgcmV2dyApIG9yIGxlbihyZXZ3KTwxOgorICAgICAgICAgICAgICAgIHJlcS5oZGZbJ3RpY2tldHMuJWQudHInICUgdGlja2V0XSA9IG5vcmV2X3RyCisgICAgICAgIAorICAgICAgICByZXR1cm4gJ3RrdGxpc3QuY3MnLCBjb250ZW50X3R5cGUKKwpkaWZmIC0tZ2l0IGEvdHJhYy9JY3VDb2RlVG9vbHMvMC4xMi9saWNlbnNlLmh0bWwgYi90cmFjL0ljdUNvZGVUb29scy8wLjEyL2xpY2Vuc2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWUwMjUyCi0tLSAvZGV2L251bGwKKysrIGIvdHJhYy9JY3VDb2RlVG9vbHMvMC4xMi9saWNlbnNlLmh0bWwKQEAgLTAsMCArMSw1MSBAQAorPGh0bWw+CisKKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiPjwvbWV0YT4KKzx0aXRsZT5JQ1UgTGljZW5zZSAtIElDVSAxLjguMSBhbmQgbGF0ZXI8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keSBCR0NPTE9SPSIjZmZmZmZmIj4KKzxoMj5JQ1UgTGljZW5zZSAtIElDVSAxLjguMSBhbmQgbGF0ZXI8L2gyPgorCis8cD5DT1BZUklHSFQgQU5EIFBFUk1JU1NJT04gTk9USUNFPC9wPgorCis8cD4KK0NvcHlyaWdodCAoYykgMTk5NS0yMDEwIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kIG90aGVycworPC9wPgorPHA+CitBbGwgcmlnaHRzIHJlc2VydmVkLgorPC9wPgorPHA+CitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CitvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKK3RvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KK3RoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBhbmQvb3Igc2VsbAorY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zCit0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCitjb3B5cmlnaHQgbm90aWNlKHMpIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzCitvZiB0aGUgU29mdHdhcmUgYW5kIHRoYXQgYm90aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZShzKSBhbmQgdGhpcworcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4KKzwvcD4KKzxwPgorVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IgSU1QTElFRCwgCitJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQgT0YgVEhJUkQgUEFSVFkgUklHSFRTLiBJTiBOTyBFVkVOVCBTSEFMTAorVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgSE9MREVSUyBJTkNMVURFRCBJTiBUSElTIE5PVElDRSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwKK09SIEFOWSBTUEVDSUFMIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUgorUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCitORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCis8L3A+Cis8cD4KK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIGEgY29weXJpZ2h0IGhvbGRlciBzaGFsbCBub3QgYmUKK3VzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncyBpbgordGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBvZiB0aGUgY29weXJpZ2h0IGhvbGRlci4KKzwvcD4KKworPGhyPgorPHA+PHNtYWxsPgorQWxsIHRyYWRlbWFya3MgYW5kIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBtZW50aW9uZWQgaGVyZWluIGFyZSB0aGUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCis8L3NtYWxsPjwvcD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3RyYWMvSWN1Q29kZVRvb2xzLzAuMTIvcmVhZG1lLnR4dCBiL3RyYWMvSWN1Q29kZVRvb2xzLzAuMTIvcmVhZG1lLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTQ5ZDkxCi0tLSAvZGV2L251bGwKKysrIGIvdHJhYy9JY3VDb2RlVG9vbHMvMC4xMi9yZWFkbWUudHh0CkBAIC0wLDAgKzEsNzQgQEAKK0lDVSBDb2RlIFRvb2xzIHBsdWdpbgorCitDb3B5cmlnaHQgKEMpIDIwMTAgSUJNIENvcnBvcmF0aW9uIGFuZCBPdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCitTZWUgbGljZW5zZS5odG1sIGZvciB0aGUgbGljZW5zZSBmaWxlLiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUKK0lDVSBwcm9qZWN0IGFuZCBpcyB1bmRlciB0aGUgc2FtZSBsaWNlbnNlLgorCitSZXF1aXJlbWVudHM6CisJVHJhYyAoMC4xMSBvciAwLjEyKz8pCisJUmVwb3NpdG9yeQorCitJbnN0YWxsaW5nOgorCTEuIGluc3RhbGwgdGhlIHBsdWdpbiAtIGF0IGxlYXN0IHRoZSB0aWNrZXRtYW5hZ2VyIGFuZCByZXZpZXcgcG9ydGlvbi4KKworICAgICAgICAgYS4gVGhlcmUgaXMgbm8gc291cmNlIHJlbGVhc2UgYXQgdGhpcyB0aW1lOiBJIHJlY29tbWVuZAorICAgICAgICAgICAgIHRoYXQgeW91IGNoZWNrIG91dCB0aGlzIGNvZGUgd2l0aCBzdm4KKyAgICAgICAgICAgICBhbmQgaW4gdGhpcyBkaXJlY3RvcnksIHJ1bjogCisgICAgICAgICAgICAgICAgInB5dGhvbiBzZXR1cC5weSBkZXZlbG9wIgorCQorCSBiLiBJbiB0cmFjLmluaSB1bmRlciAnW2NvbXBvbmVudHNdJyBhZGQ6CisJCWljdWNvZGV0b29scy5yZXZpZXcucmV2aWV3bW9kdWxlID0gZW5hYmxlZAorCQlpY3Vjb2RldG9vbHMudGlja2V0bWdyLnRpY2tldG1hbmFnZXIgPSBlbmFibGVkCisJCisJTk9URTogRENVVCBhbmQgVEtUTElTVCBwYXJ0cyBhcmUgbm90IHdvcmtpbmcgeWV0LiAKKwlEb24ndCBib3RoZXIgdG8gZW5hYmxlIHRoZW0uCisKKwkyLiBpbiB5b3VyIHRyYWMuaW5pIGRlc2NyaWJlIGhvdyB5b3VyIGNoYW5nZXNldHMgZGVzY3JpYmUgYSB0aWNrZXQuIAorCU91ciBjaGFuZ2VzZXRzIGxvb2sgbGlrZSB0aGlzOiAgInRpY2tldDoxMjM0OiBmaXhlZCB0aGUgYnJva2VuIGNvZGUiCisJV2UgdXNlIHRoaXMgcmVnZXg6CisKKwkgICBbaWN1Y29kZXRvb2xzXQorCSAgIHRpY2tldF9wYXR0ZXJuID0gXnRpY2tldDooXGQrKQorCisJMy4geW91IG1heSBuZWVkIHRvIHJ1biB0cmFjLWFkbWluIDxlbnZpcm9ubWVudD4gdXBncmFkZSAKKworCTQuIEdyYW50IHBlcm1pc3Npb24gb2YgSUNVUkVWSUVXX1ZJRVcgdG8gd2hvbWV2ZXIgeW91IHdhbnQgdG8gCisJICAgYmUgYWJsZSB0byByZXZpZXcgdGlja2V0cy4gCisKKwk1LiBOb3csIGFueSB0aWNrZXQgd2lsbCBoYXZlIHNvbWV0aGluZyBpbiB0aGUgdG9wIHJpZ2h0IGNvcm5lciB3aGljaCBzYXlzOgorCSAgICAgIk5vIGNvbW1pdHMiIC0gbm8gY29tbWl0cyBhZ2FpbnN0IHRoaXMgdGlja2V0CisKKwkgICAgICJSZXZpZXcgMSBjb21taXRzIiAgLSB0aGVyZSBpcyBvbmx5IG9uZSBjb21taXQuIENsaWNraW5nIHRoaXMgbGluaworCSAgICAgICAgICAgICB3aWxsIGp1c3QgdGFrZSB5b3UgdG8gdGhhdCBzaW5nbGUgY2hhbmdlc2V0LgorCisJICAgICAgIlJldmlldyBuIGNvbW1pdHMiICAtIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIGNvbW1pdHMgYWdhaW5zdCB0aGlzCisJICAgICAgICAgICAgIHRpY2tldC4KKworIAorVHJvdWJsZXNob290aW5nOgorCitROiBNeSBjb21taXRzIGFyZW4ndCBiZWluZyBmb3VuZCEKK0E6IENoZWNrIHRoZSBkZWJ1ZyBsb2cuIEl0IHdpbGwgbm90ZSBjb21taXRzIHdpdGggdW5wYXJzZWFibGUgbWVzc2FnZXMKKworUTogSG93IGRvIEkgcmVzeW5jIHRoZSBjb21taXRzPworQTogVW50aWwgd2UgaW1wbGVtZW50IHRyYWMgMC4xMiBjaGFuZ2VzZXQgbGlzdGVuZXJzLCB5b3UgY2FuIGRvIHRoaXM6CisKKyAgICAwLiAgYmFjayB1cCB5b3VyIHBhdGgvdG8vZW52L2RiL3RyYWMuZGIKKworICAgIDEuICQgc3FsaXRlMyAgcGF0aC90by9lbnYvZGIvdHJhYy5kYgorICAgIAorICAgIDIuIHNxbGl0ZT4gZGVsZXRlIGZyb20gcmV2MnRpY2tldDsKKworICAgIDMuIHNxbGl0ZT4gdXBkYXRlIHN5c3RlbSBzZXQgdmFsdWU9Jy0xJyB3aGVyZSBuYW1lPSdpY3VfdGt0bWdyX3lvdW5nZXN0JzsKKworICAgIDQuIHNxbGl0ZT4gIC5xdWl0CisKK05vdyB0aGUgdGlja2V0IG1hbmFnZXIgd2lsbCByZS1zeW5jIHRoZSBmaXJzdCB0aW1lIHlvdSBoaXQgYSB0aWNrZXQuCisKK0ZJTElORyBCVUdTL0ZFQVRVUkUgUkVRVUVTVFM6CisgLSBVc2UgSUNVJ3MgdHJhYyByZXBvc2l0b3J5IGF0IGh0dHA6Ly9idWdzLmljdS1wcm9qZWN0Lm9yZy90cmFjCisgLSBVc2UgdGhlICdpbmZyYXN0cnVjdHVyZScgY29tcG9uZW50IGFuZCBjbGVhcmx5IGlkZW50aWZ5IHRoZSAnSUNVIENvZGUgVG9vbHMKKyAgIGZvciBUcmFjJyB3aGVuIHlvdSBmaWxlIHRoZSBidWcuCisKKworCmRpZmYgLS1naXQgYS90cmFjL0ljdUNvZGVUb29scy8wLjEyL3NldHVwLmNmZyBiL3RyYWMvSWN1Q29kZVRvb2xzLzAuMTIvc2V0dXAuY2ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMjNmMmIKLS0tIC9kZXYvbnVsbAorKysgYi90cmFjL0ljdUNvZGVUb29scy8wLjEyL3NldHVwLmNmZwpAQCAtMCwwICsxLDQgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSUJNIGFuZCBPdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQKK1tlZ2dfaW5mb10KK3RhZ19idWlsZCA9IGRldgordGFnX3N2bl9yZXZpc2lvbiA9IHRydWUKZGlmZiAtLWdpdCBhL3RyYWMvSWN1Q29kZVRvb2xzLzAuMTIvc2V0dXAucHkgYi90cmFjL0ljdUNvZGVUb29scy8wLjEyL3NldHVwLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFiM2YxODkKLS0tIC9kZXYvbnVsbAorKysgYi90cmFjL0ljdUNvZGVUb29scy8wLjEyL3NldHVwLnB5CkBAIC0wLDAgKzEsMzUgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA3LTIwMTAgSUJNIGFuZCBPdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisKK2Zyb20gc2V0dXB0b29scyBpbXBvcnQgc2V0dXAsIGZpbmRfcGFja2FnZXMKKworUEFDS0FHRSA9ICdJY3VDb2RlVG9vbHMnCitWRVJTSU9OID0gJzAuMC4xJworCitzZXR1cCgKKyAgICBuYW1lPVBBQ0tBR0UsIHZlcnNpb249VkVSU0lPTiwKKyAgICBkZXNjcmlwdGlvbj0nTWlzY2VsbGFuZW91cyBJQ1UgRXh0ZW5zaW9ucyB0byBUcmFjJywKKyAgICBhdXRob3I9IlN0ZXZlbiBSLiBMb29taXMiLCBhdXRob3JfZW1haWw9InNybEBpY3UtcHJvamVjdC5vcmciLAorICAgIGxpY2Vuc2U9J0JTRCcsIHVybD0naHR0cDovL2ljdS1wcm9qZWN0Lm9yZycsCisgICAgcGFja2FnZXM9ZmluZF9wYWNrYWdlcyhleGNsdWRlPVsnZXpfc2V0dXAnLCAnKi50ZXN0cyonXSksCisgICAgcGFja2FnZV9kYXRhPXsKKyAgICAgICAgJ2ljdWNvZGV0b29scyc6IFsKKyAgICAgICAgICAgICdodGRvY3MvY3NzLyouY3NzJywKKyAgICAgICAgICAgICd0ZW1wbGF0ZXMvKi5odG1sJywKKyMjICAgICAgICAgICAgJ2h0ZG9jcy9pbWcvKi5wbmcnLAorIyAgICAgICAgICAgICdodGRvY3MvanMvKi5qcycsCisgICAgICAgIF0KKyAgICB9LAorICAgIGVudHJ5X3BvaW50cyA9IHsKKyAgICAgICAgJ3RyYWMucGx1Z2lucyc6IFsKKyAgICAgICAgICAgICdpY3Vjb2RldG9vbHMudGlja2V0bWdyID0gaWN1Y29kZXRvb2xzLnRpY2tldG1ncicsCisgICAgICAgICAgICAnaWN1Y29kZXRvb2xzLnJldmlldyA9IGljdWNvZGV0b29scy5yZXZpZXcnLAorICAgICAgICAgICAgJ2ljdWNvZGV0b29scy50a3RsaXN0ID0gaWN1Y29kZXRvb2xzLnRrdGxpc3QnLAorICAgICAgICAgICAgJ2ljdWNvZGV0b29scy5kY3V0ID0gaWN1Y29kZXRvb2xzLmRjdXQnCisgICAgICAgIF0KKyAgICB9CispCmRpZmYgLS1naXQgYS91bmljb2RlL2MvQ01ha2VMaXN0cy50eHQgYi91bmljb2RlL2MvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZiOTM1MwotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGUvYy9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDI3IEBACisjIENvcHlyaWdodCAoQykgMjAxMCwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcworIyBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgY3JlYXRlZCBvbjogMjAxMGp1bjAzCisjIGNyZWF0ZWQgYnk6IE1hcmt1cyBXLiBTY2hlcmVyCitjbWFrZV9taW5pbXVtX3JlcXVpcmVkKFZFUlNJT04gMi42KQorcHJvamVjdChJQ1VfVU5JX1RPT0xTKQorIyBUaGlzIHJlcXVpcmVzIGFuIGljdWRlZnMudHh0IGZpbGUgd2l0aCBjb250ZW50cyBsaWtlIHRoZSBmb2xsb3dpbmc6CisjIExvY2F0aW9uICgtLXByZWZpeCkgb2Ygd2hlcmUgSUNVIHdhcyBpbnN0YWxsZWQuCisjc2V0KElDVV9JTlNUX0RJUiAvaG9tZS9tc2NoZXJlci9zdm4uaWN1L3RydW5rL2JsZGluc3QpCisjIExvY2F0aW9uIG9mIHRoZSBJQ1Ugc291cmNlIHRyZWUuCisjc2V0KElDVV9TUkNfRElSIC9ob21lL21zY2hlcmVyL3N2bi5pY3UvdHJ1bmsvc3JjKQoraW5jbHVkZShpY3VkZWZzLnR4dCkKK2luY2x1ZGVfZGlyZWN0b3JpZXMoCisgICR7SUNVX0lOU1RfRElSfS9pbmNsdWRlCisgICR7SUNVX1NSQ19ESVJ9L3NvdXJjZS9jb21tb24KKyAgJHtJQ1VfU1JDX0RJUn0vc291cmNlL2kxOG4KKyAgJHtJQ1VfU1JDX0RJUn0vc291cmNlL3Rvb2xzL3Rvb2x1dGlsKQorbGlua19kaXJlY3Rvcmllcygke0lDVV9JTlNUX0RJUn0vbGliKQorYWRkX3N1YmRpcmVjdG9yeShnZW5iaWRpKQorYWRkX3N1YmRpcmVjdG9yeShnZW5jYXNlKQorYWRkX3N1YmRpcmVjdG9yeShnZW5uYW1lcykKK2FkZF9zdWJkaXJlY3RvcnkoZ2Vubm9ybSkKK2FkZF9zdWJkaXJlY3RvcnkoZ2VucG5hbWUpCithZGRfc3ViZGlyZWN0b3J5KGdlbnByb3BzKQorYWRkX3N1YmRpcmVjdG9yeShnZW51Y2EpCithZGRfc3ViZGlyZWN0b3J5KGdlbnV0czQ2KQpkaWZmIC0tZ2l0IGEvdW5pY29kZS9jL2dlbmJpZGkvQ01ha2VMaXN0cy50eHQgYi91bmljb2RlL2MvZ2VuYmlkaS9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmFhZjNhCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZS9jL2dlbmJpZGkvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw5IEBACisjIENvcHlyaWdodCAoQykgMjAxMCwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcworIyBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgY3JlYXRlZCBvbjogMjAxMGp1bjAzCisjIGNyZWF0ZWQgYnk6IE1hcmt1cyBXLiBTY2hlcmVyCisjIGVkaXRlZCBvbjogMjAxMGp1bDIwCisjIGVkaXRlZCBieTogU3R1YXJ0IEcuIEdpbGwKK2FkZF9leGVjdXRhYmxlKGdlbmJpZGkgZ2VuYmlkaS5jIHN0b3JlLmMpCit0YXJnZXRfbGlua19saWJyYXJpZXMoZ2VuYmlkaSBpY3V1YyBpY3V0dSkKZGlmZiAtLWdpdCBhL3VuaWNvZGUvYy9nZW5iaWRpL01ha2VmaWxlLmluIGIvdW5pY29kZS9jL2dlbmJpZGkvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY5M2U3ZAotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGUvYy9nZW5iaWRpL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsOTUgQEAKKyMjIE1ha2VmaWxlLmluIGZvciBJQ1UgLSB0b29scy9nZW5iaWRpCisjIyBDb3B5cmlnaHQgKGMpIDE5OTktMjAwNSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQKKyMjIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMjIFN0ZXZlbiBSLiBMb29taXMKKworIyMgU291cmNlIGRpcmVjdG9yeSBpbmZvcm1hdGlvbgorc3JjZGlyID0gQHNyY2RpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKKwordG9wX2J1aWxkZGlyID0gLi4vLi4KKworaW5jbHVkZSAkKHRvcF9idWlsZGRpcikvaWN1ZGVmcy5taworCisjIyBCdWlsZCBkaXJlY3RvcnkgaW5mb3JtYXRpb24KK3N1YmRpciA9IHRvb2xzL2dlbmJpZGkKKworVEFSR0VUX1NUVUJfTkFNRSA9IGdlbmJpZGkKKworU0VDVElPTiA9IDgKKworI01BTl9GSUxFUyA9ICQoVEFSR0VUX1NUVUJfTkFNRSkuJChTRUNUSU9OKQorCisjIyBFeHRyYSBmaWxlcyB0byByZW1vdmUgZm9yICdtYWtlIGNsZWFuJworQ0xFQU5GSUxFUyA9ICp+ICQoREVQUykgJChNQU5fRklMRVMpCisKKyMjIFRhcmdldCBpbmZvcm1hdGlvbgorVEFSR0VUID0gJChCSU5ESVIpLyQoVEFSR0VUX1NUVUJfTkFNRSkkKEVYRUVYVCkKKworaWZuZXEgKCQodG9wX2J1aWxkZGlyKSwkKHRvcF9zcmNkaXIpKQorQ1BQRkxBR1MgKz0gLUkkKHRvcF9idWlsZGRpcikvY29tbW9uCitlbmRpZgorQ1BQRkxBR1MgKz0gLUkkKHRvcF9zcmNkaXIpL2NvbW1vbiAtSSQoc3JjZGlyKS8uLi90b29sdXRpbAorTElCUyA9ICQoTElCSUNVVE9PTFVUSUwpICQoTElCSUNVSTE4TikgJChMSUJJQ1VVQykgJChERUZBVUxUX0xJQlMpICQoTElCX00pCisKK09CSkVDVFMgPSBnZW5iaWRpLm8gc3RvcmUubworCitERVBTID0gJChPQkpFQ1RTOi5vPS5kKQorCisjIyBMaXN0IG9mIHBob255IHRhcmdldHMKKy5QSE9OWSA6IGFsbCBhbGwtbG9jYWwgaW5zdGFsbCBpbnN0YWxsLWxvY2FsIGNsZWFuIGNsZWFuLWxvY2FsCVwKK2Rpc3RjbGVhbiBkaXN0Y2xlYW4tbG9jYWwgZGlzdCBkaXN0LWxvY2FsIGNoZWNrIGNoZWNrLWxvY2FsIGluc3RhbGwtbWFuCisKKyMjIENsZWFyIHN1ZmZpeCBsaXN0CisuU1VGRklYRVMgOgorCisjIyBMaXN0IG9mIHN0YW5kYXJkIHRhcmdldHMKK2FsbDogYWxsLWxvY2FsCitpbnN0YWxsOiBpbnN0YWxsLWxvY2FsCitjbGVhbjogY2xlYW4tbG9jYWwKK2Rpc3RjbGVhbiA6IGRpc3RjbGVhbi1sb2NhbAorZGlzdDogZGlzdC1sb2NhbAorY2hlY2s6IGFsbCBjaGVjay1sb2NhbAorCithbGwtbG9jYWw6ICQoVEFSR0VUKSAkKE1BTl9GSUxFUykKKworaW5zdGFsbC1sb2NhbDogYWxsLWxvY2FsIGluc3RhbGwtbWFuCisKK2luc3RhbGwtbWFuOiAkKE1BTl9GSUxFUykKKyMJJChNS0lOU1RBTExESVJTKSAkKERFU1RESVIpJChtYW5kaXIpL21hbiQoU0VDVElPTikKKyMJJChJTlNUQUxMX0RBVEEpICQ/ICQoREVTVERJUikkKG1hbmRpcikvbWFuJChTRUNUSU9OKQorCisKK2Rpc3QtbG9jYWw6CisKK2NsZWFuLWxvY2FsOgorCXRlc3QgLXogIiQoQ0xFQU5GSUxFUykiIHx8ICQoUk1WKSAkKENMRUFORklMRVMpCisJJChSTVYpICQoVEFSR0VUKSAkKE9CSkVDVFMpCisKK2Rpc3RjbGVhbi1sb2NhbDogY2xlYW4tbG9jYWwKKwkkKFJNVikgTWFrZWZpbGUKKworY2hlY2stbG9jYWw6IGFsbC1sb2NhbAorCitNYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCWNkICQodG9wX2J1aWxkZGlyKSBcCisJICYmIENPTkZJR19GSUxFUz0kKHN1YmRpcikvJEAgQ09ORklHX0hFQURFUlM9ICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cworCiskKFRBUkdFVCkgOiAkKE9CSkVDVFMpCisJJChMSU5LLmNjKSAkKE9VVE9QVCkkQCAkXiAkKExJQlMpCisJJChQT1NUX0JVSUxEX1NURVApCisKKworJS4kKFNFQ1RJT04pOiAkKHNyY2RpcikvJS4kKFNFQ1RJT04pLmluCisJY2QgJCh0b3BfYnVpbGRkaXIpIFwKKwkgJiYgQ09ORklHX0ZJTEVTPSQoc3ViZGlyKS8kQCBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCisKKworaWZlcSAoLCQoTUFLRUNNREdPQUxTKSkKKy1pbmNsdWRlICQoREVQUykKK2Vsc2UKK2lmbmVxICgkKHBhdHN1YnN0ICVjbGVhbiwsJChNQUtFQ01ER09BTFMpKSwpCistaW5jbHVkZSAkKERFUFMpCitlbmRpZgorZW5kaWYKKwpkaWZmIC0tZ2l0IGEvdW5pY29kZS9jL2dlbmJpZGkvZ2VuYmlkaS5jIGIvdW5pY29kZS9jL2dlbmJpZGkvZ2VuYmlkaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NzNiMWMKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RlL2MvZ2VuYmlkaS9nZW5iaWRpLmMKQEAgLTAsMCArMSw2MzYgQEAKKy8qCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgQ29weXJpZ2h0IChDKSAyMDA0LTIwMDgsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMKKyogICBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICBmaWxlIG5hbWU6ICBnZW5iaWRpLmMKKyogICBlbmNvZGluZzogICBVUy1BU0NJSQorKiAgIHRhYiBzaXplOiAgIDggKG5vdCB1c2VkKQorKiAgIGluZGVudGF0aW9uOjQKKyoKKyogICBjcmVhdGVkIG9uOiAyMDA0ZGVjMzAKKyogICBjcmVhdGVkIGJ5OiBNYXJrdXMgVy4gU2NoZXJlcgorKgorKiAgIFRoaXMgcHJvZ3JhbSByZWFkcyBzZXZlcmFsIG9mIHRoZSBVbmljb2RlIGNoYXJhY3RlciBkYXRhYmFzZSB0ZXh0IGZpbGVzLAorKiAgIHBhcnNlcyB0aGVtLCBhbmQgZXh0cmFjdHMgdGhlIGJpZGkvc2hhcGluZyBwcm9wZXJ0aWVzIGZvciBlYWNoIGNoYXJhY3Rlci4KKyogICBJdCB0aGVuIHdyaXRlcyBhIGJpbmFyeSBmaWxlIGNvbnRhaW5pbmcgdGhlIHByb3BlcnRpZXMKKyogICB0aGF0IGlzIGRlc2lnbmVkIHRvIGJlIHVzZWQgZGlyZWN0bHkgZm9yIHJhbmRvbS1hY2Nlc3MgdG8KKyogICB0aGUgcHJvcGVydGllcyBvZiBlYWNoIFVuaWNvZGUgY2hhcmFjdGVyLgorKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAidW5pY29kZS91dHlwZXMuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3VjaGFyLmgiCisjaW5jbHVkZSAidW5pY29kZS9wdXRpbC5oIgorI2luY2x1ZGUgInVuaWNvZGUvdWNsZWFuLmgiCisjaW5jbHVkZSAiY21lbW9yeS5oIgorI2luY2x1ZGUgImNzdHJpbmcuaCIKKyNpbmNsdWRlICJ1YXJyc29ydC5oIgorI2luY2x1ZGUgInVuZXdkYXRhLmgiCisjaW5jbHVkZSAidW9wdGlvbnMuaCIKKyNpbmNsdWRlICJ1cGFyc2UuaCIKKyNpbmNsdWRlICJwcm9wc3ZlYy5oIgorI2luY2x1ZGUgInViaWRpX3Byb3BzLmgiCisjaW5jbHVkZSAiZ2VuYmlkaS5oIgorCisjZGVmaW5lIExFTkdUSE9GKGFycmF5KSAoc2l6ZW9mKGFycmF5KS9zaXplb2YoKGFycmF5KVswXSkpCisKKy8qIGRhdGEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK1VQcm9wc1ZlY3RvcnMgKnB2OworCitVQm9vbCBiZVZlcmJvc2U9RkFMU0UsIGhhdmVDb3B5cmlnaHQ9VFJVRTsKKworLyogcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIFVCb29sCitpc1Rva2VuKGNvbnN0IGNoYXIgKnRva2VuLCBjb25zdCBjaGFyICpzKTsKKworc3RhdGljIHZvaWQKK3BhcnNlQmlkaU1pcnJvcmluZyhjb25zdCBjaGFyICpmaWxlbmFtZSwgVUVycm9yQ29kZSAqcEVycm9yQ29kZSk7CisKK3N0YXRpYyB2b2lkCitwYXJzZURCKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBVRXJyb3JDb2RlICpwRXJyb3JDb2RlKTsKKworLyogbWlzY2VsbGFuZW91cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogVE9ETzogbW9yZSBjb21tb24gY29kZSwgbW92ZSBmdW5jdGlvbnMgdG8gdXBhcnNlLmh8YyAqLworCitzdGF0aWMgY2hhciAqCit0cmltVGVybWluYXRlRmllbGQoY2hhciAqcywgY2hhciAqbGltaXQpIHsKKyAgICAvKiB0cmltIGxlYWRpbmcgd2hpdGVzcGFjZSAqLworICAgIHM9KGNoYXIgKil1X3NraXBXaGl0ZXNwYWNlKHMpOworCisgICAgLyogdHJpbSB0cmFpbGluZyB3aGl0ZXNwYWNlICovCisgICAgd2hpbGUoczxsaW1pdCAmJiAoKihsaW1pdC0xKT09JyAnIHx8ICoobGltaXQtMSk9PSdcdCcpKSB7CisgICAgICAgIC0tbGltaXQ7CisgICAgfQorICAgICpsaW1pdD0wOworCisgICAgcmV0dXJuIHM7Cit9CisKK3N0YXRpYyB2b2lkCitwYXJzZVR3b0ZpZWxkRmlsZShjaGFyICpmaWxlbmFtZSwgY2hhciAqYmFzZW5hbWUsCisgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp1Y2RGaWxlLCBjb25zdCBjaGFyICpzdWZmaXgsCisgICAgICAgICAgICAgICAgICBVUGFyc2VMaW5lRm4gKmxpbmVGbiwKKyAgICAgICAgICAgICAgICAgIFVFcnJvckNvZGUgKnBFcnJvckNvZGUpIHsKKyAgICBjaGFyICpmaWVsZHNbMl1bMl07CisKKyAgICBpZihwRXJyb3JDb2RlPT1OVUxMIHx8IFVfRkFJTFVSRSgqcEVycm9yQ29kZSkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHdyaXRlVUNERmlsZW5hbWUoYmFzZW5hbWUsIHVjZEZpbGUsIHN1ZmZpeCk7CisKKyAgICB1X3BhcnNlRGVsaW1pdGVkRmlsZShmaWxlbmFtZSwgJzsnLCBmaWVsZHMsIDIsIGxpbmVGbiwgTlVMTCwgcEVycm9yQ29kZSk7CisgICAgaWYoVV9GQUlMVVJFKCpwRXJyb3JDb2RlKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImVycm9yIHBhcnNpbmcgJXMudHh0OiAlc1xuIiwgdWNkRmlsZSwgdV9lcnJvck5hbWUoKnBFcnJvckNvZGUpKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIFVfQ0FMTENPTlYKK2JpZGlDbGFzc0xpbmVGbih2b2lkICpjb250ZXh0LAorICAgICAgICAgICAgICAgIGNoYXIgKmZpZWxkc1tdWzJdLCBpbnQzMl90IGZpZWxkQ291bnQsCisgICAgICAgICAgICAgICAgVUVycm9yQ29kZSAqcEVycm9yQ29kZSk7CisKKy8qIHBhcnNlIGZpbGVzIHdpdGggc2luZ2xlIGVudW1lcmF0ZWQgcHJvcGVydGllcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFRPRE86IG1vcmUgY29tbW9uIGNvZGUsIG1vdmUgZnVuY3Rpb25zIHRvIHVwYXJzZS5ofGMgKi8KKworc3RydWN0IFNpbmdsZUVudW0geworICAgIGNvbnN0IGNoYXIgKnVjZEZpbGUsICpwcm9wTmFtZTsKKyAgICBVUHJvcGVydHkgcHJvcDsKKyAgICBpbnQzMl90IHZlY1dvcmQsIHZlY1NoaWZ0OworICAgIHVpbnQzMl90IHZlY01hc2s7Cit9OwordHlwZWRlZiBzdHJ1Y3QgU2luZ2xlRW51bSBTaW5nbGVFbnVtOworCitzdGF0aWMgdm9pZAorcGFyc2VTaW5nbGVFbnVtRmlsZShjaGFyICpmaWxlbmFtZSwgY2hhciAqYmFzZW5hbWUsIGNvbnN0IGNoYXIgKnN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgU2luZ2xlRW51bSAqc2VuLAorICAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICpwRXJyb3JDb2RlKTsKKworc3RhdGljIGNvbnN0IFNpbmdsZUVudW0ganRTaW5nbGVFbnVtPXsKKyAgICAiRGVyaXZlZEpvaW5pbmdUeXBlIiwgImpvaW5pbmcgdHlwZSIsCisgICAgVUNIQVJfSk9JTklOR19UWVBFLAorICAgIDAsIFVCSURJX0pUX1NISUZULCBVQklESV9KVF9NQVNLCit9OworCitzdGF0aWMgY29uc3QgU2luZ2xlRW51bSBqZ1NpbmdsZUVudW09eworICAgICJEZXJpdmVkSm9pbmluZ0dyb3VwIiwgImpvaW5pbmcgZ3JvdXAiLAorICAgIFVDSEFSX0pPSU5JTkdfR1JPVVAsCisgICAgMSwgMCwgMHhmZiAgICAgICAgICAgICAgICAgIC8qIGNvbHVtbiAxIGJpdHMgNy4uMCAqLworfTsKKworc3RhdGljIHZvaWQgVV9DQUxMQ09OVgorc2luZ2xlRW51bUxpbmVGbih2b2lkICpjb250ZXh0LAorICAgICAgICAgICAgICAgICBjaGFyICpmaWVsZHNbXVsyXSwgaW50MzJfdCBmaWVsZENvdW50LAorICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICpwRXJyb3JDb2RlKSB7CisgICAgY29uc3QgU2luZ2xlRW51bSAqc2VuOworICAgIGNoYXIgKnM7CisgICAgdWludDMyX3Qgc3RhcnQsIGVuZCwgdXY7CisgICAgaW50MzJfdCB2YWx1ZTsKKworICAgIHNlbj0oY29uc3QgU2luZ2xlRW51bSAqKWNvbnRleHQ7CisKKyAgICB1X3BhcnNlQ29kZVBvaW50UmFuZ2UoZmllbGRzWzBdWzBdLCAmc3RhcnQsICZlbmQsIHBFcnJvckNvZGUpOworICAgIGlmKFVfRkFJTFVSRSgqcEVycm9yQ29kZSkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5iaWRpOiBzeW50YXggZXJyb3IgaW4gJXMudHh0IGZpZWxkIDAgYXQgJXNcbiIsIHNlbi0+dWNkRmlsZSwgZmllbGRzWzBdWzBdKTsKKyAgICAgICAgZXhpdCgqcEVycm9yQ29kZSk7CisgICAgfQorCisgICAgLyogcGFyc2UgcHJvcGVydHkgYWxpYXMgKi8KKyAgICBzPXRyaW1UZXJtaW5hdGVGaWVsZChmaWVsZHNbMV1bMF0sIGZpZWxkc1sxXVsxXSk7CisgICAgdmFsdWU9dV9nZXRQcm9wZXJ0eVZhbHVlRW51bShzZW4tPnByb3AsIHMpOworICAgIGlmKHZhbHVlPDApIHsKKyAgICAgICAgaWYoc2VuLT5wcm9wPT1VQ0hBUl9CTE9DSykgeworICAgICAgICAgICAgaWYoaXNUb2tlbigiR3JlZWsiLCBzKSkgeworICAgICAgICAgICAgICAgIHZhbHVlPVVCTE9DS19HUkVFSzsgLyogVW5pY29kZSAzLjIgcmVuYW1lcyB0aGlzIHRvICJHcmVlayBhbmQgQ29wdGljIiAqLworICAgICAgICAgICAgfSBlbHNlIGlmKGlzVG9rZW4oIkNvbWJpbmluZyBNYXJrcyBmb3IgU3ltYm9scyIsIHMpKSB7CisgICAgICAgICAgICAgICAgdmFsdWU9VUJMT0NLX0NPTUJJTklOR19NQVJLU19GT1JfU1lNQk9MUzsgLyogVW5pY29kZSAzLjIgcmVuYW1lcyB0aGlzIHRvICJDb21iaW5pbmcgRGlhY3JpdGljYWwgTWFya3MgZm9yIFN5bWJvbHMiICovCisgICAgICAgICAgICB9IGVsc2UgaWYoaXNUb2tlbigiUHJpdmF0ZSBVc2UiLCBzKSkgeworICAgICAgICAgICAgICAgIHZhbHVlPVVCTE9DS19QUklWQVRFX1VTRTsgLyogVW5pY29kZSAzLjIgcmVuYW1lcyB0aGlzIHRvICJQcml2YXRlIFVzZSBBcmVhIiAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmKHZhbHVlPDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5iaWRpIGVycm9yOiB1bmtub3duICVzIG5hbWUgaW4gJXMudHh0IGZpZWxkIDEgYXQgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBzZW4tPnByb3BOYW1lLCBzZW4tPnVjZEZpbGUsIHMpOworICAgICAgICBleGl0KFVfUEFSU0VfRVJST1IpOworICAgIH0KKworICAgIHV2PSh1aW50MzJfdCkodmFsdWU8PHNlbi0+dmVjU2hpZnQpOworICAgIGlmKCh1diZzZW4tPnZlY01hc2spIT11dikgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbmJpZGkgZXJyb3I6ICVzIHZhbHVlIG92ZXJmbG93ICgweCV4KSBhdCAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbi0+cHJvcE5hbWUsIChpbnQpdXYsIHMpOworICAgICAgICBleGl0KFVfSU5URVJOQUxfUFJPR1JBTV9FUlJPUik7CisgICAgfQorCisgICAgdXB2ZWNfc2V0VmFsdWUocHYsIHN0YXJ0LCBlbmQsIHNlbi0+dmVjV29yZCwgdXYsIHNlbi0+dmVjTWFzaywgcEVycm9yQ29kZSk7CisgICAgaWYoVV9GQUlMVVJFKCpwRXJyb3JDb2RlKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbmJpZGkgZXJyb3I6IHVuYWJsZSB0byBzZXQgJXMgY29kZTogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBzZW4tPnByb3BOYW1lLCB1X2Vycm9yTmFtZSgqcEVycm9yQ29kZSkpOworICAgICAgICBleGl0KCpwRXJyb3JDb2RlKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitwYXJzZVNpbmdsZUVudW1GaWxlKGNoYXIgKmZpbGVuYW1lLCBjaGFyICpiYXNlbmFtZSwgY29uc3QgY2hhciAqc3VmZml4LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBTaW5nbGVFbnVtICpzZW4sCisgICAgICAgICAgICAgICAgICAgIFVFcnJvckNvZGUgKnBFcnJvckNvZGUpIHsKKyAgICBjaGFyICpmaWVsZHNbMl1bMl07CisKKyAgICBpZihwRXJyb3JDb2RlPT1OVUxMIHx8IFVfRkFJTFVSRSgqcEVycm9yQ29kZSkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHdyaXRlVUNERmlsZW5hbWUoYmFzZW5hbWUsIHNlbi0+dWNkRmlsZSwgc3VmZml4KTsKKworICAgIHVfcGFyc2VEZWxpbWl0ZWRGaWxlKGZpbGVuYW1lLCAnOycsIGZpZWxkcywgMiwgc2luZ2xlRW51bUxpbmVGbiwgKHZvaWQgKilzZW4sIHBFcnJvckNvZGUpOworICAgIGlmKFVfRkFJTFVSRSgqcEVycm9yQ29kZSkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJlcnJvciBwYXJzaW5nICVzLnR4dDogJXNcbiIsIHNlbi0+dWNkRmlsZSwgdV9lcnJvck5hbWUoKnBFcnJvckNvZGUpKTsKKyAgICB9Cit9CisKKy8qIHBhcnNlIGZpbGVzIHdpdGggbXVsdGlwbGUgYmluYXJ5IHByb3BlcnRpZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFRPRE86IG1vcmUgY29tbW9uIGNvZGUsIG1vdmUgZnVuY3Rpb25zIHRvIHVwYXJzZS5ofGMgKi8KKworLyogVE9ETzogc2ltaWxhciB0byBnZW5iaWRpL3Byb3BzMi5jIGJ1dCBub3QgdGhlIHNhbWU7IHNhbWUgYXMgaW4gZ2VuY2FzZS9nZW5jYXNlLmMgKi8KKworc3RydWN0IEJpbmFyeSB7CisgICAgY29uc3QgY2hhciAqcHJvcE5hbWU7CisgICAgaW50MzJfdCB2ZWNXb3JkOworICAgIHVpbnQzMl90IHZlY1ZhbHVlLCB2ZWNNYXNrOworfTsKK3R5cGVkZWYgc3RydWN0IEJpbmFyeSBCaW5hcnk7CisKK3N0cnVjdCBCaW5hcmllcyB7CisgICAgY29uc3QgY2hhciAqdWNkRmlsZTsKKyAgICBjb25zdCBCaW5hcnkgKmJpbmFyaWVzOworICAgIGludDMyX3QgYmluYXJpZXNDb3VudDsKK307Cit0eXBlZGVmIHN0cnVjdCBCaW5hcmllcyBCaW5hcmllczsKKworc3RhdGljIGNvbnN0IEJpbmFyeQorcHJvcExpc3ROYW1lc1tdPXsKKyAgICB7ICJCaWRpX0NvbnRyb2wiLCAgICAgICAgICAgICAgICAgICAgICAgMCwgVV9NQVNLKFVCSURJX0JJRElfQ09OVFJPTF9TSElGVCksIFVfTUFTSyhVQklESV9CSURJX0NPTlRST0xfU0hJRlQpIH0sCisgICAgeyAiSm9pbl9Db250cm9sIiwgICAgICAgICAgICAgICAgICAgICAgIDAsIFVfTUFTSyhVQklESV9KT0lOX0NPTlRST0xfU0hJRlQpLCBVX01BU0soVUJJRElfSk9JTl9DT05UUk9MX1NISUZUKSB9Cit9OworCitzdGF0aWMgY29uc3QgQmluYXJpZXMKK3Byb3BMaXN0QmluYXJpZXM9eworICAgICJQcm9wTGlzdCIsIHByb3BMaXN0TmFtZXMsIExFTkdUSE9GKHByb3BMaXN0TmFtZXMpCit9OworCitzdGF0aWMgdm9pZCBVX0NBTExDT05WCitiaW5hcmllc0xpbmVGbih2b2lkICpjb250ZXh0LAorICAgICAgICAgICAgICAgY2hhciAqZmllbGRzW11bMl0sIGludDMyX3QgZmllbGRDb3VudCwKKyAgICAgICAgICAgICAgIFVFcnJvckNvZGUgKnBFcnJvckNvZGUpIHsKKyAgICBjb25zdCBCaW5hcmllcyAqYmluOworICAgIGNoYXIgKnM7CisgICAgdWludDMyX3Qgc3RhcnQsIGVuZDsKKyAgICBpbnQzMl90IGk7CisKKyAgICBiaW49KGNvbnN0IEJpbmFyaWVzICopY29udGV4dDsKKworICAgIHVfcGFyc2VDb2RlUG9pbnRSYW5nZShmaWVsZHNbMF1bMF0sICZzdGFydCwgJmVuZCwgcEVycm9yQ29kZSk7CisgICAgaWYoVV9GQUlMVVJFKCpwRXJyb3JDb2RlKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbmJpZGk6IHN5bnRheCBlcnJvciBpbiAlcy50eHQgZmllbGQgMCBhdCAlc1xuIiwgYmluLT51Y2RGaWxlLCBmaWVsZHNbMF1bMF0pOworICAgICAgICBleGl0KCpwRXJyb3JDb2RlKTsKKyAgICB9CisKKyAgICAvKiBwYXJzZSBiaW5hcnkgcHJvcGVydHkgbmFtZSAqLworICAgIHM9KGNoYXIgKil1X3NraXBXaGl0ZXNwYWNlKGZpZWxkc1sxXVswXSk7CisgICAgZm9yKGk9MDs7ICsraSkgeworICAgICAgICBpZihpPT1iaW4tPmJpbmFyaWVzQ291bnQpIHsKKyAgICAgICAgICAgIC8qIGlnbm9yZSB1bnJlY29nbml6ZWQgcHJvcGVydGllcyAqLworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmKGlzVG9rZW4oYmluLT5iaW5hcmllc1tpXS5wcm9wTmFtZSwgcykpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYoYmluLT5iaW5hcmllc1tpXS52ZWNNYXNrPT0wKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2VuYmlkaSBlcnJvcjogbWFzayB2YWx1ZSAlZD09MCBmb3IgJXMgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAoaW50KWJpbi0+YmluYXJpZXNbaV0udmVjTWFzaywgYmluLT51Y2RGaWxlLCBiaW4tPmJpbmFyaWVzW2ldLnByb3BOYW1lKTsKKyAgICAgICAgZXhpdChVX0lOVEVSTkFMX1BST0dSQU1fRVJST1IpOworICAgIH0KKworICAgIHVwdmVjX3NldFZhbHVlKHB2LCBzdGFydCwgZW5kLCBiaW4tPmJpbmFyaWVzW2ldLnZlY1dvcmQsIGJpbi0+YmluYXJpZXNbaV0udmVjVmFsdWUsIGJpbi0+YmluYXJpZXNbaV0udmVjTWFzaywgcEVycm9yQ29kZSk7CisgICAgaWYoVV9GQUlMVVJFKCpwRXJyb3JDb2RlKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbmJpZGkgZXJyb3I6IHVuYWJsZSB0byBzZXQgJXMsIGNvZGU6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgYmluLT5iaW5hcmllc1tpXS5wcm9wTmFtZSwgdV9lcnJvck5hbWUoKnBFcnJvckNvZGUpKTsKKyAgICAgICAgZXhpdCgqcEVycm9yQ29kZSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorcGFyc2VCaW5hcmllc0ZpbGUoY2hhciAqZmlsZW5hbWUsIGNoYXIgKmJhc2VuYW1lLCBjb25zdCBjaGFyICpzdWZmaXgsCisgICAgICAgICAgICAgICAgICBjb25zdCBCaW5hcmllcyAqYmluLAorICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSAqcEVycm9yQ29kZSkgeworICAgIGNoYXIgKmZpZWxkc1syXVsyXTsKKworICAgIGlmKHBFcnJvckNvZGU9PU5VTEwgfHwgVV9GQUlMVVJFKCpwRXJyb3JDb2RlKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgd3JpdGVVQ0RGaWxlbmFtZShiYXNlbmFtZSwgYmluLT51Y2RGaWxlLCBzdWZmaXgpOworCisgICAgdV9wYXJzZURlbGltaXRlZEZpbGUoZmlsZW5hbWUsICc7JywgZmllbGRzLCAyLCBiaW5hcmllc0xpbmVGbiwgKHZvaWQgKiliaW4sIHBFcnJvckNvZGUpOworICAgIGlmKFVfRkFJTFVSRSgqcEVycm9yQ29kZSkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJlcnJvciBwYXJzaW5nICVzLnR4dDogJXNcbiIsIGJpbi0+dWNkRmlsZSwgdV9lcnJvck5hbWUoKnBFcnJvckNvZGUpKTsKKyAgICB9Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2VudW0geworICAgIEhFTFBfSCwKKyAgICBIRUxQX1FVRVNUSU9OX01BUkssCisgICAgVkVSQk9TRSwKKyAgICBDT1BZUklHSFQsCisgICAgREVTVERJUiwKKyAgICBTT1VSQ0VESVIsCisgICAgVU5JQ09ERV9WRVJTSU9OLAorICAgIElDVURBVEFESVIsCisgICAgQ1NPVVJDRQorfTsKKworLyogS2VlcCB0aGVzZSB2YWx1ZXMgaW4gc3luYyB3aXRoIHRoZSBhYm92ZSBlbnVtcyAqLworc3RhdGljIFVPcHRpb24gb3B0aW9uc1tdPXsKKyAgICBVT1BUSU9OX0hFTFBfSCwKKyAgICBVT1BUSU9OX0hFTFBfUVVFU1RJT05fTUFSSywKKyAgICBVT1BUSU9OX1ZFUkJPU0UsCisgICAgVU9QVElPTl9DT1BZUklHSFQsCisgICAgVU9QVElPTl9ERVNURElSLAorICAgIFVPUFRJT05fU09VUkNFRElSLAorICAgIFVPUFRJT05fREVGKCJ1bmljb2RlIiwgJ3UnLCBVT1BUX1JFUVVJUkVTX0FSRyksCisgICAgVU9QVElPTl9JQ1VEQVRBRElSLAorICAgIFVPUFRJT05fREVGKCJjc291cmNlIiwgJ0MnLCBVT1BUX05PX0FSRykKK307CisKK2V4dGVybiBpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworICAgIGNoYXIgZmlsZW5hbWVbMzAwXTsKKyAgICBjb25zdCBjaGFyICpzcmNEaXI9TlVMTCwgKmRlc3REaXI9TlVMTCwgKnN1ZmZpeD1OVUxMOworICAgIGNoYXIgKmJhc2VuYW1lPU5VTEw7CisgICAgVUVycm9yQ29kZSBlcnJvckNvZGU9VV9aRVJPX0VSUk9SOworCisgICAgVV9NQUlOX0lOSVRfQVJHUyhhcmdjLCBhcmd2KTsKKworICAgIC8qIHByZXNldCB0aGVuIHJlYWQgY29tbWFuZCBsaW5lIG9wdGlvbnMgKi8KKyAgICBvcHRpb25zW0RFU1RESVJdLnZhbHVlPXVfZ2V0RGF0YURpcmVjdG9yeSgpOworICAgIG9wdGlvbnNbU09VUkNFRElSXS52YWx1ZT0iIjsKKyAgICBvcHRpb25zW1VOSUNPREVfVkVSU0lPTl0udmFsdWU9IiI7CisgICAgb3B0aW9uc1tJQ1VEQVRBRElSXS52YWx1ZT11X2dldERhdGFEaXJlY3RvcnkoKTsKKyAgICBhcmdjPXVfcGFyc2VBcmdzKGFyZ2MsIGFyZ3YsIHNpemVvZihvcHRpb25zKS9zaXplb2Yob3B0aW9uc1swXSksIG9wdGlvbnMpOworCisgICAgLyogZXJyb3IgaGFuZGxpbmcsIHByaW50aW5nIHVzYWdlIG1lc3NhZ2UgKi8KKyAgICBpZihhcmdjPDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAiZXJyb3IgaW4gY29tbWFuZCBsaW5lIGFyZ3VtZW50IFwiJXNcIlxuIiwKKyAgICAgICAgICAgIGFyZ3ZbLWFyZ2NdKTsKKyAgICB9CisgICAgaWYoYXJnYzwwIHx8IG9wdGlvbnNbSEVMUF9IXS5kb2VzT2NjdXIgfHwgb3B0aW9uc1tIRUxQX1FVRVNUSU9OX01BUktdLmRvZXNPY2N1cikgeworICAgICAgICAvKgorICAgICAgICAgKiBCcm9rZW4gaW50byBjaHVja3MgYmVjYXVzZSB0aGUgQzg5IHN0YW5kYXJkIHNheXMgdGhlIG1pbmltdW0KKyAgICAgICAgICogcmVxdWlyZWQgc3VwcG9ydGVkIHN0cmluZyBsZW5ndGggaXMgNTA5IGJ5dGVzLgorICAgICAgICAgKi8KKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAiVXNhZ2U6ICVzIFstb3B0aW9uc10gW3N1ZmZpeF1cbiIKKyAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICJyZWFkIHRoZSBVbmljb2RlRGF0YS50eHQgZmlsZSBhbmQgb3RoZXIgVW5pY29kZSBwcm9wZXJ0aWVzIGZpbGVzIGFuZFxuIgorICAgICAgICAgICAgImNyZWF0ZSBhIGJpbmFyeSBmaWxlICIgVUJJRElfREFUQV9OQU1FICIuIiBVQklESV9EQVRBX1RZUEUgIiB3aXRoIHRoZSBiaWRpL3NoYXBpbmcgcHJvcGVydGllc1xuIgorICAgICAgICAgICAgIlxuIiwKKyAgICAgICAgICAgIGFyZ3ZbMF0pOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICJPcHRpb25zOlxuIgorICAgICAgICAgICAgIlx0LWggb3IgLT8gb3IgLS1oZWxwICB0aGlzIHVzYWdlIHRleHRcbiIKKyAgICAgICAgICAgICJcdC12IG9yIC0tdmVyYm9zZSAgICAgdmVyYm9zZSBvdXRwdXRcbiIKKyAgICAgICAgICAgICJcdC1jIG9yIC0tY29weXJpZ2h0ICAgaW5jbHVkZSBhIGNvcHlyaWdodCBub3RpY2VcbiIKKyAgICAgICAgICAgICJcdC11IG9yIC0tdW5pY29kZSAgICAgVW5pY29kZSB2ZXJzaW9uLCBmb2xsb3dlZCBieSB0aGUgdmVyc2lvbiBsaWtlIDMuMC4wXG4iCisgICAgICAgICAgICAiXHQtQyBvciAtLWNzb3VyY2UgICAgIGdlbmVyYXRlIGEgLmMgc291cmNlIGZpbGUgcmF0aGVyIHRoYW4gdGhlIC5pY3UgYmluYXJ5XG4iKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAiXHQtZCBvciAtLWRlc3RkaXIgICAgIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSwgZm9sbG93ZWQgYnkgdGhlIHBhdGhcbiIKKyAgICAgICAgICAgICJcdC1zIG9yIC0tc291cmNlZGlyICAgc291cmNlIGRpcmVjdG9yeSwgZm9sbG93ZWQgYnkgdGhlIHBhdGhcbiIKKyAgICAgICAgICAgICJcdC1pIG9yIC0taWN1ZGF0YWRpciAgZGlyZWN0b3J5IGZvciBsb2NhdGluZyBhbnkgbmVlZGVkIGludGVybWVkaWF0ZSBkYXRhIGZpbGVzLFxuIgorICAgICAgICAgICAgIlx0ICAgICAgICAgICAgICAgICAgICBmb2xsb3dlZCBieSBwYXRoLCBkZWZhdWx0cyB0byAlc1xuIgorICAgICAgICAgICAgIlx0c3VmZml4ICAgICAgICAgICAgICBzdWZmaXggdGhhdCBpcyB0byBiZSBhcHBlbmRlZCB3aXRoIGEgJy0nXG4iCisgICAgICAgICAgICAiXHQgICAgICAgICAgICAgICAgICAgIHRvIHRoZSBzb3VyY2UgZmlsZSBiYXNlbmFtZXMgYmVmb3JlIG9wZW5pbmc7XG4iCisgICAgICAgICAgICAiXHQgICAgICAgICAgICAgICAgICAgICdnZW5iaWRpIG5ldycgd2lsbCByZWFkIFVuaWNvZGVEYXRhLW5ldy50eHQgZXRjLlxuIiwKKyAgICAgICAgICAgIHVfZ2V0RGF0YURpcmVjdG9yeSgpKTsKKyAgICAgICAgcmV0dXJuIGFyZ2M8MCA/IFVfSUxMRUdBTF9BUkdVTUVOVF9FUlJPUiA6IFVfWkVST19FUlJPUjsKKyAgICB9CisKKyAgICAvKiBnZXQgdGhlIG9wdGlvbnMgdmFsdWVzICovCisgICAgYmVWZXJib3NlPW9wdGlvbnNbVkVSQk9TRV0uZG9lc09jY3VyOworICAgIGhhdmVDb3B5cmlnaHQ9b3B0aW9uc1tDT1BZUklHSFRdLmRvZXNPY2N1cjsKKyAgICBzcmNEaXI9b3B0aW9uc1tTT1VSQ0VESVJdLnZhbHVlOworICAgIGRlc3REaXI9b3B0aW9uc1tERVNURElSXS52YWx1ZTsKKworICAgIGlmKGFyZ2M+PTIpIHsKKyAgICAgICAgc3VmZml4PWFyZ3ZbMV07CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3VmZml4PU5VTEw7CisgICAgfQorCisgICAgaWYob3B0aW9uc1tVTklDT0RFX1ZFUlNJT05dLmRvZXNPY2N1cikgeworICAgICAgICBzZXRVbmljb2RlVmVyc2lvbihvcHRpb25zW1VOSUNPREVfVkVSU0lPTl0udmFsdWUpOworICAgIH0KKyAgICAvKiBlbHNlIHVzZSB0aGUgZGVmYXVsdCBkYXRhVmVyc2lvbiBpbiBzdG9yZS5jICovCisKKyAgICBpZiAob3B0aW9uc1tJQ1VEQVRBRElSXS5kb2VzT2NjdXIpIHsKKyAgICAgICAgdV9zZXREYXRhRGlyZWN0b3J5KG9wdGlvbnNbSUNVREFUQURJUl0udmFsdWUpOworICAgIH0KKworICAgIC8qIHByZXBhcmUgdGhlIGZpbGVuYW1lIGJlZ2lubmluZyB3aXRoIHRoZSBzb3VyY2UgZGlyICovCisgICAgdXBydl9zdHJjcHkoZmlsZW5hbWUsIHNyY0Rpcik7CisgICAgYmFzZW5hbWU9ZmlsZW5hbWUrdXBydl9zdHJsZW4oZmlsZW5hbWUpOworICAgIGlmKGJhc2VuYW1lPmZpbGVuYW1lICYmICooYmFzZW5hbWUtMSkhPVVfRklMRV9TRVBfQ0hBUikgeworICAgICAgICAqYmFzZW5hbWUrKz1VX0ZJTEVfU0VQX0NIQVI7CisgICAgfQorCisgICAgLyogaW5pdGlhbGl6ZSAqLworICAgIHB2PXVwdmVjX29wZW4oMiwgJmVycm9yQ29kZSk7CisKKyAgICAvKiBwcm9jZXNzIEJpZGlNaXJyb3JpbmcudHh0ICovCisgICAgd3JpdGVVQ0RGaWxlbmFtZShiYXNlbmFtZSwgIkJpZGlNaXJyb3JpbmciLCBzdWZmaXgpOworICAgIHBhcnNlQmlkaU1pcnJvcmluZyhmaWxlbmFtZSwgJmVycm9yQ29kZSk7CisKKyAgICAvKiBwcm9jZXNzIGFkZGl0aW9uYWwgcHJvcGVydGllcyBmaWxlcyAqLworICAgICpiYXNlbmFtZT0wOworCisgICAgcGFyc2VCaW5hcmllc0ZpbGUoZmlsZW5hbWUsIGJhc2VuYW1lLCBzdWZmaXgsICZwcm9wTGlzdEJpbmFyaWVzLCAmZXJyb3JDb2RlKTsKKworICAgIHBhcnNlU2luZ2xlRW51bUZpbGUoZmlsZW5hbWUsIGJhc2VuYW1lLCBzdWZmaXgsICZqdFNpbmdsZUVudW0sICZlcnJvckNvZGUpOworCisgICAgcGFyc2VTaW5nbGVFbnVtRmlsZShmaWxlbmFtZSwgYmFzZW5hbWUsIHN1ZmZpeCwgJmpnU2luZ2xlRW51bSwgJmVycm9yQ29kZSk7CisKKyAgICAvKiBwcm9jZXNzIFVuaWNvZGVEYXRhLnR4dCAqLworICAgIHdyaXRlVUNERmlsZW5hbWUoYmFzZW5hbWUsICJVbmljb2RlRGF0YSIsIHN1ZmZpeCk7CisgICAgcGFyc2VEQihmaWxlbmFtZSwgJmVycm9yQ29kZSk7CisKKyAgICAvKiBzZXQgcHJvcGVyIGJpZGkgY2xhc3MgZm9yIHVuYXNzaWduZWQgY29kZSBwb2ludHMgKENuKSAqLworICAgIHBhcnNlVHdvRmllbGRGaWxlKGZpbGVuYW1lLCBiYXNlbmFtZSwgIkRlcml2ZWRCaWRpQ2xhc3MiLCBzdWZmaXgsIGJpZGlDbGFzc0xpbmVGbiwgJmVycm9yQ29kZSk7CisKKyAgICAvKiBwcm9jZXNzIHBhcnNlZCBkYXRhICovCisgICAgaWYoVV9TVUNDRVNTKGVycm9yQ29kZSkpIHsKKyAgICAgICAgLyogd3JpdGUgdGhlIHByb3BlcnRpZXMgZGF0YSBmaWxlICovCisgICAgICAgIGdlbmVyYXRlRGF0YShkZXN0RGlyLCBvcHRpb25zW0NTT1VSQ0VdLmRvZXNPY2N1cik7CisgICAgfQorCisgICAgdV9jbGVhbnVwKCk7CisgICAgcmV0dXJuIGVycm9yQ29kZTsKK30KKworVV9DRlVOQyB2b2lkCit3cml0ZVVDREZpbGVuYW1lKGNoYXIgKmJhc2VuYW1lLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqc3VmZml4KSB7CisgICAgaW50MzJfdCBsZW5ndGg9KGludDMyX3QpdXBydl9zdHJsZW4oZmlsZW5hbWUpOworICAgIHVwcnZfc3RyY3B5KGJhc2VuYW1lLCBmaWxlbmFtZSk7CisgICAgaWYoc3VmZml4IT1OVUxMKSB7CisgICAgICAgIGJhc2VuYW1lW2xlbmd0aCsrXT0nLSc7CisgICAgICAgIHVwcnZfc3RyY3B5KGJhc2VuYW1lK2xlbmd0aCwgc3VmZml4KTsKKyAgICAgICAgbGVuZ3RoKz0oaW50MzJfdCl1cHJ2X3N0cmxlbihzdWZmaXgpOworICAgIH0KKyAgICB1cHJ2X3N0cmNweShiYXNlbmFtZStsZW5ndGgsICIudHh0Iik7Cit9CisKKy8qIFRPRE86IG1vdmUgdG8gdG9vbHV0aWwgKi8KK3N0YXRpYyBVQm9vbAoraXNUb2tlbihjb25zdCBjaGFyICp0b2tlbiwgY29uc3QgY2hhciAqcykgeworICAgIGNvbnN0IGNoYXIgKno7CisgICAgaW50MzJfdCBqOworCisgICAgcz11X3NraXBXaGl0ZXNwYWNlKHMpOworICAgIGZvcihqPTA7OyArK2opIHsKKyAgICAgICAgaWYodG9rZW5bal0hPTApIHsKKyAgICAgICAgICAgIGlmKHNbal0hPXRva2VuW2pdKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB6PXVfc2tpcFdoaXRlc3BhY2UocytqKTsKKyAgICAgICAgICAgIGlmKCp6PT0nOycgfHwgKno9PTApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qIHBhcnNlciBmb3IgQmlkaU1pcnJvcmluZy50eHQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIFVfQ0FMTENPTlYKK21pcnJvckxpbmVGbih2b2lkICpjb250ZXh0LAorICAgICAgICAgICAgIGNoYXIgKmZpZWxkc1tdWzJdLCBpbnQzMl90IGZpZWxkQ291bnQsCisgICAgICAgICAgICAgVUVycm9yQ29kZSAqcEVycm9yQ29kZSkgeworICAgIGNoYXIgKmVuZDsKKyAgICBVQ2hhcjMyIHNyYywgbWlycm9yOworCisgICAgc3JjPShVQ2hhcjMyKXVwcnZfc3RydG91bChmaWVsZHNbMF1bMF0sICZlbmQsIDE2KTsKKyAgICBpZihlbmQ8PWZpZWxkc1swXVswXSB8fCBlbmQhPWZpZWxkc1swXVsxXSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbmJpZGk6IHN5bnRheCBlcnJvciBpbiBCaWRpTWlycm9yaW5nLnR4dCBmaWVsZCAwIGF0ICVzXG4iLCBmaWVsZHNbMF1bMF0pOworICAgICAgICAqcEVycm9yQ29kZT1VX1BBUlNFX0VSUk9SOworICAgICAgICBleGl0KFVfUEFSU0VfRVJST1IpOworICAgIH0KKworICAgIG1pcnJvcj0oVUNoYXIzMil1cHJ2X3N0cnRvdWwoZmllbGRzWzFdWzBdLCAmZW5kLCAxNik7CisgICAgaWYoZW5kPD1maWVsZHNbMV1bMF0gfHwgZW5kIT1maWVsZHNbMV1bMV0pIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5iaWRpOiBzeW50YXggZXJyb3IgaW4gQmlkaU1pcnJvcmluZy50eHQgZmllbGQgMSBhdCAlc1xuIiwgZmllbGRzWzFdWzBdKTsKKyAgICAgICAgKnBFcnJvckNvZGU9VV9QQVJTRV9FUlJPUjsKKyAgICAgICAgZXhpdChVX1BBUlNFX0VSUk9SKTsKKyAgICB9CisKKyAgICBhZGRNaXJyb3Ioc3JjLCBtaXJyb3IpOworfQorCitzdGF0aWMgdm9pZAorcGFyc2VCaWRpTWlycm9yaW5nKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBVRXJyb3JDb2RlICpwRXJyb3JDb2RlKSB7CisgICAgY2hhciAqZmllbGRzWzJdWzJdOworCisgICAgaWYocEVycm9yQ29kZT09TlVMTCB8fCBVX0ZBSUxVUkUoKnBFcnJvckNvZGUpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB1X3BhcnNlRGVsaW1pdGVkRmlsZShmaWxlbmFtZSwgJzsnLCBmaWVsZHMsIDIsIG1pcnJvckxpbmVGbiwgTlVMTCwgcEVycm9yQ29kZSk7Cit9CisKKy8qIHBhcnNlciBmb3IgVW5pY29kZURhdGEudHh0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIFVfQ0FMTENPTlYKK3VuaWNvZGVEYXRhTGluZUZuKHZvaWQgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICBjaGFyICpmaWVsZHNbXVsyXSwgaW50MzJfdCBmaWVsZENvdW50LAorICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSAqcEVycm9yQ29kZSkgeworICAgIGNoYXIgKmVuZDsKKyAgICBVRXJyb3JDb2RlIGVycm9yQ29kZTsKKyAgICBVQ2hhcjMyIGM7CisKKyAgICBlcnJvckNvZGU9VV9aRVJPX0VSUk9SOworCisgICAgLyogZ2V0IHRoZSBjaGFyYWN0ZXIgY29kZSwgZmllbGQgMCAqLworICAgIGM9KFVDaGFyMzIpdXBydl9zdHJ0b3VsKGZpZWxkc1swXVswXSwgJmVuZCwgMTYpOworICAgIGlmKGVuZDw9ZmllbGRzWzBdWzBdIHx8IGVuZCE9ZmllbGRzWzBdWzFdKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2VuYmlkaTogc3ludGF4IGVycm9yIGluIGZpZWxkIDAgYXQgJXNcbiIsIGZpZWxkc1swXVswXSk7CisgICAgICAgICpwRXJyb3JDb2RlPVVfUEFSU0VfRVJST1I7CisgICAgICAgIGV4aXQoVV9QQVJTRV9FUlJPUik7CisgICAgfQorCisgICAgLyogZ2V0IE1pcnJvcmVkIGZsYWcsIGZpZWxkIDkgKi8KKyAgICBpZigqZmllbGRzWzldWzBdPT0nWScpIHsKKyAgICAgICAgdXB2ZWNfc2V0VmFsdWUocHYsIGMsIGMsIDAsIFVfTUFTSyhVQklESV9JU19NSVJST1JFRF9TSElGVCksIFVfTUFTSyhVQklESV9JU19NSVJST1JFRF9TSElGVCksICZlcnJvckNvZGUpOworICAgICAgICBpZihVX0ZBSUxVUkUoKnBFcnJvckNvZGUpKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbmJpZGkgZXJyb3I6IHVuYWJsZSB0byBzZXQgJ2lzIG1pcnJvcmVkJyBmb3IgVSslMDRseCwgY29kZTogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpYywgdV9lcnJvck5hbWUoZXJyb3JDb2RlKSk7CisgICAgICAgICAgICBleGl0KGVycm9yQ29kZSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYoZmllbGRzWzldWzFdLWZpZWxkc1s5XVswXSE9MSB8fCAqZmllbGRzWzldWzBdIT0nTicpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5iaWRpOiBzeW50YXggZXJyb3IgaW4gZmllbGQgOSBhdCBVKyUwNGx4XG4iLAorICAgICAgICAgICAgKGxvbmcpYyk7CisgICAgICAgICpwRXJyb3JDb2RlPVVfUEFSU0VfRVJST1I7CisgICAgICAgIGV4aXQoVV9QQVJTRV9FUlJPUik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorcGFyc2VEQihjb25zdCBjaGFyICpmaWxlbmFtZSwgVUVycm9yQ29kZSAqcEVycm9yQ29kZSkgeworICAgIC8qIGRlZmF1bHQgQmlkaSBjbGFzc2VzIGZvciB1bmFzc2lnbmVkIGNvZGUgcG9pbnRzICovCisgICAgc3RhdGljIGNvbnN0IFVDaGFyMzIgZGVmYXVsdEJpZGlbXVszXT17IC8qIHsgc3RhcnQsIGVuZCwgY2xhc3MgfSAqLworICAgICAgICAvKiBSOiBVKzA1OTAuLlUrMDVGRiwgVSswN0MwLi5VKzA4RkYsIFUrRkIxRC4uVStGQjRGLCBVKzEwODAwLi5VKzEwRkZGICovCisgICAgICAgIHsgMHgwNTkwLCAweDA1RkYsIFVfUklHSFRfVE9fTEVGVCB9LAorICAgICAgICB7IDB4MDdDMCwgMHgwOEZGLCBVX1JJR0hUX1RPX0xFRlQgfSwKKyAgICAgICAgeyAweEZCMUQsIDB4RkI0RiwgVV9SSUdIVF9UT19MRUZUIH0sCisgICAgICAgIHsgMHgxMDgwMCwgMHgxMEZGRiwgVV9SSUdIVF9UT19MRUZUIH0sCisKKyAgICAgICAgLyogQUw6IFUrMDYwMC4uVSswN0JGLCBVK0ZCNTAuLlUrRkRDRiwgVStGREYwLi5VK0ZERkYsIFUrRkU3MC4uVStGRUZFICovCisgICAgICAgIHsgMHgwNjAwLCAweDA3QkYsIFVfUklHSFRfVE9fTEVGVF9BUkFCSUMgfSwKKyAgICAgICAgeyAweEZCNTAsIDB4RkRDRiwgVV9SSUdIVF9UT19MRUZUX0FSQUJJQyB9LAorICAgICAgICB7IDB4RkRGMCwgMHhGREZGLCBVX1JJR0hUX1RPX0xFRlRfQVJBQklDIH0sCisgICAgICAgIHsgMHhGRTcwLCAweEZFRkUsIFVfUklHSFRfVE9fTEVGVF9BUkFCSUMgfQorCisgICAgICAgIC8qIEwgb3RoZXJ3aXNlICovCisgICAgfTsKKworICAgIGNoYXIgKmZpZWxkc1sxNV1bMl07CisgICAgVUNoYXIzMiBzdGFydCwgZW5kOworICAgIGludDMyX3QgaTsKKworICAgIGlmKHBFcnJvckNvZGU9PU5VTEwgfHwgVV9GQUlMVVJFKCpwRXJyb3JDb2RlKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyoKKyAgICAgKiBTZXQgZGVmYXVsdCBCaWRpIGNsYXNzZXMgZm9yIHVuYXNzaWduZWQgY29kZSBwb2ludHMuCisgICAgICogU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBCaWRpX0NsYXNzIGluIFVDRC5odG1sIGluIHRoZSBVbmljb2RlIGRhdGEuCisgICAgICogaHR0cDovL3d3dy51bmljb2RlLm9yZy9QdWJsaWMvCisgICAgICoKKyAgICAgKiBTdGFydGluZyB3aXRoIFVuaWNvZGUgNS4wLCBEZXJpdmVkQmlkaUNsYXNzLnR4dCBzaG91bGQgKHJlKXNldAorICAgICAqIHRoZSBCaWRpX0NsYXNzIHZhbHVlcyBmb3IgYWxsIGNvZGUgcG9pbnRzIGluY2x1ZGluZyB1bmFzc2lnbmVkIG9uZXMKKyAgICAgKiBhbmQgaW5jbHVkaW5nIEwgdmFsdWVzIGZvciB0aGVzZS4KKyAgICAgKiBUaGlzIGNvZGUgYmVjb21lcyB1bm5lY2VzYXJ5IGJ1dCBoYXJtbGVzcy4gTGVhdmUgaXQgZm9yIG5vdyBpbiBjYXNlCisgICAgICogc29tZW9uZSB1c2VzIGdlbmJpZGkgb24gcHJlLVVuaWNvZGUgNS4wIGRhdGEuCisgICAgICovCisgICAgZm9yKGk9MDsgaTxMRU5HVEhPRihkZWZhdWx0QmlkaSk7ICsraSkgeworICAgICAgICBzdGFydD1kZWZhdWx0QmlkaVtpXVswXTsKKyAgICAgICAgZW5kPWRlZmF1bHRCaWRpW2ldWzFdOworICAgICAgICB1cHZlY19zZXRWYWx1ZShwdiwgc3RhcnQsIGVuZCwgMCwgKHVpbnQzMl90KWRlZmF1bHRCaWRpW2ldWzJdLCBVQklESV9DTEFTU19NQVNLLCBwRXJyb3JDb2RlKTsKKyAgICAgICAgaWYoVV9GQUlMVVJFKCpwRXJyb3JDb2RlKSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5iaWRpIGVycm9yOiB1bmFibGUgdG8gc2V0IGRlZmF1bHQgYmlkaSBjbGFzcyBmb3IgVSslMDRseC4uVSslMDRseCwgY29kZTogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpc3RhcnQsIChsb25nKWVuZCwgdV9lcnJvck5hbWUoKnBFcnJvckNvZGUpKTsKKyAgICAgICAgICAgIGV4aXQoKnBFcnJvckNvZGUpOworICAgICAgICB9CisgICAgfQorCisgICAgdV9wYXJzZURlbGltaXRlZEZpbGUoZmlsZW5hbWUsICc7JywgZmllbGRzLCAxNSwgdW5pY29kZURhdGFMaW5lRm4sIE5VTEwsIHBFcnJvckNvZGUpOworCisgICAgaWYoVV9GQUlMVVJFKCpwRXJyb3JDb2RlKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorfQorCisvKiBEZXJpdmVkQmlkaUNsYXNzLnR4dCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBVX0NBTExDT05WCitiaWRpQ2xhc3NMaW5lRm4odm9pZCAqY29udGV4dCwKKyAgICAgICAgICAgICAgICBjaGFyICpmaWVsZHNbXVsyXSwgaW50MzJfdCBmaWVsZENvdW50LAorICAgICAgICAgICAgICAgIFVFcnJvckNvZGUgKnBFcnJvckNvZGUpIHsKKyAgICBjaGFyICpzOworICAgIHVpbnQzMl90IHN0YXJ0LCBlbmQsIHZhbHVlOworCisgICAgLyogZ2V0IHRoZSBjb2RlIHBvaW50IHJhbmdlICovCisgICAgdV9wYXJzZUNvZGVQb2ludFJhbmdlKGZpZWxkc1swXVswXSwgJnN0YXJ0LCAmZW5kLCBwRXJyb3JDb2RlKTsKKyAgICBpZihVX0ZBSUxVUkUoKnBFcnJvckNvZGUpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2VuYmlkaTogc3ludGF4IGVycm9yIGluIERlcml2ZWRCaWRpQ2xhc3MudHh0IGZpZWxkIDAgYXQgJXNcbiIsIGZpZWxkc1swXVswXSk7CisgICAgICAgIGV4aXQoKnBFcnJvckNvZGUpOworICAgIH0KKworICAgIC8qIHBhcnNlIGJpZGkgY2xhc3MgKi8KKyAgICBzPXRyaW1UZXJtaW5hdGVGaWVsZChmaWVsZHNbMV1bMF0sIGZpZWxkc1sxXVsxXSk7CisgICAgdmFsdWU9dV9nZXRQcm9wZXJ0eVZhbHVlRW51bShVQ0hBUl9CSURJX0NMQVNTLCBzKTsKKyAgICBpZigoaW50MzJfdCl2YWx1ZTwwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2VuYmlkaSBlcnJvcjogdW5rbm93biBiaWRpIGNsYXNzIGluIERlcml2ZWRCaWRpQ2xhc3MudHh0IGZpZWxkIDEgYXQgJXNcbiIsIHMpOworICAgICAgICBleGl0KFVfUEFSU0VfRVJST1IpOworICAgIH0KKworICAgIHVwdmVjX3NldFZhbHVlKHB2LCBzdGFydCwgZW5kLCAwLCB2YWx1ZSwgVUJJRElfQ0xBU1NfTUFTSywgcEVycm9yQ29kZSk7CisgICAgaWYoVV9GQUlMVVJFKCpwRXJyb3JDb2RlKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbmJpZGkgZXJyb3I6IHVuYWJsZSB0byBzZXQgZGVyaXZlZCBiaWRpIGNsYXNzIGZvciBVKyUwNHguLlUrJTA0eCAtICVzXG4iLAorICAgICAgICAgICAgICAgIChpbnQpc3RhcnQsIChpbnQpZW5kLCB1X2Vycm9yTmFtZSgqcEVycm9yQ29kZSkpOworICAgICAgICBleGl0KCpwRXJyb3JDb2RlKTsKKyAgICB9Cit9CisKKy8qCisgKiBIZXksIEVtYWNzLCBwbGVhc2Ugc2V0IHRoZSBmb2xsb3dpbmc6CisgKgorICogTG9jYWwgVmFyaWFibGVzOgorICogaW5kZW50LXRhYnMtbW9kZTogbmlsCisgKiBFbmQ6CisgKgorICovCmRpZmYgLS1naXQgYS91bmljb2RlL2MvZ2VuYmlkaS9nZW5iaWRpLmggYi91bmljb2RlL2MvZ2VuYmlkaS9nZW5iaWRpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIxYWM0MQotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGUvYy9nZW5iaWRpL2dlbmJpZGkuaApAQCAtMCwwICsxLDQ4IEBACisvKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIENvcHlyaWdodCAoQykgMjAwNC0yMDA4LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzCisqICAgQ29ycG9yYXRpb24gYW5kIG90aGVycy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgZmlsZSBuYW1lOiAgZ2VuYmlkaS5oCisqICAgZW5jb2Rpbmc6ICAgVVMtQVNDSUkKKyogICB0YWIgc2l6ZTogICA4IChub3QgdXNlZCkKKyogICBpbmRlbnRhdGlvbjo0CisqCisqICAgY3JlYXRlZCBvbjogMjAwNGRlYzMwCisqICAgY3JlYXRlZCBieTogTWFya3VzIFcuIFNjaGVyZXIKKyovCisKKyNpZm5kZWYgX19HRU5CSURJX0hfXworI2RlZmluZSBfX0dFTkJJRElfSF9fCisKKyNpbmNsdWRlICJ1bmljb2RlL3V0eXBlcy5oIgorI2luY2x1ZGUgInByb3BzdmVjLmgiCisKK1VfQ0RFQ0xfQkVHSU4KKworLyogZ2VuYmlkaSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogZ2xvYmFsIGZsYWdzICovCitleHRlcm4gVUJvb2wgYmVWZXJib3NlLCBoYXZlQ29weXJpZ2h0OworCisvKiBwcm9wZXJ0aWVzIHZlY3RvcnMgaW4gZ2VuYmlkaS5jICovCitleHRlcm4gVVByb3BzVmVjdG9ycyAqcHY7CisKKy8qIHByb3RvdHlwZXMgKi8KK1VfQ0ZVTkMgdm9pZAord3JpdGVVQ0RGaWxlbmFtZShjaGFyICpiYXNlbmFtZSwgY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKnN1ZmZpeCk7CisKK2V4dGVybiB2b2lkCitzZXRVbmljb2RlVmVyc2lvbihjb25zdCBjaGFyICp2KTsKKworZXh0ZXJuIHZvaWQKK2FkZE1pcnJvcihVQ2hhcjMyIHNyYywgVUNoYXIzMiBtaXJyb3IpOworCitleHRlcm4gdm9pZAorZ2VuZXJhdGVEYXRhKGNvbnN0IGNoYXIgKmRhdGFEaXIsIFVCb29sIGNzb3VyY2UpOworCitVX0NERUNMX0VORAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3VuaWNvZGUvYy9nZW5iaWRpL2dlbmJpZGkudmNwcm9qIGIvdW5pY29kZS9jL2dlbmJpZGkvZ2VuYmlkaS52Y3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY2ODJjYgotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGUvYy9nZW5iaWRpL2dlbmJpZGkudmNwcm9qCkBAIC0wLDAgKzEsNDIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJXaW5kb3dzLTEyNTIiPz4KKzxWaXN1YWxTdHVkaW9Qcm9qZWN0CisJUHJvamVjdFR5cGU9IlZpc3VhbCBDKysiCisJVmVyc2lvbj0iOS4wMCIKKwlOYW1lPSJnZW5iaWRpIgorCVByb2plY3RHVUlEPSJ7REIzMTJBNDktMTJBOS00RTA3LTlFOTYtNDUxREMyRDhGRjYyfSIKKwlUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPSIxMzEwNzIiCisJPgorCTxQbGF0Zm9ybXM+CisJCTxQbGF0Zm9ybQorCQkJTmFtZT0iV2luMzIiCisJCS8+CisJCTxQbGF0Zm9ybQorCQkJTmFtZT0ieDY0IgorCQkvPgorCTwvUGxhdGZvcm1zPgorCTxUb29sRmlsZXM+CisJPC9Ub29sRmlsZXM+CisJPENvbmZpZ3VyYXRpb25zPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCU91dHB1dERpcmVjdG9yeT0iLlx4ODZcUmVsZWFzZSIKKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlx4ODZcUmVsZWFzZSIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIgorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIgorCQkJVXNlT2ZNRkM9IjAiCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiCisJCQlDaGFyYWN0ZXJTZXQ9IjIiCisJCQk+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCQlDb21tYW5kTGluZT0iY29weSAmcXVvdDskKFRhcmdldFBhdGgpJnF1b3Q7IC4uXC4uXC4uXGJpbiYjeDBEOyYjeDBBOyIKKwkJCQlPdXRwdXRzPSIuLlwuLlwuLlxiaW5cJChUYXJnZXRGaWxlTmFtZSkiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCQlUeXBlTGlicmFyeU5hbWU9Ii5ceDg2XFJlbGVhc2UvZ2VuYmlkaS50bGIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXGNvbW1vbjsuLlx0b29sdXRpbCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7TkRFQlVHO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSIKKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIgorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIgorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIgorCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9InRydWUiCisJCQkJVHJlYXRXQ2hhcl90QXNCdWlsdEluVHlwZT0idHJ1ZSIKKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5ceDg2XFJlbGVhc2UvZ2VuYmlkaS5wY2giCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXHg4NlxSZWxlYXNlLyIKKwkJCQlPYmplY3RGaWxlPSIuXHg4NlxSZWxlYXNlLyIKKwkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlx4ODZcUmVsZWFzZS8iCisJCQkJV2FybmluZ0xldmVsPSIzIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlDb21waWxlQXM9IjAiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyIKKwkJCQlDdWx0dXJlPSIxMDMzIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIgorCQkJCU91dHB1dEZpbGU9Ii5ceDg2XFJlbGVhc2UvZ2VuYmlkaS5leGUiCisJCQkJTGlua0luY3JlbWVudGFsPSIxIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXHg4NlxSZWxlYXNlL2dlbmJpZGkucGRiIgorCQkJCVN1YlN5c3RlbT0iMSIKKwkJCQlSYW5kb21pemVkQmFzZUFkZHJlc3M9IjEiCisJCQkJRGF0YUV4ZWN1dGlvblByZXZlbnRpb249IjAiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCU91dHB1dERpcmVjdG9yeT0iLlx4ODZcRGVidWciCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5ceDg2XERlYnVnIgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiCisJCQlVc2VPZk1GQz0iMCIKKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIKKwkJCUNoYXJhY3RlclNldD0iMiIKKwkJCT4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJCUNvbW1hbmRMaW5lPSJjb3B5ICZxdW90OyQoVGFyZ2V0UGF0aCkmcXVvdDsgLi5cLi5cLi5cYmluJiN4MEQ7JiN4MEE7IgorCQkJCU91dHB1dHM9Ii4uXC4uXC4uXGJpblwkKFRhcmdldEZpbGVOYW1lKSIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIgorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iLlx4ODZcRGVidWcvZ2VuYmlkaS50bGIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCU9wdGltaXphdGlvbj0iMCIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlxjb21tb247Li5cdG9vbHV0aWwiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO19ERUJVRztfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUiCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIgorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIzIgorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9InRydWUiCisJCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0idHJ1ZSIKKwkJCQlUcmVhdFdDaGFyX3RBc0J1aWx0SW5UeXBlPSJ0cnVlIgorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlx4ODZcRGVidWcvZ2VuYmlkaS5wY2giCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXHg4NlxEZWJ1Zy8iCisJCQkJT2JqZWN0RmlsZT0iLlx4ODZcRGVidWcvIgorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXHg4NlxEZWJ1Zy8iCisJCQkJQnJvd3NlSW5mb3JtYXRpb249IjEiCisJCQkJV2FybmluZ0xldmVsPSIzIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSI0IgorCQkJCUNvbXBpbGVBcz0iMCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIgorCQkJCUN1bHR1cmU9IjEwMzMiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiCisJCQkJT3V0cHV0RmlsZT0iLlx4ODZcRGVidWcvZ2VuYmlkaS5leGUiCisJCQkJTGlua0luY3JlbWVudGFsPSIyIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlx4ODZcRGVidWcvZ2VuYmlkaS5wZGIiCisJCQkJU3ViU3lzdGVtPSIxIgorCQkJCVJhbmRvbWl6ZWRCYXNlQWRkcmVzcz0iMSIKKwkJCQlEYXRhRXhlY3V0aW9uUHJldmVudGlvbj0iMCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiCisJCQkJVXNlRkFUMzJXb3JrYXJvdW5kPSJ0cnVlIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJSZWxlYXNlfHg2NCIKKwkJCU91dHB1dERpcmVjdG9yeT0iLlx4NjRcUmVsZWFzZSIKKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlx4NjRcUmVsZWFzZSIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIgorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIgorCQkJVXNlT2ZNRkM9IjAiCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiCisJCQlDaGFyYWN0ZXJTZXQ9IjIiCisJCQk+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCQlDb21tYW5kTGluZT0iY29weSAmcXVvdDskKFRhcmdldFBhdGgpJnF1b3Q7IC4uXC4uXC4uXGJpbjY0JiN4MEQ7JiN4MEE7IgorCQkJCU91dHB1dHM9Ii4uXC4uXC4uXGJpbjY0XCQoVGFyZ2V0RmlsZU5hbWUpIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjMiCisJCQkJVHlwZUxpYnJhcnlOYW1lPSIuXHg2NFxSZWxlYXNlL2dlbmJpZGkudGxiIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlxjb21tb247Li5cdG9vbHV0aWwiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjY0O1dJTjMyO05ERUJVRztfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUiCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSIKKwkJCQlSdW50aW1lTGlicmFyeT0iMiIKKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSIKKwkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJ0cnVlIgorCQkJCVRyZWF0V0NoYXJfdEFzQnVpbHRJblR5cGU9InRydWUiCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXHg2NFxSZWxlYXNlL2dlbmJpZGkucGNoIgorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlx4NjRcUmVsZWFzZS8iCisJCQkJT2JqZWN0RmlsZT0iLlx4NjRcUmVsZWFzZS8iCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5ceDY0XFJlbGVhc2UvIgorCQkJCVdhcm5pbmdMZXZlbD0iMyIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJQ29tcGlsZUFzPSIwIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciCisJCQkJQ3VsdHVyZT0iMTAzMyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKKwkJCQlPdXRwdXRGaWxlPSIuXHg2NFxSZWxlYXNlL2dlbmJpZGkuZXhlIgorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlx4NjRcUmVsZWFzZS9nZW5iaWRpLnBkYiIKKwkJCQlTdWJTeXN0ZW09IjEiCisJCQkJVGFyZ2V0TWFjaGluZT0iMTciCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iRGVidWd8eDY0IgorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXHg2NFxEZWJ1ZyIKKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlx4NjRcRGVidWciCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSIKKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyIKKwkJCVVzZU9mTUZDPSIwIgorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIgorCQkJQ2hhcmFjdGVyU2V0PSIyIgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkJQ29tbWFuZExpbmU9ImNvcHkgJnF1b3Q7JChUYXJnZXRQYXRoKSZxdW90OyAuLlwuLlwuLlxiaW42NCYjeDBEOyYjeDBBOyIKKwkJCQlPdXRwdXRzPSIuLlwuLlwuLlxiaW42NFwkKFRhcmdldEZpbGVOYW1lKSIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIgorCQkJCVRhcmdldEVudmlyb25tZW50PSIzIgorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iLlx4NjRcRGVidWcvZ2VuYmlkaS50bGIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCU9wdGltaXphdGlvbj0iMCIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlxjb21tb247Li5cdG9vbHV0aWwiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjY0O1dJTjMyO19ERUJVRztfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUiCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIgorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIzIgorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9InRydWUiCisJCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0idHJ1ZSIKKwkJCQlUcmVhdFdDaGFyX3RBc0J1aWx0SW5UeXBlPSJ0cnVlIgorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlx4NjRcRGVidWcvZ2VuYmlkaS5wY2giCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXHg2NFxEZWJ1Zy8iCisJCQkJT2JqZWN0RmlsZT0iLlx4NjRcRGVidWcvIgorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXHg2NFxEZWJ1Zy8iCisJCQkJQnJvd3NlSW5mb3JtYXRpb249IjEiCisJCQkJV2FybmluZ0xldmVsPSIzIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIgorCQkJCUNvbXBpbGVBcz0iMCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIgorCQkJCUN1bHR1cmU9IjEwMzMiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiCisJCQkJT3V0cHV0RmlsZT0iLlx4NjRcRGVidWcvZ2VuYmlkaS5leGUiCisJCQkJTGlua0luY3JlbWVudGFsPSIyIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlx4NjRcRGVidWcvZ2VuYmlkaS5wZGIiCisJCQkJU3ViU3lzdGVtPSIxIgorCQkJCVRhcmdldE1hY2hpbmU9IjE3IgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCIKKwkJCQlVc2VGQVQzMldvcmthcm91bmQ9InRydWUiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDRnhDb3BUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJPC9Db25maWd1cmF0aW9ucz4KKwk8UmVmZXJlbmNlcz4KKwk8L1JlZmVyZW5jZXM+CisJPEZpbGVzPgorCQk8RmlsdGVyCisJCQlOYW1lPSJTb3VyY2UgRmlsZXMiCisJCQlGaWx0ZXI9ImM7Y3BwO3JjIgorCQkJPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cZ2VuYmlkaS5jIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXHN0b3JlLmMiCisJCQkJPgorCQkJPC9GaWxlPgorCQk8L0ZpbHRlcj4KKwkJPEZpbHRlcgorCQkJTmFtZT0iSGVhZGVyIEZpbGVzIgorCQkJRmlsdGVyPSJoIgorCQkJPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cZ2VuYmlkaS5oIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJPC9GaWx0ZXI+CisJCTxGaWx0ZXIKKwkJCU5hbWU9IlJlc291cmNlIEZpbGVzIgorCQkJRmlsdGVyPSJpY287Y3VyO2JtcDtkbGc7cmMyO3JjdDtiaW47cmdzO2dpZjtqcGc7anBlZztqcGUiCisJCQk+CisJCTwvRmlsdGVyPgorCTwvRmlsZXM+CisJPEdsb2JhbHM+CisJPC9HbG9iYWxzPgorPC9WaXN1YWxTdHVkaW9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdW5pY29kZS9jL2dlbmJpZGkvc3RvcmUuYyBiL3VuaWNvZGUvYy9nZW5iaWRpL3N0b3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIyNTM0YQotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGUvYy9nZW5iaWRpL3N0b3JlLmMKQEAgLTAsMCArMSw0NjMgQEAKKy8qCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMKKyogICBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICBmaWxlIG5hbWU6ICBzdG9yZS5jCisqICAgZW5jb2Rpbmc6ICAgVVMtQVNDSUkKKyogICB0YWIgc2l6ZTogICA4IChub3QgdXNlZCkKKyogICBpbmRlbnRhdGlvbjo0CisqCisqICAgY3JlYXRlZCBvbjogMjAwNGRlYzMwCisqICAgY3JlYXRlZCBieTogTWFya3VzIFcuIFNjaGVyZXIKKyoKKyogICBTdG9yZSBVbmljb2RlIGJpZGkvc2hhcGluZyBwcm9wZXJ0aWVzIGVmZmljaWVudGx5IGZvcgorKiAgIHJhbmRvbSBhY2Nlc3MuCisqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJ1bmljb2RlL3V0eXBlcy5oIgorI2luY2x1ZGUgInVuaWNvZGUvdWNoYXIuaCIKKyNpbmNsdWRlICJjbWVtb3J5LmgiCisjaW5jbHVkZSAiY3N0cmluZy5oIgorI2luY2x1ZGUgInV0cmllMi5oIgorI2luY2x1ZGUgInVhcnJzb3J0LmgiCisjaW5jbHVkZSAidW5pY29kZS91ZGF0YS5oIgorI2luY2x1ZGUgInVuZXdkYXRhLmgiCisjaW5jbHVkZSAicHJvcHN2ZWMuaCIKKyNpbmNsdWRlICJ3cml0ZXNyYy5oIgorI2luY2x1ZGUgInViaWRpX3Byb3BzLmgiCisjaW5jbHVkZSAiZ2VuYmlkaS5oIgorCisjZGVmaW5lIExFTkdUSE9GKGFycmF5KSAoaW50MzJfdCkoc2l6ZW9mKGFycmF5KS9zaXplb2YoKGFycmF5KVswXSkpCisKKy8qIFVuaWNvZGUgYmlkaS9zaGFwaW5nIHByb3BlcnRpZXMgZmlsZSBmb3JtYXQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBmaWxlIGZvcm1hdCBwcmVwYXJlZCBhbmQgd3JpdHRlbiBoZXJlIGNvbnRhaW5zIHNldmVyYWwgZGF0YQorc3RydWN0dXJlcyB0aGF0IHN0b3JlIGluZGV4ZXMgb3IgZGF0YS4KKworQmVmb3JlIHRoZSBkYXRhIGNvbnRlbnRzIGRlc2NyaWJlZCBiZWxvdywgdGhlcmUgYXJlIHRoZSBoZWFkZXJzIHJlcXVpcmVkIGJ5Cit0aGUgdWRhdGEgQVBJIGZvciBsb2FkaW5nIElDVSBkYXRhLiBFc3BlY2lhbGx5LCBhIFVEYXRhSW5mbyBzdHJ1Y3R1cmUKK3ByZWNlZGVzIHRoZSBhY3R1YWwgZGF0YS4gSXQgY29udGFpbnMgcGxhdGZvcm0gcHJvcGVydGllcyB2YWx1ZXMgYW5kIHRoZQorZmlsZSBmb3JtYXQgdmVyc2lvbi4KKworVGhlIGZvbGxvd2luZyBpcyBhIGRlc2NyaXB0aW9uIG9mIGZvcm1hdCB2ZXJzaW9uIDIuMCAuCisKK1RoZSBmaWxlIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlczoKKworICAgIGNvbnN0IGludDMyX3QgaW5kZXhlc1tpMF0gd2l0aCB2YWx1ZXMgaTAsIGkxLCAuLi46CisgICAgKHNlZSBVQklESV9JWF8uLi4gY29uc3RhbnRzIGZvciBuYW1lcyBvZiBpbmRleGVzKQorCisgICAgaTAgaW5kZXhMZW5ndGg7IC0tIGxlbmd0aCBvZiBpbmRleGVzW10gKFVCSURJX0lYX1RPUCkKKyAgICBpMSBkYXRhTGVuZ3RoOyAtLSBsZW5ndGggaW4gYnl0ZXMgb2YgdGhlIHBvc3QtaGVhZGVyIGRhdGEgKGluY2wuIGluZGV4ZXNbXSkKKyAgICBpMiB0cmllU2l6ZTsgLS0gc2l6ZSBpbiBieXRlcyBvZiB0aGUgYmlkaS9zaGFwaW5nIHByb3BlcnRpZXMgdHJpZQorICAgIGkzIG1pcnJvckxlbmd0aDsgLS0gbGVuZ3RoIGluIHVpbnQzMl90IG9mIHRoZSBiaWRpIG1pcnJvcmluZyBhcnJheQorCisgICAgaTQgamdTdGFydDsgLS0gZmlyc3QgY29kZSBwb2ludCB3aXRoIEpvaW5pbmdfR3JvdXAgZGF0YQorICAgIGk1IGpnTGltaXQ7IC0tIGxpbWl0IGNvZGUgcG9pbnQgZm9yIEpvaW5pbmdfR3JvdXAgZGF0YQorCisgICAgaTYuLmkxNCByZXNlcnZlZEluZGV4ZXM7IC0tIHJlc2VydmVkIHZhbHVlczsgMCBmb3Igbm93CisKKyAgICBpMTUgbWF4VmFsdWVzOyAtLSBtYXhpbXVtIGNvZGUgdmFsdWVzIGZvciBlbnVtZXJhdGVkIHByb3BlcnRpZXMKKyAgICAgICAgICAgICAgICAgICAgICBiaXRzIDIzLi4xNiBjb250YWluIHRoZSBtYXggdmFsdWUgZm9yIEpvaW5pbmdfR3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlIHRoZSBiaXRzIGFyZSB1c2VkIGxpa2UgZW51bSBmaWVsZHMgaW4gdGhlIHRyaWUgd29yZAorCisgICAgU2VyaWFsaXplZCB0cmllLCBzZWUgdXRyaWUyLmg7CisKKyAgICBjb25zdCB1aW50MzJfdCBtaXJyb3JzW21pcnJvckxlbmd0aF07CisKKyAgICBjb25zdCB1aW50OF90IGpnQXJyYXlbaTUtaTRdOyAtLSAoaTUtaTQpIGlzIGFsd2F5cyBhIG11bHRpcGxlIG9mIDQKKworVHJpZSBkYXRhIHdvcmQ6CitCaXRzCisxNS4uMTMgIHNpZ25lZCBkZWx0YSB0byBiaWRpIG1pcnJvcmluZyBjb2RlIHBvaW50CisgICAgICAgIChhZGQgZGVsdGEgdG8gaW5wdXQgY29kZSBwb2ludCkKKyAgICAgICAgMCBubyBzdWNoIGNvZGUgcG9pbnQgKHNvdXJjZSBtYXBzIHRvIGl0c2VsZikKKyAgICAgICAgLTMuLi0xLCAxLi4zIGRlbHRhCisgICAgICAgIC00IGxvb2sgaW4gbWlycm9ycyB0YWJsZQorICAgIDEyICBpcyBtaXJyb3JlZAorICAgIDExICBCaWRpX0NvbnRyb2wKKyAgICAxMCAgSm9pbl9Db250cm9sCisgOS4uIDggIHJlc2VydmVkIChzZXQgdG8gMCkKKyA3Li4gNSAgSm9pbmluZ19UeXBlCisgNC4uIDAgIEJpRGkgY2F0ZWdvcnkKKworCitNaXJyb3JzOgorU3RvcmVzIHNvbWUgb2YgdGhlIGJpZGkgbWlycm9yaW5nIGRhdGEsIHdoZXJlIGVhY2ggY29kZSBwb2ludCBtYXBzIHRvCithdCBtb3N0IG9uZSBvdGhlci4KK01vc3QgY29kZSBwb2ludHMgZG8gbm90IGhhdmUgYSBtaXJyb3JpbmcgY29kZSBwb2ludDsgbW9zdCB0aGF0IGRvIGhhdmUgYSBzaWduZWQKK2RlbHRhIHN0b3JlZCBpbiB0aGUgdHJpZSBkYXRhIHZhbHVlLiBPbmx5IHRob3NlIHdoZXJlIHRoZSBkZWx0YSBkb2VzIG5vdCBmaXQKK2ludG8gdGhlIHRyaWUgZGF0YSBhcmUgc3RvcmVkIGluIHRoaXMgdGFibGUuCisKK0xvZ2ljYWxseSwgdGhpcyBpcyBhIHR3by1jb2x1bW4gdGFibGUgd2l0aCBzb3VyY2UgYW5kIG1pcnJvciBjb2RlIHBvaW50cy4KKworUGh5c2ljYWxseSwgdGhlIHRhYmxlIGlzIGNvbXByZXNzZWQgYnkgdGFraW5nIGFkdmFudGFnZSBvZiB0aGUgZmFjdCB0aGF0IGVhY2gKK21pcnJvciBjb2RlIHBvaW50IGlzIGFsc28gYSBzb3VyY2UgY29kZSBwb2ludAorKGVhY2ggb2YgdGhlbSBpcyBhIG1pcnJvciBvZiB0aGUgb3RoZXIpLgorVGhlcmVmb3JlLCBib3RoIGxvZ2ljYWwgY29sdW1ucyBjb250YWluIHRoZSBzYW1lIHNldCBvZiBjb2RlIHBvaW50cywgd2hpY2ggbmVlZHMKK3RvIGJlIHN0b3JlZCBvbmx5IG9uY2UuCisKK1RoZSB0YWJsZSBzdG9yZXMgc291cmNlIGNvZGUgcG9pbnRzLCBhbmQgYWxzbyBmb3IgZWFjaCB0aGUgaW5kZXggb2YgaXRzIG1pcnJvcgorY29kZSBwb2ludCBpbiB0aGUgc2FtZSB0YWJsZSwgaW4gYSBzaW1wbGUgYXJyYXkgb2YgdWludDMyX3QuCitCaXRzCiszMS4uMjEgIGluZGV4IHRvIG1pcnJvciBjb2RlIHBvaW50ICh1bnNpZ25lZCkKKzIwLi4gMCAgc291cmNlIGNvZGUgcG9pbnQKKworVGhlIHRhYmxlIGlzIHNvcnRlZCBieSBzb3VyY2UgY29kZSBwb2ludHMuCisKKworSm9pbmluZ19Hcm91cCBhcnJheToKK1RoZSBKb2luaW5nX0dyb3VwIHZhbHVlcyBkbyBub3QgZml0IGludG8gdGhlIDE2LWJpdCB0cmllLCBidXQgdGhlIGRhdGEgaXMgYWxzbworbGltaXRlZCB0byBhIHNtYWxsIHJhbmdlIG9mIGNvZGUgcG9pbnRzIChBcmFiaWMgYW5kIFN5cmlhYykgYW5kIG5vdAord2VsbCBjb21wcmVzc2libGUuCisKK1RoZSBzdGFydCBhbmQgbGltaXQgY29kZSBwb2ludHMgZm9yIHRoZSByYW5nZSBhcmUgc3RvcmVkIGluIHRoZSBpbmRleGVzW10KK2FycmF5LCBhbmQgdGhlIGpnQXJyYXlbXSBzdG9yZXMgYSBieXRlIGZvciBlYWNoIG9mIHRoZXNlIGNvZGUgcG9pbnRzLAorY29udGFpbmluZyB0aGUgSm9pbmluZ19Hcm91cCB2YWx1ZS4KKworQWxsIGNvZGUgcG9pbnRzIG91dHNpZGUgb2YgdGhpcyByYW5nZSBoYXZlIE5vX0pvaW5pbmdfR3JvdXAgKDApLgorCistLS0gQ2hhbmdlcyBpbiBmb3JtYXQgdmVyc2lvbiAyIC0tLQorCitDaGFuZ2UgZnJvbSBVVHJpZSB0byBVVHJpZTIuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFVEYXRhSW5mbyBjZi4gdWRhdGEuaCAqLworc3RhdGljIFVEYXRhSW5mbyBkYXRhSW5mbz17CisgICAgc2l6ZW9mKFVEYXRhSW5mbyksCisgICAgMCwKKworICAgIFVfSVNfQklHX0VORElBTiwKKyAgICBVX0NIQVJTRVRfRkFNSUxZLAorICAgIFVfU0laRU9GX1VDSEFSLAorICAgIDAsCisKKyAgICAvKiBkYXRhRm9ybWF0PSJCaURpIiAqLworICAgIHsgVUJJRElfRk1UXzAsIFVCSURJX0ZNVF8xLCBVQklESV9GTVRfMiwgVUJJRElfRk1UXzMgfSwKKyAgICB7IDIsIDAsIDAsIDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvcm1hdFZlcnNpb24gKi8KKyAgICB7IDYsIDAsIDAsIDAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRhdGFWZXJzaW9uICovCit9OworCisvKiBleGNlcHRpb25zIHZhbHVlcyAqLworc3RhdGljIHVpbnQzMl90IG1pcnJvcnNbVUJJRElfTUFYX01JUlJPUl9JTkRFWCsxXVsyXTsKK3N0YXRpYyB1aW50MTZfdCBtaXJyb3JUb3A9MDsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworZXh0ZXJuIHZvaWQKK3NldFVuaWNvZGVWZXJzaW9uKGNvbnN0IGNoYXIgKnYpIHsKKyAgICBVVmVyc2lvbkluZm8gdmVyc2lvbjsKKyAgICB1X3ZlcnNpb25Gcm9tU3RyaW5nKHZlcnNpb24sIHYpOworICAgIHVwcnZfbWVtY3B5KGRhdGFJbmZvLmRhdGFWZXJzaW9uLCB2ZXJzaW9uLCA0KTsKK30KKworLyogYmlkaSBtaXJyb3JpbmcgdGFibGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworZXh0ZXJuIHZvaWQKK2FkZE1pcnJvcihVQ2hhcjMyIHNyYywgVUNoYXIzMiBtaXJyb3IpIHsKKyAgICBVRXJyb3JDb2RlIGVycm9yQ29kZTsKKyAgICBpbnQzMl90IGRlbHRhOworCisgICAgZGVsdGE9bWlycm9yLXNyYzsKKyAgICBpZihkZWx0YT09MCkgeworICAgICAgICByZXR1cm47IC8qIG1hcHBpbmcgdG8gc2VsZj1ubyBtYXBwaW5nICovCisgICAgfQorCisgICAgaWYoZGVsdGE8VUJJRElfTUlOX01JUlJPUl9ERUxUQSB8fCBVQklESV9NQVhfTUlSUk9SX0RFTFRBPGRlbHRhKSB7CisgICAgICAgIC8qIGRlbHRhIGRvZXMgbm90IGZpdCBpbnRvIHRoZSB0cmllIHByb3BlcnRpZXMgdmFsdWUsIHN0b3JlIGluIHRoZSBtaXJyb3JzW10gdGFibGUgKi8KKyAgICAgICAgaWYobWlycm9yVG9wPT1MRU5HVEhPRihtaXJyb3JzKSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5iaWRpIGVycm9yOiB0b28gbWFueSBsb25nLWRpc3RhbmNlIG1pcnJvcmluZyBtYXBwaW5nc1xuIik7CisgICAgICAgICAgICBleGl0KFVfQlVGRkVSX09WRVJGTE9XX0VSUk9SKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHBvc3NpYmxlOiBzZWFyY2ggdGhlIHRhYmxlIHNvIGZhciBhbmQgc2VlIGlmIHNyYyBpcyBhbHJlYWR5IGxpc3RlZCAqLworCisgICAgICAgIG1pcnJvcnNbbWlycm9yVG9wXVswXT0odWludDMyX3Qpc3JjOworICAgICAgICBtaXJyb3JzW21pcnJvclRvcF1bMV09KHVpbnQzMl90KW1pcnJvcjsKKyAgICAgICAgKyttaXJyb3JUb3A7CisKKyAgICAgICAgLyogc2V0IGFuIGVzY2FwZSBtYXJrZXIgaW4gc3JjJ3MgcHJvcGVydGllcyAqLworICAgICAgICBkZWx0YT1VQklESV9FU0NfTUlSUk9SX0RFTFRBOworICAgIH0KKworICAgIGVycm9yQ29kZT1VX1pFUk9fRVJST1I7CisgICAgdXB2ZWNfc2V0VmFsdWUoCisgICAgICAgICAgICBwdiwgc3JjLCBzcmMsIDAsCisgICAgICAgICAgICAodWludDMyX3QpZGVsdGE8PFVCSURJX01JUlJPUl9ERUxUQV9TSElGVCwgKHVpbnQzMl90KSgtMSk8PFVCSURJX01JUlJPUl9ERUxUQV9TSElGVCwKKyAgICAgICAgICAgICZlcnJvckNvZGUpOworICAgIGlmKFVfRkFJTFVSRShlcnJvckNvZGUpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2VuYmlkaSBlcnJvcjogdW5hYmxlIHRvIHNldCBtaXJyb3JpbmcgZGVsdGEsIGNvZGU6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgdV9lcnJvck5hbWUoZXJyb3JDb2RlKSk7CisgICAgICAgIGV4aXQoZXJyb3JDb2RlKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQzMl90IFVfQ0FMTENPTlYKK2NvbXBhcmVNaXJyb3IoY29uc3Qgdm9pZCAqY29udGV4dCwgY29uc3Qgdm9pZCAqbGVmdCwgY29uc3Qgdm9pZCAqcmlnaHQpIHsKKyAgICBVQ2hhcjMyIGwsIHI7CisKKyAgICBsPVVCSURJX0dFVF9NSVJST1JfQ09ERV9QT0lOVCgoKGNvbnN0IHVpbnQzMl90ICopbGVmdClbMF0pOworICAgIHI9VUJJRElfR0VUX01JUlJPUl9DT0RFX1BPSU5UKCgoY29uc3QgdWludDMyX3QgKilyaWdodClbMF0pOworICAgIHJldHVybiBsLXI7Cit9CisKK3N0YXRpYyB2b2lkCittYWtlTWlycm9yKCkgeworICAgIHVpbnQzMl90ICpyZWR1Y2VkTWlycm9yOworICAgIFVFcnJvckNvZGUgZXJyb3JDb2RlOworICAgIGludDMyX3QgaSwgaiwgc3RhcnQsIGxpbWl0LCBzdGVwOworICAgIHVpbnQzMl90IGM7CisKKyAgICAvKiBzb3J0IHRoZSBtaXJyb3JpbmcgdGFibGUgYnkgc291cmNlIGNvZGUgcG9pbnRzICovCisgICAgZXJyb3JDb2RlPVVfWkVST19FUlJPUjsKKyAgICB1cHJ2X3NvcnRBcnJheShtaXJyb3JzLCBtaXJyb3JUb3AsIDgsCisgICAgICAgICAgICAgICAgICAgY29tcGFyZU1pcnJvciwgTlVMTCwgRkFMU0UsICZlcnJvckNvZGUpOworCisgICAgLyoKKyAgICAgKiByZWR1Y2UgdGhlIDItY29sdW1uIHRhYmxlIHRvIGEgc2luZ2xlIGNvbHVtbgorICAgICAqIGJ5IHB1dHRpbmcgdGhlIGluZGV4IHRvIHRoZSBtaXJyb3IgZW50cnkgaW50byB0aGUgc291cmNlIGVudHJ5CisgICAgICoKKyAgICAgKiBmaXJzdDoKKyAgICAgKiBmaW5kIGVhY2ggbWlycm9yIGNvZGUgcG9pbnQgaW4gdGhlIHNvdXJjZSBjb2x1bW4gYW5kIHNldCBlYWNoIG90aGVyJ3MgaW5kZXhlcworICAgICAqCisgICAgICogc2Vjb25kOgorICAgICAqIHJlZHVjZSB0aGUgdGFibGUsIGNvbWJpbmUgdGhlIHNvdXJjZSBjb2RlIHBvaW50cyB3aXRoIHRoZWlyIGluZGV4ZXMKKyAgICAgKiBhbmQgc3RvcmUgYXMgYSBzaW1wbGUgYXJyYXkgb2YgdWludDMyX3QKKyAgICAgKi8KKyAgICBmb3IoaT0wOyBpPG1pcnJvclRvcDsgKytpKSB7CisgICAgICAgIGM9bWlycm9yc1tpXVsxXTsgLyogbWlycm9yIGNvZGUgcG9pbnQgKi8KKyAgICAgICAgaWYoYz4weDFmZmZmZikgeworICAgICAgICAgICAgY29udGludWU7IC8qIHRoaXMgZW50cnkgYWxyZWFkeSBoYXMgYW4gaW5kZXggKi8KKyAgICAgICAgfQorCisgICAgICAgIC8qIHNlYXJjaCBmb3IgdGhlIG1pcnJvciBjb2RlIHBvaW50IGluIHRoZSBzb3VyY2UgY29sdW1uICovCisgICAgICAgIGlmKGM8bWlycm9yc1tpXVswXSkgeworICAgICAgICAgICAgLyogc2VhcmNoIGJlZm9yZSBpICovCisgICAgICAgICAgICBzdGFydD1pLTE7CisgICAgICAgICAgICBsaW1pdD0tMTsKKyAgICAgICAgICAgIHN0ZXA9LTE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGFydD1pKzE7CisgICAgICAgICAgICBsaW1pdD1taXJyb3JUb3A7CisgICAgICAgICAgICBzdGVwPTE7CisgICAgICAgIH0KKworICAgICAgICBmb3Ioaj1zdGFydDs7IGorPXN0ZXApIHsKKyAgICAgICAgICAgIGlmKGo9PWxpbWl0KSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAiZ2VuYmlkaSBlcnJvcjogYmlkaSBtaXJyb3IgZG9lcyBub3Qgcm91bmR0cmlwIC0gJTA0bHgtPiUwNGx4LT4/XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpbWlycm9yc1tpXVswXSwgKGxvbmcpbWlycm9yc1tpXVsxXSk7CisgICAgICAgICAgICAgICAgZXJyb3JDb2RlPVVfSUxMRUdBTF9BUkdVTUVOVF9FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKGM9PW1pcnJvcnNbal1bMF0pIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIGZvdW5kIHRoZSBtaXJyb3IgY29kZSBwb2ludCBjIGluIHRoZSBzb3VyY2UgY29sdW1uLAorICAgICAgICAgICAgICAgICAqIHNldCBib3RoIGVudHJpZXMnIGluZGV4ZXMgdG8gZWFjaCBvdGhlcgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmKFVCSURJX0dFVF9NSVJST1JfQ09ERV9QT0lOVChtaXJyb3JzW2ldWzBdKSE9VUJJRElfR0VUX01JUlJPUl9DT0RFX1BPSU5UKG1pcnJvcnNbal1bMV0pKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIHJvdW5kdHJpcCBjaGVjayBmYWlscyAqLworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2VuYmlkaSBlcnJvcjogYmlkaSBtaXJyb3JzIGRvIG5vdCByb3VuZHRyaXAgLSAlMDRseC0+JTA0bHgtPiUwNGx4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nKW1pcnJvcnNbaV1bMF0sIChsb25nKW1pcnJvcnNbaV1bMV0sIChsb25nKW1pcnJvcnNbal1bMV0pOworICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGU9VV9JTExFR0FMX0FSR1VNRU5UX0VSUk9SOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1pcnJvcnNbaV1bMV18PSh1aW50MzJfdClqPDxVQklESV9NSVJST1JfSU5ERVhfU0hJRlQ7CisgICAgICAgICAgICAgICAgICAgIG1pcnJvcnNbal1bMV18PSh1aW50MzJfdClpPDxVQklESV9NSVJST1JfSU5ERVhfU0hJRlQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogbm93IHRoZSBzZWNvbmQgc3RlcCwgdGhlIGFjdHVhbCByZWR1Y3Rpb24gb2YgdGhlIHRhYmxlICovCisgICAgcmVkdWNlZE1pcnJvcj1taXJyb3JzWzBdOworICAgIGZvcihpPTA7IGk8bWlycm9yVG9wOyArK2kpIHsKKyAgICAgICAgcmVkdWNlZE1pcnJvcltpXT1taXJyb3JzW2ldWzBdfChtaXJyb3JzW2ldWzFdJn4weDFmZmZmZik7CisgICAgfQorCisgICAgaWYoVV9GQUlMVVJFKGVycm9yQ29kZSkpIHsKKyAgICAgICAgZXhpdChlcnJvckNvZGUpOworICAgIH0KK30KKworLyogZ2VuZXJhdGUgb3V0cHV0IGRhdGEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworZXh0ZXJuIHZvaWQKK2dlbmVyYXRlRGF0YShjb25zdCBjaGFyICpkYXRhRGlyLCBVQm9vbCBjc291cmNlKSB7CisgICAgc3RhdGljIGludDMyX3QgaW5kZXhlc1tVQklESV9JWF9UT1BdPXsKKyAgICAgICAgVUJJRElfSVhfVE9QCisgICAgfTsKKyAgICBzdGF0aWMgdWludDhfdCB0cmllQmxvY2tbNDAwMDBdOworICAgIHN0YXRpYyB1aW50OF90IGpnQXJyYXlbMHgzMDBdOyAvKiBhdCBtb3N0IGZvciBVKzA2MDAuLlUrMDhGRiAqLworCisgICAgY29uc3QgdWludDMyX3QgKnJvdzsKKyAgICBVQ2hhcjMyIHN0YXJ0LCBlbmQsIHByZXYsIGpnU3RhcnQ7CisgICAgaW50MzJfdCBpOworCisgICAgVU5ld0RhdGFNZW1vcnkgKnBEYXRhOworICAgIFVUcmllMiAqcFRyaWU7CisgICAgVUVycm9yQ29kZSBlcnJvckNvZGU9VV9aRVJPX0VSUk9SOworICAgIGludDMyX3QgdHJpZVNpemU7CisgICAgbG9uZyBkYXRhTGVuZ3RoOworCisgICAgbWFrZU1pcnJvcigpOworCisgICAgcFRyaWU9dXRyaWUyX29wZW4oMCwgMCwgJmVycm9yQ29kZSk7CisgICAgaWYoVV9GQUlMVVJFKGVycm9yQ29kZSkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5iaWRpIGVycm9yOiB1dHJpZTJfb3BlbigpIGZhaWxlZCAtICVzXG4iLCB1X2Vycm9yTmFtZShlcnJvckNvZGUpKTsKKyAgICAgICAgZXhpdChlcnJvckNvZGUpOworICAgIH0KKworICAgIHByZXY9amdTdGFydD0wOworICAgIGZvcihpPTA7IChyb3c9dXB2ZWNfZ2V0Um93KHB2LCBpLCAmc3RhcnQsICZlbmQpKSE9TlVMTCAmJiBzdGFydDxVUFZFQ19GSVJTVF9TUEVDSUFMX0NQOyArK2kpIHsKKyAgICAgICAgLyogc3RvcmUgbW9zdCB2YWx1ZXMgZnJvbSB2ZWN0b3IgY29sdW1uIDAgaW4gdGhlIHRyaWUgKi8KKyAgICAgICAgdXRyaWUyX3NldFJhbmdlMzIocFRyaWUsIHN0YXJ0LCBlbmQsICpyb3csIFRSVUUsICZlcnJvckNvZGUpOworICAgICAgICBpZihVX0ZBSUxVUkUoZXJyb3JDb2RlKSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5iaWRpIGVycm9yOiB1dHJpZTJfc2V0UmFuZ2UzMigpIGZhaWxlZCAtICVzXG4iLCB1X2Vycm9yTmFtZShlcnJvckNvZGUpKTsKKyAgICAgICAgICAgIGV4aXQoZXJyb3JDb2RlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHN0b3JlIEpvaW5pbmdfR3JvdXAgdmFsdWVzIGZyb20gdmVjdG9yIGNvbHVtbiAxIGluIGEgc2ltcGxlIGJ5dGUgYXJyYXkgKi8KKyAgICAgICAgaWYocm93WzFdIT0wKSB7CisgICAgICAgICAgICBpZihzdGFydDwweDYwMCB8fCAweDhmZjxlbmQpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbmJpZGkgZXJyb3I6IEpvaW5pbmdfR3JvdXAgZm9yIG91dC1vZi1yYW5nZSBjb2RlIHBvaW50cyBVKyUwNGx4Li5VKyUwNGx4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpc3RhcnQsIChsb25nKWVuZCk7CisgICAgICAgICAgICAgICAgZXhpdChVX0lMTEVHQUxfQVJHVU1FTlRfRVJST1IpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZihwcmV2PT0wKSB7CisgICAgICAgICAgICAgICAgLyogZmlyc3QgY29kZSBwb2ludCB3aXRoIGFueSB2YWx1ZSAqLworICAgICAgICAgICAgICAgIHByZXY9amdTdGFydD1zdGFydDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogYWRkIE5vX0pvaW5pbmdfR3JvdXAgZm9yIGNvZGUgcG9pbnRzIGJldHdlZW4gcHJldiBhbmQgc3RhcnQgKi8KKyAgICAgICAgICAgICAgICB3aGlsZShwcmV2PHN0YXJ0KSB7CisgICAgICAgICAgICAgICAgICAgIGpnQXJyYXlbcHJldisrIC1qZ1N0YXJ0XT0wOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogc2V0IEpvaW5pbmdfR3JvdXAgdmFsdWUgZm9yIHN0YXJ0Li5lbmQgKi8KKyAgICAgICAgICAgIHdoaWxlKHByZXY8PWVuZCkgeworICAgICAgICAgICAgICAgIGpnQXJyYXlbcHJldisrIC1qZ1N0YXJ0XT0odWludDhfdClyb3dbMV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBmaW5pc2ggamdBcnJheSwgcGFkIHRvIG11bHRpcGxlIG9mIDQgKi8KKyAgICB3aGlsZSgocHJldi1qZ1N0YXJ0KSYzKSB7CisgICAgICAgIGpnQXJyYXlbcHJldisrIC1qZ1N0YXJ0XT0wOworICAgIH0KKyAgICBpbmRleGVzW1VCSURJX0lYX0pHX1NUQVJUXT1qZ1N0YXJ0OworICAgIGluZGV4ZXNbVUJJRElfSVhfSkdfTElNSVRdPXByZXY7CisKKyAgICB1dHJpZTJfZnJlZXplKHBUcmllLCBVVFJJRTJfMTZfVkFMVUVfQklUUywgJmVycm9yQ29kZSk7CisgICAgdHJpZVNpemU9dXRyaWUyX3NlcmlhbGl6ZShwVHJpZSwgdHJpZUJsb2NrLCBzaXplb2YodHJpZUJsb2NrKSwgJmVycm9yQ29kZSk7CisgICAgaWYoVV9GQUlMVVJFKGVycm9yQ29kZSkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5iaWRpIGVycm9yOiB1dHJpZTJfZnJlZXplKCkrdXRyaWUyX3NlcmlhbGl6ZSgpIGZhaWxlZDogJXMgKGxlbmd0aCAlbGQpXG4iLAorICAgICAgICAgICAgICAgIHVfZXJyb3JOYW1lKGVycm9yQ29kZSksIChsb25nKXRyaWVTaXplKTsKKyAgICAgICAgZXhpdChlcnJvckNvZGUpOworICAgIH0KKworICAgIGluZGV4ZXNbVUJJRElfSVhfVFJJRV9TSVpFXT10cmllU2l6ZTsKKyAgICBpbmRleGVzW1VCSURJX0lYX01JUlJPUl9MRU5HVEhdPW1pcnJvclRvcDsKKyAgICBpbmRleGVzW1VCSURJX0lYX0xFTkdUSF09CisgICAgICAgIChpbnQzMl90KXNpemVvZihpbmRleGVzKSsKKyAgICAgICAgdHJpZVNpemUrCisgICAgICAgIDQqbWlycm9yVG9wKworICAgICAgICAocHJldi1qZ1N0YXJ0KTsKKworICAgIGlmKGJlVmVyYm9zZSkgeworICAgICAgICBwcmludGYoInRyaWUgc2l6ZSBpbiBieXRlczogICAgICAgICAgICAgICAgICAgICU1ZFxuIiwgKGludCl0cmllU2l6ZSk7CisgICAgICAgIHByaW50Zigic2l6ZSBpbiBieXRlcyBvZiBtaXJyb3JpbmcgdGFibGU6ICAgICAgJTVkXG4iLCAoaW50KSg0Km1pcnJvclRvcCkpOworICAgICAgICBwcmludGYoImxlbmd0aCBvZiBKb2luaW5nX0dyb3VwIGFycmF5OiAgICAgICAgICU1ZCAoVSslMDR4Li5VKyUwNHgpXG4iLCAoaW50KShwcmV2LWpnU3RhcnQpLCAoaW50KWpnU3RhcnQsIChpbnQpKHByZXYtMSkpOworICAgICAgICBwcmludGYoImRhdGEgc2l6ZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICU1ZFxuIiwgKGludClpbmRleGVzW1VCSURJX0lYX0xFTkdUSF0pOworICAgIH0KKworICAgIGluZGV4ZXNbVUJJRElfTUFYX1ZBTFVFU19JTkRFWF09CisgICAgICAgICgoaW50MzJfdClVX0NIQVJfRElSRUNUSU9OX0NPVU5ULTEpfAorICAgICAgICAoKChpbnQzMl90KVVfSlRfQ09VTlQtMSk8PFVCSURJX0pUX1NISUZUKXwKKyAgICAgICAgKCgoaW50MzJfdClVX0pHX0NPVU5ULTEpPDxVQklESV9NQVhfSkdfU0hJRlQpOworCisgICAgaWYoY3NvdXJjZSkgeworICAgICAgICAvKiB3cml0ZSAuYyBmaWxlIGZvciBoYXJkY29kZWQgZGF0YSAqLworICAgICAgICBGSUxFICpmPXVzcmNfY3JlYXRlKGRhdGFEaXIsICJ1YmlkaV9wcm9wc19kYXRhLmMiKTsKKyAgICAgICAgaWYoZiE9TlVMTCkgeworICAgICAgICAgICAgdXNyY193cml0ZUFycmF5KGYsCisgICAgICAgICAgICAgICAgInN0YXRpYyBjb25zdCBVVmVyc2lvbkluZm8gdWJpZGlfcHJvcHNfZGF0YVZlcnNpb249eyIsCisgICAgICAgICAgICAgICAgZGF0YUluZm8uZGF0YVZlcnNpb24sIDgsIDQsCisgICAgICAgICAgICAgICAgIn07XG5cbiIpOworICAgICAgICAgICAgdXNyY193cml0ZUFycmF5KGYsCisgICAgICAgICAgICAgICAgInN0YXRpYyBjb25zdCBpbnQzMl90IHViaWRpX3Byb3BzX2luZGV4ZXNbVUJJRElfSVhfVE9QXT17IiwKKyAgICAgICAgICAgICAgICBpbmRleGVzLCAzMiwgVUJJRElfSVhfVE9QLAorICAgICAgICAgICAgICAgICJ9O1xuXG4iKTsKKyAgICAgICAgICAgIHVzcmNfd3JpdGVVVHJpZTJBcnJheXMoZiwKKyAgICAgICAgICAgICAgICAic3RhdGljIGNvbnN0IHVpbnQxNl90IHViaWRpX3Byb3BzX3RyaWVJbmRleFslbGRdPXtcbiIsIE5VTEwsCisgICAgICAgICAgICAgICAgcFRyaWUsCisgICAgICAgICAgICAgICAgIlxufTtcblxuIik7CisgICAgICAgICAgICB1c3JjX3dyaXRlQXJyYXkoZiwKKyAgICAgICAgICAgICAgICAic3RhdGljIGNvbnN0IHVpbnQzMl90IHViaWRpX3Byb3BzX21pcnJvcnNbJWxkXT17XG4iLAorICAgICAgICAgICAgICAgIG1pcnJvcnMsIDMyLCBtaXJyb3JUb3AsCisgICAgICAgICAgICAgICAgIlxufTtcblxuIik7CisgICAgICAgICAgICB1c3JjX3dyaXRlQXJyYXkoZiwKKyAgICAgICAgICAgICAgICAic3RhdGljIGNvbnN0IHVpbnQ4X3QgdWJpZGlfcHJvcHNfamdBcnJheVslbGRdPXtcbiIsCisgICAgICAgICAgICAgICAgamdBcnJheSwgOCwgcHJldi1qZ1N0YXJ0LAorICAgICAgICAgICAgICAgICJcbn07XG5cbiIpOworICAgICAgICAgICAgZnB1dHMoCisgICAgICAgICAgICAgICAgInN0YXRpYyBjb25zdCBVQmlEaVByb3BzIHViaWRpX3Byb3BzX3NpbmdsZXRvbj17XG4iCisgICAgICAgICAgICAgICAgIiAgTlVMTCxcbiIKKyAgICAgICAgICAgICAgICAiICB1YmlkaV9wcm9wc19pbmRleGVzLFxuIgorICAgICAgICAgICAgICAgICIgIHViaWRpX3Byb3BzX21pcnJvcnMsXG4iCisgICAgICAgICAgICAgICAgIiAgdWJpZGlfcHJvcHNfamdBcnJheSxcbiIsCisgICAgICAgICAgICAgICAgZik7CisgICAgICAgICAgICB1c3JjX3dyaXRlVVRyaWUyU3RydWN0KGYsCisgICAgICAgICAgICAgICAgIiAge1xuIiwKKyAgICAgICAgICAgICAgICBwVHJpZSwgInViaWRpX3Byb3BzX3RyaWVJbmRleCIsIE5VTEwsCisgICAgICAgICAgICAgICAgIiAgfSxcbiIpOworICAgICAgICAgICAgdXNyY193cml0ZUFycmF5KGYsICIgIHsgIiwgZGF0YUluZm8uZm9ybWF0VmVyc2lvbiwgOCwgNCwgIiB9XG4iKTsKKyAgICAgICAgICAgIGZwdXRzKCJ9O1xuIiwgZik7CisgICAgICAgICAgICBmY2xvc2UoZik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvKiB3cml0ZSB0aGUgZGF0YSAqLworICAgICAgICBwRGF0YT11ZGF0YV9jcmVhdGUoZGF0YURpciwgVUJJRElfREFUQV9UWVBFLCBVQklESV9EQVRBX05BTUUsICZkYXRhSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVDb3B5cmlnaHQgPyBVX0NPUFlSSUdIVF9TVFJJTkcgOiBOVUxMLCAmZXJyb3JDb2RlKTsKKyAgICAgICAgaWYoVV9GQUlMVVJFKGVycm9yQ29kZSkpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2VuYmlkaTogdW5hYmxlIHRvIGNyZWF0ZSBkYXRhIG1lbW9yeSwgJXNcbiIsIHVfZXJyb3JOYW1lKGVycm9yQ29kZSkpOworICAgICAgICAgICAgZXhpdChlcnJvckNvZGUpOworICAgICAgICB9CisKKyAgICAgICAgdWRhdGFfd3JpdGVCbG9jayhwRGF0YSwgaW5kZXhlcywgc2l6ZW9mKGluZGV4ZXMpKTsKKyAgICAgICAgdWRhdGFfd3JpdGVCbG9jayhwRGF0YSwgdHJpZUJsb2NrLCB0cmllU2l6ZSk7CisgICAgICAgIHVkYXRhX3dyaXRlQmxvY2socERhdGEsIG1pcnJvcnMsIDQqbWlycm9yVG9wKTsKKyAgICAgICAgdWRhdGFfd3JpdGVCbG9jayhwRGF0YSwgamdBcnJheSwgcHJldi1qZ1N0YXJ0KTsKKworICAgICAgICAvKiBmaW5pc2ggdXAgKi8KKyAgICAgICAgZGF0YUxlbmd0aD11ZGF0YV9maW5pc2gocERhdGEsICZlcnJvckNvZGUpOworICAgICAgICBpZihVX0ZBSUxVUkUoZXJyb3JDb2RlKSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5iaWRpOiBlcnJvciAlZCB3cml0aW5nIHRoZSBvdXRwdXQgZmlsZVxuIiwgZXJyb3JDb2RlKTsKKyAgICAgICAgICAgIGV4aXQoZXJyb3JDb2RlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKGRhdGFMZW5ndGghPWluZGV4ZXNbVUJJRElfSVhfTEVOR1RIXSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5iaWRpOiBkYXRhIGxlbmd0aCAlbGQgIT0gY2FsY3VsYXRlZCBzaXplICVkXG4iLAorICAgICAgICAgICAgICAgIGRhdGFMZW5ndGgsIChpbnQpaW5kZXhlc1tVQklESV9JWF9MRU5HVEhdKTsKKyAgICAgICAgICAgIGV4aXQoVV9JTlRFUk5BTF9QUk9HUkFNX0VSUk9SKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHV0cmllMl9jbG9zZShwVHJpZSk7CisgICAgdXB2ZWNfY2xvc2UocHYpOworfQorCisvKgorICogSGV5LCBFbWFjcywgcGxlYXNlIHNldCB0aGUgZm9sbG93aW5nOgorICoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIGluZGVudC10YWJzLW1vZGU6IG5pbAorICogRW5kOgorICoKKyAqLwpkaWZmIC0tZ2l0IGEvdW5pY29kZS9jL2dlbmNhc2UvQ01ha2VMaXN0cy50eHQgYi91bmljb2RlL2MvZ2VuY2FzZS9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjU0ZjY1Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZS9jL2dlbmNhc2UvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw5IEBACisjIENvcHlyaWdodCAoQykgMjAxMCwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcworIyBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgY3JlYXRlZCBvbjogMjAxMGp1bjAzCisjIGNyZWF0ZWQgYnk6IE1hcmt1cyBXLiBTY2hlcmVyCisjIGVkaXRlZCBvbjogMjAxMGp1bDIwCisjIGVkaXRlZCBieTogU3R1YXJ0IEcuIEdpbGwKK2FkZF9leGVjdXRhYmxlKGdlbmNhc2UgZ2VuY2FzZS5jIHN0b3JlLmMpCit0YXJnZXRfbGlua19saWJyYXJpZXMoZ2VuY2FzZSBpY3V1YyBpY3V0dSkKZGlmZiAtLWdpdCBhL3VuaWNvZGUvYy9nZW5jYXNlL01ha2VmaWxlLmluIGIvdW5pY29kZS9jL2dlbmNhc2UvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FiMWQ2MQotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGUvYy9nZW5jYXNlL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsOTUgQEAKKyMjIE1ha2VmaWxlLmluIGZvciBJQ1UgLSB0b29scy9nZW5jYXNlCisjIyBDb3B5cmlnaHQgKGMpIDE5OTktMjAwNSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQKKyMjIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMjIFN0ZXZlbiBSLiBMb29taXMKKworIyMgU291cmNlIGRpcmVjdG9yeSBpbmZvcm1hdGlvbgorc3JjZGlyID0gQHNyY2RpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKKwordG9wX2J1aWxkZGlyID0gLi4vLi4KKworaW5jbHVkZSAkKHRvcF9idWlsZGRpcikvaWN1ZGVmcy5taworCisjIyBCdWlsZCBkaXJlY3RvcnkgaW5mb3JtYXRpb24KK3N1YmRpciA9IHRvb2xzL2dlbmNhc2UKKworVEFSR0VUX1NUVUJfTkFNRSA9IGdlbmNhc2UKKworU0VDVElPTiA9IDgKKworI01BTl9GSUxFUyA9ICQoVEFSR0VUX1NUVUJfTkFNRSkuJChTRUNUSU9OKQorCisKKyMjIEV4dHJhIGZpbGVzIHRvIHJlbW92ZSBmb3IgJ21ha2UgY2xlYW4nCitDTEVBTkZJTEVTID0gKn4gJChERVBTKSAkKE1BTl9GSUxFUykKKworIyMgVGFyZ2V0IGluZm9ybWF0aW9uCitUQVJHRVQgPSAkKEJJTkRJUikvJChUQVJHRVRfU1RVQl9OQU1FKSQoRVhFRVhUKQorCitpZm5lcSAoJCh0b3BfYnVpbGRkaXIpLCQodG9wX3NyY2RpcikpCitDUFBGTEFHUyArPSAtSSQodG9wX2J1aWxkZGlyKS9jb21tb24KK2VuZGlmCitDUFBGTEFHUyArPSAtSSQodG9wX3NyY2RpcikvY29tbW9uIC1JJChzcmNkaXIpLy4uL3Rvb2x1dGlsCitMSUJTID0gJChMSUJJQ1VUT09MVVRJTCkgJChMSUJJQ1VJMThOKSAkKExJQklDVVVDKSAkKERFRkFVTFRfTElCUykgJChMSUJfTSkKKworT0JKRUNUUyA9IGdlbmNhc2UubyBzdG9yZS5vCisKK0RFUFMgPSAkKE9CSkVDVFM6Lm89LmQpCisKKyMjIExpc3Qgb2YgcGhvbnkgdGFyZ2V0cworLlBIT05ZIDogYWxsIGFsbC1sb2NhbCBpbnN0YWxsIGluc3RhbGwtbG9jYWwgY2xlYW4gY2xlYW4tbG9jYWwJXAorZGlzdGNsZWFuIGRpc3RjbGVhbi1sb2NhbCBkaXN0IGRpc3QtbG9jYWwgY2hlY2sgY2hlY2stbG9jYWwgaW5zdGFsbC1tYW4KKworIyMgQ2xlYXIgc3VmZml4IGxpc3QKKy5TVUZGSVhFUyA6CisKKyMjIExpc3Qgb2Ygc3RhbmRhcmQgdGFyZ2V0cworYWxsOiBhbGwtbG9jYWwKK2luc3RhbGw6IGluc3RhbGwtbG9jYWwKK2NsZWFuOiBjbGVhbi1sb2NhbAorZGlzdGNsZWFuIDogZGlzdGNsZWFuLWxvY2FsCitkaXN0OiBkaXN0LWxvY2FsCitjaGVjazogYWxsIGNoZWNrLWxvY2FsCisKK2FsbC1sb2NhbDogJChUQVJHRVQpICQoTUFOX0ZJTEVTKQorCitpbnN0YWxsLWxvY2FsOiBhbGwtbG9jYWwgaW5zdGFsbC1tYW4KKworaW5zdGFsbC1tYW46ICQoTUFOX0ZJTEVTKQorIwkkKE1LSU5TVEFMTERJUlMpICQoREVTVERJUikkKG1hbmRpcikvbWFuJChTRUNUSU9OKQorIwkkKElOU1RBTExfREFUQSkgJD8gJChERVNURElSKSQobWFuZGlyKS9tYW4kKFNFQ1RJT04pCisKK2Rpc3QtbG9jYWw6CisKK2NsZWFuLWxvY2FsOgorCXRlc3QgLXogIiQoQ0xFQU5GSUxFUykiIHx8ICQoUk1WKSAkKENMRUFORklMRVMpCisJJChSTVYpICQoVEFSR0VUKSAkKE9CSkVDVFMpCisKK2Rpc3RjbGVhbi1sb2NhbDogY2xlYW4tbG9jYWwKKwkkKFJNVikgTWFrZWZpbGUKKworY2hlY2stbG9jYWw6IGFsbC1sb2NhbAorCitNYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCWNkICQodG9wX2J1aWxkZGlyKSBcCisJICYmIENPTkZJR19GSUxFUz0kKHN1YmRpcikvJEAgQ09ORklHX0hFQURFUlM9ICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cworCiskKFRBUkdFVCkgOiAkKE9CSkVDVFMpCisJJChMSU5LLmNjKSAkKE9VVE9QVCkkQCAkXiAkKExJQlMpCisJJChQT1NUX0JVSUxEX1NURVApCisKKworJS4kKFNFQ1RJT04pOiAkKHNyY2RpcikvJS4kKFNFQ1RJT04pLmluCisJY2QgJCh0b3BfYnVpbGRkaXIpIFwKKwkgJiYgQ09ORklHX0ZJTEVTPSQoc3ViZGlyKS8kQCBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCisKKworaWZlcSAoLCQoTUFLRUNNREdPQUxTKSkKKy1pbmNsdWRlICQoREVQUykKK2Vsc2UKK2lmbmVxICgkKHBhdHN1YnN0ICVjbGVhbiwsJChNQUtFQ01ER09BTFMpKSwpCistaW5jbHVkZSAkKERFUFMpCitlbmRpZgorZW5kaWYKKwpkaWZmIC0tZ2l0IGEvdW5pY29kZS9jL2dlbmNhc2UvZ2VuY2FzZS5jIGIvdW5pY29kZS9jL2dlbmNhc2UvZ2VuY2FzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5Mzc5ZmYKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RlL2MvZ2VuY2FzZS9nZW5jYXNlLmMKQEAgLTAsMCArMSw4MzUgQEAKKy8qCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgQ29weXJpZ2h0IChDKSAyMDA0LTIwMDksIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMKKyogICBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICBmaWxlIG5hbWU6ICBnZW5jYXNlLmMKKyogICBlbmNvZGluZzogICBVUy1BU0NJSQorKiAgIHRhYiBzaXplOiAgIDggKG5vdCB1c2VkKQorKiAgIGluZGVudGF0aW9uOjQKKyoKKyogICBjcmVhdGVkIG9uOiAyMDA0YXVnMjgKKyogICBjcmVhdGVkIGJ5OiBNYXJrdXMgVy4gU2NoZXJlcgorKgorKiAgIFRoaXMgcHJvZ3JhbSByZWFkcyBzZXZlcmFsIG9mIHRoZSBVbmljb2RlIGNoYXJhY3RlciBkYXRhYmFzZSB0ZXh0IGZpbGVzLAorKiAgIHBhcnNlcyB0aGVtLCBhbmQgdGhlIGNhc2UgbWFwcGluZyBwcm9wZXJ0aWVzIGZvciBlYWNoIGNoYXJhY3Rlci4KKyogICBJdCB0aGVuIHdyaXRlcyBhIGJpbmFyeSBmaWxlIGNvbnRhaW5pbmcgdGhlIHByb3BlcnRpZXMKKyogICB0aGF0IGlzIGRlc2lnbmVkIHRvIGJlIHVzZWQgZGlyZWN0bHkgZm9yIHJhbmRvbS1hY2Nlc3MgdG8KKyogICB0aGUgcHJvcGVydGllcyBvZiBlYWNoIFVuaWNvZGUgY2hhcmFjdGVyLgorKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAidW5pY29kZS91dHlwZXMuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3VjaGFyLmgiCisjaW5jbHVkZSAidW5pY29kZS91c2V0LmgiCisjaW5jbHVkZSAidW5pY29kZS9wdXRpbC5oIgorI2luY2x1ZGUgInVuaWNvZGUvdWNsZWFuLmgiCisjaW5jbHVkZSAiY21lbW9yeS5oIgorI2luY2x1ZGUgImNzdHJpbmcuaCIKKyNpbmNsdWRlICJ1YXJyc29ydC5oIgorI2luY2x1ZGUgInVuZXdkYXRhLmgiCisjaW5jbHVkZSAidW9wdGlvbnMuaCIKKyNpbmNsdWRlICJ1cGFyc2UuaCIKKyNpbmNsdWRlICJ1cHJvcHMuaCIKKyNpbmNsdWRlICJwcm9wc3ZlYy5oIgorI2luY2x1ZGUgImdlbmNhc2UuaCIKKworI2RlZmluZSBMRU5HVEhPRihhcnJheSkgKHNpemVvZihhcnJheSkvc2l6ZW9mKChhcnJheSlbMF0pKQorCisvKiBkYXRhIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitVUHJvcHNWZWN0b3JzICpwdjsKKworVUJvb2wgYmVWZXJib3NlPUZBTFNFLCBoYXZlQ29weXJpZ2h0PVRSVUU7CisKKy8qCisgKiBVbmljb2RlIHNldCBjb2xsZWN0aW5nIHRoZSBjYXNlLXNlbnNpdGl2ZSBjaGFyYWN0ZXJzOworICogc2VlIHVjaGFyLmggVUNIQVJfQ0FTRV9TRU5TSVRJVkUuCisgKiBBZGQgY29kZSBwb2ludHMgZnJvbSBjYXNlIG1hcHBpbmdzL2ZvbGRpbmdzIGluCisgKiB0aGUgcm9vdCBsb2NhbGUgYW5kIHdpdGggZGVmYXVsdCBvcHRpb25zLgorICovCitzdGF0aWMgVVNldCAqY2FzZVNlbnNpdGl2ZTsKKworLyogcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQKK3BhcnNlU3BlY2lhbENhc2luZyhjb25zdCBjaGFyICpmaWxlbmFtZSwgVUVycm9yQ29kZSAqcEVycm9yQ29kZSk7CisKK3N0YXRpYyB2b2lkCitwYXJzZUNhc2VGb2xkaW5nKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBVRXJyb3JDb2RlICpwRXJyb3JDb2RlKTsKKworc3RhdGljIHZvaWQKK3BhcnNlREIoY29uc3QgY2hhciAqZmlsZW5hbWUsIFVFcnJvckNvZGUgKnBFcnJvckNvZGUpOworCisvKiBwYXJzZSBmaWxlcyB3aXRoIG11bHRpcGxlIGJpbmFyeSBwcm9wZXJ0aWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBUT0RPOiBtb3JlIGNvbW1vbiBjb2RlLCBtb3ZlIGZ1bmN0aW9ucyB0byB1cGFyc2UuaHxjICovCisKKy8qIFRPRE86IHNpbWlsYXIgdG8gZ2VucHJvcHMvcHJvcHMyLmMgYnV0IG5vdCB0aGUgc2FtZSAqLworCitzdHJ1Y3QgQmluYXJ5IHsKKyAgICBjb25zdCBjaGFyICpwcm9wTmFtZTsKKyAgICBpbnQzMl90IHZlY1dvcmQ7CisgICAgdWludDMyX3QgdmVjVmFsdWUsIHZlY01hc2s7Cit9OwordHlwZWRlZiBzdHJ1Y3QgQmluYXJ5IEJpbmFyeTsKKworc3RydWN0IEJpbmFyaWVzIHsKKyAgICBjb25zdCBjaGFyICp1Y2RGaWxlOworICAgIGNvbnN0IEJpbmFyeSAqYmluYXJpZXM7CisgICAgaW50MzJfdCBiaW5hcmllc0NvdW50OworfTsKK3R5cGVkZWYgc3RydWN0IEJpbmFyaWVzIEJpbmFyaWVzOworCitzdGF0aWMgY29uc3QgQmluYXJ5Citwcm9wTGlzdE5hbWVzW109eworICAgIHsgIlNvZnRfRG90dGVkIiwgICAgICAgICAgICAgICAgICAgICAgICAwLCBVQ0FTRV9TT0ZUX0RPVFRFRCwgICBVQ0FTRV9ET1RfTUFTSyB9Cit9OworCitzdGF0aWMgY29uc3QgQmluYXJpZXMKK3Byb3BMaXN0QmluYXJpZXM9eworICAgICJQcm9wTGlzdCIsIHByb3BMaXN0TmFtZXMsIExFTkdUSE9GKHByb3BMaXN0TmFtZXMpCit9OworCitzdGF0aWMgY29uc3QgQmluYXJ5CitkZXJDb3JlUHJvcHNOYW1lc1tdPXsKKyAgICB7ICJMb3dlcmNhc2UiLCAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgVUNBU0VfTE9XRVIsICAgICAgICAgVUNBU0VfVFlQRV9NQVNLIH0sCisgICAgeyAiVXBwZXJjYXNlIiwgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIFVDQVNFX1VQUEVSLCAgICAgICAgIFVDQVNFX1RZUEVfTUFTSyB9LAorICAgIC8qIFVuaWNvZGUgNS4yIGFkZHMgQ2FzZV9JZ25vcmFibGUgYXMgYSBwdWJsaWMgcHJvcGVydHkuIFNlZSBjb21tZW50cyBpbiBzdG9yZS5jLiAqLworICAgIHsgIkNhc2VfSWdub3JhYmxlIiwgICAgICAgICAgICAgICAgICAgICAxLCBVX01BU0soVUdFTkNBU0VfSVNfTUlEX0xFVFRFUl9TSElGVCksIFVfTUFTSyhVR0VOQ0FTRV9JU19NSURfTEVUVEVSX1NISUZUKSB9Cit9OworCitzdGF0aWMgY29uc3QgQmluYXJpZXMKK2RlckNvcmVQcm9wc0JpbmFyaWVzPXsKKyAgICAiRGVyaXZlZENvcmVQcm9wZXJ0aWVzIiwgZGVyQ29yZVByb3BzTmFtZXMsIExFTkdUSE9GKGRlckNvcmVQcm9wc05hbWVzKQorfTsKKworLyoKKyAqIFRyZWF0IFdvcmRfQnJlYWs9TWlkTGV0dGVyIGFuZCBNaWROdW1MZXQgYXMgYSBzaW5nbGUgYmluYXJ5IHByb3BlcnR5LgorICogV2UgbmVlZCBub3QgZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGVtIGJlY2F1c2UgYm90aCBhZGQgdG8gY2FzZS1pZ25vcmFibGUuCisgKiBXZSBpZ25vcmUgYWxsIG90aGVyIFdvcmRfQnJlYWsgdmFsdWVzLgorICovCitzdGF0aWMgY29uc3QgQmluYXJ5Cit3b3JkQnJlYWtOYW1lc1tdPXsKKyAgICB7ICJNaWRMZXR0ZXIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgVV9NQVNLKFVHRU5DQVNFX0lTX01JRF9MRVRURVJfU0hJRlQpLCBVX01BU0soVUdFTkNBU0VfSVNfTUlEX0xFVFRFUl9TSElGVCkgfSwKKyAgICB7ICJNaWROdW1MZXQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgVV9NQVNLKFVHRU5DQVNFX0lTX01JRF9MRVRURVJfU0hJRlQpLCBVX01BU0soVUdFTkNBU0VfSVNfTUlEX0xFVFRFUl9TSElGVCkgfQorfTsKKworc3RhdGljIGNvbnN0IEJpbmFyaWVzCit3b3JkQnJlYWtCaW5hcmllcz17CisgICAgIldvcmRCcmVha1Byb3BlcnR5Iiwgd29yZEJyZWFrTmFtZXMsIExFTkdUSE9GKHdvcmRCcmVha05hbWVzKQorfTsKKworc3RhdGljIHZvaWQgVV9DQUxMQ09OVgorYmluYXJpZXNMaW5lRm4odm9pZCAqY29udGV4dCwKKyAgICAgICAgICAgICAgIGNoYXIgKmZpZWxkc1tdWzJdLCBpbnQzMl90IGZpZWxkQ291bnQsCisgICAgICAgICAgICAgICBVRXJyb3JDb2RlICpwRXJyb3JDb2RlKSB7CisgICAgY29uc3QgQmluYXJpZXMgKmJpbjsKKyAgICBjaGFyICpzOworICAgIHVpbnQzMl90IHN0YXJ0LCBlbmQ7CisgICAgaW50MzJfdCBpOworCisgICAgYmluPShjb25zdCBCaW5hcmllcyAqKWNvbnRleHQ7CisKKyAgICB1X3BhcnNlQ29kZVBvaW50UmFuZ2UoZmllbGRzWzBdWzBdLCAmc3RhcnQsICZlbmQsIHBFcnJvckNvZGUpOworICAgIGlmKFVfRkFJTFVSRSgqcEVycm9yQ29kZSkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5jYXNlOiBzeW50YXggZXJyb3IgaW4gJXMudHh0IGZpZWxkIDAgYXQgJXNcbiIsIGJpbi0+dWNkRmlsZSwgZmllbGRzWzBdWzBdKTsKKyAgICAgICAgZXhpdCgqcEVycm9yQ29kZSk7CisgICAgfQorCisgICAgLyogcGFyc2UgYmluYXJ5IHByb3BlcnR5IG5hbWUgKi8KKyAgICBzPShjaGFyICopdV9za2lwV2hpdGVzcGFjZShmaWVsZHNbMV1bMF0pOworICAgIGZvcihpPTA7OyArK2kpIHsKKyAgICAgICAgaWYoaT09YmluLT5iaW5hcmllc0NvdW50KSB7CisgICAgICAgICAgICAvKiBpZ25vcmUgdW5yZWNvZ25pemVkIHByb3BlcnRpZXMgKi8KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZihpc1Rva2VuKGJpbi0+YmluYXJpZXNbaV0ucHJvcE5hbWUsIHMpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKGJpbi0+YmluYXJpZXNbaV0udmVjTWFzaz09MCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbmNhc2UgZXJyb3I6IG1hc2sgdmFsdWUgJWQ9PTAgZm9yICVzICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgKGludCliaW4tPmJpbmFyaWVzW2ldLnZlY01hc2ssIGJpbi0+dWNkRmlsZSwgYmluLT5iaW5hcmllc1tpXS5wcm9wTmFtZSk7CisgICAgICAgIGV4aXQoVV9JTlRFUk5BTF9QUk9HUkFNX0VSUk9SKTsKKyAgICB9CisKKyAgICB1cHZlY19zZXRWYWx1ZShwdiwgc3RhcnQsIGVuZCwgYmluLT5iaW5hcmllc1tpXS52ZWNXb3JkLCBiaW4tPmJpbmFyaWVzW2ldLnZlY1ZhbHVlLCBiaW4tPmJpbmFyaWVzW2ldLnZlY01hc2ssIHBFcnJvckNvZGUpOworICAgIGlmKFVfRkFJTFVSRSgqcEVycm9yQ29kZSkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5jYXNlIGVycm9yOiB1bmFibGUgdG8gc2V0ICVzLCBjb2RlOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJpbi0+YmluYXJpZXNbaV0ucHJvcE5hbWUsIHVfZXJyb3JOYW1lKCpwRXJyb3JDb2RlKSk7CisgICAgICAgIGV4aXQoKnBFcnJvckNvZGUpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3BhcnNlQmluYXJpZXNGaWxlKGNoYXIgKmZpbGVuYW1lLCBjaGFyICpiYXNlbmFtZSwgY29uc3QgY2hhciAqc3VmZml4LAorICAgICAgICAgICAgICAgICAgY29uc3QgQmluYXJpZXMgKmJpbiwKKyAgICAgICAgICAgICAgICAgIFVFcnJvckNvZGUgKnBFcnJvckNvZGUpIHsKKyAgICBjaGFyICpmaWVsZHNbMl1bMl07CisKKyAgICBpZihwRXJyb3JDb2RlPT1OVUxMIHx8IFVfRkFJTFVSRSgqcEVycm9yQ29kZSkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHdyaXRlVUNERmlsZW5hbWUoYmFzZW5hbWUsIGJpbi0+dWNkRmlsZSwgc3VmZml4KTsKKworICAgIHVfcGFyc2VEZWxpbWl0ZWRGaWxlKGZpbGVuYW1lLCAnOycsIGZpZWxkcywgMiwgYmluYXJpZXNMaW5lRm4sICh2b2lkICopYmluLCBwRXJyb3JDb2RlKTsKKyAgICBpZihVX0ZBSUxVUkUoKnBFcnJvckNvZGUpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZXJyb3IgcGFyc2luZyAlcy50eHQ6ICVzXG4iLCBiaW4tPnVjZEZpbGUsIHVfZXJyb3JOYW1lKCpwRXJyb3JDb2RlKSk7CisgICAgfQorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitlbnVtCit7CisgICAgSEVMUF9ILAorICAgIEhFTFBfUVVFU1RJT05fTUFSSywKKyAgICBWRVJCT1NFLAorICAgIENPUFlSSUdIVCwKKyAgICBERVNURElSLAorICAgIFNPVVJDRURJUiwKKyAgICBVTklDT0RFX1ZFUlNJT04sCisgICAgSUNVREFUQURJUiwKKyAgICBDU09VUkNFCit9OworCisvKiBLZWVwIHRoZXNlIHZhbHVlcyBpbiBzeW5jIHdpdGggdGhlIGFib3ZlIGVudW1zICovCitzdGF0aWMgVU9wdGlvbiBvcHRpb25zW109eworICAgIFVPUFRJT05fSEVMUF9ILAorICAgIFVPUFRJT05fSEVMUF9RVUVTVElPTl9NQVJLLAorICAgIFVPUFRJT05fVkVSQk9TRSwKKyAgICBVT1BUSU9OX0NPUFlSSUdIVCwKKyAgICBVT1BUSU9OX0RFU1RESVIsCisgICAgVU9QVElPTl9TT1VSQ0VESVIsCisgICAgVU9QVElPTl9ERUYoInVuaWNvZGUiLCAndScsIFVPUFRfUkVRVUlSRVNfQVJHKSwKKyAgICBVT1BUSU9OX0lDVURBVEFESVIsCisgICAgVU9QVElPTl9ERUYoImNzb3VyY2UiLCAnQycsIFVPUFRfTk9fQVJHKQorfTsKKworZXh0ZXJuIGludAorbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisgICAgY2hhciBmaWxlbmFtZVszMDBdOworICAgIGNvbnN0IGNoYXIgKnNyY0Rpcj1OVUxMLCAqZGVzdERpcj1OVUxMLCAqc3VmZml4PU5VTEw7CisgICAgY2hhciAqYmFzZW5hbWU9TlVMTDsKKyAgICBVRXJyb3JDb2RlIGVycm9yQ29kZT1VX1pFUk9fRVJST1I7CisKKyAgICBVX01BSU5fSU5JVF9BUkdTKGFyZ2MsIGFyZ3YpOworCisgICAgLyogcHJlc2V0IHRoZW4gcmVhZCBjb21tYW5kIGxpbmUgb3B0aW9ucyAqLworICAgIG9wdGlvbnNbREVTVERJUl0udmFsdWU9dV9nZXREYXRhRGlyZWN0b3J5KCk7CisgICAgb3B0aW9uc1tTT1VSQ0VESVJdLnZhbHVlPSIiOworICAgIG9wdGlvbnNbVU5JQ09ERV9WRVJTSU9OXS52YWx1ZT0iIjsKKyAgICBvcHRpb25zW0lDVURBVEFESVJdLnZhbHVlPXVfZ2V0RGF0YURpcmVjdG9yeSgpOworICAgIGFyZ2M9dV9wYXJzZUFyZ3MoYXJnYywgYXJndiwgc2l6ZW9mKG9wdGlvbnMpL3NpemVvZihvcHRpb25zWzBdKSwgb3B0aW9ucyk7CisKKyAgICAvKiBlcnJvciBoYW5kbGluZywgcHJpbnRpbmcgdXNhZ2UgbWVzc2FnZSAqLworICAgIGlmKGFyZ2M8MCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICJlcnJvciBpbiBjb21tYW5kIGxpbmUgYXJndW1lbnQgXCIlc1wiXG4iLAorICAgICAgICAgICAgYXJndlstYXJnY10pOworICAgIH0KKyAgICBpZihhcmdjPDAgfHwgb3B0aW9uc1tIRUxQX0hdLmRvZXNPY2N1ciB8fCBvcHRpb25zW0hFTFBfUVVFU1RJT05fTUFSS10uZG9lc09jY3VyKSB7CisgICAgICAgIC8qCisgICAgICAgICAqIEJyb2tlbiBpbnRvIGNodW5rcyBiZWNhdXNlIHRoZSBDODkgc3RhbmRhcmQgc2F5cyB0aGUgbWluaW11bQorICAgICAgICAgKiByZXF1aXJlZCBzdXBwb3J0ZWQgc3RyaW5nIGxlbmd0aCBpcyA1MDkgYnl0ZXMuCisgICAgICAgICAqLworICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICJVc2FnZTogJXMgWy1vcHRpb25zXSBbc3VmZml4XVxuIgorICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgInJlYWQgdGhlIFVuaWNvZGVEYXRhLnR4dCBmaWxlIGFuZCBvdGhlciBVbmljb2RlIHByb3BlcnRpZXMgZmlsZXMgYW5kXG4iCisgICAgICAgICAgICAiY3JlYXRlIGEgYmluYXJ5IGZpbGUgIiBVQ0FTRV9EQVRBX05BTUUgIi4iIFVDQVNFX0RBVEFfVFlQRSAiIHdpdGggdGhlIGNhc2UgbWFwcGluZyBwcm9wZXJ0aWVzXG4iCisgICAgICAgICAgICAiXG4iLAorICAgICAgICAgICAgYXJndlswXSk7CisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgIk9wdGlvbnM6XG4iCisgICAgICAgICAgICAiXHQtaCBvciAtPyBvciAtLWhlbHAgIHRoaXMgdXNhZ2UgdGV4dFxuIgorICAgICAgICAgICAgIlx0LXYgb3IgLS12ZXJib3NlICAgICB2ZXJib3NlIG91dHB1dFxuIgorICAgICAgICAgICAgIlx0LWMgb3IgLS1jb3B5cmlnaHQgICBpbmNsdWRlIGEgY29weXJpZ2h0IG5vdGljZVxuIgorICAgICAgICAgICAgIlx0LXUgb3IgLS11bmljb2RlICAgICBVbmljb2RlIHZlcnNpb24sIGZvbGxvd2VkIGJ5IHRoZSB2ZXJzaW9uIGxpa2UgMy4wLjBcbiIKKyAgICAgICAgICAgICJcdC1DIG9yIC0tY3NvdXJjZSAgICAgZ2VuZXJhdGUgYSAuYyBzb3VyY2UgZmlsZSByYXRoZXIgdGhhbiB0aGUgLmljdSBiaW5hcnlcbiIpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICJcdC1kIG9yIC0tZGVzdGRpciAgICAgZGVzdGluYXRpb24gZGlyZWN0b3J5LCBmb2xsb3dlZCBieSB0aGUgcGF0aFxuIgorICAgICAgICAgICAgIlx0LXMgb3IgLS1zb3VyY2VkaXIgICBzb3VyY2UgZGlyZWN0b3J5LCBmb2xsb3dlZCBieSB0aGUgcGF0aFxuIgorICAgICAgICAgICAgIlx0LWkgb3IgLS1pY3VkYXRhZGlyICBkaXJlY3RvcnkgZm9yIGxvY2F0aW5nIGFueSBuZWVkZWQgaW50ZXJtZWRpYXRlIGRhdGEgZmlsZXMsXG4iCisgICAgICAgICAgICAiXHQgICAgICAgICAgICAgICAgICAgIGZvbGxvd2VkIGJ5IHBhdGgsIGRlZmF1bHRzIHRvICVzXG4iCisgICAgICAgICAgICAiXHRzdWZmaXggICAgICAgICAgICAgIHN1ZmZpeCB0aGF0IGlzIHRvIGJlIGFwcGVuZGVkIHdpdGggYSAnLSdcbiIKKyAgICAgICAgICAgICJcdCAgICAgICAgICAgICAgICAgICAgdG8gdGhlIHNvdXJjZSBmaWxlIGJhc2VuYW1lcyBiZWZvcmUgb3BlbmluZztcbiIKKyAgICAgICAgICAgICJcdCAgICAgICAgICAgICAgICAgICAgJ2dlbmNhc2UgbmV3JyB3aWxsIHJlYWQgVW5pY29kZURhdGEtbmV3LnR4dCBldGMuXG4iLAorICAgICAgICAgICAgdV9nZXREYXRhRGlyZWN0b3J5KCkpOworICAgICAgICByZXR1cm4gYXJnYzwwID8gVV9JTExFR0FMX0FSR1VNRU5UX0VSUk9SIDogVV9aRVJPX0VSUk9SOworICAgIH0KKworICAgIC8qIGdldCB0aGUgb3B0aW9ucyB2YWx1ZXMgKi8KKyAgICBiZVZlcmJvc2U9b3B0aW9uc1tWRVJCT1NFXS5kb2VzT2NjdXI7CisgICAgaGF2ZUNvcHlyaWdodD1vcHRpb25zW0NPUFlSSUdIVF0uZG9lc09jY3VyOworICAgIHNyY0Rpcj1vcHRpb25zW1NPVVJDRURJUl0udmFsdWU7CisgICAgZGVzdERpcj1vcHRpb25zW0RFU1RESVJdLnZhbHVlOworCisgICAgaWYoYXJnYz49MikgeworICAgICAgICBzdWZmaXg9YXJndlsxXTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdWZmaXg9TlVMTDsKKyAgICB9CisKKyAgICBpZihvcHRpb25zW1VOSUNPREVfVkVSU0lPTl0uZG9lc09jY3VyKSB7CisgICAgICAgIHNldFVuaWNvZGVWZXJzaW9uKG9wdGlvbnNbVU5JQ09ERV9WRVJTSU9OXS52YWx1ZSk7CisgICAgfQorICAgIC8qIGVsc2UgdXNlIHRoZSBkZWZhdWx0IGRhdGFWZXJzaW9uIGluIHN0b3JlLmMgKi8KKworICAgIGlmIChvcHRpb25zW0lDVURBVEFESVJdLmRvZXNPY2N1cikgeworICAgICAgICB1X3NldERhdGFEaXJlY3Rvcnkob3B0aW9uc1tJQ1VEQVRBRElSXS52YWx1ZSk7CisgICAgfQorCisgICAgLyogcHJlcGFyZSB0aGUgZmlsZW5hbWUgYmVnaW5uaW5nIHdpdGggdGhlIHNvdXJjZSBkaXIgKi8KKyAgICB1cHJ2X3N0cmNweShmaWxlbmFtZSwgc3JjRGlyKTsKKyAgICBiYXNlbmFtZT1maWxlbmFtZSt1cHJ2X3N0cmxlbihmaWxlbmFtZSk7CisgICAgaWYoYmFzZW5hbWU+ZmlsZW5hbWUgJiYgKihiYXNlbmFtZS0xKSE9VV9GSUxFX1NFUF9DSEFSKSB7CisgICAgICAgICpiYXNlbmFtZSsrPVVfRklMRV9TRVBfQ0hBUjsKKyAgICB9CisKKyAgICAvKiBpbml0aWFsaXplICovCisgICAgcHY9dXB2ZWNfb3BlbigyLCAmZXJyb3JDb2RlKTsKKyAgICBjYXNlU2Vuc2l0aXZlPXVzZXRfb3BlbigxLCAwKTsgLyogZW1wdHkgc2V0IChzdGFydD5lbmQpICovCisKKyAgICAvKiBwcm9jZXNzIFNwZWNpYWxDYXNpbmcudHh0ICovCisgICAgd3JpdGVVQ0RGaWxlbmFtZShiYXNlbmFtZSwgIlNwZWNpYWxDYXNpbmciLCBzdWZmaXgpOworICAgIHBhcnNlU3BlY2lhbENhc2luZyhmaWxlbmFtZSwgJmVycm9yQ29kZSk7CisKKyAgICAvKiBwcm9jZXNzIENhc2VGb2xkaW5nLnR4dCAqLworICAgIHdyaXRlVUNERmlsZW5hbWUoYmFzZW5hbWUsICJDYXNlRm9sZGluZyIsIHN1ZmZpeCk7CisgICAgcGFyc2VDYXNlRm9sZGluZyhmaWxlbmFtZSwgJmVycm9yQ29kZSk7CisKKyAgICAvKiBwcm9jZXNzIGFkZGl0aW9uYWwgcHJvcGVydGllcyBmaWxlcyAqLworICAgICpiYXNlbmFtZT0wOworCisgICAgcGFyc2VCaW5hcmllc0ZpbGUoZmlsZW5hbWUsIGJhc2VuYW1lLCBzdWZmaXgsICZwcm9wTGlzdEJpbmFyaWVzLCAmZXJyb3JDb2RlKTsKKworICAgIHBhcnNlQmluYXJpZXNGaWxlKGZpbGVuYW1lLCBiYXNlbmFtZSwgc3VmZml4LCAmZGVyQ29yZVByb3BzQmluYXJpZXMsICZlcnJvckNvZGUpOworCisgICAgaWYodWNkVmVyc2lvbj49VU5JXzRfMSkgeworICAgICAgICBwYXJzZUJpbmFyaWVzRmlsZShmaWxlbmFtZSwgYmFzZW5hbWUsIHN1ZmZpeCwgJndvcmRCcmVha0JpbmFyaWVzLCAmZXJyb3JDb2RlKTsKKyAgICB9CisKKyAgICAvKiBwcm9jZXNzIFVuaWNvZGVEYXRhLnR4dCAqLworICAgIHdyaXRlVUNERmlsZW5hbWUoYmFzZW5hbWUsICJVbmljb2RlRGF0YSIsIHN1ZmZpeCk7CisgICAgcGFyc2VEQihmaWxlbmFtZSwgJmVycm9yQ29kZSk7CisKKyAgICAvKiBwcm9jZXNzIHBhcnNlZCBkYXRhICovCisgICAgbWFrZUNhc2VDbG9zdXJlKCk7CisKKyAgICBtYWtlRXhjZXB0aW9ucygpOworCisgICAgaWYoVV9TVUNDRVNTKGVycm9yQ29kZSkpIHsKKyAgICAgICAgLyogd3JpdGUgdGhlIHByb3BlcnRpZXMgZGF0YSBmaWxlICovCisgICAgICAgIGdlbmVyYXRlRGF0YShkZXN0RGlyLCBvcHRpb25zW0NTT1VSQ0VdLmRvZXNPY2N1cik7CisgICAgfQorCisgICAgdV9jbGVhbnVwKCk7CisgICAgcmV0dXJuIGVycm9yQ29kZTsKK30KKworVV9DRlVOQyB2b2lkCit3cml0ZVVDREZpbGVuYW1lKGNoYXIgKmJhc2VuYW1lLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqc3VmZml4KSB7CisgICAgaW50MzJfdCBsZW5ndGg9KGludDMyX3QpdXBydl9zdHJsZW4oZmlsZW5hbWUpOworICAgIHVwcnZfc3RyY3B5KGJhc2VuYW1lLCBmaWxlbmFtZSk7CisgICAgaWYoc3VmZml4IT1OVUxMKSB7CisgICAgICAgIGJhc2VuYW1lW2xlbmd0aCsrXT0nLSc7CisgICAgICAgIHVwcnZfc3RyY3B5KGJhc2VuYW1lK2xlbmd0aCwgc3VmZml4KTsKKyAgICAgICAgbGVuZ3RoKz0oaW50MzJfdCl1cHJ2X3N0cmxlbihzdWZmaXgpOworICAgIH0KKyAgICB1cHJ2X3N0cmNweShiYXNlbmFtZStsZW5ndGgsICIudHh0Iik7Cit9CisKKy8qIFRPRE86IG1vdmUgdG8gdG9vbHV0aWwgKi8KK1VfQ0ZVTkMgVUJvb2wKK2lzVG9rZW4oY29uc3QgY2hhciAqdG9rZW4sIGNvbnN0IGNoYXIgKnMpIHsKKyAgICBjb25zdCBjaGFyICp6OworICAgIGludDMyX3QgajsKKworICAgIHM9dV9za2lwV2hpdGVzcGFjZShzKTsKKyAgICBmb3Ioaj0wOzsgKytqKSB7CisgICAgICAgIGlmKHRva2VuW2pdIT0wKSB7CisgICAgICAgICAgICBpZihzW2pdIT10b2tlbltqXSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgej11X3NraXBXaGl0ZXNwYWNlKHMraik7CisgICAgICAgICAgICBpZigqej09JzsnIHx8ICp6PT0wKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgaW50MzJfdAorZ2V0VG9rZW5JbmRleChjb25zdCBjaGFyICpjb25zdCB0b2tlbnNbXSwgaW50MzJfdCBjb3VudFRva2VucywgY29uc3QgY2hhciAqcykgeworICAgIGNvbnN0IGNoYXIgKnQsICp6OworICAgIGludDMyX3QgaSwgajsKKworICAgIHM9dV9za2lwV2hpdGVzcGFjZShzKTsKKyAgICBmb3IoaT0wOyBpPGNvdW50VG9rZW5zOyArK2kpIHsKKyAgICAgICAgdD10b2tlbnNbaV07CisgICAgICAgIGlmKHQhPU5VTEwpIHsKKyAgICAgICAgICAgIGZvcihqPTA7OyArK2opIHsKKyAgICAgICAgICAgICAgICBpZih0W2pdIT0wKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKHNbal0hPXRbal0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgej11X3NraXBXaGl0ZXNwYWNlKHMraik7CisgICAgICAgICAgICAgICAgICAgIGlmKCp6PT0nOycgfHwgKno9PTAgfHwgKno9PScjJyB8fCAqej09J1xyJyB8fCAqej09J1xuJykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkCitfc2V0X2FkZEFsbChVU2V0ICpzZXQsIGNvbnN0IFVDaGFyICpzLCBpbnQzMl90IGxlbmd0aCkgeworICAgIFVDaGFyMzIgYzsKKyAgICBpbnQzMl90IGk7CisKKyAgICAvKiBuZWVkcyBsZW5ndGg+PTAgKi8KKyAgICBmb3IoaT0wOyBpPGxlbmd0aDsgLyogVTE2X05FWFQgYWR2YW5jZXMgaSAqLykgeworICAgICAgICBVMTZfTkVYVChzLCBpLCBsZW5ndGgsIGMpOworICAgICAgICB1c2V0X2FkZChzZXQsIGMpOworICAgIH0KK30KKworLyogcGFyc2VyIGZvciBTcGVjaWFsQ2FzaW5nLnR4dCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBNQVhfU1BFQ0lBTF9DQVNJTkdfQ09VTlQgNTAwCisKK3N0YXRpYyBTcGVjaWFsQ2FzaW5nIHNwZWNpYWxDYXNpbmdzW01BWF9TUEVDSUFMX0NBU0lOR19DT1VOVF07CitzdGF0aWMgaW50MzJfdCBzcGVjaWFsQ2FzaW5nQ291bnQ9MDsKKworc3RhdGljIHZvaWQgVV9DQUxMQ09OVgorc3BlY2lhbENhc2luZ0xpbmVGbih2b2lkICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICBjaGFyICpmaWVsZHNbXVsyXSwgaW50MzJfdCBmaWVsZENvdW50LAorICAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICpwRXJyb3JDb2RlKSB7CisgICAgY2hhciAqZW5kOworCisgICAgLyogZ2V0IGNvZGUgcG9pbnQgKi8KKyAgICBzcGVjaWFsQ2FzaW5nc1tzcGVjaWFsQ2FzaW5nQ291bnRdLmNvZGU9KFVDaGFyMzIpdXBydl9zdHJ0b3VsKHVfc2tpcFdoaXRlc3BhY2UoZmllbGRzWzBdWzBdKSwgJmVuZCwgMTYpOworICAgIGVuZD0oY2hhciAqKXVfc2tpcFdoaXRlc3BhY2UoZW5kKTsKKyAgICBpZihlbmQ8PWZpZWxkc1swXVswXSB8fCBlbmQhPWZpZWxkc1swXVsxXSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbmNhc2U6IHN5bnRheCBlcnJvciBpbiBTcGVjaWFsQ2FzaW5nLnR4dCBmaWVsZCAwIGF0ICVzXG4iLCBmaWVsZHNbMF1bMF0pOworICAgICAgICAqcEVycm9yQ29kZT1VX1BBUlNFX0VSUk9SOworICAgICAgICBleGl0KFVfUEFSU0VfRVJST1IpOworICAgIH0KKworICAgIC8qIGlzIHRoaXMgYSBjb21wbGV4IG1hcHBpbmc/ICovCisgICAgaWYoKihlbmQ9KGNoYXIgKil1X3NraXBXaGl0ZXNwYWNlKGZpZWxkc1s0XVswXSkpIT0wICYmICplbmQhPSc7JyAmJiAqZW5kIT0nIycpIHsKKyAgICAgICAgLyogdGhlcmUgaXMgc29tZSBjb25kaXRpb24gdGV4dCBpbiB0aGUgZmlmdGggZmllbGQgKi8KKyAgICAgICAgc3BlY2lhbENhc2luZ3Nbc3BlY2lhbENhc2luZ0NvdW50XS5pc0NvbXBsZXg9VFJVRTsKKworICAgICAgICAvKiBkbyBub3Qgc3RvcmUgYW55IGFjdHVhbCBtYXBwaW5ncyBmb3IgdGhpcyAqLworICAgICAgICBzcGVjaWFsQ2FzaW5nc1tzcGVjaWFsQ2FzaW5nQ291bnRdLmxvd2VyQ2FzZVswXT0wOworICAgICAgICBzcGVjaWFsQ2FzaW5nc1tzcGVjaWFsQ2FzaW5nQ291bnRdLnVwcGVyQ2FzZVswXT0wOworICAgICAgICBzcGVjaWFsQ2FzaW5nc1tzcGVjaWFsQ2FzaW5nQ291bnRdLnRpdGxlQ2FzZVswXT0wOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGp1c3Qgc2V0IHRoZSAiY29tcGxleCIgZmxhZyBhbmQgZ2V0IHRoZSBjYXNlIG1hcHBpbmdzICovCisgICAgICAgIHNwZWNpYWxDYXNpbmdzW3NwZWNpYWxDYXNpbmdDb3VudF0uaXNDb21wbGV4PUZBTFNFOworICAgICAgICBzcGVjaWFsQ2FzaW5nc1tzcGVjaWFsQ2FzaW5nQ291bnRdLmxvd2VyQ2FzZVswXT0KKyAgICAgICAgICAgIChVQ2hhcil1X3BhcnNlU3RyaW5nKGZpZWxkc1sxXVswXSwgc3BlY2lhbENhc2luZ3Nbc3BlY2lhbENhc2luZ0NvdW50XS5sb3dlckNhc2UrMSwgMzEsIE5VTEwsIHBFcnJvckNvZGUpOworICAgICAgICBzcGVjaWFsQ2FzaW5nc1tzcGVjaWFsQ2FzaW5nQ291bnRdLnVwcGVyQ2FzZVswXT0KKyAgICAgICAgICAgIChVQ2hhcil1X3BhcnNlU3RyaW5nKGZpZWxkc1szXVswXSwgc3BlY2lhbENhc2luZ3Nbc3BlY2lhbENhc2luZ0NvdW50XS51cHBlckNhc2UrMSwgMzEsIE5VTEwsIHBFcnJvckNvZGUpOworICAgICAgICBzcGVjaWFsQ2FzaW5nc1tzcGVjaWFsQ2FzaW5nQ291bnRdLnRpdGxlQ2FzZVswXT0KKyAgICAgICAgICAgIChVQ2hhcil1X3BhcnNlU3RyaW5nKGZpZWxkc1syXVswXSwgc3BlY2lhbENhc2luZ3Nbc3BlY2lhbENhc2luZ0NvdW50XS50aXRsZUNhc2UrMSwgMzEsIE5VTEwsIHBFcnJvckNvZGUpOworICAgICAgICBpZihVX0ZBSUxVUkUoKnBFcnJvckNvZGUpKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbmNhc2U6IGVycm9yIHBhcnNpbmcgc3BlY2lhbCBjYXNpbmcgYXQgJXNcbiIsIGZpZWxkc1swXVswXSk7CisgICAgICAgICAgICBleGl0KCpwRXJyb3JDb2RlKTsKKyAgICAgICAgfQorCisgICAgICAgIHVzZXRfYWRkKGNhc2VTZW5zaXRpdmUsIChVQ2hhcjMyKXNwZWNpYWxDYXNpbmdzW3NwZWNpYWxDYXNpbmdDb3VudF0uY29kZSk7CisgICAgICAgIF9zZXRfYWRkQWxsKGNhc2VTZW5zaXRpdmUsIHNwZWNpYWxDYXNpbmdzW3NwZWNpYWxDYXNpbmdDb3VudF0ubG93ZXJDYXNlKzEsIHNwZWNpYWxDYXNpbmdzW3NwZWNpYWxDYXNpbmdDb3VudF0ubG93ZXJDYXNlWzBdKTsKKyAgICAgICAgX3NldF9hZGRBbGwoY2FzZVNlbnNpdGl2ZSwgc3BlY2lhbENhc2luZ3Nbc3BlY2lhbENhc2luZ0NvdW50XS51cHBlckNhc2UrMSwgc3BlY2lhbENhc2luZ3Nbc3BlY2lhbENhc2luZ0NvdW50XS51cHBlckNhc2VbMF0pOworICAgICAgICBfc2V0X2FkZEFsbChjYXNlU2Vuc2l0aXZlLCBzcGVjaWFsQ2FzaW5nc1tzcGVjaWFsQ2FzaW5nQ291bnRdLnRpdGxlQ2FzZSsxLCBzcGVjaWFsQ2FzaW5nc1tzcGVjaWFsQ2FzaW5nQ291bnRdLnRpdGxlQ2FzZVswXSk7CisgICAgfQorCisgICAgaWYoKytzcGVjaWFsQ2FzaW5nQ291bnQ9PU1BWF9TUEVDSUFMX0NBU0lOR19DT1VOVCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbmNhc2U6IHRvbyBtYW55IHNwZWNpYWwgY2FzaW5nIG1hcHBpbmdzXG4iKTsKKyAgICAgICAgKnBFcnJvckNvZGU9VV9JTkRFWF9PVVRPRkJPVU5EU19FUlJPUjsKKyAgICAgICAgZXhpdChVX0lOREVYX09VVE9GQk9VTkRTX0VSUk9SKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQzMl90IFVfQ0FMTENPTlYKK2NvbXBhcmVTcGVjaWFsQ2FzaW5ncyhjb25zdCB2b2lkICpjb250ZXh0LCBjb25zdCB2b2lkICpsZWZ0LCBjb25zdCB2b2lkICpyaWdodCkgeworICAgIHJldHVybiAoKGNvbnN0IFNwZWNpYWxDYXNpbmcgKilsZWZ0KS0+Y29kZS0oKGNvbnN0IFNwZWNpYWxDYXNpbmcgKilyaWdodCktPmNvZGU7Cit9CisKK3N0YXRpYyB2b2lkCitwYXJzZVNwZWNpYWxDYXNpbmcoY29uc3QgY2hhciAqZmlsZW5hbWUsIFVFcnJvckNvZGUgKnBFcnJvckNvZGUpIHsKKyAgICBjaGFyICpmaWVsZHNbNV1bMl07CisgICAgaW50MzJfdCBpLCBqOworCisgICAgaWYocEVycm9yQ29kZT09TlVMTCB8fCBVX0ZBSUxVUkUoKnBFcnJvckNvZGUpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB1X3BhcnNlRGVsaW1pdGVkRmlsZShmaWxlbmFtZSwgJzsnLCBmaWVsZHMsIDUsIHNwZWNpYWxDYXNpbmdMaW5lRm4sIE5VTEwsIHBFcnJvckNvZGUpOworCisgICAgLyogc29ydCB0aGUgc3BlY2lhbCBjYXNpbmcgZW50cmllcyBieSBjb2RlIHBvaW50ICovCisgICAgaWYoc3BlY2lhbENhc2luZ0NvdW50PjApIHsKKyAgICAgICAgdXBydl9zb3J0QXJyYXkoc3BlY2lhbENhc2luZ3MsIHNwZWNpYWxDYXNpbmdDb3VudCwgc2l6ZW9mKFNwZWNpYWxDYXNpbmcpLAorICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlU3BlY2lhbENhc2luZ3MsIE5VTEwsIEZBTFNFLCBwRXJyb3JDb2RlKTsKKyAgICB9CisgICAgaWYoVV9GQUlMVVJFKCpwRXJyb3JDb2RlKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogcmVwbGFjZSBtdWx0aXBsZSBlbnRyaWVzIGZvciBhbnkgY29kZSBwb2ludCBieSBvbmUgImNvbXBsZXgiIG9uZSAqLworICAgIGo9MDsKKyAgICBmb3IoaT0xOyBpPHNwZWNpYWxDYXNpbmdDb3VudDsgKytpKSB7CisgICAgICAgIGlmKHNwZWNpYWxDYXNpbmdzW2ktMV0uY29kZT09c3BlY2lhbENhc2luZ3NbaV0uY29kZSkgeworICAgICAgICAgICAgLyogdGhlcmUgaXMgYSBkdXBsaWNhdGUgY29kZSBwb2ludCAqLworICAgICAgICAgICAgc3BlY2lhbENhc2luZ3NbaS0xXS5jb2RlPTB4N2ZmZmZmZmY7ICAgIC8qIHJlbW92ZSB0aGlzIGVudHJ5IGluIHRoZSBmb2xsb3dpbmcgc29ydGluZyAqLworICAgICAgICAgICAgc3BlY2lhbENhc2luZ3NbaV0uaXNDb21wbGV4PVRSVUU7ICAgICAgIC8qIG1ha2UgdGhlIGZvbGxvd2luZyBvbmUgY29tcGxleCAqLworICAgICAgICAgICAgc3BlY2lhbENhc2luZ3NbaV0ubG93ZXJDYXNlWzBdPTA7CisgICAgICAgICAgICBzcGVjaWFsQ2FzaW5nc1tpXS51cHBlckNhc2VbMF09MDsKKyAgICAgICAgICAgIHNwZWNpYWxDYXNpbmdzW2ldLnRpdGxlQ2FzZVswXT0wOworICAgICAgICAgICAgKytqOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaWYgc29tZSBlbnRyaWVzIGp1c3Qgd2VyZSByZW1vdmVkLCB0aGVuIHJlLXNvcnQgKi8KKyAgICBpZihqPjApIHsKKyAgICAgICAgdXBydl9zb3J0QXJyYXkoc3BlY2lhbENhc2luZ3MsIHNwZWNpYWxDYXNpbmdDb3VudCwgc2l6ZW9mKFNwZWNpYWxDYXNpbmcpLAorICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlU3BlY2lhbENhc2luZ3MsIE5VTEwsIEZBTFNFLCBwRXJyb3JDb2RlKTsKKyAgICAgICAgc3BlY2lhbENhc2luZ0NvdW50LT1qOworICAgIH0KKyAgICBpZihVX0ZBSUxVUkUoKnBFcnJvckNvZGUpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEFkZCBvbmUgY29tcGxleCBtYXBwaW5nIHRvIGNhc2VTZW5zaXRpdmUgdGhhdCB3YXMgZmlsdGVyZWQgb3V0IGFib3ZlOgorICAgICAqIEdyZWVrIGZpbmFsIFNpZ21hIGhhcyBhIGNvbmRpdGlvbmFsIG1hcHBpbmcgYnV0IG5vdCBsb2NhbGUtc2Vuc2l0aXZlLAorICAgICAqIGFuZCBpdCBpcyB0YWtlbiB3aGVuIGxvd2VyY2FzaW5nIGp1c3QgVSswM0EzIGFsb25lLgorICAgICAqIDAzQTM7IDAzQzI7IDAzQTM7IDAzQTM7IEZpbmFsX1NpZ21hOyAjIEdSRUVLIENBUElUQUwgTEVUVEVSIFNJR01BCisgICAgICovCisgICAgdXNldF9hZGQoY2FzZVNlbnNpdGl2ZSwgMHgzYzIpOworfQorCisvKiBwYXJzZXIgZm9yIENhc2VGb2xkaW5nLnR4dCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIE1BWF9DQVNFX0ZPTERJTkdfQ09VTlQgMjAwMAorCitzdGF0aWMgQ2FzZUZvbGRpbmcgY2FzZUZvbGRpbmdzW01BWF9DQVNFX0ZPTERJTkdfQ09VTlRdOworc3RhdGljIGludDMyX3QgY2FzZUZvbGRpbmdDb3VudD0wOworCitzdGF0aWMgdm9pZCBVX0NBTExDT05WCitjYXNlRm9sZGluZ0xpbmVGbih2b2lkICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgY2hhciAqZmllbGRzW11bMl0sIGludDMyX3QgZmllbGRDb3VudCwKKyAgICAgICAgICAgICAgICAgIFVFcnJvckNvZGUgKnBFcnJvckNvZGUpIHsKKyAgICBjaGFyICplbmQ7CisgICAgc3RhdGljIFVDaGFyMzIgcHJldkNvZGU9MDsKKyAgICBpbnQzMl90IGNvdW50OworICAgIGNoYXIgc3RhdHVzOworCisgICAgLyogZ2V0IGNvZGUgcG9pbnQgKi8KKyAgICBjYXNlRm9sZGluZ3NbY2FzZUZvbGRpbmdDb3VudF0uY29kZT0oVUNoYXIzMil1cHJ2X3N0cnRvdWwodV9za2lwV2hpdGVzcGFjZShmaWVsZHNbMF1bMF0pLCAmZW5kLCAxNik7CisgICAgZW5kPShjaGFyICopdV9za2lwV2hpdGVzcGFjZShlbmQpOworICAgIGlmKGVuZDw9ZmllbGRzWzBdWzBdIHx8IGVuZCE9ZmllbGRzWzBdWzFdKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2VuY2FzZTogc3ludGF4IGVycm9yIGluIENhc2VGb2xkaW5nLnR4dCBmaWVsZCAwIGF0ICVzXG4iLCBmaWVsZHNbMF1bMF0pOworICAgICAgICAqcEVycm9yQ29kZT1VX1BBUlNFX0VSUk9SOworICAgICAgICBleGl0KFVfUEFSU0VfRVJST1IpOworICAgIH0KKworICAgIC8qIGdldCB0aGUgc3RhdHVzIG9mIHRoaXMgbWFwcGluZyAqLworICAgIGNhc2VGb2xkaW5nc1tjYXNlRm9sZGluZ0NvdW50XS5zdGF0dXM9c3RhdHVzPSp1X3NraXBXaGl0ZXNwYWNlKGZpZWxkc1sxXVswXSk7CisgICAgaWYoc3RhdHVzIT0nTCcgJiYgc3RhdHVzIT0nRScgJiYgc3RhdHVzIT0nQycgJiYgc3RhdHVzIT0nUycgJiYgc3RhdHVzIT0nRicgJiYgc3RhdHVzIT0nSScgJiYgc3RhdHVzIT0nVCcpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5jYXNlOiB1bnJlY29nbml6ZWQgc3RhdHVzIGZpZWxkIGluIENhc2VGb2xkaW5nLnR4dCBhdCAlc1xuIiwgZmllbGRzWzBdWzBdKTsKKyAgICAgICAgKnBFcnJvckNvZGU9VV9QQVJTRV9FUlJPUjsKKyAgICAgICAgZXhpdChVX1BBUlNFX0VSUk9SKTsKKyAgICB9CisKKyAgICAvKiBpZ25vcmUgYWxsIGNhc2UgZm9sZGluZyBtYXBwaW5ncyB0aGF0IGFyZSB0aGUgc2FtZSBhcyB0aGUgVW5pY29kZURhdGEudHh0IGxvd2VyY2FzZSBtYXBwaW5ncyAqLworICAgIGlmKHN0YXR1cz09J0wnKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBnZXQgdGhlIG1hcHBpbmcgKi8KKyAgICBjb3VudD1jYXNlRm9sZGluZ3NbY2FzZUZvbGRpbmdDb3VudF0uZnVsbFswXT0KKyAgICAgICAgKFVDaGFyKXVfcGFyc2VTdHJpbmcoZmllbGRzWzJdWzBdLCBjYXNlRm9sZGluZ3NbY2FzZUZvbGRpbmdDb3VudF0uZnVsbCsxLCAzMSwgKHVpbnQzMl90ICopJmNhc2VGb2xkaW5nc1tjYXNlRm9sZGluZ0NvdW50XS5zaW1wbGUsIHBFcnJvckNvZGUpOworICAgIGlmKFVfRkFJTFVSRSgqcEVycm9yQ29kZSkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5jYXNlOiBlcnJvciBwYXJzaW5nIENhc2VGb2xkaW5nLnR4dCBtYXBwaW5nIGF0ICVzXG4iLCBmaWVsZHNbMF1bMF0pOworICAgICAgICBleGl0KCpwRXJyb3JDb2RlKTsKKyAgICB9CisKKyAgICAvKiB0aGVyZSBpcyBhIHNpbXBsZSBtYXBwaW5nIG9ubHkgaWYgdGhlcmUgaXMgZXhhY3RseSBvbmUgY29kZSBwb2ludCAoY291bnQgaXMgaW4gVUNoYXJzKSAqLworICAgIGlmKGNvdW50PT0wIHx8IGNvdW50PjIgfHwgKGNvdW50PT0yICYmIFVURl9JU19TSU5HTEUoY2FzZUZvbGRpbmdzW2Nhc2VGb2xkaW5nQ291bnRdLmZ1bGxbMV0pKSkgeworICAgICAgICBjYXNlRm9sZGluZ3NbY2FzZUZvbGRpbmdDb3VudF0uc2ltcGxlPTA7CisgICAgfQorCisgICAgLyogdXBkYXRlIHRoZSBjYXNlLXNlbnNpdGl2ZSBzZXQgKi8KKyAgICBpZihzdGF0dXMhPSdUJykgeworICAgICAgICB1c2V0X2FkZChjYXNlU2Vuc2l0aXZlLCAoVUNoYXIzMiljYXNlRm9sZGluZ3NbY2FzZUZvbGRpbmdDb3VudF0uY29kZSk7CisgICAgICAgIF9zZXRfYWRkQWxsKGNhc2VTZW5zaXRpdmUsIGNhc2VGb2xkaW5nc1tjYXNlRm9sZGluZ0NvdW50XS5mdWxsKzEsIGNhc2VGb2xkaW5nc1tjYXNlRm9sZGluZ0NvdW50XS5mdWxsWzBdKTsKKyAgICB9CisKKyAgICAvKiBjaGVjayB0aGUgc3RhdHVzICovCisgICAgaWYoc3RhdHVzPT0nUycpIHsKKyAgICAgICAgLyogY2hlY2sgaWYgdGhlcmUgd2FzIGEgZnVsbCBtYXBwaW5nIGZvciB0aGlzIGNvZGUgcG9pbnQgYmVmb3JlICovCisgICAgICAgIGlmKCBjYXNlRm9sZGluZ0NvdW50PjAgJiYKKyAgICAgICAgICAgIGNhc2VGb2xkaW5nc1tjYXNlRm9sZGluZ0NvdW50LTFdLmNvZGU9PWNhc2VGb2xkaW5nc1tjYXNlRm9sZGluZ0NvdW50XS5jb2RlICYmCisgICAgICAgICAgICBjYXNlRm9sZGluZ3NbY2FzZUZvbGRpbmdDb3VudC0xXS5zdGF0dXM9PSdGJworICAgICAgICApIHsKKyAgICAgICAgICAgIC8qIG1lcmdlIHRoZSB0d28gZW50cmllcyAqLworICAgICAgICAgICAgY2FzZUZvbGRpbmdzW2Nhc2VGb2xkaW5nQ291bnQtMV0uc2ltcGxlPWNhc2VGb2xkaW5nc1tjYXNlRm9sZGluZ0NvdW50XS5zaW1wbGU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYoc3RhdHVzPT0nRicpIHsKKyAgICAgICAgLyogY2hlY2sgaWYgdGhlcmUgd2FzIGEgc2ltcGxlIG1hcHBpbmcgZm9yIHRoaXMgY29kZSBwb2ludCBiZWZvcmUgKi8KKyAgICAgICAgaWYoIGNhc2VGb2xkaW5nQ291bnQ+MCAmJgorICAgICAgICAgICAgY2FzZUZvbGRpbmdzW2Nhc2VGb2xkaW5nQ291bnQtMV0uY29kZT09Y2FzZUZvbGRpbmdzW2Nhc2VGb2xkaW5nQ291bnRdLmNvZGUgJiYKKyAgICAgICAgICAgIGNhc2VGb2xkaW5nc1tjYXNlRm9sZGluZ0NvdW50LTFdLnN0YXR1cz09J1MnCisgICAgICAgICkgeworICAgICAgICAgICAgLyogbWVyZ2UgdGhlIHR3byBlbnRyaWVzICovCisgICAgICAgICAgICB1cHJ2X21lbWNweShjYXNlRm9sZGluZ3NbY2FzZUZvbGRpbmdDb3VudC0xXS5mdWxsLCBjYXNlRm9sZGluZ3NbY2FzZUZvbGRpbmdDb3VudF0uZnVsbCwgMzIqVV9TSVpFT0ZfVUNIQVIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfSBlbHNlIGlmKHN0YXR1cz09J0knIHx8IHN0YXR1cz09J1QnKSB7CisgICAgICAgIC8qIGNoZWNrIGlmIHRoZXJlIHdhcyBhIGRlZmF1bHQgbWFwcGluZyBmb3IgdGhpcyBjb2RlIHBvaW50IGJlZm9yZSAocmVtb3ZlIGl0KSAqLworICAgICAgICB3aGlsZShjYXNlRm9sZGluZ0NvdW50PjAgJiYKKyAgICAgICAgICAgICAgY2FzZUZvbGRpbmdzW2Nhc2VGb2xkaW5nQ291bnQtMV0uY29kZT09Y2FzZUZvbGRpbmdzW2Nhc2VGb2xkaW5nQ291bnRdLmNvZGUKKyAgICAgICAgKSB7CisgICAgICAgICAgICBwcmV2Q29kZT0wOworICAgICAgICAgICAgLS1jYXNlRm9sZGluZ0NvdW50OworICAgICAgICB9CisgICAgICAgIC8qIHN0b3JlIG9ubHkgYSBtYXJrZXIgZm9yIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGNhc2VzIGxpa2UgZG90bGVzcyBpICovCisgICAgICAgIGNhc2VGb2xkaW5nc1tjYXNlRm9sZGluZ0NvdW50XS5zaW1wbGU9MDsKKyAgICAgICAgY2FzZUZvbGRpbmdzW2Nhc2VGb2xkaW5nQ291bnRdLmZ1bGxbMF09MDsKKyAgICB9CisKKyAgICAvKiBjaGVjayB0aGF0IHRoZSBjb2RlIHBvaW50cyAoY2FzZUZvbGRpbmdzW2Nhc2VGb2xkaW5nQ291bnRdLmNvZGUpIGFyZSBpbiBhc2NlbmRpbmcgb3JkZXIgKi8KKyAgICBpZihjYXNlRm9sZGluZ3NbY2FzZUZvbGRpbmdDb3VudF0uY29kZTw9cHJldkNvZGUgJiYgY2FzZUZvbGRpbmdzW2Nhc2VGb2xkaW5nQ291bnRdLmNvZGU+MCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbmNhc2U6IGVycm9yIC0gQ2FzZUZvbGRpbmcgZW50cmllcyBvdXQgb2Ygb3JkZXIsIFUrJTA0bHggYWZ0ZXIgVSslMDRseFxuIiwKKyAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyljYXNlRm9sZGluZ3NbY2FzZUZvbGRpbmdDb3VudF0uY29kZSwKKyAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylwcmV2Q29kZSk7CisgICAgICAgICpwRXJyb3JDb2RlPVVfUEFSU0VfRVJST1I7CisgICAgICAgIGV4aXQoVV9QQVJTRV9FUlJPUik7CisgICAgfQorICAgIHByZXZDb2RlPWNhc2VGb2xkaW5nc1tjYXNlRm9sZGluZ0NvdW50XS5jb2RlOworCisgICAgaWYoKytjYXNlRm9sZGluZ0NvdW50PT1NQVhfQ0FTRV9GT0xESU5HX0NPVU5UKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2VuY2FzZTogdG9vIG1hbnkgY2FzZSBmb2xkaW5nIG1hcHBpbmdzXG4iKTsKKyAgICAgICAgKnBFcnJvckNvZGU9VV9JTkRFWF9PVVRPRkJPVU5EU19FUlJPUjsKKyAgICAgICAgZXhpdChVX0lOREVYX09VVE9GQk9VTkRTX0VSUk9SKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitwYXJzZUNhc2VGb2xkaW5nKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBVRXJyb3JDb2RlICpwRXJyb3JDb2RlKSB7CisgICAgY2hhciAqZmllbGRzWzNdWzJdOworCisgICAgaWYocEVycm9yQ29kZT09TlVMTCB8fCBVX0ZBSUxVUkUoKnBFcnJvckNvZGUpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB1X3BhcnNlRGVsaW1pdGVkRmlsZShmaWxlbmFtZSwgJzsnLCBmaWVsZHMsIDMsIGNhc2VGb2xkaW5nTGluZUZuLCBOVUxMLCBwRXJyb3JDb2RlKTsKK30KKworLyogcGFyc2VyIGZvciBVbmljb2RlRGF0YS50eHQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogZ2VuZXJhbCBjYXRlZ29yaWVzICovCitjb25zdCBjaGFyICpjb25zdAorZ2VuQ2F0ZWdvcnlOYW1lc1tVX0NIQVJfQ0FURUdPUllfQ09VTlRdPXsKKyAgICAiQ24iLAorICAgICJMdSIsICJMbCIsICJMdCIsICJMbSIsICJMbyIsICJNbiIsICJNZSIsCisgICAgIk1jIiwgIk5kIiwgIk5sIiwgIk5vIiwKKyAgICAiWnMiLCAiWmwiLCAiWnAiLAorICAgICJDYyIsICJDZiIsICJDbyIsICJDcyIsCisgICAgIlBkIiwgIlBzIiwgIlBlIiwgIlBjIiwgIlBvIiwKKyAgICAiU20iLCAiU2MiLCAiU2siLCAiU28iLAorICAgICJQaSIsICJQZiIKK307CisKK3N0YXRpYyBpbnQzMl90IHNwZWNpYWxDYXNpbmdJbmRleD0wLCBjYXNlRm9sZGluZ0luZGV4PTA7CisKK3N0YXRpYyB2b2lkIFVfQ0FMTENPTlYKK3VuaWNvZGVEYXRhTGluZUZuKHZvaWQgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICBjaGFyICpmaWVsZHNbXVsyXSwgaW50MzJfdCBmaWVsZENvdW50LAorICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSAqcEVycm9yQ29kZSkgeworICAgIFByb3BzIHA7CisgICAgY2hhciAqZW5kOworICAgIHN0YXRpYyBVQ2hhcjMyIHByZXZDb2RlPTA7CisgICAgVUNoYXIzMiB2YWx1ZTsKKyAgICBpbnQzMl90IGk7CisKKyAgICAvKiByZXNldCB0aGUgcHJvcGVydGllcyAqLworICAgIHVwcnZfbWVtc2V0KCZwLCAwLCBzaXplb2YoUHJvcHMpKTsKKworICAgIC8qIGdldCB0aGUgY2hhcmFjdGVyIGNvZGUsIGZpZWxkIDAgKi8KKyAgICBwLmNvZGU9KFVDaGFyMzIpdXBydl9zdHJ0b3VsKGZpZWxkc1swXVswXSwgJmVuZCwgMTYpOworICAgIGlmKGVuZDw9ZmllbGRzWzBdWzBdIHx8IGVuZCE9ZmllbGRzWzBdWzFdKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2VuY2FzZTogc3ludGF4IGVycm9yIGluIGZpZWxkIDAgYXQgJXNcbiIsIGZpZWxkc1swXVswXSk7CisgICAgICAgICpwRXJyb3JDb2RlPVVfUEFSU0VfRVJST1I7CisgICAgICAgIGV4aXQoVV9QQVJTRV9FUlJPUik7CisgICAgfQorCisgICAgLyogZ2V0IGdlbmVyYWwgY2F0ZWdvcnksIGZpZWxkIDIgKi8KKyAgICBpPWdldFRva2VuSW5kZXgoZ2VuQ2F0ZWdvcnlOYW1lcywgVV9DSEFSX0NBVEVHT1JZX0NPVU5ULCBmaWVsZHNbMl1bMF0pOworICAgIGlmKGk+PTApIHsKKyAgICAgICAgcC5nYz0odWludDhfdClpOworICAgIH0gZWxzZSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2VuY2FzZTogdW5rbm93biBnZW5lcmFsIGNhdGVnb3J5IFwiJXNcIiBhdCBjb2RlIDB4JWx4XG4iLAorICAgICAgICAgICAgZmllbGRzWzJdWzBdLCAodW5zaWduZWQgbG9uZylwLmNvZGUpOworICAgICAgICAqcEVycm9yQ29kZT1VX1BBUlNFX0VSUk9SOworICAgICAgICBleGl0KFVfUEFSU0VfRVJST1IpOworICAgIH0KKworICAgIC8qIGdldCBjYW5vbmljYWwgY29tYmluaW5nIGNsYXNzLCBmaWVsZCAzICovCisgICAgdmFsdWU9KFVDaGFyMzIpdXBydl9zdHJ0b3VsKGZpZWxkc1szXVswXSwgJmVuZCwgMTApOworICAgIGlmKGVuZDw9ZmllbGRzWzNdWzBdIHx8IGVuZCE9ZmllbGRzWzNdWzFdIHx8IHZhbHVlPjB4ZmYpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5jYXNlOiBzeW50YXggZXJyb3IgaW4gZmllbGQgMyBhdCAlc1xuIiwgZmllbGRzWzBdWzBdKTsKKyAgICAgICAgKnBFcnJvckNvZGU9VV9QQVJTRV9FUlJPUjsKKyAgICAgICAgZXhpdChVX1BBUlNFX0VSUk9SKTsKKyAgICB9CisgICAgcC5jYz0odWludDhfdCl2YWx1ZTsKKworICAgIC8qIGdldCB1cHBlcmNhc2UgbWFwcGluZywgZmllbGQgMTIgKi8KKyAgICB2YWx1ZT0oVUNoYXIzMil1cHJ2X3N0cnRvdWwoZmllbGRzWzEyXVswXSwgJmVuZCwgMTYpOworICAgIGlmKGVuZCE9ZmllbGRzWzEyXVsxXSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbmNhc2U6IHN5bnRheCBlcnJvciBpbiBmaWVsZCAxMiBhdCBjb2RlIDB4JWx4XG4iLAorICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpcC5jb2RlKTsKKyAgICAgICAgKnBFcnJvckNvZGU9VV9QQVJTRV9FUlJPUjsKKyAgICAgICAgZXhpdChVX1BBUlNFX0VSUk9SKTsKKyAgICB9CisgICAgaWYodmFsdWUhPTAgJiYgdmFsdWUhPXAuY29kZSkgeworICAgICAgICBwLnVwcGVyQ2FzZT12YWx1ZTsKKyAgICAgICAgdXNldF9hZGQoY2FzZVNlbnNpdGl2ZSwgcC5jb2RlKTsKKyAgICAgICAgdXNldF9hZGQoY2FzZVNlbnNpdGl2ZSwgdmFsdWUpOworICAgIH0KKworICAgIC8qIGdldCBsb3dlcmNhc2UgdmFsdWUsIGZpZWxkIDEzICovCisgICAgdmFsdWU9KFVDaGFyMzIpdXBydl9zdHJ0b3VsKGZpZWxkc1sxM11bMF0sICZlbmQsIDE2KTsKKyAgICBpZihlbmQhPWZpZWxkc1sxM11bMV0pIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5jYXNlOiBzeW50YXggZXJyb3IgaW4gZmllbGQgMTMgYXQgY29kZSAweCVseFxuIiwKKyAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKXAuY29kZSk7CisgICAgICAgICpwRXJyb3JDb2RlPVVfUEFSU0VfRVJST1I7CisgICAgICAgIGV4aXQoVV9QQVJTRV9FUlJPUik7CisgICAgfQorICAgIGlmKHZhbHVlIT0wICYmIHZhbHVlIT1wLmNvZGUpIHsKKyAgICAgICAgcC5sb3dlckNhc2U9dmFsdWU7CisgICAgICAgIHVzZXRfYWRkKGNhc2VTZW5zaXRpdmUsIHAuY29kZSk7CisgICAgICAgIHVzZXRfYWRkKGNhc2VTZW5zaXRpdmUsIHZhbHVlKTsKKyAgICB9CisKKyAgICAvKiBnZXQgdGl0bGVjYXNlIHZhbHVlLCBmaWVsZCAxNCAqLworICAgIHZhbHVlPShVQ2hhcjMyKXVwcnZfc3RydG91bChmaWVsZHNbMTRdWzBdLCAmZW5kLCAxNik7CisgICAgaWYoZW5kIT1maWVsZHNbMTRdWzFdKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2VuY2FzZTogc3ludGF4IGVycm9yIGluIGZpZWxkIDE0IGF0IGNvZGUgMHglbHhcbiIsCisgICAgICAgICAgICAodW5zaWduZWQgbG9uZylwLmNvZGUpOworICAgICAgICAqcEVycm9yQ29kZT1VX1BBUlNFX0VSUk9SOworICAgICAgICBleGl0KFVfUEFSU0VfRVJST1IpOworICAgIH0KKyAgICBpZih2YWx1ZSE9MCAmJiB2YWx1ZSE9cC5jb2RlKSB7CisgICAgICAgIHAudGl0bGVDYXNlPXZhbHVlOworICAgICAgICB1c2V0X2FkZChjYXNlU2Vuc2l0aXZlLCBwLmNvZGUpOworICAgICAgICB1c2V0X2FkZChjYXNlU2Vuc2l0aXZlLCB2YWx1ZSk7CisgICAgfQorCisgICAgLyogc2V0IGFkZGl0aW9uYWwgcHJvcGVydGllcyBmcm9tIHByZXZpb3VzbHkgcGFyc2VkIGZpbGVzICovCisgICAgaWYoc3BlY2lhbENhc2luZ0luZGV4PHNwZWNpYWxDYXNpbmdDb3VudCAmJiBwLmNvZGU9PXNwZWNpYWxDYXNpbmdzW3NwZWNpYWxDYXNpbmdJbmRleF0uY29kZSkgeworICAgICAgICBwLnNwZWNpYWxDYXNpbmc9c3BlY2lhbENhc2luZ3Mrc3BlY2lhbENhc2luZ0luZGV4Kys7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcC5zcGVjaWFsQ2FzaW5nPU5VTEw7CisgICAgfQorICAgIGlmKGNhc2VGb2xkaW5nSW5kZXg8Y2FzZUZvbGRpbmdDb3VudCAmJiBwLmNvZGU9PWNhc2VGb2xkaW5nc1tjYXNlRm9sZGluZ0luZGV4XS5jb2RlKSB7CisgICAgICAgIHAuY2FzZUZvbGRpbmc9Y2FzZUZvbGRpbmdzK2Nhc2VGb2xkaW5nSW5kZXgrKzsKKworICAgICAgICAvKiBpZ25vcmUgIkNvbW1vbiIgbWFwcGluZ3MgKHNpbXBsZT09ZnVsbCkgdGhhdCBtYXAgdG8gdGhlIHNhbWUgY29kZSBwb2ludCBhcyB0aGUgcmVndWxhciBsb3dlcmNhc2UgbWFwcGluZyAqLworICAgICAgICBpZiggcC5jYXNlRm9sZGluZy0+c3RhdHVzPT0nQycgJiYKKyAgICAgICAgICAgIHAuY2FzZUZvbGRpbmctPnNpbXBsZT09cC5sb3dlckNhc2UKKyAgICAgICAgKSB7CisgICAgICAgICAgICBwLmNhc2VGb2xkaW5nPU5VTEw7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBwLmNhc2VGb2xkaW5nPU5VTEw7CisgICAgfQorCisgICAgLyogY2hlY2sgZm9yIG5vbi1jaGFyYWN0ZXIgY29kZSBwb2ludHMgKi8KKyAgICBpZigocC5jb2RlJjB4ZmZmZSk9PTB4ZmZmZSB8fCAodWludDMyX3QpKHAuY29kZS0weGZkZDApPDB4MjApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5jYXNlOiBlcnJvciAtIHByb3BlcnRpZXMgZm9yIG5vbi1jaGFyYWN0ZXIgY29kZSBwb2ludCBVKyUwNGx4XG4iLAorICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKXAuY29kZSk7CisgICAgICAgICpwRXJyb3JDb2RlPVVfUEFSU0VfRVJST1I7CisgICAgICAgIGV4aXQoVV9QQVJTRV9FUlJPUik7CisgICAgfQorCisgICAgLyogY2hlY2sgdGhhdCB0aGUgY29kZSBwb2ludHMgKHAuY29kZSkgYXJlIGluIGFzY2VuZGluZyBvcmRlciAqLworICAgIGlmKHAuY29kZTw9cHJldkNvZGUgJiYgcC5jb2RlPjApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5jYXNlOiBlcnJvciAtIFVuaWNvZGVEYXRhIGVudHJpZXMgb3V0IG9mIG9yZGVyLCBVKyUwNGx4IGFmdGVyIFUrJTA0bHhcbiIsCisgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpcC5jb2RlLCAodW5zaWduZWQgbG9uZylwcmV2Q29kZSk7CisgICAgICAgICpwRXJyb3JDb2RlPVVfUEFSU0VfRVJST1I7CisgICAgICAgIGV4aXQoVV9QQVJTRV9FUlJPUik7CisgICAgfQorCisgICAgLyogcHJvcGVydGllcyBmb3IgYSBzaW5nbGUgY29kZSBwb2ludCAqLworICAgIHNldFByb3BzKCZwKTsKKworICAgIHByZXZDb2RlPXAuY29kZTsKK30KKworc3RhdGljIHZvaWQKK3BhcnNlREIoY29uc3QgY2hhciAqZmlsZW5hbWUsIFVFcnJvckNvZGUgKnBFcnJvckNvZGUpIHsKKyAgICBjaGFyICpmaWVsZHNbMTVdWzJdOworICAgIFVDaGFyMzIgc3RhcnQsIGVuZDsKKyAgICBpbnQzMl90IGk7CisKKyAgICBpZihwRXJyb3JDb2RlPT1OVUxMIHx8IFVfRkFJTFVSRSgqcEVycm9yQ29kZSkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHVfcGFyc2VEZWxpbWl0ZWRGaWxlKGZpbGVuYW1lLCAnOycsIGZpZWxkcywgMTUsIHVuaWNvZGVEYXRhTGluZUZuLCBOVUxMLCBwRXJyb3JDb2RlKTsKKworICAgIC8qIGFyZSBhbGwgc3ViLXByb3BlcnRpZXMgY29uc3VtZWQ/ICovCisgICAgaWYoc3BlY2lhbENhc2luZ0luZGV4PHNwZWNpYWxDYXNpbmdDb3VudCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbmNhc2U6IGVycm9yIC0gc29tZSBjb2RlIHBvaW50cyBpbiBTcGVjaWFsQ2FzaW5nLnR4dCBhcmUgbWlzc2luZyBmcm9tIFVuaWNvZGVEYXRhLnR4dFxuIik7CisgICAgICAgICpwRXJyb3JDb2RlPVVfUEFSU0VfRVJST1I7CisgICAgICAgIGV4aXQoVV9QQVJTRV9FUlJPUik7CisgICAgfQorICAgIGlmKGNhc2VGb2xkaW5nSW5kZXg8Y2FzZUZvbGRpbmdDb3VudCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbmNhc2U6IGVycm9yIC0gc29tZSBjb2RlIHBvaW50cyBpbiBDYXNlRm9sZGluZy50eHQgYXJlIG1pc3NpbmcgZnJvbSBVbmljb2RlRGF0YS50eHRcbiIpOworICAgICAgICAqcEVycm9yQ29kZT1VX1BBUlNFX0VSUk9SOworICAgICAgICBleGl0KFVfUEFSU0VfRVJST1IpOworICAgIH0KKworICAgIGlmKFVfRkFJTFVSRSgqcEVycm9yQ29kZSkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvcihpPTA7CisgICAgICAgIDA9PXVzZXRfZ2V0SXRlbShjYXNlU2Vuc2l0aXZlLCBpLCAmc3RhcnQsICZlbmQsIE5VTEwsIDAsIHBFcnJvckNvZGUpICYmIFVfU1VDQ0VTUygqcEVycm9yQ29kZSk7CisgICAgICAgICsraQorICAgICkgeworICAgICAgICBhZGRDYXNlU2Vuc2l0aXZlKHN0YXJ0LCBlbmQpOworICAgIH0KKyAgICBpZigqcEVycm9yQ29kZT09VV9JTkRFWF9PVVRPRkJPVU5EU19FUlJPUikgeworICAgICAgICAqcEVycm9yQ29kZT1VX1pFUk9fRVJST1I7CisgICAgfQorfQorCisvKgorICogSGV5LCBFbWFjcywgcGxlYXNlIHNldCB0aGUgZm9sbG93aW5nOgorICoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIGluZGVudC10YWJzLW1vZGU6IG5pbAorICogRW5kOgorICoKKyAqLwpkaWZmIC0tZ2l0IGEvdW5pY29kZS9jL2dlbmNhc2UvZ2VuY2FzZS5oIGIvdW5pY29kZS9jL2dlbmNhc2UvZ2VuY2FzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhN2MzOGUKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RlL2MvZ2VuY2FzZS9nZW5jYXNlLmgKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgQ29weXJpZ2h0IChDKSAyMDA0LTIwMDksIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMKKyogICBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICBmaWxlIG5hbWU6ICBnZW5jYXNlLmgKKyogICBlbmNvZGluZzogICBVUy1BU0NJSQorKiAgIHRhYiBzaXplOiAgIDggKG5vdCB1c2VkKQorKiAgIGluZGVudGF0aW9uOjQKKyoKKyogICBjcmVhdGVkIG9uOiAyMDA0YXVnMjgKKyogICBjcmVhdGVkIGJ5OiBNYXJrdXMgVy4gU2NoZXJlcgorKi8KKworI2lmbmRlZiBfX0dFTkNBU0VfSF9fCisjZGVmaW5lIF9fR0VOQ0FTRV9IX18KKworI2luY2x1ZGUgInVuaWNvZGUvdXR5cGVzLmgiCisjaW5jbHVkZSAidXRyaWUuaCIKKyNpbmNsdWRlICJwcm9wc3ZlYy5oIgorI2luY2x1ZGUgInVjYXNlLmgiCisKK1VfQ0RFQ0xfQkVHSU4KKworLyogVW5pY29kZSB2ZXJzaW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworZW51bSB7CisgICAgVU5JXzFfMCwKKyAgICBVTklfMV8xLAorICAgIFVOSV8yXzAsCisgICAgVU5JXzNfMCwKKyAgICBVTklfM18xLAorICAgIFVOSV8zXzIsCisgICAgVU5JXzRfMCwKKyAgICBVTklfNF8wXzEsCisgICAgVU5JXzRfMSwKKyAgICBVTklfNV8xLAorICAgIFVOSV81XzIsCisgICAgVU5JXzZfMCwKKyAgICBVTklfVkVSX0NPVU5UCit9OworCitleHRlcm4gaW50MzJfdCB1Y2RWZXJzaW9uOworCisvKiBnZW5jYXNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIFVHRU5DQVNFX0VYQ19TSElGVCAgICAgMTYKKyNkZWZpbmUgVUdFTkNBU0VfRVhDX01BU0sgICAgICAweGZmZmYwMDAwCisKKy8qCisgKiBWYWx1ZXMgZm9yIHRoZSB1Y2FzZS5pY3UgdW5mb2xkW10gZGF0YSBhcnJheSwgc2VlIHN0b3JlLmMuCisgKiBUaGUgdmFsdWVzIGFyZSBzdG9yZWQgaW4gdWNhc2UuaWN1IHNvIHRoYXQgdGhlIHJ1bnRpbWUgY29kZSB3aWxsIHdvcmsgd2l0aAorICogY2hhbmdpbmcgdmFsdWVzLCBidXQgdGhleSBhcmUgaGFyZGNvZGVkIGZvciBnZW5jYXNlIGZvciBzaW1wbGljaXR5LgorICogVGhleSBhcmUgb3B0aW1pemVkLCB0aGF0IGlzLCBwcm92aWRlIGZvciBtaW5pbWFsIHRhYmxlIGNvbHVtbiB3aWR0aHMsCisgKiBmb3IgdGhlIGFjdHVhbCBVbmljb2RlIGRhdGEsIHNvIHRoYXQgdGhlIHRhYmxlIHNpemUgaXMgbWluaW1pemVkLgorICogRnV0dXJlIHZlcnNpb25zIG9mIFVuaWNvZGUgbWF5IHJlcXVpcmUgaW5jcmVhc2VzIG9mIHNvbWUgb2YgdGhlc2UgdmFsdWVzLgorICovCitlbnVtIHsKKyAgICBVR0VOQ0FTRV9VTkZPTERfU1RSSU5HX1dJRFRIPTMsCisgICAgVUdFTkNBU0VfVU5GT0xEX0NQX1dJRFRIPTIsCisgICAgVUdFTkNBU0VfVU5GT0xEX1dJRFRIPVVHRU5DQVNFX1VORk9MRF9TVFJJTkdfV0lEVEgrVUdFTkNBU0VfVU5GT0xEX0NQX1dJRFRILAorICAgIFVHRU5DQVNFX1VORk9MRF9NQVhfUk9XUz0yNTAKK307CisKKy8qIFZhbHVlcyBmb3IgYWRkaXRpb25hbCBkYXRhIHN0b3JlZCBpbiBwdiBjb2x1bW4gMSAqLworZW51bSB7CisgICAgVUdFTkNBU0VfSVNfTUlEX0xFVFRFUl9TSElGVCAgICAgICAgLyogYml0IDAgIFdCPU1pZExldHRlciBvciBXQj1NaWROdW1MZXQgKi8KK307CisKKy8qIHNwZWNpYWwgY2FzaW5nIGRhdGEgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBVQ2hhcjMyIGNvZGU7CisgICAgVUJvb2wgaXNDb21wbGV4OworICAgIFVDaGFyIGxvd2VyQ2FzZVszMl0sIHVwcGVyQ2FzZVszMl0sIHRpdGxlQ2FzZVszMl07Cit9IFNwZWNpYWxDYXNpbmc7CisKKy8qIGNhc2UgZm9sZGluZyBkYXRhICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgVUNoYXIzMiBjb2RlLCBzaW1wbGU7CisgICAgY2hhciBzdGF0dXM7CisgICAgVUNoYXIgZnVsbFszMl07Cit9IENhc2VGb2xkaW5nOworCisvKiBjYXNlIG1hcHBpbmcgcHJvcGVydGllcyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFVDaGFyMzIgY29kZSwgbG93ZXJDYXNlLCB1cHBlckNhc2UsIHRpdGxlQ2FzZTsKKyAgICBVQ2hhcjMyIGNsb3N1cmVbOF07CisgICAgU3BlY2lhbENhc2luZyAqc3BlY2lhbENhc2luZzsKKyAgICBDYXNlRm9sZGluZyAqY2FzZUZvbGRpbmc7CisgICAgdWludDhfdCBnYywgY2M7CisgICAgVUJvb2wgaXNDYXNlSWdub3JhYmxlOworfSBQcm9wczsKKworLyogZ2xvYmFsIGZsYWdzICovCitleHRlcm4gVUJvb2wgYmVWZXJib3NlLCBoYXZlQ29weXJpZ2h0OworCisvKiBwcm9wZXJ0aWVzIHZlY3RvcnMgaW4gZ2VuY2FzZS5jICovCitleHRlcm4gVVByb3BzVmVjdG9ycyAqcHY7CisKKy8qIHByb3RvdHlwZXMgKi8KK1VfQ0ZVTkMgdm9pZAord3JpdGVVQ0RGaWxlbmFtZShjaGFyICpiYXNlbmFtZSwgY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKnN1ZmZpeCk7CisKK1VfQ0ZVTkMgVUJvb2wKK2lzVG9rZW4oY29uc3QgY2hhciAqdG9rZW4sIGNvbnN0IGNoYXIgKnMpOworCitleHRlcm4gdm9pZAorc2V0VW5pY29kZVZlcnNpb24oY29uc3QgY2hhciAqdik7CisKK2V4dGVybiB2b2lkCitzZXRQcm9wcyhQcm9wcyAqcCk7CisKK1VfQ0ZVTkMgdWludDMyX3QgVV9FWFBPUlQyCitnZXRGb2xkZWRQcm9wc1ZhbHVlKFVOZXdUcmllICp0cmllLCBVQ2hhcjMyIHN0YXJ0LCBpbnQzMl90IG9mZnNldCk7CisKK2V4dGVybiB2b2lkCithZGRDYXNlU2Vuc2l0aXZlKFVDaGFyMzIgZmlyc3QsIFVDaGFyMzIgbGFzdCk7CisKK2V4dGVybiB2b2lkCittYWtlQ2FzZUNsb3N1cmUodm9pZCk7CisKK2V4dGVybiB2b2lkCittYWtlRXhjZXB0aW9ucyh2b2lkKTsKKworZXh0ZXJuIHZvaWQKK2dlbmVyYXRlRGF0YShjb25zdCBjaGFyICpkYXRhRGlyLCBVQm9vbCBjc291cmNlKTsKKworVV9DREVDTF9FTkQKKworI2VuZGlmCmRpZmYgLS1naXQgYS91bmljb2RlL2MvZ2VuY2FzZS9nZW5jYXNlLnZjcHJvaiBiL3VuaWNvZGUvYy9nZW5jYXNlL2dlbmNhc2UudmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxYzRlYjIKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RlL2MvZ2VuY2FzZS9nZW5jYXNlLnZjcHJvagpAQCAtMCwwICsxLDQyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+Cis8VmlzdWFsU3R1ZGlvUHJvamVjdAorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIgorCVZlcnNpb249IjkuMDAiCisJTmFtZT0iZ2VuY2FzZSIKKwlQcm9qZWN0R1VJRD0ie0RCMzEyQTQ5LTEyQTktNEUwNy05RTk2LTQ1MURDMkQ4RkY2MX0iCisJVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj0iMTMxMDcyIgorCT4KKwk8UGxhdGZvcm1zPgorCQk8UGxhdGZvcm0KKwkJCU5hbWU9IldpbjMyIgorCQkvPgorCQk8UGxhdGZvcm0KKwkJCU5hbWU9Ing2NCIKKwkJLz4KKwk8L1BsYXRmb3Jtcz4KKwk8VG9vbEZpbGVzPgorCTwvVG9vbEZpbGVzPgorCTxDb25maWd1cmF0aW9ucz4KKwkJPENvbmZpZ3VyYXRpb24KKwkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5ceDg2XFJlbGVhc2UiCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5ceDg2XFJlbGVhc2UiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSIKKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyIKKwkJCVVzZU9mTUZDPSIwIgorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIgorCQkJQ2hhcmFjdGVyU2V0PSIyIgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkJQ29tbWFuZExpbmU9ImNvcHkgJnF1b3Q7JChUYXJnZXRQYXRoKSZxdW90OyAuLlwuLlwuLlxiaW4mI3gwRDsmI3gwQTsiCisJCQkJT3V0cHV0cz0iLi5cLi5cLi5cYmluXCQoVGFyZ2V0RmlsZU5hbWUpIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiCisJCQkJVHlwZUxpYnJhcnlOYW1lPSIuXHg4NlxSZWxlYXNlL2dlbmNhc2UudGxiIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlxjb21tb247Li5cdG9vbHV0aWwiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO05ERUJVRztfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUiCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSIKKwkJCQlSdW50aW1lTGlicmFyeT0iMiIKKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSIKKwkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJ0cnVlIgorCQkJCVRyZWF0V0NoYXJfdEFzQnVpbHRJblR5cGU9InRydWUiCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXHg4NlxSZWxlYXNlL2dlbmNhc2UucGNoIgorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlx4ODZcUmVsZWFzZS8iCisJCQkJT2JqZWN0RmlsZT0iLlx4ODZcUmVsZWFzZS8iCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5ceDg2XFJlbGVhc2UvIgorCQkJCVdhcm5pbmdMZXZlbD0iMyIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJQ29tcGlsZUFzPSIwIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciCisJCQkJQ3VsdHVyZT0iMTAzMyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKKwkJCQlPdXRwdXRGaWxlPSIuXHg4NlxSZWxlYXNlL2dlbmNhc2UuZXhlIgorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlx4ODZcUmVsZWFzZS9nZW5jYXNlLnBkYiIKKwkJCQlTdWJTeXN0ZW09IjEiCisJCQkJUmFuZG9taXplZEJhc2VBZGRyZXNzPSIxIgorCQkJCURhdGFFeGVjdXRpb25QcmV2ZW50aW9uPSIwIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5ceDg2XERlYnVnIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXHg4NlxEZWJ1ZyIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIgorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIgorCQkJVXNlT2ZNRkM9IjAiCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiCisJCQlDaGFyYWN0ZXJTZXQ9IjIiCisJCQk+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCQlDb21tYW5kTGluZT0iY29weSAmcXVvdDskKFRhcmdldFBhdGgpJnF1b3Q7IC4uXC4uXC4uXGJpbiYjeDBEOyYjeDBBOyIKKwkJCQlPdXRwdXRzPSIuLlwuLlwuLlxiaW5cJChUYXJnZXRGaWxlTmFtZSkiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCQlUeXBlTGlicmFyeU5hbWU9Ii5ceDg2XERlYnVnL2dlbmNhc2UudGxiIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlPcHRpbWl6YXRpb249IjAiCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cY29tbW9uOy4uXHRvb2x1dGlsIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtfREVCVUc7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIgorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyIKKwkJCQlSdW50aW1lTGlicmFyeT0iMyIKKwkJCQlCdWZmZXJTZWN1cml0eUNoZWNrPSJ0cnVlIgorCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9InRydWUiCisJCQkJVHJlYXRXQ2hhcl90QXNCdWlsdEluVHlwZT0idHJ1ZSIKKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5ceDg2XERlYnVnL2dlbmNhc2UucGNoIgorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlx4ODZcRGVidWcvIgorCQkJCU9iamVjdEZpbGU9Ii5ceDg2XERlYnVnLyIKKwkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlx4ODZcRGVidWcvIgorCQkJCUJyb3dzZUluZm9ybWF0aW9uPSIxIgorCQkJCVdhcm5pbmdMZXZlbD0iMyIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iNCIKKwkJCQlDb21waWxlQXM9IjAiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyIKKwkJCQlDdWx0dXJlPSIxMDMzIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIgorCQkJCU91dHB1dEZpbGU9Ii5ceDg2XERlYnVnL2dlbmNhc2UuZXhlIgorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMiIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIgorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5ceDg2XERlYnVnL2dlbmNhc2UucGRiIgorCQkJCVN1YlN5c3RlbT0iMSIKKwkJCQlSYW5kb21pemVkQmFzZUFkZHJlc3M9IjEiCisJCQkJRGF0YUV4ZWN1dGlvblByZXZlbnRpb249IjAiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIgorCQkJCVVzZUZBVDMyV29ya2Fyb3VuZD0idHJ1ZSIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iUmVsZWFzZXx4NjQiCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5ceDY0XFJlbGVhc2UiCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5ceDY0XFJlbGVhc2UiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSIKKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyIKKwkJCVVzZU9mTUZDPSIwIgorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIgorCQkJQ2hhcmFjdGVyU2V0PSIyIgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkJQ29tbWFuZExpbmU9ImNvcHkgJnF1b3Q7JChUYXJnZXRQYXRoKSZxdW90OyAuLlwuLlwuLlxiaW42NCYjeDBEOyYjeDBBOyIKKwkJCQlPdXRwdXRzPSIuLlwuLlwuLlxiaW42NFwkKFRhcmdldEZpbGVOYW1lKSIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIgorCQkJCVRhcmdldEVudmlyb25tZW50PSIzIgorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iLlx4NjRcUmVsZWFzZS9nZW5jYXNlLnRsYiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cY29tbW9uOy4uXHRvb2x1dGlsIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU42NDtXSU4zMjtOREVCVUc7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIgorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiCisJCQkJUnVudGltZUxpYnJhcnk9IjIiCisJCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9InRydWUiCisJCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0idHJ1ZSIKKwkJCQlUcmVhdFdDaGFyX3RBc0J1aWx0SW5UeXBlPSJ0cnVlIgorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlx4NjRcUmVsZWFzZS9nZW5jYXNlLnBjaCIKKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5ceDY0XFJlbGVhc2UvIgorCQkJCU9iamVjdEZpbGU9Ii5ceDY0XFJlbGVhc2UvIgorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXHg2NFxSZWxlYXNlLyIKKwkJCQlXYXJuaW5nTGV2ZWw9IjMiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCUNvbXBpbGVBcz0iMCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIgorCQkJCUN1bHR1cmU9IjEwMzMiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiCisJCQkJT3V0cHV0RmlsZT0iLlx4NjRcUmVsZWFzZS9nZW5jYXNlLmV4ZSIKKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5ceDY0XFJlbGVhc2UvZ2VuY2FzZS5wZGIiCisJCQkJU3ViU3lzdGVtPSIxIgorCQkJCVRhcmdldE1hY2hpbmU9IjE3IgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCTwvQ29uZmlndXJhdGlvbj4KKwkJPENvbmZpZ3VyYXRpb24KKwkJCU5hbWU9IkRlYnVnfHg2NCIKKwkJCU91dHB1dERpcmVjdG9yeT0iLlx4NjRcRGVidWciCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5ceDY0XERlYnVnIgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiCisJCQlVc2VPZk1GQz0iMCIKKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIKKwkJCUNoYXJhY3RlclNldD0iMiIKKwkJCT4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJCUNvbW1hbmRMaW5lPSJjb3B5ICZxdW90OyQoVGFyZ2V0UGF0aCkmcXVvdDsgLi5cLi5cLi5cYmluNjQmI3gwRDsmI3gwQTsiCisJCQkJT3V0cHV0cz0iLi5cLi5cLi5cYmluNjRcJChUYXJnZXRGaWxlTmFtZSkiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMyIKKwkJCQlUeXBlTGlicmFyeU5hbWU9Ii5ceDY0XERlYnVnL2dlbmNhc2UudGxiIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlPcHRpbWl6YXRpb249IjAiCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cY29tbW9uOy4uXHRvb2x1dGlsIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU42NDtXSU4zMjtfREVCVUc7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIgorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyIKKwkJCQlSdW50aW1lTGlicmFyeT0iMyIKKwkJCQlCdWZmZXJTZWN1cml0eUNoZWNrPSJ0cnVlIgorCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9InRydWUiCisJCQkJVHJlYXRXQ2hhcl90QXNCdWlsdEluVHlwZT0idHJ1ZSIKKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5ceDY0XERlYnVnL2dlbmNhc2UucGNoIgorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlx4NjRcRGVidWcvIgorCQkJCU9iamVjdEZpbGU9Ii5ceDY0XERlYnVnLyIKKwkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlx4NjRcRGVidWcvIgorCQkJCUJyb3dzZUluZm9ybWF0aW9uPSIxIgorCQkJCVdhcm5pbmdMZXZlbD0iMyIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyIKKwkJCQlDb21waWxlQXM9IjAiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyIKKwkJCQlDdWx0dXJlPSIxMDMzIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIgorCQkJCU91dHB1dEZpbGU9Ii5ceDY0XERlYnVnL2dlbmNhc2UuZXhlIgorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMiIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIgorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5ceDY0XERlYnVnL2dlbmNhc2UucGRiIgorCQkJCVN1YlN5c3RlbT0iMSIKKwkJCQlUYXJnZXRNYWNoaW5lPSIxNyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiCisJCQkJVXNlRkFUMzJXb3JrYXJvdW5kPSJ0cnVlIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCTwvQ29uZmlndXJhdGlvbnM+CisJPFJlZmVyZW5jZXM+CisJPC9SZWZlcmVuY2VzPgorCTxGaWxlcz4KKwkJPEZpbHRlcgorCQkJTmFtZT0iU291cmNlIEZpbGVzIgorCQkJRmlsdGVyPSJjO2NwcDtyYyIKKwkJCT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGdlbmNhc2UuYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxzdG9yZS5jIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJPC9GaWx0ZXI+CisJCTxGaWx0ZXIKKwkJCU5hbWU9IkhlYWRlciBGaWxlcyIKKwkJCUZpbHRlcj0iaCIKKwkJCT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGdlbmNhc2UuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCTwvRmlsdGVyPgorCQk8RmlsdGVyCisJCQlOYW1lPSJSZXNvdXJjZSBGaWxlcyIKKwkJCUZpbHRlcj0iaWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO3JncztnaWY7anBnO2pwZWc7anBlIgorCQkJPgorCQk8L0ZpbHRlcj4KKwk8L0ZpbGVzPgorCTxHbG9iYWxzPgorCTwvR2xvYmFscz4KKzwvVmlzdWFsU3R1ZGlvUHJvamVjdD4KZGlmZiAtLWdpdCBhL3VuaWNvZGUvYy9nZW5jYXNlL3N0b3JlLmMgYi91bmljb2RlL2MvZ2VuY2FzZS9zdG9yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MzkwNDIKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RlL2MvZ2VuY2FzZS9zdG9yZS5jCkBAIC0wLDAgKzEsMTE5OCBAQAorLyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcworKiAgIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgIGZpbGUgbmFtZTogIHN0b3JlLmMKKyogICBlbmNvZGluZzogICBVUy1BU0NJSQorKiAgIHRhYiBzaXplOiAgIDggKG5vdCB1c2VkKQorKiAgIGluZGVudGF0aW9uOjQKKyoKKyogICBjcmVhdGVkIG9uOiAyMDA0YXVnMjgKKyogICBjcmVhdGVkIGJ5OiBNYXJrdXMgVy4gU2NoZXJlcgorKgorKiAgIFN0b3JlIFVuaWNvZGUgY2FzZSBtYXBwaW5nIHByb3BlcnRpZXMgZWZmaWNpZW50bHkgZm9yCisqICAgcmFuZG9tIGFjY2Vzcy4KKyovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgInVuaWNvZGUvdXR5cGVzLmgiCisjaW5jbHVkZSAidW5pY29kZS91Y2hhci5oIgorI2luY2x1ZGUgInVuaWNvZGUvdXN0cmluZy5oIgorI2luY2x1ZGUgImNtZW1vcnkuaCIKKyNpbmNsdWRlICJjc3RyaW5nLmgiCisjaW5jbHVkZSAiZmlsZXN0cm0uaCIKKyNpbmNsdWRlICJ1dHJpZTIuaCIKKyNpbmNsdWRlICJ1YXJyc29ydC5oIgorI2luY2x1ZGUgInVuaWNvZGUvdWRhdGEuaCIKKyNpbmNsdWRlICJ1bmV3ZGF0YS5oIgorI2luY2x1ZGUgInByb3BzdmVjLmgiCisjaW5jbHVkZSAid3JpdGVzcmMuaCIKKyNpbmNsdWRlICJnZW5jYXNlLmgiCisKKyNkZWZpbmUgTEVOR1RIT0YoYXJyYXkpIChpbnQzMl90KShzaXplb2YoYXJyYXkpL3NpemVvZigoYXJyYXkpWzBdKSkKKworLyogVW5pY29kZSBjYXNlIG1hcHBpbmcgcHJvcGVydGllcyBmaWxlIGZvcm1hdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGZpbGUgZm9ybWF0IHByZXBhcmVkIGFuZCB3cml0dGVuIGhlcmUgY29udGFpbnMgc2V2ZXJhbCBkYXRhCitzdHJ1Y3R1cmVzIHRoYXQgc3RvcmUgaW5kZXhlcyBvciBkYXRhLgorCitCZWZvcmUgdGhlIGRhdGEgY29udGVudHMgZGVzY3JpYmVkIGJlbG93LCB0aGVyZSBhcmUgdGhlIGhlYWRlcnMgcmVxdWlyZWQgYnkKK3RoZSB1ZGF0YSBBUEkgZm9yIGxvYWRpbmcgSUNVIGRhdGEuIEVzcGVjaWFsbHksIGEgVURhdGFJbmZvIHN0cnVjdHVyZQorcHJlY2VkZXMgdGhlIGFjdHVhbCBkYXRhLiBJdCBjb250YWlucyBwbGF0Zm9ybSBwcm9wZXJ0aWVzIHZhbHVlcyBhbmQgdGhlCitmaWxlIGZvcm1hdCB2ZXJzaW9uLgorCitUaGUgZm9sbG93aW5nIGlzIGEgZGVzY3JpcHRpb24gb2YgZm9ybWF0IHZlcnNpb24gMi4wIC4KKworRm9ybWF0IHZlcnNpb24gMS4xIGFkZHMgZGF0YSBmb3IgY2FzZSBjbG9zdXJlLgorCitGb3JtYXQgdmVyc2lvbiAxLjIgYWRkcyBhbiBleGNlcHRpb24gYml0IGZvciBjYXNlLWlnbm9yYWJsZS4gTmVlZGVkIGJlY2F1c2UKK3RoZSBDYXNlZCBhbmQgQ2FzZV9JZ25vcmFibGUgcHJvcGVydGllcyBhcmUgbm90IGRpc2pvaW50LgorCitGb3JtYXQgdmVyc2lvbiAyLjAgY2hhbmdlcyBmcm9tIFVUcmllIHRvIFVUcmllMi4KKworVGhlIGZpbGUgY29udGFpbnMgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmVzOgorCisgICAgY29uc3QgaW50MzJfdCBpbmRleGVzW2kwXSB3aXRoIHZhbHVlcyBpMCwgaTEsIC4uLjoKKyAgICAoc2VlIFVDQVNFX0lYXy4uLiBjb25zdGFudHMgZm9yIG5hbWVzIG9mIGluZGV4ZXMpCisKKyAgICBpMCBpbmRleExlbmd0aDsgLS0gbGVuZ3RoIG9mIGluZGV4ZXNbXSAoVUNBU0VfSVhfVE9QKQorICAgIGkxIGRhdGFMZW5ndGg7IC0tIGxlbmd0aCBpbiBieXRlcyBvZiB0aGUgcG9zdC1oZWFkZXIgZGF0YSAoaW5jbC4gaW5kZXhlc1tdKQorICAgIGkyIHRyaWVTaXplOyAtLSBzaXplIGluIGJ5dGVzIG9mIHRoZSBjYXNlIG1hcHBpbmcgcHJvcGVydGllcyB0cmllCisgICAgaTMgZXhjZXB0aW9uc0xlbmd0aDsgLS0gbGVuZ3RoIGluIHVpbnQxNl90IG9mIHRoZSBleGNlcHRpb25zIGFycmF5CisgICAgaTQgdW5mb2xkTGVuZ3RoOyAtLSBsZW5ndGggaW4gdWludDE2X3Qgb2YgdGhlIHJldmVyc2UtZm9sZGluZyBhcnJheSAobmV3IGluIGZvcm1hdCB2ZXJzaW9uIDEuMSkKKworICAgIGk1Li5pMTQgcmVzZXJ2ZWRJbmRleGVzOyAtLSByZXNlcnZlZCB2YWx1ZXM7IDAgZm9yIG5vdworCisgICAgaTE1IG1heEZ1bGxMZW5ndGg7IC0tIG1heGltdW0gbGVuZ3RoIG9mIGEgZnVsbCBjYXNlIG1hcHBpbmcvZm9sZGluZyBzdHJpbmcKKworCisgICAgU2VyaWFsaXplZCB0cmllLCBzZWUgdXRyaWUyLmg7CisKKyAgICBjb25zdCB1aW50MTZfdCBleGNlcHRpb25zW2V4Y2VwdGlvbnNMZW5ndGhdOworCisgICAgY29uc3QgVUNoYXIgdW5mb2xkW3VuZm9sZExlbmd0aF07CisKKworVHJpZSBkYXRhIHdvcmQ6CitCaXRzCitpZihleGNlcHRpb24pIHsKKyAgICAxNS4uNCAgIHVuc2lnbmVkIGV4Y2VwdGlvbiBpbmRleAorfSBlbHNlIHsKKyAgICBpZihub3QgdW5jYXNlZCkgeworICAgICAgICAxNS4uNiAgIHNpZ25lZCBkZWx0YSB0byBzaW1wbGUgY2FzZSBtYXBwaW5nIGNvZGUgcG9pbnQKKyAgICAgICAgICAgICAgICAoYWRkIGRlbHRhIHRvIGlucHV0IGNvZGUgcG9pbnQpCisgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIDYgICB0aGUgY29kZSBwb2ludCBpcyBjYXNlLWlnbm9yYWJsZQorICAgICAgICAgICAgICAgIChVKzAzMDcgaXMgYWxzbyBjYXNlLWlnbm9yYWJsZSBidXQgaGFzIGFuIGV4Y2VwdGlvbikKKyAgICB9CisgICAgIDUuLjQgICAwIG5vcm1hbCBjaGFyYWN0ZXIgd2l0aCBjYz0wCisgICAgICAgICAgICAxIHNvZnQtZG90dGVkIGNoYXJhY3RlcgorICAgICAgICAgICAgMiBjYz0yMzAKKyAgICAgICAgICAgIDMgb3RoZXIgY2MKK30KKyAgICAzICAgZXhjZXB0aW9uCisgICAgMiAgIGNhc2Ugc2Vuc2l0aXZlCisgMS4uMCAgIDAgdW5jYXNlZAorICAgICAgICAxIGxvd2VyY2FzZQorICAgICAgICAyIHVwcGVyY2FzZQorICAgICAgICAzIHRpdGxlY2FzZQorCisKK0V4Y2VwdGlvbnM6CitBIHN1Yi1hcnJheSBvZiB0aGUgZXhjZXB0aW9ucyBhcnJheSBpcyBpbmRleGVkIGJ5IHRoZSBleGNlcHRpb24gaW5kZXggaW4gYQordHJpZSB3b3JkLgorVGhlIHN1Yi1hcnJheSBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGZpZWxkczoKKyAgICB1aW50MTZfdCBleGNXb3JkOworICAgIHVpbnQxNl90IG9wdGlvbmFsIHZhbHVlcyBbXTsKKyAgICBVVEYtMTYgc3RyaW5ncyBmb3IgZnVsbCAoc3RyaW5nKSBtYXBwaW5ncyBmb3IgbG93ZXJjYXNlLCBjYXNlIGZvbGRpbmcsIHVwcGVyY2FzZSwgdGl0bGVjYXNlCisKK2V4Y1dvcmQ6IChzZWUgVUNBU0VfRVhDXy4uLikKK0JpdHMKKyAgICAxNSAgY29uZGl0aW9uYWwgY2FzZSBmb2xkaW5nCisgICAgMTQgIGNvbmRpdGlvbmFsIHNwZWNpYWwgY2FzaW5nCisxMy4uMTIgIHNhbWUgYXMgbm9uLWV4Y2VwdGlvbiB0cmllIGRhdGEgYml0cyA1Li40CisgICAgICAgIG1vdmVkIGhlcmUgYmVjYXVzZSB0aGUgZXhjZXB0aW9uIGluZGV4IG5lZWRzIG1vcmUgYml0cyB0aGFuIHRoZSBkZWx0YQorICAgICAgICAwIG5vcm1hbCBjaGFyYWN0ZXIgd2l0aCBjYz0wCisgICAgICAgIDEgc29mdC1kb3R0ZWQgY2hhcmFjdGVyCisgICAgICAgIDIgY2M9MjMwCisgICAgICAgIDMgb3RoZXIgY2MKKzExICAgICAgY2FzZS1pZ25vcmFibGUgKHVzZWQgd2hlbiB0aGUgY2hhcmFjdGVyIGlzIGNhc2VkIG9yIGhhcyBhbm90aGVyIGV4Y2VwdGlvbikKKyAgICAgICAgKG5ldyBpbiBmb3JtYXRWZXJzaW9uIDEuMi9JQ1UgNC40KQorMTAuLiA5ICByZXNlcnZlZAorICAgICA4ICBpZiBzZXQsIHRoZW4gZm9yIGVhY2ggb3B0aW9uYWwtdmFsdWUgc2xvdCB0aGVyZSBhcmUgMiB1aW50MTZfdCB2YWx1ZXMKKyAgICAgICAgKGhpZ2ggYW5kIGxvdyBwYXJ0cyBvZiAzMi1iaXQgdmFsdWVzKQorICAgICAgICBpbnN0ZWFkIG9mIHNpbmdsZSBvbmVzCisgNy4uIDAgIGJpdHMgZm9yIHdoaWNoIG9wdGlvbmFsIHZhbHVlIGlzIHByZXNlbnQKKworT3B0aW9uYWwtdmFsdWUgc2xvdHM6CiswICAgbG93ZXJjYXNlIG1hcHBpbmcgKGNvZGUgcG9pbnQpCisxICAgY2FzZSBmb2xkaW5nIChjb2RlIHBvaW50KQorMiAgIHVwcGVyY2FzZSBtYXBwaW5nIChjb2RlIHBvaW50KQorMyAgIHRpdGxlY2FzZSBtYXBwaW5nIChjb2RlIHBvaW50KQorNCAgIHJlc2VydmVkCis1ICAgcmVzZXJ2ZWQKKzYgICBjbG9zdXJlIG1hcHBpbmdzIChuZXcgaW4gZm9ybWF0IHZlcnNpb24gMS4xKQorNyAgIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBmdWxsIChzdHJpbmcpIGNhc2UgbWFwcGluZworICAgIHRoZSBsZW5ndGggb2YgZWFjaCBpcyBlbmNvZGVkIGluIGEgbmliYmxlIG9mIHRoaXMgb3B0aW9uYWwgdmFsdWUsCisgICAgYW5kIHRoZSBzdHJpbmdzIGZvbGxvdyB0aGlzIG9wdGlvbmFsIHZhbHVlIGluIHRoZSBzYW1lIG9yZGVyOgorICAgIGxvd2VyL2ZvbGQvdXBwZXIvdGl0bGUKKworVGhlIG9wdGlvbmFsIGNsb3N1cmUgbWFwcGluZ3MgdmFsdWUgaXMgdXNlZCBhcyBmb2xsb3dzOgorQml0cyAwLi4zIGNvbnRhaW4gdGhlIGxlbmd0aCBvZiBhIHN0cmluZyBvZiBjb2RlIHBvaW50cyBmb3IgY2FzZSBjbG9zdXJlLgorVGhlIHN0cmluZyBpbW1lZGlhdGVseSBmb2xsb3dzIHRoZSBmdWxsIGNhc2UgbWFwcGluZ3MsIG9yIHRoZSBjbG9zdXJlIHZhbHVlCitzbG90IGlmIHRoZXJlIGFyZSBubyBmdWxsIGNhc2UgbWFwcGluZ3MuCitCaXRzIDQuLjE1IGFyZSByZXNlcnZlZCBhbmQgY291bGQgYmUgdXNlZCBpbiB0aGUgZnV0dXJlIHRvIGluZGljYXRlIHRoZQorbnVtYmVyIG9mIHN0cmluZ3MgZm9yIGNhc2UgY2xvc3VyZS4KK0NvbXBsZXRlIGNhc2UgY2xvc3VyZSBmb3IgYSBjb2RlIHBvaW50IGlzIGdpdmVuIGJ5IHRoZSB1bmlvbiBvZiBhbGwgc2ltcGxlCithbmQgZnVsbCBjYXNlIG1hcHBpbmdzIGFuZCBmb2xkaW5ncywgcGx1cyB0aGUgY2FzZSBjbG9zdXJlIGNvZGUgcG9pbnRzCisoYW5kIHBvdGVudGlhbGx5LCBpbiB0aGUgZnV0dXJlLCBjYXNlIGNsb3N1cmUgc3RyaW5ncykuCisKK0ZvciBzcGFjZSBzYXZpbmcsIHNvbWUgdmFsdWVzIGFyZSBub3Qgc3RvcmVkLiBMb29rdXBzIGFyZSBhcyBmb2xsb3dzOgorLSBJZiBzcGVjaWFsIGNhc2luZyBpcyBjb25kaXRpb25hbCwgdGhlbiBubyBmdWxsIGxvd2VyL3VwcGVyL3RpdGxlIG1hcHBpbmcKKyAgc3RyaW5ncyBhcmUgc3RvcmVkLgorLSBJZiBjYXNlIGZvbGRpbmcgaXMgY29uZGl0aW9uYWwsIHRoZW4gbm8gc2ltcGxlIG9yIGZ1bGwgY2FzZSBmb2xkaW5ncyBhcmUKKyAgc3RvcmVkLgorLSBGYWxsIGJhY2sgaW4gdGhpcyBvcmRlcjoKKyAgICBmdWxsIChzdHJpbmcpIG1hcHBpbmcgLS0gaWYgZnVsbCBtYXBwaW5ncyBhcmUgdXNlZAorICAgIHNpbXBsZSAoY29kZSBwb2ludCkgbWFwcGluZyBvZiB0aGUgc2FtZSB0eXBlCisgICAgc2ltcGxlIGZvbGQtPnNpbXBsZSBsb3dlcgorICAgIHNpbXBsZSB0aXRsZS0+c2ltcGxlIHVwcGVyCisgICAgZmluYWxseSwgdGhlIG9yaWdpbmFsIGNvZGUgcG9pbnQgKG5vIG1hcHBpbmcpCisKK1RoaXMgZmFsbGJhY2sgb3JkZXIgaXMgc3RyaWN0OgorSW4gcGFydGljdWxhciwgdGhlIGZhbGxiYWNrIGZyb20gZnVsbCBjYXNlIGZvbGRpbmcgaXMgdG8gc2ltcGxlIGNhc2UgZm9sZGluZywKK25vdCB0byBmdWxsIGxvd2VyY2FzZSBtYXBwaW5nLgorCitSZXZlcnNlIGNhc2UgZm9sZGluZyBkYXRhICgidW5mb2xkIikgYXJyYXk6IChuZXcgaW4gZm9ybWF0IHZlcnNpb24gMS4xKQorCitUaGlzIGFycmF5IHN0b3JlcyBzb21lIG1pc2NlbGxhbmVvdXMgdmFsdWVzIGZvbGxvd2VkIGJ5IGEgdGFibGUuIFRoZSBkYXRhIG1hcHMKK2JhY2sgZnJvbSBtdWx0aS1jaGFyYWN0ZXIgc3RyaW5ncyB0byB0aGVpciBvcmlnaW5hbCBjb2RlIHBvaW50cywgZm9yIHVzZQoraW4gY2FzZSBjbG9zdXJlLgorCitUaGUgdGFibGUgY29udGFpbnMgdHdvIGNvbHVtbnMgb2Ygc3RyaW5ncy4KK1RoZSBzdHJpbmcgaW4gdGhlIGZpcnN0IGNvbHVtbiBpcyB0aGUgY2FzZSBmb2xkaW5nIG9mIGVhY2ggb2YgdGhlIGNvZGUgcG9pbnRzCitpbiB0aGUgc2Vjb25kIGNvbHVtbi4gVGhlIHN0cmluZ3MgYXJlIHRlcm1pbmF0ZWQgd2l0aCBOVUwgb3IgYnkgdGhlIGVuZCBvZiB0aGUKK2NvbHVtbiwgd2hpY2hldmVyIGNvbWVzIGZpcnN0LgorCitUaGUgbWlzY2VsbGFuZW91cyBkYXRhIHRha2VzIHVwIG9uZSBwc2V1ZG8tcm93IGFuZCBpbmNsdWRlczoKKy0gbnVtYmVyIG9mIHJvd3MKKy0gbnVtYmVyIG9mIFVDaGFycyBwZXIgcm93CistIG51bWJlciBvZiBVQ2hhcnMgaW4gdGhlIGxlZnQgKGZvbGRpbmcgc3RyaW5nKSBjb2x1bW4KKworVGhlIHRhYmxlIGlzIHNvcnRlZCBieSBpdHMgZmlyc3QgY29sdW1uLiBWYWx1ZXMgaW4gdGhlIGZpcnN0IGNvbHVtbiBhcmUgdW5pcXVlLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBVRGF0YUluZm8gY2YuIHVkYXRhLmggKi8KK3N0YXRpYyBVRGF0YUluZm8gZGF0YUluZm89eworICAgIHNpemVvZihVRGF0YUluZm8pLAorICAgIDAsCisKKyAgICBVX0lTX0JJR19FTkRJQU4sCisgICAgVV9DSEFSU0VUX0ZBTUlMWSwKKyAgICBVX1NJWkVPRl9VQ0hBUiwKKyAgICAwLAorCisgICAgLyogZGF0YUZvcm1hdD0iY0FzRSIgKi8KKyAgICB7IFVDQVNFX0ZNVF8wLCBVQ0FTRV9GTVRfMSwgVUNBU0VfRk1UXzIsIFVDQVNFX0ZNVF8zIH0sCisgICAgeyAyLCAwLCAwLCAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3JtYXRWZXJzaW9uICovCisgICAgeyA2LCAwLCAwLCAwIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkYXRhVmVyc2lvbiAqLworfTsKKworZW51bSB7CisgICAgLyogbWF4aW11bSBudW1iZXIgb2YgZXhjZXB0aW9ucyBleHBlY3RlZCAqLworICAgIE1BWF9FWENfQ09VTlQ9MTAwMAorfTsKKworLyogZXhjZXB0aW9ucyB2YWx1ZXMgKi8KK3N0YXRpYyB1aW50MTZfdCBleGNlcHRpb25zW1VDQVNFX01BWF9FWENFUFRJT05TKzEwMF07CitzdGF0aWMgdWludDE2X3QgZXhjZXB0aW9uc1RvcD0wOworc3RhdGljIFByb3BzIGV4Y1Byb3BzW01BWF9FWENfQ09VTlRdOworc3RhdGljIHVpbnQxNl90IGV4Y2VwdGlvbnNDb3VudD0wOworCisvKiBiZWNvbWVzIGluZGV4ZXNbVUNBU0VfSVhfTUFYX0ZVTExfTEVOR1RIXSAqLworc3RhdGljIGludDMyX3QgbWF4RnVsbExlbmd0aD1VMTZfTUFYX0xFTkdUSDsKKworLyogcmV2ZXJzZSBjYXNlIGZvbGRpbmcgKCJ1bmZvbGQiKSBkYXRhICovCitzdGF0aWMgVUNoYXIgdW5mb2xkW1VHRU5DQVNFX1VORk9MRF9NQVhfUk9XUypVR0VOQ0FTRV9VTkZPTERfV0lEVEhdPXsKKyAgICAwLCBVR0VOQ0FTRV9VTkZPTERfV0lEVEgsIFVHRU5DQVNFX1VORk9MRF9TVFJJTkdfV0lEVEgsIDAsIDAKK307CitzdGF0aWMgdWludDE2X3QgdW5mb2xkUm93cz0wOworc3RhdGljIHVpbnQxNl90IHVuZm9sZFRvcD1VR0VOQ0FTRV9VTkZPTERfV0lEVEg7CisKKy8qIFVuaWNvZGUgdmVyc2lvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBjb25zdCBVVmVyc2lvbkluZm8KK3VuaWNvZGVWZXJzaW9uc1tdPXsKKyAgICB7IDEsIDAsIDAsIDAgfSwKKyAgICB7IDEsIDEsIDAsIDAgfSwKKyAgICB7IDIsIDAsIDAsIDAgfSwKKyAgICB7IDMsIDAsIDAsIDAgfSwKKyAgICB7IDMsIDEsIDAsIDAgfSwKKyAgICB7IDMsIDIsIDAsIDAgfSwKKyAgICB7IDQsIDAsIDAsIDAgfSwKKyAgICB7IDQsIDAsIDEsIDAgfSwKKyAgICB7IDQsIDEsIDAsIDAgfSwKKyAgICB7IDUsIDEsIDAsIDAgfSwKKyAgICB7IDUsIDIsIDAsIDAgfSwKKyAgICB7IDYsIDAsIDAsIDAgfQorfTsKKworaW50MzJfdCB1Y2RWZXJzaW9uPVVOSV80XzE7CisKK3N0YXRpYyBpbnQzMl90CitmaW5kVW5pY29kZVZlcnNpb24oY29uc3QgVVZlcnNpb25JbmZvIHZlcnNpb24pIHsKKyAgICBpbnQzMl90IGk7CisKKyAgICBmb3IoaT0wOyAvKiB3aGlsZSh2ZXJzaW9uPnVuaWNvZGVWZXJzaW9uc1tpXSkge30gKi8KKyAgICAgICAgaTxVTklfVkVSX0NPVU5UICYmIHVwcnZfbWVtY21wKHZlcnNpb24sIHVuaWNvZGVWZXJzaW9uc1tpXSwgNCk+MDsKKyAgICAgICAgKytpKSB7fQorICAgIGlmKDA8aSAmJiBpPFVOSV9WRVJfQ09VTlQgJiYgdXBydl9tZW1jbXAodmVyc2lvbiwgdW5pY29kZVZlcnNpb25zW2ldLCA0KTwwKSB7CisgICAgICAgIC0taTsgLyogZml4IDQuMC4yIHRvIGxhbmQgYmVmb3JlIDQuMSwgZm9yIHZhbGlkIHg+PXVjZFZlcnNpb24gY29tcGFyaXNvbnMgKi8KKyAgICB9CisgICAgcmV0dXJuIGk7IC8qIHZlcnNpb24+PXVuaWNvZGVWZXJzaW9uc1tpXSAmJiB2ZXJzaW9uPHVuaWNvZGVWZXJzaW9uc1tpKzFdOyBwb3NzaWJsZTogaT09VU5JX1ZFUl9DT1VOVCAqLworfQorCitleHRlcm4gdm9pZAorc2V0VW5pY29kZVZlcnNpb24oY29uc3QgY2hhciAqdikgeworICAgIFVWZXJzaW9uSW5mbyB2ZXJzaW9uOworICAgIHVfdmVyc2lvbkZyb21TdHJpbmcodmVyc2lvbiwgdik7CisgICAgdXBydl9tZW1jcHkoZGF0YUluZm8uZGF0YVZlcnNpb24sIHZlcnNpb24sIDQpOworICAgIHVjZFZlcnNpb249ZmluZFVuaWNvZGVWZXJzaW9uKHZlcnNpb24pOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZAorYWRkVW5mb2xkaW5nKFVDaGFyMzIgYywgY29uc3QgVUNoYXIgKnMsIGludDMyX3QgbGVuZ3RoKSB7CisgICAgaW50MzJfdCBpOworCisgICAgaWYobGVuZ3RoPlVHRU5DQVNFX1VORk9MRF9TVFJJTkdfV0lEVEgpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5jYXNlIGVycm9yOiBjYXNlIGZvbGRpbmcgdG9vIGxvbmcgKGxlbmd0aD0lbGQ+JWQ9VUdFTkNBU0VfVU5GT0xEX1NUUklOR19XSURUSClcbiIsCisgICAgICAgICAgICAgICAgKGxvbmcpbGVuZ3RoLCBVR0VOQ0FTRV9VTkZPTERfU1RSSU5HX1dJRFRIKTsKKyAgICAgICAgZXhpdChVX0lOVEVSTkFMX1BST0dSQU1fRVJST1IpOworICAgIH0KKyAgICBpZih1bmZvbGRUb3AgPj0gKExFTkdUSE9GKHVuZm9sZCkgLSBVR0VOQ0FTRV9VTkZPTERfU1RSSU5HX1dJRFRIKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbmNhc2UgZXJyb3I6IHRvbyBtYW55IG11bHRpLWNoYXJhY3RlciBjYXNlIGZvbGRpbmdzXG4iKTsKKyAgICAgICAgZXhpdChVX0JVRkZFUl9PVkVSRkxPV19FUlJPUik7CisgICAgfQorICAgIHVfbWVtc2V0KHVuZm9sZCt1bmZvbGRUb3AsIDAsIFVHRU5DQVNFX1VORk9MRF9XSURUSCk7CisgICAgdV9tZW1jcHkodW5mb2xkK3VuZm9sZFRvcCwgcywgbGVuZ3RoKTsKKworICAgIGk9dW5mb2xkVG9wK1VHRU5DQVNFX1VORk9MRF9TVFJJTkdfV0lEVEg7CisgICAgVTE2X0FQUEVORF9VTlNBRkUodW5mb2xkLCBpLCBjKTsKKworICAgICsrdW5mb2xkUm93czsKKyAgICB1bmZvbGRUb3ArPVVHRU5DQVNFX1VORk9MRF9XSURUSDsKK30KKworLyogc3RvcmUgYSBjaGFyYWN0ZXIncyBwcm9wZXJ0aWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworZXh0ZXJuIHZvaWQKK3NldFByb3BzKFByb3BzICpwKSB7CisgICAgVUVycm9yQ29kZSBlcnJvckNvZGU7CisgICAgdWludDMyX3QgdmFsdWUsIG9sZFZhbHVlOworICAgIGludDMyX3QgZGVsdGE7CisKKyAgICAvKiBnZXQgdGhlIG5vbi1Vbmljb2RlRGF0YS50eHQgcHJvcGVydGllcyAqLworICAgIHZhbHVlPW9sZFZhbHVlPXVwdmVjX2dldFZhbHVlKHB2LCBwLT5jb2RlLCAwKTsKKworICAgIC8qIGRlZmF1bHQ6IG1hcCB0byBzZWxmICovCisgICAgZGVsdGE9MDsKKworICAgIGlmKHAtPmdjPT1VX1RJVExFQ0FTRV9MRVRURVIpIHsKKyAgICAgICAgLyogdGhlIFRpdGxlY2FzZSBwcm9wZXJ0eSBpcyByZWFkIGxhdGUsIGZyb20gVW5pY29kZURhdGEudHh0ICovCisgICAgICAgIHZhbHVlfD1VQ0FTRV9USVRMRTsKKyAgICB9CisKKyAgICBpZihwLT51cHBlckNhc2UhPTApIHsKKyAgICAgICAgLyogdXBwZXJjYXNlIG1hcHBpbmcgYXMgZGVsdGEgaWYgdGhlIGNoYXJhY3RlciBpcyBsb3dlcmNhc2UgKi8KKyAgICAgICAgaWYoKHZhbHVlJlVDQVNFX1RZUEVfTUFTSyk9PVVDQVNFX0xPV0VSKSB7CisgICAgICAgICAgICBkZWx0YT1wLT51cHBlckNhc2UtcC0+Y29kZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZhbHVlfD1VQ0FTRV9FWENFUFRJT047CisgICAgICAgIH0KKyAgICB9CisgICAgaWYocC0+bG93ZXJDYXNlIT0wKSB7CisgICAgICAgIC8qIGxvd2VyY2FzZSBtYXBwaW5nIGFzIGRlbHRhIGlmIHRoZSBjaGFyYWN0ZXIgaXMgdXBwZXJjYXNlIG9yIHRpdGxlY2FzZSAqLworICAgICAgICBpZigodmFsdWUmVUNBU0VfVFlQRV9NQVNLKT49VUNBU0VfVVBQRVIpIHsKKyAgICAgICAgICAgIGRlbHRhPXAtPmxvd2VyQ2FzZS1wLT5jb2RlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdmFsdWV8PVVDQVNFX0VYQ0VQVElPTjsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZihwLT51cHBlckNhc2UhPXAtPnRpdGxlQ2FzZSkgeworICAgICAgICB2YWx1ZXw9VUNBU0VfRVhDRVBUSU9OOworICAgIH0KKyAgICBpZihwLT5jbG9zdXJlWzBdIT0wKSB7CisgICAgICAgIHZhbHVlfD1VQ0FTRV9FWENFUFRJT047CisgICAgfQorICAgIGlmKHAtPnNwZWNpYWxDYXNpbmchPU5VTEwpIHsKKyAgICAgICAgdmFsdWV8PVVDQVNFX0VYQ0VQVElPTjsKKyAgICB9CisgICAgaWYocC0+Y2FzZUZvbGRpbmchPU5VTEwpIHsKKyAgICAgICAgdmFsdWV8PVVDQVNFX0VYQ0VQVElPTjsKKyAgICB9CisKKyAgICBpZihkZWx0YTxVQ0FTRV9NSU5fREVMVEEgfHwgVUNBU0VfTUFYX0RFTFRBPGRlbHRhKSB7CisgICAgICAgIHZhbHVlfD1VQ0FTRV9FWENFUFRJT047CisgICAgfQorCisgICAgaWYocC0+Y2MhPTApIHsKKyAgICAgICAgaWYodmFsdWUmVUNBU0VfRE9UX01BU0spIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2VuY2FzZTogYSBzb2Z0LWRvdHRlZCBjaGFyYWN0ZXIgaGFzIGNjIT0wXG4iKTsKKyAgICAgICAgICAgIGV4aXQoVV9JTlRFUk5BTF9QUk9HUkFNX0VSUk9SKTsKKyAgICAgICAgfQorICAgICAgICBpZihwLT5jYz09MjMwKSB7CisgICAgICAgICAgICB2YWx1ZXw9VUNBU0VfQUJPVkU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2YWx1ZXw9VUNBU0VfT1RIRVJfQUNDRU5UOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBFbmNvZGUgY2FzZS1pZ25vcmFibGUgYXMgZGVsdGE9PTEgb24gdW5jYXNlZCBjaGFyYWN0ZXJzLAorICAgICAqIGFuZCB3aXRoIGFuIGV4Y2VwdGlvbiBiaXQgb24gY2FzZWQgY2hhcmFjdGVycyBhbmQgY2hhcmFjdGVycyB3aXRoIGFub3RoZXIgZXhjZXB0aW9uLgorICAgICAqLworICAgIGlmKHVjZFZlcnNpb24+PVVOSV80XzEpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogVW5pY29kZSA0LjEgJiA1LjA6IChENDdhKSBXb3JkX0JyZWFrPU1pZExldHRlciBvciBNbiwgTWUsIENmLCBMbSwgU2sKKyAgICAgICAgICogVW5pY29kZSA1LjE6IFdvcmRfQnJlYWs9KE1pZExldHRlciBvciBNaWROdW1MZXQpIG9yIE1uLCBNZSwgQ2YsIExtLCBTaworICAgICAgICAgKiAgIFRoZSBVR0VOQ0FTRV9JU19NSURfTEVUVEVSX1NISUZUIGJpdCBpcyBzZXQgZm9yIGJvdGggV0I9TWlkTGV0dGVyIGFuZCBXQj1NaWROdW1MZXQuCisgICAgICAgICAqIFVuaWNvZGUgNS4yOiBUaGUgZGVmaW5pdGlvbiAoVW5pY29kZSBTdGFuZGFyZCBEZWZpbml0aW9uIEQxMjEpIGlzIHVuY2hhbmdlZCwKKyAgICAgICAgICogICBidXQgbm93IENhc2VfSWdub3JhYmxlIGlzIGEgcHVibGljIHByb3BlcnR5CisgICAgICAgICAqICAgd2l0aCBpdHMgdmFsdWVzIGxpc3RlZCBpbiBEZXJpdmVkQ29yZVByb3BlcnRpZXMudHh0LgorICAgICAgICAgKiAgIGdlbmNhc2UuYyBwYXJzZXMgdGhvc2UgdmFsdWVzIGFzIHdlbGwsIGp1c3QgaW4gY2FzZSB0aGUgZGVmaW5pdGlvbiBjaGFuZ2VzCisgICAgICAgICAqICAgaW4gdGhlIGZ1dHVyZS4gZ2VuY2FzZS5jIHNldHMgdGhlIFVHRU5DQVNFX0lTX01JRF9MRVRURVJfU0hJRlQgYml0CisgICAgICAgICAqICAgZm9yIGVhY2ggQ2FzZV9JZ25vcmFibGUgZW50cnkuIChJdCBuZXZlciByZXNldHMgdGhhdCBiaXQuKQorICAgICAgICAgKi8KKyAgICAgICAgaWYoCisgICAgICAgICAgICAoVV9NQVNLKHAtPmdjKSYoVV9HQ19NTl9NQVNLfFVfR0NfTUVfTUFTS3xVX0dDX0NGX01BU0t8VV9HQ19MTV9NQVNLfFVfR0NfU0tfTUFTSykpIT0wIHx8CisgICAgICAgICAgICAodXB2ZWNfZ2V0VmFsdWUocHYsIHAtPmNvZGUsIDEpJlVfTUFTSyhVR0VOQ0FTRV9JU19NSURfTEVUVEVSX1NISUZUKSkhPTAKKyAgICAgICAgKSB7CisgICAgICAgICAgICBwLT5pc0Nhc2VJZ25vcmFibGU9VFJVRTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGJlZm9yZSBVbmljb2RlIDQuMTogTW4sIE1lLCBDZiwgTG0sIFNrIG9yIDAwMjcgb3IgMDBBRCBvciAyMDE5ICovCisgICAgICAgIGlmKAorICAgICAgICAgICAgKFVfTUFTSyhwLT5nYykmKFVfR0NfTU5fTUFTS3xVX0dDX01FX01BU0t8VV9HQ19DRl9NQVNLfFVfR0NfTE1fTUFTS3xVX0dDX1NLX01BU0spKSE9MCB8fAorICAgICAgICAgICAgcC0+Y29kZT09MHgyNyB8fCBwLT5jb2RlPT0weGFkIHx8IHAtPmNvZGU9PTB4MjAxOQorICAgICAgICApIHsKKyAgICAgICAgICAgIHAtPmlzQ2FzZUlnbm9yYWJsZT1UUlVFOworICAgICAgICB9CisgICAgfQorICAgIGlmKHAtPmlzQ2FzZUlnbm9yYWJsZSkgeworICAgICAgICBpZigodmFsdWUmVUNBU0VfVFlQRV9NQVNLKT09VUNBU0VfTk9ORSkgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFdlIHVzZSBvbmUgb2YgdGhlIGRlbHRhL2V4Y2VwdGlvbiBiaXRzIGZvcgorICAgICAgICAgICAgICogdGhlIGNhc2UtaWdub3JhYmxlIGZsYWcgZm9yIHVuY2FzZWQgY2hhcmFjdGVycy4KKyAgICAgICAgICAgICAqIFRoZXJlIGlzIG5vIGRlbHRhIGZvciB1bmNhc2VkIGNoYXJhY3RlcnMgKHNlZSBjaGVja3MgYWJvdmUpLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBkZWx0YT0xOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIElmIHRoZSBjaGFyYWN0ZXIgaXMgY2FzZWQgb3IgaGFzIGFub3RoZXIgZXhjZXB0aW9uLAorICAgICAgICAgICAgICogdGhlbiB3ZSBzdG9yZSB0aGUgY2FzZS1pZ25vcmFibGUgZmxhZyBhcyBhbiBleGNlcHRpb24gYml0LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICB2YWx1ZXw9VUNBU0VfRVhDRVBUSU9OOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaGFuZGxlIGV4Y2VwdGlvbnMgKi8KKyAgICBpZih2YWx1ZSZVQ0FTRV9FWENFUFRJT04pIHsKKyAgICAgICAgLyogc2ltcGx5IHN0b3JlIGV4Y2VwdGlvbnMgZm9yIGxhdGVyIHByb2Nlc3NpbmcgYW5kIGVuY29kaW5nICovCisgICAgICAgIHZhbHVlfD0odWludDMyX3QpZXhjZXB0aW9uc0NvdW50PDxVR0VOQ0FTRV9FWENfU0hJRlQ7CisgICAgICAgIHVwcnZfbWVtY3B5KGV4Y1Byb3BzK2V4Y2VwdGlvbnNDb3VudCwgcCwgc2l6ZW9mKCpwKSk7CisgICAgICAgIGlmKCsrZXhjZXB0aW9uc0NvdW50PT1NQVhfRVhDX0NPVU5UKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbmNhc2U6IHRvbyBtYW55IGV4Y2VwdGlvbnNcbiIpOworICAgICAgICAgICAgZXhpdChVX0lOREVYX09VVE9GQk9VTkRTX0VSUk9SKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8qIHN0b3JlIHRoZSBzaW1wbGUgY2FzZSBtYXBwaW5nIGRlbHRhICovCisgICAgICAgIHZhbHVlfD0oKHVpbnQzMl90KWRlbHRhPDxVQ0FTRV9ERUxUQV9TSElGVCkmVUNBU0VfREVMVEFfTUFTSzsKKyAgICB9CisKKyAgICBlcnJvckNvZGU9VV9aRVJPX0VSUk9SOworICAgIGlmKHZhbHVlIT1vbGRWYWx1ZSkgeworICAgICAgICB1cHZlY19zZXRWYWx1ZShwdiwgcC0+Y29kZSwgcC0+Y29kZSwgMCwgdmFsdWUsIDB4ZmZmZmZmZmYsICZlcnJvckNvZGUpOworICAgICAgICBpZihVX0ZBSUxVUkUoZXJyb3JDb2RlKSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5jYXNlIGVycm9yOiB1bmFibGUgdG8gc2V0IGNhc2UgbWFwcGluZyB2YWx1ZXMsIGNvZGU6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVfZXJyb3JOYW1lKGVycm9yQ29kZSkpOworICAgICAgICAgICAgZXhpdChlcnJvckNvZGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogYWRkIHRoZSBtdWx0aS1jaGFyYWN0ZXIgY2FzZSBmb2xkaW5nIHRvIHRoZSAidW5mb2xkIiBkYXRhICovCisgICAgaWYocC0+Y2FzZUZvbGRpbmchPU5VTEwpIHsKKyAgICAgICAgaW50MzJfdCBsZW5ndGg9cC0+Y2FzZUZvbGRpbmctPmZ1bGxbMF07CisgICAgICAgIGlmKGxlbmd0aD4xICYmIHVfc3RySGFzTW9yZUNoYXIzMlRoYW4ocC0+Y2FzZUZvbGRpbmctPmZ1bGwrMSwgbGVuZ3RoLCAxKSkgeworICAgICAgICAgICAgYWRkVW5mb2xkaW5nKHAtPmNvZGUsIHAtPmNhc2VGb2xkaW5nLT5mdWxsKzEsIGxlbmd0aCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2V4dGVybiB2b2lkCithZGRDYXNlU2Vuc2l0aXZlKFVDaGFyMzIgZmlyc3QsIFVDaGFyMzIgbGFzdCkgeworICAgIFVFcnJvckNvZGUgZXJyb3JDb2RlPVVfWkVST19FUlJPUjsKKyAgICB1cHZlY19zZXRWYWx1ZShwdiwgZmlyc3QsIGxhc3QsIDAsIFVDQVNFX1NFTlNJVElWRSwgVUNBU0VfU0VOU0lUSVZFLCAmZXJyb3JDb2RlKTsKKyAgICBpZihVX0ZBSUxVUkUoZXJyb3JDb2RlKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbmNhc2UgZXJyb3I6IHVuYWJsZSB0byBzZXQgVUNBU0VfU0VOU0lUSVZFLCBjb2RlOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVfZXJyb3JOYW1lKGVycm9yQ29kZSkpOworICAgICAgICBleGl0KGVycm9yQ29kZSk7CisgICAgfQorfQorCisvKiBmaW5hbGl6ZSByZXZlcnNlIGNhc2UgZm9sZGluZyAoInVuZm9sZCIpIGRhdGEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50MzJfdCBVX0NBTExDT05WCitjb21wYXJlVW5mb2xkKGNvbnN0IHZvaWQgKmNvbnRleHQsIGNvbnN0IHZvaWQgKmxlZnQsIGNvbnN0IHZvaWQgKnJpZ2h0KSB7CisgICAgcmV0dXJuIHVfbWVtY21wKChjb25zdCBVQ2hhciAqKWxlZnQsIChjb25zdCBVQ2hhciAqKXJpZ2h0LCBVR0VOQ0FTRV9VTkZPTERfV0lEVEgpOworfQorCitzdGF0aWMgdm9pZAorbWFrZVVuZm9sZERhdGEoKSB7CisgICAgc3RhdGljIGNvbnN0IFVDaGFyCisgICAgICAgIGlEb3RbMl09ICAgICAgICB7IDB4NjksIDB4MzA3IH07CisKKyAgICBVQ2hhciAqcCwgKnE7CisgICAgaW50MzJfdCBpLCBqLCBrOworICAgIFVFcnJvckNvZGUgZXJyb3JDb2RlOworCisgICAgLyoKKyAgICAgKiBhZGQgYSBjYXNlIGZvbGRpbmcgdGhhdCB3ZSBtaXNzZWQgYmVjYXVzZSBpdCdzIGNvbmRpdGlvbmFsOgorICAgICAqIDAxMzA7IEY7IDAwNjkgMDMwNzsgIyBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggRE9UIEFCT1ZFCisgICAgICovCisgICAgYWRkVW5mb2xkaW5nKDB4MTMwLCBpRG90LCAyKTsKKworICAgIC8qIHNvcnQgdGhlIGRhdGEgKi8KKyAgICBlcnJvckNvZGU9VV9aRVJPX0VSUk9SOworICAgIHVwcnZfc29ydEFycmF5KHVuZm9sZCtVR0VOQ0FTRV9VTkZPTERfV0lEVEgsIHVuZm9sZFJvd3MsIFVHRU5DQVNFX1VORk9MRF9XSURUSCoyLAorICAgICAgICAgICAgICAgICAgIGNvbXBhcmVVbmZvbGQsIE5VTEwsIEZBTFNFLCAmZXJyb3JDb2RlKTsKKworICAgIC8qIG1ha2UgdW5pcXVlLXN0cmluZyByb3dzIGJ5IG1lcmdpbmcgYWRqYWNlbnQgb25lcycgY29kZSBwb2ludCBjb2x1bW5zICovCisKKyAgICAvKiBtYWtlIHAgcG9pbnQgdG8gcm93IGktMSAqLworICAgIHA9KFVDaGFyICopdW5mb2xkK1VHRU5DQVNFX1VORk9MRF9XSURUSDsKKworICAgIGZvcihpPTE7IGk8dW5mb2xkUm93czspIHsKKyAgICAgICAgaWYoMD09dV9tZW1jbXAocCwgcCtVR0VOQ0FTRV9VTkZPTERfV0lEVEgsIFVHRU5DQVNFX1VORk9MRF9TVFJJTkdfV0lEVEgpKSB7CisgICAgICAgICAgICAvKiBjb25jYXRlbmF0ZSBjb2RlIHBvaW50IGNvbHVtbnMgKi8KKyAgICAgICAgICAgIHE9cCtVR0VOQ0FTRV9VTkZPTERfU1RSSU5HX1dJRFRIOworICAgICAgICAgICAgZm9yKGo9MTsgajxVR0VOQ0FTRV9VTkZPTERfQ1BfV0lEVEggJiYgcVtqXSE9MDsgKytqKSB7fQorICAgICAgICAgICAgZm9yKGs9MDsgazxVR0VOQ0FTRV9VTkZPTERfQ1BfV0lEVEggJiYgcVtVR0VOQ0FTRV9VTkZPTERfV0lEVEgra10hPTA7ICsraiwgKytrKSB7CisgICAgICAgICAgICAgICAgcVtqXT1xW1VHRU5DQVNFX1VORk9MRF9XSURUSCtrXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKGo+VUdFTkNBU0VfVU5GT0xEX0NQX1dJRFRIKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5jYXNlIGVycm9yOiB0b28gbWFueSBjb2RlIHBvaW50cyBpbiB1bmZvbGRbXTogJWxkPiVkPVVHRU5DQVNFX1VORk9MRF9DUF9XSURUSFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChsb25nKWosIFVHRU5DQVNFX1VORk9MRF9DUF9XSURUSCk7CisgICAgICAgICAgICAgICAgZXhpdChVX0JVRkZFUl9PVkVSRkxPV19FUlJPUik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIG1vdmUgZm9sbG93aW5nIHJvd3MgdXAgb25lICovCisgICAgICAgICAgICAtLXVuZm9sZFJvd3M7CisgICAgICAgICAgICB1bmZvbGRUb3AtPVVHRU5DQVNFX1VORk9MRF9XSURUSDsKKyAgICAgICAgICAgIHVfbWVtbW92ZShwK1VHRU5DQVNFX1VORk9MRF9XSURUSCwgcCtVR0VOQ0FTRV9VTkZPTERfV0lEVEgqMiwgKHVuZm9sZFJvd3MtaSkqVUdFTkNBU0VfVU5GT0xEX1dJRFRIKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHArPVVHRU5DQVNFX1VORk9MRF9XSURUSDsKKyAgICAgICAgICAgICsraTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHVuZm9sZFtVQ0FTRV9VTkZPTERfUk9XU109KFVDaGFyKXVuZm9sZFJvd3M7CisKKyAgICBpZihiZVZlcmJvc2UpIHsKKyAgICAgICAgcHV0cygidW5mb2xkIGRhdGE6Iik7CisKKyAgICAgICAgcD0oVUNoYXIgKil1bmZvbGQ7CisgICAgICAgIGZvcihpPTA7IGk8dW5mb2xkUm93czsgKytpKSB7CisgICAgICAgICAgICBwKz1VR0VOQ0FTRV9VTkZPTERfV0lEVEg7CisgICAgICAgICAgICBwcmludGYoIlslMmRdICUwNHggJTA0eCAlMDR4IDwtICUwNHggJTA0eFxuIiwKKyAgICAgICAgICAgICAgICAgICAoaW50KWksIHBbMF0sIHBbMV0sIHBbMl0sIHBbM10sIHBbNF0pOworICAgICAgICB9CisgICAgfQorfQorCisvKiBjYXNlIGNsb3N1cmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZAorYWRkQ2xvc3VyZU1hcHBpbmcoVUNoYXIzMiBzcmMsIFVDaGFyMzIgZGVzdCkgeworICAgIHVpbnQzMl90IHZhbHVlOworCisgICAgaWYoYmVWZXJib3NlKSB7CisgICAgICAgIHByaW50ZigiYWRkIGNsb3N1cmUgbWFwcGluZyBVKyUwNGx4LT5VKyUwNGx4XG4iLAorICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKXNyYywgKHVuc2lnbmVkIGxvbmcpZGVzdCk7CisgICAgfQorCisgICAgdmFsdWU9dXB2ZWNfZ2V0VmFsdWUocHYsIHNyYywgMCk7CisgICAgaWYodmFsdWUmVUNBU0VfRVhDRVBUSU9OKSB7CisgICAgICAgIFByb3BzICpwPWV4Y1Byb3BzKyh2YWx1ZT4+VUdFTkNBU0VfRVhDX1NISUZUKTsKKyAgICAgICAgaW50MzJfdCBpOworCisgICAgICAgIC8qIGFwcGVuZCBkZXN0IHRvIHNyYydzIGNsb3N1cmUgYXJyYXkgKi8KKyAgICAgICAgZm9yKGk9MDs7ICsraSkgeworICAgICAgICAgICAgaWYoaT09TEVOR1RIT0YocC0+Y2xvc3VyZSkpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNsb3N1cmVbXSBvdmVyZmxvdyBmb3IgVSslMDRseC0+VSslMDRseFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpc3JjLCAodW5zaWduZWQgbG9uZylkZXN0KTsKKyAgICAgICAgICAgICAgICBleGl0KFVfQlVGRkVSX09WRVJGTE9XX0VSUk9SKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZihwLT5jbG9zdXJlW2ldPT1kZXN0KSB7CisgICAgICAgICAgICAgICAgYnJlYWs7IC8qIGRvIG5vdCBzdG9yZSBkdXBsaWNhdGVzICovCisgICAgICAgICAgICB9IGVsc2UgaWYocC0+Y2xvc3VyZVtpXT09MCkgeworICAgICAgICAgICAgICAgIHAtPmNsb3N1cmVbaV09ZGVzdDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIFByb3BzIHAyPXsgMCB9OworICAgICAgICBVQ2hhcjMyIG5leHQ7CisgICAgICAgIFVFcnJvckNvZGUgZXJyb3JDb2RlOworCisgICAgICAgIC8qCisgICAgICAgICAqIGRlY29kZSB2YWx1ZSBpbnRvIHAyIChlbm91Z2ggZm9yIG1ha2VFeGNlcHRpb24oKSB0byB3b3JrIHByb3Blcmx5KSwKKyAgICAgICAgICogYWRkIHRoZSBjbG9zdXJlIG1hcHBpbmcsCisgICAgICAgICAqIGFuZCBzZXQgdGhlIG5ldyBleGNlcHRpb24gZm9yIHNyYworICAgICAgICAgKi8KKyAgICAgICAgcDIuY29kZT1zcmM7CisgICAgICAgIHAyLmNsb3N1cmVbMF09ZGVzdDsKKworICAgICAgICBpZigodmFsdWUmVUNBU0VfVFlQRV9NQVNLKT5VQ0FTRV9OT05FKSB7CisgICAgICAgICAgICAvKiBvbmUgc2ltcGxlIGNhc2UgbWFwcGluZywgZG9uJ3QgY2FyZSB3aGljaCBvbmUgKi8KKyAgICAgICAgICAgIG5leHQ9c3JjKygoaW50MTZfdCl2YWx1ZT4+VUNBU0VfREVMVEFfU0hJRlQpOworICAgICAgICAgICAgaWYobmV4dCE9c3JjKSB7CisgICAgICAgICAgICAgICAgaWYoKHZhbHVlJlVDQVNFX1RZUEVfTUFTSyk9PVVDQVNFX0xPV0VSKSB7CisgICAgICAgICAgICAgICAgICAgIHAyLnVwcGVyQ2FzZT1wMi50aXRsZUNhc2U9bmV4dDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwMi5sb3dlckNhc2U9bmV4dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZih2YWx1ZSZVQ0FTRV9ERUxUQV9NQVNLKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbmNhc2UgZXJyb3I6IHVuYWJsZSB0byBhZGQgY2FzZSBjbG9zdXJlIGV4Y2VwdGlvbiB0byBjYXNlLWlnbm9yYWJsZSBVKyUwNGx4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKXNyYyk7CisgICAgICAgICAgICBleGl0KFVfSU5URVJOQUxfUFJPR1JBTV9FUlJPUik7CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZSY9fihVR0VOQ0FTRV9FWENfTUFTS3xVQ0FTRV9ERUxUQV9NQVNLKTsgLyogcmVtb3ZlIHByZXZpb3VzIHNpbXBsZSBtYXBwaW5nICovCisgICAgICAgIHZhbHVlfD0odWludDMyX3QpZXhjZXB0aW9uc0NvdW50PDxVR0VOQ0FTRV9FWENfU0hJRlQ7CisgICAgICAgIHZhbHVlfD1VQ0FTRV9FWENFUFRJT047CisgICAgICAgIHVwcnZfbWVtY3B5KGV4Y1Byb3BzK2V4Y2VwdGlvbnNDb3VudCwgJnAyLCBzaXplb2YocDIpKTsKKyAgICAgICAgaWYoKytleGNlcHRpb25zQ291bnQ9PU1BWF9FWENfQ09VTlQpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2VuY2FzZTogdG9vIG1hbnkgZXhjZXB0aW9uc1xuIik7CisgICAgICAgICAgICBleGl0KFVfSU5ERVhfT1VUT0ZCT1VORFNfRVJST1IpOworICAgICAgICB9CisKKyAgICAgICAgZXJyb3JDb2RlPVVfWkVST19FUlJPUjsKKyAgICAgICAgdXB2ZWNfc2V0VmFsdWUocHYsIHNyYywgc3JjLCAwLCB2YWx1ZSwgMHhmZmZmZmZmZiwgJmVycm9yQ29kZSk7CisgICAgICAgIGlmKFVfRkFJTFVSRShlcnJvckNvZGUpKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbmNhc2UgZXJyb3I6IHVuYWJsZSB0byBzZXQgY2FzZSBtYXBwaW5nIHZhbHVlcywgY29kZTogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9lcnJvck5hbWUoZXJyb3JDb2RlKSk7CisgICAgICAgICAgICBleGl0KGVycm9yQ29kZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qCisgKiBGaW5kIG1pc3NpbmcgY2FzZSBtYXBwaW5nIHJlbGF0aW9uc2hpcHMgYW5kIGFkZCBtYXBwaW5ncyBmb3IgY2FzZSBjbG9zdXJlLgorICogVGhpcyBmdW5jdGlvbiBzdGFydHMgZnJvbSBhbiAib3JpZ2luYWwiIGNvZGUgcG9pbnQgYW5kIHJlY3Vyc2l2ZWx5CisgKiBmaW5kcyBpdHMgY2FzZSBtYXBwaW5ncyBhbmQgdGhlIGNhc2UgbWFwcGluZ3Mgb2Ygd2hlcmUgaXQgbWFwcyB0by4KKyAqCisgKiBUaGUgcmVjdXJzaW9uIGRlcHRoIGlzIGNhcHBlZCBhdCAzIG5lc3RlZCBjYWxscyBvZiB0aGlzIGZ1bmN0aW9uLgorICogSW4gZWFjaCBjYWxsLCB0aGUgY3VycmVudCBjb2RlIHBvaW50IGlzIGMsIGFuZCB0aGUgZnVuY3Rpb24gZW51bWVyYXRlcworICogYWxsIG9mIGMncyBzaW1wbGUgKHNpbmdsZS1jb2RlIHBvaW50KSBjYXNlIG1hcHBpbmdzLgorICogcHJldiBpcyB0aGUgY29kZSBwb2ludCB0aGF0IGNhc2UtbWFwcGVkIHRvIGMuCisgKiBwcmV2MiBpcyB0aGUgY29kZSBwb2ludCB0aGF0IGNhc2UtbWFwcGVkIHRvIHByZXYuCisgKgorICogVGhlIGluaXRpYWwgZnVuY3Rpb24gY2FsbCBoYXMgcHJldjI8MCwgcHJldjwwLCBhbmQgYz09b3JpZworICogKG1hcmtpbmcgbm8gY29kZSBwb2ludHMpLgorICogSXQgZW51bWVyYXRlcyBjJ3MgY2FzZSBtYXBwaW5ncyBhbmQgcmVjdXJzZXMgd2l0aG91dCBmdXJ0aGVyIGFjdGlvbi4KKyAqCisgKiBUaGUgc2Vjb25kLWxldmVsIGZ1bmN0aW9uIGNhbGwgaGFzIHByZXYyPDAsIHByZXY9PW9yaWcsIGFuZCBjIGlzCisgKiB0aGUgZGVzdGluYXRpb24gY29kZSBwb2ludCBvZiBvbmUgb2YgcHJldidzIGNhc2UgbWFwcGluZ3MuCisgKiBUaGUgZnVuY3Rpb24gY2hlY2tzIGlmIGFueSBvZiBjJ3MgY2FzZSBtYXBwaW5ncyBnbyBiYWNrIHRvIG9yaWcKKyAqIGFuZCBhZGRzIGEgY2xvc3VyZSBtYXBwaW5nIGlmIG5vdC4KKyAqIEluIG90aGVyIHdvcmRzLCBpdCB0dXJucyBhIGNhc2UgbWFwcGluZyByZWxhdGlvbnNoaXAgb2YKKyAqICAgb3JpZy0+YworICogaW50bworICogICBvcmlnPC0+YworICoKKyAqIFRoZSB0aGlyZC1sZXZlbCBmdW5jdGlvbiBjYWxsIGhhcyBwcmV2Mj09b3JpZywgcHJldj49MCwgYW5kIGMgaXMKKyAqIHRoZSBkZXN0aW5hdGlvbiBjb2RlIHBvaW50IG9mIG9uZSBvZiBwcmV2J3MgY2FzZSBtYXBwaW5ncy4KKyAqIChBbmQgcHJldiBpcyB0aGUgZGVzdGluYXRpb24gb2Ygb25lIG9mIHByZXYyJ3MgY2FzZSBtYXBwaW5ncy4pCisgKiBUaGUgZnVuY3Rpb24gY2hlY2tzIGlmIGFueSBvZiBjJ3MgY2FzZSBtYXBwaW5ncyBnbyBiYWNrIHRvIG9yaWcKKyAqIGFuZCBhZGRzIGEgY2xvc3VyZSBtYXBwaW5nIGlmIG5vdC4KKyAqIEluIG90aGVyIHdvcmRzLCBpdCB0dXJucyBjYXNlIG1hcHBpbmcgcmVsYXRpb25zaGlwcyBvZgorICogICBvcmlnLT5wcmV2LT5jIG9yIG9yaWctPnByZXY8LT5jCisgKiBpbnRvCisgKiAgIG9yaWctPnByZXYtPmMtPm9yaWcgb3Igb3JpZy0+cHJldjwtPmMtPm9yaWcKKyAqIGV0Yy4KKyAqIChHcmFwaGljYWxseSwgdGhpcyBjbG9zZXMgYSB0cmlhbmdsZS4pCisgKgorICogV2l0aCByZXBlYXRlZCBhcHBsaWNhdGlvbiBvbiBhbGwgY29kZSBwb2ludHMgdW50aWwgbm8gbW9yZSBjbG9zdXJlIG1hcHBpbmdzCisgKiBhcmUgYWRkZWQsIGFsbCBjYXNlIGVxdWl2YWxlbmNlIGdyb3VwcyBnZXQgY29tcGxldGUgbWFwcGluZ3MuCisgKiBUaGF0IGlzLCBpbiBlYWNoIGdyb3VwIG9mIGNvZGUgcG9pbnRzIHdpdGggY2FzZSByZWxhdGlvbnNoaXBzCisgKiBlYWNoIGNvZGUgcG9pbnQgd2lsbCBpbiB0aGUgZW5kIGhhdmUgc29tZSBtYXBwaW5nIHRvIGVhY2ggb3RoZXIKKyAqIGNvZGUgcG9pbnQgaW4gdGhlIGdyb3VwLgorICoKKyAqIEByZXR1cm4gVFJVRSBpZiBhIGNsb3N1cmUgbWFwcGluZyB3YXMgYWRkZWQKKyAqLworc3RhdGljIFVCb29sCithZGRDbG9zdXJlKFVDaGFyMzIgb3JpZywgVUNoYXIzMiBwcmV2MiwgVUNoYXIzMiBwcmV2LCBVQ2hhcjMyIGMsIHVpbnQzMl90IHZhbHVlKSB7CisgICAgVUNoYXIzMiBuZXh0OworICAgIFVCb29sIHNvbWVNYXBwaW5nc0FkZGVkPUZBTFNFOworCisgICAgaWYoYyE9b3JpZykgeworICAgICAgICAvKiBnZXQgdGhlIHByb3BlcnRpZXMgZm9yIGMgKi8KKyAgICAgICAgdmFsdWU9dXB2ZWNfZ2V0VmFsdWUocHYsIGMsIDApOworICAgIH0KKyAgICAvKiBlbHNlIGlmIGM9PW9yaWcgdGhlbiBjJ3MgdmFsdWUgd2FzIHBhc3NlZCBpbiAqLworCisgICAgaWYodmFsdWUmVUNBU0VfRVhDRVBUSU9OKSB7CisgICAgICAgIFVDaGFyMzIgc2V0WzMyXTsKKyAgICAgICAgaW50MzJfdCBpLCBjb3VudD0wOworCisgICAgICAgIFByb3BzICpwPWV4Y1Byb3BzKyh2YWx1ZT4+VUdFTkNBU0VfRVhDX1NISUZUKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBtYXJrZXIgZm9yIHdoZXRoZXIgYW55IG9mIGMncyBtYXBwaW5ncyBnb2VzIHRvIG9yaWcKKyAgICAgICAgICogYz09b3JpZzogcHJldmVudCBhZGRpbmcgYSBjbG9zdXJlIG1hcHBpbmcgd2hlbiBnZXR0aW5nIG9yaWcncyBvd24sIGRpcmVjdCBtYXBwaW5ncworICAgICAgICAgKi8KKyAgICAgICAgVUJvb2wgbWFwc1RvT3JpZz0oVUJvb2wpKGM9PW9yaWcpOworCisgICAgICAgIC8qIGNvbGxlY3QgYydzIGNhc2UgbWFwcGluZyBkZXN0aW5hdGlvbnMgaW4gc2V0W10gKi8KKyAgICAgICAgaWYoKG5leHQ9cC0+dXBwZXJDYXNlKSE9MCAmJiBuZXh0IT1jKSB7CisgICAgICAgICAgICBzZXRbY291bnQrK109bmV4dDsKKyAgICAgICAgfQorICAgICAgICBpZigobmV4dD1wLT5sb3dlckNhc2UpIT0wICYmIG5leHQhPWMpIHsKKyAgICAgICAgICAgIHNldFtjb3VudCsrXT1uZXh0OworICAgICAgICB9CisgICAgICAgIGlmKHAtPnVwcGVyQ2FzZSE9KG5leHQ9cC0+dGl0bGVDYXNlKSAmJiBuZXh0IT1jKSB7CisgICAgICAgICAgICBzZXRbY291bnQrK109bmV4dDsKKyAgICAgICAgfQorICAgICAgICBpZihwLT5jYXNlRm9sZGluZyE9TlVMTCAmJiAobmV4dD1wLT5jYXNlRm9sZGluZy0+c2ltcGxlKSE9MCAmJiBuZXh0IT1jKSB7CisgICAgICAgICAgICBzZXRbY291bnQrK109bmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGFwcGVuZCBjJ3MgY3VycmVudCBjbG9zdXJlIG1hcHBpbmdzIHRvIHNldFtdICovCisgICAgICAgIGZvcihpPTA7IGk8TEVOR1RIT0YocC0+Y2xvc3VyZSkgJiYgKG5leHQ9cC0+Y2xvc3VyZVtpXSkhPTA7ICsraSkgeworICAgICAgICAgICAgc2V0W2NvdW50KytdPW5leHQ7CisgICAgICAgIH0KKworICAgICAgICAvKiBwcm9jZXNzIGFsbCBjb2RlIHBvaW50cyB0byB3aGljaCBjIGNhc2UtbWFwcyAqLworICAgICAgICBmb3IoaT0wOyBpPGNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIG5leHQ9c2V0W2ldOyAvKiBuZXh0IT1jICovCisKKyAgICAgICAgICAgIGlmKG5leHQ9PW9yaWcpIHsKKyAgICAgICAgICAgICAgICBtYXBzVG9PcmlnPVRSVUU7IC8qIHJlbWVtYmVyIHRoYXQgd2UgbWFwIHRvIG9yaWcgKi8KKyAgICAgICAgICAgIH0gZWxzZSBpZihwcmV2MjwwICYmIG5leHQhPXByZXYpIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIHJlY3Vyc2UgdW5sZXNzCisgICAgICAgICAgICAgICAgICogd2UgaGF2ZSByZWFjaGVkIG1heGltdW0gZGVwdGggKHByZXYyPj0wKSBvcgorICAgICAgICAgICAgICAgICAqIHRoaXMgaXMgYSBtYXBwaW5nIHRvIG9uZSBvZiB0aGUgcHJldmlvdXMgY29kZSBwb2ludHMgKG9yaWcsIHByZXYsIGMpCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgc29tZU1hcHBpbmdzQWRkZWR8PWFkZENsb3N1cmUob3JpZywgcHJldiwgYywgbmV4dCwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZighbWFwc1RvT3JpZykgeworICAgICAgICAgICAgYWRkQ2xvc3VyZU1hcHBpbmcoYywgb3JpZyk7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmKCh2YWx1ZSZVQ0FTRV9UWVBFX01BU0spPlVDQVNFX05PTkUpIHsKKyAgICAgICAgICAgIC8qIG9uZSBzaW1wbGUgY2FzZSBtYXBwaW5nLCBkb24ndCBjYXJlIHdoaWNoIG9uZSAqLworICAgICAgICAgICAgbmV4dD1jKygoaW50MTZfdCl2YWx1ZT4+VUNBU0VfREVMVEFfU0hJRlQpOworICAgICAgICAgICAgaWYobmV4dCE9YykgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogcmVjdXJzZSB1bmxlc3MKKyAgICAgICAgICAgICAgICAgKiB3ZSBoYXZlIHJlYWNoZWQgbWF4aW11bSBkZXB0aCAocHJldjI+PTApIG9yCisgICAgICAgICAgICAgICAgICogdGhpcyBpcyBhIG1hcHBpbmcgdG8gb25lIG9mIHRoZSBwcmV2aW91cyBjb2RlIHBvaW50cyAob3JpZywgcHJldiwgYykKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZihwcmV2MjwwICYmIG5leHQhPW9yaWcgJiYgbmV4dCE9cHJldikgeworICAgICAgICAgICAgICAgICAgICBzb21lTWFwcGluZ3NBZGRlZHw9YWRkQ2xvc3VyZShvcmlnLCBwcmV2LCBjLCBuZXh0LCAwKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZihjIT1vcmlnICYmIG5leHQhPW9yaWcpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogYyBkb2VzIG5vdCBtYXAgdG8gb3JpZywgYWRkIGEgY2xvc3VyZSBtYXBwaW5nIGMtPm9yaWcgKi8KKyAgICAgICAgICAgICAgICAgICAgYWRkQ2xvc3VyZU1hcHBpbmcoYywgb3JpZyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBzb21lTWFwcGluZ3NBZGRlZDsKK30KKworZXh0ZXJuIHZvaWQKK21ha2VDYXNlQ2xvc3VyZSgpIHsKKyAgICBVQ2hhciAqcDsKKyAgICB1aW50MzJfdCAqcm93OworICAgIHVpbnQzMl90IHZhbHVlOworICAgIFVDaGFyMzIgc3RhcnQsIGVuZCwgYywgYzI7CisgICAgaW50MzJfdCBpLCBqOworICAgIFVCb29sIHNvbWVNYXBwaW5nc0FkZGVkOworCisgICAgLyoKKyAgICAgKiBmaW5hbGl6ZSB0aGUgInVuZm9sZCIgZGF0YSBiZWNhdXNlIHdlIG5lZWQgdG8gdXNlIGl0IHRvIGFkZCBjbG9zdXJlIG1hcHBpbmdzCisgICAgICogZm9yIHNpdHVhdGlvbnMgbGlrZSBGQjA1LT4ic3QiPC1GQjA2CisgICAgICogd2hlcmUgd2Ugd291bGQgb3RoZXJ3aXNlIG1pc3MgdGhlIEZCMDU8LT5GQjA2IHJlbGF0aW9uc2hpcAorICAgICAqLworICAgIG1ha2VVbmZvbGREYXRhKCk7CisKKyAgICAvKiB1c2UgdGhlICJ1bmZvbGQiIGRhdGEgdG8gYWRkIG1hcHBpbmdzICovCisKKyAgICAvKiBwIGFsd2F5cyBwb2ludHMgdG8gdGhlIGNvZGUgcG9pbnRzOyB0aGlzIGxvb3AgaWdub3JlcyB0aGUgc3RyaW5ncyBjb21wbGV0ZWx5ICovCisgICAgcD11bmZvbGQrVUdFTkNBU0VfVU5GT0xEX1dJRFRIK1VHRU5DQVNFX1VORk9MRF9TVFJJTkdfV0lEVEg7CisKKyAgICBmb3IoaT0wOyBpPHVuZm9sZFJvd3M7IHArPVVHRU5DQVNFX1VORk9MRF9XSURUSCwgKytpKSB7CisgICAgICAgIGo9MDsKKyAgICAgICAgVTE2X05FWFRfVU5TQUZFKHAsIGosIGMpOworICAgICAgICB3aGlsZShqPFVHRU5DQVNFX1VORk9MRF9DUF9XSURUSCAmJiBwW2pdIT0wKSB7CisgICAgICAgICAgICBVMTZfTkVYVF9VTlNBRkUocCwgaiwgYzIpOworICAgICAgICAgICAgYWRkQ2xvc3VyZShjLCBVX1NFTlRJTkVMLCBjLCBjMiwgMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZihiZVZlcmJvc2UpIHsKKyAgICAgICAgcHV0cygiLS0tLSAtLS0tIC0tLS0gLS0tLSAoZG9uZSB3aXRoIGNsb3N1cmVzIGZyb20gdW5mb2xkaW5nKSIpOworICAgIH0KKworICAgIC8qIGFkZCBmdXJ0aGVyIGNsb3N1cmUgbWFwcGluZ3MgZnJvbSBhbmFseXppbmcgc2ltcGxlIG1hcHBpbmdzICovCisgICAgZG8geworICAgICAgICBzb21lTWFwcGluZ3NBZGRlZD1GQUxTRTsKKworICAgICAgICBpPTA7CisgICAgICAgIHdoaWxlKChyb3c9dXB2ZWNfZ2V0Um93KHB2LCBpLCAmc3RhcnQsICZlbmQpKSE9TlVMTCAmJiBzdGFydDxVUFZFQ19GSVJTVF9TUEVDSUFMX0NQKSB7CisgICAgICAgICAgICB2YWx1ZT0qcm93OworICAgICAgICAgICAgaWYodmFsdWUhPTApIHsKKyAgICAgICAgICAgICAgICB3aGlsZShzdGFydDw9ZW5kKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKGFkZENsb3N1cmUoc3RhcnQsIFVfU0VOVElORUwsIFVfU0VOVElORUwsIHN0YXJ0LCB2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNvbWVNYXBwaW5nc0FkZGVkPVRSVUU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBzdG9wIHRoaXMgbG9vcCBiZWNhdXNlIHB2IHdhcyBjaGFuZ2VkIGFuZCByb3cgaXMgbm90IHZhbGlkIGFueSBtb3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBza2lwIGFsbCByb3dzIGJlbG93IHRoZSBjdXJyZW50IHN0YXJ0CisgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKChyb3c9dXB2ZWNfZ2V0Um93KHB2LCBpLCBOVUxMLCAmZW5kKSkhPU5VTEwgJiYgc3RhcnQ+ZW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcm93PU5VTEw7IC8qIHNpZ25hbCB0byBjb250aW51ZSB3aXRoIG91dGVyIGxvb3AsIHdpdGhvdXQgZnVydGhlciArK2kgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICsrc3RhcnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKHJvdz09TlVMTCkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLyogc2VlIHJvdz1OVUxMIGFib3ZlICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgKytpOworICAgICAgICB9CisKKyAgICAgICAgaWYoYmVWZXJib3NlICYmIHNvbWVNYXBwaW5nc0FkZGVkKSB7CisgICAgICAgICAgICBwdXRzKCItLS0tIC0tLS0gLS0tLSAtLS0tIik7CisgICAgICAgIH0KKyAgICB9IHdoaWxlKHNvbWVNYXBwaW5nc0FkZGVkKTsKK30KKworLyogZXhjZXB0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogZ2V0IHRoZSBzdHJpbmcgbGVuZ3RoIGZyb20gemVyby10ZXJtaW5hdGVkIGNvZGUgcG9pbnRzIGluIGEgbGltaXRlZC1sZW5ndGggYXJyYXkgKi8KK3N0YXRpYyBpbnQzMl90CitnZXRMZW5ndGhPZkNvZGVQb2ludHMoY29uc3QgVUNoYXIzMiAqcywgaW50MzJfdCBtYXhMZW5ndGgpIHsKKyAgICBpbnQzMl90IGksIGxlbmd0aDsKKworICAgIGZvcihpPWxlbmd0aD0wOyBpPG1heExlbmd0aCAmJiBzW2ldIT0wOyArK2kpIHsKKyAgICAgICAgbGVuZ3RoKz1VMTZfTEVOR1RIKHNbaV0pOworICAgIH0KKyAgICByZXR1cm4gbGVuZ3RoOworfQorCitzdGF0aWMgVUJvb2wKK2Z1bGxNYXBwaW5nRXF1YWxzU2ltcGxlKGNvbnN0IFVDaGFyICpzLCBVQ2hhcjMyIHNpbXBsZSwgVUNoYXIzMiBjKSB7CisgICAgaW50MzJfdCBpLCBsZW5ndGg7CisgICAgVUNoYXIzMiBmdWxsOworCisgICAgbGVuZ3RoPSpzKys7CisgICAgaWYobGVuZ3RoPT0wIHx8IGxlbmd0aD5VMTZfTUFYX0xFTkdUSCkgeworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIGk9MDsKKyAgICBVMTZfTkVYVChzLCBpLCBsZW5ndGgsIGZ1bGwpOworCisgICAgaWYoc2ltcGxlPT0wKSB7CisgICAgICAgIHNpbXBsZT1jOyAvKiBVQ0QgaGFzIG5vIHNpbXBsZSBtYXBwaW5nIGlmIGl0J3MgdGhlIHNhbWUgYXMgdGhlIGNvZGUgcG9pbnQgaXRzZWxmICovCisgICAgfQorICAgIHJldHVybiAoVUJvb2wpKGk9PWxlbmd0aCAmJiBmdWxsPT1zaW1wbGUpOworfQorCitzdGF0aWMgdWludDE2X3QKK21ha2VFeGNlcHRpb24odWludDMyX3QgdmFsdWUsIFByb3BzICpwKSB7CisgICAgdWludDMyX3Qgc2xvdHNbOF07CisgICAgdWludDMyX3Qgc2xvdEJpdHM7CisgICAgdWludDE2X3QgZXhjV29yZCwgaSwgY291bnQsIGxlbmd0aCwgZnVsbExlbmd0aHM7CisgICAgVUJvb2wgZG91YmxlU2xvdHM7CisKKyAgICAvKiBleGNlcHRpb25zVG9wIG1pZ2h0IGJlIHJldHVybmVkIGZvciBzdG9yaW5nIGluIHRoZSB0cmllIHdvcmQgKi8KKyAgICBpZihleGNlcHRpb25zVG9wPj1VQ0FTRV9NQVhfRVhDRVBUSU9OUykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbmNhc2UgZXJyb3I6IHRvbyBtYW55IGV4Y2VwdGlvbnMgd29yZHNcbiIpOworICAgICAgICBleGl0KFVfQlVGRkVSX09WRVJGTE9XX0VSUk9SKTsKKyAgICB9CisKKyAgICAvKiBjb3B5IGFuZCBzaGlmdCB0aGUgc29mdC1kb3R0ZWQgYml0cyAqLworICAgIGV4Y1dvcmQ9KCh1aW50MTZfdCl2YWx1ZSZVQ0FTRV9ET1RfTUFTSyk8PFVDQVNFX0VYQ19ET1RfU0hJRlQ7CisKKyAgICBpZihwLT5pc0Nhc2VJZ25vcmFibGUpIHsKKyAgICAgICAgZXhjV29yZHw9VUNBU0VfRVhDX0NBU0VfSUdOT1JBQkxFOworICAgIH0KKworICAgIC8qIHVwZGF0ZSBtYXhGdWxsTGVuZ3RoICovCisgICAgaWYocC0+c3BlY2lhbENhc2luZyE9TlVMTCkgeworICAgICAgICBsZW5ndGg9cC0+c3BlY2lhbENhc2luZy0+bG93ZXJDYXNlWzBdOworICAgICAgICBpZihsZW5ndGg+bWF4RnVsbExlbmd0aCkgeworICAgICAgICAgICAgbWF4RnVsbExlbmd0aD1sZW5ndGg7CisgICAgICAgIH0KKyAgICAgICAgbGVuZ3RoPXAtPnNwZWNpYWxDYXNpbmctPnVwcGVyQ2FzZVswXTsKKyAgICAgICAgaWYobGVuZ3RoPm1heEZ1bGxMZW5ndGgpIHsKKyAgICAgICAgICAgIG1heEZ1bGxMZW5ndGg9bGVuZ3RoOworICAgICAgICB9CisgICAgICAgIGxlbmd0aD1wLT5zcGVjaWFsQ2FzaW5nLT50aXRsZUNhc2VbMF07CisgICAgICAgIGlmKGxlbmd0aD5tYXhGdWxsTGVuZ3RoKSB7CisgICAgICAgICAgICBtYXhGdWxsTGVuZ3RoPWxlbmd0aDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZihwLT5jYXNlRm9sZGluZyE9TlVMTCkgeworICAgICAgICBsZW5ndGg9cC0+Y2FzZUZvbGRpbmctPmZ1bGxbMF07CisgICAgICAgIGlmKGxlbmd0aD5tYXhGdWxsTGVuZ3RoKSB7CisgICAgICAgICAgICBtYXhGdWxsTGVuZ3RoPWxlbmd0aDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHNldCB0aGUgYml0cyBmb3IgY29uZGl0aW9uYWwgbWFwcGluZ3MgKi8KKyAgICBpZihwLT5zcGVjaWFsQ2FzaW5nIT1OVUxMICYmIHAtPnNwZWNpYWxDYXNpbmctPmlzQ29tcGxleCkgeworICAgICAgICBleGNXb3JkfD1VQ0FTRV9FWENfQ09ORElUSU9OQUxfU1BFQ0lBTDsKKyAgICAgICAgcC0+c3BlY2lhbENhc2luZz1OVUxMOworICAgIH0KKyAgICBpZihwLT5jYXNlRm9sZGluZyE9TlVMTCAmJiBwLT5jYXNlRm9sZGluZy0+c2ltcGxlPT0wICYmIHAtPmNhc2VGb2xkaW5nLT5mdWxsWzBdPT0wKSB7CisgICAgICAgIGV4Y1dvcmR8PVVDQVNFX0VYQ19DT05ESVRJT05BTF9GT0xEOworICAgICAgICBwLT5jYXNlRm9sZGluZz1OVUxMOworICAgIH0KKworICAgIC8qCisgICAgICogTm90ZToKKyAgICAgKiBVQ0Qgc3RvcmVzIG5vIHNpbXBsZSBtYXBwaW5ncyB3aGVuIHRoZXkgYXJlIHRoZSBzYW1lIGFzIHRoZSBjb2RlIHBvaW50IGl0c2VsZi4KKyAgICAgKiBTcGVjaWFsQ2FzaW5nIGFuZCBDYXNlRm9sZGluZyBkbyBzdG9yZSBzaW1wbGUgbWFwcGluZ3MgZXZlbiBpZiB0aGV5IGFyZQorICAgICAqIHRoZSBzYW1lIGFzIHRoZSBjb2RlIHBvaW50IGl0c2VsZi4KKyAgICAgKiBDb21wYXJpc29ucyBiZXR3ZWVuIHNpbXBsZSByZWd1bGFyIG1hcHBpbmdzIGFuZCBzaW1wbGUgc3BlY2lhbC9mb2xkaW5nCisgICAgICogbWFwcGluZ3MgbmVlZCB0byBjb21wZW5zYXRlIGZvciB0aGUgZGlmZmVyZW5jZSBieSBjb21wYXJpbmcgd2l0aCB0aGUKKyAgICAgKiBvcmlnaW5hbCBjb2RlIHBvaW50IGlmIGEgc2ltcGxlIFVDRCBtYXBwaW5nIGlzIG1pc3NpbmcgKDApLgorICAgICAqLworCisgICAgLyogcmVtb3ZlIHJlZHVuZGFudCBkYXRhICovCisgICAgaWYocC0+c3BlY2lhbENhc2luZyE9TlVMTCkgeworICAgICAgICAvKiBkbyBub3Qgc3RvcmUgZnVsbCBtYXBwaW5ncyBpZiB0aGV5IGFyZSB0aGUgc2FtZSBhcyB0aGUgc2ltcGxlIG9uZXMgKi8KKyAgICAgICAgaWYoZnVsbE1hcHBpbmdFcXVhbHNTaW1wbGUocC0+c3BlY2lhbENhc2luZy0+bG93ZXJDYXNlLCBwLT5sb3dlckNhc2UsIHAtPmNvZGUpKSB7CisgICAgICAgICAgICBwLT5zcGVjaWFsQ2FzaW5nLT5sb3dlckNhc2VbMF09MDsKKyAgICAgICAgfQorICAgICAgICBpZihmdWxsTWFwcGluZ0VxdWFsc1NpbXBsZShwLT5zcGVjaWFsQ2FzaW5nLT51cHBlckNhc2UsIHAtPnVwcGVyQ2FzZSwgcC0+Y29kZSkpIHsKKyAgICAgICAgICAgIHAtPnNwZWNpYWxDYXNpbmctPnVwcGVyQ2FzZVswXT0wOworICAgICAgICB9CisgICAgICAgIGlmKGZ1bGxNYXBwaW5nRXF1YWxzU2ltcGxlKHAtPnNwZWNpYWxDYXNpbmctPnRpdGxlQ2FzZSwgcC0+dGl0bGVDYXNlLCBwLT5jb2RlKSkgeworICAgICAgICAgICAgcC0+c3BlY2lhbENhc2luZy0+dGl0bGVDYXNlWzBdPTA7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYoIHAtPmNhc2VGb2xkaW5nIT1OVUxMICYmCisgICAgICAgIGZ1bGxNYXBwaW5nRXF1YWxzU2ltcGxlKHAtPmNhc2VGb2xkaW5nLT5mdWxsLCBwLT5jYXNlRm9sZGluZy0+c2ltcGxlLCBwLT5jb2RlKQorICAgICkgeworICAgICAgICBwLT5jYXNlRm9sZGluZy0+ZnVsbFswXT0wOworICAgIH0KKworICAgIC8qIHdyaXRlIHRoZSBvcHRpb25hbCBzbG90cyAqLworICAgIHNsb3RCaXRzPTA7CisgICAgY291bnQ9MDsKKworICAgIGlmKHAtPmxvd2VyQ2FzZSE9MCkgeworICAgICAgICBzbG90c1tjb3VudF09KHVpbnQzMl90KXAtPmxvd2VyQ2FzZTsKKyAgICAgICAgc2xvdEJpdHN8PXNsb3RzW2NvdW50XTsKKyAgICAgICAgKytjb3VudDsKKyAgICAgICAgZXhjV29yZHw9VV9NQVNLKFVDQVNFX0VYQ19MT1dFUik7CisgICAgfQorICAgIGlmKCBwLT5jYXNlRm9sZGluZyE9TlVMTCAmJgorICAgICAgICBwLT5jYXNlRm9sZGluZy0+c2ltcGxlIT0wICYmCisgICAgICAgIChwLT5sb3dlckNhc2UhPTAgPworICAgICAgICAgICAgcC0+Y2FzZUZvbGRpbmctPnNpbXBsZSE9cC0+bG93ZXJDYXNlIDoKKyAgICAgICAgICAgIHAtPmNhc2VGb2xkaW5nLT5zaW1wbGUhPXAtPmNvZGUpCisgICAgKSB7CisgICAgICAgIHNsb3RzW2NvdW50XT0odWludDMyX3QpcC0+Y2FzZUZvbGRpbmctPnNpbXBsZTsKKyAgICAgICAgc2xvdEJpdHN8PXNsb3RzW2NvdW50XTsKKyAgICAgICAgKytjb3VudDsKKyAgICAgICAgZXhjV29yZHw9VV9NQVNLKFVDQVNFX0VYQ19GT0xEKTsKKyAgICB9CisgICAgaWYocC0+dXBwZXJDYXNlIT0wKSB7CisgICAgICAgIHNsb3RzW2NvdW50XT0odWludDMyX3QpcC0+dXBwZXJDYXNlOworICAgICAgICBzbG90Qml0c3w9c2xvdHNbY291bnRdOworICAgICAgICArK2NvdW50OworICAgICAgICBleGNXb3JkfD1VX01BU0soVUNBU0VfRVhDX1VQUEVSKTsKKyAgICB9CisgICAgaWYocC0+dXBwZXJDYXNlIT1wLT50aXRsZUNhc2UpIHsKKyAgICAgICAgaWYocC0+dGl0bGVDYXNlIT0wKSB7CisgICAgICAgICAgICBzbG90c1tjb3VudF09KHVpbnQzMl90KXAtPnRpdGxlQ2FzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNsb3RzW2NvdW50XT0odWludDMyX3QpcC0+Y29kZTsKKyAgICAgICAgfQorICAgICAgICBzbG90Qml0c3w9c2xvdHNbY291bnRdOworICAgICAgICArK2NvdW50OworICAgICAgICBleGNXb3JkfD1VX01BU0soVUNBU0VfRVhDX1RJVExFKTsKKyAgICB9CisKKyAgICAvKiBsZW5ndGggb2YgY2FzZSBjbG9zdXJlICovCisgICAgaWYocC0+Y2xvc3VyZVswXSE9MCkgeworICAgICAgICBsZW5ndGg9Z2V0TGVuZ3RoT2ZDb2RlUG9pbnRzKHAtPmNsb3N1cmUsIExFTkdUSE9GKHAtPmNsb3N1cmUpKTsKKyAgICAgICAgc2xvdHNbY291bnRdPSh1aW50MzJfdClsZW5ndGg7IC8qIG11c3QgYmUgMS4uVUNBU0VfQ0xPU1VSRV9NQVhfTEVOR1RIICovCisgICAgICAgIHNsb3RCaXRzfD1zbG90c1tjb3VudF07CisgICAgICAgICsrY291bnQ7CisgICAgICAgIGV4Y1dvcmR8PVVfTUFTSyhVQ0FTRV9FWENfQ0xPU1VSRSk7CisgICAgfQorCisgICAgLyogbGVuZ3RocyBvZiBmdWxsIGNhc2UgbWFwcGluZyBzdHJpbmdzLCBzdG9yZWQgaW4gdGhlIGxhc3Qgc2xvdCAqLworICAgIGZ1bGxMZW5ndGhzPTA7CisgICAgaWYocC0+c3BlY2lhbENhc2luZyE9TlVMTCkgeworICAgICAgICBmdWxsTGVuZ3Rocz1wLT5zcGVjaWFsQ2FzaW5nLT5sb3dlckNhc2VbMF07CisgICAgICAgIGZ1bGxMZW5ndGhzfD1wLT5zcGVjaWFsQ2FzaW5nLT51cHBlckNhc2VbMF08PDg7CisgICAgICAgIGZ1bGxMZW5ndGhzfD1wLT5zcGVjaWFsQ2FzaW5nLT50aXRsZUNhc2VbMF08PDEyOworICAgIH0KKyAgICBpZihwLT5jYXNlRm9sZGluZyE9TlVMTCkgeworICAgICAgICBmdWxsTGVuZ3Roc3w9cC0+Y2FzZUZvbGRpbmctPmZ1bGxbMF08PDQ7CisgICAgfQorICAgIGlmKGZ1bGxMZW5ndGhzIT0wKSB7CisgICAgICAgIHNsb3RzW2NvdW50XT1mdWxsTGVuZ3RoczsKKyAgICAgICAgc2xvdEJpdHN8PXNsb3RzW2NvdW50XTsKKyAgICAgICAgKytjb3VudDsKKyAgICAgICAgZXhjV29yZHw9VV9NQVNLKFVDQVNFX0VYQ19GVUxMX01BUFBJTkdTKTsKKyAgICB9CisKKyAgICBpZihjb3VudD09MCkgeworICAgICAgICAvKiBObyBvcHRpb25hbCBzbG90czogVHJ5IHRvIHNoYXJlIGV4Y1dvcmQgZW50cmllcy4gKi8KKyAgICAgICAgdWludDE2X3QgZXhjSW5kZXg7CisgICAgICAgIGZvcihleGNJbmRleD0wOyBleGNJbmRleDxleGNlcHRpb25zVG9wOyArK2V4Y0luZGV4KSB7CisgICAgICAgICAgICBpZihleGNXb3JkPT1leGNlcHRpb25zW2V4Y0luZGV4XSkgeworICAgICAgICAgICAgICAgIHJldHVybiBleGNJbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBub3QgZm91bmQgKi8KKyAgICAgICAgKytleGNlcHRpb25zVG9wOworICAgICAgICBleGNlcHRpb25zW2V4Y0luZGV4XT1leGNXb3JkOworICAgICAgICByZXR1cm4gZXhjSW5kZXg7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogd3JpdGUgc2xvdHMgKi8KKyAgICAgICAgdWludDE2X3QgZXhjSW5kZXg9ZXhjZXB0aW9uc1RvcDsKKyAgICAgICAgdWludDE2X3QgZXhjVG9wPWV4Y0luZGV4KzE7IC8qICsxIGZvciBleGNXb3JkIHdoaWNoIHdpbGwgYmUgc3RvcmVkIGF0IGV4Y0luZGV4ICovCisKKyAgICAgICAgZG91YmxlU2xvdHM9KFVCb29sKShzbG90Qml0cz4weGZmZmYpOworICAgICAgICBpZighZG91YmxlU2xvdHMpIHsKKyAgICAgICAgICAgIGZvcihpPTA7IGk8Y291bnQ7ICsraSkgeworICAgICAgICAgICAgICAgIGV4Y2VwdGlvbnNbZXhjVG9wKytdPSh1aW50MTZfdClzbG90c1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGV4Y1dvcmR8PVVDQVNFX0VYQ19ET1VCTEVfU0xPVFM7CisgICAgICAgICAgICBmb3IoaT0wOyBpPGNvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgICBleGNlcHRpb25zW2V4Y1RvcCsrXT0odWludDE2X3QpKHNsb3RzW2ldPj4xNik7CisgICAgICAgICAgICAgICAgZXhjZXB0aW9uc1tleGNUb3ArK109KHVpbnQxNl90KXNsb3RzW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogd3JpdGUgdGhlIGZ1bGwgY2FzZSBtYXBwaW5nIHN0cmluZ3MgKi8KKyAgICAgICAgaWYocC0+c3BlY2lhbENhc2luZyE9TlVMTCkgeworICAgICAgICAgICAgbGVuZ3RoPSh1aW50MTZfdClwLT5zcGVjaWFsQ2FzaW5nLT5sb3dlckNhc2VbMF07CisgICAgICAgICAgICB1X21lbWNweSgoVUNoYXIgKilleGNlcHRpb25zK2V4Y1RvcCwgcC0+c3BlY2lhbENhc2luZy0+bG93ZXJDYXNlKzEsIGxlbmd0aCk7CisgICAgICAgICAgICBleGNUb3ArPWxlbmd0aDsKKyAgICAgICAgfQorICAgICAgICBpZihwLT5jYXNlRm9sZGluZyE9TlVMTCkgeworICAgICAgICAgICAgbGVuZ3RoPSh1aW50MTZfdClwLT5jYXNlRm9sZGluZy0+ZnVsbFswXTsKKyAgICAgICAgICAgIHVfbWVtY3B5KChVQ2hhciAqKWV4Y2VwdGlvbnMrZXhjVG9wLCBwLT5jYXNlRm9sZGluZy0+ZnVsbCsxLCBsZW5ndGgpOworICAgICAgICAgICAgZXhjVG9wKz1sZW5ndGg7CisgICAgICAgIH0KKyAgICAgICAgaWYocC0+c3BlY2lhbENhc2luZyE9TlVMTCkgeworICAgICAgICAgICAgbGVuZ3RoPSh1aW50MTZfdClwLT5zcGVjaWFsQ2FzaW5nLT51cHBlckNhc2VbMF07CisgICAgICAgICAgICB1X21lbWNweSgoVUNoYXIgKilleGNlcHRpb25zK2V4Y1RvcCwgcC0+c3BlY2lhbENhc2luZy0+dXBwZXJDYXNlKzEsIGxlbmd0aCk7CisgICAgICAgICAgICBleGNUb3ArPWxlbmd0aDsKKworICAgICAgICAgICAgbGVuZ3RoPSh1aW50MTZfdClwLT5zcGVjaWFsQ2FzaW5nLT50aXRsZUNhc2VbMF07CisgICAgICAgICAgICB1X21lbWNweSgoVUNoYXIgKilleGNlcHRpb25zK2V4Y1RvcCwgcC0+c3BlY2lhbENhc2luZy0+dGl0bGVDYXNlKzEsIGxlbmd0aCk7CisgICAgICAgICAgICBleGNUb3ArPWxlbmd0aDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHdyaXRlIHRoZSBjbG9zdXJlIGRhdGEgKi8KKyAgICAgICAgaWYocC0+Y2xvc3VyZVswXSE9MCkgeworICAgICAgICAgICAgVUNoYXIzMiBjOworCisgICAgICAgICAgICBmb3IoaT0wOyBpPExFTkdUSE9GKHAtPmNsb3N1cmUpICYmIChjPXAtPmNsb3N1cmVbaV0pIT0wOyArK2kpIHsKKyAgICAgICAgICAgICAgICBVMTZfQVBQRU5EX1VOU0FGRSgoVUNoYXIgKilleGNlcHRpb25zLCBleGNUb3AsIGMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZXhjZXB0aW9uc1RvcD1leGNUb3A7CisKKyAgICAgICAgLyogd3JpdGUgdGhlIG1haW4gZXhjZXB0aW9ucyB3b3JkICovCisgICAgICAgIGV4Y2VwdGlvbnNbZXhjSW5kZXhdPWV4Y1dvcmQ7CisKKyAgICAgICAgcmV0dXJuIGV4Y0luZGV4OworICAgIH0KK30KKworZXh0ZXJuIHZvaWQKK21ha2VFeGNlcHRpb25zKCkgeworICAgIHVpbnQzMl90ICpyb3c7CisgICAgdWludDMyX3QgdmFsdWU7CisgICAgaW50MzJfdCBpOworICAgIHVpbnQxNl90IGV4Y0luZGV4OworCisgICAgaT0wOworICAgIHdoaWxlKChyb3c9dXB2ZWNfZ2V0Um93KHB2LCBpLCBOVUxMLCBOVUxMKSkhPU5VTEwpIHsKKyAgICAgICAgdmFsdWU9KnJvdzsKKyAgICAgICAgaWYodmFsdWUmVUNBU0VfRVhDRVBUSU9OKSB7CisgICAgICAgICAgICBleGNJbmRleD1tYWtlRXhjZXB0aW9uKHZhbHVlLCBleGNQcm9wcysodmFsdWU+PlVHRU5DQVNFX0VYQ19TSElGVCkpOworICAgICAgICAgICAgKnJvdz0odmFsdWUmfihVR0VOQ0FTRV9FWENfTUFTS3xVQ0FTRV9FWENfTUFTSykpfChleGNJbmRleDw8VUNBU0VfRVhDX1NISUZUKTsKKyAgICAgICAgfQorICAgICAgICArK2k7CisgICAgfQorfQorCisvKiBnZW5lcmF0ZSBvdXRwdXQgZGF0YSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitleHRlcm4gdm9pZAorZ2VuZXJhdGVEYXRhKGNvbnN0IGNoYXIgKmRhdGFEaXIsIFVCb29sIGNzb3VyY2UpIHsKKyAgICBzdGF0aWMgaW50MzJfdCBpbmRleGVzW1VDQVNFX0lYX1RPUF09eworICAgICAgICBVQ0FTRV9JWF9UT1AKKyAgICB9OworICAgIHN0YXRpYyB1aW50OF90IHRyaWVCbG9ja1s0MDAwMF07CisKKyAgICBjb25zdCB1aW50MzJfdCAqcm93OworICAgIFVDaGFyMzIgc3RhcnQsIGVuZDsKKyAgICBpbnQzMl90IGk7CisKKyAgICBVTmV3RGF0YU1lbW9yeSAqcERhdGE7CisgICAgVVRyaWUyICpwVHJpZTsKKyAgICBVRXJyb3JDb2RlIGVycm9yQ29kZT1VX1pFUk9fRVJST1I7CisgICAgaW50MzJfdCB0cmllU2l6ZTsKKyAgICBsb25nIGRhdGFMZW5ndGg7CisKKyAgICBwVHJpZT11dHJpZTJfb3BlbigwLCAwLCAmZXJyb3JDb2RlKTsKKyAgICBpZihVX0ZBSUxVUkUoZXJyb3JDb2RlKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbmNhc2UgZXJyb3I6IHV0cmllMl9vcGVuKCkgZmFpbGVkIC0gJXNcbiIsIHVfZXJyb3JOYW1lKGVycm9yQ29kZSkpOworICAgICAgICBleGl0KGVycm9yQ29kZSk7CisgICAgfQorCisgICAgZm9yKGk9MDsgKHJvdz11cHZlY19nZXRSb3cocHYsIGksICZzdGFydCwgJmVuZCkpIT1OVUxMOyArK2kpIHsKKyAgICAgICAgaWYoc3RhcnQ8VVBWRUNfRklSU1RfU1BFQ0lBTF9DUCkgeworICAgICAgICAgICAgdXRyaWUyX3NldFJhbmdlMzIocFRyaWUsIHN0YXJ0LCBlbmQsICpyb3csIFRSVUUsICZlcnJvckNvZGUpOworICAgICAgICAgICAgaWYoVV9GQUlMVVJFKGVycm9yQ29kZSkpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbmNhc2UgZXJyb3I6IHV0cmllMl9zZXRSYW5nZTMyKCkgZmFpbGVkIC0gJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICB1X2Vycm9yTmFtZShlcnJvckNvZGUpKTsKKyAgICAgICAgICAgICAgICBleGl0KGVycm9yQ29kZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB1dHJpZTJfZnJlZXplKHBUcmllLCBVVFJJRTJfMTZfVkFMVUVfQklUUywgJmVycm9yQ29kZSk7CisgICAgdHJpZVNpemU9dXRyaWUyX3NlcmlhbGl6ZShwVHJpZSwgdHJpZUJsb2NrLCBzaXplb2YodHJpZUJsb2NrKSwgJmVycm9yQ29kZSk7CisgICAgaWYoVV9GQUlMVVJFKGVycm9yQ29kZSkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5jYXNlIGVycm9yOiB1dHJpZTJfZnJlZXplKCkrdXRyaWUyX3NlcmlhbGl6ZSgpIGZhaWxlZDogJXMgKGxlbmd0aCAlbGQpXG4iLAorICAgICAgICAgICAgICAgIHVfZXJyb3JOYW1lKGVycm9yQ29kZSksIChsb25nKXRyaWVTaXplKTsKKyAgICAgICAgZXhpdChlcnJvckNvZGUpOworICAgIH0KKworICAgIGluZGV4ZXNbVUNBU0VfSVhfRVhDX0xFTkdUSF09ZXhjZXB0aW9uc1RvcDsKKyAgICBpbmRleGVzW1VDQVNFX0lYX1RSSUVfU0laRV09dHJpZVNpemU7CisgICAgaW5kZXhlc1tVQ0FTRV9JWF9VTkZPTERfTEVOR1RIXT11bmZvbGRUb3A7CisgICAgaW5kZXhlc1tVQ0FTRV9JWF9MRU5HVEhdPShpbnQzMl90KXNpemVvZihpbmRleGVzKSt0cmllU2l6ZSsyKmV4Y2VwdGlvbnNUb3ArMip1bmZvbGRUb3A7CisKKyAgICBpbmRleGVzW1VDQVNFX0lYX01BWF9GVUxMX0xFTkdUSF09bWF4RnVsbExlbmd0aDsKKworICAgIGlmKGJlVmVyYm9zZSkgeworICAgICAgICBwcmludGYoInRyaWUgc2l6ZSBpbiBieXRlczogICAgICAgICAgICAgICAgICAgICU1ZFxuIiwgKGludCl0cmllU2l6ZSk7CisgICAgICAgIHByaW50ZigibnVtYmVyIG9mIGNvZGUgcG9pbnRzIHdpdGggZXhjZXB0aW9uczogJTVkXG4iLCBleGNlcHRpb25zQ291bnQpOworICAgICAgICBwcmludGYoInNpemUgaW4gYnl0ZXMgb2YgZXhjZXB0aW9uczogICAgICAgICAgICU1ZFxuIiwgMipleGNlcHRpb25zVG9wKTsKKyAgICAgICAgcHJpbnRmKCJzaXplIGluIGJ5dGVzIG9mIHJldmVyc2UgZm9sZGluZ3M6ICAgICAlNWRcbiIsIDIqdW5mb2xkVG9wKTsKKyAgICAgICAgcHJpbnRmKCJkYXRhIHNpemU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlNWRcbiIsIChpbnQpaW5kZXhlc1tVQ0FTRV9JWF9MRU5HVEhdKTsKKyAgICB9CisKKyAgICBpZihjc291cmNlKSB7CisgICAgICAgIC8qIHdyaXRlIC5jIGZpbGUgZm9yIGhhcmRjb2RlZCBkYXRhICovCisgICAgICAgIEZJTEUgKmY9dXNyY19jcmVhdGUoZGF0YURpciwgInVjYXNlX3Byb3BzX2RhdGEuYyIpOworICAgICAgICBpZihmIT1OVUxMKSB7CisgICAgICAgICAgICB1c3JjX3dyaXRlQXJyYXkoZiwKKyAgICAgICAgICAgICAgICAic3RhdGljIGNvbnN0IFVWZXJzaW9uSW5mbyB1Y2FzZV9wcm9wc19kYXRhVmVyc2lvbj17IiwKKyAgICAgICAgICAgICAgICBkYXRhSW5mby5kYXRhVmVyc2lvbiwgOCwgNCwKKyAgICAgICAgICAgICAgICAifTtcblxuIik7CisgICAgICAgICAgICB1c3JjX3dyaXRlQXJyYXkoZiwKKyAgICAgICAgICAgICAgICAic3RhdGljIGNvbnN0IGludDMyX3QgdWNhc2VfcHJvcHNfaW5kZXhlc1tVQ0FTRV9JWF9UT1BdPXsiLAorICAgICAgICAgICAgICAgIGluZGV4ZXMsIDMyLCBVQ0FTRV9JWF9UT1AsCisgICAgICAgICAgICAgICAgIn07XG5cbiIpOworICAgICAgICAgICAgdXNyY193cml0ZVVUcmllMkFycmF5cyhmLAorICAgICAgICAgICAgICAgICJzdGF0aWMgY29uc3QgdWludDE2X3QgdWNhc2VfcHJvcHNfdHJpZUluZGV4WyVsZF09e1xuIiwgTlVMTCwKKyAgICAgICAgICAgICAgICBwVHJpZSwKKyAgICAgICAgICAgICAgICAiXG59O1xuXG4iKTsKKyAgICAgICAgICAgIHVzcmNfd3JpdGVBcnJheShmLAorICAgICAgICAgICAgICAgICJzdGF0aWMgY29uc3QgdWludDE2X3QgdWNhc2VfcHJvcHNfZXhjZXB0aW9uc1slbGRdPXtcbiIsCisgICAgICAgICAgICAgICAgZXhjZXB0aW9ucywgMTYsIGV4Y2VwdGlvbnNUb3AsCisgICAgICAgICAgICAgICAgIlxufTtcblxuIik7CisgICAgICAgICAgICB1c3JjX3dyaXRlQXJyYXkoZiwKKyAgICAgICAgICAgICAgICAic3RhdGljIGNvbnN0IHVpbnQxNl90IHVjYXNlX3Byb3BzX3VuZm9sZFslbGRdPXtcbiIsCisgICAgICAgICAgICAgICAgdW5mb2xkLCAxNiwgdW5mb2xkVG9wLAorICAgICAgICAgICAgICAgICJcbn07XG5cbiIpOworICAgICAgICAgICAgZnB1dHMoCisgICAgICAgICAgICAgICAgInN0YXRpYyBjb25zdCBVQ2FzZVByb3BzIHVjYXNlX3Byb3BzX3NpbmdsZXRvbj17XG4iCisgICAgICAgICAgICAgICAgIiAgTlVMTCxcbiIKKyAgICAgICAgICAgICAgICAiICB1Y2FzZV9wcm9wc19pbmRleGVzLFxuIgorICAgICAgICAgICAgICAgICIgIHVjYXNlX3Byb3BzX2V4Y2VwdGlvbnMsXG4iCisgICAgICAgICAgICAgICAgIiAgdWNhc2VfcHJvcHNfdW5mb2xkLFxuIiwKKyAgICAgICAgICAgICAgICBmKTsKKyAgICAgICAgICAgIHVzcmNfd3JpdGVVVHJpZTJTdHJ1Y3QoZiwKKyAgICAgICAgICAgICAgICAiICB7XG4iLAorICAgICAgICAgICAgICAgIHBUcmllLCAidWNhc2VfcHJvcHNfdHJpZUluZGV4IiwgTlVMTCwKKyAgICAgICAgICAgICAgICAiICB9LFxuIik7CisgICAgICAgICAgICB1c3JjX3dyaXRlQXJyYXkoZiwgIiAgeyAiLCBkYXRhSW5mby5mb3JtYXRWZXJzaW9uLCA4LCA0LCAiIH1cbiIpOworICAgICAgICAgICAgZnB1dHMoIn07XG4iLCBmKTsKKyAgICAgICAgICAgIGZjbG9zZShmKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8qIHdyaXRlIHRoZSBkYXRhICovCisgICAgICAgIHBEYXRhPXVkYXRhX2NyZWF0ZShkYXRhRGlyLCBVQ0FTRV9EQVRBX1RZUEUsIFVDQVNFX0RBVEFfTkFNRSwgJmRhdGFJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZUNvcHlyaWdodCA/IFVfQ09QWVJJR0hUX1NUUklORyA6IE5VTEwsICZlcnJvckNvZGUpOworICAgICAgICBpZihVX0ZBSUxVUkUoZXJyb3JDb2RlKSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5jYXNlOiB1bmFibGUgdG8gY3JlYXRlIGRhdGEgbWVtb3J5LCAlc1xuIiwgdV9lcnJvck5hbWUoZXJyb3JDb2RlKSk7CisgICAgICAgICAgICBleGl0KGVycm9yQ29kZSk7CisgICAgICAgIH0KKworICAgICAgICB1ZGF0YV93cml0ZUJsb2NrKHBEYXRhLCBpbmRleGVzLCBzaXplb2YoaW5kZXhlcykpOworICAgICAgICB1ZGF0YV93cml0ZUJsb2NrKHBEYXRhLCB0cmllQmxvY2ssIHRyaWVTaXplKTsKKyAgICAgICAgdWRhdGFfd3JpdGVCbG9jayhwRGF0YSwgZXhjZXB0aW9ucywgMipleGNlcHRpb25zVG9wKTsKKyAgICAgICAgdWRhdGFfd3JpdGVCbG9jayhwRGF0YSwgdW5mb2xkLCAyKnVuZm9sZFRvcCk7CisKKyAgICAgICAgLyogZmluaXNoIHVwICovCisgICAgICAgIGRhdGFMZW5ndGg9dWRhdGFfZmluaXNoKHBEYXRhLCAmZXJyb3JDb2RlKTsKKyAgICAgICAgaWYoVV9GQUlMVVJFKGVycm9yQ29kZSkpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2VuY2FzZTogZXJyb3IgJWQgd3JpdGluZyB0aGUgb3V0cHV0IGZpbGVcbiIsIGVycm9yQ29kZSk7CisgICAgICAgICAgICBleGl0KGVycm9yQ29kZSk7CisgICAgICAgIH0KKworICAgICAgICBpZihkYXRhTGVuZ3RoIT1pbmRleGVzW1VDQVNFX0lYX0xFTkdUSF0pIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2VuY2FzZTogZGF0YSBsZW5ndGggJWxkICE9IGNhbGN1bGF0ZWQgc2l6ZSAlZFxuIiwKKyAgICAgICAgICAgICAgICBkYXRhTGVuZ3RoLCAoaW50KWluZGV4ZXNbVUNBU0VfSVhfTEVOR1RIXSk7CisgICAgICAgICAgICBleGl0KFVfSU5URVJOQUxfUFJPR1JBTV9FUlJPUik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB1dHJpZTJfY2xvc2UocFRyaWUpOworfQorCisvKgorICogSGV5LCBFbWFjcywgcGxlYXNlIHNldCB0aGUgZm9sbG93aW5nOgorICoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIGluZGVudC10YWJzLW1vZGU6IG5pbAorICogRW5kOgorICoKKyAqLwpkaWZmIC0tZ2l0IGEvdW5pY29kZS9jL2dlbm5hbWVzL0NNYWtlTGlzdHMudHh0IGIvdW5pY29kZS9jL2dlbm5hbWVzL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0M2YwYzcKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RlL2MvZ2VubmFtZXMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw5IEBACisjIENvcHlyaWdodCAoQykgMjAxMCwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcworIyBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgY3JlYXRlZCBvbjogMjAxMGp1bjAzCisjIGNyZWF0ZWQgYnk6IE1hcmt1cyBXLiBTY2hlcmVyCisjIGVkaXRlZCBvbjogMjAxMGp1bDIwCisjIGVkaXRlZCBieTogU3R1YXJ0IEcuIEdpbGwKK2FkZF9leGVjdXRhYmxlKGdlbm5hbWVzIGdlbm5hbWVzLmMpCit0YXJnZXRfbGlua19saWJyYXJpZXMoZ2VubmFtZXMgaWN1dWMgaWN1dHUpCmRpZmYgLS1naXQgYS91bmljb2RlL2MvZ2VubmFtZXMvTWFrZWZpbGUuaW4gYi91bmljb2RlL2MvZ2VubmFtZXMvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQyZjg4ZgotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGUvYy9nZW5uYW1lcy9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDk3IEBACisjIyBNYWtlZmlsZS5pbiBmb3IgSUNVIC0gdG9vbHMvZ2VubmFtZXMKKyMjIENvcHlyaWdodCAoYykgMTk5OS0yMDA1LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZAorIyMgb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyMgU3RldmVuIFIuIExvb21pcworCisjIyBTb3VyY2UgZGlyZWN0b3J5IGluZm9ybWF0aW9uCitzcmNkaXIgPSBAc3JjZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAorCit0b3BfYnVpbGRkaXIgPSAuLi8uLgorCitpbmNsdWRlICQodG9wX2J1aWxkZGlyKS9pY3VkZWZzLm1rCisKKyMjIEJ1aWxkIGRpcmVjdG9yeSBpbmZvcm1hdGlvbgorc3ViZGlyID0gdG9vbHMvZ2VubmFtZXMKKworVEFSR0VUX1NUVUJfTkFNRSA9IGdlbm5hbWVzCisKK1NFQ1RJT04gPSA4CisKKyNNQU5fRklMRVMgPSAkKFRBUkdFVF9TVFVCX05BTUUpLiQoU0VDVElPTikKKworCisjIyBFeHRyYSBmaWxlcyB0byByZW1vdmUgZm9yICdtYWtlIGNsZWFuJworQ0xFQU5GSUxFUyA9ICp+ICQoREVQUykgJChNQU5fRklMRVMpCisKKyMjIFRhcmdldCBpbmZvcm1hdGlvbgorVEFSR0VUID0gJChCSU5ESVIpLyQoVEFSR0VUX1NUVUJfTkFNRSkkKEVYRUVYVCkKKworaWZuZXEgKCQodG9wX2J1aWxkZGlyKSwkKHRvcF9zcmNkaXIpKQorQ1BQRkxBR1MgKz0gLUkkKHRvcF9idWlsZGRpcikvY29tbW9uCitlbmRpZgorQ1BQRkxBR1MgKz0gLUkkKHRvcF9zcmNkaXIpL2NvbW1vbiAtSSQoc3JjZGlyKS8uLi90b29sdXRpbAorTElCUyA9ICQoTElCSUNVVE9PTFVUSUwpICQoTElCSUNVSTE4TikgJChMSUJJQ1VVQykgJChERUZBVUxUX0xJQlMpICQoTElCX00pCisKK09CSkVDVFMgPSBnZW5uYW1lcy5vCisKK0RFUFMgPSAkKE9CSkVDVFM6Lm89LmQpCisKKyMjIExpc3Qgb2YgcGhvbnkgdGFyZ2V0cworLlBIT05ZIDogYWxsIGFsbC1sb2NhbCBpbnN0YWxsIGluc3RhbGwtbG9jYWwgY2xlYW4gY2xlYW4tbG9jYWwJXAorZGlzdGNsZWFuIGRpc3RjbGVhbi1sb2NhbCBkaXN0IGRpc3QtbG9jYWwgY2hlY2sgY2hlY2stbG9jYWwgaW5zdGFsbC1tYW4KKworIyMgQ2xlYXIgc3VmZml4IGxpc3QKKy5TVUZGSVhFUyA6CisKKyMjIExpc3Qgb2Ygc3RhbmRhcmQgdGFyZ2V0cworYWxsOiBhbGwtbG9jYWwKK2luc3RhbGw6IGluc3RhbGwtbG9jYWwKK2NsZWFuOiBjbGVhbi1sb2NhbAorZGlzdGNsZWFuIDogZGlzdGNsZWFuLWxvY2FsCitkaXN0OiBkaXN0LWxvY2FsCitjaGVjazogYWxsIGNoZWNrLWxvY2FsCisKK2FsbC1sb2NhbDogJChUQVJHRVQpICQoTUFOX0ZJTEVTKQorCitpbnN0YWxsLWxvY2FsOiBhbGwtbG9jYWwgaW5zdGFsbC1tYW4KKyMJJChNS0lOU1RBTExESVJTKSAkKERFU1RESVIpJChzYmluZGlyKQorIwkkKElOU1RBTEwpICQoVEFSR0VUKSAkKERFU1RESVIpJChzYmluZGlyKQorCitpbnN0YWxsLW1hbjogJChNQU5fRklMRVMpCisjCSQoTUtJTlNUQUxMRElSUykgJChERVNURElSKSQobWFuZGlyKS9tYW4kKFNFQ1RJT04pCisjCSQoSU5TVEFMTF9EQVRBKSAkPyAkKERFU1RESVIpJChtYW5kaXIpL21hbiQoU0VDVElPTikKKworZGlzdC1sb2NhbDoKKworY2xlYW4tbG9jYWw6CisJdGVzdCAteiAiJChDTEVBTkZJTEVTKSIgfHwgJChSTVYpICQoQ0xFQU5GSUxFUykKKwkkKFJNVikgJChUQVJHRVQpICQoT0JKRUNUUykKKworZGlzdGNsZWFuLWxvY2FsOiBjbGVhbi1sb2NhbAorCSQoUk1WKSBNYWtlZmlsZQorCitjaGVjay1sb2NhbDogYWxsLWxvY2FsCisKK01ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCisJY2QgJCh0b3BfYnVpbGRkaXIpIFwKKwkgJiYgQ09ORklHX0ZJTEVTPSQoc3ViZGlyKS8kQCBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCisKKyQoVEFSR0VUKSA6ICQoT0JKRUNUUykKKwkkKExJTksuY2MpICQoT1VUT1BUKSRAICReICQoTElCUykKKwkkKFBPU1RfQlVJTERfU1RFUCkKKworCislLiQoU0VDVElPTik6ICQoc3JjZGlyKS8lLiQoU0VDVElPTikuaW4KKwljZCAkKHRvcF9idWlsZGRpcikgXAorCSAmJiBDT05GSUdfRklMRVM9JChzdWJkaXIpLyRAIENPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKKworCitpZmVxICgsJChNQUtFQ01ER09BTFMpKQorLWluY2x1ZGUgJChERVBTKQorZWxzZQoraWZuZXEgKCQocGF0c3Vic3QgJWNsZWFuLCwkKE1BS0VDTURHT0FMUykpLCkKKy1pbmNsdWRlICQoREVQUykKK2VuZGlmCitlbmRpZgorCmRpZmYgLS1naXQgYS91bmljb2RlL2MvZ2VubmFtZXMvZ2VubmFtZXMuYyBiL3VuaWNvZGUvYy9nZW5uYW1lcy9nZW5uYW1lcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZTViZmQKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RlL2MvZ2VubmFtZXMvZ2VubmFtZXMuYwpAQCAtMCwwICsxLDE2MDEgQEAKKy8qCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgQ29weXJpZ2h0IChDKSAxOTk5LTIwMTAsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMKKyogICBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICBmaWxlIG5hbWU6ICBnZW5uYW1lcy5jCisqICAgZW5jb2Rpbmc6ICAgVVMtQVNDSUkKKyogICB0YWIgc2l6ZTogICA4IChub3QgdXNlZCkKKyogICBpbmRlbnRhdGlvbjo0CisqCisqICAgY3JlYXRlZCBvbjogMTk5OXNlcDMwCisqICAgY3JlYXRlZCBieTogTWFya3VzIFcuIFNjaGVyZXIKKyoKKyogICBUaGlzIHByb2dyYW0gcmVhZHMgdGhlIFVuaWNvZGUgY2hhcmFjdGVyIGRhdGFiYXNlIHRleHQgZmlsZSwKKyogICBwYXJzZXMgaXQsIGFuZCBleHRyYWN0cyB0aGUgY2hhcmFjdGVyIGNvZGUsCisqICAgdGhlICJtb2Rlcm4iIGNoYXJhY3RlciBuYW1lLCBhbmQgb3B0aW9uYWxseSB0aGUKKyogICBVbmljb2RlIDEuMCBjaGFyYWN0ZXIgbmFtZSwgYW5kIChzdGFydGluZyB3aXRoIElDVSAyLjIpIHRoZSBJU08gMTA2NDYgY29tbWVudC4KKyogICBJdCB0aGVuIHRva2VuaXplcyBhbmQgY29tcHJlc3NlcyB0aGUgbmFtZXMgYW5kIGJ1aWxkcworKiAgIGNvbXBhY3QgYmluYXJ5IHRhYmxlcyBmb3IgcmFuZG9tLWFjY2VzcyBsb29rdXAKKyogICBpbiBhIHVfY2hhck5hbWUoKSBBUEkgZnVuY3Rpb24uCisqCisqIHVuYW1lcy5pY3UgZmlsZSBmb3JtYXQgKGFmdGVyIFVEYXRhSW5mbyBoZWFkZXIgZXRjLiAtIHNlZSB1ZGF0YS5jKQorKiAoYWxsIGRhdGEgaXMgc3RhdGljIGNvbnN0KQorKgorKiBVRGF0YUluZm8gZmllbGRzOgorKiAgIGRhdGFGb3JtYXQgInVuYW0iCisqICAgZm9ybWF0VmVyc2lvbiAxLjAKKyogICBkYXRhVmVyc2lvbiA9IFVuaWNvZGUgdmVyc2lvbiBmcm9tIC11IG9yIC0tdW5pY29kZSBjb21tYW5kIGxpbmUgb3B0aW9uLCBkZWZhdWx0cyB0byAzLjAuMAorKgorKiAtLSBkYXRhLWJhc2VkIG5hbWVzCisqIHVpbnQzMl90IHRva2VuU3RyaW5nT2Zmc2V0LAorKiAgICAgICAgICBncm91cHNPZmZzZXQsCisqICAgICAgICAgIGdyb3VwU3RyaW5nT2Zmc2V0LAorKiAgICAgICAgICBhbGdOYW1lc09mZnNldDsKKyoKKyogdWludDE2X3QgdG9rZW5Db3VudDsKKyogdWludDE2X3QgdG9rZW5UYWJsZVt0b2tlbkNvdW50XTsKKyoKKyogY2hhciAgICAgdG9rZW5TdHJpbmdzW107IC0tIHBhZGRlZCB0byBldmVuIGNvdW50CisqCisqIC0tIHN0cmluZ3MgKGdyb3VwU3RyaW5ncykgYXJlIHRva2VuaXplZCBhcyBmb2xsb3dzOgorKiAgIGZvciBlYWNoIGNoYXJhY3RlciBjCisqICAgICAgIGlmKGM+PXRva2VuQ291bnQpIHdyaXRlIHRoYXQgY2hhcmFjdGVyIGMgZGlyZWN0bHkKKyogICBlbHNlCisqICAgICAgIHRva2VuPXRva2VuVGFibGVbY107CisqICAgICAgIGlmKHRva2VuPT0weGZmZmUpIC0tIGxlYWQgYnl0ZSBvZiBkb3VibGUtYnl0ZSB0b2tlbgorKiAgICAgICAgICAgdG9rZW49dG9rZW5UYWJsZVtjPDw4fG5leHQgY2hhcmFjdGVyXTsKKyogICAgICAgaWYodG9rZW49PS0xKQorKiAgICAgICAgICAgd3JpdGUgYyBkaXJlY3RseQorKiAgICAgICBlbHNlCisqICAgICAgICAgICB0b2tlblN0cmluZz10b2tlblN0cmluZ3MrdG9rZW47ICh0b2tlblN0cmluZ3M9c3RhcnQgb2YgbmFtZXMgZGF0YSArIHRva2VuU3RyaW5nT2Zmc2V0OykKKyogICAgICAgICAgIGFwcGVuZCB6ZXJvLXRlcm1pbmF0ZWQgdG9rZW5TdHJpbmc7CisqCisqICAgIERpZmZlcmVudCBzdHJpbmdzIGZvciBhIGNvZGUgcG9pbnQgLSBub3JtYWwgbmFtZSwgMS4wIG5hbWUsIGFuZCBJU08gY29tbWVudCAtCisqICAgIGFyZSBzZXBhcmF0ZWQgYnkgJzsnLgorKgorKiB1aW50MTZfdCBncm91cENvdW50OworKiBzdHJ1Y3QgeworKiAgIHVpbnQxNl90IGdyb3VwTVNCOyAtLSBmb3IgYSBncm91cCBvZiAzMiBjaGFyYWN0ZXIgbmFtZXMgc3RvcmVkLCB0aGlzIGlzIGNvZGUgcG9pbnQ+PjUKKyogICB1aW50MTZfdCBvZmZzZXRIaWdoOyAtLSBncm91cCBzdHJpbmdzIGFyZSBhdCBzdGFydCBvZiBuYW1lcyBkYXRhICsgZ3JvdXBTdHJpbmdzT2Zmc2V0ICsgdGhpcyAzMiBiaXQtb2Zmc2V0CisqICAgdWludDE2X3Qgb2Zmc2V0TG93OworKiB9IGdyb3VwVGFibGVbZ3JvdXBDb3VudF07CisqCisqIGNoYXIgICAgIGdyb3VwU3RyaW5nc1tdOyAtLSBwYWRkZWQgdG8gNC1jb3VudAorKgorKiAtLSBUaGUgYWN0dWFsLCB0b2tlbml6ZWQgZ3JvdXAgc3RyaW5ncyBhcmUgbm90IHplcm8tdGVybWluYXRlZCBiZWNhdXNlCisqICAgdGhhdCB3b3VsZCB0YWtlIHVwIHRvbyBtdWNoIHNwYWNlLgorKiAgIEluc3RlYWQsIHRoZXkgYXJlIHByZWNlZWRlZCBieSB0aGVpciBsZW5ndGgsIHdyaXR0ZW4gaW4gYSB2YXJpYWJsZS1sZW5ndGggc2VxdWVuY2U6CisqICAgRm9yIGVhY2ggb2YgdGhlIDMyIGdyb3VwIHN0cmluZ3MsIG9uZSBvciB0d28gbmliYmxlcyBhcmUgc3RvcmVkIGZvciBpdHMgbGVuZ3RoLgorKiAgIE5pYmJsZXMgKDQtYml0IHZhbHVlcywgaGFsZi1ieXRlcykgYXJlIHJlYWQgTVNCIGZpcnN0LgorKiAgIEEgbmliYmxlIHdpdGggYSB2YWx1ZSBvZiAwLi4xMSBkaXJlY3RseSBpbmRpY2F0ZXMgdGhlIGxlbmd0aCBvZiB0aGUgbmFtZSBzdHJpbmcuCisqICAgQSBuaWJibGUgbiB3aXRoIGEgdmFsdWUgb2YgMTIuLjE1IGlzIGEgbGVhZCBuaWJibGUgYW5kIGZvcm1zIGEgdmFsdWUgd2l0aCB0aGUgZm9sbG93aW5nIG5pYmJsZSBtCisqICAgYnkgKCgobi0xMik8PDQpfG0pKzEyLCByZWFjaGluZyB2YWx1ZXMgb2YgMTIuLjc1LgorKiAgIFRoZXNlIGxlbmd0aHMgYXJlIHNlcXVlbnRpYWxseSBmb3IgZWFjaCB0b2tlbml6ZWQgc3RyaW5nLCBub3QgZm9yIHRoZSBkZS10b2tlbml6ZWQgcmVzdWx0LgorKiAgIEZvciB0aGUgZGUtdG9rZW5pemluZywgc2VlIHRva2VuIGRlc2NyaXB0aW9uIGFib3ZlOyB0aGUgc3RyaW5ncyBpbW1lZGlhdGVseSBmb2xsb3cgdGhlCisqICAgMzIgbGVuZ3Rocy4KKyoKKyogLS0gYWxnb3JpdGhtaWMgbmFtZXMKKyoKKyogdHlwZWRlZiBzdHJ1Y3QgQWxnb3JpdGhtaWNSYW5nZSB7CisqICAgICB1aW50MzJfdCByYW5nZVN0YXJ0LCByYW5nZUVuZDsKKyogICAgIHVpbnQ4X3QgYWxnb3JpdGhtVHlwZSwgYWxnb3JpdGhtVmFyaWFudDsKKyogICAgIHVpbnQxNl90IHJhbmdlU2l6ZTsKKyogfSBBbGdvcml0aG1pY1JhbmdlOworKgorKiB1aW50MzJfdCBhbGdSYW5nZXNDb3VudDsgLS0gbnVtYmVyIG9mIGRhdGEgYmxvY2tzIGZvciByYW5nZXMgb2YKKyogICAgICAgICAgICAgICBhbGdvcml0aG1pYyBuYW1lcyAoVW5pY29kZSAzLjAuMDogMywgaGFyZGNvZGVkIGluIGdlbm5hbWVzKQorKgorKiBzdHJ1Y3QgeworKiAgICAgQWxnb3JpdGhtaWNSYW5nZSBhbGdSYW5nZTsKKyogICAgIHVpbnQ4X3QgYWxnUmFuZ2VEYXRhW107IC0tIHBhZGRlZCB0byA0LWNvdW50IGV4Y2VwdCBpbiBsYXN0IHJhbmdlCisqIH0gYWxnUmFuZ2VzW2FsZ05hbWVzQ291bnRdOworKiAtLSBub3QgYSByZWFsIGFycmF5IGJlY2F1c2UgZWFjaCBwYXJ0IGhhcyBhIGRpZmZlcmVudCBzaXplCisqICAgIG9mIGFsZ1JhbmdlLnJhbmdlU2l6ZSAoaW5jbHVkaW5nIEFsZ29yaXRobWljUmFuZ2UpCisqCisqIC0tIGFsZ29yaXRobWljIHJhbmdlIHR5cGVzOgorKgorKiAwIE5hbWVzIGFyZSBmb3JtZWQgZnJvbSBhIHN0cmluZyBwcmVmaXggdGhhdCBpcyBzdG9yZWQgaW4KKyogICB0aGUgYWxnUmFuZ2VEYXRhICh6ZXJvLXRlcm1pbmF0ZWQpLCBmb2xsb3dlZCBieSB0aGUgVW5pY29kZSBjb2RlIHBvaW50CisqICAgb2YgdGhlIGNoYXJhY3RlciBpbiBoZXhhZGVjaW1hbCBkaWdpdHM7CisqICAgYWxnUmFuZ2UuYWxnb3JpdGhtVmFyaWFudCBkaWdpdHMgYXJlIHdyaXR0ZW4KKyoKKyogMSBOYW1lcyBhcmUgZm9ybWVkIGJ5IGNhbGN1bGF0aW5nIG1vZHVsby1mYWN0b3JzIG9mIHRoZSBjb2RlIHBvaW50IHZhbHVlIGFzIGZvbGxvd3M6CisqICAgYWxnUmFuZ2UuYWxnb3JpdGhtVmFyaWFudCBpcyB0aGUgY291bnQgb2YgbW9kdWxvIGZhY3RvcnMKKyogICBhbGdSYW5nZURhdGEgY29udGFpbnMKKyogICAgICAgdWludDE2X3QgZmFjdG9yc1thbGdSYW5nZS5hbGdvcml0aG1WYXJpYW50XTsKKyogICAgICAgY2hhciBzdHJpbmdzW107CisqICAgdGhlIGZpcnN0IHplcm8tdGVybWluYXRlZCBzdHJpbmcgaXMgd3JpdHRlbiBhcyB0aGUgcHJlZml4OyB0aGVuOgorKgorKiAgIFRoZSByYW5nZVN0YXJ0IGlzIHN1YnRyYWN0ZWQ7IHdpdGggdGhlIGRpZmZlcmVuY2UsIGhlcmUgImNvZGUiOgorKiAgIGZvcihpPWFsZ1JhbmdlLmFsZ29yaXRobVZhcmlhbnQtMSB0byAwIHN0ZXAgLTEpCisqICAgICAgIGluZGV4W2ldPWNvZGUlZmFjdG9yW2ldOworKiAgICAgICBjb2RlLz1mYWN0b3JbaV07CisqCisqICAgVGhlIHN0cmluZ3MgYWZ0ZXIgdGhlIHByZWZpeCBhcmUgc2hvcnQgcGllY2VzIHRoYXQgYXJlIHRoZW4gYXBwZW5kZWQgdG8gdGhlIHJlc3VsdAorKiAgIGFjY29yZGluZyB0byBpbmRleFswLi5hbGdSYW5nZS5hbGdvcml0aG1WYXJpYW50LTFdLgorKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAidW5pY29kZS91dHlwZXMuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3B1dGlsLmgiCisjaW5jbHVkZSAidW5pY29kZS91Y2xlYW4uaCIKKyNpbmNsdWRlICJ1bmljb2RlL3VkYXRhLmgiCisjaW5jbHVkZSAiY21lbW9yeS5oIgorI2luY2x1ZGUgImNzdHJpbmcuaCIKKyNpbmNsdWRlICJ1YXJyc29ydC5oIgorI2luY2x1ZGUgInVuZXdkYXRhLmgiCisjaW5jbHVkZSAidW9wdGlvbnMuaCIKKyNpbmNsdWRlICJ1cGFyc2UuaCIKKworI2RlZmluZSBMRU5HVEhPRihhcnJheSkgKGludDMyX3QpKHNpemVvZihhcnJheSkvc2l6ZW9mKChhcnJheSlbMF0pKQorCisjZGVmaW5lIFNUUklOR19TVE9SRV9TSVpFIDEwMDAwMDAKKyNkZWZpbmUgR1JPVVBfU1RPUkVfU0laRSA1MDAwCisKKyNkZWZpbmUgR1JPVVBfU0hJRlQgNQorI2RlZmluZSBMSU5FU19QRVJfR1JPVVAgKDFVTDw8R1JPVVBfU0hJRlQpCisjZGVmaW5lIEdST1VQX01BU0sgKExJTkVTX1BFUl9HUk9VUC0xKQorCisjZGVmaW5lIE1BWF9MSU5FX0NPVU5UIDUwMDAwCisjZGVmaW5lIE1BWF9XT1JEX0NPVU5UIDIwMDAwCisjZGVmaW5lIE1BWF9HUk9VUF9DT1VOVCA1MDAwCisKKyNkZWZpbmUgREFUQV9OQU1FICJ1bmFtZXMiCisjZGVmaW5lIERBVEFfVFlQRSAiaWN1IgorI2RlZmluZSBWRVJTSU9OX1NUUklORyAidW5hbSIKKyNkZWZpbmUgTkFNRV9TRVBBUkFUT1JfQ0hBUiAnOycKKworI2RlZmluZSBJU09fREFUQV9OQU1FICJ1Y29tbWVudCIKKworLyogVW5pY29kZSB2ZXJzaW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworZW51bSB7CisgICAgVU5JXzFfMCwKKyAgICBVTklfMV8xLAorICAgIFVOSV8yXzAsCisgICAgVU5JXzNfMCwKKyAgICBVTklfM18xLAorICAgIFVOSV8zXzIsCisgICAgVU5JXzRfMCwKKyAgICBVTklfNF8wXzEsCisgICAgVU5JXzRfMSwKKyAgICBVTklfNV8wLAorICAgIFVOSV81XzEsCisgICAgVU5JXzVfMiwKKyAgICBVTklfNl8wLAorICAgIFVOSV9WRVJfQ09VTlQKK307CisKK3N0YXRpYyBjb25zdCBVVmVyc2lvbkluZm8KK3VuaWNvZGVWZXJzaW9uc1tdPXsKKyAgICB7IDEsIDAsIDAsIDAgfSwKKyAgICB7IDEsIDEsIDAsIDAgfSwKKyAgICB7IDIsIDAsIDAsIDAgfSwKKyAgICB7IDMsIDAsIDAsIDAgfSwKKyAgICB7IDMsIDEsIDAsIDAgfSwKKyAgICB7IDMsIDIsIDAsIDAgfSwKKyAgICB7IDQsIDAsIDAsIDAgfSwKKyAgICB7IDQsIDAsIDEsIDAgfSwKKyAgICB7IDQsIDEsIDAsIDAgfSwKKyAgICB7IDUsIDAsIDAsIDAgfSwKKyAgICB7IDUsIDEsIDAsIDAgfSwKKyAgICB7IDUsIDIsIDAsIDAgfSwKKyAgICB7IDYsIDAsIDAsIDAgfQorfTsKKworc3RhdGljIGludDMyX3QgdWNkVmVyc2lvbj1VTklfNV8yOworCitzdGF0aWMgaW50MzJfdAorZmluZFVuaWNvZGVWZXJzaW9uKGNvbnN0IFVWZXJzaW9uSW5mbyB2ZXJzaW9uKSB7CisgICAgaW50MzJfdCBpOworCisgICAgZm9yKGk9MDsgLyogd2hpbGUodmVyc2lvbj51bmljb2RlVmVyc2lvbnNbaV0pIHt9ICovCisgICAgICAgIGk8VU5JX1ZFUl9DT1VOVCAmJiB1cHJ2X21lbWNtcCh2ZXJzaW9uLCB1bmljb2RlVmVyc2lvbnNbaV0sIDQpPjA7CisgICAgICAgICsraSkge30KKyAgICBpZigwPGkgJiYgaTxVTklfVkVSX0NPVU5UICYmIHVwcnZfbWVtY21wKHZlcnNpb24sIHVuaWNvZGVWZXJzaW9uc1tpXSwgNCk8MCkgeworICAgICAgICAtLWk7IC8qIGZpeCA0LjAuMiB0byBsYW5kIGJlZm9yZSA0LjEsIGZvciB2YWxpZCB4Pj11Y2RWZXJzaW9uIGNvbXBhcmlzb25zICovCisgICAgfQorICAgIHJldHVybiBpOyAvKiB2ZXJzaW9uPj11bmljb2RlVmVyc2lvbnNbaV0gJiYgdmVyc2lvbjx1bmljb2RlVmVyc2lvbnNbaSsxXTsgcG9zc2libGU6IGk9PVVOSV9WRVJfQ09VTlQgKi8KK30KKworLyogZ2VuZXJhdG9yIGRhdGEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogVURhdGFJbmZvIGNmLiB1ZGF0YS5oICovCitzdGF0aWMgVURhdGFJbmZvIGRhdGFJbmZvPXsKKyAgICBzaXplb2YoVURhdGFJbmZvKSwKKyAgICAwLAorCisgICAgVV9JU19CSUdfRU5ESUFOLAorICAgIFVfQ0hBUlNFVF9GQU1JTFksCisgICAgc2l6ZW9mKFVDaGFyKSwKKyAgICAwLAorCisgICAgezB4NzUsIDB4NmUsIDB4NjEsIDB4NmR9LCAgICAgLyogZGF0YUZvcm1hdD0idW5hbSIgKi8KKyAgICB7MSwgMCwgMCwgMH0sICAgICAgICAgICAgICAgICAvKiBmb3JtYXRWZXJzaW9uICovCisgICAgezMsIDAsIDAsIDB9ICAgICAgICAgICAgICAgICAgLyogZGF0YVZlcnNpb24gKi8KK307CisKK3N0YXRpYyBVQm9vbCBiZVZlcmJvc2U9RkFMU0UsIGJlUXVpZXQ9RkFMU0UsIGhhdmVDb3B5cmlnaHQ9VFJVRTsKKwordHlwZWRlZiBzdHJ1Y3QgT3B0aW9ucyB7CisgICAgVUJvb2wgc3RvcmVOYW1lczsKKyAgICBVQm9vbCBzdG9yZTEwTmFtZXM7CisgICAgVUJvb2wgc3RvcmVJU09Db21tZW50czsKK30gT3B0aW9uczsKKworLyoKKyAqIFBhaXIgb2YgY29kZSBwb2ludCBhbmQgbmFtZSBhbGlhcy4KKyAqIFRyeSB0byBrZWVwIHNpemVvZihDcE5hbWVBbGlhcykgYSBtdWx0aXBsZSBvZiA0IHRvIGF2b2lkIHBhZGRpbmcuCisgKi8KK3R5cGVkZWYgc3RydWN0IENwTmFtZUFsaWFzIHsKKyAgICB1aW50MzJfdCBjb2RlOworICAgIGNoYXIgbmFtZUFsaWFzWzEyNF07Cit9IENwTmFtZUFsaWFzOworCitzdGF0aWMgQ3BOYW1lQWxpYXMgY3BOYW1lQWxpYXNlc1s1MF07CisKK3N0YXRpYyB1aW50MzJfdCBjcE5hbWVBbGlhc2VzSW5kZXg9MCwgY3BOYW1lQWxpYXNlc1RvcD0wOworCitzdGF0aWMgdWludDhfdCBzdHJpbmdTdG9yZVtTVFJJTkdfU1RPUkVfU0laRV0sCisgICAgICAgICAgICAgICBncm91cFN0b3JlW0dST1VQX1NUT1JFX1NJWkVdLAorICAgICAgICAgICAgICAgbGluZUxlbmd0aHNbTElORVNfUEVSX0dST1VQXTsKKworc3RhdGljIHVpbnQzMl90IGxpbmVUb3A9MCwgZ3JvdXBCb3R0b20sIHdvcmRCb3R0b209U1RSSU5HX1NUT1JFX1NJWkUsIGxpbmVMZW5ndGhzVG9wOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDMyX3QgY29kZTsKKyAgICBpbnQxNl90IGxlbmd0aDsKKyAgICB1aW50OF90ICpzOworfSBMaW5lOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50MzJfdCB3ZWlnaHQ7IC8qIC0oY29zdCBmb3IgdG9rZW4pICsgKG51bWJlciBvZiBvY2N1cmVuY2VzKSAqIChsZW5ndGgtMSkgKi8KKyAgICBpbnQxNl90IGNvdW50OworICAgIGludDE2X3QgbGVuZ3RoOworICAgIHVpbnQ4X3QgKnM7Cit9IFdvcmQ7CisKK3N0YXRpYyBMaW5lIGxpbmVzW01BWF9MSU5FX0NPVU5UXTsKK3N0YXRpYyBXb3JkIHdvcmRzW01BWF9XT1JEX0NPVU5UXTsKKworc3RhdGljIHVpbnQzMl90IGxpbmVDb3VudD0wLCB3b3JkQ291bnQ9MDsKKworc3RhdGljIGludDE2X3QgbGVhZEJ5dGVDb3VudDsKKworI2RlZmluZSBMRUFEQllURV9MSU1JVCAxNgorCitzdGF0aWMgaW50MTZfdCB0b2tlbnNbTEVBREJZVEVfTElNSVQqMjU2XTsKK3N0YXRpYyB1aW50MzJfdCB0b2tlbkNvdW50OworCisvKiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZAoraW5pdCh2b2lkKTsKKworc3RhdGljIHZvaWQKK3BhcnNlTmFtZUFsaWFzZXMoY29uc3QgY2hhciAqZmlsZW5hbWUsIE9wdGlvbnMgKm9wdGlvbnMpOworCitzdGF0aWMgdm9pZAorcGFyc2VEQihjb25zdCBjaGFyICpmaWxlbmFtZSwgT3B0aW9ucyAqb3B0aW9ucyk7CisKK3N0YXRpYyB2b2lkCitwYXJzZU5hbWUoY2hhciAqbmFtZSwgaW50MTZfdCBsZW5ndGgpOworCitzdGF0aWMgaW50MTZfdAorc2tpcE5vaXNlKGNoYXIgKmxpbmUsIGludDE2X3Qgc3RhcnQsIGludDE2X3QgbGltaXQpOworCitzdGF0aWMgaW50MTZfdAorZ2V0V29yZChjaGFyICpsaW5lLCBpbnQxNl90IHN0YXJ0LCBpbnQxNl90IGxpbWl0KTsKKworc3RhdGljIHZvaWQKK2NvbXByZXNzKHZvaWQpOworCitzdGF0aWMgdm9pZAorY29tcHJlc3NMaW5lcyh2b2lkKTsKKworc3RhdGljIGludDE2X3QKK2NvbXByZXNzTGluZSh1aW50OF90ICpzLCBpbnQxNl90IGxlbmd0aCwgaW50MTZfdCAqcEdyb3VwVG9wKTsKKworc3RhdGljIGludDMyX3QKK2NvbXBhcmVXb3Jkcyhjb25zdCB2b2lkICpjb250ZXh0LCBjb25zdCB2b2lkICp3b3JkMSwgY29uc3Qgdm9pZCAqd29yZDIpOworCitzdGF0aWMgdm9pZAorZ2VuZXJhdGVEYXRhKGNvbnN0IGNoYXIgKmRhdGFEaXIsIE9wdGlvbnMgKm9wdGlvbnMpOworCitzdGF0aWMgdWludDMyX3QKK2dlbmVyYXRlQWxnb3JpdGhtaWNEYXRhKFVOZXdEYXRhTWVtb3J5ICpwRGF0YSwgT3B0aW9ucyAqb3B0aW9ucyk7CisKK3N0YXRpYyBpbnQxNl90CitmaW5kVG9rZW4odWludDhfdCAqcywgaW50MTZfdCBsZW5ndGgpOworCitzdGF0aWMgV29yZCAqCitmaW5kV29yZChjaGFyICpzLCBpbnQxNl90IGxlbmd0aCk7CisKK3N0YXRpYyBXb3JkICoKK2FkZFdvcmQoY2hhciAqcywgaW50MTZfdCBsZW5ndGgpOworCitzdGF0aWMgdm9pZAorY291bnRXb3JkKFdvcmQgKndvcmQpOworCitzdGF0aWMgdm9pZAorYWRkTGluZSh1aW50MzJfdCBjb2RlLCBjaGFyICpuYW1lc1tdLCBpbnQxNl90IGxlbmd0aHNbXSwgaW50MTZfdCBjb3VudCk7CisKK3N0YXRpYyB2b2lkCithZGRHcm91cCh1aW50MzJfdCBncm91cE1TQiwgdWludDhfdCAqc3RyaW5ncywgaW50MTZfdCBsZW5ndGgpOworCitzdGF0aWMgdWludDMyX3QKK2FkZFRva2VuKHVpbnQ4X3QgKnMsIGludDE2X3QgbGVuZ3RoKTsKKworc3RhdGljIHZvaWQKK2FwcGVuZExpbmVMZW5ndGgoaW50MTZfdCBsZW5ndGgpOworCitzdGF0aWMgdm9pZAorYXBwZW5kTGluZUxlbmd0aE5pYmJsZSh1aW50OF90IG5pYmJsZSk7CisKK3N0YXRpYyB1aW50OF90ICoKK2FsbG9jTGluZShpbnQzMl90IGxlbmd0aCk7CisKK3N0YXRpYyB1aW50OF90ICoKK2FsbG9jV29yZCh1aW50MzJfdCBsZW5ndGgpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitlbnVtIHsKKyAgICBIRUxQX0gsCisgICAgSEVMUF9RVUVTVElPTl9NQVJLLAorICAgIFZFUkJPU0UsCisgICAgUVVJRVQsCisgICAgQ09QWVJJR0hULAorICAgIERFU1RESVIsCisgICAgVU5JQ09ERSwKKyAgICBVTklDT0RFMV9OQU1FUywKKyAgICBOT19JU09fQ09NTUVOVFMsCisgICAgT05MWV9JU09fQ09NTUVOVFMKK307CisKK3N0YXRpYyBVT3B0aW9uIG9wdGlvbnNbXT17CisgICAgVU9QVElPTl9IRUxQX0gsCisgICAgVU9QVElPTl9IRUxQX1FVRVNUSU9OX01BUkssCisgICAgVU9QVElPTl9WRVJCT1NFLAorICAgIFVPUFRJT05fUVVJRVQsCisgICAgVU9QVElPTl9DT1BZUklHSFQsCisgICAgVU9QVElPTl9ERVNURElSLAorICAgIHsgInVuaWNvZGUiLCBOVUxMLCBOVUxMLCBOVUxMLCAndScsIFVPUFRfUkVRVUlSRVNfQVJHLCAwIH0sCisgICAgeyAidW5pY29kZTEtbmFtZXMiLCBOVUxMLCBOVUxMLCBOVUxMLCAnMScsIFVPUFRfTk9fQVJHLCAwIH0sCisgICAgeyAibm8taXNvLWNvbW1lbnRzIiwgTlVMTCwgTlVMTCwgTlVMTCwgJ1wxJywgVU9QVF9OT19BUkcsIDAgfSwKKyAgICB7ICJvbmx5LWlzby1jb21tZW50cyIsIE5VTEwsIE5VTEwsIE5VTEwsICdcMScsIFVPUFRfTk9fQVJHLCAwIH0KK307CisKK2V4dGVybiBpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgeworICAgIFVWZXJzaW9uSW5mbyB2ZXJzaW9uOworICAgIE9wdGlvbnMgbW9yZU9wdGlvbnM9eyBUUlVFLCBGQUxTRSwgVFJVRSB9OworICAgIFVFcnJvckNvZGUgZXJyb3JDb2RlID0gVV9aRVJPX0VSUk9SOworCisgICAgVV9NQUlOX0lOSVRfQVJHUyhhcmdjLCBhcmd2KTsKKworICAgIC8qIEluaXRpYWxpemUgSUNVICovCisgICAgdV9pbml0KCZlcnJvckNvZGUpOworICAgIGlmIChVX0ZBSUxVUkUoZXJyb3JDb2RlKSAmJiBlcnJvckNvZGUgIT0gVV9GSUxFX0FDQ0VTU19FUlJPUikgeworICAgICAgICAvKiBOb3RlOiB1X2luaXQoKSB3aWxsIHRyeSB0byBvcGVuIElDVSBwcm9wZXJ0eSBkYXRhLgorICAgICAgICAgKiAgICAgICBmYWlsdXJlcyBoZXJlIGFyZSBleHBlY3RlZCB3aGVuIGJ1aWxkaW5nIElDVSBmcm9tIHNjcmF0Y2guCisgICAgICAgICAqICAgICAgIGlnbm9yZSB0aGVtLgorICAgICAgICAgKi8KKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogY2FuIG5vdCBpbml0aWFsaXplIElDVS4gIGVycm9yQ29kZSA9ICVzXG4iLAorICAgICAgICAgICAgYXJndlswXSwgdV9lcnJvck5hbWUoZXJyb3JDb2RlKSk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgLyogcHJlc2V0IHRoZW4gcmVhZCBjb21tYW5kIGxpbmUgb3B0aW9ucyAqLworICAgIG9wdGlvbnNbREVTVERJUl0udmFsdWU9dV9nZXREYXRhRGlyZWN0b3J5KCk7CisgICAgb3B0aW9uc1tVTklDT0RFXS52YWx1ZT0iNC4xIjsKKyAgICBhcmdjPXVfcGFyc2VBcmdzKGFyZ2MsIGFyZ3YsIExFTkdUSE9GKG9wdGlvbnMpLCBvcHRpb25zKTsKKworICAgIC8qIGVycm9yIGhhbmRsaW5nLCBwcmludGluZyB1c2FnZSBtZXNzYWdlICovCisgICAgaWYoYXJnYzwwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgImVycm9yIGluIGNvbW1hbmQgbGluZSBhcmd1bWVudCBcIiVzXCJcbiIsCisgICAgICAgICAgICBhcmd2Wy1hcmdjXSk7CisgICAgfSBlbHNlIGlmKGFyZ2M8MikgeworICAgICAgICBhcmdjPS0xOworICAgIH0KKyAgICBpZihhcmdjPDAgfHwgb3B0aW9uc1tIRUxQX0hdLmRvZXNPY2N1ciB8fCBvcHRpb25zW0hFTFBfUVVFU1RJT05fTUFSS10uZG9lc09jY3VyKSB7CisgICAgICAgIC8qCisgICAgICAgICAqIEJyb2tlbiBpbnRvIGNodWNrcyBiZWNhdXNlIHRoZSBDODkgc3RhbmRhcmQgc2F5cyB0aGUgbWluaW11bQorICAgICAgICAgKiByZXF1aXJlZCBzdXBwb3J0ZWQgc3RyaW5nIGxlbmd0aCBpcyA1MDkgYnl0ZXMuCisgICAgICAgICAqLworICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICJVc2FnZTogJXMgWy0xWyt8LV1dIFstdlsrfC1dXSBbLWNbK3wtXV0gW2ZpbGVuYW1lX3VkIFtmaWxlbmFtZV9uYV1dXG4iCisgICAgICAgICAgICAiXG4iCisgICAgICAgICAgICAiUmVhZCB0aGUgVW5pY29kZURhdGEudHh0IGZpbGUgYW5kIFxuIgorICAgICAgICAgICAgImNyZWF0ZSBhIGJpbmFyeSBmaWxlICIgREFUQV9OQU1FICIuIiBEQVRBX1RZUEUgIiB3aXRoIHRoZSBjaGFyYWN0ZXIgbmFtZXNcbiIKKyAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICJcdGZpbGVuYW1lX3VkICBhYnNvbHV0ZSBwYXRoL2ZpbGVuYW1lIGZvciB0aGUgVW5pY29kZURhdGEudHh0IGZpbGVcbiIKKyAgICAgICAgICAgICJcdCAgICAgICAgICAgICAoZGVmYXVsdDogc3RhbmRhcmQgaW5wdXQpXG4iCisgICAgICAgICAgICAiXHRmaWxlbmFtZV9uYSAgYWJzb2x1dGUgcGF0aC9maWxlbmFtZSBmb3IgdGhlIE5hbWVBbGlhc2VzLnR4dCBmaWxlXG4iCisgICAgICAgICAgICAiXHQgICAgICAgICAgICAgKGRlZmF1bHQ6IG5vIG5hbWUgYWxpYXNlcylcbiIKKyAgICAgICAgICAgICJcbiIsCisgICAgICAgICAgICBhcmd2WzBdKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAiT3B0aW9uczpcbiIKKyAgICAgICAgICAgICJcdC1oIG9yIC0/IG9yIC0taGVscCAgdGhpcyB1c2FnZSB0ZXh0XG4iCisgICAgICAgICAgICAiXHQtdiBvciAtLXZlcmJvc2UgICAgIHZlcmJvc2Ugb3V0cHV0XG4iCisgICAgICAgICAgICAiXHQtcSBvciAtLXF1aWV0ICAgICAgIG5vIG91dHB1dFxuIgorICAgICAgICAgICAgIlx0LWMgb3IgLS1jb3B5cmlnaHQgICBpbmNsdWRlIGEgY29weXJpZ2h0IG5vdGljZVxuIgorICAgICAgICAgICAgIlx0LWQgb3IgLS1kZXN0ZGlyICAgICBkZXN0aW5hdGlvbiBkaXJlY3RvcnksIGZvbGxvd2VkIGJ5IHRoZSBwYXRoXG4iCisgICAgICAgICAgICAiXHQtdSBvciAtLXVuaWNvZGUgICAgIFVuaWNvZGUgdmVyc2lvbiwgZm9sbG93ZWQgYnkgdGhlIHZlcnNpb24gbGlrZSAzLjAuMFxuIik7CisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgIlx0LTEgb3IgLS11bmljb2RlMS1uYW1lcyAgICAgc3RvcmUgVW5pY29kZSAxLjAgY2hhcmFjdGVyIG5hbWVzXG4iCisgICAgICAgICAgICAiXHQgICAgICAtLW5vLWlzby1jb21tZW50cyAgICBkbyBub3Qgc3RvcmUgSVNPIGNvbW1lbnRzXG4iCisgICAgICAgICAgICAiXHQgICAgICAtLW9ubHktaXNvLWNvbW1lbnRzICB3cml0ZSB1Y29tbWVudC5pY3Ugd2l0aCBvbmx5IElTTyBjb21tZW50c1xuIik7CisgICAgICAgIHJldHVybiBhcmdjPDAgPyBVX0lMTEVHQUxfQVJHVU1FTlRfRVJST1IgOiBVX1pFUk9fRVJST1I7CisgICAgfQorCisgICAgLyogZ2V0IHRoZSBvcHRpb25zIHZhbHVlcyAqLworICAgIGJlVmVyYm9zZT1vcHRpb25zW1ZFUkJPU0VdLmRvZXNPY2N1cjsKKyAgICBiZVF1aWV0PW9wdGlvbnNbUVVJRVRdLmRvZXNPY2N1cjsKKyAgICBoYXZlQ29weXJpZ2h0PW9wdGlvbnNbQ09QWVJJR0hUXS5kb2VzT2NjdXI7CisgICAgbW9yZU9wdGlvbnMuc3RvcmUxME5hbWVzPW9wdGlvbnNbVU5JQ09ERTFfTkFNRVNdLmRvZXNPY2N1cjsKKyAgICBtb3JlT3B0aW9ucy5zdG9yZUlTT0NvbW1lbnRzPSFvcHRpb25zW05PX0lTT19DT01NRU5UU10uZG9lc09jY3VyOworICAgIGlmKG9wdGlvbnNbT05MWV9JU09fQ09NTUVOVFNdLmRvZXNPY2N1cikgeworICAgICAgICBtb3JlT3B0aW9ucy5zdG9yZU5hbWVzPW1vcmVPcHRpb25zLnN0b3JlMTBOYW1lcz1GQUxTRTsKKyAgICAgICAgbW9yZU9wdGlvbnMuc3RvcmVJU09Db21tZW50cz1UUlVFOworICAgIH0KKworICAgIC8qIHNldCB0aGUgVW5pY29kZSB2ZXJzaW9uICovCisgICAgdV92ZXJzaW9uRnJvbVN0cmluZyh2ZXJzaW9uLCBvcHRpb25zW1VOSUNPREVdLnZhbHVlKTsKKyAgICB1cHJ2X21lbWNweShkYXRhSW5mby5kYXRhVmVyc2lvbiwgdmVyc2lvbiwgNCk7CisgICAgdWNkVmVyc2lvbj1maW5kVW5pY29kZVZlcnNpb24odmVyc2lvbik7CisKKyAgICBpbml0KCk7CisgICAgaWYoYXJnYz49MykgeworICAgICAgICBwYXJzZU5hbWVBbGlhc2VzKGFyZ3ZbMl0sICZtb3JlT3B0aW9ucyk7CisgICAgfQorICAgIHBhcnNlREIoYXJnYz49MiA/IGFyZ3ZbMV0gOiAiLSIsICZtb3JlT3B0aW9ucyk7CisgICAgY29tcHJlc3MoKTsKKyAgICBnZW5lcmF0ZURhdGEob3B0aW9uc1tERVNURElSXS52YWx1ZSwgJm1vcmVPcHRpb25zKTsKKworICAgIHVfY2xlYW51cCgpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAoraW5pdCgpIHsKKyAgICBpbnQgaTsKKworICAgIGZvcihpPTA7IGk8MjU2OyArK2kpIHsKKyAgICAgICAgdG9rZW5zW2ldPTA7CisgICAgfQorfQorCisvKiBwYXJzaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBnZXQgYSBuYW1lLCBzdHJpcCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlICovCitzdGF0aWMgaW50MTZfdAorZ2V0TmFtZShjaGFyICoqcFN0YXJ0LCBjaGFyICpsaW1pdCkgeworICAgIC8qIHN0cmlwIGxlYWRpbmcgd2hpdGVzcGFjZSAqLworICAgIGNoYXIgKnN0YXJ0PShjaGFyICopdV9za2lwV2hpdGVzcGFjZSgqcFN0YXJ0KTsKKworICAgIC8qIHN0cmlwIHRyYWlsaW5nIHdoaXRlc3BhY2UgKi8KKyAgICB3aGlsZShzdGFydDxsaW1pdCAmJiAoKihsaW1pdC0xKT09JyAnIHx8ICoobGltaXQtMSk9PSdcdCcpKSB7CisgICAgICAgIC0tbGltaXQ7CisgICAgfQorCisgICAgLyogcmV0dXJuIHJlc3VsdHMgKi8KKyAgICAqcFN0YXJ0PXN0YXJ0OworICAgIHJldHVybiAoaW50MTZfdCkobGltaXQtc3RhcnQpOworfQorCitzdGF0aWMgdm9pZCBVX0NBTExDT05WCituYW1lQWxpYXNlc0xpbmVGbih2b2lkICpjb250ZXh0LAorICAgICAgIGNoYXIgKmZpZWxkc1tdWzJdLCBpbnQzMl90IGZpZWxkQ291bnQsCisgICAgICAgVUVycm9yQ29kZSAqcEVycm9yQ29kZSkgeworICAgIGNoYXIgKm5hbWU7CisgICAgaW50MTZfdCBsZW5ndGg9MDsKKyAgICBzdGF0aWMgdWludDMyX3QgcHJldkNvZGU9MDsKKyAgICB1aW50MzJfdCBjb2RlPTA7CisKKyAgICBpZihVX0ZBSUxVUkUoKnBFcnJvckNvZGUpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLyogZ2V0IHRoZSBjaGFyYWN0ZXIgY29kZSAqLworICAgIGNvZGU9dXBydl9zdHJ0b3VsKGZpZWxkc1swXVswXSwgTlVMTCwgMTYpOworCisgICAgLyogZ2V0IHRoZSBjaGFyYWN0ZXIgbmFtZSAqLworICAgIG5hbWU9ZmllbGRzWzFdWzBdOworICAgIGxlbmd0aD1nZXROYW1lKCZuYW1lLCBmaWVsZHNbMV1bMV0pOworICAgIGlmKGxlbmd0aD09MCB8fCBsZW5ndGg+PXNpemVvZihjcE5hbWVBbGlhc2VzW2NwTmFtZUFsaWFzZXNUb3BdLm5hbWVBbGlhcykpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5uYW1lczogZXJyb3IgLSBuYW1lIGFsaWFzICVzIGVtcHR5IG9yIHRvbyBsb25nIGZvciBjb2RlIHBvaW50IFUrJTA0bHhcbiIsCisgICAgICAgICAgICAgICAgbmFtZSwgKHVuc2lnbmVkIGxvbmcpY29kZSk7CisgICAgICAgICpwRXJyb3JDb2RlPVVfUEFSU0VfRVJST1I7CisgICAgICAgIGV4aXQoVV9QQVJTRV9FUlJPUik7CisgICAgfQorCisgICAgLyogY2hlY2sgZm9yIG5vbi1jaGFyYWN0ZXIgY29kZSBwb2ludHMgKi8KKyAgICBpZighVV9JU19VTklDT0RFX0NIQVIoY29kZSkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5uYW1lczogZXJyb3IgLSBuYW1lIGFsaWFzIGZvciBub24tY2hhcmFjdGVyIGNvZGUgcG9pbnQgVSslMDRseFxuIiwKKyAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyljb2RlKTsKKyAgICAgICAgKnBFcnJvckNvZGU9VV9QQVJTRV9FUlJPUjsKKyAgICAgICAgZXhpdChVX1BBUlNFX0VSUk9SKTsKKyAgICB9CisKKyAgICAvKiBjaGVjayB0aGF0IHRoZSBjb2RlIHBvaW50cyAoY29kZSkgYXJlIGluIGFzY2VuZGluZyBvcmRlciAqLworICAgIGlmKGNvZGU8PXByZXZDb2RlICYmIGNvZGU+MCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbm5hbWVzOiBlcnJvciAtIE5hbWVBbGlhc2VzIGVudHJpZXMgb3V0IG9mIG9yZGVyLCBVKyUwNGx4IGFmdGVyIFUrJTA0bHhcbiIsCisgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpY29kZSwgKHVuc2lnbmVkIGxvbmcpcHJldkNvZGUpOworICAgICAgICAqcEVycm9yQ29kZT1VX1BBUlNFX0VSUk9SOworICAgICAgICBleGl0KFVfUEFSU0VfRVJST1IpOworICAgIH0KKyAgICBwcmV2Q29kZT1jb2RlOworCisgICAgaWYoY3BOYW1lQWxpYXNlc1RvcD49TEVOR1RIT0YoY3BOYW1lQWxpYXNlcykpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5uYW1lczogZXJyb3IgLSB0b28gbWFueSBuYW1lIGFsaWFzZXNcbiIpOworICAgICAgICAqcEVycm9yQ29kZT1VX1BBUlNFX0VSUk9SOworICAgICAgICBleGl0KFVfUEFSU0VfRVJST1IpOworICAgIH0KKyAgICBjcE5hbWVBbGlhc2VzW2NwTmFtZUFsaWFzZXNUb3BdLmNvZGU9Y29kZTsKKyAgICB1cHJ2X21lbWNweShjcE5hbWVBbGlhc2VzW2NwTmFtZUFsaWFzZXNUb3BdLm5hbWVBbGlhcywgbmFtZSwgbGVuZ3RoKTsKKyAgICBjcE5hbWVBbGlhc2VzW2NwTmFtZUFsaWFzZXNUb3BdLm5hbWVBbGlhc1tsZW5ndGhdPTA7CisgICAgKytjcE5hbWVBbGlhc2VzVG9wOworCisgICAgcGFyc2VOYW1lKG5hbWUsIGxlbmd0aCk7Cit9CisKK3N0YXRpYyB2b2lkIFVfQ0FMTENPTlYKK2xpbmVGbih2b2lkICpjb250ZXh0LAorICAgICAgIGNoYXIgKmZpZWxkc1tdWzJdLCBpbnQzMl90IGZpZWxkQ291bnQsCisgICAgICAgVUVycm9yQ29kZSAqcEVycm9yQ29kZSkgeworICAgIE9wdGlvbnMgKnN0b3JlT3B0aW9ucz0oT3B0aW9ucyAqKWNvbnRleHQ7CisgICAgY2hhciAqbmFtZXNbNF07CisgICAgaW50MTZfdCBsZW5ndGhzWzRdPXsgMCwgMCwgMCwgMCB9OworICAgIHN0YXRpYyB1aW50MzJfdCBwcmV2Q29kZT0wOworICAgIHVpbnQzMl90IGNvZGU9MDsKKworICAgIGlmKFVfRkFJTFVSRSgqcEVycm9yQ29kZSkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvKiBnZXQgdGhlIGNoYXJhY3RlciBjb2RlICovCisgICAgY29kZT11cHJ2X3N0cnRvdWwoZmllbGRzWzBdWzBdLCBOVUxMLCAxNik7CisKKyAgICAvKiBnZXQgdGhlIGNoYXJhY3RlciBuYW1lICovCisgICAgaWYoc3RvcmVPcHRpb25zLT5zdG9yZU5hbWVzKSB7CisgICAgICAgIG5hbWVzWzBdPWZpZWxkc1sxXVswXTsKKyAgICAgICAgbGVuZ3Roc1swXT1nZXROYW1lKG5hbWVzKzAsIGZpZWxkc1sxXVsxXSk7CisgICAgICAgIGlmKG5hbWVzWzBdWzBdPT0nPCcpIHsKKyAgICAgICAgICAgIC8qIGRvIG5vdCBzdG9yZSBwc2V1ZG8tbmFtZXMgaW4gPD4gYnJhY2tldHMgKi8KKyAgICAgICAgICAgIGxlbmd0aHNbMF09MDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHN0b3JlIDEuMCBuYW1lcyAqLworICAgIC8qIGdldCB0aGUgc2Vjb25kIGNoYXJhY3RlciBuYW1lLCB0aGUgb25lIGZyb20gVW5pY29kZSAxLjAgKi8KKyAgICBpZihzdG9yZU9wdGlvbnMtPnN0b3JlMTBOYW1lcykgeworICAgICAgICBuYW1lc1sxXT1maWVsZHNbMTBdWzBdOworICAgICAgICBsZW5ndGhzWzFdPWdldE5hbWUobmFtZXMrMSwgZmllbGRzWzEwXVsxXSk7CisgICAgICAgIGlmKG5hbWVzWzFdWzBdPT0nPCcpIHsKKyAgICAgICAgICAgIC8qIGRvIG5vdCBzdG9yZSBwc2V1ZG8tbmFtZXMgaW4gPD4gYnJhY2tldHMgKi8KKyAgICAgICAgICAgIGxlbmd0aHNbMV09MDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGdldCB0aGUgSVNPIDEwNjQ2IGNvbW1lbnQgKi8KKyAgICBpZihzdG9yZU9wdGlvbnMtPnN0b3JlSVNPQ29tbWVudHMpIHsKKyAgICAgICAgbmFtZXNbMl09ZmllbGRzWzExXVswXTsKKyAgICAgICAgbGVuZ3Roc1syXT1nZXROYW1lKG5hbWVzKzIsIGZpZWxkc1sxMV1bMV0pOworICAgIH0KKworICAgIGlmKGxlbmd0aHNbMF0rbGVuZ3Roc1sxXStsZW5ndGhzWzJdPT0wKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBjaGVjayBmb3Igbm9uLWNoYXJhY3RlciBjb2RlIHBvaW50cyAqLworICAgIGlmKCFVX0lTX1VOSUNPREVfQ0hBUihjb2RlKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbm5hbWVzOiBlcnJvciAtIHByb3BlcnRpZXMgZm9yIG5vbi1jaGFyYWN0ZXIgY29kZSBwb2ludCBVKyUwNGx4XG4iLAorICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKWNvZGUpOworICAgICAgICAqcEVycm9yQ29kZT1VX1BBUlNFX0VSUk9SOworICAgICAgICBleGl0KFVfUEFSU0VfRVJST1IpOworICAgIH0KKworICAgIC8qIGNoZWNrIHRoYXQgdGhlIGNvZGUgcG9pbnRzIChjb2RlKSBhcmUgaW4gYXNjZW5kaW5nIG9yZGVyICovCisgICAgaWYoY29kZTw9cHJldkNvZGUgJiYgY29kZT4wKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2VubmFtZXM6IGVycm9yIC0gVW5pY29kZURhdGEgZW50cmllcyBvdXQgb2Ygb3JkZXIsIFUrJTA0bHggYWZ0ZXIgVSslMDRseFxuIiwKKyAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyljb2RlLCAodW5zaWduZWQgbG9uZylwcmV2Q29kZSk7CisgICAgICAgICpwRXJyb3JDb2RlPVVfUEFSU0VfRVJST1I7CisgICAgICAgIGV4aXQoVV9QQVJTRV9FUlJPUik7CisgICAgfQorICAgIHByZXZDb2RlPWNvZGU7CisKKyAgICBwYXJzZU5hbWUobmFtZXNbMF0sIGxlbmd0aHNbMF0pOworICAgIHBhcnNlTmFtZShuYW1lc1sxXSwgbGVuZ3Roc1sxXSk7CisgICAgcGFyc2VOYW1lKG5hbWVzWzJdLCBsZW5ndGhzWzJdKTsKKworICAgIGlmKGNwTmFtZUFsaWFzZXNJbmRleDxjcE5hbWVBbGlhc2VzVG9wICYmIGNvZGU+PWNwTmFtZUFsaWFzZXNbY3BOYW1lQWxpYXNlc0luZGV4XS5jb2RlKSB7CisgICAgICAgIGlmKGNvZGU9PWNwTmFtZUFsaWFzZXNbY3BOYW1lQWxpYXNlc0luZGV4XS5jb2RlKSB7CisgICAgICAgICAgICBuYW1lc1szXT1jcE5hbWVBbGlhc2VzW2NwTmFtZUFsaWFzZXNJbmRleF0ubmFtZUFsaWFzOworICAgICAgICAgICAgbGVuZ3Roc1szXT0oaW50MTZfdCl1cHJ2X3N0cmxlbihjcE5hbWVBbGlhc2VzW2NwTmFtZUFsaWFzZXNJbmRleF0ubmFtZUFsaWFzKTsKKyAgICAgICAgICAgICsrY3BOYW1lQWxpYXNlc0luZGV4OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5uYW1lczogZXJyb3IgLSBOYW1lQWxpYXMgYnV0IG5vIFVuaWNvZGVEYXRhIGVudHJ5IGZvciBVKyUwNGx4XG4iLAorICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyljb2RlKTsKKyAgICAgICAgICAgICpwRXJyb3JDb2RlPVVfUEFSU0VfRVJST1I7CisgICAgICAgICAgICBleGl0KFVfUEFSU0VfRVJST1IpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBzZXQgdGhlIGNvdW50IGFyZ3VtZW50IHRvCisgICAgICogMTogb25seSBzdG9yZSByZWd1bGFyIG5hbWVzLCBvciBvbmx5IHN0b3JlIElTTyAxMDY0NiBjb21tZW50cworICAgICAqIDI6IHN0b3JlIHJlZ3VsYXIgYW5kIDEuMCBuYW1lcworICAgICAqIDM6IHN0b3JlIG5hbWVzIGFuZCBJU08gMTA2NDYgY29tbWVudAorICAgICAqIDQ6IGFsc28gc3RvcmUgbmFtZSBhbGlhcworICAgICAqCisgICAgICogYWRkTGluZSgpIHdpbGwgaWdub3JlIGVtcHR5IHRyYWlsaW5nIG5hbWVzCisgICAgICovCisgICAgaWYoc3RvcmVPcHRpb25zLT5zdG9yZU5hbWVzKSB7CisgICAgICAgIC8qIHN0b3JlIG5hbWVzIGFuZCBjb21tZW50cyBhcyBwYXJzZWQgYWNjb3JkaW5nIHRvIHN0b3JlT3B0aW9ucyAqLworICAgICAgICBhZGRMaW5lKGNvZGUsIG5hbWVzLCBsZW5ndGhzLCBMRU5HVEhPRihuYW1lcykpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIHN0b3JlIG9ubHkgSVNPIDEwNjQ2IGNvbW1lbnRzICovCisgICAgICAgIGFkZExpbmUoY29kZSwgbmFtZXMrMiwgbGVuZ3RocysyLCAxKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitwYXJzZU5hbWVBbGlhc2VzKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBPcHRpb25zICpzdG9yZU9wdGlvbnMpIHsKKyAgICBjaGFyICpmaWVsZHNbMl1bMl07CisgICAgVUVycm9yQ29kZSBlcnJvckNvZGU9VV9aRVJPX0VSUk9SOworCisgICAgaWYoIXN0b3JlT3B0aW9ucy0+c3RvcmVOYW1lcykgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHVfcGFyc2VEZWxpbWl0ZWRGaWxlKGZpbGVuYW1lLCAnOycsIGZpZWxkcywgMiwgbmFtZUFsaWFzZXNMaW5lRm4sIE5VTEwsICZlcnJvckNvZGUpOworICAgIGlmKFVfRkFJTFVSRShlcnJvckNvZGUpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2VubmFtZXMgcGFyc2UgZXJyb3I6ICVzXG4iLCB1X2Vycm9yTmFtZShlcnJvckNvZGUpKTsKKyAgICAgICAgZXhpdChlcnJvckNvZGUpOworICAgIH0KKworICAgIGlmKCFiZVF1aWV0KSB7CisgICAgICAgIHByaW50ZigibnVtYmVyIG9mIG5hbWUgYWxpYXNlczogJWx1XG4iLCAodW5zaWduZWQgbG9uZyljcE5hbWVBbGlhc2VzVG9wKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitwYXJzZURCKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBPcHRpb25zICpzdG9yZU9wdGlvbnMpIHsKKyAgICBjaGFyICpmaWVsZHNbMTVdWzJdOworICAgIFVFcnJvckNvZGUgZXJyb3JDb2RlPVVfWkVST19FUlJPUjsKKworICAgIHVfcGFyc2VEZWxpbWl0ZWRGaWxlKGZpbGVuYW1lLCAnOycsIGZpZWxkcywgMTUsIGxpbmVGbiwgc3RvcmVPcHRpb25zLCAmZXJyb3JDb2RlKTsKKyAgICBpZihVX0ZBSUxVUkUoZXJyb3JDb2RlKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbm5hbWVzIHBhcnNlIGVycm9yOiAlc1xuIiwgdV9lcnJvck5hbWUoZXJyb3JDb2RlKSk7CisgICAgICAgIGV4aXQoZXJyb3JDb2RlKTsKKyAgICB9CisgICAgaWYoY3BOYW1lQWxpYXNlc0luZGV4PGNwTmFtZUFsaWFzZXNUb3ApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5uYW1lczogZXJyb3IgLSBOYW1lQWxpYXMgYnV0IG5vIFVuaWNvZGVEYXRhIGVudHJ5IGZvciBVKyUwNGx4XG4iLAorICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKWNwTmFtZUFsaWFzZXNbY3BOYW1lQWxpYXNlc0luZGV4XS5jb2RlKTsKKyAgICAgICAgZXhpdChVX1BBUlNFX0VSUk9SKTsKKyAgICB9CisKKyAgICBpZighYmVRdWlldCkgeworICAgICAgICBwcmludGYoInNpemUgb2YgYWxsIG5hbWVzIGluIHRoZSBkYXRhYmFzZTogJWx1XG4iLAorICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpbGluZVRvcCk7CisgICAgICAgIHByaW50ZigibnVtYmVyIG9mIG5hbWVkIFVuaWNvZGUgY2hhcmFjdGVyczogJWx1XG4iLAorICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpbGluZUNvdW50KTsKKyAgICAgICAgcHJpbnRmKCJudW1iZXIgb2Ygd29yZHMgaW4gdGhlIGRpY3Rpb25hcnkgZnJvbSB0aGVzZSBuYW1lczogJWx1XG4iLAorICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpd29yZENvdW50KTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitwYXJzZU5hbWUoY2hhciAqbmFtZSwgaW50MTZfdCBsZW5ndGgpIHsKKyAgICBpbnQxNl90IHN0YXJ0PTAsIGxpbWl0LCB3b3JkTGVuZ3RoLyosIHByZXZTdGFydD0tMSovOworICAgIFdvcmQgKndvcmQ7CisKKyAgICB3aGlsZShzdGFydDxsZW5ndGgpIHsKKyAgICAgICAgLyogc2tpcCBhbnkgIm5vaXNlIiBjaGFyYWN0ZXJzICovCisgICAgICAgIGxpbWl0PXNraXBOb2lzZShuYW1lLCBzdGFydCwgbGVuZ3RoKTsKKyAgICAgICAgaWYoc3RhcnQ8bGltaXQpIHsKKyAgICAgICAgICAgIC8qcHJldlN0YXJ0PS0xOyovCisgICAgICAgICAgICBzdGFydD1saW1pdDsKKyAgICAgICAgfQorICAgICAgICBpZihzdGFydD09bGVuZ3RoKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGdldCBhIHdvcmQgYW5kIGFkZCBpdCBpZiBpdCBpcyBsb25nZXIgdGhhbiAxICovCisgICAgICAgIGxpbWl0PWdldFdvcmQobmFtZSwgc3RhcnQsIGxlbmd0aCk7CisgICAgICAgIHdvcmRMZW5ndGg9KGludDE2X3QpKGxpbWl0LXN0YXJ0KTsKKyAgICAgICAgaWYod29yZExlbmd0aD4xKSB7CisgICAgICAgICAgICB3b3JkPWZpbmRXb3JkKG5hbWUrc3RhcnQsIHdvcmRMZW5ndGgpOworICAgICAgICAgICAgaWYod29yZD09TlVMTCkgeworICAgICAgICAgICAgICAgIHdvcmQ9YWRkV29yZChuYW1lK3N0YXJ0LCB3b3JkTGVuZ3RoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvdW50V29yZCh3b3JkKTsKKyAgICAgICAgfQorCisjaWYgMAorICAgICAgICAvKgorICAgICAgICAgKiBpZiB0aGVyZSB3YXMgYSB3b3JkIGJlZm9yZSB0aGlzCisgICAgICAgICAqICh3aXRoIG5vIG5vaXNlIGluIGJldHdlZW4pLCB0aGVuIGFkZCB0aGUgcGFpciBvZiB3b3JkcywgdG9vCisgICAgICAgICAqLworICAgICAgICBpZihwcmV2U3RhcnQhPS0xKSB7CisgICAgICAgICAgICB3b3JkTGVuZ3RoPWxpbWl0LXByZXZTdGFydDsKKyAgICAgICAgICAgIHdvcmQ9ZmluZFdvcmQobmFtZStwcmV2U3RhcnQsIHdvcmRMZW5ndGgpOworICAgICAgICAgICAgaWYod29yZD09TlVMTCkgeworICAgICAgICAgICAgICAgIHdvcmQ9YWRkV29yZChuYW1lK3ByZXZTdGFydCwgd29yZExlbmd0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb3VudFdvcmQod29yZCk7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIC8qcHJldlN0YXJ0PXN0YXJ0OyovCisgICAgICAgIHN0YXJ0PWxpbWl0OworICAgIH0KK30KKworc3RhdGljIFVCb29sIFVfSU5MSU5FCitpc1dvcmRDaGFyKGNoYXIgYykgeworICAgIHJldHVybiAoJ0EnPD1jICYmIGM8PSdJJykgfHwgLyogRUJDRElDLXNhZmUgY2hlY2sgZm9yIGxldHRlcnMgKi8KKyAgICAgICAgICAgKCdKJzw9YyAmJiBjPD0nUicpIHx8CisgICAgICAgICAgICgnUyc8PWMgJiYgYzw9J1onKSB8fAorCisgICAgICAgICAgICgnYSc8PWMgJiYgYzw9J2knKSB8fCAvKiBsb3dlcmNhc2UgbGV0dGVycyBmb3IgSVNPIGNvbW1lbnRzICovCisgICAgICAgICAgICgnaic8PWMgJiYgYzw9J3InKSB8fAorICAgICAgICAgICAoJ3MnPD1jICYmIGM8PSd6JykgfHwKKworICAgICAgICAgICAoJzAnPD1jICYmIGM8PSc5Jyk7Cit9CisKK3N0YXRpYyBpbnQxNl90Citza2lwTm9pc2UoY2hhciAqbGluZSwgaW50MTZfdCBzdGFydCwgaW50MTZfdCBsaW1pdCkgeworICAgIC8qIHNraXAgYW55dGhpbmcgdGhhdCBpcyBub3QgcGFydCBvZiBhIHdvcmQgaW4gdGhpcyBzZW5zZSAqLworICAgIHdoaWxlKHN0YXJ0PGxpbWl0ICYmICFpc1dvcmRDaGFyKGxpbmVbc3RhcnRdKSkgeworICAgICAgICArK3N0YXJ0OworICAgIH0KKworICAgIHJldHVybiBzdGFydDsKK30KKworc3RhdGljIGludDE2X3QKK2dldFdvcmQoY2hhciAqbGluZSwgaW50MTZfdCBzdGFydCwgaW50MTZfdCBsaW1pdCkgeworICAgIGNoYXIgYz0wOyAvKiBpbml0aWFsaXplIHRvIGF2b2lkIGEgY29tcGlsZXIgd2FybmluZyBhbHRob3VnaCB0aGUgY29kZSB3YXMgc2FmZSAqLworCisgICAgLyogYSB1bmljb2RlIGNoYXJhY3RlciBuYW1lIHdvcmQgY29uc2lzdHMgb2YgQS1aMC05ICovCisgICAgd2hpbGUoc3RhcnQ8bGltaXQgJiYgaXNXb3JkQ2hhcihsaW5lW3N0YXJ0XSkpIHsKKyAgICAgICAgKytzdGFydDsKKyAgICB9CisKKyAgICAvKiBpbmNsdWRlIGEgZm9sbG93aW5nIHNwYWNlIG9yIGRhc2ggKi8KKyAgICBpZihzdGFydDxsaW1pdCAmJiAoKGM9bGluZVtzdGFydF0pPT0nICcgfHwgYz09Jy0nKSkgeworICAgICAgICArK3N0YXJ0OworICAgIH0KKworICAgIHJldHVybiBzdGFydDsKK30KKworLyogY29tcHJlc3NpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQKK2NvbXByZXNzKCkgeworICAgIHVpbnQzMl90IGksIGxldHRlckNvdW50OworICAgIGludDE2X3Qgd29yZE51bWJlcjsKKyAgICBVRXJyb3JDb2RlIGVycm9yQ29kZTsKKworICAgIC8qIHNvcnQgdGhlIHdvcmRzIGluIHJldmVyc2Ugb3JkZXIgYnkgd2VpZ2h0ICovCisgICAgZXJyb3JDb2RlPVVfWkVST19FUlJPUjsKKyAgICB1cHJ2X3NvcnRBcnJheSh3b3Jkcywgd29yZENvdW50LCBzaXplb2YoV29yZCksCisgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVXb3JkcywgTlVMTCwgRkFMU0UsICZlcnJvckNvZGUpOworCisgICAgLyogcmVtb3ZlIHRoZSB3b3JkcyB0aGF0IGRvIG5vdCBzYXZlIGFueXRoaW5nICovCisgICAgd2hpbGUod29yZENvdW50PjAgJiYgd29yZHNbd29yZENvdW50LTFdLndlaWdodDwxKSB7CisgICAgICAgIC0td29yZENvdW50OworICAgIH0KKworICAgIC8qIGNvdW50IHRoZSBsZXR0ZXJzIGluIHRoZSB0b2tlbiByYW5nZSAqLworICAgIGxldHRlckNvdW50PTA7CisgICAgZm9yKGk9TEVBREJZVEVfTElNSVQ7IGk8MjU2OyArK2kpIHsKKyAgICAgICAgaWYodG9rZW5zW2ldPT0tMSkgeworICAgICAgICAgICAgKytsZXR0ZXJDb3VudDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZighYmVRdWlldCkgeworICAgICAgICBwcmludGYoIm51bWJlciBvZiBsZXR0ZXJzIHVzZWQgaW4gdGhlIG5hbWVzOiAlZFxuIiwgKGludClsZXR0ZXJDb3VudCk7CisgICAgfQorCisgICAgLyogZG8gd2UgbmVlZCBkb3VibGUtYnl0ZSB0b2tlbnM/ICovCisgICAgaWYod29yZENvdW50K2xldHRlckNvdW50PD0yNTYpIHsKKyAgICAgICAgLyogbm8sIHNpbmdsZS1ieXRlIHRva2VucyBhcmUgZW5vdWdoICovCisgICAgICAgIGxlYWRCeXRlQ291bnQ9MDsKKyAgICAgICAgZm9yKGk9MCwgd29yZE51bWJlcj0wOyB3b3JkTnVtYmVyPChpbnQxNl90KXdvcmRDb3VudDsgKytpKSB7CisgICAgICAgICAgICBpZih0b2tlbnNbaV0hPS0xKSB7CisgICAgICAgICAgICAgICAgdG9rZW5zW2ldPXdvcmROdW1iZXI7CisgICAgICAgICAgICAgICAgaWYoYmVWZXJib3NlKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigidG9rZW5zWzB4JTAzeF06IHdvcmQlOGxkIFwiJS4qc1wiXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpaSwgKGxvbmcpd29yZHNbd29yZE51bWJlcl0ud2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRzW3dvcmROdW1iZXJdLmxlbmd0aCwgd29yZHNbd29yZE51bWJlcl0ucyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICsrd29yZE51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0b2tlbkNvdW50PWk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogVGhlIHRva2VucyB0aGF0IG5lZWQgdHdvIHRva2VuIGJ5dGVzCisgICAgICAgICAqIGdldCB0aGVpciB3ZWlnaHQgcmVkdWNlZCBieSB0aGVpciBjb3VudAorICAgICAgICAgKiBiZWNhdXNlIHRoZXkgc2F2ZSBsZXNzLgorICAgICAgICAgKi8KKyAgICAgICAgdG9rZW5Db3VudD0yNTYtbGV0dGVyQ291bnQ7CisgICAgICAgIGZvcihpPXRva2VuQ291bnQ7IGk8d29yZENvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHdvcmRzW2ldLndlaWdodC09d29yZHNbaV0uY291bnQ7CisgICAgICAgIH0KKworICAgICAgICAvKiBzb3J0IHRoZXNlIHdvcmRzIGluIHJldmVyc2Ugb3JkZXIgYnkgd2VpZ2h0ICovCisgICAgICAgIGVycm9yQ29kZT1VX1pFUk9fRVJST1I7CisgICAgICAgIHVwcnZfc29ydEFycmF5KHdvcmRzK3Rva2VuQ291bnQsIHdvcmRDb3VudC10b2tlbkNvdW50LCBzaXplb2YoV29yZCksCisgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlV29yZHMsIE5VTEwsIEZBTFNFLCAmZXJyb3JDb2RlKTsKKworICAgICAgICAvKiByZW1vdmUgdGhlIHdvcmRzIHRoYXQgZG8gbm90IHNhdmUgYW55dGhpbmcgKi8KKyAgICAgICAgd2hpbGUod29yZENvdW50PjAgJiYgd29yZHNbd29yZENvdW50LTFdLndlaWdodDwxKSB7CisgICAgICAgICAgICAtLXdvcmRDb3VudDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGhvdyBtYW55IHRva2VucyBhbmQgbGVhZCBieXRlcyBkbyB3ZSBoYXZlIG5vdz8gKi8KKyAgICAgICAgdG9rZW5Db3VudD13b3JkQ291bnQrbGV0dGVyQ291bnQrKExFQURCWVRFX0xJTUlULTEpOworICAgICAgICAvKgorICAgICAgICAgKiBhZGp1c3QgdXB3YXJkcyB0byB0YWtlIGludG8gYWNjb3VudCB0aGF0CisgICAgICAgICAqIGRvdWJsZS1ieXRlIHRva2VucyBtdXN0IG5vdAorICAgICAgICAgKiB1c2UgTkFNRV9TRVBBUkFUT1JfQ0hBUiBhcyBhIHNlY29uZCBieXRlCisgICAgICAgICAqLworICAgICAgICB0b2tlbkNvdW50Kz0odG9rZW5Db3VudC0yNTYrMjU0KS8yNTU7CisKKyAgICAgICAgbGVhZEJ5dGVDb3VudD0oaW50MTZfdCkodG9rZW5Db3VudD4+OCk7CisgICAgICAgIGlmKGxlYWRCeXRlQ291bnQ8TEVBREJZVEVfTElNSVQpIHsKKyAgICAgICAgICAgIC8qIGFkanVzdCBmb3IgdGhlIHJlYWwgbnVtYmVyIG9mIGxlYWQgYnl0ZXMgKi8KKyAgICAgICAgICAgIHRva2VuQ291bnQtPShMRUFEQllURV9MSU1JVC0xKS1sZWFkQnl0ZUNvdW50OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogbGltaXQgdGhlIG51bWJlciBvZiBsZWFkIGJ5dGVzICovCisgICAgICAgICAgICBsZWFkQnl0ZUNvdW50PUxFQURCWVRFX0xJTUlULTE7CisgICAgICAgICAgICB0b2tlbkNvdW50PUxFQURCWVRFX0xJTUlUKjI1NjsKKyAgICAgICAgICAgIHdvcmRDb3VudD10b2tlbkNvdW50LWxldHRlckNvdW50LShMRUFEQllURV9MSU1JVC0xKTsKKyAgICAgICAgICAgIC8qIGFkanVzdCBhZ2FpbiB0byBza2lwIGRvdWJsZS1ieXRlIHRva2VucyB3aXRoICc7JyAqLworICAgICAgICAgICAgd29yZENvdW50LT0odG9rZW5Db3VudC0yNTYrMjU0KS8yNTU7CisgICAgICAgIH0KKworICAgICAgICAvKiBzZXQgdG9rZW4gMCB0byB3b3JkIDAgKi8KKyAgICAgICAgdG9rZW5zWzBdPTA7CisgICAgICAgIGlmKGJlVmVyYm9zZSkgeworICAgICAgICAgICAgcHJpbnRmKCJ0b2tlbnNbMHgwMDBdOiB3b3JkJThsZCBcIiUuKnNcIlxuIiwKKyAgICAgICAgICAgICAgICAgICAgKGxvbmcpd29yZHNbMF0ud2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICB3b3Jkc1swXS5sZW5ndGgsIHdvcmRzWzBdLnMpOworICAgICAgICB9CisgICAgICAgIHdvcmROdW1iZXI9MTsKKworICAgICAgICAvKiBzZXQgdGhlIGxlYWQgYnl0ZSB0b2tlbnMgKi8KKyAgICAgICAgZm9yKGk9MTsgKGludDE2X3QpaTw9bGVhZEJ5dGVDb3VudDsgKytpKSB7CisgICAgICAgICAgICB0b2tlbnNbaV09LTI7CisgICAgICAgIH0KKworICAgICAgICAvKiBzZXQgdGhlIHRva2VucyAqLworICAgICAgICBmb3IoOyBpPDI1NjsgKytpKSB7CisgICAgICAgICAgICAvKiBpZiBzdG9yZTEwTmFtZXMgdGhlbiB0aGUgcGFyc2VyIHNldCB0b2tlbnNbTkFNRV9TRVBBUkFUT1JfQ0hBUl09LTEgKi8KKyAgICAgICAgICAgIGlmKHRva2Vuc1tpXSE9LTEpIHsKKyAgICAgICAgICAgICAgICB0b2tlbnNbaV09d29yZE51bWJlcjsKKyAgICAgICAgICAgICAgICBpZihiZVZlcmJvc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJ0b2tlbnNbMHglMDN4XTogd29yZCU4bGQgXCIlLipzXCJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludClpLCAobG9uZyl3b3Jkc1t3b3JkTnVtYmVyXS53ZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZHNbd29yZE51bWJlcl0ubGVuZ3RoLCB3b3Jkc1t3b3JkTnVtYmVyXS5zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKyt3b3JkTnVtYmVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogY29udGludWUgYWJvdmUgMjU1IHdoZXJlIHRoZXJlIGFyZSBubyBsZXR0ZXJzICovCisgICAgICAgIGZvcig7ICh1aW50MzJfdCl3b3JkTnVtYmVyPHdvcmRDb3VudDsgKytpKSB7CisgICAgICAgICAgICBpZigoaSYweGZmKT09TkFNRV9TRVBBUkFUT1JfQ0hBUikgeworICAgICAgICAgICAgICAgIHRva2Vuc1tpXT0tMTsgLyogZG8gbm90IHVzZSBOQU1FX1NFUEFSQVRPUl9DSEFSIGFzIGEgc2Vjb25kIHRva2VuIGJ5dGUgKi8KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdG9rZW5zW2ldPXdvcmROdW1iZXI7CisgICAgICAgICAgICAgICAgaWYoYmVWZXJib3NlKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigidG9rZW5zWzB4JTAzeF06IHdvcmQlOGxkIFwiJS4qc1wiXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpaSwgKGxvbmcpd29yZHNbd29yZE51bWJlcl0ud2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRzW3dvcmROdW1iZXJdLmxlbmd0aCwgd29yZHNbd29yZE51bWJlcl0ucyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICsrd29yZE51bWJlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0b2tlbkNvdW50PWk7IC8qIHNob3VsZCBiZSBhbHJlYWR5IHRva2VuQ291bnQ9e2kgb3IgaSsxfSAqLworICAgIH0KKworICAgIGlmKCFiZVF1aWV0KSB7CisgICAgICAgIHByaW50ZigibnVtYmVyIG9mIGxlYWQgYnl0ZXM6ICVkXG4iLCBsZWFkQnl0ZUNvdW50KTsKKyAgICAgICAgcHJpbnRmKCJudW1iZXIgb2Ygc2luZ2xlLWJ5dGUgdG9rZW5zOiAlbHVcbiIsCisgICAgICAgICAgICAodW5zaWduZWQgbG9uZykyNTYtbGV0dGVyQ291bnQtbGVhZEJ5dGVDb3VudCk7CisgICAgICAgIHByaW50ZigibnVtYmVyIG9mIHRva2VuczogJWx1XG4iLCAodW5zaWduZWQgbG9uZyl0b2tlbkNvdW50KTsKKyAgICB9CisKKyAgICBjb21wcmVzc0xpbmVzKCk7Cit9CisKK3N0YXRpYyB2b2lkCitjb21wcmVzc0xpbmVzKCkgeworICAgIExpbmUgKmxpbmU9TlVMTDsKKyAgICB1aW50MzJfdCBpPTAsIGluTGluZSwgb3V0TGluZT0weGZmZmZmZmZmIC8qICh1aW50MzJfdCkoLTEpICovLAorICAgICAgICAgICAgIGdyb3VwTVNCPTB4ZmZmZiwgbGluZUNvdW50MjsKKyAgICBpbnQxNl90IGdyb3VwVG9wPTA7CisKKyAgICAvKiBzdG9yZSB0aGUgZ3JvdXBzIGxpa2UgbGluZXMsIHdpdGggY29tcHJlc3NlZCBkYXRhIGFmdGVyIHJhdyBzdHJpbmdzICovCisgICAgZ3JvdXBCb3R0b209bGluZVRvcDsKKyAgICBsaW5lQ291bnQyPWxpbmVDb3VudDsKKyAgICBsaW5lQ291bnQ9MDsKKworICAgIC8qIGxvb3Agb3ZlciBhbGwgbGluZXMgKi8KKyAgICB3aGlsZShpPGxpbmVDb3VudDIpIHsKKyAgICAgICAgbGluZT1saW5lcytpKys7CisgICAgICAgIGluTGluZT1saW5lLT5jb2RlOworCisgICAgICAgIC8qIHNlZ21lbnQgdGhlIGxpbmVzIHRvIGdyb3VwcyBvZiAzMiAqLworICAgICAgICBpZihpbkxpbmU+PkdST1VQX1NISUZUIT1ncm91cE1TQikgeworICAgICAgICAgICAgLyogZmluaXNoIHRoZSBjdXJyZW50IGdyb3VwIHdpdGggZW1wdHkgbGluZXMgKi8KKyAgICAgICAgICAgIHdoaWxlKCgrK291dExpbmUmR1JPVVBfTUFTSykhPTApIHsKKyAgICAgICAgICAgICAgICBhcHBlbmRMaW5lTGVuZ3RoKDApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBzdG9yZSB0aGUgZ3JvdXAgbGlrZSBhIGxpbmUgKi8KKyAgICAgICAgICAgIGlmKGdyb3VwVG9wPjApIHsKKyAgICAgICAgICAgICAgICBpZihncm91cFRvcD5HUk9VUF9TVE9SRV9TSVpFKSB7CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2VubmFtZXM6IGdyb3VwIHN0b3JlIG92ZXJmbG93XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgZXhpdChVX0JVRkZFUl9PVkVSRkxPV19FUlJPUik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFkZEdyb3VwKGdyb3VwTVNCLCBncm91cFN0b3JlLCBncm91cFRvcCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIHN0YXJ0IHRoZSBuZXcgZ3JvdXAgKi8KKyAgICAgICAgICAgIGxpbmVMZW5ndGhzVG9wPTA7CisgICAgICAgICAgICBncm91cFRvcD0wOworICAgICAgICAgICAgZ3JvdXBNU0I9aW5MaW5lPj5HUk9VUF9TSElGVDsKKyAgICAgICAgICAgIG91dExpbmU9KGluTGluZSZ+R1JPVVBfTUFTSyktMTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHdyaXRlIGVtcHR5IGxpbmVzIGJldHdlZW4gdGhlIHByZXZpb3VzIGxpbmUgaW4gdGhlIGdyb3VwIGFuZCB0aGlzIG9uZSAqLworICAgICAgICB3aGlsZSgrK291dExpbmU8aW5MaW5lKSB7CisgICAgICAgICAgICBhcHBlbmRMaW5lTGVuZ3RoKDApOworICAgICAgICB9CisKKyAgICAgICAgLyogd3JpdGUgY2hhcmFjdGVycyBhbmQgdG9rZW5zIGZvciB0aGlzIGxpbmUgKi8KKyAgICAgICAgYXBwZW5kTGluZUxlbmd0aChjb21wcmVzc0xpbmUobGluZS0+cywgbGluZS0+bGVuZ3RoLCAmZ3JvdXBUb3ApKTsKKyAgICB9CisKKyAgICAvKiBmaW5pc2ggYW5kIHN0b3JlIHRoZSBsYXN0IGdyb3VwICovCisgICAgaWYobGluZSAmJiBncm91cE1TQiE9MHhmZmZmKSB7CisgICAgICAgIC8qIGZpbmlzaCB0aGUgY3VycmVudCBncm91cCB3aXRoIGVtcHR5IGxpbmVzICovCisgICAgICAgIHdoaWxlKCgrK291dExpbmUmR1JPVVBfTUFTSykhPTApIHsKKyAgICAgICAgICAgIGFwcGVuZExpbmVMZW5ndGgoMCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBzdG9yZSB0aGUgZ3JvdXAgbGlrZSBhIGxpbmUgKi8KKyAgICAgICAgaWYoZ3JvdXBUb3A+MCkgeworICAgICAgICAgICAgaWYoZ3JvdXBUb3A+R1JPVVBfU1RPUkVfU0laRSkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2VubmFtZXM6IGdyb3VwIHN0b3JlIG92ZXJmbG93XG4iKTsKKyAgICAgICAgICAgICAgICBleGl0KFVfQlVGRkVSX09WRVJGTE9XX0VSUk9SKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFkZEdyb3VwKGdyb3VwTVNCLCBncm91cFN0b3JlLCBncm91cFRvcCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZighYmVRdWlldCkgeworICAgICAgICBwcmludGYoIm51bWJlciBvZiBncm91cHM6ICVsdVxuIiwgKHVuc2lnbmVkIGxvbmcpbGluZUNvdW50KTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQxNl90Citjb21wcmVzc0xpbmUodWludDhfdCAqcywgaW50MTZfdCBsZW5ndGgsIGludDE2X3QgKnBHcm91cFRvcCkgeworICAgIGludDE2X3Qgc3RhcnQsIGxpbWl0LCB0b2tlbiwgZ3JvdXBUb3A9KnBHcm91cFRvcDsKKworICAgIHN0YXJ0PTA7CisgICAgZG8geworICAgICAgICAvKiB3cml0ZSBhbnkgIm5vaXNlIiBjaGFyYWN0ZXJzICovCisgICAgICAgIGxpbWl0PXNraXBOb2lzZSgoY2hhciAqKXMsIHN0YXJ0LCBsZW5ndGgpOworICAgICAgICB3aGlsZShzdGFydDxsaW1pdCkgeworICAgICAgICAgICAgZ3JvdXBTdG9yZVtncm91cFRvcCsrXT1zW3N0YXJ0KytdOworICAgICAgICB9CisKKyAgICAgICAgaWYoc3RhcnQ9PWxlbmd0aCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiB3cml0ZSBhIHdvcmQsIGFzIHRva2VuIG9yIGRpcmVjdGx5ICovCisgICAgICAgIGxpbWl0PWdldFdvcmQoKGNoYXIgKilzLCBzdGFydCwgbGVuZ3RoKTsKKyAgICAgICAgaWYobGltaXQtc3RhcnQ9PTEpIHsKKyAgICAgICAgICAgIGdyb3VwU3RvcmVbZ3JvdXBUb3ArK109c1tzdGFydCsrXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRva2VuPWZpbmRUb2tlbihzK3N0YXJ0LCAoaW50MTZfdCkobGltaXQtc3RhcnQpKTsKKyAgICAgICAgICAgIGlmKHRva2VuIT0tMSkgeworICAgICAgICAgICAgICAgIGlmKHRva2VuPjB4ZmYpIHsKKyAgICAgICAgICAgICAgICAgICAgZ3JvdXBTdG9yZVtncm91cFRvcCsrXT0odWludDhfdCkodG9rZW4+PjgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBncm91cFN0b3JlW2dyb3VwVG9wKytdPSh1aW50OF90KXRva2VuOworICAgICAgICAgICAgICAgIHN0YXJ0PWxpbWl0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB3aGlsZShzdGFydDxsaW1pdCkgeworICAgICAgICAgICAgICAgICAgICBncm91cFN0b3JlW2dyb3VwVG9wKytdPXNbc3RhcnQrK107CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSB3aGlsZShzdGFydDxsZW5ndGgpOworCisgICAgbGVuZ3RoPShpbnQxNl90KShncm91cFRvcC0qcEdyb3VwVG9wKTsKKyAgICAqcEdyb3VwVG9wPWdyb3VwVG9wOworICAgIHJldHVybiBsZW5ndGg7Cit9CisKK3N0YXRpYyBpbnQzMl90Citjb21wYXJlV29yZHMoY29uc3Qgdm9pZCAqY29udGV4dCwgY29uc3Qgdm9pZCAqd29yZDEsIGNvbnN0IHZvaWQgKndvcmQyKSB7CisgICAgLyogcmV2ZXJzZSBzb3J0IGJ5IHdvcmQgd2VpZ2h0ICovCisgICAgcmV0dXJuICgoV29yZCAqKXdvcmQyKS0+d2VpZ2h0LSgoV29yZCAqKXdvcmQxKS0+d2VpZ2h0OworfQorCisvKiBnZW5lcmF0ZSBvdXRwdXQgZGF0YSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZAorZ2VuZXJhdGVEYXRhKGNvbnN0IGNoYXIgKmRhdGFEaXIsIE9wdGlvbnMgKnN0b3JlT3B0aW9ucykgeworICAgIFVOZXdEYXRhTWVtb3J5ICpwRGF0YTsKKyAgICBVRXJyb3JDb2RlIGVycm9yQ29kZT1VX1pFUk9fRVJST1I7CisgICAgdWludDE2X3QgZ3JvdXBXb3Jkc1szXTsKKyAgICB1aW50MzJfdCBpLCBncm91cFRvcD1saW5lVG9wLCBvZmZzZXQsIHNpemUsCisgICAgICAgICAgICAgdG9rZW5TdHJpbmdPZmZzZXQsIGdyb3Vwc09mZnNldCwgZ3JvdXBTdHJpbmdPZmZzZXQsIGFsZ05hbWVzT2Zmc2V0OworICAgIGxvbmcgZGF0YUxlbmd0aDsKKyAgICBpbnQxNl90IHRva2VuOworCisgICAgcERhdGE9dWRhdGFfY3JlYXRlKGRhdGFEaXIsCisgICAgICAgICAgICAgICAgICAgICAgIERBVEFfVFlQRSwgc3RvcmVPcHRpb25zLT5zdG9yZU5hbWVzID8gREFUQV9OQU1FIDogSVNPX0RBVEFfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICBoYXZlQ29weXJpZ2h0ID8gVV9DT1BZUklHSFRfU1RSSU5HIDogTlVMTCwgJmVycm9yQ29kZSk7CisgICAgaWYoVV9GQUlMVVJFKGVycm9yQ29kZSkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5uYW1lczogdW5hYmxlIHRvIGNyZWF0ZSBkYXRhIG1lbW9yeSwgZXJyb3IgJWRcbiIsIGVycm9yQ29kZSk7CisgICAgICAgIGV4aXQoZXJyb3JDb2RlKTsKKyAgICB9CisKKyAgICAvKiBmaXJzdCwgc2VlIGhvdyBtdWNoIHNwYWNlIHdlIG5lZWQsIGFuZCBwcmVwYXJlIHRoZSB0b2tlbiBzdHJpbmdzICovCisgICAgZm9yKGk9MDsgaTx0b2tlbkNvdW50OyArK2kpIHsKKyAgICAgICAgdG9rZW49dG9rZW5zW2ldOworICAgICAgICBpZih0b2tlbiE9LTEgJiYgdG9rZW4hPS0yKSB7CisgICAgICAgICAgICB0b2tlbnNbaV09KGludDE2X3QpKGFkZFRva2VuKHdvcmRzW3Rva2VuXS5zLCB3b3Jkc1t0b2tlbl0ubGVuZ3RoKS1ncm91cFRvcCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFJlcXVpcmVkIHBhZGRpbmcgZm9yIGRhdGEgc3dhcHBpbmc6CisgICAgICogVGhlIHRva2VuIHRhYmxlIHVuZGVyZ29lcyBhIHBlcm11dGF0aW9uIGR1cmluZyBkYXRhIHN3YXBwaW5nIHdoZW4gdGhlCisgICAgICogaW5wdXQgYW5kIG91dHB1dCBjaGFyc2V0cyBhcmUgZGlmZmVyZW50LgorICAgICAqIFRoZSB0b2tlbiB0YWJsZSBjYW5ub3QgZ3JvdyBkdXJpbmcgc3dhcHBpbmcsIHNvIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQKKyAgICAgKiB0aGUgdGFibGUgaXMgbG9uZyBlbm91Z2ggZm9yIHN1Y2Nlc3NmdWwgaW4tcGxhY2UgcGVybXV0YXRpb24uCisgICAgICoKKyAgICAgKiBXZSBzaW1wbHkgcm91bmQgdXAgdG9rZW5Db3VudCB0byB0aGUgbmV4dCBtdWx0aXBsZSBvZiAyNTYgdG8gYWNjb3VudCBmb3IKKyAgICAgKiBhbGwgcG9zc2libGUgcGVybXV0YXRpb25zLgorICAgICAqCisgICAgICogQW4gb3B0aW1pemF0aW9uIGlzIHBvc3NpYmxlIGlmIHdlIG9ubHkgZXZlciBzd2FwIGJldHdlZW4gQVNDSUkgYW5kIEVCQ0RJQzoKKyAgICAgKgorICAgICAqIElmIHRva2VuQ291bnQ+MjU2LCB0aGVuIGEgc2VtaWNvbG9uIChOQU1FX1NFUEFSQVRPUl9DSEFSKSBpcyB1c2VkCisgICAgICogYW5kIHdpbGwgYmUgc3dhcHBlZCBiZXR3ZWVuIEFTQ0lJIGFuZCBFQkNESUMgYmV0d2VlbgorICAgICAqIHBvc2l0aW9ucyAweDNiIChBU0NJSSBzZW1pY29sb24pIGFuZCAweDVlIChFQkNESUMgc2VtaWNvbG9uKS4KKyAgICAgKiBUaGlzIHNob3VsZCBiZSB0aGUgb25seSAtMSBlbnRyeSBpbiB0b2tlbnNbMjU2Li41MTFdIG9uIHdoaWNoIHRoZSBkYXRhCisgICAgICogc3dhcHBlciBiYXNlcyBpdHMgdHJhaWwgYnl0ZSBwZXJtdXRhdGlvbiBtYXAgKHRyYWlsTWFwW10pLgorICAgICAqCisgICAgICogSXQgd291bGQgYmUgc3VmZmljaWVudCB0byBpbmNyZWFzZSB0b2tlbkNvdW50IHNvIHRoYXQgaXRzIGxvd2VyIDggYml0cworICAgICAqIGFyZSBhdCBsZWFzdCAweDVlKzEgdG8gbWFrZSByb29tIGZvciBzd2FwcGluZyBiZXR3ZWVuIHRoZSB0d28gc2VtaWNvbG9ucy4KKyAgICAgKiBGb3IgdmFsdWVzIGhpZ2hlciB0aGFuIDB4NWUsIHRoZSB0cmFpbCBieXRlIHBlcm11dGF0aW9uIG1hcCAodHJhaWxNYXBbXSkKKyAgICAgKiBzaG91bGQgYWx3YXlzIGJlIGFuIGlkZW50aXR5IG1hcCwgd2hlcmUgd2UgZG8gbm90IG5lZWQgYWRkaXRpb25hbCByb29tLgorICAgICAqLworICAgIGk9dG9rZW5Db3VudDsKKyAgICB0b2tlbkNvdW50PSh0b2tlbkNvdW50KzB4ZmYpJn4weGZmOworICAgIGlmKCFiZVF1aWV0ICYmIGk8dG9rZW5Db3VudCkgeworICAgICAgICBwcmludGYoIm51bWJlciBvZiB0b2tlbnNbXSBwYWRkaW5nIGVudHJpZXMgZm9yIGRhdGEgc3dhcHBpbmc6ICVsdVxuIiwgKHVuc2lnbmVkIGxvbmcpKHRva2VuQ291bnQtaSkpOworICAgIH0KKyAgICBmb3IoOyBpPHRva2VuQ291bnQ7ICsraSkgeworICAgICAgICBpZigoaSYweGZmKT09TkFNRV9TRVBBUkFUT1JfQ0hBUikgeworICAgICAgICAgICAgdG9rZW5zW2ldPS0xOyAvKiBkbyBub3QgdXNlIE5BTUVfU0VQQVJBVE9SX0NIQVIgYXMgYSBzZWNvbmQgdG9rZW4gYnl0ZSAqLworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdG9rZW5zW2ldPTA7IC8qIHVudXNlZCB0b2tlbiBmb3IgcGFkZGluZyAqLworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGUgdGhlIHRvdGFsIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGRhdGEgaW5jbHVkaW5nOgorICAgICAqIC0gdGhlIG9mZnNldCB0byB0aGUgdG9rZW4gc3RyaW5ncywgdWludDMyX3QgKDQpCisgICAgICogLSB0aGUgb2Zmc2V0IHRvIHRoZSBncm91cCB0YWJsZSwgdWludDMyX3QgKDQpCisgICAgICogLSB0aGUgb2Zmc2V0IHRvIHRoZSBncm91cCBzdHJpbmdzLCB1aW50MzJfdCAoNCkKKyAgICAgKiAtIHRoZSBvZmZzZXQgdG8gdGhlIGFsZ29yaXRobWljIG5hbWVzLCB1aW50MzJfdCAoNCkKKyAgICAgKgorICAgICAqIC0gdGhlIG51bWJlciBvZiB0b2tlbnMsIHVpbnQxNl90ICgyKQorICAgICAqIC0gdGhlIHRva2VuIHRhYmxlLCB1aW50MTZfdFt0b2tlbkNvdW50XSAoMip0b2tlbkNvdW50KQorICAgICAqCisgICAgICogLSB0aGUgdG9rZW4gc3RyaW5ncywgZWFjaCB6ZXJvLXRlcm1pbmF0ZWQgKHRva2VuU2l6ZT0obGluZVRvcC1ncm91cFRvcCkpLCAyLXBhZGRlZAorICAgICAqCisgICAgICogLSB0aGUgbnVtYmVyIG9mIGdyb3VwcywgdWludDE2X3QgKDIpCisgICAgICogLSB0aGUgZ3JvdXAgdGFibGUsIHsgdWludDE2X3QgZ3JvdXBNU0IsIHVpbnQxNl90IG9mZnNldEhpZ2gsIHVpbnQxNl90IG9mZnNldExvdyB9WzYqZ3JvdXBDb3VudF0KKyAgICAgKgorICAgICAqIC0gdGhlIGdyb3VwIHN0cmluZ3MgKGdyb3VwVG9wLWdyb3VwQm90dG9tKSwgMi1wYWRkZWQKKyAgICAgKgorICAgICAqIC0gdGhlIHNpemUgb2YgdGhlIGRhdGEgZm9yIHRoZSBhbGdvcml0aG1pYyBuYW1lcworICAgICAqLworICAgIHRva2VuU3RyaW5nT2Zmc2V0PTQrNCs0KzQrMisyKnRva2VuQ291bnQ7CisgICAgZ3JvdXBzT2Zmc2V0PSh0b2tlblN0cmluZ09mZnNldCsobGluZVRvcC1ncm91cFRvcCkrMSkmfjE7CisgICAgZ3JvdXBTdHJpbmdPZmZzZXQ9Z3JvdXBzT2Zmc2V0KzIrNipsaW5lQ291bnQ7CisgICAgYWxnTmFtZXNPZmZzZXQ9KGdyb3VwU3RyaW5nT2Zmc2V0Kyhncm91cFRvcC1ncm91cEJvdHRvbSkrMykmfjM7CisKKyAgICBvZmZzZXQ9Z2VuZXJhdGVBbGdvcml0aG1pY0RhdGEoTlVMTCwgc3RvcmVPcHRpb25zKTsKKyAgICBzaXplPWFsZ05hbWVzT2Zmc2V0K29mZnNldDsKKworICAgIGlmKCFiZVF1aWV0KSB7CisgICAgICAgIHByaW50Zigic2l6ZSBvZiB0aGUgVW5pY29kZSBOYW1lcyBkYXRhOlxuIgorICAgICAgICAgICAgICAgInRvdGFsIGRhdGEgbGVuZ3RoICVsdSwgdG9rZW4gc3RyaW5ncyAlbHUsIGNvbXByZXNzZWQgc3RyaW5ncyAlbHUsIGFsZ29yaXRobWljIG5hbWVzICVsdVxuIiwKKyAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylzaXplLCAodW5zaWduZWQgbG9uZykobGluZVRvcC1ncm91cFRvcCksCisgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpKGdyb3VwVG9wLWdyb3VwQm90dG9tKSwgKHVuc2lnbmVkIGxvbmcpb2Zmc2V0KTsKKyAgICB9CisKKyAgICAvKiB3cml0ZSB0aGUgZGF0YSB0byB0aGUgZmlsZSAqLworICAgIC8qIG9mZnNldHMgKi8KKyAgICB1ZGF0YV93cml0ZTMyKHBEYXRhLCB0b2tlblN0cmluZ09mZnNldCk7CisgICAgdWRhdGFfd3JpdGUzMihwRGF0YSwgZ3JvdXBzT2Zmc2V0KTsKKyAgICB1ZGF0YV93cml0ZTMyKHBEYXRhLCBncm91cFN0cmluZ09mZnNldCk7CisgICAgdWRhdGFfd3JpdGUzMihwRGF0YSwgYWxnTmFtZXNPZmZzZXQpOworCisgICAgLyogdG9rZW4gdGFibGUgKi8KKyAgICB1ZGF0YV93cml0ZTE2KHBEYXRhLCAodWludDE2X3QpdG9rZW5Db3VudCk7CisgICAgdWRhdGFfd3JpdGVCbG9jayhwRGF0YSwgdG9rZW5zLCAyKnRva2VuQ291bnQpOworCisgICAgLyogdG9rZW4gc3RyaW5ncyAqLworICAgIHVkYXRhX3dyaXRlQmxvY2socERhdGEsIHN0cmluZ1N0b3JlK2dyb3VwVG9wLCBsaW5lVG9wLWdyb3VwVG9wKTsKKyAgICBpZigobGluZVRvcC1ncm91cFRvcCkmMSkgeworICAgICAgICAvKiAyLXBhZGRpbmcgKi8KKyAgICAgICAgdWRhdGFfd3JpdGVQYWRkaW5nKHBEYXRhLCAxKTsKKyAgICB9CisKKyAgICAvKiBncm91cCB0YWJsZSAqLworICAgIHVkYXRhX3dyaXRlMTYocERhdGEsICh1aW50MTZfdClsaW5lQ291bnQpOworICAgIGZvcihpPTA7IGk8bGluZUNvdW50OyArK2kpIHsKKyAgICAgICAgLyogZ3JvdXBNU0IgKi8KKyAgICAgICAgZ3JvdXBXb3Jkc1swXT0odWludDE2X3QpbGluZXNbaV0uY29kZTsKKworICAgICAgICAvKiBvZmZzZXQgKi8KKyAgICAgICAgb2Zmc2V0ID0gKHVpbnQzMl90KSgobGluZXNbaV0ucyAtIHN0cmluZ1N0b3JlKS1ncm91cEJvdHRvbSk7CisgICAgICAgIGdyb3VwV29yZHNbMV09KHVpbnQxNl90KShvZmZzZXQ+PjE2KTsKKyAgICAgICAgZ3JvdXBXb3Jkc1syXT0odWludDE2X3QpKG9mZnNldCk7CisgICAgICAgIHVkYXRhX3dyaXRlQmxvY2socERhdGEsIGdyb3VwV29yZHMsIDYpOworICAgIH0KKworICAgIC8qIGdyb3VwIHN0cmluZ3MgKi8KKyAgICB1ZGF0YV93cml0ZUJsb2NrKHBEYXRhLCBzdHJpbmdTdG9yZStncm91cEJvdHRvbSwgZ3JvdXBUb3AtZ3JvdXBCb3R0b20pOworCisgICAgLyogNC1hbGlnbiB0aGUgYWxnb3JpdGhtaWMgbmFtZXMgZGF0YSAqLworICAgIHVkYXRhX3dyaXRlUGFkZGluZyhwRGF0YSwgYWxnTmFtZXNPZmZzZXQtKGdyb3VwU3RyaW5nT2Zmc2V0Kyhncm91cFRvcC1ncm91cEJvdHRvbSkpKTsKKworICAgIGdlbmVyYXRlQWxnb3JpdGhtaWNEYXRhKHBEYXRhLCBzdG9yZU9wdGlvbnMpOworCisgICAgLyogZmluaXNoIHVwICovCisgICAgZGF0YUxlbmd0aD11ZGF0YV9maW5pc2gocERhdGEsICZlcnJvckNvZGUpOworICAgIGlmKFVfRkFJTFVSRShlcnJvckNvZGUpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2VubmFtZXM6IGVycm9yICVkIHdyaXRpbmcgdGhlIG91dHB1dCBmaWxlXG4iLCBlcnJvckNvZGUpOworICAgICAgICBleGl0KGVycm9yQ29kZSk7CisgICAgfQorCisgICAgaWYoZGF0YUxlbmd0aCE9KGxvbmcpc2l6ZSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbm5hbWVzOiBkYXRhIGxlbmd0aCAlbGQgIT0gY2FsY3VsYXRlZCBzaXplICVsdVxuIiwKK2RhdGFMZW5ndGgsICh1bnNpZ25lZCBsb25nKXNpemUpOworICAgICAgICBleGl0KFVfSU5URVJOQUxfUFJPR1JBTV9FUlJPUik7CisgICAgfQorfQorCisvKiB0aGUgc3RydWN0dXJlIGZvciBhbGdvcml0aG1pYyBuYW1lcyBuZWVkcyB0byBiZSA0LWFsaWduZWQgKi8KK3R5cGVkZWYgc3RydWN0IEFsZ29yaXRobWljUmFuZ2UgeworICAgIHVpbnQzMl90IHJhbmdlU3RhcnQsIHJhbmdlRW5kOworICAgIHVpbnQ4X3QgYWxnb3JpdGhtVHlwZSwgYWxnb3JpdGhtVmFyaWFudDsKKyAgICB1aW50MTZfdCByYW5nZVNpemU7Cit9IEFsZ29yaXRobWljUmFuZ2U7CisKK3N0YXRpYyB1aW50MzJfdAorZ2VuZXJhdGVBbGdvcml0aG1pY0RhdGEoVU5ld0RhdGFNZW1vcnkgKnBEYXRhLCBPcHRpb25zICpzdG9yZU9wdGlvbnMpIHsKKyAgICBzdGF0aWMgY2hhciBwcmVmaXhbXSA9ICJDSksgVU5JRklFRCBJREVPR1JBUEgtIjsKKyMgICBkZWZpbmUgUFJFRklYX0xFTkdUSCAyMworIyAgIGRlZmluZSBQUkVGSVhfTEVOR1RIXzQgMjQKKyAgICB1aW50MzJfdCBjb3VudEFsZ1JhbmdlczsKKworICAgIHN0YXRpYyBBbGdvcml0aG1pY1JhbmdlIGNqa0V4dEE9eworICAgICAgICAweDM0MDAsIDB4NGRiNSwKKyAgICAgICAgMCwgNCwKKyAgICAgICAgc2l6ZW9mKEFsZ29yaXRobWljUmFuZ2UpK1BSRUZJWF9MRU5HVEhfNAorICAgIH07CisgICAgc3RhdGljIEFsZ29yaXRobWljUmFuZ2UgY2prPXsKKyAgICAgICAgMHg0ZTAwLCAweDlmYTUsCisgICAgICAgIDAsIDQsCisgICAgICAgIHNpemVvZihBbGdvcml0aG1pY1JhbmdlKStQUkVGSVhfTEVOR1RIXzQKKyAgICB9OworICAgIHN0YXRpYyBBbGdvcml0aG1pY1JhbmdlIGNqa0V4dEI9eworICAgICAgICAweDIwMDAwLCAweDJhNmQ2LAorICAgICAgICAwLCA1LAorICAgICAgICBzaXplb2YoQWxnb3JpdGhtaWNSYW5nZSkrUFJFRklYX0xFTkdUSF80CisgICAgfTsKKyAgICBzdGF0aWMgQWxnb3JpdGhtaWNSYW5nZSBjamtFeHRDPXsKKyAgICAgICAgMHgyYTcwMCwgMHgyYjczNCwKKyAgICAgICAgMCwgNSwKKyAgICAgICAgc2l6ZW9mKEFsZ29yaXRobWljUmFuZ2UpK1BSRUZJWF9MRU5HVEhfNAorICAgIH07CisgICAgc3RhdGljIEFsZ29yaXRobWljUmFuZ2UgY2prRXh0RD17CisgICAgICAgIDB4MmI3NDAsIDB4MmI4MWQsCisgICAgICAgIDAsIDUsCisgICAgICAgIHNpemVvZihBbGdvcml0aG1pY1JhbmdlKStQUkVGSVhfTEVOR1RIXzQKKyAgICB9OworCisgICAgc3RhdGljIGNoYXIgamFtb1tdPQorICAgICAgICAiSEFOR1VMIFNZTExBQkxFIFwwIgorCisgICAgICAgICJHXDBHR1wwTlwwRFwwRERcMFJcME1cMEJcMEJCXDAiCisgICAgICAgICJTXDBTU1wwXDBKXDBKSlwwQ1wwS1wwVFwwUFwwSFwwIgorCisgICAgICAgICJBXDBBRVwwWUFcMFlBRVwwRU9cMEVcMFlFT1wwWUVcME9cMCIKKyAgICAgICAgIldBXDBXQUVcME9FXDBZT1wwVVwwV0VPXDBXRVwwV0lcMCIKKyAgICAgICAgIllVXDBFVVwwWUlcMElcMCIKKworICAgICAgICAiXDBHXDBHR1wwR1NcME5cME5KXDBOSFwwRFwwTFwwTEdcMExNXDAiCisgICAgICAgICJMQlwwTFNcMExUXDBMUFwwTEhcME1cMEJcMEJTXDAiCisgICAgICAgICJTXDBTU1wwTkdcMEpcMENcMEtcMFRcMFBcMEgiCisgICAgOworCisgICAgc3RhdGljIEFsZ29yaXRobWljUmFuZ2UgaGFuZ3VsPXsKKyAgICAgICAgMHhhYzAwLCAweGQ3YTMsCisgICAgICAgIDEsIDMsCisgICAgICAgIHNpemVvZihBbGdvcml0aG1pY1JhbmdlKSs2K3NpemVvZihqYW1vKQorICAgIH07CisKKyAgICAvKiBtb2R1bG8gZmFjdG9ycywgbWF4aW11bSA4ICovCisgICAgLyogMyBmYWN0b3JzOiAxOSwgMjEsIDI4LCBtb3N0LXRvLWxlYXN0LXNpZ25pZmljYW50ICovCisgICAgc3RhdGljIHVpbnQxNl90IGhhbmd1bEZhY3RvcnNbM109eworICAgICAgICAxOSwgMjEsIDI4CisgICAgfTsKKworICAgIHVpbnQzMl90IHNpemU7CisKKyAgICBzaXplPTA7CisKKyAgICBpZih1Y2RWZXJzaW9uPj1VTklfNV8yKSB7CisgICAgICAgIC8qIFVuaWNvZGUgNS4yIGFuZCB1cCBoYXMgYSBsb25nZXIgQ0pLIFVuaWhhbiByYW5nZSB0aGFuIGJlZm9yZSAqLworICAgICAgICBjamsucmFuZ2VFbmQ9MHg5RkNCOworICAgIH0gZWxzZSBpZih1Y2RWZXJzaW9uPj1VTklfNV8xKSB7CisgICAgICAgIC8qIFVuaWNvZGUgNS4xIGFuZCB1cCBoYXMgYSBsb25nZXIgQ0pLIFVuaWhhbiByYW5nZSB0aGFuIGJlZm9yZSAqLworICAgICAgICBjamsucmFuZ2VFbmQ9MHg5RkMzOworICAgIH0gZWxzZSBpZih1Y2RWZXJzaW9uPj1VTklfNF8xKSB7CisgICAgICAgIC8qIFVuaWNvZGUgNC4xIGFuZCB1cCBoYXMgYSBsb25nZXIgQ0pLIFVuaWhhbiByYW5nZSB0aGFuIGJlZm9yZSAqLworICAgICAgICBjamsucmFuZ2VFbmQ9MHg5RkJCOworICAgIH0KKworICAgIC8qIG51bWJlciBvZiByYW5nZXMgb2YgYWxnb3JpdGhtaWMgbmFtZXMgKi8KKyAgICBpZighc3RvcmVPcHRpb25zLT5zdG9yZU5hbWVzKSB7CisgICAgICAgIGNvdW50QWxnUmFuZ2VzPTA7CisgICAgfSBlbHNlIGlmKHVjZFZlcnNpb24+PVVOSV82XzApIHsKKyAgICAgICAgLyogVW5pY29kZSA2LjAgYW5kIHVwIGhhcyA2IHJhbmdlcyBpbmNsdWRpbmcgQ0pLIEV4dGVuc2lvbiBEICovCisgICAgICAgIGNvdW50QWxnUmFuZ2VzPTY7CisgICAgfSBlbHNlIGlmKHVjZFZlcnNpb24+PVVOSV81XzIpIHsKKyAgICAgICAgLyogVW5pY29kZSA1LjIgYW5kIHVwIGhhcyA1IHJhbmdlcyBpbmNsdWRpbmcgQ0pLIEV4dGVuc2lvbiBDICovCisgICAgICAgIGNvdW50QWxnUmFuZ2VzPTU7CisgICAgfSBlbHNlIGlmKHVjZFZlcnNpb24+PVVOSV8zXzEpIHsKKyAgICAgICAgLyogVW5pY29kZSAzLjEgYW5kIHVwIGhhcyA0IHJhbmdlcyBpbmNsdWRpbmcgQ0pLIEV4dGVuc2lvbiBCICovCisgICAgICAgIGNvdW50QWxnUmFuZ2VzPTQ7CisgICAgfSBlbHNlIGlmKHVjZFZlcnNpb24+PVVOSV8zXzApIHsKKyAgICAgICAgLyogVW5pY29kZSAzLjAgaGFzIDMgcmFuZ2VzIGluY2x1ZGluZyBDSksgRXh0ZW5zaW9uIEEgKi8KKyAgICAgICAgY291bnRBbGdSYW5nZXM9MzsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBVbmljb2RlIDIuMCBoYXMgMiByYW5nZXMgaW5jbHVkaW5nIEhhbmd1bCBhbmQgQ0pLIFVuaWhhbiAqLworICAgICAgICBjb3VudEFsZ1Jhbmdlcz0yOworICAgIH0KKworICAgIGlmKHBEYXRhIT1OVUxMKSB7CisgICAgICAgIHVkYXRhX3dyaXRlMzIocERhdGEsIGNvdW50QWxnUmFuZ2VzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzaXplKz00OworICAgIH0KKyAgICBpZihjb3VudEFsZ1Jhbmdlcz09MCkgeworICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIGVhY2ggcmFuZ2U6CisgICAgICogdWludDMyX3QgcmFuZ2VTdGFydAorICAgICAqIHVpbnQzMl90IHJhbmdlRW5kCisgICAgICogdWludDhfdCBhbGdvcml0aG1UeXBlCisgICAgICogdWludDhfdCBhbGdvcml0aG1WYXJpYW50CisgICAgICogdWludDE2X3Qgc2l6ZSBvZiByYW5nZSBkYXRhCisgICAgICogdWludDhfdFtzaXplXSBkYXRhCisgICAgICovCisKKyAgICAvKiByYW5nZSAwOiBjamsgZXh0ZW5zaW9uIGEgKi8KKyAgICBpZihjb3VudEFsZ1Jhbmdlcz49MykgeworICAgICAgICBpZihwRGF0YSE9TlVMTCkgeworICAgICAgICAgICAgdWRhdGFfd3JpdGVCbG9jayhwRGF0YSwgJmNqa0V4dEEsIHNpemVvZihBbGdvcml0aG1pY1JhbmdlKSk7CisgICAgICAgICAgICB1ZGF0YV93cml0ZVN0cmluZyhwRGF0YSwgcHJlZml4LCBQUkVGSVhfTEVOR1RIKTsKKyAgICAgICAgICAgIGlmKFBSRUZJWF9MRU5HVEg8UFJFRklYX0xFTkdUSF80KSB7CisgICAgICAgICAgICAgICAgdWRhdGFfd3JpdGVQYWRkaW5nKHBEYXRhLCBQUkVGSVhfTEVOR1RIXzQtUFJFRklYX0xFTkdUSCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzaXplKz1zaXplb2YoQWxnb3JpdGhtaWNSYW5nZSkrUFJFRklYX0xFTkdUSF80OworICAgICAgICB9CisgICAgfQorCisgICAgLyogcmFuZ2UgMTogY2prICovCisgICAgaWYocERhdGEhPU5VTEwpIHsKKyAgICAgICAgdWRhdGFfd3JpdGVCbG9jayhwRGF0YSwgJmNqaywgc2l6ZW9mKEFsZ29yaXRobWljUmFuZ2UpKTsKKyAgICAgICAgdWRhdGFfd3JpdGVTdHJpbmcocERhdGEsIHByZWZpeCwgUFJFRklYX0xFTkdUSCk7CisgICAgICAgIGlmKFBSRUZJWF9MRU5HVEg8UFJFRklYX0xFTkdUSF80KSB7CisgICAgICAgICAgICB1ZGF0YV93cml0ZVBhZGRpbmcocERhdGEsIFBSRUZJWF9MRU5HVEhfNC1QUkVGSVhfTEVOR1RIKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHNpemUrPXNpemVvZihBbGdvcml0aG1pY1JhbmdlKStQUkVGSVhfTEVOR1RIXzQ7CisgICAgfQorCisgICAgLyogcmFuZ2UgMjogaGFuZ3VsIHN5bGxhYmxlcyAqLworICAgIGlmKHBEYXRhIT1OVUxMKSB7CisgICAgICAgIHVkYXRhX3dyaXRlQmxvY2socERhdGEsICZoYW5ndWwsIHNpemVvZihBbGdvcml0aG1pY1JhbmdlKSk7CisgICAgICAgIHVkYXRhX3dyaXRlQmxvY2socERhdGEsIGhhbmd1bEZhY3RvcnMsIDYpOworICAgICAgICB1ZGF0YV93cml0ZVN0cmluZyhwRGF0YSwgamFtbywgc2l6ZW9mKGphbW8pKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzaXplKz1zaXplb2YoQWxnb3JpdGhtaWNSYW5nZSkrNitzaXplb2YoamFtbyk7CisgICAgfQorCisgICAgLyogcmFuZ2UgMzogY2prIGV4dGVuc2lvbiBiICovCisgICAgaWYoY291bnRBbGdSYW5nZXM+PTQpIHsKKyAgICAgICAgaWYocERhdGEhPU5VTEwpIHsKKyAgICAgICAgICAgIHVkYXRhX3dyaXRlQmxvY2socERhdGEsICZjamtFeHRCLCBzaXplb2YoQWxnb3JpdGhtaWNSYW5nZSkpOworICAgICAgICAgICAgdWRhdGFfd3JpdGVTdHJpbmcocERhdGEsIHByZWZpeCwgUFJFRklYX0xFTkdUSCk7CisgICAgICAgICAgICBpZihQUkVGSVhfTEVOR1RIPFBSRUZJWF9MRU5HVEhfNCkgeworICAgICAgICAgICAgICAgIHVkYXRhX3dyaXRlUGFkZGluZyhwRGF0YSwgUFJFRklYX0xFTkdUSF80LVBSRUZJWF9MRU5HVEgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2l6ZSs9c2l6ZW9mKEFsZ29yaXRobWljUmFuZ2UpK1BSRUZJWF9MRU5HVEhfNDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHJhbmdlIDQ6IGNqayBleHRlbnNpb24gYyAqLworICAgIGlmKGNvdW50QWxnUmFuZ2VzPj01KSB7CisgICAgICAgIGlmKHBEYXRhIT1OVUxMKSB7CisgICAgICAgICAgICB1ZGF0YV93cml0ZUJsb2NrKHBEYXRhLCAmY2prRXh0Qywgc2l6ZW9mKEFsZ29yaXRobWljUmFuZ2UpKTsKKyAgICAgICAgICAgIHVkYXRhX3dyaXRlU3RyaW5nKHBEYXRhLCBwcmVmaXgsIFBSRUZJWF9MRU5HVEgpOworICAgICAgICAgICAgaWYoUFJFRklYX0xFTkdUSDxQUkVGSVhfTEVOR1RIXzQpIHsKKyAgICAgICAgICAgICAgICB1ZGF0YV93cml0ZVBhZGRpbmcocERhdGEsIFBSRUZJWF9MRU5HVEhfNC1QUkVGSVhfTEVOR1RIKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNpemUrPXNpemVvZihBbGdvcml0aG1pY1JhbmdlKStQUkVGSVhfTEVOR1RIXzQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiByYW5nZSA1OiBjamsgZXh0ZW5zaW9uIGQgKi8KKyAgICBpZihjb3VudEFsZ1Jhbmdlcz49NikgeworICAgICAgICBpZihwRGF0YSE9TlVMTCkgeworICAgICAgICAgICAgdWRhdGFfd3JpdGVCbG9jayhwRGF0YSwgJmNqa0V4dEQsIHNpemVvZihBbGdvcml0aG1pY1JhbmdlKSk7CisgICAgICAgICAgICB1ZGF0YV93cml0ZVN0cmluZyhwRGF0YSwgcHJlZml4LCBQUkVGSVhfTEVOR1RIKTsKKyAgICAgICAgICAgIGlmKFBSRUZJWF9MRU5HVEg8UFJFRklYX0xFTkdUSF80KSB7CisgICAgICAgICAgICAgICAgdWRhdGFfd3JpdGVQYWRkaW5nKHBEYXRhLCBQUkVGSVhfTEVOR1RIXzQtUFJFRklYX0xFTkdUSCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzaXplKz1zaXplb2YoQWxnb3JpdGhtaWNSYW5nZSkrUFJFRklYX0xFTkdUSF80OworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNpemU7Cit9CisKKy8qIGhlbHBlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQxNl90CitmaW5kVG9rZW4odWludDhfdCAqcywgaW50MTZfdCBsZW5ndGgpIHsKKyAgICBpbnQxNl90IGksIHRva2VuOworCisgICAgZm9yKGk9MDsgaTwoaW50MTZfdCl0b2tlbkNvdW50OyArK2kpIHsKKyAgICAgICAgdG9rZW49dG9rZW5zW2ldOworICAgICAgICBpZih0b2tlbj49MCAmJiBsZW5ndGg9PXdvcmRzW3Rva2VuXS5sZW5ndGggJiYgMD09dXBydl9tZW1jbXAocywgd29yZHNbdG9rZW5dLnMsIGxlbmd0aCkpIHsKKyAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgV29yZCAqCitmaW5kV29yZChjaGFyICpzLCBpbnQxNl90IGxlbmd0aCkgeworICAgIHVpbnQzMl90IGk7CisKKyAgICBmb3IoaT0wOyBpPHdvcmRDb3VudDsgKytpKSB7CisgICAgICAgIGlmKGxlbmd0aD09d29yZHNbaV0ubGVuZ3RoICYmIDA9PXVwcnZfbWVtY21wKHMsIHdvcmRzW2ldLnMsIGxlbmd0aCkpIHsKKyAgICAgICAgICAgIHJldHVybiB3b3JkcytpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBXb3JkICoKK2FkZFdvcmQoY2hhciAqcywgaW50MTZfdCBsZW5ndGgpIHsKKyAgICB1aW50OF90ICpzdHJpbmdTdGFydDsKKyAgICBXb3JkICp3b3JkOworCisgICAgaWYod29yZENvdW50PT1NQVhfV09SRF9DT1VOVCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbm5hbWVzOiB0b28gbWFueSB3b3Jkc1xuIik7CisgICAgICAgIGV4aXQoVV9CVUZGRVJfT1ZFUkZMT1dfRVJST1IpOworICAgIH0KKworICAgIHN0cmluZ1N0YXJ0PWFsbG9jV29yZChsZW5ndGgpOworICAgIHVwcnZfbWVtY3B5KHN0cmluZ1N0YXJ0LCBzLCBsZW5ndGgpOworCisgICAgd29yZD13b3Jkcyt3b3JkQ291bnQ7CisKKyAgICAvKgorICAgICAqIEluaXRpYWxpemUgdGhlIHdlaWdodCB3aXRoIHRoZSBjb3N0cyBmb3IgdGhpcyB0b2tlbjoKKyAgICAgKiBhIHplcm8tdGVybWluYXRlZCBzdHJpbmcgYW5kIGEgMTYtYml0IG9mZnNldC4KKyAgICAgKi8KKyAgICB3b3JkLT53ZWlnaHQ9LShsZW5ndGgrMSsyKTsKKyAgICB3b3JkLT5jb3VudD0wOworICAgIHdvcmQtPmxlbmd0aD1sZW5ndGg7CisgICAgd29yZC0+cz1zdHJpbmdTdGFydDsKKworICAgICsrd29yZENvdW50OworCisgICAgcmV0dXJuIHdvcmQ7Cit9CisKK3N0YXRpYyB2b2lkCitjb3VudFdvcmQoV29yZCAqd29yZCkgeworICAgIC8qIGFkZCB0byB0aGUgd2VpZ2h0IHRoZSBzYXZpbmdzOiB0aGUgbGVuZ3RoIG9mIHRoZSB3b3JkIG1pbnVzIDEgYnl0ZSBmb3IgdGhlIHRva2VuICovCisgICAgd29yZC0+d2VpZ2h0Kz13b3JkLT5sZW5ndGgtMTsKKyAgICArK3dvcmQtPmNvdW50OworfQorCitzdGF0aWMgdm9pZAorYWRkTGluZSh1aW50MzJfdCBjb2RlLCBjaGFyICpuYW1lc1tdLCBpbnQxNl90IGxlbmd0aHNbXSwgaW50MTZfdCBjb3VudCkgeworICAgIHVpbnQ4X3QgKnN0cmluZ1N0YXJ0OworICAgIExpbmUgKmxpbmU7CisgICAgaW50MTZfdCBpLCBsZW5ndGg7CisKKyAgICBpZihsaW5lQ291bnQ9PU1BWF9MSU5FX0NPVU5UKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2VubmFtZXM6IHRvbyBtYW55IGxpbmVzXG4iKTsKKyAgICAgICAgZXhpdChVX0JVRkZFUl9PVkVSRkxPV19FUlJPUik7CisgICAgfQorCisgICAgLyogZmluZCB0aGUgbGFzdCBub24tZW1wdHkgbmFtZSAqLworICAgIHdoaWxlKGNvdW50PjAgJiYgbGVuZ3Roc1tjb3VudC0xXT09MCkgeworICAgICAgICAtLWNvdW50OworICAgIH0KKyAgICBpZihjb3VudD09MCkgeworICAgICAgICByZXR1cm47IC8qIHNob3VsZCBub3Qgb2NjdXI6IGNhbGxlciBzaG91bGQgbm90IGhhdmUgY2FsbGVkICovCisgICAgfQorCisgICAgLyogdGhlcmUgd2lsbCBiZSAoY291bnQtMSkgc2VwYXJhdG9yIGNoYXJhY3RlcnMgKi8KKyAgICBpPWNvdW50OworICAgIGxlbmd0aD1jb3VudC0xOworCisgICAgLyogYWRkIGxlbmd0aHMgb2Ygc3RyaW5ncyAqLworICAgIHdoaWxlKGk+MCkgeworICAgICAgICBsZW5ndGgrPWxlbmd0aHNbLS1pXTsKKyAgICB9CisKKyAgICAvKiBhbGxvY2F0ZSBsaW5lIG1lbW9yeSAqLworICAgIHN0cmluZ1N0YXJ0PWFsbG9jTGluZShsZW5ndGgpOworCisgICAgLyogY29weSBhbGwgc3RyaW5ncyBpbnRvIHRoZSBsaW5lIG1lbW9yeSAqLworICAgIGxlbmd0aD0wOyAvKiBudW1iZXIgb2YgY2hhcnMgY29waWVkIHNvIGZhciAqLworICAgIGZvcihpPTA7IGk8Y291bnQ7ICsraSkgeworICAgICAgICBpZihpPjApIHsKKyAgICAgICAgICAgIHN0cmluZ1N0YXJ0W2xlbmd0aCsrXT1OQU1FX1NFUEFSQVRPUl9DSEFSOworICAgICAgICB9CisgICAgICAgIGlmKGxlbmd0aHNbaV0+MCkgeworICAgICAgICAgICAgdXBydl9tZW1jcHkoc3RyaW5nU3RhcnQrbGVuZ3RoLCBuYW1lc1tpXSwgbGVuZ3Roc1tpXSk7CisgICAgICAgICAgICBsZW5ndGgrPWxlbmd0aHNbaV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBsaW5lPWxpbmVzK2xpbmVDb3VudDsKKworICAgIGxpbmUtPmNvZGU9Y29kZTsKKyAgICBsaW5lLT5sZW5ndGg9bGVuZ3RoOworICAgIGxpbmUtPnM9c3RyaW5nU3RhcnQ7CisKKyAgICArK2xpbmVDb3VudDsKKworICAgIC8qIHByZXZlbnQgYSBjaGFyYWN0ZXIgdmFsdWUgdGhhdCBpcyBhY3R1YWxseSBpbiBhIG5hbWUgZnJvbSBiZWNvbWluZyBhIHRva2VuICovCisgICAgd2hpbGUobGVuZ3RoPjApIHsKKyAgICAgICAgdG9rZW5zW3N0cmluZ1N0YXJ0Wy0tbGVuZ3RoXV09LTE7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorYWRkR3JvdXAodWludDMyX3QgZ3JvdXBNU0IsIHVpbnQ4X3QgKnN0cmluZ3MsIGludDE2X3QgbGVuZ3RoKSB7CisgICAgdWludDhfdCAqc3RyaW5nU3RhcnQ7CisgICAgTGluZSAqbGluZTsKKworICAgIGlmKGxpbmVDb3VudD09TUFYX0xJTkVfQ09VTlQpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5uYW1lczogdG9vIG1hbnkgZ3JvdXBzXG4iKTsKKyAgICAgICAgZXhpdChVX0JVRkZFUl9PVkVSRkxPV19FUlJPUik7CisgICAgfQorCisgICAgLyogc3RvcmUgdGhlIGxpbmUgbGVuZ3RocyBmaXJzdCwgdGhlbiB0aGUgc3RyaW5ncyAqLworICAgIGxpbmVMZW5ndGhzVG9wPShsaW5lTGVuZ3Roc1RvcCsxKS8yOworICAgIHN0cmluZ1N0YXJ0PWFsbG9jTGluZShsaW5lTGVuZ3Roc1RvcCtsZW5ndGgpOworICAgIHVwcnZfbWVtY3B5KHN0cmluZ1N0YXJ0LCBsaW5lTGVuZ3RocywgbGluZUxlbmd0aHNUb3ApOworICAgIHVwcnZfbWVtY3B5KHN0cmluZ1N0YXJ0K2xpbmVMZW5ndGhzVG9wLCBzdHJpbmdzLCBsZW5ndGgpOworCisgICAgbGluZT1saW5lcytsaW5lQ291bnQ7CisKKyAgICBsaW5lLT5jb2RlPWdyb3VwTVNCOworICAgIGxpbmUtPmxlbmd0aD1sZW5ndGg7CisgICAgbGluZS0+cz1zdHJpbmdTdGFydDsKKworICAgICsrbGluZUNvdW50OworfQorCitzdGF0aWMgdWludDMyX3QKK2FkZFRva2VuKHVpbnQ4X3QgKnMsIGludDE2X3QgbGVuZ3RoKSB7CisgICAgdWludDhfdCAqc3RyaW5nU3RhcnQ7CisKKyAgICBzdHJpbmdTdGFydD1hbGxvY0xpbmUobGVuZ3RoKzEpOworICAgIHVwcnZfbWVtY3B5KHN0cmluZ1N0YXJ0LCBzLCBsZW5ndGgpOworICAgIHN0cmluZ1N0YXJ0W2xlbmd0aF09MDsKKworICAgIHJldHVybiAodWludDMyX3QpKHN0cmluZ1N0YXJ0IC0gc3RyaW5nU3RvcmUpOworfQorCitzdGF0aWMgdm9pZAorYXBwZW5kTGluZUxlbmd0aChpbnQxNl90IGxlbmd0aCkgeworICAgIGlmKGxlbmd0aD49NzYpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5uYW1lczogY29tcHJlc3NlZCBsaW5lIHRvbyBsb25nXG4iKTsKKyAgICAgICAgZXhpdChVX0JVRkZFUl9PVkVSRkxPV19FUlJPUik7CisgICAgfQorICAgIGlmKGxlbmd0aD49MTIpIHsKKyAgICAgICAgbGVuZ3RoLT0xMjsKKyAgICAgICAgYXBwZW5kTGluZUxlbmd0aE5pYmJsZSgodWludDhfdCkoKGxlbmd0aD4+NCl8MTIpKTsKKyAgICB9CisgICAgYXBwZW5kTGluZUxlbmd0aE5pYmJsZSgodWludDhfdClsZW5ndGgpOworfQorCitzdGF0aWMgdm9pZAorYXBwZW5kTGluZUxlbmd0aE5pYmJsZSh1aW50OF90IG5pYmJsZSkgeworICAgIGlmKChsaW5lTGVuZ3Roc1RvcCYxKT09MCkgeworICAgICAgICBsaW5lTGVuZ3Roc1tsaW5lTGVuZ3Roc1RvcC8yXT0odWludDhfdCkobmliYmxlPDw0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBsaW5lTGVuZ3Roc1tsaW5lTGVuZ3Roc1RvcC8yXXw9bmliYmxlJjB4ZjsKKyAgICB9CisgICAgKytsaW5lTGVuZ3Roc1RvcDsKK30KKworc3RhdGljIHVpbnQ4X3QgKgorYWxsb2NMaW5lKGludDMyX3QgbGVuZ3RoKSB7CisgICAgdWludDMyX3QgdG9wPWxpbmVUb3ArbGVuZ3RoOworICAgIHVpbnQ4X3QgKnA7CisKKyAgICBpZih0b3A+d29yZEJvdHRvbSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbm5hbWVzOiBvdXQgb2YgbWVtb3J5XG4iKTsKKyAgICAgICAgZXhpdChVX01FTU9SWV9BTExPQ0FUSU9OX0VSUk9SKTsKKyAgICB9CisgICAgcD1zdHJpbmdTdG9yZStsaW5lVG9wOworICAgIGxpbmVUb3A9dG9wOworICAgIHJldHVybiBwOworfQorCitzdGF0aWMgdWludDhfdCAqCithbGxvY1dvcmQodWludDMyX3QgbGVuZ3RoKSB7CisgICAgdWludDMyX3QgYm90dG9tPXdvcmRCb3R0b20tbGVuZ3RoOworCisgICAgaWYobGluZVRvcD5ib3R0b20pIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5uYW1lczogb3V0IG9mIG1lbW9yeVxuIik7CisgICAgICAgIGV4aXQoVV9NRU1PUllfQUxMT0NBVElPTl9FUlJPUik7CisgICAgfQorICAgIHdvcmRCb3R0b209Ym90dG9tOworICAgIHJldHVybiBzdHJpbmdTdG9yZStib3R0b207Cit9CisKKy8qCisgKiBIZXksIEVtYWNzLCBwbGVhc2Ugc2V0IHRoZSBmb2xsb3dpbmc6CisgKgorICogTG9jYWwgVmFyaWFibGVzOgorICogaW5kZW50LXRhYnMtbW9kZTogbmlsCisgKiBFbmQ6CisgKgorICovCmRpZmYgLS1naXQgYS91bmljb2RlL2MvZ2VubmFtZXMvZ2VubmFtZXMudmNwcm9qIGIvdW5pY29kZS9jL2dlbm5hbWVzL2dlbm5hbWVzLnZjcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTFmMDVmCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZS9jL2dlbm5hbWVzL2dlbm5hbWVzLnZjcHJvagpAQCAtMCwwICsxLDM5OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+Cis8VmlzdWFsU3R1ZGlvUHJvamVjdAorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIgorCVZlcnNpb249IjkuMDAiCisJTmFtZT0iZ2VubmFtZXMiCisJUHJvamVjdEdVSUQ9IntGNTI4MUIwNC1BOUUwLTQ2ODAtQkJBOC0xRDdGN0QxMTU0NTh9IgorCVRhcmdldEZyYW1ld29ya1ZlcnNpb249IjEzMTA3MiIKKwk+CisJPFBsYXRmb3Jtcz4KKwkJPFBsYXRmb3JtCisJCQlOYW1lPSJXaW4zMiIKKwkJLz4KKwkJPFBsYXRmb3JtCisJCQlOYW1lPSJ4NjQiCisJCS8+CisJPC9QbGF0Zm9ybXM+CisJPFRvb2xGaWxlcz4KKwk8L1Rvb2xGaWxlcz4KKwk8Q29uZmlndXJhdGlvbnM+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIgorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXHg4NlxSZWxlYXNlIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXHg4NlxSZWxlYXNlIgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiCisJCQlVc2VPZk1GQz0iMCIKKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIKKwkJCUNoYXJhY3RlclNldD0iMiIKKwkJCT4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJCUNvbW1hbmRMaW5lPSJjb3B5ICZxdW90OyQoVGFyZ2V0UGF0aCkmcXVvdDsgLi5cLi5cLi5cYmluJiN4MEQ7JiN4MEE7IgorCQkJCU91dHB1dHM9Ii4uXC4uXC4uXGJpblwkKFRhcmdldEZpbGVOYW1lKSIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIgorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iLlx4ODZcUmVsZWFzZS9nZW5uYW1lcy50bGIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXGNvbW1vbjsuLlx0b29sdXRpbCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7TkRFQlVHO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSIKKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIgorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIgorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIgorCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9InRydWUiCisJCQkJVHJlYXRXQ2hhcl90QXNCdWlsdEluVHlwZT0idHJ1ZSIKKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5ceDg2XFJlbGVhc2UvZ2VubmFtZXMucGNoIgorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlx4ODZcUmVsZWFzZS8iCisJCQkJT2JqZWN0RmlsZT0iLlx4ODZcUmVsZWFzZS8iCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5ceDg2XFJlbGVhc2UvIgorCQkJCVdhcm5pbmdMZXZlbD0iMyIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJQ29tcGlsZUFzPSIwIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciCisJCQkJQ3VsdHVyZT0iMTAzMyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKKwkJCQlPdXRwdXRGaWxlPSIuXHg4NlxSZWxlYXNlL2dlbm5hbWVzLmV4ZSIKKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5ceDg2XFJlbGVhc2UvZ2VubmFtZXMucGRiIgorCQkJCVN1YlN5c3RlbT0iMSIKKwkJCQlSYW5kb21pemVkQmFzZUFkZHJlc3M9IjEiCisJCQkJRGF0YUV4ZWN1dGlvblByZXZlbnRpb249IjAiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCU91dHB1dERpcmVjdG9yeT0iLlx4ODZcRGVidWciCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5ceDg2XERlYnVnIgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiCisJCQlVc2VPZk1GQz0iMCIKKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIKKwkJCUNoYXJhY3RlclNldD0iMiIKKwkJCT4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJCUNvbW1hbmRMaW5lPSJjb3B5ICZxdW90OyQoVGFyZ2V0UGF0aCkmcXVvdDsgLi5cLi5cLi5cYmluJiN4MEQ7JiN4MEE7IgorCQkJCU91dHB1dHM9Ii4uXC4uXC4uXGJpblwkKFRhcmdldEZpbGVOYW1lKSIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIgorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iLlx4ODZcRGVidWcvZ2VubmFtZXMudGxiIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlPcHRpbWl6YXRpb249IjAiCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cY29tbW9uOy4uXHRvb2x1dGlsIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtfREVCVUc7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIgorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyIKKwkJCQlSdW50aW1lTGlicmFyeT0iMyIKKwkJCQlCdWZmZXJTZWN1cml0eUNoZWNrPSJ0cnVlIgorCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9InRydWUiCisJCQkJVHJlYXRXQ2hhcl90QXNCdWlsdEluVHlwZT0idHJ1ZSIKKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5ceDg2XERlYnVnL2dlbm5hbWVzLnBjaCIKKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5ceDg2XERlYnVnLyIKKwkJCQlPYmplY3RGaWxlPSIuXHg4NlxEZWJ1Zy8iCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5ceDg2XERlYnVnLyIKKwkJCQlCcm93c2VJbmZvcm1hdGlvbj0iMSIKKwkJCQlXYXJuaW5nTGV2ZWw9IjMiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjQiCisJCQkJQ29tcGlsZUFzPSIwIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciCisJCQkJQ3VsdHVyZT0iMTAzMyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKKwkJCQlPdXRwdXRGaWxlPSIuXHg4NlxEZWJ1Zy9nZW5uYW1lcy5leGUiCisJCQkJTGlua0luY3JlbWVudGFsPSIyIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlx4ODZcRGVidWcvZ2VubmFtZXMucGRiIgorCQkJCVN1YlN5c3RlbT0iMSIKKwkJCQlSYW5kb21pemVkQmFzZUFkZHJlc3M9IjEiCisJCQkJRGF0YUV4ZWN1dGlvblByZXZlbnRpb249IjAiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIgorCQkJCVVzZUZBVDMyV29ya2Fyb3VuZD0idHJ1ZSIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iUmVsZWFzZXx4NjQiCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5ceDY0XFJlbGVhc2UiCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5ceDY0XFJlbGVhc2UiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSIKKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyIKKwkJCVVzZU9mTUZDPSIwIgorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIgorCQkJQ2hhcmFjdGVyU2V0PSIyIgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkJQ29tbWFuZExpbmU9ImNvcHkgJnF1b3Q7JChUYXJnZXRQYXRoKSZxdW90OyAuLlwuLlwuLlxiaW42NCYjeDBEOyYjeDBBOyIKKwkJCQlPdXRwdXRzPSIuLlwuLlwuLlxiaW42NFwkKFRhcmdldEZpbGVOYW1lKSIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIgorCQkJCVRhcmdldEVudmlyb25tZW50PSIzIgorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iLlx4NjRcUmVsZWFzZS9nZW5uYW1lcy50bGIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXGNvbW1vbjsuLlx0b29sdXRpbCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lONjQ7V0lOMzI7TkRFQlVHO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSIKKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIgorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIgorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIgorCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9InRydWUiCisJCQkJVHJlYXRXQ2hhcl90QXNCdWlsdEluVHlwZT0idHJ1ZSIKKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5ceDY0XFJlbGVhc2UvZ2VubmFtZXMucGNoIgorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlx4NjRcUmVsZWFzZS8iCisJCQkJT2JqZWN0RmlsZT0iLlx4NjRcUmVsZWFzZS8iCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5ceDY0XFJlbGVhc2UvIgorCQkJCVdhcm5pbmdMZXZlbD0iMyIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJQ29tcGlsZUFzPSIwIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciCisJCQkJQ3VsdHVyZT0iMTAzMyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKKwkJCQlPdXRwdXRGaWxlPSIuXHg2NFxSZWxlYXNlL2dlbm5hbWVzLmV4ZSIKKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5ceDY0XFJlbGVhc2UvZ2VubmFtZXMucGRiIgorCQkJCVN1YlN5c3RlbT0iMSIKKwkJCQlUYXJnZXRNYWNoaW5lPSIxNyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDRnhDb3BUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJEZWJ1Z3x4NjQiCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5ceDY0XERlYnVnIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXHg2NFxEZWJ1ZyIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIgorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIgorCQkJVXNlT2ZNRkM9IjAiCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiCisJCQlDaGFyYWN0ZXJTZXQ9IjIiCisJCQk+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCQlDb21tYW5kTGluZT0iY29weSAmcXVvdDskKFRhcmdldFBhdGgpJnF1b3Q7IC4uXC4uXC4uXGJpbjY0JiN4MEQ7JiN4MEE7IgorCQkJCU91dHB1dHM9Ii4uXC4uXC4uXGJpbjY0XCQoVGFyZ2V0RmlsZU5hbWUpIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjMiCisJCQkJVHlwZUxpYnJhcnlOYW1lPSIuXHg2NFxEZWJ1Zy9nZW5uYW1lcy50bGIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCU9wdGltaXphdGlvbj0iMCIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlxjb21tb247Li5cdG9vbHV0aWwiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjY0O1dJTjMyO19ERUJVRztfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUiCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIgorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIzIgorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9InRydWUiCisJCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0idHJ1ZSIKKwkJCQlUcmVhdFdDaGFyX3RBc0J1aWx0SW5UeXBlPSJ0cnVlIgorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlx4NjRcRGVidWcvZ2VubmFtZXMucGNoIgorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlx4NjRcRGVidWcvIgorCQkJCU9iamVjdEZpbGU9Ii5ceDY0XERlYnVnLyIKKwkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlx4NjRcRGVidWcvIgorCQkJCUJyb3dzZUluZm9ybWF0aW9uPSIxIgorCQkJCVdhcm5pbmdMZXZlbD0iMyIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyIKKwkJCQlDb21waWxlQXM9IjAiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyIKKwkJCQlDdWx0dXJlPSIxMDMzIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIgorCQkJCU91dHB1dEZpbGU9Ii5ceDY0XERlYnVnL2dlbm5hbWVzLmV4ZSIKKwkJCQlMaW5rSW5jcmVtZW50YWw9IjIiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSIKKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXHg2NFxEZWJ1Zy9nZW5uYW1lcy5wZGIiCisJCQkJU3ViU3lzdGVtPSIxIgorCQkJCVRhcmdldE1hY2hpbmU9IjE3IgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCIKKwkJCQlVc2VGQVQzMldvcmthcm91bmQ9InRydWUiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDRnhDb3BUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJPC9Db25maWd1cmF0aW9ucz4KKwk8UmVmZXJlbmNlcz4KKwk8L1JlZmVyZW5jZXM+CisJPEZpbGVzPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuXGdlbm5hbWVzLmMiCisJCQk+CisJCTwvRmlsZT4KKwk8L0ZpbGVzPgorCTxHbG9iYWxzPgorCTwvR2xvYmFscz4KKzwvVmlzdWFsU3R1ZGlvUHJvamVjdD4KZGlmZiAtLWdpdCBhL3VuaWNvZGUvYy9nZW5ub3JtL0NNYWtlTGlzdHMudHh0IGIvdW5pY29kZS9jL2dlbm5vcm0vQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIxODgyNwotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGUvYy9nZW5ub3JtL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsOSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTAsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMKKyMgQ29ycG9yYXRpb24gYW5kIG90aGVycy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIGNyZWF0ZWQgb246IDIwMTBqdW4wMworIyBjcmVhdGVkIGJ5OiBNYXJrdXMgVy4gU2NoZXJlcgorIyBlZGl0ZWQgb246IDIwMTBqdWwyMAorIyBlZGl0ZWQgYnk6IFN0dWFydCBHLiBHaWxsCithZGRfZXhlY3V0YWJsZShnZW5ub3JtIGdlbm5vcm0uYyBzdG9yZS5jKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKGdlbm5vcm0gaWN1dWMgaWN1dHUpCmRpZmYgLS1naXQgYS91bmljb2RlL2MvZ2Vubm9ybS9NYWtlZmlsZS5pbiBiL3VuaWNvZGUvYy9nZW5ub3JtL01ha2VmaWxlLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhZWM2ODUKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RlL2MvZ2Vubm9ybS9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDk3IEBACisjIyBNYWtlZmlsZS5pbiBmb3IgSUNVIC0gdG9vbHMvZ2Vubm9ybQorIyMgQ29weXJpZ2h0IChjKSAyMDAxLTIwMDUsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kCisjIyBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIyBTdGV2ZW4gUi4gTG9vbWlzL01hcmt1cyBXLiBTY2hlcmVyCisKKyMjIFNvdXJjZSBkaXJlY3RvcnkgaW5mb3JtYXRpb24KK3NyY2RpciA9IEBzcmNkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACisKK3RvcF9idWlsZGRpciA9IC4uLy4uCisKK2luY2x1ZGUgJCh0b3BfYnVpbGRkaXIpL2ljdWRlZnMubWsKKworIyMgQnVpbGQgZGlyZWN0b3J5IGluZm9ybWF0aW9uCitzdWJkaXIgPSB0b29scy9nZW5ub3JtCisKK1RBUkdFVF9TVFVCX05BTUUgPSBnZW5ub3JtCisKK1NFQ1RJT04gPSA4CisKKyNNQU5fRklMRVMgPSAkKFRBUkdFVF9TVFVCX05BTUUpLiQoU0VDVElPTikKKworCisjIyBFeHRyYSBmaWxlcyB0byByZW1vdmUgZm9yICdtYWtlIGNsZWFuJworQ0xFQU5GSUxFUyA9ICp+ICQoREVQUykgJChNQU5fRklMRVMpCisKKyMjIFRhcmdldCBpbmZvcm1hdGlvbgorVEFSR0VUID0gJChCSU5ESVIpLyQoVEFSR0VUX1NUVUJfTkFNRSkkKEVYRUVYVCkKKworaWZuZXEgKCQodG9wX2J1aWxkZGlyKSwkKHRvcF9zcmNkaXIpKQorQ1BQRkxBR1MgKz0gLUkkKHRvcF9idWlsZGRpcikvY29tbW9uCitlbmRpZgorQ1BQRkxBR1MgKz0gLUkkKHRvcF9zcmNkaXIpL2NvbW1vbiAtSSQoc3JjZGlyKS8uLi90b29sdXRpbAorTElCUyA9ICQoTElCSUNVVE9PTFVUSUwpICQoTElCSUNVSTE4TikgJChMSUJJQ1VVQykgJChERUZBVUxUX0xJQlMpICQoTElCX00pCisKK09CSkVDVFMgPSBnZW5ub3JtLm8gc3RvcmUubworCitERVBTID0gJChPQkpFQ1RTOi5vPS5kKQorCisjIyBMaXN0IG9mIHBob255IHRhcmdldHMKKy5QSE9OWSA6IGFsbCBhbGwtbG9jYWwgaW5zdGFsbCBpbnN0YWxsLWxvY2FsIGNsZWFuIGNsZWFuLWxvY2FsCVwKK2Rpc3RjbGVhbiBkaXN0Y2xlYW4tbG9jYWwgZGlzdCBkaXN0LWxvY2FsIGNoZWNrIGNoZWNrLWxvY2FsIGluc3RhbGwtbWFuCisKKyMjIENsZWFyIHN1ZmZpeCBsaXN0CisuU1VGRklYRVMgOgorCisjIyBMaXN0IG9mIHN0YW5kYXJkIHRhcmdldHMKK2FsbDogYWxsLWxvY2FsCitpbnN0YWxsOiBpbnN0YWxsLWxvY2FsCitjbGVhbjogY2xlYW4tbG9jYWwKK2Rpc3RjbGVhbiA6IGRpc3RjbGVhbi1sb2NhbAorZGlzdDogZGlzdC1sb2NhbAorY2hlY2s6IGFsbCBjaGVjay1sb2NhbAorCithbGwtbG9jYWw6ICQoVEFSR0VUKSAkKE1BTl9GSUxFUykKKworaW5zdGFsbC1sb2NhbDogYWxsLWxvY2FsIGluc3RhbGwtbWFuCisjCSQoTUtJTlNUQUxMRElSUykgJChERVNURElSKSQoc2JpbmRpcikKKyMJJChJTlNUQUxMKSAkKFRBUkdFVCkgJChERVNURElSKSQoc2JpbmRpcikKKworaW5zdGFsbC1tYW46ICQoTUFOX0ZJTEVTKQorIwkkKE1LSU5TVEFMTERJUlMpICQoREVTVERJUikkKG1hbmRpcikvbWFuJChTRUNUSU9OKQorIwkkKElOU1RBTExfREFUQSkgJD8gJChERVNURElSKSQobWFuZGlyKS9tYW4kKFNFQ1RJT04pCisKK2Rpc3QtbG9jYWw6CisKK2NsZWFuLWxvY2FsOgorCXRlc3QgLXogIiQoQ0xFQU5GSUxFUykiIHx8ICQoUk1WKSAkKENMRUFORklMRVMpCisJJChSTVYpICQoVEFSR0VUKSAkKE9CSkVDVFMpCisKK2Rpc3RjbGVhbi1sb2NhbDogY2xlYW4tbG9jYWwKKwkkKFJNVikgTWFrZWZpbGUKKworY2hlY2stbG9jYWw6IGFsbC1sb2NhbAorCitNYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cworCWNkICQodG9wX2J1aWxkZGlyKSBcCisJICYmIENPTkZJR19GSUxFUz0kKHN1YmRpcikvJEAgQ09ORklHX0hFQURFUlM9ICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cworCiskKFRBUkdFVCkgOiAkKE9CSkVDVFMpCisJJChMSU5LLmNjKSAkKE9VVE9QVCkkQCAkXiAkKExJQlMpCisJJChQT1NUX0JVSUxEX1NURVApCisKKworJS4kKFNFQ1RJT04pOiAkKHNyY2RpcikvJS4kKFNFQ1RJT04pLmluCisJY2QgJCh0b3BfYnVpbGRkaXIpIFwKKwkgJiYgQ09ORklHX0ZJTEVTPSQoc3ViZGlyKS8kQCBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCisKKworaWZlcSAoLCQoTUFLRUNNREdPQUxTKSkKKy1pbmNsdWRlICQoREVQUykKK2Vsc2UKK2lmbmVxICgkKHBhdHN1YnN0ICVjbGVhbiwsJChNQUtFQ01ER09BTFMpKSwpCistaW5jbHVkZSAkKERFUFMpCitlbmRpZgorZW5kaWYKKwpkaWZmIC0tZ2l0IGEvdW5pY29kZS9jL2dlbm5vcm0vZ2Vubm9ybS5jIGIvdW5pY29kZS9jL2dlbm5vcm0vZ2Vubm9ybS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxYjFmYmEKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RlL2MvZ2Vubm9ybS9nZW5ub3JtLmMKQEAgLTAsMCArMSwzOTkgQEAKKy8qCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMKKyogICBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICBmaWxlIG5hbWU6ICBnZW5ub3JtLmMKKyogICBlbmNvZGluZzogICBVUy1BU0NJSQorKiAgIHRhYiBzaXplOiAgIDggKG5vdCB1c2VkKQorKiAgIGluZGVudGF0aW9uOjQKKyoKKyogICBjcmVhdGVkIG9uOiAyMDAxbWF5MjUKKyogICBjcmVhdGVkIGJ5OiBNYXJrdXMgVy4gU2NoZXJlcgorKgorKiAgIFRoaXMgcHJvZ3JhbSByZWFkcyB0aGUgVW5pY29kZSBjaGFyYWN0ZXIgZGF0YWJhc2UgdGV4dCBmaWxlLAorKiAgIHBhcnNlcyBpdCwgYW5kIGV4dHJhY3RzIHRoZSBkYXRhIGZvciBub3JtYWxpemF0aW9uLgorKiAgIEl0IHRoZW4gcHJlcHJvY2Vzc2VzIGl0IGFuZCB3cml0ZXMgYSBiaW5hcnkgZmlsZSBmb3IgZWZmaWNpZW50IHVzZQorKiAgIGluIHZhcmlvdXMgVW5pY29kZSB0ZXh0IG5vcm1hbGl6YXRpb24gcHJvY2Vzc2VzLgorKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAidW5pY29kZS91dHlwZXMuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3VjaGFyLmgiCisjaW5jbHVkZSAidW5pY29kZS91c3RyaW5nLmgiCisjaW5jbHVkZSAidW5pY29kZS9wdXRpbC5oIgorI2luY2x1ZGUgInVuaWNvZGUvdWNsZWFuLmgiCisjaW5jbHVkZSAidW5pY29kZS91ZGF0YS5oIgorI2luY2x1ZGUgInVuaWNvZGUvdXNldC5oIgorI2luY2x1ZGUgImNtZW1vcnkuaCIKKyNpbmNsdWRlICJjc3RyaW5nLmgiCisjaW5jbHVkZSAidW5ld2RhdGEuaCIKKyNpbmNsdWRlICJ1b3B0aW9ucy5oIgorI2luY2x1ZGUgInVwYXJzZS5oIgorI2luY2x1ZGUgInVub3JtaW1wLmgiCisKK1VfQ0RFQ0xfQkVHSU4KKyNpbmNsdWRlICJnZW5ub3JtLmgiCitVX0NERUNMX0VORAorCitVQm9vbCBiZVZlcmJvc2U9RkFMU0U7CisKKy8qIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkCitwYXJzZURlcml2ZWROb3JtYWxpemF0aW9uUHJvcGVydGllcyhjb25zdCBjaGFyICpmaWxlbmFtZSwgVUVycm9yQ29kZSAqcEVycm9yQ29kZSwgVUJvb2wgcmVwb3J0RXJyb3IpOworCitzdGF0aWMgdm9pZAorcGFyc2VEQihjb25zdCBjaGFyICpmaWxlbmFtZSwgVUVycm9yQ29kZSAqcEVycm9yQ29kZSk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2VudW0geworICAgIEhFTFBfSCwKKyAgICBIRUxQX1FVRVNUSU9OX01BUkssCisgICAgVkVSQk9TRSwKKyAgICBERVNURElSLAorICAgIFNPVVJDRURJUiwKKyAgICBJQ1VEQVRBRElSCit9OworCitzdGF0aWMgVU9wdGlvbiBvcHRpb25zW109eworICAgIFVPUFRJT05fSEVMUF9ILAorICAgIFVPUFRJT05fSEVMUF9RVUVTVElPTl9NQVJLLAorICAgIFVPUFRJT05fVkVSQk9TRSwKKyAgICBVT1BUSU9OX0RFU1RESVIsCisgICAgVU9QVElPTl9TT1VSQ0VESVIsCisgICAgVU9QVElPTl9JQ1VEQVRBRElSCit9OworCitleHRlcm4gaW50CittYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKKyNpZiAhVUNPTkZJR19OT19OT1JNQUxJWkFUSU9OCisgICAgY2hhciBmaWxlbmFtZVszMDBdOworI2VuZGlmCisgICAgY29uc3QgY2hhciAqc3JjRGlyPU5VTEwsICpkZXN0RGlyPU5VTEwsICpzdWZmaXg9TlVMTDsKKyAgICBjaGFyICpiYXNlbmFtZT1OVUxMOworICAgIFVFcnJvckNvZGUgZXJyb3JDb2RlPVVfWkVST19FUlJPUjsKKworICAgIFVfTUFJTl9JTklUX0FSR1MoYXJnYywgYXJndik7CisKKyAgICAvKiBwcmVzZXQgdGhlbiByZWFkIGNvbW1hbmQgbGluZSBvcHRpb25zICovCisgICAgb3B0aW9uc1tERVNURElSXS52YWx1ZT11X2dldERhdGFEaXJlY3RvcnkoKTsKKyAgICBvcHRpb25zW1NPVVJDRURJUl0udmFsdWU9IiI7CisgICAgb3B0aW9uc1tJQ1VEQVRBRElSXS52YWx1ZT11X2dldERhdGFEaXJlY3RvcnkoKTsKKyAgICBhcmdjPXVfcGFyc2VBcmdzKGFyZ2MsIGFyZ3YsIHNpemVvZihvcHRpb25zKS9zaXplb2Yob3B0aW9uc1swXSksIG9wdGlvbnMpOworCisgICAgLyogZXJyb3IgaGFuZGxpbmcsIHByaW50aW5nIHVzYWdlIG1lc3NhZ2UgKi8KKyAgICBpZihhcmdjPDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAiZXJyb3IgaW4gY29tbWFuZCBsaW5lIGFyZ3VtZW50IFwiJXNcIlxuIiwKKyAgICAgICAgICAgIGFyZ3ZbLWFyZ2NdKTsKKyAgICB9CisgICAgaWYoYXJnYzwwIHx8IG9wdGlvbnNbSEVMUF9IXS5kb2VzT2NjdXIgfHwgb3B0aW9uc1tIRUxQX1FVRVNUSU9OX01BUktdLmRvZXNPY2N1cikgeworICAgICAgICAvKgorICAgICAgICAgKiBCcm9rZW4gaW50byBjaHVja3MgYmVjYXVzZSB0aGUgQzg5IHN0YW5kYXJkIHNheXMgdGhlIG1pbmltdW0KKyAgICAgICAgICogcmVxdWlyZWQgc3VwcG9ydGVkIHN0cmluZyBsZW5ndGggaXMgNTA5IGJ5dGVzLgorICAgICAgICAgKi8KKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAiVXNhZ2U6ICVzIFstb3B0aW9uc10gW3N1ZmZpeF1cbiIKKyAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICJSZWFkIHRoZSBVbmljb2RlRGF0YS50eHQgZmlsZSBhbmQgb3RoZXIgVW5pY29kZSBwcm9wZXJ0aWVzIGZpbGVzIGFuZFxuIgorICAgICAgICAgICAgIndyaXRlIG5mYy50eHQgYW5kIG5ma2MudHh0IGZpbGVzIGZvciBnZW5ub3JtMlxuIgorICAgICAgICAgICAgIlxuIiwKKyAgICAgICAgICAgIGFyZ3ZbMF0pOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICJPcHRpb25zOlxuIgorICAgICAgICAgICAgIlx0LWggb3IgLT8gb3IgLS1oZWxwICB0aGlzIHVzYWdlIHRleHRcbiIKKyAgICAgICAgICAgICJcdC12IG9yIC0tdmVyYm9zZSAgICAgdmVyYm9zZSBvdXRwdXRcbiIpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICJcdC1kIG9yIC0tZGVzdGRpciAgICAgZGVzdGluYXRpb24gZGlyZWN0b3J5LCBmb2xsb3dlZCBieSB0aGUgcGF0aFxuIgorICAgICAgICAgICAgIlx0LXMgb3IgLS1zb3VyY2VkaXIgICBzb3VyY2UgZGlyZWN0b3J5LCBmb2xsb3dlZCBieSB0aGUgcGF0aFxuIgorICAgICAgICAgICAgIlx0LWkgb3IgLS1pY3VkYXRhZGlyICBkaXJlY3RvcnkgZm9yIGxvY2F0aW5nIGFueSBuZWVkZWQgaW50ZXJtZWRpYXRlIGRhdGEgZmlsZXMsXG4iCisgICAgICAgICAgICAiXHQgICAgICAgICAgICAgICAgICAgIGZvbGxvd2VkIGJ5IHBhdGgsIGRlZmF1bHRzIHRvIDwlcz5cbiIKKyAgICAgICAgICAgICJcdHN1ZmZpeCAgICAgICAgICAgICAgc3VmZml4IHRoYXQgaXMgdG8gYmUgYXBwZW5kZWQgd2l0aCBhICctJ1xuIgorICAgICAgICAgICAgIlx0ICAgICAgICAgICAgICAgICAgICB0byB0aGUgc291cmNlIGZpbGUgYmFzZW5hbWVzIGJlZm9yZSBvcGVuaW5nO1xuIgorICAgICAgICAgICAgIlx0ICAgICAgICAgICAgICAgICAgICAnZ2Vubm9ybSBuZXcnIHdpbGwgcmVhZCBVbmljb2RlRGF0YS1uZXcudHh0IGV0Yy5cbiIsCisgICAgICAgICAgICB1X2dldERhdGFEaXJlY3RvcnkoKSk7CisgICAgICAgIHJldHVybiBhcmdjPDAgPyBVX0lMTEVHQUxfQVJHVU1FTlRfRVJST1IgOiBVX1pFUk9fRVJST1I7CisgICAgfQorCisgICAgLyogZ2V0IHRoZSBvcHRpb25zIHZhbHVlcyAqLworICAgIGJlVmVyYm9zZT1vcHRpb25zW1ZFUkJPU0VdLmRvZXNPY2N1cjsKKyAgICBzcmNEaXI9b3B0aW9uc1tTT1VSQ0VESVJdLnZhbHVlOworICAgIGRlc3REaXI9b3B0aW9uc1tERVNURElSXS52YWx1ZTsKKworICAgIGlmKGFyZ2M+PTIpIHsKKyAgICAgICAgc3VmZml4PWFyZ3ZbMV07CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3VmZml4PU5VTEw7CisgICAgfQorCisjaWYgIVVDT05GSUdfTk9fTk9STUFMSVpBVElPTgorCisgICAgaWYgKG9wdGlvbnNbSUNVREFUQURJUl0uZG9lc09jY3VyKSB7CisgICAgICAgIHVfc2V0RGF0YURpcmVjdG9yeShvcHRpb25zW0lDVURBVEFESVJdLnZhbHVlKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFZlcmlmeSB0aGF0IHdlIGNhbiB3b3JrIHdpdGggcHJvcGVydGllcworICAgICAqIGJ1dCBkb24ndCBjYWxsIHVfaW5pdCgpIGJlY2F1c2UgdGhhdCBuZWVkcyB1bm9ybS5pY3Ugd2hpY2ggd2UgYXJlIGp1c3QKKyAgICAgKiBnb2luZyB0byBidWlsZCBoZXJlLgorICAgICAqLworICAgIHsKKyAgICAgICAgVV9TVFJJTkdfREVDTChpZGVvLCAiWzpJZGVvZ3JhcGhpYzpdIiwgMTUpOworICAgICAgICBVU2V0ICpzZXQ7CisKKyAgICAgICAgVV9TVFJJTkdfSU5JVChpZGVvLCAiWzpJZGVvZ3JhcGhpYzpdIiwgMTUpOworICAgICAgICBzZXQ9dXNldF9vcGVuUGF0dGVybihpZGVvLCAtMSwgJmVycm9yQ29kZSk7CisgICAgICAgIGlmKFVfRkFJTFVSRShlcnJvckNvZGUpIHx8ICF1c2V0X2NvbnRhaW5zKHNldCwgMHhmOTAwKSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5ub3JtIGlzIHVuYWJsZSB0byB3b3JrIHdpdGggcHJvcGVydGllcyAodXByb3BzLmljdSk6ICVzXG4iLCB1X2Vycm9yTmFtZShlcnJvckNvZGUpKTsKKyAgICAgICAgICAgIGV4aXQoZXJyb3JDb2RlKTsKKyAgICAgICAgfQorICAgICAgICB1c2V0X2Nsb3NlKHNldCk7CisgICAgfQorCisgICAgLyogcHJlcGFyZSB0aGUgZmlsZW5hbWUgYmVnaW5uaW5nIHdpdGggdGhlIHNvdXJjZSBkaXIgKi8KKyAgICB1cHJ2X3N0cmNweShmaWxlbmFtZSwgc3JjRGlyKTsKKyAgICBiYXNlbmFtZT1maWxlbmFtZSt1cHJ2X3N0cmxlbihmaWxlbmFtZSk7CisgICAgaWYoYmFzZW5hbWU+ZmlsZW5hbWUgJiYgKihiYXNlbmFtZS0xKSE9VV9GSUxFX1NFUF9DSEFSICYmICooYmFzZW5hbWUtMSkhPVVfRklMRV9BTFRfU0VQX0NIQVIpIHsKKyAgICAgICAgKmJhc2VuYW1lKys9VV9GSUxFX1NFUF9DSEFSOworICAgIH0KKworICAgIC8qIGluaXRpYWxpemUgKi8KKyAgICBpbml0KCk7CisKKyAgICAvKiBwcm9jZXNzIERlcml2ZWROb3JtYWxpemF0aW9uUHJvcHMudHh0IChuYW1lIGNoYW5nZWQgZm9yIFVuaWNvZGUgMy4yLCB0byA8PTMxIGNoYXJhY3RlcnMpICovCisgICAgaWYoc3VmZml4PT1OVUxMKSB7CisgICAgICAgIHVwcnZfc3RyY3B5KGJhc2VuYW1lLCAiRGVyaXZlZE5vcm1hbGl6YXRpb25Qcm9wcy50eHQiKTsKKyAgICB9IGVsc2UgeworICAgICAgICB1cHJ2X3N0cmNweShiYXNlbmFtZSwgIkRlcml2ZWROb3JtYWxpemF0aW9uUHJvcHMiKTsKKyAgICAgICAgYmFzZW5hbWVbMzBdPSctJzsKKyAgICAgICAgdXBydl9zdHJjcHkoYmFzZW5hbWUrMzEsIHN1ZmZpeCk7CisgICAgICAgIHVwcnZfc3RyY2F0KGJhc2VuYW1lKzMxLCAiLnR4dCIpOworICAgIH0KKyAgICBwYXJzZURlcml2ZWROb3JtYWxpemF0aW9uUHJvcGVydGllcyhmaWxlbmFtZSwgJmVycm9yQ29kZSwgRkFMU0UpOworICAgIGlmKFVfRkFJTFVSRShlcnJvckNvZGUpKSB7CisgICAgICAgIC8qIGNhbiBiZSBvbmx5IFVfRklMRV9BQ0NFU1NfRVJST1IgLSB0cnkgZmlsZW5hbWUgZnJvbSBiZWZvcmUgVW5pY29kZSAzLjIgKi8KKyAgICAgICAgaWYoc3VmZml4PT1OVUxMKSB7CisgICAgICAgICAgICB1cHJ2X3N0cmNweShiYXNlbmFtZSwgIkRlcml2ZWROb3JtYWxpemF0aW9uUHJvcGVydGllcy50eHQiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVwcnZfc3RyY3B5KGJhc2VuYW1lLCAiRGVyaXZlZE5vcm1hbGl6YXRpb25Qcm9wZXJ0aWVzIik7CisgICAgICAgICAgICBiYXNlbmFtZVszMF09Jy0nOworICAgICAgICAgICAgdXBydl9zdHJjcHkoYmFzZW5hbWUrMzEsIHN1ZmZpeCk7CisgICAgICAgICAgICB1cHJ2X3N0cmNhdChiYXNlbmFtZSszMSwgIi50eHQiKTsKKyAgICAgICAgfQorICAgICAgICBwYXJzZURlcml2ZWROb3JtYWxpemF0aW9uUHJvcGVydGllcyhmaWxlbmFtZSwgJmVycm9yQ29kZSwgVFJVRSk7CisgICAgfQorCisgICAgLyogcHJvY2VzcyBVbmljb2RlRGF0YS50eHQgKi8KKyAgICBpZihzdWZmaXg9PU5VTEwpIHsKKyAgICAgICAgdXBydl9zdHJjcHkoYmFzZW5hbWUsICJVbmljb2RlRGF0YS50eHQiKTsKKyAgICB9IGVsc2UgeworICAgICAgICB1cHJ2X3N0cmNweShiYXNlbmFtZSwgIlVuaWNvZGVEYXRhIik7CisgICAgICAgIGJhc2VuYW1lWzExXT0nLSc7CisgICAgICAgIHVwcnZfc3RyY3B5KGJhc2VuYW1lKzEyLCBzdWZmaXgpOworICAgICAgICB1cHJ2X3N0cmNhdChiYXNlbmFtZSsxMiwgIi50eHQiKTsKKyAgICB9CisgICAgcGFyc2VEQihmaWxlbmFtZSwgJmVycm9yQ29kZSk7CisKKyAgICAvKiBwcm9jZXNzIHBhcnNlZCBkYXRhICovCisgICAgaWYoVV9TVUNDRVNTKGVycm9yQ29kZSkpIHsKKyAgICAgICAgd3JpdGVOb3JtMihkZXN0RGlyKTsKKworICAgICAgICBjbGVhblVwRGF0YSgpOworICAgIH0KKworI2VuZGlmCisKKyAgICByZXR1cm4gZXJyb3JDb2RlOworfQorCisjaWYgIVVDT05GSUdfTk9fTk9STUFMSVpBVElPTgorCisvKiBwYXJzZXIgZm9yIERlcml2ZWROb3JtYWxpemF0aW9uUHJvcGVydGllcy50eHQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBVX0NBTExDT05WCitkZXJpdmVkTm9ybWFsaXphdGlvblByb3BlcnRpZXNMaW5lRm4odm9pZCAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpmaWVsZHNbXVsyXSwgaW50MzJfdCBmaWVsZENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVFcnJvckNvZGUgKnBFcnJvckNvZGUpIHsKKyAgICBVQ2hhciBzdHJpbmdbMzJdOworICAgIGNoYXIgKnM7CisgICAgdWludDMyX3Qgc3RhcnQsIGVuZDsKKyAgICBpbnQzMl90IGNvdW50OworCisgICAgLyogZ2V0IGNvZGUgcG9pbnQgcmFuZ2UgKi8KKyAgICBjb3VudD11X3BhcnNlQ29kZVBvaW50UmFuZ2UoZmllbGRzWzBdWzBdLCAmc3RhcnQsICZlbmQsIHBFcnJvckNvZGUpOworICAgIGlmKFVfRkFJTFVSRSgqcEVycm9yQ29kZSkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5ub3JtOiBlcnJvciBwYXJzaW5nIERlcml2ZWROb3JtYWxpemF0aW9uUHJvcGVydGllcy50eHQgbWFwcGluZyBhdCAlc1xuIiwgZmllbGRzWzBdWzBdKTsKKyAgICAgICAgZXhpdCgqcEVycm9yQ29kZSk7CisgICAgfQorCisgICAgLyogaWdub3JlIGhhbmd1bCAtIGhhbmRsZSBleHBsaWNpdGx5ICovCisgICAgaWYoc3RhcnQ9PTB4YWMwMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogZ2V0IHByb3BlcnR5IC0gaWdub3JlIHVucmVjb2duaXplZCBvbmVzICovCisgICAgcz0oY2hhciAqKXVfc2tpcFdoaXRlc3BhY2UoZmllbGRzWzFdWzBdKTsKKyAgICBpZigwPT11cHJ2X21lbWNtcChzLCAiQ29tcF9FeCIsIDcpIHx8IDA9PXVwcnZfbWVtY21wKHMsICJGdWxsX0NvbXBvc2l0aW9uX0V4Y2x1c2lvbiIsIDI2KSkgeworICAgICAgICAvKiBmdWxsIGNvbXBvc2l0aW9uIGV4Y2x1c2lvbiAqLworICAgICAgICB3aGlsZShzdGFydDw9ZW5kKSB7CisgICAgICAgICAgICBzZXRDb21wb3NpdGlvbkV4Y2x1c2lvbihzdGFydCsrKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQKK3BhcnNlRGVyaXZlZE5vcm1hbGl6YXRpb25Qcm9wZXJ0aWVzKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBVRXJyb3JDb2RlICpwRXJyb3JDb2RlLCBVQm9vbCByZXBvcnRFcnJvcikgeworICAgIGNoYXIgKmZpZWxkc1syXVsyXTsKKworICAgIGlmKHBFcnJvckNvZGU9PU5VTEwgfHwgVV9GQUlMVVJFKCpwRXJyb3JDb2RlKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdV9wYXJzZURlbGltaXRlZEZpbGUoZmlsZW5hbWUsICc7JywgZmllbGRzLCAyLCBkZXJpdmVkTm9ybWFsaXphdGlvblByb3BlcnRpZXNMaW5lRm4sIE5VTEwsIHBFcnJvckNvZGUpOworICAgIGlmKFVfRkFJTFVSRSgqcEVycm9yQ29kZSkgJiYgKHJlcG9ydEVycm9yIHx8ICpwRXJyb3JDb2RlIT1VX0ZJTEVfQUNDRVNTX0VSUk9SKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbm5vcm0gZXJyb3I6IHVfcGFyc2VEZWxpbWl0ZWRGaWxlKFwiJXNcIikgZmFpbGVkIC0gJXNcbiIsIGZpbGVuYW1lLCB1X2Vycm9yTmFtZSgqcEVycm9yQ29kZSkpOworICAgICAgICBleGl0KCpwRXJyb3JDb2RlKTsKKyAgICB9Cit9CisKKy8qIHBhcnNlciBmb3IgVW5pY29kZURhdGEudHh0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIFVfQ0FMTENPTlYKK3VuaWNvZGVEYXRhTGluZUZuKHZvaWQgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICBjaGFyICpmaWVsZHNbXVsyXSwgaW50MzJfdCBmaWVsZENvdW50LAorICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSAqcEVycm9yQ29kZSkgeworICAgIHVpbnQzMl90IGRlY29tcFs0MF07CisgICAgTm9ybSBub3JtOworICAgIGNvbnN0IGNoYXIgKnM7CisgICAgY2hhciAqZW5kOworICAgIHVpbnQzMl90IGNvZGUsIHZhbHVlOworICAgIGludDMyX3QgbGVuZ3RoOworICAgIFVCb29sIGlzQ29tcGF0LCBzb21ldGhpbmc9RkFMU0U7CisKKyAgICAvKiBpZ25vcmUgRmlyc3QgYW5kIExhc3QgZW50cmllcyBmb3IgcmFuZ2VzICovCisgICAgaWYoICpmaWVsZHNbMV1bMF09PSc8JyAmJgorICAgICAgICAobGVuZ3RoPShpbnQzMl90KShmaWVsZHNbMV1bMV0tZmllbGRzWzFdWzBdKSk+PTkgJiYKKyAgICAgICAgKDA9PXVwcnZfbWVtY21wKCIsIEZpcnN0PiIsIGZpZWxkc1sxXVsxXS04LCA4KSB8fCAwPT11cHJ2X21lbWNtcCgiLCBMYXN0PiIsIGZpZWxkc1sxXVsxXS03LCA3KSkKKyAgICApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIHJlc2V0IHRoZSBwcm9wZXJ0aWVzICovCisgICAgdXBydl9tZW1zZXQoJm5vcm0sIDAsIHNpemVvZihOb3JtKSk7CisKKyAgICAvKiBnZXQgdGhlIGNoYXJhY3RlciBjb2RlLCBmaWVsZCAwICovCisgICAgY29kZT0odWludDMyX3QpdXBydl9zdHJ0b3VsKGZpZWxkc1swXVswXSwgJmVuZCwgMTYpOworICAgIGlmKGVuZDw9ZmllbGRzWzBdWzBdIHx8IGVuZCE9ZmllbGRzWzBdWzFdKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2Vubm9ybTogc3ludGF4IGVycm9yIGluIGZpZWxkIDAgYXQgJXNcbiIsIGZpZWxkc1swXVswXSk7CisgICAgICAgICpwRXJyb3JDb2RlPVVfUEFSU0VfRVJST1I7CisgICAgICAgIGV4aXQoVV9QQVJTRV9FUlJPUik7CisgICAgfQorCisgICAgLyogZ2V0IGNhbm9uaWNhbCBjb21iaW5pbmcgY2xhc3MsIGZpZWxkIDMgKi8KKyAgICB2YWx1ZT0odWludDMyX3QpdXBydl9zdHJ0b3VsKGZpZWxkc1szXVswXSwgJmVuZCwgMTApOworICAgIGlmKGVuZDw9ZmllbGRzWzNdWzBdIHx8IGVuZCE9ZmllbGRzWzNdWzFdIHx8IHZhbHVlPjB4ZmYpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5ub3JtOiBzeW50YXggZXJyb3IgaW4gZmllbGQgMyBhdCAlc1xuIiwgZmllbGRzWzBdWzBdKTsKKyAgICAgICAgKnBFcnJvckNvZGU9VV9QQVJTRV9FUlJPUjsKKyAgICAgICAgZXhpdChVX1BBUlNFX0VSUk9SKTsKKyAgICB9CisgICAgaWYodmFsdWU+MCkgeworICAgICAgICBub3JtLnVkYXRhQ0M9KHVpbnQ4X3QpdmFsdWU7CisgICAgICAgIHNvbWV0aGluZz1UUlVFOworICAgIH0KKworICAgIC8qIGdldCB0aGUgZGVjb21wb3NpdGlvbiwgZmllbGQgNSAqLworICAgIGlmKGZpZWxkc1s1XVswXTxmaWVsZHNbNV1bMV0pIHsKKyAgICAgICAgaWYoKihzPWZpZWxkc1s1XVswXSk9PSc8JykgeworICAgICAgICAgICAgKytzOworICAgICAgICAgICAgaXNDb21wYXQ9VFJVRTsKKworICAgICAgICAgICAgLyogc2tpcCBhbmQgaWdub3JlIHRoZSBjb21wYXRpYmlsaXR5IHR5cGUgbmFtZSAqLworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGlmKHM9PWZpZWxkc1s1XVsxXSkgeworICAgICAgICAgICAgICAgICAgICAvKiBtaXNzaW5nICc+JyAqLworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbm5vcm06IHN5bnRheCBlcnJvciBpbiBmaWVsZCA1IGF0ICVzXG4iLCBmaWVsZHNbMF1bMF0pOworICAgICAgICAgICAgICAgICAgICAqcEVycm9yQ29kZT1VX1BBUlNFX0VSUk9SOworICAgICAgICAgICAgICAgICAgICBleGl0KFVfUEFSU0VfRVJST1IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUoKnMrKyE9Jz4nKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlzQ29tcGF0PUZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgLyogcGFyc2UgdGhlIGRlY29tcG9zaXRpb24gc3RyaW5nICovCisgICAgICAgIGxlbmd0aD11X3BhcnNlQ29kZVBvaW50cyhzLCBkZWNvbXAsIHNpemVvZihkZWNvbXApLzQsIHBFcnJvckNvZGUpOworICAgICAgICBpZihVX0ZBSUxVUkUoKnBFcnJvckNvZGUpKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbm5vcm0gZXJyb3IgcGFyc2luZyBVbmljb2RlRGF0YS50eHQgZGVjb21wb3NpdGlvbiBvZiBVKyUwNGx4IC0gJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIChsb25nKWNvZGUsIHVfZXJyb3JOYW1lKCpwRXJyb3JDb2RlKSk7CisgICAgICAgICAgICBleGl0KCpwRXJyb3JDb2RlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHN0b3JlIHRoZSBzdHJpbmcgKi8KKyAgICAgICAgaWYobGVuZ3RoPjApIHsKKyAgICAgICAgICAgIHNvbWV0aGluZz1UUlVFOworICAgICAgICAgICAgaWYoaXNDb21wYXQpIHsKKyAgICAgICAgICAgICAgICBub3JtLmxlbk5GS0Q9KHVpbnQ4X3QpbGVuZ3RoOworICAgICAgICAgICAgICAgIG5vcm0ubmZrZD1kZWNvbXA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmKGxlbmd0aD4yKSB7CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2Vubm9ybTogZXJyb3IgLSBsZW5ndGggb2YgTkZEKFUrJTA0bHgpID0gJWxkID4yIGluIFVuaWNvZGVEYXRhIC0gaWxsZWdhbFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyljb2RlLCAobG9uZylsZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAqcEVycm9yQ29kZT1VX1BBUlNFX0VSUk9SOworICAgICAgICAgICAgICAgICAgICBleGl0KFVfUEFSU0VfRVJST1IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBub3JtLmxlbk5GRD0odWludDhfdClsZW5ndGg7CisgICAgICAgICAgICAgICAgbm9ybS5uZmQ9ZGVjb21wOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogY2hlY2sgZm9yIG5vbi1jaGFyYWN0ZXIgY29kZSBwb2ludHMgKi8KKyAgICBpZigoY29kZSYweGZmZmUpPT0weGZmZmUgfHwgKHVpbnQzMl90KShjb2RlLTB4ZmRkMCk8MHgyMCB8fCBjb2RlPjB4MTBmZmZmKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2Vubm9ybTogZXJyb3IgLSBwcm9wZXJ0aWVzIGZvciBub24tY2hhcmFjdGVyIGNvZGUgcG9pbnQgVSslMDRseFxuIiwKKyAgICAgICAgICAgICAgICAobG9uZyljb2RlKTsKKyAgICAgICAgKnBFcnJvckNvZGU9VV9QQVJTRV9FUlJPUjsKKyAgICAgICAgZXhpdChVX1BBUlNFX0VSUk9SKTsKKyAgICB9CisKKyAgICBpZihzb21ldGhpbmcpIHsKKyAgICAgICAgLyogdGhlcmUgYXJlIG5vcm1hbGl6YXRpb24gdmFsdWVzLCBzbyBzdG9yZSB0aGVtICovCisjaWYgMAorICAgICAgICBpZihiZVZlcmJvc2UpIHsKKyAgICAgICAgICAgIHByaW50Zigic3RvcmUgdmFsdWVzIGZvciBVKyUwNGx4OiBjYz0lZCwgbGVuTkZEPSVsZCwgbGVuTkZLRD0lbGRcbiIsCisgICAgICAgICAgICAgICAgICAgKGxvbmcpY29kZSwgbm9ybS51ZGF0YUNDLCAobG9uZylub3JtLmxlbk5GRCwgKGxvbmcpbm9ybS5sZW5ORktEKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIHN0b3JlTm9ybShjb2RlLCAmbm9ybSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorcGFyc2VEQihjb25zdCBjaGFyICpmaWxlbmFtZSwgVUVycm9yQ29kZSAqcEVycm9yQ29kZSkgeworICAgIGNoYXIgKmZpZWxkc1sxNV1bMl07CisKKyAgICBpZihwRXJyb3JDb2RlPT1OVUxMIHx8IFVfRkFJTFVSRSgqcEVycm9yQ29kZSkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHVfcGFyc2VEZWxpbWl0ZWRGaWxlKGZpbGVuYW1lLCAnOycsIGZpZWxkcywgMTUsIHVuaWNvZGVEYXRhTGluZUZuLCBOVUxMLCBwRXJyb3JDb2RlKTsKKyAgICBpZihVX0ZBSUxVUkUoKnBFcnJvckNvZGUpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2Vubm9ybSBlcnJvcjogdV9wYXJzZURlbGltaXRlZEZpbGUoXCIlc1wiKSBmYWlsZWQgLSAlc1xuIiwgZmlsZW5hbWUsIHVfZXJyb3JOYW1lKCpwRXJyb3JDb2RlKSk7CisgICAgICAgIGV4aXQoKnBFcnJvckNvZGUpOworICAgIH0KK30KKworI2VuZGlmIC8qICNpZiAhVUNPTkZJR19OT19OT1JNQUxJWkFUSU9OICovCisKKy8qCisgKiBIZXksIEVtYWNzLCBwbGVhc2Ugc2V0IHRoZSBmb2xsb3dpbmc6CisgKgorICogTG9jYWwgVmFyaWFibGVzOgorICogaW5kZW50LXRhYnMtbW9kZTogbmlsCisgKiBFbmQ6CisgKgorICovCmRpZmYgLS1naXQgYS91bmljb2RlL2MvZ2Vubm9ybS9nZW5ub3JtLmggYi91bmljb2RlL2MvZ2Vubm9ybS9nZW5ub3JtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFhOWJhNwotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGUvYy9nZW5ub3JtL2dlbm5vcm0uaApAQCAtMCwwICsxLDUwIEBACisvKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIENvcHlyaWdodCAoQykgMTk5OS0yMDEwLCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzCisqICAgQ29ycG9yYXRpb24gYW5kIG90aGVycy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgZmlsZSBuYW1lOiAgZ2Vubm9ybS5oCisqICAgZW5jb2Rpbmc6ICAgVVMtQVNDSUkKKyogICB0YWIgc2l6ZTogICA4IChub3QgdXNlZCkKKyogICBpbmRlbnRhdGlvbjo0CisqCisqICAgY3JlYXRlZCBvbjogMjAwMW1heTI1CisqICAgY3JlYXRlZCBieTogTWFya3VzIFcuIFNjaGVyZXIKKyovCisKKyNpZm5kZWYgX19HRU5QUk9QU19IX18KKyNkZWZpbmUgX19HRU5QUk9QU19IX18KKworI2luY2x1ZGUgInVuaWNvZGUvdXR5cGVzLmgiCisKKy8qCisgKiBkYXRhIHN0cnVjdHVyZSB0aGF0IGhvbGRzIHRoZSBub3JtYWxpemF0aW9uIHByb3BlcnRpZXMgZm9yIG9uZSBvciBtb3JlCisgKiBjb2RlIHBvaW50KHMpIGF0IGJ1aWxkIHRpbWUKKyAqLwordHlwZWRlZiBzdHJ1Y3QgTm9ybSB7CisgICAgdWludDhfdCB1ZGF0YUNDLCBsZW5ORkQsIGxlbk5GS0Q7CisgICAgdWludDMyX3QgKm5mZCwgKm5ma2Q7Cit9IE5vcm07CisKKy8qIGdsb2JhbCBmbGFncyAqLworZXh0ZXJuIFVCb29sIGJlVmVyYm9zZTsKKworLyogcHJvdG90eXBlcyAqLworZXh0ZXJuIHZvaWQKK2luaXQodm9pZCk7CisKK2V4dGVybiB2b2lkCitzdG9yZU5vcm0odWludDMyX3QgY29kZSwgTm9ybSAqbm9ybSk7CisKK2V4dGVybiB2b2lkCitzZXRDb21wb3NpdGlvbkV4Y2x1c2lvbih1aW50MzJfdCBjb2RlKTsKKworZXh0ZXJuIHZvaWQKK3dyaXRlTm9ybTIoY29uc3QgY2hhciAqZGF0YURpcik7CisKK2V4dGVybiB2b2lkCitjbGVhblVwRGF0YSh2b2lkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS91bmljb2RlL2MvZ2Vubm9ybS9nZW5ub3JtLnZjcHJvaiBiL3VuaWNvZGUvYy9nZW5ub3JtL2dlbm5vcm0udmNwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkOTljNTQKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RlL2MvZ2Vubm9ybS9nZW5ub3JtLnZjcHJvagpAQCAtMCwwICsxLDQwNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+Cis8VmlzdWFsU3R1ZGlvUHJvamVjdAorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIgorCVZlcnNpb249IjkuMDAiCisJTmFtZT0iZ2Vubm9ybSIKKwlQcm9qZWN0R1VJRD0ie0Y1MjEzMTAzLTZDQkUtNDZFNi1CNENDLTI1NzBCNjgzN0Q4Nn0iCisJVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj0iMTMxMDcyIgorCT4KKwk8UGxhdGZvcm1zPgorCQk8UGxhdGZvcm0KKwkJCU5hbWU9IldpbjMyIgorCQkvPgorCQk8UGxhdGZvcm0KKwkJCU5hbWU9Ing2NCIKKwkJLz4KKwk8L1BsYXRmb3Jtcz4KKwk8VG9vbEZpbGVzPgorCTwvVG9vbEZpbGVzPgorCTxDb25maWd1cmF0aW9ucz4KKwkJPENvbmZpZ3VyYXRpb24KKwkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5ceDg2XFJlbGVhc2UiCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5ceDg2XFJlbGVhc2UiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSIKKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyIKKwkJCVVzZU9mTUZDPSIwIgorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIgorCQkJQ2hhcmFjdGVyU2V0PSIyIgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkJQ29tbWFuZExpbmU9ImNvcHkgJnF1b3Q7JChUYXJnZXRQYXRoKSZxdW90OyAuLlwuLlwuLlxiaW4mI3gwRDsmI3gwQTsiCisJCQkJT3V0cHV0cz0iLi5cLi5cLi5cYmluXCQoVGFyZ2V0RmlsZU5hbWUpIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiCisJCQkJVHlwZUxpYnJhcnlOYW1lPSIuXHg4NlxSZWxlYXNlL2dlbm5vcm0udGxiIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlxjb21tb247Li5cdG9vbHV0aWwiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO05ERUJVRztfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUiCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSIKKwkJCQlSdW50aW1lTGlicmFyeT0iMiIKKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSIKKwkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJ0cnVlIgorCQkJCVRyZWF0V0NoYXJfdEFzQnVpbHRJblR5cGU9InRydWUiCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXHg4NlxSZWxlYXNlL2dlbm5vcm0ucGNoIgorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlx4ODZcUmVsZWFzZS8iCisJCQkJT2JqZWN0RmlsZT0iLlx4ODZcUmVsZWFzZS8iCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5ceDg2XFJlbGVhc2UvIgorCQkJCVdhcm5pbmdMZXZlbD0iMyIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJQ29tcGlsZUFzPSIwIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciCisJCQkJQ3VsdHVyZT0iMTAzMyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKKwkJCQlPdXRwdXRGaWxlPSIuXHg4NlxSZWxlYXNlL2dlbm5vcm0uZXhlIgorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMSIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlx4ODZcUmVsZWFzZS9nZW5ub3JtLnBkYiIKKwkJCQlTdWJTeXN0ZW09IjEiCisJCQkJUmFuZG9taXplZEJhc2VBZGRyZXNzPSIxIgorCQkJCURhdGFFeGVjdXRpb25QcmV2ZW50aW9uPSIwIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5ceDg2XERlYnVnIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXHg4NlxEZWJ1ZyIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIgorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIgorCQkJVXNlT2ZNRkM9IjAiCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiCisJCQlDaGFyYWN0ZXJTZXQ9IjIiCisJCQk+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCQlDb21tYW5kTGluZT0iY29weSAmcXVvdDskKFRhcmdldFBhdGgpJnF1b3Q7IC4uXC4uXC4uXGJpbiYjeDBEOyYjeDBBOyIKKwkJCQlPdXRwdXRzPSIuLlwuLlwuLlxiaW5cJChUYXJnZXRGaWxlTmFtZSkiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCQlUeXBlTGlicmFyeU5hbWU9Ii5ceDg2XERlYnVnL2dlbm5vcm0udGxiIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlPcHRpbWl6YXRpb249IjAiCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cY29tbW9uOy4uXHRvb2x1dGlsIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtfREVCVUc7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIgorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyIKKwkJCQlSdW50aW1lTGlicmFyeT0iMyIKKwkJCQlCdWZmZXJTZWN1cml0eUNoZWNrPSJ0cnVlIgorCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9InRydWUiCisJCQkJVHJlYXRXQ2hhcl90QXNCdWlsdEluVHlwZT0idHJ1ZSIKKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5ceDg2XERlYnVnL2dlbm5vcm0ucGNoIgorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlx4ODZcRGVidWcvIgorCQkJCU9iamVjdEZpbGU9Ii5ceDg2XERlYnVnLyIKKwkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlx4ODZcRGVidWcvIgorCQkJCUJyb3dzZUluZm9ybWF0aW9uPSIxIgorCQkJCVdhcm5pbmdMZXZlbD0iMyIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iNCIKKwkJCQlDb21waWxlQXM9IjAiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyIKKwkJCQlDdWx0dXJlPSIxMDMzIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIgorCQkJCU91dHB1dEZpbGU9Ii5ceDg2XERlYnVnL2dlbm5vcm0uZXhlIgorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMiIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIgorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5ceDg2XERlYnVnL2dlbm5vcm0ucGRiIgorCQkJCVN1YlN5c3RlbT0iMSIKKwkJCQlSYW5kb21pemVkQmFzZUFkZHJlc3M9IjEiCisJCQkJRGF0YUV4ZWN1dGlvblByZXZlbnRpb249IjAiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIgorCQkJCVVzZUZBVDMyV29ya2Fyb3VuZD0idHJ1ZSIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iUmVsZWFzZXx4NjQiCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5ceDY0XFJlbGVhc2UiCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5ceDY0XFJlbGVhc2UiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSIKKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyIKKwkJCVVzZU9mTUZDPSIwIgorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIgorCQkJQ2hhcmFjdGVyU2V0PSIyIgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkJQ29tbWFuZExpbmU9ImNvcHkgJnF1b3Q7JChUYXJnZXRQYXRoKSZxdW90OyAuLlwuLlwuLlxiaW42NCYjeDBEOyYjeDBBOyIKKwkJCQlPdXRwdXRzPSIuLlwuLlwuLlxiaW42NFwkKFRhcmdldEZpbGVOYW1lKSIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIgorCQkJCVRhcmdldEVudmlyb25tZW50PSIzIgorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iLlx4NjRcUmVsZWFzZS9nZW5ub3JtLnRsYiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cY29tbW9uOy4uXHRvb2x1dGlsIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU42NDtXSU4zMjtOREVCVUc7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIgorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiCisJCQkJUnVudGltZUxpYnJhcnk9IjIiCisJCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9InRydWUiCisJCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0idHJ1ZSIKKwkJCQlUcmVhdFdDaGFyX3RBc0J1aWx0SW5UeXBlPSJ0cnVlIgorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlx4NjRcUmVsZWFzZS9nZW5ub3JtLnBjaCIKKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5ceDY0XFJlbGVhc2UvIgorCQkJCU9iamVjdEZpbGU9Ii5ceDY0XFJlbGVhc2UvIgorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXHg2NFxSZWxlYXNlLyIKKwkJCQlXYXJuaW5nTGV2ZWw9IjMiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCUNvbXBpbGVBcz0iMCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIgorCQkJCUN1bHR1cmU9IjEwMzMiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiCisJCQkJT3V0cHV0RmlsZT0iLlx4NjRcUmVsZWFzZS9nZW5ub3JtLmV4ZSIKKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5ceDY0XFJlbGVhc2UvZ2Vubm9ybS5wZGIiCisJCQkJU3ViU3lzdGVtPSIxIgorCQkJCVRhcmdldE1hY2hpbmU9IjE3IgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCTwvQ29uZmlndXJhdGlvbj4KKwkJPENvbmZpZ3VyYXRpb24KKwkJCU5hbWU9IkRlYnVnfHg2NCIKKwkJCU91dHB1dERpcmVjdG9yeT0iLlx4NjRcRGVidWciCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5ceDY0XERlYnVnIgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiCisJCQlVc2VPZk1GQz0iMCIKKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIKKwkJCUNoYXJhY3RlclNldD0iMiIKKwkJCT4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJCUNvbW1hbmRMaW5lPSJjb3B5ICZxdW90OyQoVGFyZ2V0UGF0aCkmcXVvdDsgLi5cLi5cLi5cYmluNjQmI3gwRDsmI3gwQTsiCisJCQkJT3V0cHV0cz0iLi5cLi5cLi5cYmluNjRcJChUYXJnZXRGaWxlTmFtZSkiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMyIKKwkJCQlUeXBlTGlicmFyeU5hbWU9Ii5ceDY0XERlYnVnL2dlbm5vcm0udGxiIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlPcHRpbWl6YXRpb249IjAiCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cY29tbW9uOy4uXHRvb2x1dGlsIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU42NDtXSU4zMjtfREVCVUc7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIgorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyIKKwkJCQlSdW50aW1lTGlicmFyeT0iMyIKKwkJCQlCdWZmZXJTZWN1cml0eUNoZWNrPSJ0cnVlIgorCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9InRydWUiCisJCQkJVHJlYXRXQ2hhcl90QXNCdWlsdEluVHlwZT0idHJ1ZSIKKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5ceDY0XERlYnVnL2dlbm5vcm0ucGNoIgorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlx4NjRcRGVidWcvIgorCQkJCU9iamVjdEZpbGU9Ii5ceDY0XERlYnVnLyIKKwkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlx4NjRcRGVidWcvIgorCQkJCUJyb3dzZUluZm9ybWF0aW9uPSIxIgorCQkJCVdhcm5pbmdMZXZlbD0iMyIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyIKKwkJCQlDb21waWxlQXM9IjAiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyIKKwkJCQlDdWx0dXJlPSIxMDMzIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIgorCQkJCU91dHB1dEZpbGU9Ii5ceDY0XERlYnVnL2dlbm5vcm0uZXhlIgorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMiIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIgorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5ceDY0XERlYnVnL2dlbm5vcm0ucGRiIgorCQkJCVN1YlN5c3RlbT0iMSIKKwkJCQlUYXJnZXRNYWNoaW5lPSIxNyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiCisJCQkJVXNlRkFUMzJXb3JrYXJvdW5kPSJ0cnVlIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCTwvQ29uZmlndXJhdGlvbnM+CisJPFJlZmVyZW5jZXM+CisJPC9SZWZlcmVuY2VzPgorCTxGaWxlcz4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLlxnZW5ub3JtLmMiCisJCQk+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLlxnZW5ub3JtLmgiCisJCQk+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLlxzdG9yZS5jIgorCQkJPgorCQk8L0ZpbGU+CisJPC9GaWxlcz4KKwk8R2xvYmFscz4KKwk8L0dsb2JhbHM+Cis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+CmRpZmYgLS1naXQgYS91bmljb2RlL2MvZ2Vubm9ybS9zdG9yZS5jIGIvdW5pY29kZS9jL2dlbm5vcm0vc3RvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWRjNzQzCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZS9jL2dlbm5vcm0vc3RvcmUuYwpAQCAtMCwwICsxLDI4OSBAQAorLyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICBDb3B5cmlnaHQgKEMpIDE5OTktMjAxMCwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcworKiAgIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgIGZpbGUgbmFtZTogIHN0b3JlLmMKKyogICBlbmNvZGluZzogICBVUy1BU0NJSQorKiAgIHRhYiBzaXplOiAgIDggKG5vdCB1c2VkKQorKiAgIGluZGVudGF0aW9uOjQKKyoKKyogICBjcmVhdGVkIG9uOiAyMDAxbWF5MjUKKyogICBjcmVhdGVkIGJ5OiBNYXJrdXMgVy4gU2NoZXJlcgorKgorKiAgIFN0b3JlIFVuaWNvZGUgbm9ybWFsaXphdGlvbiBkYXRhIGluIGEgbWVtb3J5LW1hcHBhYmxlIGZpbGUuCisqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJ1bmljb2RlL3V0eXBlcy5oIgorI2luY2x1ZGUgInVuaWNvZGUvdWRhdGEuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3VzZXQuaCIKKyNpbmNsdWRlICJjbWVtb3J5LmgiCisjaW5jbHVkZSAiZmlsZXN0cm0uaCIKKyNpbmNsdWRlICJ1dHJpZS5oIgorI2luY2x1ZGUgInRvb2x1dGlsLmgiCisjaW5jbHVkZSAid3JpdGVzcmMuaCIKKyNpbmNsdWRlICJ1bm9ybWltcC5oIgorI2luY2x1ZGUgImdlbm5vcm0uaCIKKworI2RlZmluZSBET19ERUJVR19PVVQgMAorCisjZGVmaW5lIExFTkdUSE9GKGFycmF5KSAoaW50MzJfdCkoc2l6ZW9mKGFycmF5KS9zaXplb2YoKGFycmF5KVswXSkpCisKKyNpZiAhVUNPTkZJR19OT19OT1JNQUxJWkFUSU9OCisKKy8qIGJ1aWxkZXIgZGF0YSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBVTmV3VHJpZSAqbm9ybVRyaWU7CisKK3N0YXRpYyBVVG9vbE1lbW9yeSAqbm9ybU1lbSwgKnV0ZjMyTWVtOworCitzdGF0aWMgTm9ybSAqbm9ybXM7CisKK3N0YXRpYyBVU2V0ICpjb21wb3NpdGlvbkV4Y2x1c2lvbnM7CisKKy8qIGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGEgTm9ybSB1bml0ICovCitzdGF0aWMgTm9ybSAqCithbGxvY05vcm0oKSB7CisgICAgLyogYWxsb2NhdGUgTm9ybSAqLworICAgIE5vcm0gKnA9KE5vcm0gKil1dG1fYWxsb2Mobm9ybU1lbSk7CisgICAgcmV0dXJuIHA7Cit9CisKK2V4dGVybiB2b2lkCitpbml0KCkgeworICAgIHVpbnQxNl90ICpwMTY7CisKKyAgICBub3JtVHJpZSA9IChVTmV3VHJpZSAqKXVwcnZfbWFsbG9jKHNpemVvZihVTmV3VHJpZSkpOworICAgIHVwcnZfbWVtc2V0KG5vcm1UcmllLCAwLCBzaXplb2YoVU5ld1RyaWUpKTsKKworICAgIC8qIGluaXRpYWxpemUgdGhlIHR3byB0cmllcyAqLworICAgIGlmKE5VTEw9PXV0cmllX29wZW4obm9ybVRyaWUsIE5VTEwsIDMwMDAwLCAwLCAwLCBGQUxTRSkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJlcnJvcjogZmFpbGVkIHRvIGluaXRpYWxpemUgdHJpZXNcbiIpOworICAgICAgICBleGl0KFVfTUVNT1JZX0FMTE9DQVRJT05fRVJST1IpOworICAgIH0KKworICAgIC8qIGFsbG9jYXRlIE5vcm0gc3RydWN0dXJlcyBhbmQgcmVzZXQgdGhlIGZpcnN0IG9uZSAqLworICAgIG5vcm1NZW09dXRtX29wZW4oImdlbm5vcm0gbm9ybWFsaXphdGlvbiBzdHJ1Y3RzIiwgMjAwMDAsIDIwMDAwLCBzaXplb2YoTm9ybSkpOworICAgIG5vcm1zPWFsbG9jTm9ybSgpOworCisgICAgLyogYWxsb2NhdGUgVVRGLTMyIHN0cmluZyBtZW1vcnkgKi8KKyAgICB1dGYzMk1lbT11dG1fb3BlbigiZ2Vubm9ybSBVVEYtMzIgc3RyaW5ncyIsIDMwMDAwLCAzMDAwMCwgNCk7CisKKyAgICBjb21wb3NpdGlvbkV4Y2x1c2lvbnM9dXNldF9vcGVuRW1wdHkoKTsKK30KKworLyoKKyAqIGdldCBvciBjcmVhdGUgYSBOb3JtIHVuaXQ7CisgKiBnZXQgb3IgY3JlYXRlIHRoZSBpbnRlcm1lZGlhdGUgdHJpZSBlbnRyaWVzIGZvciBpdCBhcyB3ZWxsCisgKi8KK3N0YXRpYyBOb3JtICoKK2NyZWF0ZU5vcm0odWludDMyX3QgY29kZSkgeworICAgIE5vcm0gKnA7CisgICAgdWludDMyX3QgaTsKKworICAgIGk9dXRyaWVfZ2V0MzIobm9ybVRyaWUsIChVQ2hhcjMyKWNvZGUsIE5VTEwpOworICAgIGlmKGkhPTApIHsKKyAgICAgICAgcD1ub3JtcytpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGFsbG9jYXRlIE5vcm0gKi8KKyAgICAgICAgcD1hbGxvY05vcm0oKTsKKyAgICAgICAgaWYoIXV0cmllX3NldDMyKG5vcm1UcmllLCAoVUNoYXIzMiljb2RlLCAodWludDMyX3QpKHAtbm9ybXMpKSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJlcnJvcjogdG9vIG1hbnkgbm9ybWFsaXphdGlvbiBlbnRyaWVzXG4iKTsKKyAgICAgICAgICAgIGV4aXQoVV9CVUZGRVJfT1ZFUkZMT1dfRVJST1IpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBwOworfQorCisvKiBwcm9jZXNzaW5nIGluY29taW5nIG5vcm1hbGl6YXRpb24gZGF0YSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogcHJvY2VzcyB0aGUgZGF0YSBmb3Igb25lIGNvZGUgcG9pbnQgbGlzdGVkIGluIFVuaWNvZGVEYXRhOworICogVW5pY29kZURhdGEgaXRzZWxmIG5ldmVyIG1hcHMgYSBjb2RlIHBvaW50IHRvIGJvdGggTkZEIGFuZCBORktECisgKi8KK2V4dGVybiB2b2lkCitzdG9yZU5vcm0odWludDMyX3QgY29kZSwgTm9ybSAqbm9ybSkgeworICAgIE5vcm0gKnA9Y3JlYXRlTm9ybShjb2RlKTsKKworICAgIC8qIHN0b3JlIHRoZSBkYXRhICovCisgICAgdXBydl9tZW1jcHkocCwgbm9ybSwgc2l6ZW9mKE5vcm0pKTsKKworICAgIC8qIHN0b3JlIHRoZSBkZWNvbXBvc2l0aW9uIHN0cmluZyBpZiB0aGVyZSBpcyBvbmUgaGVyZSAqLworICAgIGlmKG5vcm0tPmxlbk5GRCE9MCkgeworICAgICAgICB1aW50MzJfdCAqczMyPXV0bV9hbGxvY04odXRmMzJNZW0sIG5vcm0tPmxlbk5GRCk7CisgICAgICAgIHVwcnZfbWVtY3B5KHMzMiwgbm9ybS0+bmZkLCBub3JtLT5sZW5ORkQqNCk7CisgICAgICAgIHAtPm5mZD1zMzI7CisgICAgfSBlbHNlIGlmKG5vcm0tPmxlbk5GS0QhPTApIHsKKyAgICAgICAgdWludDMyX3QgKnMzMj11dG1fYWxsb2NOKHV0ZjMyTWVtLCBub3JtLT5sZW5ORktEKTsKKyAgICAgICAgdXBydl9tZW1jcHkoczMyLCBub3JtLT5uZmtkLCBub3JtLT5sZW5ORktEKjQpOworICAgICAgICBwLT5uZmtkPXMzMjsKKyAgICB9Cit9CisKK2V4dGVybiB2b2lkCitzZXRDb21wb3NpdGlvbkV4Y2x1c2lvbih1aW50MzJfdCBjb2RlKSB7CisgICAgdXNldF9hZGQoY29tcG9zaXRpb25FeGNsdXNpb25zLCAoVUNoYXIzMiljb2RlKTsKK30KKworCitzdGF0aWMgdm9pZAord3JpdGVBbGxDQyhGSUxFICpmKSB7CisgICAgdWludDMyX3QgaTsKKyAgICBVQ2hhcjMyIHByZXZDb2RlLCBjb2RlOworICAgIHVpbnQ4X3QgcHJldkNDLCBjYzsKKyAgICBVQm9vbCBpc0luQmxvY2taZXJvOworCisgICAgZnByaW50ZihmLCAiIyBDYW5vbmljYWxfQ29tYmluaW5nX0NsYXNzIChjY2MpIHZhbHVlc1xuIik7CisgICAgcHJldkNvZGU9MDsKKyAgICBwcmV2Q0M9MDsKKyAgICBmb3IoY29kZT0wOyBjb2RlPD0weDExMDAwMDspIHsKKyAgICAgICAgaWYoY29kZT09MHgxMTAwMDApIHsKKyAgICAgICAgICAgIGNjPTA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpPXV0cmllX2dldDMyKG5vcm1UcmllLCBjb2RlLCAmaXNJbkJsb2NrWmVybyk7CisgICAgICAgICAgICBpZihpPT0wIHx8IGlzSW5CbG9ja1plcm8pIHsKKyAgICAgICAgICAgICAgICBjYz0wOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjYz1ub3Jtc1tpXS51ZGF0YUNDOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmKHByZXZDQyE9Y2MpIHsKKyAgICAgICAgICAgIGlmKHByZXZDQyE9MCkgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGxhc3RDb2RlPWNvZGUtMTsKKyAgICAgICAgICAgICAgICBpZihwcmV2Q29kZT09bGFzdENvZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmLCAiJTA0bFg6JWRcbiIsIChsb25nKWxhc3RDb2RlLCBwcmV2Q0MpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZiwgIiUwNGxYLi4lMDRsWDolZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZylwcmV2Q29kZSwgKGxvbmcpbGFzdENvZGUsIHByZXZDQyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJldkNvZGU9Y29kZTsKKyAgICAgICAgICAgIHByZXZDQz1jYzsKKyAgICAgICAgfQorICAgICAgICBpZihpc0luQmxvY2taZXJvKSB7CisgICAgICAgICAgICBjb2RlKz1VVFJJRV9EQVRBX0JMT0NLX0xFTkdUSDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICsrY29kZTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIFVCb29sCitoYXNNYXBwaW5nKHVpbnQzMl90IGNvZGUpIHsKKyAgICBOb3JtICpub3JtPW5vcm1zK3V0cmllX2dldDMyKG5vcm1UcmllLCBjb2RlLCBOVUxMKTsKKyAgICByZXR1cm4gbm9ybS0+bGVuTkZEIT0wIHx8IG5vcm0tPmxlbk5GS0QhPTA7Cit9CisKK3N0YXRpYyBVQm9vbAoraGFzT25lV2F5TWFwcGluZyh1aW50MzJfdCBjb2RlLCBVQm9vbCB3aXRoQ29tcGF0KSB7CisgICAgZm9yKDs7KSB7CisgICAgICAgIE5vcm0gKm5vcm09bm9ybXMrdXRyaWVfZ2V0MzIobm9ybVRyaWUsIGNvZGUsIE5VTEwpOworICAgICAgICB1aW50OF90IGxlbmd0aDsKKyAgICAgICAgaWYoKGxlbmd0aD1ub3JtLT5sZW5ORkQpIT0wKSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVGhlIGNhbm9uaWNhbCBkZWNvbXBvc2l0aW9uIGlzIGEgb25lLXdheSBtYXBwaW5nIGlmCisgICAgICAgICAgICAgKiAtIGl0IGRvZXMgbm90IG1hcCB0byBleGFjdGx5IHR3byBjb2RlIHBvaW50cworICAgICAgICAgICAgICogLSB0aGUgY29kZSBoYXMgY2NjIT0wCisgICAgICAgICAgICAgKiAtIHRoZSBjb2RlIGhhcyB0aGUgQ29tcG9zaXRpb25fRXhjbHVzaW9uIHByb3BlcnR5CisgICAgICAgICAgICAgKiAtIGl0cyBzdGFydGVyIGhhcyBhIG9uZS13YXkgbWFwcGluZyAobG9vcCBmb3IgdGhpcykKKyAgICAgICAgICAgICAqIC0gaXRzIG5vbi1zdGFydGVyIGRlY29tcG9zZXMKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYoIGxlbmd0aCE9MiB8fAorICAgICAgICAgICAgICAgIG5vcm0tPnVkYXRhQ0MhPTAgfHwKKyAgICAgICAgICAgICAgICB1c2V0X2NvbnRhaW5zKGNvbXBvc2l0aW9uRXhjbHVzaW9ucywgKFVDaGFyMzIpY29kZSkgfHwKKyAgICAgICAgICAgICAgICBoYXNNYXBwaW5nKG5vcm0tPm5mZFsxXSkKKyAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29kZT1ub3JtLT5uZmRbMF07ICAvKiBjb250aW51ZSAqLworICAgICAgICB9IGVsc2UgaWYod2l0aENvbXBhdCAmJiBub3JtLT5sZW5ORktEIT0wKSB7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQKK3dyaXRlQWxsTWFwcGluZ3MoRklMRSAqZiwgVUJvb2wgd2l0aENvbXBhdCkgeworICAgIHVpbnQzMl90IGksIGNvZGU7CisgICAgVUJvb2wgaXNJbkJsb2NrWmVybzsKKworICAgIGlmKHdpdGhDb21wYXQpIHsKKyAgICAgICAgZnByaW50ZihmLCAiXG4jIENhbm9uaWNhbCBhbmQgY29tcGF0aWJpbGl0eSBkZWNvbXBvc2l0aW9uIG1hcHBpbmdzXG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmcHJpbnRmKGYsICJcbiMgQ2Fub25pY2FsIGRlY29tcG9zaXRpb24gbWFwcGluZ3NcbiIpOworICAgIH0KKyAgICBmb3IoY29kZT0wOyBjb2RlPD0weDEwZmZmZjspIHsKKyAgICAgICAgaT11dHJpZV9nZXQzMihub3JtVHJpZSwgY29kZSwgJmlzSW5CbG9ja1plcm8pOworICAgICAgICBpZihpc0luQmxvY2taZXJvKSB7CisgICAgICAgICAgICBjb2RlKz1VVFJJRV9EQVRBX0JMT0NLX0xFTkdUSDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmKGkhPTApIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCAqczMyOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgbGVuZ3RoOworICAgICAgICAgICAgICAgIGNoYXIgc2VwYXJhdG9yOworICAgICAgICAgICAgICAgIGlmKChsZW5ndGg9bm9ybXNbaV0ubGVuTkZEKSE9MCkgeworICAgICAgICAgICAgICAgICAgICBzMzI9bm9ybXNbaV0ubmZkOworICAgICAgICAgICAgICAgICAgICBzZXBhcmF0b3I9IGhhc09uZVdheU1hcHBpbmcoY29kZSwgd2l0aENvbXBhdCkgPyAnPicgOiAnPSc7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmKHdpdGhDb21wYXQgJiYgKGxlbmd0aD1ub3Jtc1tpXS5sZW5ORktEKSE9MCkgeworICAgICAgICAgICAgICAgICAgICBzMzI9bm9ybXNbaV0ubmZrZDsKKyAgICAgICAgICAgICAgICAgICAgc2VwYXJhdG9yPSc+JzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYobGVuZ3RoIT0wKSB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgajsKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmLCAiJTA0bFglYyIsIChsb25nKWNvZGUsIHNlcGFyYXRvcik7CisgICAgICAgICAgICAgICAgICAgIGZvcihqPTA7IGo8bGVuZ3RoOyArK2opIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKGohPTApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHV0YygnICcsIGYpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmLCAiJTA0bFgiLCAobG9uZylzMzJbal0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZwdXRjKCdcbicsIGYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsrY29kZTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQKK3dyaXRlTm9ybTJUZXh0RmlsZShjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgVUJvb2wgd2l0aENvbXBhdCkgeworICAgIEZJTEUgKmY9dXNyY19jcmVhdGVUZXh0RGF0YShwYXRoLCBmaWxlbmFtZSk7CisgICAgaWYoZj09TlVMTCkgeworICAgICAgICBleGl0KFVfRklMRV9BQ0NFU1NfRVJST1IpOworICAgIH0KKyAgICB3cml0ZUFsbENDKGYpOworICAgIHdyaXRlQWxsTWFwcGluZ3MoZiwgd2l0aENvbXBhdCk7CisgICAgZmNsb3NlKGYpOworfQorCitleHRlcm4gdm9pZAord3JpdGVOb3JtMihjb25zdCBjaGFyICpkYXRhRGlyKSB7CisgICAgd3JpdGVOb3JtMlRleHRGaWxlKGRhdGFEaXIsICJuZmMudHh0IiwgRkFMU0UpOworICAgIHdyaXRlTm9ybTJUZXh0RmlsZShkYXRhRGlyLCAibmZrYy50eHQiLCBUUlVFKTsKK30KKworZXh0ZXJuIHZvaWQKK2NsZWFuVXBEYXRhKHZvaWQpIHsKKyAgICB1dG1fY2xvc2Uobm9ybU1lbSk7CisgICAgdXRtX2Nsb3NlKHV0ZjMyTWVtKTsKKyAgICB1dHJpZV9jbG9zZShub3JtVHJpZSk7CisgICAgdXBydl9mcmVlKG5vcm1UcmllKTsKKyAgICB1c2V0X2Nsb3NlKGNvbXBvc2l0aW9uRXhjbHVzaW9ucyk7Cit9CisKKyNlbmRpZiAvKiAjaWYgIVVDT05GSUdfTk9fTk9STUFMSVpBVElPTiAqLworCisvKgorICogSGV5LCBFbWFjcywgcGxlYXNlIHNldCB0aGUgZm9sbG93aW5nOgorICoKKyAqIExvY2FsIFZhcmlhYmxlczoKKyAqIGluZGVudC10YWJzLW1vZGU6IG5pbAorICogRW5kOgorICoKKyAqLwpkaWZmIC0tZ2l0IGEvdW5pY29kZS9jL2dlbnBuYW1lL0NNYWtlTGlzdHMudHh0IGIvdW5pY29kZS9jL2dlbnBuYW1lL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4OTBiOWYKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RlL2MvZ2VucG5hbWUvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw5IEBACisjIENvcHlyaWdodCAoQykgMjAxMCwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcworIyBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgY3JlYXRlZCBvbjogMjAxMGp1bjAzCisjIGNyZWF0ZWQgYnk6IE1hcmt1cyBXLiBTY2hlcmVyCisjIGVkaXRlZCBvbjogMjAxMGp1bDIwCisjIGVkaXRlZCBieTogU3R1YXJ0IEcuIEdpbGwKK2FkZF9leGVjdXRhYmxlKGdlbnBuYW1lIGdlbnBuYW1lLmNwcCkKK3RhcmdldF9saW5rX2xpYnJhcmllcyhnZW5wbmFtZSBpY3V1YyBpY3V0dSkKZGlmZiAtLWdpdCBhL3VuaWNvZGUvYy9nZW5wbmFtZS9NYWtlZmlsZS5pbiBiL3VuaWNvZGUvYy9nZW5wbmFtZS9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTU5MmE5Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZS9jL2dlbnBuYW1lL01ha2VmaWxlLmluCkBAIC0wLDAgKzEsOTcgQEAKKyMjIE1ha2VmaWxlLmluIGZvciBJQ1UgLSB0b29scy9nZW5wbmFtZQorIyMgQ29weXJpZ2h0IChjKSAxOTk5LTIwMDUsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kCisjIyBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIyBTdGV2ZW4gUi4gTG9vbWlzCisKKyMjIFNvdXJjZSBkaXJlY3RvcnkgaW5mb3JtYXRpb24KK3NyY2RpciA9IEBzcmNkaXJACit0b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACisKK3RvcF9idWlsZGRpciA9IC4uLy4uCisKK2luY2x1ZGUgJCh0b3BfYnVpbGRkaXIpL2ljdWRlZnMubWsKKworIyMgQnVpbGQgZGlyZWN0b3J5IGluZm9ybWF0aW9uCitzdWJkaXIgPSB0b29scy9nZW5wbmFtZQorCitUQVJHRVRfU1RVQl9OQU1FID0gZ2VucG5hbWUKKworU0VDVElPTiA9IDgKKworTUFOX0ZJTEVTID0gJChUQVJHRVRfU1RVQl9OQU1FKS4kKFNFQ1RJT04pCisKKworIyMgRXh0cmEgZmlsZXMgdG8gcmVtb3ZlIGZvciAnbWFrZSBjbGVhbicKK0NMRUFORklMRVMgPSAqfiAkKERFUFMpCisKKyMjIFRhcmdldCBpbmZvcm1hdGlvbgorVEFSR0VUID0gJChCSU5ESVIpLyQoVEFSR0VUX1NUVUJfTkFNRSkkKEVYRUVYVCkKKworaWZuZXEgKCQodG9wX2J1aWxkZGlyKSwkKHRvcF9zcmNkaXIpKQorQ1BQRkxBR1MgKz0gLUkkKHRvcF9idWlsZGRpcikvY29tbW9uCitlbmRpZgorQ1BQRkxBR1MgKz0gLUkkKHRvcF9zcmNkaXIpL2NvbW1vbiAtSSQoc3JjZGlyKS8uLi90b29sdXRpbAorTElCUyA9ICQoTElCSUNVVE9PTFVUSUwpICQoTElCSUNVSTE4TikgJChMSUJJQ1VVQykgJChERUZBVUxUX0xJQlMpICQoTElCX00pCisKK09CSkVDVFMgPSBnZW5wbmFtZS5vCisKK0RFUFMgPSAkKE9CSkVDVFM6Lm89LmQpCisKKyMjIExpc3Qgb2YgcGhvbnkgdGFyZ2V0cworLlBIT05ZIDogYWxsIGFsbC1sb2NhbCBpbnN0YWxsIGluc3RhbGwtbG9jYWwgY2xlYW4gY2xlYW4tbG9jYWwJXAorZGlzdGNsZWFuIGRpc3RjbGVhbi1sb2NhbCBkaXN0IGRpc3QtbG9jYWwgY2hlY2sgY2hlY2stbG9jYWwgaW5zdGFsbC1tYW4KKworIyMgQ2xlYXIgc3VmZml4IGxpc3QKKy5TVUZGSVhFUyA6CisKKyMjIExpc3Qgb2Ygc3RhbmRhcmQgdGFyZ2V0cworYWxsOiBhbGwtbG9jYWwKK2luc3RhbGw6IGluc3RhbGwtbG9jYWwKK2NsZWFuOiBjbGVhbi1sb2NhbAorZGlzdGNsZWFuIDogZGlzdGNsZWFuLWxvY2FsCitkaXN0OiBkaXN0LWxvY2FsCitjaGVjazogYWxsIGNoZWNrLWxvY2FsCisKK2FsbC1sb2NhbDogJChUQVJHRVQpCisKK2luc3RhbGwtbG9jYWw6IGFsbC1sb2NhbCAKKyMJJChNS0lOU1RBTExESVJTKSAkKERFU1RESVIpJChzYmluZGlyKQorIwkkKElOU1RBTEwpICQoVEFSR0VUKSAkKERFU1RESVIpJChzYmluZGlyKQorCitpbnN0YWxsLW1hbjogJChNQU5fRklMRVMpCisjCSQoTUtJTlNUQUxMRElSUykgJChERVNURElSKSQobWFuZGlyKS9tYW4kKFNFQ1RJT04pCisjCSQoSU5TVEFMTF9EQVRBKSAkPyAkKERFU1RESVIpJChtYW5kaXIpL21hbiQoU0VDVElPTikKKworZGlzdC1sb2NhbDoKKworY2xlYW4tbG9jYWw6CisJdGVzdCAteiAiJChDTEVBTkZJTEVTKSIgfHwgJChSTVYpICQoQ0xFQU5GSUxFUykKKwkkKFJNVikgJChUQVJHRVQpICQoT0JKRUNUUykKKworZGlzdGNsZWFuLWxvY2FsOiBjbGVhbi1sb2NhbAorCSQoUk1WKSBNYWtlZmlsZQorCitjaGVjay1sb2NhbDogYWxsLWxvY2FsCisKK01ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCisJY2QgJCh0b3BfYnVpbGRkaXIpIFwKKwkgJiYgQ09ORklHX0ZJTEVTPSQoc3ViZGlyKS8kQCBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCisKKyQoVEFSR0VUKSA6ICQoT0JKRUNUUykKKwkkKExJTksuY2MpICQoT1VUT1BUKSRAICReICQoTElCUykgCisJJChQT1NUX0JVSUxEX1NURVApCisKKworJS4kKFNFQ1RJT04pOiAkKHNyY2RpcikvJS4kKFNFQ1RJT04pLmluCisJY2QgJCh0b3BfYnVpbGRkaXIpIFwKKwkgJiYgQ09ORklHX0ZJTEVTPSQoc3ViZGlyKS8kQCBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCisKKworaWZlcSAoLCQoTUFLRUNNREdPQUxTKSkKKy1pbmNsdWRlICQoREVQUykKK2Vsc2UKK2lmbmVxICgkKHBhdHN1YnN0ICVjbGVhbiwsJChNQUtFQ01ER09BTFMpKSwpCistaW5jbHVkZSAkKERFUFMpCitlbmRpZgorZW5kaWYKKwpkaWZmIC0tZ2l0IGEvdW5pY29kZS9jL2dlbnBuYW1lL1N5bnRoZXRpY1Byb3BlcnR5QWxpYXNlcy50eHQgYi91bmljb2RlL2MvZ2VucG5hbWUvU3ludGhldGljUHJvcGVydHlBbGlhc2VzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjlkMDIyCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZS9jL2dlbnBuYW1lL1N5bnRoZXRpY1Byb3BlcnR5QWxpYXNlcy50eHQKQEAgLTAsMCArMSw1MyBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxMCwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcworIyBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQXV0aG9yOiBBbGFuIExpdQorIyBDcmVhdGVkOiBGZWJydWFyeSAyMCAyMDAzCisjIFNpbmNlOiBJQ1UgMi42CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgVGhpcyBmaWxlIGZvbGxvd3MgdGhlIGZvcm1hdCBvZiBQcm9wZXJ0eUFsaWFzZXMudHh0CisjIEl0IGNvbnRhaW5zIHN5bnRoZXRpYyBwcm9wZXJ0eSBhbGlhc2VzIG5vdCBwcmVzZW50CisjIGluIHRoZSBVQ0QuICBVbmxpa2UgUHJvcGVydHlBbGlhc2VzLnR4dCwgaXQgc2hvdWxkCisjIE5PVCBjb250YWluIGEgdmVyc2lvbiBudW1iZXIuCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBNaXNjZWxsYW5lb3VzIFByb3BlcnRpZXMKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitzY3g7IFNjcmlwdF9FeHRlbnNpb25zCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIEVudW1lcmF0ZWQgUHJvcGVydGllcworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworIyBsY2NjKGMpPWNjYyhORkQoYylbMF0pCisjIHRjY2MoYyk9Y2NjKE5GRChjKVtsYXN0XSkKK2xjY2M7IExlYWRfQ2Fub25pY2FsX0NvbWJpbmluZ19DbGFzcwordGNjYzsgVHJhaWxfQ2Fub25pY2FsX0NvbWJpbmluZ19DbGFzcworCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBCaXRtYXNrIFByb3BlcnRpZXMKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitnY20gICAgICAgOyBHZW5lcmFsX0NhdGVnb3J5X01hc2sKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgQmluYXJ5IFByb3BlcnRpZXMKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitTZW5zaXRpdmUgOyBDYXNlX1NlbnNpdGl2ZQorCituZmRpbmVydDsgTkZEX0luZXJ0CituZmtkaW5lcnQ7IE5GS0RfSW5lcnQKK25mY2luZXJ0OyBORkNfSW5lcnQKK25ma2NpbmVydDsgTkZLQ19JbmVydAorCitzZWdzdGFydDsgU2VnbWVudF9TdGFydGVyCisKKyMgQy9QT1NJWCBjaGFyYWN0ZXIgY2xhc3NlcyB0aGF0IGRvIG5vdCBoYXZlIFVuaWNvZGUgcHJvcGVydHkgW3ZhbHVlXSBhbGlhc2VzCisjIHNlZSB1Y2hhci5oCituL2E7IGFsbnVtCituL2E7IGJsYW5rCituL2E7IGdyYXBoCituL2E7IHByaW50CituL2E7IHhkaWdpdApkaWZmIC0tZ2l0IGEvdW5pY29kZS9jL2dlbnBuYW1lL1N5bnRoZXRpY1Byb3BlcnR5VmFsdWVBbGlhc2VzLnR4dCBiL3VuaWNvZGUvYy9nZW5wbmFtZS9TeW50aGV0aWNQcm9wZXJ0eVZhbHVlQWxpYXNlcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA0ZDAzYQotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGUvYy9nZW5wbmFtZS9TeW50aGV0aWNQcm9wZXJ0eVZhbHVlQWxpYXNlcy50eHQKQEAgLTAsMCArMSw4OSBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvcHlyaWdodCAoYykgMjAwNi0yMDExLCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzCisjIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICAgZmlsZSBuYW1lOiAgICAgIFN5bnRoZXRpY1Byb3BlcnR5VmFsdWVBbGlhc2VzLnR4dAorIyAgIGVuY29kaW5nOiAgICAgICBVUy1BU0NJSQorIyAgIHRhYiBzaXplOiAgICAgICA4IChub3QgdXNlZCkKKyMgICBpbmRlbnRhdGlvbjogICAgNAorIyAgIGNyZWF0ZWQgYnk6ICAgICBnZW5zdnBhLnBsCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBUaGlzIGZpbGUgZm9sbG93cyB0aGUgZm9ybWF0IG9mIFByb3BlcnR5VmFsdWVBbGlhc2VzLnR4dAorIyBJdCBjb250YWlucyBzeW50aGV0aWMgcHJvcGVydHkgdmFsdWUgYWxpYXNlcyBub3QgcHJlc2VudAorIyBpbiB0aGUgVUNELiAgVW5saWtlIFByb3BlcnR5VmFsdWVBbGlhc2VzLnR4dCwgaXQgc2hvdWxkCisjIE5PVCBjb250YWluIGEgdmVyc2lvbiBudW1iZXIuCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAgVEhJUyBGSUxFIElTIE1BQ0hJTkUtR0VORVJBVEVELCBET04nVCBQTEFZIFdJVEggSVQgSUYgWU9VIERPTidUIEtOT1cKKyMgIFdIQVQgWU9VIEFSRSBET0lORywgT1RIRVJXSVNFIFZFUlkgQkFEIFRISU5HUyBXSUxMIEhBUFBFTiEKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIHNldCB0aGUgc2FtZSBuYW1lcyBhcyBzaG9ydCBhbmQgbG9uZyBuYW1lcyB0byBmaXQgdGhlIHN5bnRheCB3aXRob3V0IAorIyBpbnZlbnRpbmcgbmFtZXMgdGhhdCB3ZSB3b3VsZCBoYXZlIHRvIHN1cHBvcnQgZm9yZXZlcgorCisjIFNjcmlwdCAoc2MpCisKK3NjIDsgQmxpcyA7IEJsaXMgCitzYyA7IENpcnQgOyBDaXJ0IAorc2MgOyBDeXJzIDsgQ3lycyAKK3NjIDsgRWd5ZCA7IEVneWQgCitzYyA7IEVneWggOyBFZ3loIAorc2MgOyBHZW9rIDsgR2VvayAKK3NjIDsgSGFucyA7IEhhbnMgCitzYyA7IEhhbnQgOyBIYW50IAorc2MgOyBIbW5nIDsgSG1uZyAKK3NjIDsgSHVuZyA7IEh1bmcgCitzYyA7IEluZHMgOyBJbmRzIAorc2MgOyBKcGFuIDsgSnBhbiAKK3NjIDsgTGF0ZiA7IExhdGYgCitzYyA7IExhdGcgOyBMYXRnIAorc2MgOyBMaW5hIDsgTGluYSAKK3NjIDsgTWF5YSA7IE1heWEgCitzYyA7IE1lcm8gOyBNZXJvIAorc2MgOyBNb29uIDsgTW9vbiAKK3NjIDsgUGVybSA7IFBlcm0gCitzYyA7IFBscmQgOyBQbHJkIAorc2MgOyBSb3JvIDsgUm9ybyAKK3NjIDsgU2FyYSA7IFNhcmEgCitzYyA7IFNnbncgOyBTZ253CitzYyA7IFN5cmUgOyBTeXJlIAorc2MgOyBTeXJqIDsgU3lyaiAKK3NjIDsgU3lybiA7IFN5cm4gCitzYyA7IFRlbmcgOyBUZW5nIAorc2MgOyBWaXNwIDsgVmlzcCAKK3NjIDsgWnh4eCA7IFp4eHggCisKK3NjIDsgQ2FrbSA7IENha20KK3NjIDsgS29yZSA7IEtvcmUKK3NjIDsgTWFuaSA7IE1hbmkKK3NjIDsgUGhscCA7IFBobHAKK3NjIDsgUGhsdiA7IFBobHYKK3NjIDsgWm10aCA7IFptdGgKK3NjIDsgWnN5bSA7IFpzeW0KKworc2MgOyBOa2diIDsgTmtnYgorCitzYyA7IEJhc3MgOyBCYXNzCitzYyA7IER1cGwgOyBEdXBsCitzYyA7IEVsYmEgOyBFbGJhCitzYyA7IEdyYW4gOyBHcmFuCitzYyA7IEtwZWwgOyBLcGVsCitzYyA7IExvbWEgOyBMb21hCitzYyA7IE1lbmQgOyBNZW5kCitzYyA7IE1lcmMgOyBNZXJjCitzYyA7IE5hcmIgOyBOYXJiCitzYyA7IE5iYXQgOyBOYmF0CitzYyA7IFBhbG0gOyBQYWxtCitzYyA7IFNpbmQgOyBTaW5kCitzYyA7IFdhcmEgOyBXYXJhCisKK3NjIDsgQWZhayA7IEFmYWsKK3NjIDsgSnVyYyA7IEp1cmMKK3NjIDsgTXJvbyA7IE1yb28KK3NjIDsgTnNodSA7IE5zaHUKK3NjIDsgU2hyZCA7IFNocmQKK3NjIDsgU29yYSA7IFNvcmEKK3NjIDsgVGFrciA7IFRha3IKK3NjIDsgVGFuZyA7IFRhbmcKK3NjIDsgV29sZSA7IFdvbGUKZGlmZiAtLWdpdCBhL3VuaWNvZGUvYy9nZW5wbmFtZS9kYXRhLmggYi91bmljb2RlL2MvZ2VucG5hbWUvZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyYTBlNTAKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RlL2MvZ2VucG5hbWUvZGF0YS5oCkBAIC0wLDAgKzEsMjYwNyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAxMSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQKKyAqIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBNQUNISU5FIEdFTkVSQVRFRCBGSUxFLiAgISEhIERvIG5vdCBlZGl0IG1hbnVhbGx5ICEhIQorICoKKyAqIEdlbmVyYXRlZCBmcm9tCisgKiAgIHVjaGFyLmgKKyAqICAgdXNjcmlwdC5oCisgKiAgIEJsb2Nrcy50eHQKKyAqICAgUHJvcGVydHlBbGlhc2VzLnR4dAorICogICBQcm9wZXJ0eVZhbHVlQWxpYXNlcy50eHQKKyAqCisgKiBEYXRlOiBUdWUgTWF5IDEwIDEzOjIwOjIxIDIwMTEKKyAqIFVuaWNvZGUgdmVyc2lvbjogNi4wLjAKKyAqIFNjcmlwdDogcHJlcGFyc2UucGwKKyAqLworCisvKiBVbmljb2RlIHZlcnNpb24gNi4wLjAgKi8KK2NvbnN0IHVpbnQ4X3QgVkVSU0lPTl8wID0gNjsKK2NvbnN0IHVpbnQ4X3QgVkVSU0lPTl8xID0gMDsKK2NvbnN0IHVpbnQ4X3QgVkVSU0lPTl8yID0gMDsKK2NvbnN0IHVpbnQ4X3QgVkVSU0lPTl8zID0gMDsKKworY29uc3QgaW50MzJfdCBTVFJJTkdfQ09VTlQgPSA5NDc7CisKKy8qIHRvIGJlIHNvcnRlZCAqLworY29uc3QgQWxpYXNOYW1lIFNUUklOR19UQUJMRVtdID0geworICAgIEFsaWFzTmFtZSgiIiwgMCksCisgICAgQWxpYXNOYW1lKCJBIiwgMSksCisgICAgQWxpYXNOYW1lKCJBSGV4IiwgMiksCisgICAgQWxpYXNOYW1lKCJBSSIsIDMpLAorICAgIEFsaWFzTmFtZSgiQUwiLCA0KSwKKyAgICBBbGlhc05hbWUoIkFMZXR0ZXIiLCA1KSwKKyAgICBBbGlhc05hbWUoIkFOIiwgNiksCisgICAgQWxpYXNOYW1lKCJBUiIsIDcpLAorICAgIEFsaWFzTmFtZSgiQVNDSUkiLCA4KSwKKyAgICBBbGlhc05hbWUoIkFTQ0lJX0hleF9EaWdpdCIsIDkpLAorICAgIEFsaWFzTmFtZSgiQVQiLCAxMCksCisgICAgQWxpYXNOYW1lKCJBVEEiLCAxMSksCisgICAgQWxpYXNOYW1lKCJBVEFSIiwgMTIpLAorICAgIEFsaWFzTmFtZSgiQVRCIiwgMTMpLAorICAgIEFsaWFzTmFtZSgiQVRCTCIsIDE0KSwKKyAgICBBbGlhc05hbWUoIkFUZXJtIiwgMTUpLAorICAgIEFsaWFzTmFtZSgiQWJvdmUiLCAxNiksCisgICAgQWxpYXNOYW1lKCJBYm92ZV9MZWZ0IiwgMTcpLAorICAgIEFsaWFzTmFtZSgiQWJvdmVfUmlnaHQiLCAxOCksCisgICAgQWxpYXNOYW1lKCJBZWdlYW5fTnVtYmVycyIsIDE5KSwKKyAgICBBbGlhc05hbWUoIkFmYWsiLCAyMCksCisgICAgQWxpYXNOYW1lKCJBZ2UiLCAyMSksCisgICAgQWxpYXNOYW1lKCJBaW4iLCAyMiksCisgICAgQWxpYXNOYW1lKCJBbGFwaCIsIDIzKSwKKyAgICBBbGlhc05hbWUoIkFsY2hlbWljYWxfU3ltYm9scyIsIDI0KSwKKyAgICBBbGlhc05hbWUoIkFsZWYiLCAyNSksCisgICAgQWxpYXNOYW1lKCJBbHBoYSIsIDI2KSwKKyAgICBBbGlhc05hbWUoIkFscGhhYmV0aWMiLCAyNyksCisgICAgQWxpYXNOYW1lKCJBbHBoYWJldGljX1ByZXNlbnRhdGlvbl9Gb3JtcyIsIDI4KSwKKyAgICBBbGlhc05hbWUoIkFtYmlndW91cyIsIDI5KSwKKyAgICBBbGlhc05hbWUoIkFuY2llbnRfR3JlZWtfTXVzaWNhbF9Ob3RhdGlvbiIsIDMwKSwKKyAgICBBbGlhc05hbWUoIkFuY2llbnRfR3JlZWtfTnVtYmVycyIsIDMxKSwKKyAgICBBbGlhc05hbWUoIkFuY2llbnRfU3ltYm9scyIsIDMyKSwKKyAgICBBbGlhc05hbWUoIkFyYWIiLCAzMyksCisgICAgQWxpYXNOYW1lKCJBcmFiaWMiLCAzNCksCisgICAgQWxpYXNOYW1lKCJBcmFiaWNfTGV0dGVyIiwgMzUpLAorICAgIEFsaWFzTmFtZSgiQXJhYmljX051bWJlciIsIDM2KSwKKyAgICBBbGlhc05hbWUoIkFyYWJpY19QcmVzZW50YXRpb25fRm9ybXMtQSIsIDM3KSwKKyAgICBBbGlhc05hbWUoIkFyYWJpY19QcmVzZW50YXRpb25fRm9ybXNfQSIsIDM4KSwKKyAgICBBbGlhc05hbWUoIkFyYWJpY19QcmVzZW50YXRpb25fRm9ybXNfQiIsIDM5KSwKKyAgICBBbGlhc05hbWUoIkFyYWJpY19TdXBwbGVtZW50IiwgNDApLAorICAgIEFsaWFzTmFtZSgiQXJtZW5pYW4iLCA0MSksCisgICAgQWxpYXNOYW1lKCJBcm1pIiwgNDIpLAorICAgIEFsaWFzTmFtZSgiQXJtbiIsIDQzKSwKKyAgICBBbGlhc05hbWUoIkFycm93cyIsIDQ0KSwKKyAgICBBbGlhc05hbWUoIkF0dGFjaGVkX0Fib3ZlIiwgNDUpLAorICAgIEFsaWFzTmFtZSgiQXR0YWNoZWRfQWJvdmVfUmlnaHQiLCA0NiksCisgICAgQWxpYXNOYW1lKCJBdHRhY2hlZF9CZWxvdyIsIDQ3KSwKKyAgICBBbGlhc05hbWUoIkF0dGFjaGVkX0JlbG93X0xlZnQiLCA0OCksCisgICAgQWxpYXNOYW1lKCJBdmVzdGFuIiwgNDkpLAorICAgIEFsaWFzTmFtZSgiQXZzdCIsIDUwKSwKKyAgICBBbGlhc05hbWUoIkIiLCA1MSksCisgICAgQWxpYXNOYW1lKCJCMiIsIDUyKSwKKyAgICBBbGlhc05hbWUoIkJBIiwgNTMpLAorICAgIEFsaWFzTmFtZSgiQkIiLCA1NCksCisgICAgQWxpYXNOYW1lKCJCSyIsIDU1KSwKKyAgICBBbGlhc05hbWUoIkJMIiwgNTYpLAorICAgIEFsaWFzTmFtZSgiQk4iLCA1NyksCisgICAgQWxpYXNOYW1lKCJCUiIsIDU4KSwKKyAgICBBbGlhc05hbWUoIkJhbGkiLCA1OSksCisgICAgQWxpYXNOYW1lKCJCYWxpbmVzZSIsIDYwKSwKKyAgICBBbGlhc05hbWUoIkJhbXUiLCA2MSksCisgICAgQWxpYXNOYW1lKCJCYW11bSIsIDYyKSwKKyAgICBBbGlhc05hbWUoIkJhbXVtX1N1cHBsZW1lbnQiLCA2MyksCisgICAgQWxpYXNOYW1lKCJCYXNpY19MYXRpbiIsIDY0KSwKKyAgICBBbGlhc05hbWUoIkJhc3MiLCA2NSksCisgICAgQWxpYXNOYW1lKCJCYXRhayIsIDY2KSwKKyAgICBBbGlhc05hbWUoIkJhdGsiLCA2NyksCisgICAgQWxpYXNOYW1lKCJCZWgiLCA2OCksCisgICAgQWxpYXNOYW1lKCJCZWxvdyIsIDY5KSwKKyAgICBBbGlhc05hbWUoIkJlbG93X0xlZnQiLCA3MCksCisgICAgQWxpYXNOYW1lKCJCZWxvd19SaWdodCIsIDcxKSwKKyAgICBBbGlhc05hbWUoIkJlbmciLCA3MiksCisgICAgQWxpYXNOYW1lKCJCZW5nYWxpIiwgNzMpLAorICAgIEFsaWFzTmFtZSgiQmV0aCIsIDc0KSwKKyAgICBBbGlhc05hbWUoIkJpZGlfQyIsIDc1KSwKKyAgICBBbGlhc05hbWUoIkJpZGlfQ2xhc3MiLCA3NiksCisgICAgQWxpYXNOYW1lKCJCaWRpX0NvbnRyb2wiLCA3NyksCisgICAgQWxpYXNOYW1lKCJCaWRpX00iLCA3OCksCisgICAgQWxpYXNOYW1lKCJCaWRpX01pcnJvcmVkIiwgNzkpLAorICAgIEFsaWFzTmFtZSgiQmlkaV9NaXJyb3JpbmdfR2x5cGgiLCA4MCksCisgICAgQWxpYXNOYW1lKCJCbGlzIiwgODEpLAorICAgIEFsaWFzTmFtZSgiQmxvY2siLCA4MiksCisgICAgQWxpYXNOYW1lKCJCbG9ja19FbGVtZW50cyIsIDgzKSwKKyAgICBBbGlhc05hbWUoIkJvcG8iLCA4NCksCisgICAgQWxpYXNOYW1lKCJCb3BvbW9mbyIsIDg1KSwKKyAgICBBbGlhc05hbWUoIkJvcG9tb2ZvX0V4dGVuZGVkIiwgODYpLAorICAgIEFsaWFzTmFtZSgiQm91bmRhcnlfTmV1dHJhbCIsIDg3KSwKKyAgICBBbGlhc05hbWUoIkJveF9EcmF3aW5nIiwgODgpLAorICAgIEFsaWFzTmFtZSgiQnJhaCIsIDg5KSwKKyAgICBBbGlhc05hbWUoIkJyYWhtaSIsIDkwKSwKKyAgICBBbGlhc05hbWUoIkJyYWkiLCA5MSksCisgICAgQWxpYXNOYW1lKCJCcmFpbGxlIiwgOTIpLAorICAgIEFsaWFzTmFtZSgiQnJhaWxsZV9QYXR0ZXJucyIsIDkzKSwKKyAgICBBbGlhc05hbWUoIkJyZWFrX0FmdGVyIiwgOTQpLAorICAgIEFsaWFzTmFtZSgiQnJlYWtfQmVmb3JlIiwgOTUpLAorICAgIEFsaWFzTmFtZSgiQnJlYWtfQm90aCIsIDk2KSwKKyAgICBBbGlhc05hbWUoIkJyZWFrX1N5bWJvbHMiLCA5NyksCisgICAgQWxpYXNOYW1lKCJCdWdpIiwgOTgpLAorICAgIEFsaWFzTmFtZSgiQnVnaW5lc2UiLCA5OSksCisgICAgQWxpYXNOYW1lKCJCdWhkIiwgMTAwKSwKKyAgICBBbGlhc05hbWUoIkJ1aGlkIiwgMTAxKSwKKyAgICBBbGlhc05hbWUoIkJ1cnVzaGFza2lfWWVoX0JhcnJlZSIsIDEwMiksCisgICAgQWxpYXNOYW1lKCJCeXphbnRpbmVfTXVzaWNhbF9TeW1ib2xzIiwgMTAzKSwKKyAgICBBbGlhc05hbWUoIkMiLCAxMDQpLAorICAgIEFsaWFzTmFtZSgiQ0IiLCAxMDUpLAorICAgIEFsaWFzTmFtZSgiQ0kiLCAxMDYpLAorICAgIEFsaWFzTmFtZSgiQ0pLX0NvbXBhdGliaWxpdHkiLCAxMDcpLAorICAgIEFsaWFzTmFtZSgiQ0pLX0NvbXBhdGliaWxpdHlfRm9ybXMiLCAxMDgpLAorICAgIEFsaWFzTmFtZSgiQ0pLX0NvbXBhdGliaWxpdHlfSWRlb2dyYXBocyIsIDEwOSksCisgICAgQWxpYXNOYW1lKCJDSktfQ29tcGF0aWJpbGl0eV9JZGVvZ3JhcGhzX1N1cHBsZW1lbnQiLCAxMTApLAorICAgIEFsaWFzTmFtZSgiQ0pLX1JhZGljYWxzX1N1cHBsZW1lbnQiLCAxMTEpLAorICAgIEFsaWFzTmFtZSgiQ0pLX1N0cm9rZXMiLCAxMTIpLAorICAgIEFsaWFzTmFtZSgiQ0pLX1N5bWJvbHNfQW5kX1B1bmN0dWF0aW9uIiwgMTEzKSwKKyAgICBBbGlhc05hbWUoIkNKS19VbmlmaWVkX0lkZW9ncmFwaHMiLCAxMTQpLAorICAgIEFsaWFzTmFtZSgiQ0pLX1VuaWZpZWRfSWRlb2dyYXBoc19FeHRlbnNpb25fQSIsIDExNSksCisgICAgQWxpYXNOYW1lKCJDSktfVW5pZmllZF9JZGVvZ3JhcGhzX0V4dGVuc2lvbl9CIiwgMTE2KSwKKyAgICBBbGlhc05hbWUoIkNKS19VbmlmaWVkX0lkZW9ncmFwaHNfRXh0ZW5zaW9uX0MiLCAxMTcpLAorICAgIEFsaWFzTmFtZSgiQ0pLX1VuaWZpZWRfSWRlb2dyYXBoc19FeHRlbnNpb25fRCIsIDExOCksCisgICAgQWxpYXNOYW1lKCJDTCIsIDExOSksCisgICAgQWxpYXNOYW1lKCJDTSIsIDEyMCksCisgICAgQWxpYXNOYW1lKCJDTiIsIDEyMSksCisgICAgQWxpYXNOYW1lKCJDUCIsIDEyMiksCisgICAgQWxpYXNOYW1lKCJDUiIsIDEyMyksCisgICAgQWxpYXNOYW1lKCJDUyIsIDEyNCksCisgICAgQWxpYXNOYW1lKCJDV0NGIiwgMTI1KSwKKyAgICBBbGlhc05hbWUoIkNXQ00iLCAxMjYpLAorICAgIEFsaWFzTmFtZSgiQ1dLQ0YiLCAxMjcpLAorICAgIEFsaWFzTmFtZSgiQ1dMIiwgMTI4KSwKKyAgICBBbGlhc05hbWUoIkNXVCIsIDEyOSksCisgICAgQWxpYXNOYW1lKCJDV1UiLCAxMzApLAorICAgIEFsaWFzTmFtZSgiQ2FrbSIsIDEzMSksCisgICAgQWxpYXNOYW1lKCJDYW4iLCAxMzIpLAorICAgIEFsaWFzTmFtZSgiQ2FuYWRpYW5fQWJvcmlnaW5hbCIsIDEzMyksCisgICAgQWxpYXNOYW1lKCJDYW5hZGlhbl9TeWxsYWJpY3MiLCAxMzQpLAorICAgIEFsaWFzTmFtZSgiQ2Fub25pY2FsIiwgMTM1KSwKKyAgICBBbGlhc05hbWUoIkNhbm9uaWNhbF9Db21iaW5pbmdfQ2xhc3MiLCAxMzYpLAorICAgIEFsaWFzTmFtZSgiQ2FucyIsIDEzNyksCisgICAgQWxpYXNOYW1lKCJDYXJpIiwgMTM4KSwKKyAgICBBbGlhc05hbWUoIkNhcmlhbiIsIDEzOSksCisgICAgQWxpYXNOYW1lKCJDYXJyaWFnZV9SZXR1cm4iLCAxNDApLAorICAgIEFsaWFzTmFtZSgiQ2FzZV9Gb2xkaW5nIiwgMTQxKSwKKyAgICBBbGlhc05hbWUoIkNhc2VfSWdub3JhYmxlIiwgMTQyKSwKKyAgICBBbGlhc05hbWUoIkNhc2VfU2Vuc2l0aXZlIiwgMTQzKSwKKyAgICBBbGlhc05hbWUoIkNhc2VkIiwgMTQ0KSwKKyAgICBBbGlhc05hbWUoIkNhc2VkX0xldHRlciIsIDE0NSksCisgICAgQWxpYXNOYW1lKCJDYyIsIDE0NiksCisgICAgQWxpYXNOYW1lKCJDZiIsIDE0NyksCisgICAgQWxpYXNOYW1lKCJDaGFtIiwgMTQ4KSwKKyAgICBBbGlhc05hbWUoIkNoYW5nZXNfV2hlbl9DYXNlZm9sZGVkIiwgMTQ5KSwKKyAgICBBbGlhc05hbWUoIkNoYW5nZXNfV2hlbl9DYXNlbWFwcGVkIiwgMTUwKSwKKyAgICBBbGlhc05hbWUoIkNoYW5nZXNfV2hlbl9Mb3dlcmNhc2VkIiwgMTUxKSwKKyAgICBBbGlhc05hbWUoIkNoYW5nZXNfV2hlbl9ORktDX0Nhc2Vmb2xkZWQiLCAxNTIpLAorICAgIEFsaWFzTmFtZSgiQ2hhbmdlc19XaGVuX1RpdGxlY2FzZWQiLCAxNTMpLAorICAgIEFsaWFzTmFtZSgiQ2hhbmdlc19XaGVuX1VwcGVyY2FzZWQiLCAxNTQpLAorICAgIEFsaWFzTmFtZSgiQ2hlciIsIDE1NSksCisgICAgQWxpYXNOYW1lKCJDaGVyb2tlZSIsIDE1NiksCisgICAgQWxpYXNOYW1lKCJDaXJjbGUiLCAxNTcpLAorICAgIEFsaWFzTmFtZSgiQ2lydCIsIDE1OCksCisgICAgQWxpYXNOYW1lKCJDbG9zZSIsIDE1OSksCisgICAgQWxpYXNOYW1lKCJDbG9zZV9QYXJlbnRoZXNpcyIsIDE2MCksCisgICAgQWxpYXNOYW1lKCJDbG9zZV9QdW5jdHVhdGlvbiIsIDE2MSksCisgICAgQWxpYXNOYW1lKCJDbiIsIDE2MiksCisgICAgQWxpYXNOYW1lKCJDbyIsIDE2MyksCisgICAgQWxpYXNOYW1lKCJDb20iLCAxNjQpLAorICAgIEFsaWFzTmFtZSgiQ29tYmluaW5nX0RpYWNyaXRpY2FsX01hcmtzIiwgMTY1KSwKKyAgICBBbGlhc05hbWUoIkNvbWJpbmluZ19EaWFjcml0aWNhbF9NYXJrc19Gb3JfU3ltYm9scyIsIDE2NiksCisgICAgQWxpYXNOYW1lKCJDb21iaW5pbmdfRGlhY3JpdGljYWxfTWFya3NfU3VwcGxlbWVudCIsIDE2NyksCisgICAgQWxpYXNOYW1lKCJDb21iaW5pbmdfSGFsZl9NYXJrcyIsIDE2OCksCisgICAgQWxpYXNOYW1lKCJDb21iaW5pbmdfTWFyayIsIDE2OSksCisgICAgQWxpYXNOYW1lKCJDb21iaW5pbmdfTWFya3NfRm9yX1N5bWJvbHMiLCAxNzApLAorICAgIEFsaWFzTmFtZSgiQ29tbW9uIiwgMTcxKSwKKyAgICBBbGlhc05hbWUoIkNvbW1vbl9JbmRpY19OdW1iZXJfRm9ybXMiLCAxNzIpLAorICAgIEFsaWFzTmFtZSgiQ29tbW9uX1NlcGFyYXRvciIsIDE3MyksCisgICAgQWxpYXNOYW1lKCJDb21wX0V4IiwgMTc0KSwKKyAgICBBbGlhc05hbWUoIkNvbXBhdCIsIDE3NSksCisgICAgQWxpYXNOYW1lKCJDb21wbGV4X0NvbnRleHQiLCAxNzYpLAorICAgIEFsaWFzTmFtZSgiQ29ubmVjdG9yX1B1bmN0dWF0aW9uIiwgMTc3KSwKKyAgICBBbGlhc05hbWUoIkNvbnRpbmdlbnRfQnJlYWsiLCAxNzgpLAorICAgIEFsaWFzTmFtZSgiQ29udHJvbCIsIDE3OSksCisgICAgQWxpYXNOYW1lKCJDb250cm9sX1BpY3R1cmVzIiwgMTgwKSwKKyAgICBBbGlhc05hbWUoIkNvcHQiLCAxODEpLAorICAgIEFsaWFzTmFtZSgiQ29wdGljIiwgMTgyKSwKKyAgICBBbGlhc05hbWUoIkNvdW50aW5nX1JvZF9OdW1lcmFscyIsIDE4MyksCisgICAgQWxpYXNOYW1lKCJDcHJ0IiwgMTg0KSwKKyAgICBBbGlhc05hbWUoIkNzIiwgMTg1KSwKKyAgICBBbGlhc05hbWUoIkN1bmVpZm9ybSIsIDE4NiksCisgICAgQWxpYXNOYW1lKCJDdW5laWZvcm1fTnVtYmVyc19BbmRfUHVuY3R1YXRpb24iLCAxODcpLAorICAgIEFsaWFzTmFtZSgiQ3VycmVuY3lfU3ltYm9sIiwgMTg4KSwKKyAgICBBbGlhc05hbWUoIkN1cnJlbmN5X1N5bWJvbHMiLCAxODkpLAorICAgIEFsaWFzTmFtZSgiQ3lwcmlvdCIsIDE5MCksCisgICAgQWxpYXNOYW1lKCJDeXByaW90X1N5bGxhYmFyeSIsIDE5MSksCisgICAgQWxpYXNOYW1lKCJDeXJpbGxpYyIsIDE5MiksCisgICAgQWxpYXNOYW1lKCJDeXJpbGxpY19FeHRlbmRlZF9BIiwgMTkzKSwKKyAgICBBbGlhc05hbWUoIkN5cmlsbGljX0V4dGVuZGVkX0IiLCAxOTQpLAorICAgIEFsaWFzTmFtZSgiQ3lyaWxsaWNfU3VwcGxlbWVudCIsIDE5NSksCisgICAgQWxpYXNOYW1lKCJDeXJpbGxpY19TdXBwbGVtZW50YXJ5IiwgMTk2KSwKKyAgICBBbGlhc05hbWUoIkN5cmwiLCAxOTcpLAorICAgIEFsaWFzTmFtZSgiQ3lycyIsIDE5OCksCisgICAgQWxpYXNOYW1lKCJEIiwgMTk5KSwKKyAgICBBbGlhc05hbWUoIkRBIiwgMjAwKSwKKyAgICBBbGlhc05hbWUoIkRCIiwgMjAxKSwKKyAgICBBbGlhc05hbWUoIkRJIiwgMjAyKSwKKyAgICBBbGlhc05hbWUoIkRhbCIsIDIwMyksCisgICAgQWxpYXNOYW1lKCJEYWxhdGhfUmlzaCIsIDIwNCksCisgICAgQWxpYXNOYW1lKCJEYXNoIiwgMjA1KSwKKyAgICBBbGlhc05hbWUoIkRhc2hfUHVuY3R1YXRpb24iLCAyMDYpLAorICAgIEFsaWFzTmFtZSgiRGUiLCAyMDcpLAorICAgIEFsaWFzTmFtZSgiRGVjaW1hbCIsIDIwOCksCisgICAgQWxpYXNOYW1lKCJEZWNpbWFsX051bWJlciIsIDIwOSksCisgICAgQWxpYXNOYW1lKCJEZWNvbXBvc2l0aW9uX1R5cGUiLCAyMTApLAorICAgIEFsaWFzTmFtZSgiRGVmYXVsdF9JZ25vcmFibGVfQ29kZV9Qb2ludCIsIDIxMSksCisgICAgQWxpYXNOYW1lKCJEZXAiLCAyMTIpLAorICAgIEFsaWFzTmFtZSgiRGVwcmVjYXRlZCIsIDIxMyksCisgICAgQWxpYXNOYW1lKCJEZXNlcmV0IiwgMjE0KSwKKyAgICBBbGlhc05hbWUoIkRldmEiLCAyMTUpLAorICAgIEFsaWFzTmFtZSgiRGV2YW5hZ2FyaSIsIDIxNiksCisgICAgQWxpYXNOYW1lKCJEZXZhbmFnYXJpX0V4dGVuZGVkIiwgMjE3KSwKKyAgICBBbGlhc05hbWUoIkRpIiwgMjE4KSwKKyAgICBBbGlhc05hbWUoIkRpYSIsIDIxOSksCisgICAgQWxpYXNOYW1lKCJEaWFjcml0aWMiLCAyMjApLAorICAgIEFsaWFzTmFtZSgiRGlnaXQiLCAyMjEpLAorICAgIEFsaWFzTmFtZSgiRGluZ2JhdHMiLCAyMjIpLAorICAgIEFsaWFzTmFtZSgiRG9taW5vX1RpbGVzIiwgMjIzKSwKKyAgICBBbGlhc05hbWUoIkRvdWJsZV9BYm92ZSIsIDIyNCksCisgICAgQWxpYXNOYW1lKCJEb3VibGVfQmVsb3ciLCAyMjUpLAorICAgIEFsaWFzTmFtZSgiRHNydCIsIDIyNiksCisgICAgQWxpYXNOYW1lKCJEdWFsX0pvaW5pbmciLCAyMjcpLAorICAgIEFsaWFzTmFtZSgiRHVwbCIsIDIyOCksCisgICAgQWxpYXNOYW1lKCJFIiwgMjI5KSwKKyAgICBBbGlhc05hbWUoIkVOIiwgMjMwKSwKKyAgICBBbGlhc05hbWUoIkVTIiwgMjMxKSwKKyAgICBBbGlhc05hbWUoIkVUIiwgMjMyKSwKKyAgICBBbGlhc05hbWUoIkVYIiwgMjMzKSwKKyAgICBBbGlhc05hbWUoIkVhc3RfQXNpYW5fV2lkdGgiLCAyMzQpLAorICAgIEFsaWFzTmFtZSgiRWd5ZCIsIDIzNSksCisgICAgQWxpYXNOYW1lKCJFZ3loIiwgMjM2KSwKKyAgICBBbGlhc05hbWUoIkVneXAiLCAyMzcpLAorICAgIEFsaWFzTmFtZSgiRWd5cHRpYW5fSGllcm9nbHlwaHMiLCAyMzgpLAorICAgIEFsaWFzTmFtZSgiRWxiYSIsIDIzOSksCisgICAgQWxpYXNOYW1lKCJFbW90aWNvbnMiLCAyNDApLAorICAgIEFsaWFzTmFtZSgiRW5jIiwgMjQxKSwKKyAgICBBbGlhc05hbWUoIkVuY2xvc2VkX0FscGhhbnVtZXJpY19TdXBwbGVtZW50IiwgMjQyKSwKKyAgICBBbGlhc05hbWUoIkVuY2xvc2VkX0FscGhhbnVtZXJpY3MiLCAyNDMpLAorICAgIEFsaWFzTmFtZSgiRW5jbG9zZWRfQ0pLX0xldHRlcnNfQW5kX01vbnRocyIsIDI0NCksCisgICAgQWxpYXNOYW1lKCJFbmNsb3NlZF9JZGVvZ3JhcGhpY19TdXBwbGVtZW50IiwgMjQ1KSwKKyAgICBBbGlhc05hbWUoIkVuY2xvc2luZ19NYXJrIiwgMjQ2KSwKKyAgICBBbGlhc05hbWUoIkV0aGkiLCAyNDcpLAorICAgIEFsaWFzTmFtZSgiRXRoaW9waWMiLCAyNDgpLAorICAgIEFsaWFzTmFtZSgiRXRoaW9waWNfRXh0ZW5kZWQiLCAyNDkpLAorICAgIEFsaWFzTmFtZSgiRXRoaW9waWNfRXh0ZW5kZWRfQSIsIDI1MCksCisgICAgQWxpYXNOYW1lKCJFdGhpb3BpY19TdXBwbGVtZW50IiwgMjUxKSwKKyAgICBBbGlhc05hbWUoIkV1cm9wZWFuX051bWJlciIsIDI1MiksCisgICAgQWxpYXNOYW1lKCJFdXJvcGVhbl9TZXBhcmF0b3IiLCAyNTMpLAorICAgIEFsaWFzTmFtZSgiRXVyb3BlYW5fVGVybWluYXRvciIsIDI1NCksCisgICAgQWxpYXNOYW1lKCJFeGNsYW1hdGlvbiIsIDI1NSksCisgICAgQWxpYXNOYW1lKCJFeHQiLCAyNTYpLAorICAgIEFsaWFzTmFtZSgiRXh0ZW5kIiwgMjU3KSwKKyAgICBBbGlhc05hbWUoIkV4dGVuZE51bUxldCIsIDI1OCksCisgICAgQWxpYXNOYW1lKCJFeHRlbmRlciIsIDI1OSksCisgICAgQWxpYXNOYW1lKCJGIiwgMjYwKSwKKyAgICBBbGlhc05hbWUoIkZPIiwgMjYxKSwKKyAgICBBbGlhc05hbWUoIkZhbHNlIiwgMjYyKSwKKyAgICBBbGlhc05hbWUoIkZhcnNpX1llaCIsIDI2MyksCisgICAgQWxpYXNOYW1lKCJGZSIsIDI2NCksCisgICAgQWxpYXNOYW1lKCJGZWgiLCAyNjUpLAorICAgIEFsaWFzTmFtZSgiRmluIiwgMjY2KSwKKyAgICBBbGlhc05hbWUoIkZpbmFsIiwgMjY3KSwKKyAgICBBbGlhc05hbWUoIkZpbmFsX1B1bmN0dWF0aW9uIiwgMjY4KSwKKyAgICBBbGlhc05hbWUoIkZpbmFsX1NlbWthdGgiLCAyNjkpLAorICAgIEFsaWFzTmFtZSgiRm9udCIsIDI3MCksCisgICAgQWxpYXNOYW1lKCJGb3JtYXQiLCAyNzEpLAorICAgIEFsaWFzTmFtZSgiRnJhIiwgMjcyKSwKKyAgICBBbGlhc05hbWUoIkZyYWN0aW9uIiwgMjczKSwKKyAgICBBbGlhc05hbWUoIkZ1bGxfQ29tcG9zaXRpb25fRXhjbHVzaW9uIiwgMjc0KSwKKyAgICBBbGlhc05hbWUoIkZ1bGx3aWR0aCIsIDI3NSksCisgICAgQWxpYXNOYW1lKCJHQ0IiLCAyNzYpLAorICAgIEFsaWFzTmFtZSgiR0wiLCAyNzcpLAorICAgIEFsaWFzTmFtZSgiR2FmIiwgMjc4KSwKKyAgICBBbGlhc05hbWUoIkdhbWFsIiwgMjc5KSwKKyAgICBBbGlhc05hbWUoIkdlbmVyYWxfQ2F0ZWdvcnkiLCAyODApLAorICAgIEFsaWFzTmFtZSgiR2VuZXJhbF9DYXRlZ29yeV9NYXNrIiwgMjgxKSwKKyAgICBBbGlhc05hbWUoIkdlbmVyYWxfUHVuY3R1YXRpb24iLCAyODIpLAorICAgIEFsaWFzTmFtZSgiR2VvayIsIDI4MyksCisgICAgQWxpYXNOYW1lKCJHZW9tZXRyaWNfU2hhcGVzIiwgMjg0KSwKKyAgICBBbGlhc05hbWUoIkdlb3IiLCAyODUpLAorICAgIEFsaWFzTmFtZSgiR2VvcmdpYW4iLCAyODYpLAorICAgIEFsaWFzTmFtZSgiR2VvcmdpYW5fU3VwcGxlbWVudCIsIDI4NyksCisgICAgQWxpYXNOYW1lKCJHbGFnIiwgMjg4KSwKKyAgICBBbGlhc05hbWUoIkdsYWdvbGl0aWMiLCAyODkpLAorICAgIEFsaWFzTmFtZSgiR2x1ZSIsIDI5MCksCisgICAgQWxpYXNOYW1lKCJHb3RoIiwgMjkxKSwKKyAgICBBbGlhc05hbWUoIkdvdGhpYyIsIDI5MiksCisgICAgQWxpYXNOYW1lKCJHcl9CYXNlIiwgMjkzKSwKKyAgICBBbGlhc05hbWUoIkdyX0V4dCIsIDI5NCksCisgICAgQWxpYXNOYW1lKCJHcl9MaW5rIiwgMjk1KSwKKyAgICBBbGlhc05hbWUoIkdyYW4iLCAyOTYpLAorICAgIEFsaWFzTmFtZSgiR3JhcGhlbWVfQmFzZSIsIDI5NyksCisgICAgQWxpYXNOYW1lKCJHcmFwaGVtZV9DbHVzdGVyX0JyZWFrIiwgMjk4KSwKKyAgICBBbGlhc05hbWUoIkdyYXBoZW1lX0V4dGVuZCIsIDI5OSksCisgICAgQWxpYXNOYW1lKCJHcmFwaGVtZV9MaW5rIiwgMzAwKSwKKyAgICBBbGlhc05hbWUoIkdyZWVrIiwgMzAxKSwKKyAgICBBbGlhc05hbWUoIkdyZWVrX0FuZF9Db3B0aWMiLCAzMDIpLAorICAgIEFsaWFzTmFtZSgiR3JlZWtfRXh0ZW5kZWQiLCAzMDMpLAorICAgIEFsaWFzTmFtZSgiR3JlayIsIDMwNCksCisgICAgQWxpYXNOYW1lKCJHdWphcmF0aSIsIDMwNSksCisgICAgQWxpYXNOYW1lKCJHdWpyIiwgMzA2KSwKKyAgICBBbGlhc05hbWUoIkd1cm11a2hpIiwgMzA3KSwKKyAgICBBbGlhc05hbWUoIkd1cnUiLCAzMDgpLAorICAgIEFsaWFzTmFtZSgiSCIsIDMwOSksCisgICAgQWxpYXNOYW1lKCJIMiIsIDMxMCksCisgICAgQWxpYXNOYW1lKCJIMyIsIDMxMSksCisgICAgQWxpYXNOYW1lKCJIWSIsIDMxMiksCisgICAgQWxpYXNOYW1lKCJIYWgiLCAzMTMpLAorICAgIEFsaWFzTmFtZSgiSGFsZndpZHRoIiwgMzE0KSwKKyAgICBBbGlhc05hbWUoIkhhbGZ3aWR0aF9BbmRfRnVsbHdpZHRoX0Zvcm1zIiwgMzE1KSwKKyAgICBBbGlhc05hbWUoIkhhbXphX09uX0hlaF9Hb2FsIiwgMzE2KSwKKyAgICBBbGlhc05hbWUoIkhhbiIsIDMxNyksCisgICAgQWxpYXNOYW1lKCJIYW5nIiwgMzE4KSwKKyAgICBBbGlhc05hbWUoIkhhbmd1bCIsIDMxOSksCisgICAgQWxpYXNOYW1lKCJIYW5ndWxfQ29tcGF0aWJpbGl0eV9KYW1vIiwgMzIwKSwKKyAgICBBbGlhc05hbWUoIkhhbmd1bF9KYW1vIiwgMzIxKSwKKyAgICBBbGlhc05hbWUoIkhhbmd1bF9KYW1vX0V4dGVuZGVkX0EiLCAzMjIpLAorICAgIEFsaWFzTmFtZSgiSGFuZ3VsX0phbW9fRXh0ZW5kZWRfQiIsIDMyMyksCisgICAgQWxpYXNOYW1lKCJIYW5ndWxfU3lsbGFibGVfVHlwZSIsIDMyNCksCisgICAgQWxpYXNOYW1lKCJIYW5ndWxfU3lsbGFibGVzIiwgMzI1KSwKKyAgICBBbGlhc05hbWUoIkhhbmkiLCAzMjYpLAorICAgIEFsaWFzTmFtZSgiSGFubyIsIDMyNyksCisgICAgQWxpYXNOYW1lKCJIYW5zIiwgMzI4KSwKKyAgICBBbGlhc05hbWUoIkhhbnQiLCAzMjkpLAorICAgIEFsaWFzTmFtZSgiSGFudW5vbyIsIDMzMCksCisgICAgQWxpYXNOYW1lKCJIZSIsIDMzMSksCisgICAgQWxpYXNOYW1lKCJIZWJyIiwgMzMyKSwKKyAgICBBbGlhc05hbWUoIkhlYnJldyIsIDMzMyksCisgICAgQWxpYXNOYW1lKCJIZWgiLCAzMzQpLAorICAgIEFsaWFzTmFtZSgiSGVoX0dvYWwiLCAzMzUpLAorICAgIEFsaWFzTmFtZSgiSGV0aCIsIDMzNiksCisgICAgQWxpYXNOYW1lKCJIZXgiLCAzMzcpLAorICAgIEFsaWFzTmFtZSgiSGV4X0RpZ2l0IiwgMzM4KSwKKyAgICBBbGlhc05hbWUoIkhpZ2hfUHJpdmF0ZV9Vc2VfU3Vycm9nYXRlcyIsIDMzOSksCisgICAgQWxpYXNOYW1lKCJIaWdoX1N1cnJvZ2F0ZXMiLCAzNDApLAorICAgIEFsaWFzTmFtZSgiSGlyYSIsIDM0MSksCisgICAgQWxpYXNOYW1lKCJIaXJhZ2FuYSIsIDM0MiksCisgICAgQWxpYXNOYW1lKCJIbW5nIiwgMzQzKSwKKyAgICBBbGlhc05hbWUoIkhya3QiLCAzNDQpLAorICAgIEFsaWFzTmFtZSgiSHVuZyIsIDM0NSksCisgICAgQWxpYXNOYW1lKCJIeXBoZW4iLCAzNDYpLAorICAgIEFsaWFzTmFtZSgiSUQiLCAzNDcpLAorICAgIEFsaWFzTmFtZSgiSURDIiwgMzQ4KSwKKyAgICBBbGlhc05hbWUoIklEUyIsIDM0OSksCisgICAgQWxpYXNOYW1lKCJJRFNCIiwgMzUwKSwKKyAgICBBbGlhc05hbWUoIklEU1QiLCAzNTEpLAorICAgIEFsaWFzTmFtZSgiSURTX0JpbmFyeV9PcGVyYXRvciIsIDM1MiksCisgICAgQWxpYXNOYW1lKCJJRFNfVHJpbmFyeV9PcGVyYXRvciIsIDM1MyksCisgICAgQWxpYXNOYW1lKCJJRF9Db250aW51ZSIsIDM1NCksCisgICAgQWxpYXNOYW1lKCJJRF9TdGFydCIsIDM1NSksCisgICAgQWxpYXNOYW1lKCJJTiIsIDM1NiksCisgICAgQWxpYXNOYW1lKCJJUEFfRXh0ZW5zaW9ucyIsIDM1NyksCisgICAgQWxpYXNOYW1lKCJJUyIsIDM1OCksCisgICAgQWxpYXNOYW1lKCJJU09fQ29tbWVudCIsIDM1OSksCisgICAgQWxpYXNOYW1lKCJJZGVvIiwgMzYwKSwKKyAgICBBbGlhc05hbWUoIklkZW9ncmFwaGljIiwgMzYxKSwKKyAgICBBbGlhc05hbWUoIklkZW9ncmFwaGljX0Rlc2NyaXB0aW9uX0NoYXJhY3RlcnMiLCAzNjIpLAorICAgIEFsaWFzTmFtZSgiSW1wZXJpYWxfQXJhbWFpYyIsIDM2MyksCisgICAgQWxpYXNOYW1lKCJJbmRzIiwgMzY0KSwKKyAgICBBbGlhc05hbWUoIkluZml4X051bWVyaWMiLCAzNjUpLAorICAgIEFsaWFzTmFtZSgiSW5oZXJpdGVkIiwgMzY2KSwKKyAgICBBbGlhc05hbWUoIkluaXQiLCAzNjcpLAorICAgIEFsaWFzTmFtZSgiSW5pdGlhbCIsIDM2OCksCisgICAgQWxpYXNOYW1lKCJJbml0aWFsX1B1bmN0dWF0aW9uIiwgMzY5KSwKKyAgICBBbGlhc05hbWUoIkluc2NyaXB0aW9uYWxfUGFobGF2aSIsIDM3MCksCisgICAgQWxpYXNOYW1lKCJJbnNjcmlwdGlvbmFsX1BhcnRoaWFuIiwgMzcxKSwKKyAgICBBbGlhc05hbWUoIkluc2VwYXJhYmxlIiwgMzcyKSwKKyAgICBBbGlhc05hbWUoIkluc2VwZXJhYmxlIiwgMzczKSwKKyAgICBBbGlhc05hbWUoIklvdGFfU3Vic2NyaXB0IiwgMzc0KSwKKyAgICBBbGlhc05hbWUoIklzbyIsIDM3NSksCisgICAgQWxpYXNOYW1lKCJJc29sYXRlZCIsIDM3NiksCisgICAgQWxpYXNOYW1lKCJJdGFsIiwgMzc3KSwKKyAgICBBbGlhc05hbWUoIkpMIiwgMzc4KSwKKyAgICBBbGlhc05hbWUoIkpUIiwgMzc5KSwKKyAgICBBbGlhc05hbWUoIkpWIiwgMzgwKSwKKyAgICBBbGlhc05hbWUoIkphdmEiLCAzODEpLAorICAgIEFsaWFzTmFtZSgiSmF2YW5lc2UiLCAzODIpLAorICAgIEFsaWFzTmFtZSgiSm9pbl9DIiwgMzgzKSwKKyAgICBBbGlhc05hbWUoIkpvaW5fQ2F1c2luZyIsIDM4NCksCisgICAgQWxpYXNOYW1lKCJKb2luX0NvbnRyb2wiLCAzODUpLAorICAgIEFsaWFzTmFtZSgiSm9pbmluZ19Hcm91cCIsIDM4NiksCisgICAgQWxpYXNOYW1lKCJKb2luaW5nX1R5cGUiLCAzODcpLAorICAgIEFsaWFzTmFtZSgiSnBhbiIsIDM4OCksCisgICAgQWxpYXNOYW1lKCJKdXJjIiwgMzg5KSwKKyAgICBBbGlhc05hbWUoIktBIiwgMzkwKSwKKyAgICBBbGlhc05hbWUoIktWIiwgMzkxKSwKKyAgICBBbGlhc05hbWUoIkthZiIsIDM5MiksCisgICAgQWxpYXNOYW1lKCJLYWl0aGkiLCAzOTMpLAorICAgIEFsaWFzTmFtZSgiS2FsaSIsIDM5NCksCisgICAgQWxpYXNOYW1lKCJLYW5hIiwgMzk1KSwKKyAgICBBbGlhc05hbWUoIkthbmFfU3VwcGxlbWVudCIsIDM5NiksCisgICAgQWxpYXNOYW1lKCJLYW5hX1ZvaWNpbmciLCAzOTcpLAorICAgIEFsaWFzTmFtZSgiS2FuYnVuIiwgMzk4KSwKKyAgICBBbGlhc05hbWUoIkthbmd4aV9SYWRpY2FscyIsIDM5OSksCisgICAgQWxpYXNOYW1lKCJLYW5uYWRhIiwgNDAwKSwKKyAgICBBbGlhc05hbWUoIkthcGgiLCA0MDEpLAorICAgIEFsaWFzTmFtZSgiS2F0YWthbmEiLCA0MDIpLAorICAgIEFsaWFzTmFtZSgiS2F0YWthbmFfT3JfSGlyYWdhbmEiLCA0MDMpLAorICAgIEFsaWFzTmFtZSgiS2F0YWthbmFfUGhvbmV0aWNfRXh0ZW5zaW9ucyIsIDQwNCksCisgICAgQWxpYXNOYW1lKCJLYXlhaF9MaSIsIDQwNSksCisgICAgQWxpYXNOYW1lKCJLaGFwaCIsIDQwNiksCisgICAgQWxpYXNOYW1lKCJLaGFyIiwgNDA3KSwKKyAgICBBbGlhc05hbWUoIktoYXJvc2h0aGkiLCA0MDgpLAorICAgIEFsaWFzTmFtZSgiS2htZXIiLCA0MDkpLAorICAgIEFsaWFzTmFtZSgiS2htZXJfU3ltYm9scyIsIDQxMCksCisgICAgQWxpYXNOYW1lKCJLaG1yIiwgNDExKSwKKyAgICBBbGlhc05hbWUoIktuZGEiLCA0MTIpLAorICAgIEFsaWFzTmFtZSgiS25vdHRlZF9IZWgiLCA0MTMpLAorICAgIEFsaWFzTmFtZSgiS29yZSIsIDQxNCksCisgICAgQWxpYXNOYW1lKCJLcGVsIiwgNDE1KSwKKyAgICBBbGlhc05hbWUoIkt0aGkiLCA0MTYpLAorICAgIEFsaWFzTmFtZSgiTCIsIDQxNyksCisgICAgQWxpYXNOYW1lKCJMQyIsIDQxOCksCisgICAgQWxpYXNOYW1lKCJMRSIsIDQxOSksCisgICAgQWxpYXNOYW1lKCJMRiIsIDQyMCksCisgICAgQWxpYXNOYW1lKCJMTyIsIDQyMSksCisgICAgQWxpYXNOYW1lKCJMT0UiLCA0MjIpLAorICAgIEFsaWFzTmFtZSgiTFJFIiwgNDIzKSwKKyAgICBBbGlhc05hbWUoIkxSTyIsIDQyNCksCisgICAgQWxpYXNOYW1lKCJMViIsIDQyNSksCisgICAgQWxpYXNOYW1lKCJMVlQiLCA0MjYpLAorICAgIEFsaWFzTmFtZSgiTFZUX1N5bGxhYmxlIiwgNDI3KSwKKyAgICBBbGlhc05hbWUoIkxWX1N5bGxhYmxlIiwgNDI4KSwKKyAgICBBbGlhc05hbWUoIkxhbSIsIDQyOSksCisgICAgQWxpYXNOYW1lKCJMYW1hZGgiLCA0MzApLAorICAgIEFsaWFzTmFtZSgiTGFuYSIsIDQzMSksCisgICAgQWxpYXNOYW1lKCJMYW8iLCA0MzIpLAorICAgIEFsaWFzTmFtZSgiTGFvbyIsIDQzMyksCisgICAgQWxpYXNOYW1lKCJMYXRmIiwgNDM0KSwKKyAgICBBbGlhc05hbWUoIkxhdGciLCA0MzUpLAorICAgIEFsaWFzTmFtZSgiTGF0aW4iLCA0MzYpLAorICAgIEFsaWFzTmFtZSgiTGF0aW5fMSIsIDQzNyksCisgICAgQWxpYXNOYW1lKCJMYXRpbl8xX1N1cHBsZW1lbnQiLCA0MzgpLAorICAgIEFsaWFzTmFtZSgiTGF0aW5fRXh0ZW5kZWRfQSIsIDQzOSksCisgICAgQWxpYXNOYW1lKCJMYXRpbl9FeHRlbmRlZF9BZGRpdGlvbmFsIiwgNDQwKSwKKyAgICBBbGlhc05hbWUoIkxhdGluX0V4dGVuZGVkX0IiLCA0NDEpLAorICAgIEFsaWFzTmFtZSgiTGF0aW5fRXh0ZW5kZWRfQyIsIDQ0MiksCisgICAgQWxpYXNOYW1lKCJMYXRpbl9FeHRlbmRlZF9EIiwgNDQzKSwKKyAgICBBbGlhc05hbWUoIkxhdG4iLCA0NDQpLAorICAgIEFsaWFzTmFtZSgiTGVhZF9DYW5vbmljYWxfQ29tYmluaW5nX0NsYXNzIiwgNDQ1KSwKKyAgICBBbGlhc05hbWUoIkxlYWRpbmdfSmFtbyIsIDQ0NiksCisgICAgQWxpYXNOYW1lKCJMZWZ0IiwgNDQ3KSwKKyAgICBBbGlhc05hbWUoIkxlZnRfSm9pbmluZyIsIDQ0OCksCisgICAgQWxpYXNOYW1lKCJMZWZ0X1RvX1JpZ2h0IiwgNDQ5KSwKKyAgICBBbGlhc05hbWUoIkxlZnRfVG9fUmlnaHRfRW1iZWRkaW5nIiwgNDUwKSwKKyAgICBBbGlhc05hbWUoIkxlZnRfVG9fUmlnaHRfT3ZlcnJpZGUiLCA0NTEpLAorICAgIEFsaWFzTmFtZSgiTGVwYyIsIDQ1MiksCisgICAgQWxpYXNOYW1lKCJMZXBjaGEiLCA0NTMpLAorICAgIEFsaWFzTmFtZSgiTGV0dGVyIiwgNDU0KSwKKyAgICBBbGlhc05hbWUoIkxldHRlcl9OdW1iZXIiLCA0NTUpLAorICAgIEFsaWFzTmFtZSgiTGV0dGVybGlrZV9TeW1ib2xzIiwgNDU2KSwKKyAgICBBbGlhc05hbWUoIkxpbWIiLCA0NTcpLAorICAgIEFsaWFzTmFtZSgiTGltYnUiLCA0NTgpLAorICAgIEFsaWFzTmFtZSgiTGluYSIsIDQ1OSksCisgICAgQWxpYXNOYW1lKCJMaW5iIiwgNDYwKSwKKyAgICBBbGlhc05hbWUoIkxpbmVfQnJlYWsiLCA0NjEpLAorICAgIEFsaWFzTmFtZSgiTGluZV9GZWVkIiwgNDYyKSwKKyAgICBBbGlhc05hbWUoIkxpbmVfU2VwYXJhdG9yIiwgNDYzKSwKKyAgICBBbGlhc05hbWUoIkxpbmVhcl9CIiwgNDY0KSwKKyAgICBBbGlhc05hbWUoIkxpbmVhcl9CX0lkZW9ncmFtcyIsIDQ2NSksCisgICAgQWxpYXNOYW1lKCJMaW5lYXJfQl9TeWxsYWJhcnkiLCA0NjYpLAorICAgIEFsaWFzTmFtZSgiTGlzdSIsIDQ2NyksCisgICAgQWxpYXNOYW1lKCJMbCIsIDQ2OCksCisgICAgQWxpYXNOYW1lKCJMbSIsIDQ2OSksCisgICAgQWxpYXNOYW1lKCJMbyIsIDQ3MCksCisgICAgQWxpYXNOYW1lKCJMb2dpY2FsX09yZGVyX0V4Y2VwdGlvbiIsIDQ3MSksCisgICAgQWxpYXNOYW1lKCJMb21hIiwgNDcyKSwKKyAgICBBbGlhc05hbWUoIkxvd19TdXJyb2dhdGVzIiwgNDczKSwKKyAgICBBbGlhc05hbWUoIkxvd2VyIiwgNDc0KSwKKyAgICBBbGlhc05hbWUoIkxvd2VyY2FzZSIsIDQ3NSksCisgICAgQWxpYXNOYW1lKCJMb3dlcmNhc2VfTGV0dGVyIiwgNDc2KSwKKyAgICBBbGlhc05hbWUoIkxvd2VyY2FzZV9NYXBwaW5nIiwgNDc3KSwKKyAgICBBbGlhc05hbWUoIkx0IiwgNDc4KSwKKyAgICBBbGlhc05hbWUoIkx1IiwgNDc5KSwKKyAgICBBbGlhc05hbWUoIkx5Y2kiLCA0ODApLAorICAgIEFsaWFzTmFtZSgiTHljaWFuIiwgNDgxKSwKKyAgICBBbGlhc05hbWUoIkx5ZGkiLCA0ODIpLAorICAgIEFsaWFzTmFtZSgiTHlkaWFuIiwgNDgzKSwKKyAgICBBbGlhc05hbWUoIk0iLCA0ODQpLAorICAgIEFsaWFzTmFtZSgiTUIiLCA0ODUpLAorICAgIEFsaWFzTmFtZSgiTUwiLCA0ODYpLAorICAgIEFsaWFzTmFtZSgiTU4iLCA0ODcpLAorICAgIEFsaWFzTmFtZSgiTWFoam9uZ19UaWxlcyIsIDQ4OCksCisgICAgQWxpYXNOYW1lKCJNYWxheWFsYW0iLCA0ODkpLAorICAgIEFsaWFzTmFtZSgiTWFuZCIsIDQ5MCksCisgICAgQWxpYXNOYW1lKCJNYW5kYWljIiwgNDkxKSwKKyAgICBBbGlhc05hbWUoIk1hbmRhdG9yeV9CcmVhayIsIDQ5MiksCisgICAgQWxpYXNOYW1lKCJNYW5pIiwgNDkzKSwKKyAgICBBbGlhc05hbWUoIk1hcmsiLCA0OTQpLAorICAgIEFsaWFzTmFtZSgiTWF0aCIsIDQ5NSksCisgICAgQWxpYXNOYW1lKCJNYXRoX1N5bWJvbCIsIDQ5NiksCisgICAgQWxpYXNOYW1lKCJNYXRoZW1hdGljYWxfQWxwaGFudW1lcmljX1N5bWJvbHMiLCA0OTcpLAorICAgIEFsaWFzTmFtZSgiTWF0aGVtYXRpY2FsX09wZXJhdG9ycyIsIDQ5OCksCisgICAgQWxpYXNOYW1lKCJNYXlhIiwgNDk5KSwKKyAgICBBbGlhc05hbWUoIk1heWJlIiwgNTAwKSwKKyAgICBBbGlhc05hbWUoIk1jIiwgNTAxKSwKKyAgICBBbGlhc05hbWUoIk1lIiwgNTAyKSwKKyAgICBBbGlhc05hbWUoIk1lZCIsIDUwMyksCisgICAgQWxpYXNOYW1lKCJNZWRpYWwiLCA1MDQpLAorICAgIEFsaWFzTmFtZSgiTWVlbSIsIDUwNSksCisgICAgQWxpYXNOYW1lKCJNZWV0ZWlfTWF5ZWsiLCA1MDYpLAorICAgIEFsaWFzTmFtZSgiTWVuZCIsIDUwNyksCisgICAgQWxpYXNOYW1lKCJNZXJjIiwgNTA4KSwKKyAgICBBbGlhc05hbWUoIk1lcm8iLCA1MDkpLAorICAgIEFsaWFzTmFtZSgiTWlkTGV0dGVyIiwgNTEwKSwKKyAgICBBbGlhc05hbWUoIk1pZE51bSIsIDUxMSksCisgICAgQWxpYXNOYW1lKCJNaWROdW1MZXQiLCA1MTIpLAorICAgIEFsaWFzTmFtZSgiTWltIiwgNTEzKSwKKyAgICBBbGlhc05hbWUoIk1pc2NlbGxhbmVvdXNfTWF0aGVtYXRpY2FsX1N5bWJvbHNfQSIsIDUxNCksCisgICAgQWxpYXNOYW1lKCJNaXNjZWxsYW5lb3VzX01hdGhlbWF0aWNhbF9TeW1ib2xzX0IiLCA1MTUpLAorICAgIEFsaWFzTmFtZSgiTWlzY2VsbGFuZW91c19TeW1ib2xzIiwgNTE2KSwKKyAgICBBbGlhc05hbWUoIk1pc2NlbGxhbmVvdXNfU3ltYm9sc19BbmRfQXJyb3dzIiwgNTE3KSwKKyAgICBBbGlhc05hbWUoIk1pc2NlbGxhbmVvdXNfU3ltYm9sc19BbmRfUGljdG9ncmFwaHMiLCA1MTgpLAorICAgIEFsaWFzTmFtZSgiTWlzY2VsbGFuZW91c19UZWNobmljYWwiLCA1MTkpLAorICAgIEFsaWFzTmFtZSgiTWx5bSIsIDUyMCksCisgICAgQWxpYXNOYW1lKCJNbiIsIDUyMSksCisgICAgQWxpYXNOYW1lKCJNb2RpZmllcl9MZXR0ZXIiLCA1MjIpLAorICAgIEFsaWFzTmFtZSgiTW9kaWZpZXJfU3ltYm9sIiwgNTIzKSwKKyAgICBBbGlhc05hbWUoIk1vZGlmaWVyX1RvbmVfTGV0dGVycyIsIDUyNCksCisgICAgQWxpYXNOYW1lKCJNb25nIiwgNTI1KSwKKyAgICBBbGlhc05hbWUoIk1vbmdvbGlhbiIsIDUyNiksCisgICAgQWxpYXNOYW1lKCJNb29uIiwgNTI3KSwKKyAgICBBbGlhc05hbWUoIk1yb28iLCA1MjgpLAorICAgIEFsaWFzTmFtZSgiTXRlaSIsIDUyOSksCisgICAgQWxpYXNOYW1lKCJNdXNpY2FsX1N5bWJvbHMiLCA1MzApLAorICAgIEFsaWFzTmFtZSgiTXlhbm1hciIsIDUzMSksCisgICAgQWxpYXNOYW1lKCJNeWFubWFyX0V4dGVuZGVkX0EiLCA1MzIpLAorICAgIEFsaWFzTmFtZSgiTXltciIsIDUzMyksCisgICAgQWxpYXNOYW1lKCJOIiwgNTM0KSwKKyAgICBBbGlhc05hbWUoIk5BIiwgNTM1KSwKKyAgICBBbGlhc05hbWUoIk5DaGFyIiwgNTM2KSwKKyAgICBBbGlhc05hbWUoIk5GQ19JbmVydCIsIDUzNyksCisgICAgQWxpYXNOYW1lKCJORkNfUUMiLCA1MzgpLAorICAgIEFsaWFzTmFtZSgiTkZDX1F1aWNrX0NoZWNrIiwgNTM5KSwKKyAgICBBbGlhc05hbWUoIk5GRF9JbmVydCIsIDU0MCksCisgICAgQWxpYXNOYW1lKCJORkRfUUMiLCA1NDEpLAorICAgIEFsaWFzTmFtZSgiTkZEX1F1aWNrX0NoZWNrIiwgNTQyKSwKKyAgICBBbGlhc05hbWUoIk5GS0NfSW5lcnQiLCA1NDMpLAorICAgIEFsaWFzTmFtZSgiTkZLQ19RQyIsIDU0NCksCisgICAgQWxpYXNOYW1lKCJORktDX1F1aWNrX0NoZWNrIiwgNTQ1KSwKKyAgICBBbGlhc05hbWUoIk5GS0RfSW5lcnQiLCA1NDYpLAorICAgIEFsaWFzTmFtZSgiTkZLRF9RQyIsIDU0NyksCisgICAgQWxpYXNOYW1lKCJORktEX1F1aWNrX0NoZWNrIiwgNTQ4KSwKKyAgICBBbGlhc05hbWUoIk5LIiwgNTQ5KSwKKyAgICBBbGlhc05hbWUoIk5LbyIsIDU1MCksCisgICAgQWxpYXNOYW1lKCJOTCIsIDU1MSksCisgICAgQWxpYXNOYW1lKCJOUiIsIDU1MiksCisgICAgQWxpYXNOYW1lKCJOUyIsIDU1MyksCisgICAgQWxpYXNOYW1lKCJOU00iLCA1NTQpLAorICAgIEFsaWFzTmFtZSgiTlUiLCA1NTUpLAorICAgIEFsaWFzTmFtZSgiTmEiLCA1NTYpLAorICAgIEFsaWFzTmFtZSgiTmFtZSIsIDU1NyksCisgICAgQWxpYXNOYW1lKCJOYXIiLCA1NTgpLAorICAgIEFsaWFzTmFtZSgiTmFyYiIsIDU1OSksCisgICAgQWxpYXNOYW1lKCJOYXJyb3ciLCA1NjApLAorICAgIEFsaWFzTmFtZSgiTmIiLCA1NjEpLAorICAgIEFsaWFzTmFtZSgiTmJhdCIsIDU2MiksCisgICAgQWxpYXNOYW1lKCJOZCIsIDU2MyksCisgICAgQWxpYXNOYW1lKCJOZXV0cmFsIiwgNTY0KSwKKyAgICBBbGlhc05hbWUoIk5ld19UYWlfTHVlIiwgNTY1KSwKKyAgICBBbGlhc05hbWUoIk5ld2xpbmUiLCA1NjYpLAorICAgIEFsaWFzTmFtZSgiTmV4dF9MaW5lIiwgNTY3KSwKKyAgICBBbGlhc05hbWUoIk5rZ2IiLCA1NjgpLAorICAgIEFsaWFzTmFtZSgiTmtvIiwgNTY5KSwKKyAgICBBbGlhc05hbWUoIk5rb28iLCA1NzApLAorICAgIEFsaWFzTmFtZSgiTmwiLCA1NzEpLAorICAgIEFsaWFzTmFtZSgiTm8iLCA1NzIpLAorICAgIEFsaWFzTmFtZSgiTm9fQmxvY2siLCA1NzMpLAorICAgIEFsaWFzTmFtZSgiTm9fSm9pbmluZ19Hcm91cCIsIDU3NCksCisgICAgQWxpYXNOYW1lKCJOb2JyZWFrIiwgNTc1KSwKKyAgICBBbGlhc05hbWUoIk5vbl9Kb2luaW5nIiwgNTc2KSwKKyAgICBBbGlhc05hbWUoIk5vbmNoYXJhY3Rlcl9Db2RlX1BvaW50IiwgNTc3KSwKKyAgICBBbGlhc05hbWUoIk5vbmUiLCA1NzgpLAorICAgIEFsaWFzTmFtZSgiTm9uc3BhY2luZ19NYXJrIiwgNTc5KSwKKyAgICBBbGlhc05hbWUoIk5vbnN0YXJ0ZXIiLCA1ODApLAorICAgIEFsaWFzTmFtZSgiTm9vbiIsIDU4MSksCisgICAgQWxpYXNOYW1lKCJOb3RfQXBwbGljYWJsZSIsIDU4MiksCisgICAgQWxpYXNOYW1lKCJOb3RfUmVvcmRlcmVkIiwgNTgzKSwKKyAgICBBbGlhc05hbWUoIk5zaHUiLCA1ODQpLAorICAgIEFsaWFzTmFtZSgiTnUiLCA1ODUpLAorICAgIEFsaWFzTmFtZSgiTnVrdGEiLCA1ODYpLAorICAgIEFsaWFzTmFtZSgiTnVtYmVyIiwgNTg3KSwKKyAgICBBbGlhc05hbWUoIk51bWJlcl9Gb3JtcyIsIDU4OCksCisgICAgQWxpYXNOYW1lKCJOdW1lcmljIiwgNTg5KSwKKyAgICBBbGlhc05hbWUoIk51bWVyaWNfVHlwZSIsIDU5MCksCisgICAgQWxpYXNOYW1lKCJOdW1lcmljX1ZhbHVlIiwgNTkxKSwKKyAgICBBbGlhc05hbWUoIk51biIsIDU5MiksCisgICAgQWxpYXNOYW1lKCJOeWEiLCA1OTMpLAorICAgIEFsaWFzTmFtZSgiT0xldHRlciIsIDU5NCksCisgICAgQWxpYXNOYW1lKCJPTiIsIDU5NSksCisgICAgQWxpYXNOYW1lKCJPUCIsIDU5NiksCisgICAgQWxpYXNOYW1lKCJPViIsIDU5NyksCisgICAgQWxpYXNOYW1lKCJPZ2FtIiwgNTk4KSwKKyAgICBBbGlhc05hbWUoIk9naGFtIiwgNTk5KSwKKyAgICBBbGlhc05hbWUoIk9sX0NoaWtpIiwgNjAwKSwKKyAgICBBbGlhc05hbWUoIk9sY2siLCA2MDEpLAorICAgIEFsaWFzTmFtZSgiT2xkX0l0YWxpYyIsIDYwMiksCisgICAgQWxpYXNOYW1lKCJPbGRfUGVyc2lhbiIsIDYwMyksCisgICAgQWxpYXNOYW1lKCJPbGRfU291dGhfQXJhYmlhbiIsIDYwNCksCisgICAgQWxpYXNOYW1lKCJPbGRfVHVya2ljIiwgNjA1KSwKKyAgICBBbGlhc05hbWUoIk9wZW5fUHVuY3R1YXRpb24iLCA2MDYpLAorICAgIEFsaWFzTmFtZSgiT3B0aWNhbF9DaGFyYWN0ZXJfUmVjb2duaXRpb24iLCA2MDcpLAorICAgIEFsaWFzTmFtZSgiT3JpeWEiLCA2MDgpLAorICAgIEFsaWFzTmFtZSgiT3JraCIsIDYwOSksCisgICAgQWxpYXNOYW1lKCJPcnlhIiwgNjEwKSwKKyAgICBBbGlhc05hbWUoIk9zbWEiLCA2MTEpLAorICAgIEFsaWFzTmFtZSgiT3NtYW55YSIsIDYxMiksCisgICAgQWxpYXNOYW1lKCJPdGhlciIsIDYxMyksCisgICAgQWxpYXNOYW1lKCJPdGhlcl9MZXR0ZXIiLCA2MTQpLAorICAgIEFsaWFzTmFtZSgiT3RoZXJfTmV1dHJhbCIsIDYxNSksCisgICAgQWxpYXNOYW1lKCJPdGhlcl9OdW1iZXIiLCA2MTYpLAorICAgIEFsaWFzTmFtZSgiT3RoZXJfUHVuY3R1YXRpb24iLCA2MTcpLAorICAgIEFsaWFzTmFtZSgiT3RoZXJfU3ltYm9sIiwgNjE4KSwKKyAgICBBbGlhc05hbWUoIk92ZXJsYXkiLCA2MTkpLAorICAgIEFsaWFzTmFtZSgiUCIsIDYyMCksCisgICAgQWxpYXNOYW1lKCJQREYiLCA2MjEpLAorICAgIEFsaWFzTmFtZSgiUE8iLCA2MjIpLAorICAgIEFsaWFzTmFtZSgiUFAiLCA2MjMpLAorICAgIEFsaWFzTmFtZSgiUFIiLCA2MjQpLAorICAgIEFsaWFzTmFtZSgiUGFsbSIsIDYyNSksCisgICAgQWxpYXNOYW1lKCJQYXJhZ3JhcGhfU2VwYXJhdG9yIiwgNjI2KSwKKyAgICBBbGlhc05hbWUoIlBhdF9TeW4iLCA2MjcpLAorICAgIEFsaWFzTmFtZSgiUGF0X1dTIiwgNjI4KSwKKyAgICBBbGlhc05hbWUoIlBhdHRlcm5fU3ludGF4IiwgNjI5KSwKKyAgICBBbGlhc05hbWUoIlBhdHRlcm5fV2hpdGVfU3BhY2UiLCA2MzApLAorICAgIEFsaWFzTmFtZSgiUGMiLCA2MzEpLAorICAgIEFsaWFzTmFtZSgiUGQiLCA2MzIpLAorICAgIEFsaWFzTmFtZSgiUGUiLCA2MzMpLAorICAgIEFsaWFzTmFtZSgiUGVybSIsIDYzNCksCisgICAgQWxpYXNOYW1lKCJQZiIsIDYzNSksCisgICAgQWxpYXNOYW1lKCJQaGFnIiwgNjM2KSwKKyAgICBBbGlhc05hbWUoIlBoYWdzX1BhIiwgNjM3KSwKKyAgICBBbGlhc05hbWUoIlBoYWlzdG9zX0Rpc2MiLCA2MzgpLAorICAgIEFsaWFzTmFtZSgiUGhsaSIsIDYzOSksCisgICAgQWxpYXNOYW1lKCJQaGxwIiwgNjQwKSwKKyAgICBBbGlhc05hbWUoIlBobHYiLCA2NDEpLAorICAgIEFsaWFzTmFtZSgiUGhueCIsIDY0MiksCisgICAgQWxpYXNOYW1lKCJQaG9lbmljaWFuIiwgNjQzKSwKKyAgICBBbGlhc05hbWUoIlBob25ldGljX0V4dGVuc2lvbnMiLCA2NDQpLAorICAgIEFsaWFzTmFtZSgiUGhvbmV0aWNfRXh0ZW5zaW9uc19TdXBwbGVtZW50IiwgNjQ1KSwKKyAgICBBbGlhc05hbWUoIlBpIiwgNjQ2KSwKKyAgICBBbGlhc05hbWUoIlBsYXlpbmdfQ2FyZHMiLCA2NDcpLAorICAgIEFsaWFzTmFtZSgiUGxyZCIsIDY0OCksCisgICAgQWxpYXNOYW1lKCJQbyIsIDY0OSksCisgICAgQWxpYXNOYW1lKCJQb3BfRGlyZWN0aW9uYWxfRm9ybWF0IiwgNjUwKSwKKyAgICBBbGlhc05hbWUoIlBvc3RmaXhfTnVtZXJpYyIsIDY1MSksCisgICAgQWxpYXNOYW1lKCJQcmVmaXhfTnVtZXJpYyIsIDY1MiksCisgICAgQWxpYXNOYW1lKCJQcmVwZW5kIiwgNjUzKSwKKyAgICBBbGlhc05hbWUoIlByaXZhdGVfVXNlIiwgNjU0KSwKKyAgICBBbGlhc05hbWUoIlByaXZhdGVfVXNlX0FyZWEiLCA2NTUpLAorICAgIEFsaWFzTmFtZSgiUHJ0aSIsIDY1NiksCisgICAgQWxpYXNOYW1lKCJQcyIsIDY1NyksCisgICAgQWxpYXNOYW1lKCJQdW5jdHVhdGlvbiIsIDY1OCksCisgICAgQWxpYXNOYW1lKCJRTWFyayIsIDY1OSksCisgICAgQWxpYXNOYW1lKCJRVSIsIDY2MCksCisgICAgQWxpYXNOYW1lKCJRYWFjIiwgNjYxKSwKKyAgICBBbGlhc05hbWUoIlFhYWkiLCA2NjIpLAorICAgIEFsaWFzTmFtZSgiUWFmIiwgNjYzKSwKKyAgICBBbGlhc05hbWUoIlFhcGgiLCA2NjQpLAorICAgIEFsaWFzTmFtZSgiUXVvdGF0aW9uIiwgNjY1KSwKKyAgICBBbGlhc05hbWUoIlF1b3RhdGlvbl9NYXJrIiwgNjY2KSwKKyAgICBBbGlhc05hbWUoIlIiLCA2NjcpLAorICAgIEFsaWFzTmFtZSgiUkxFIiwgNjY4KSwKKyAgICBBbGlhc05hbWUoIlJMTyIsIDY2OSksCisgICAgQWxpYXNOYW1lKCJSYWRpY2FsIiwgNjcwKSwKKyAgICBBbGlhc05hbWUoIlJlaCIsIDY3MSksCisgICAgQWxpYXNOYW1lKCJSZWphbmciLCA2NzIpLAorICAgIEFsaWFzTmFtZSgiUmV2ZXJzZWRfUGUiLCA2NzMpLAorICAgIEFsaWFzTmFtZSgiUmlnaHQiLCA2NzQpLAorICAgIEFsaWFzTmFtZSgiUmlnaHRfSm9pbmluZyIsIDY3NSksCisgICAgQWxpYXNOYW1lKCJSaWdodF9Ub19MZWZ0IiwgNjc2KSwKKyAgICBBbGlhc05hbWUoIlJpZ2h0X1RvX0xlZnRfRW1iZWRkaW5nIiwgNjc3KSwKKyAgICBBbGlhc05hbWUoIlJpZ2h0X1RvX0xlZnRfT3ZlcnJpZGUiLCA2NzgpLAorICAgIEFsaWFzTmFtZSgiUmpuZyIsIDY3OSksCisgICAgQWxpYXNOYW1lKCJSb3JvIiwgNjgwKSwKKyAgICBBbGlhc05hbWUoIlJ1bWlfTnVtZXJhbF9TeW1ib2xzIiwgNjgxKSwKKyAgICBBbGlhc05hbWUoIlJ1bmljIiwgNjgyKSwKKyAgICBBbGlhc05hbWUoIlJ1bnIiLCA2ODMpLAorICAgIEFsaWFzTmFtZSgiUyIsIDY4NCksCisgICAgQWxpYXNOYW1lKCJTQSIsIDY4NSksCisgICAgQWxpYXNOYW1lKCJTQiIsIDY4NiksCisgICAgQWxpYXNOYW1lKCJTQyIsIDY4NyksCisgICAgQWxpYXNOYW1lKCJTQ29udGludWUiLCA2ODgpLAorICAgIEFsaWFzTmFtZSgiU0QiLCA2ODkpLAorICAgIEFsaWFzTmFtZSgiU0UiLCA2OTApLAorICAgIEFsaWFzTmFtZSgiU0ciLCA2OTEpLAorICAgIEFsaWFzTmFtZSgiU00iLCA2OTIpLAorICAgIEFsaWFzTmFtZSgiU1AiLCA2OTMpLAorICAgIEFsaWFzTmFtZSgiU1QiLCA2OTQpLAorICAgIEFsaWFzTmFtZSgiU1Rlcm0iLCA2OTUpLAorICAgIEFsaWFzTmFtZSgiU1kiLCA2OTYpLAorICAgIEFsaWFzTmFtZSgiU2FkIiwgNjk3KSwKKyAgICBBbGlhc05hbWUoIlNhZGhlIiwgNjk4KSwKKyAgICBBbGlhc05hbWUoIlNhbWFyaXRhbiIsIDY5OSksCisgICAgQWxpYXNOYW1lKCJTYW1yIiwgNzAwKSwKKyAgICBBbGlhc05hbWUoIlNhcmEiLCA3MDEpLAorICAgIEFsaWFzTmFtZSgiU2FyYiIsIDcwMiksCisgICAgQWxpYXNOYW1lKCJTYXVyIiwgNzAzKSwKKyAgICBBbGlhc05hbWUoIlNhdXJhc2h0cmEiLCA3MDQpLAorICAgIEFsaWFzTmFtZSgiU2MiLCA3MDUpLAorICAgIEFsaWFzTmFtZSgiU2NyaXB0IiwgNzA2KSwKKyAgICBBbGlhc05hbWUoIlNjcmlwdF9FeHRlbnNpb25zIiwgNzA3KSwKKyAgICBBbGlhc05hbWUoIlNlZW4iLCA3MDgpLAorICAgIEFsaWFzTmFtZSgiU2VnbWVudF9TZXBhcmF0b3IiLCA3MDkpLAorICAgIEFsaWFzTmFtZSgiU2VnbWVudF9TdGFydGVyIiwgNzEwKSwKKyAgICBBbGlhc05hbWUoIlNlbWthdGgiLCA3MTEpLAorICAgIEFsaWFzTmFtZSgiU2Vuc2l0aXZlIiwgNzEyKSwKKyAgICBBbGlhc05hbWUoIlNlbnRlbmNlX0JyZWFrIiwgNzEzKSwKKyAgICBBbGlhc05hbWUoIlNlcCIsIDcxNCksCisgICAgQWxpYXNOYW1lKCJTZXBhcmF0b3IiLCA3MTUpLAorICAgIEFsaWFzTmFtZSgiU2dudyIsIDcxNiksCisgICAgQWxpYXNOYW1lKCJTaGF2aWFuIiwgNzE3KSwKKyAgICBBbGlhc05hbWUoIlNoYXciLCA3MTgpLAorICAgIEFsaWFzTmFtZSgiU2hpbiIsIDcxOSksCisgICAgQWxpYXNOYW1lKCJTaHJkIiwgNzIwKSwKKyAgICBBbGlhc05hbWUoIlNpbXBsZV9DYXNlX0ZvbGRpbmciLCA3MjEpLAorICAgIEFsaWFzTmFtZSgiU2ltcGxlX0xvd2VyY2FzZV9NYXBwaW5nIiwgNzIyKSwKKyAgICBBbGlhc05hbWUoIlNpbXBsZV9UaXRsZWNhc2VfTWFwcGluZyIsIDcyMyksCisgICAgQWxpYXNOYW1lKCJTaW1wbGVfVXBwZXJjYXNlX01hcHBpbmciLCA3MjQpLAorICAgIEFsaWFzTmFtZSgiU2luZCIsIDcyNSksCisgICAgQWxpYXNOYW1lKCJTaW5oIiwgNzI2KSwKKyAgICBBbGlhc05hbWUoIlNpbmhhbGEiLCA3MjcpLAorICAgIEFsaWFzTmFtZSgiU2siLCA3MjgpLAorICAgIEFsaWFzTmFtZSgiU20iLCA3MjkpLAorICAgIEFsaWFzTmFtZSgiU21hbGwiLCA3MzApLAorICAgIEFsaWFzTmFtZSgiU21hbGxfRm9ybV9WYXJpYW50cyIsIDczMSksCisgICAgQWxpYXNOYW1lKCJTbWwiLCA3MzIpLAorICAgIEFsaWFzTmFtZSgiU28iLCA3MzMpLAorICAgIEFsaWFzTmFtZSgiU29mdF9Eb3R0ZWQiLCA3MzQpLAorICAgIEFsaWFzTmFtZSgiU29yYSIsIDczNSksCisgICAgQWxpYXNOYW1lKCJTcCIsIDczNiksCisgICAgQWxpYXNOYW1lKCJTcGFjZSIsIDczNyksCisgICAgQWxpYXNOYW1lKCJTcGFjZV9TZXBhcmF0b3IiLCA3MzgpLAorICAgIEFsaWFzTmFtZSgiU3BhY2luZ01hcmsiLCA3MzkpLAorICAgIEFsaWFzTmFtZSgiU3BhY2luZ19NYXJrIiwgNzQwKSwKKyAgICBBbGlhc05hbWUoIlNwYWNpbmdfTW9kaWZpZXJfTGV0dGVycyIsIDc0MSksCisgICAgQWxpYXNOYW1lKCJTcGVjaWFscyIsIDc0MiksCisgICAgQWxpYXNOYW1lKCJTcXIiLCA3NDMpLAorICAgIEFsaWFzTmFtZSgiU3F1YXJlIiwgNzQ0KSwKKyAgICBBbGlhc05hbWUoIlN1YiIsIDc0NSksCisgICAgQWxpYXNOYW1lKCJTdW5kIiwgNzQ2KSwKKyAgICBBbGlhc05hbWUoIlN1bmRhbmVzZSIsIDc0NyksCisgICAgQWxpYXNOYW1lKCJTdXAiLCA3NDgpLAorICAgIEFsaWFzTmFtZSgiU3VwZXIiLCA3NDkpLAorICAgIEFsaWFzTmFtZSgiU3VwZXJzY3JpcHRzX0FuZF9TdWJzY3JpcHRzIiwgNzUwKSwKKyAgICBBbGlhc05hbWUoIlN1cHBsZW1lbnRhbF9BcnJvd3NfQSIsIDc1MSksCisgICAgQWxpYXNOYW1lKCJTdXBwbGVtZW50YWxfQXJyb3dzX0IiLCA3NTIpLAorICAgIEFsaWFzTmFtZSgiU3VwcGxlbWVudGFsX01hdGhlbWF0aWNhbF9PcGVyYXRvcnMiLCA3NTMpLAorICAgIEFsaWFzTmFtZSgiU3VwcGxlbWVudGFsX1B1bmN0dWF0aW9uIiwgNzU0KSwKKyAgICBBbGlhc05hbWUoIlN1cHBsZW1lbnRhcnlfUHJpdmF0ZV9Vc2VfQXJlYV9BIiwgNzU1KSwKKyAgICBBbGlhc05hbWUoIlN1cHBsZW1lbnRhcnlfUHJpdmF0ZV9Vc2VfQXJlYV9CIiwgNzU2KSwKKyAgICBBbGlhc05hbWUoIlN1cnJvZ2F0ZSIsIDc1NyksCisgICAgQWxpYXNOYW1lKCJTd2FzaF9LYWYiLCA3NTgpLAorICAgIEFsaWFzTmFtZSgiU3lsbyIsIDc1OSksCisgICAgQWxpYXNOYW1lKCJTeWxvdGlfTmFncmkiLCA3NjApLAorICAgIEFsaWFzTmFtZSgiU3ltYm9sIiwgNzYxKSwKKyAgICBBbGlhc05hbWUoIlN5cmMiLCA3NjIpLAorICAgIEFsaWFzTmFtZSgiU3lyZSIsIDc2MyksCisgICAgQWxpYXNOYW1lKCJTeXJpYWMiLCA3NjQpLAorICAgIEFsaWFzTmFtZSgiU3lyaWFjX1dhdyIsIDc2NSksCisgICAgQWxpYXNOYW1lKCJTeXJqIiwgNzY2KSwKKyAgICBBbGlhc05hbWUoIlN5cm4iLCA3NjcpLAorICAgIEFsaWFzTmFtZSgiVCIsIDc2OCksCisgICAgQWxpYXNOYW1lKCJUYWdhbG9nIiwgNzY5KSwKKyAgICBBbGlhc05hbWUoIlRhZ2IiLCA3NzApLAorICAgIEFsaWFzTmFtZSgiVGFnYmFud2EiLCA3NzEpLAorICAgIEFsaWFzTmFtZSgiVGFncyIsIDc3MiksCisgICAgQWxpYXNOYW1lKCJUYWgiLCA3NzMpLAorICAgIEFsaWFzTmFtZSgiVGFpX0xlIiwgNzc0KSwKKyAgICBBbGlhc05hbWUoIlRhaV9UaGFtIiwgNzc1KSwKKyAgICBBbGlhc05hbWUoIlRhaV9WaWV0IiwgNzc2KSwKKyAgICBBbGlhc05hbWUoIlRhaV9YdWFuX0ppbmdfU3ltYm9scyIsIDc3NyksCisgICAgQWxpYXNOYW1lKCJUYWtyIiwgNzc4KSwKKyAgICBBbGlhc05hbWUoIlRhbGUiLCA3NzkpLAorICAgIEFsaWFzTmFtZSgiVGFsdSIsIDc4MCksCisgICAgQWxpYXNOYW1lKCJUYW1pbCIsIDc4MSksCisgICAgQWxpYXNOYW1lKCJUYW1sIiwgNzgyKSwKKyAgICBBbGlhc05hbWUoIlRhbmciLCA3ODMpLAorICAgIEFsaWFzTmFtZSgiVGF2dCIsIDc4NCksCisgICAgQWxpYXNOYW1lKCJUYXciLCA3ODUpLAorICAgIEFsaWFzTmFtZSgiVGVoX01hcmJ1dGEiLCA3ODYpLAorICAgIEFsaWFzTmFtZSgiVGVoX01hcmJ1dGFfR29hbCIsIDc4NyksCisgICAgQWxpYXNOYW1lKCJUZWx1IiwgNzg4KSwKKyAgICBBbGlhc05hbWUoIlRlbHVndSIsIDc4OSksCisgICAgQWxpYXNOYW1lKCJUZW5nIiwgNzkwKSwKKyAgICBBbGlhc05hbWUoIlRlcm0iLCA3OTEpLAorICAgIEFsaWFzTmFtZSgiVGVybWluYWxfUHVuY3R1YXRpb24iLCA3OTIpLAorICAgIEFsaWFzTmFtZSgiVGV0aCIsIDc5MyksCisgICAgQWxpYXNOYW1lKCJUZm5nIiwgNzk0KSwKKyAgICBBbGlhc05hbWUoIlRnbGciLCA3OTUpLAorICAgIEFsaWFzTmFtZSgiVGhhYSIsIDc5NiksCisgICAgQWxpYXNOYW1lKCJUaGFhbmEiLCA3OTcpLAorICAgIEFsaWFzTmFtZSgiVGhhaSIsIDc5OCksCisgICAgQWxpYXNOYW1lKCJUaWJldGFuIiwgNzk5KSwKKyAgICBBbGlhc05hbWUoIlRpYnQiLCA4MDApLAorICAgIEFsaWFzTmFtZSgiVGlmaW5hZ2giLCA4MDEpLAorICAgIEFsaWFzTmFtZSgiVGl0bGVjYXNlX0xldHRlciIsIDgwMiksCisgICAgQWxpYXNOYW1lKCJUaXRsZWNhc2VfTWFwcGluZyIsIDgwMyksCisgICAgQWxpYXNOYW1lKCJUcmFpbF9DYW5vbmljYWxfQ29tYmluaW5nX0NsYXNzIiwgODA0KSwKKyAgICBBbGlhc05hbWUoIlRyYWlsaW5nX0phbW8iLCA4MDUpLAorICAgIEFsaWFzTmFtZSgiVHJhbnNwYXJlbnQiLCA4MDYpLAorICAgIEFsaWFzTmFtZSgiVHJhbnNwb3J0X0FuZF9NYXBfU3ltYm9scyIsIDgwNyksCisgICAgQWxpYXNOYW1lKCJUcnVlIiwgODA4KSwKKyAgICBBbGlhc05hbWUoIlUiLCA4MDkpLAorICAgIEFsaWFzTmFtZSgiVUlkZW8iLCA4MTApLAorICAgIEFsaWFzTmFtZSgiVVAiLCA4MTEpLAorICAgIEFsaWFzTmFtZSgiVWdhciIsIDgxMiksCisgICAgQWxpYXNOYW1lKCJVZ2FyaXRpYyIsIDgxMyksCisgICAgQWxpYXNOYW1lKCJVbmFzc2lnbmVkIiwgODE0KSwKKyAgICBBbGlhc05hbWUoIlVuaWNvZGVfMV9OYW1lIiwgODE1KSwKKyAgICBBbGlhc05hbWUoIlVuaWZpZWRfQ2FuYWRpYW5fQWJvcmlnaW5hbF9TeWxsYWJpY3MiLCA4MTYpLAorICAgIEFsaWFzTmFtZSgiVW5pZmllZF9DYW5hZGlhbl9BYm9yaWdpbmFsX1N5bGxhYmljc19FeHRlbmRlZCIsIDgxNyksCisgICAgQWxpYXNOYW1lKCJVbmlmaWVkX0lkZW9ncmFwaCIsIDgxOCksCisgICAgQWxpYXNOYW1lKCJVbmtub3duIiwgODE5KSwKKyAgICBBbGlhc05hbWUoIlVwcGVyIiwgODIwKSwKKyAgICBBbGlhc05hbWUoIlVwcGVyY2FzZSIsIDgyMSksCisgICAgQWxpYXNOYW1lKCJVcHBlcmNhc2VfTGV0dGVyIiwgODIyKSwKKyAgICBBbGlhc05hbWUoIlVwcGVyY2FzZV9NYXBwaW5nIiwgODIzKSwKKyAgICBBbGlhc05hbWUoIlYiLCA4MjQpLAorICAgIEFsaWFzTmFtZSgiVlIiLCA4MjUpLAorICAgIEFsaWFzTmFtZSgiVlMiLCA4MjYpLAorICAgIEFsaWFzTmFtZSgiVmFpIiwgODI3KSwKKyAgICBBbGlhc05hbWUoIlZhaWkiLCA4MjgpLAorICAgIEFsaWFzTmFtZSgiVmFyaWF0aW9uX1NlbGVjdG9yIiwgODI5KSwKKyAgICBBbGlhc05hbWUoIlZhcmlhdGlvbl9TZWxlY3RvcnMiLCA4MzApLAorICAgIEFsaWFzTmFtZSgiVmFyaWF0aW9uX1NlbGVjdG9yc19TdXBwbGVtZW50IiwgODMxKSwKKyAgICBBbGlhc05hbWUoIlZlZGljX0V4dGVuc2lvbnMiLCA4MzIpLAorICAgIEFsaWFzTmFtZSgiVmVydCIsIDgzMyksCisgICAgQWxpYXNOYW1lKCJWZXJ0aWNhbCIsIDgzNCksCisgICAgQWxpYXNOYW1lKCJWZXJ0aWNhbF9Gb3JtcyIsIDgzNSksCisgICAgQWxpYXNOYW1lKCJWaXJhbWEiLCA4MzYpLAorICAgIEFsaWFzTmFtZSgiVmlzcCIsIDgzNyksCisgICAgQWxpYXNOYW1lKCJWb3dlbF9KYW1vIiwgODM4KSwKKyAgICBBbGlhc05hbWUoIlciLCA4MzkpLAorICAgIEFsaWFzTmFtZSgiV0IiLCA4NDApLAorICAgIEFsaWFzTmFtZSgiV0oiLCA4NDEpLAorICAgIEFsaWFzTmFtZSgiV1MiLCA4NDIpLAorICAgIEFsaWFzTmFtZSgiV1NwYWNlIiwgODQzKSwKKyAgICBBbGlhc05hbWUoIldhcmEiLCA4NDQpLAorICAgIEFsaWFzTmFtZSgiV2F3IiwgODQ1KSwKKyAgICBBbGlhc05hbWUoIldoaXRlX1NwYWNlIiwgODQ2KSwKKyAgICBBbGlhc05hbWUoIldpZGUiLCA4NDcpLAorICAgIEFsaWFzTmFtZSgiV29sZSIsIDg0OCksCisgICAgQWxpYXNOYW1lKCJXb3JkX0JyZWFrIiwgODQ5KSwKKyAgICBBbGlhc05hbWUoIldvcmRfSm9pbmVyIiwgODUwKSwKKyAgICBBbGlhc05hbWUoIlhJREMiLCA4NTEpLAorICAgIEFsaWFzTmFtZSgiWElEUyIsIDg1MiksCisgICAgQWxpYXNOYW1lKCJYSURfQ29udGludWUiLCA4NTMpLAorICAgIEFsaWFzTmFtZSgiWElEX1N0YXJ0IiwgODU0KSwKKyAgICBBbGlhc05hbWUoIlhYIiwgODU1KSwKKyAgICBBbGlhc05hbWUoIlhwZW8iLCA4NTYpLAorICAgIEFsaWFzTmFtZSgiWHN1eCIsIDg1NyksCisgICAgQWxpYXNOYW1lKCJZIiwgODU4KSwKKyAgICBBbGlhc05hbWUoIlllaCIsIDg1OSksCisgICAgQWxpYXNOYW1lKCJZZWhfQmFycmVlIiwgODYwKSwKKyAgICBBbGlhc05hbWUoIlllaF9XaXRoX1RhaWwiLCA4NjEpLAorICAgIEFsaWFzTmFtZSgiWWVzIiwgODYyKSwKKyAgICBBbGlhc05hbWUoIllpIiwgODYzKSwKKyAgICBBbGlhc05hbWUoIllpX1JhZGljYWxzIiwgODY0KSwKKyAgICBBbGlhc05hbWUoIllpX1N5bGxhYmxlcyIsIDg2NSksCisgICAgQWxpYXNOYW1lKCJZaWlpIiwgODY2KSwKKyAgICBBbGlhc05hbWUoIllpamluZ19IZXhhZ3JhbV9TeW1ib2xzIiwgODY3KSwKKyAgICBBbGlhc05hbWUoIll1ZGgiLCA4NjgpLAorICAgIEFsaWFzTmFtZSgiWXVkaF9IZSIsIDg2OSksCisgICAgQWxpYXNOYW1lKCJaIiwgODcwKSwKKyAgICBBbGlhc05hbWUoIlpXIiwgODcxKSwKKyAgICBBbGlhc05hbWUoIlpXU3BhY2UiLCA4NzIpLAorICAgIEFsaWFzTmFtZSgiWmFpbiIsIDg3MyksCisgICAgQWxpYXNOYW1lKCJaaGFpbiIsIDg3NCksCisgICAgQWxpYXNOYW1lKCJaaW5oIiwgODc1KSwKKyAgICBBbGlhc05hbWUoIlpsIiwgODc2KSwKKyAgICBBbGlhc05hbWUoIlptdGgiLCA4NzcpLAorICAgIEFsaWFzTmFtZSgiWnAiLCA4NzgpLAorICAgIEFsaWFzTmFtZSgiWnMiLCA4NzkpLAorICAgIEFsaWFzTmFtZSgiWnN5bSIsIDg4MCksCisgICAgQWxpYXNOYW1lKCJaeHh4IiwgODgxKSwKKyAgICBBbGlhc05hbWUoIlp5eXkiLCA4ODIpLAorICAgIEFsaWFzTmFtZSgiWnp6eiIsIDg4MyksCisgICAgQWxpYXNOYW1lKCJhZ2UiLCA4ODQpLAorICAgIEFsaWFzTmFtZSgiYWxudW0iLCA4ODUpLAorICAgIEFsaWFzTmFtZSgiYmMiLCA4ODYpLAorICAgIEFsaWFzTmFtZSgiYmxhbmsiLCA4ODcpLAorICAgIEFsaWFzTmFtZSgiYmxrIiwgODg4KSwKKyAgICBBbGlhc05hbWUoImJtZyIsIDg4OSksCisgICAgQWxpYXNOYW1lKCJjYW4iLCA4OTApLAorICAgIEFsaWFzTmFtZSgiY2NjIiwgODkxKSwKKyAgICBBbGlhc05hbWUoImNmIiwgODkyKSwKKyAgICBBbGlhc05hbWUoImNudHJsIiwgODkzKSwKKyAgICBBbGlhc05hbWUoImNvbSIsIDg5NCksCisgICAgQWxpYXNOYW1lKCJkaWdpdCIsIDg5NSksCisgICAgQWxpYXNOYW1lKCJkdCIsIDg5NiksCisgICAgQWxpYXNOYW1lKCJlYSIsIDg5NyksCisgICAgQWxpYXNOYW1lKCJlbmMiLCA4OTgpLAorICAgIEFsaWFzTmFtZSgiZmluIiwgODk5KSwKKyAgICBBbGlhc05hbWUoImZvbnQiLCA5MDApLAorICAgIEFsaWFzTmFtZSgiZnJhIiwgOTAxKSwKKyAgICBBbGlhc05hbWUoImdjIiwgOTAyKSwKKyAgICBBbGlhc05hbWUoImdjbSIsIDkwMyksCisgICAgQWxpYXNOYW1lKCJncmFwaCIsIDkwNCksCisgICAgQWxpYXNOYW1lKCJoc3QiLCA5MDUpLAorICAgIEFsaWFzTmFtZSgiaW5pdCIsIDkwNiksCisgICAgQWxpYXNOYW1lKCJpc2MiLCA5MDcpLAorICAgIEFsaWFzTmFtZSgiaXNvIiwgOTA4KSwKKyAgICBBbGlhc05hbWUoImpnIiwgOTA5KSwKKyAgICBBbGlhc05hbWUoImp0IiwgOTEwKSwKKyAgICBBbGlhc05hbWUoImxiIiwgOTExKSwKKyAgICBBbGlhc05hbWUoImxjIiwgOTEyKSwKKyAgICBBbGlhc05hbWUoImxjY2MiLCA5MTMpLAorICAgIEFsaWFzTmFtZSgibWVkIiwgOTE0KSwKKyAgICBBbGlhc05hbWUoIm5hIiwgOTE1KSwKKyAgICBBbGlhc05hbWUoIm5hMSIsIDkxNiksCisgICAgQWxpYXNOYW1lKCJuYXIiLCA5MTcpLAorICAgIEFsaWFzTmFtZSgibmIiLCA5MTgpLAorICAgIEFsaWFzTmFtZSgibmZjaW5lcnQiLCA5MTkpLAorICAgIEFsaWFzTmFtZSgibmZkaW5lcnQiLCA5MjApLAorICAgIEFsaWFzTmFtZSgibmZrY2luZXJ0IiwgOTIxKSwKKyAgICBBbGlhc05hbWUoIm5ma2RpbmVydCIsIDkyMiksCisgICAgQWxpYXNOYW1lKCJub25lIiwgOTIzKSwKKyAgICBBbGlhc05hbWUoIm50IiwgOTI0KSwKKyAgICBBbGlhc05hbWUoIm52IiwgOTI1KSwKKyAgICBBbGlhc05hbWUoInByaW50IiwgOTI2KSwKKyAgICBBbGlhc05hbWUoInB1bmN0IiwgOTI3KSwKKyAgICBBbGlhc05hbWUoInNjIiwgOTI4KSwKKyAgICBBbGlhc05hbWUoInNjZiIsIDkyOSksCisgICAgQWxpYXNOYW1lKCJzY3giLCA5MzApLAorICAgIEFsaWFzTmFtZSgic2Vnc3RhcnQiLCA5MzEpLAorICAgIEFsaWFzTmFtZSgic2ZjIiwgOTMyKSwKKyAgICBBbGlhc05hbWUoInNsYyIsIDkzMyksCisgICAgQWxpYXNOYW1lKCJzbWwiLCA5MzQpLAorICAgIEFsaWFzTmFtZSgic3BhY2UiLCA5MzUpLAorICAgIEFsaWFzTmFtZSgic3FyIiwgOTM2KSwKKyAgICBBbGlhc05hbWUoInN0YyIsIDkzNyksCisgICAgQWxpYXNOYW1lKCJzdWIiLCA5MzgpLAorICAgIEFsaWFzTmFtZSgic3VjIiwgOTM5KSwKKyAgICBBbGlhc05hbWUoInN1cCIsIDk0MCksCisgICAgQWxpYXNOYW1lKCJ0YyIsIDk0MSksCisgICAgQWxpYXNOYW1lKCJ0Y2NjIiwgOTQyKSwKKyAgICBBbGlhc05hbWUoInVjIiwgOTQzKSwKKyAgICBBbGlhc05hbWUoInZlcnQiLCA5NDQpLAorICAgIEFsaWFzTmFtZSgid2lkZSIsIDk0NSksCisgICAgQWxpYXNOYW1lKCJ4ZGlnaXQiLCA5NDYpLAorfTsKKworLyogdG8gYmUgZmlsbGVkIGluICovCitpbnQzMl90IFJFTUFQWzk0N107CisKK2NvbnN0IGludDMyX3QgTkFNRV9HUk9VUF9DT1VOVCA9IDE0NDc7CisKK2ludDMyX3QgTkFNRV9HUk9VUFtdID0geworICAgIDEyMSwgLTE3OSwgICAgICAgICAgLyogICAwOiAiQ04iLCAiQ29udHJvbCIgKi8KKyAgICAxMjMsIC0xMjMsICAgICAgICAgIC8qICAgMjogIkNSIiwgIkNSIiAqLworICAgIDIzMywgLTI1NywgICAgICAgICAgLyogICA0OiAiRVgiLCAiRXh0ZW5kIiAqLworICAgIDQxNywgLTQxNywgICAgICAgICAgLyogICA2OiAiTCIsICJMIiAqLworICAgIDQyMCwgLTQyMCwgICAgICAgICAgLyogICA4OiAiTEYiLCAiTEYiICovCisgICAgNDI1LCAtNDI1LCAgICAgICAgICAvKiAgMTA6ICJMViIsICJMViIgKi8KKyAgICA0MjYsIC00MjYsICAgICAgICAgIC8qICAxMjogIkxWVCIsICJMVlQiICovCisgICAgODU1LCAtNjEzLCAgICAgICAgICAvKiAgMTQ6ICJYWCIsICJPdGhlciIgKi8KKyAgICA2MjMsIC02NTMsICAgICAgICAgIC8qICAxNjogIlBQIiwgIlByZXBlbmQiICovCisgICAgNjkyLCAtNzM5LCAgICAgICAgICAvKiAgMTg6ICJTTSIsICJTcGFjaW5nTWFyayIgKi8KKyAgICA3NjgsIC03NjgsICAgICAgICAgIC8qICAyMDogIlQiLCAiVCIgKi8KKyAgICA4MjQsIC04MjQsICAgICAgICAgIC8qICAyMjogIlYiLCAiViIgKi8KKyAgICA0ODQsIC01MDAsICAgICAgICAgIC8qICAyNDogIk0iLCAiTWF5YmUiICovCisgICAgNTM0LCAtNTcyLCAgICAgICAgICAvKiAgMjY6ICJOIiwgIk5vIiAqLworICAgIDg1OCwgLTg2MiwgICAgICAgICAgLyogIDI4OiAiWSIsICJZZXMiICovCisgICAgMTAsIC0xNSwgICAgICAgICAgICAvKiAgMzA6ICJBVCIsICJBVGVybSIgKi8KKyAgICAxMTksIC0xNTksICAgICAgICAgIC8qICAzMjogIkNMIiwgIkNsb3NlIiAqLworICAgIDI2MSwgLTI3MSwgICAgICAgICAgLyogIDM0OiAiRk8iLCAiRm9ybWF0IiAqLworICAgIDQyMSwgLTQ3NCwgICAgICAgICAgLyogIDM2OiAiTE8iLCAiTG93ZXIiICovCisgICAgNTU1LCAtNTg5LCAgICAgICAgICAvKiAgMzg6ICJOVSIsICJOdW1lcmljIiAqLworICAgIDQxOSwgLTU5NCwgICAgICAgICAgLyogIDQwOiAiTEUiLCAiT0xldHRlciIgKi8KKyAgICA2ODcsIC02ODgsICAgICAgICAgIC8qICA0MjogIlNDIiwgIlNDb250aW51ZSIgKi8KKyAgICA2OTAsIC03MTQsICAgICAgICAgIC8qICA0NDogIlNFIiwgIlNlcCIgKi8KKyAgICA2OTMsIC03MzYsICAgICAgICAgIC8qICA0NjogIlNQIiwgIlNwIiAqLworICAgIDY5NCwgLTY5NSwgICAgICAgICAgLyogIDQ4OiAiU1QiLCAiU1Rlcm0iICovCisgICAgODExLCAtODIwLCAgICAgICAgICAvKiAgNTA6ICJVUCIsICJVcHBlciIgKi8KKyAgICA0MTksIC01LCAgICAgICAgICAgIC8qICA1MjogIkxFIiwgIkFMZXR0ZXIiICovCisgICAgMjU3LCAtMjU3LCAgICAgICAgICAvKiAgNTQ6ICJFeHRlbmQiLCAiRXh0ZW5kIiAqLworICAgIDIzMywgLTI1OCwgICAgICAgICAgLyogIDU2OiAiRVgiLCAiRXh0ZW5kTnVtTGV0IiAqLworICAgIDM5MCwgLTQwMiwgICAgICAgICAgLyogIDU4OiAiS0EiLCAiS2F0YWthbmEiICovCisgICAgNDg2LCAtNTEwLCAgICAgICAgICAvKiAgNjA6ICJNTCIsICJNaWRMZXR0ZXIiICovCisgICAgNDg3LCAtNTExLCAgICAgICAgICAvKiAgNjI6ICJNTiIsICJNaWROdW0iICovCisgICAgNDg1LCAtNTEyLCAgICAgICAgICAvKiAgNjQ6ICJNQiIsICJNaWROdW1MZXQiICovCisgICAgNTUxLCAtNTY2LCAgICAgICAgICAvKiAgNjY6ICJOTCIsICJOZXdsaW5lIiAqLworICAgIDI2LCAtMjcsICAgICAgICAgICAgLyogIDY4OiAiQWxwaGEiLCAiQWxwaGFiZXRpYyIgKi8KKyAgICAyLCAtOSwgICAgICAgICAgICAgIC8qICA3MDogIkFIZXgiLCAiQVNDSUlfSGV4X0RpZ2l0IiAqLworICAgIDc1LCAtNzcsICAgICAgICAgICAgLyogIDcyOiAiQmlkaV9DIiwgIkJpZGlfQ29udHJvbCIgKi8KKyAgICA3OCwgLTc5LCAgICAgICAgICAgIC8qICA3NDogIkJpZGlfTSIsICJCaWRpX01pcnJvcmVkIiAqLworICAgIDE0NCwgLTE0NCwgICAgICAgICAgLyogIDc2OiAiQ2FzZWQiLCAiQ2FzZWQiICovCisgICAgMTA2LCAtMTQyLCAgICAgICAgICAvKiAgNzg6ICJDSSIsICJDYXNlX0lnbm9yYWJsZSIgKi8KKyAgICA3MTIsIC0xNDMsICAgICAgICAgIC8qICA4MDogIlNlbnNpdGl2ZSIsICJDYXNlX1NlbnNpdGl2ZSIgKi8KKyAgICAxMjUsIC0xNDksICAgICAgICAgIC8qICA4MjogIkNXQ0YiLCAiQ2hhbmdlc19XaGVuX0Nhc2Vmb2xkZWQiICovCisgICAgMTI2LCAtMTUwLCAgICAgICAgICAvKiAgODQ6ICJDV0NNIiwgIkNoYW5nZXNfV2hlbl9DYXNlbWFwcGVkIiAqLworICAgIDEyOCwgLTE1MSwgICAgICAgICAgLyogIDg2OiAiQ1dMIiwgIkNoYW5nZXNfV2hlbl9Mb3dlcmNhc2VkIiAqLworICAgIDEyNywgLTE1MiwgICAgICAgICAgLyogIDg4OiAiQ1dLQ0YiLCAiQ2hhbmdlc19XaGVuX05GS0NfQ2FzZWZvbGRlZCIgKi8KKyAgICAxMjksIC0xNTMsICAgICAgICAgIC8qICA5MDogIkNXVCIsICJDaGFuZ2VzX1doZW5fVGl0bGVjYXNlZCIgKi8KKyAgICAxMzAsIC0xNTQsICAgICAgICAgIC8qICA5MjogIkNXVSIsICJDaGFuZ2VzX1doZW5fVXBwZXJjYXNlZCIgKi8KKyAgICAyMDUsIC0yMDUsICAgICAgICAgIC8qICA5NDogIkRhc2giLCAiRGFzaCIgKi8KKyAgICAyMDIsIC0yMTEsICAgICAgICAgIC8qICA5NjogIkRJIiwgIkRlZmF1bHRfSWdub3JhYmxlX0NvZGVfUG9pbnQiICovCisgICAgMjEyLCAtMjEzLCAgICAgICAgICAvKiAgOTg6ICJEZXAiLCAiRGVwcmVjYXRlZCIgKi8KKyAgICAyMTksIC0yMjAsICAgICAgICAgIC8qIDEwMDogIkRpYSIsICJEaWFjcml0aWMiICovCisgICAgMjU2LCAtMjU5LCAgICAgICAgICAvKiAxMDI6ICJFeHQiLCAiRXh0ZW5kZXIiICovCisgICAgMTc0LCAtMjc0LCAgICAgICAgICAvKiAxMDQ6ICJDb21wX0V4IiwgIkZ1bGxfQ29tcG9zaXRpb25fRXhjbHVzaW9uIiAqLworICAgIDI5MywgLTI5NywgICAgICAgICAgLyogMTA2OiAiR3JfQmFzZSIsICJHcmFwaGVtZV9CYXNlIiAqLworICAgIDI5NCwgLTI5OSwgICAgICAgICAgLyogMTA4OiAiR3JfRXh0IiwgIkdyYXBoZW1lX0V4dGVuZCIgKi8KKyAgICAyOTUsIC0zMDAsICAgICAgICAgIC8qIDExMDogIkdyX0xpbmsiLCAiR3JhcGhlbWVfTGluayIgKi8KKyAgICAzMzcsIC0zMzgsICAgICAgICAgIC8qIDExMjogIkhleCIsICJIZXhfRGlnaXQiICovCisgICAgMzQ2LCAtMzQ2LCAgICAgICAgICAvKiAxMTQ6ICJIeXBoZW4iLCAiSHlwaGVuIiAqLworICAgIDM2MCwgLTM2MSwgICAgICAgICAgLyogMTE2OiAiSWRlbyIsICJJZGVvZ3JhcGhpYyIgKi8KKyAgICAzNTAsIC0zNTIsICAgICAgICAgIC8qIDExODogIklEU0IiLCAiSURTX0JpbmFyeV9PcGVyYXRvciIgKi8KKyAgICAzNTEsIC0zNTMsICAgICAgICAgIC8qIDEyMDogIklEU1QiLCAiSURTX1RyaW5hcnlfT3BlcmF0b3IiICovCisgICAgMzQ4LCAtMzU0LCAgICAgICAgICAvKiAxMjI6ICJJREMiLCAiSURfQ29udGludWUiICovCisgICAgMzQ5LCAtMzU1LCAgICAgICAgICAvKiAxMjQ6ICJJRFMiLCAiSURfU3RhcnQiICovCisgICAgMzgzLCAtMzg1LCAgICAgICAgICAvKiAxMjY6ICJKb2luX0MiLCAiSm9pbl9Db250cm9sIiAqLworICAgIDQyMiwgLTQ3MSwgICAgICAgICAgLyogMTI4OiAiTE9FIiwgIkxvZ2ljYWxfT3JkZXJfRXhjZXB0aW9uIiAqLworICAgIDQ3NCwgLTQ3NSwgICAgICAgICAgLyogMTMwOiAiTG93ZXIiLCAiTG93ZXJjYXNlIiAqLworICAgIDQ5NSwgLTQ5NSwgICAgICAgICAgLyogMTMyOiAiTWF0aCIsICJNYXRoIiAqLworICAgIDkxOSwgLTUzNywgICAgICAgICAgLyogMTM0OiAibmZjaW5lcnQiLCAiTkZDX0luZXJ0IiAqLworICAgIDkyMCwgLTU0MCwgICAgICAgICAgLyogMTM2OiAibmZkaW5lcnQiLCAiTkZEX0luZXJ0IiAqLworICAgIDkyMSwgLTU0MywgICAgICAgICAgLyogMTM4OiAibmZrY2luZXJ0IiwgIk5GS0NfSW5lcnQiICovCisgICAgOTIyLCAtNTQ2LCAgICAgICAgICAvKiAxNDA6ICJuZmtkaW5lcnQiLCAiTkZLRF9JbmVydCIgKi8KKyAgICA1MzYsIC01NzcsICAgICAgICAgIC8qIDE0MjogIk5DaGFyIiwgIk5vbmNoYXJhY3Rlcl9Db2RlX1BvaW50IiAqLworICAgIDYyNywgLTYyOSwgICAgICAgICAgLyogMTQ0OiAiUGF0X1N5biIsICJQYXR0ZXJuX1N5bnRheCIgKi8KKyAgICA2MjgsIC02MzAsICAgICAgICAgIC8qIDE0NjogIlBhdF9XUyIsICJQYXR0ZXJuX1doaXRlX1NwYWNlIiAqLworICAgIDAsIC04ODUsICAgICAgICAgICAgLyogMTQ4OiAiIiwgImFsbnVtIiAqLworICAgIDAsIC04ODcsICAgICAgICAgICAgLyogMTUwOiAiIiwgImJsYW5rIiAqLworICAgIDAsIC05MDQsICAgICAgICAgICAgLyogMTUyOiAiIiwgImdyYXBoIiAqLworICAgIDAsIC05MjYsICAgICAgICAgICAgLyogMTU0OiAiIiwgInByaW50IiAqLworICAgIDAsIC05NDYsICAgICAgICAgICAgLyogMTU2OiAiIiwgInhkaWdpdCIgKi8KKyAgICA2NTksIC02NjYsICAgICAgICAgIC8qIDE1ODogIlFNYXJrIiwgIlF1b3RhdGlvbl9NYXJrIiAqLworICAgIDY3MCwgLTY3MCwgICAgICAgICAgLyogMTYwOiAiUmFkaWNhbCIsICJSYWRpY2FsIiAqLworICAgIDkzMSwgLTcxMCwgICAgICAgICAgLyogMTYyOiAic2Vnc3RhcnQiLCAiU2VnbWVudF9TdGFydGVyIiAqLworICAgIDY4OSwgLTczNCwgICAgICAgICAgLyogMTY0OiAiU0QiLCAiU29mdF9Eb3R0ZWQiICovCisgICAgNjk1LCAtNjk1LCAgICAgICAgICAvKiAxNjY6ICJTVGVybSIsICJTVGVybSIgKi8KKyAgICA3OTEsIC03OTIsICAgICAgICAgIC8qIDE2ODogIlRlcm0iLCAiVGVybWluYWxfUHVuY3R1YXRpb24iICovCisgICAgODEwLCAtODE4LCAgICAgICAgICAvKiAxNzA6ICJVSWRlbyIsICJVbmlmaWVkX0lkZW9ncmFwaCIgKi8KKyAgICA4MjAsIC04MjEsICAgICAgICAgIC8qIDE3MjogIlVwcGVyIiwgIlVwcGVyY2FzZSIgKi8KKyAgICA4MjYsIC04MjksICAgICAgICAgIC8qIDE3NDogIlZTIiwgIlZhcmlhdGlvbl9TZWxlY3RvciIgKi8KKyAgICA4NDMsIDg0NiwgLTkzNSwgICAgIC8qIDE3NjogIldTcGFjZSIsICJXaGl0ZV9TcGFjZSIsICJzcGFjZSIgKi8KKyAgICA4NTEsIC04NTMsICAgICAgICAgIC8qIDE3OTogIlhJREMiLCAiWElEX0NvbnRpbnVlIiAqLworICAgIDg1MiwgLTg1NCwgICAgICAgICAgLyogMTgxOiAiWElEUyIsICJYSURfU3RhcnQiICovCisgICAgOTI1LCAtNTkxLCAgICAgICAgICAvKiAxODM6ICJudiIsICJOdW1lcmljX1ZhbHVlIiAqLworICAgIDg4NiwgLTc2LCAgICAgICAgICAgLyogMTg1OiAiYmMiLCAiQmlkaV9DbGFzcyIgKi8KKyAgICA4ODgsIC04MiwgICAgICAgICAgIC8qIDE4NzogImJsayIsICJCbG9jayIgKi8KKyAgICA4OTEsIC0xMzYsICAgICAgICAgIC8qIDE4OTogImNjYyIsICJDYW5vbmljYWxfQ29tYmluaW5nX0NsYXNzIiAqLworICAgIDg5NiwgLTIxMCwgICAgICAgICAgLyogMTkxOiAiZHQiLCAiRGVjb21wb3NpdGlvbl9UeXBlIiAqLworICAgIDg5NywgLTIzNCwgICAgICAgICAgLyogMTkzOiAiZWEiLCAiRWFzdF9Bc2lhbl9XaWR0aCIgKi8KKyAgICA5MDIsIC0yODAsICAgICAgICAgIC8qIDE5NTogImdjIiwgIkdlbmVyYWxfQ2F0ZWdvcnkiICovCisgICAgMjc2LCAtMjk4LCAgICAgICAgICAvKiAxOTc6ICJHQ0IiLCAiR3JhcGhlbWVfQ2x1c3Rlcl9CcmVhayIgKi8KKyAgICA5MDUsIC0zMjQsICAgICAgICAgIC8qIDE5OTogImhzdCIsICJIYW5ndWxfU3lsbGFibGVfVHlwZSIgKi8KKyAgICA5MDksIC0zODYsICAgICAgICAgIC8qIDIwMTogImpnIiwgIkpvaW5pbmdfR3JvdXAiICovCisgICAgOTEwLCAtMzg3LCAgICAgICAgICAvKiAyMDM6ICJqdCIsICJKb2luaW5nX1R5cGUiICovCisgICAgOTEzLCAtNDQ1LCAgICAgICAgICAvKiAyMDU6ICJsY2NjIiwgIkxlYWRfQ2Fub25pY2FsX0NvbWJpbmluZ19DbGFzcyIgKi8KKyAgICA5MTEsIC00NjEsICAgICAgICAgIC8qIDIwNzogImxiIiwgIkxpbmVfQnJlYWsiICovCisgICAgNTM4LCAtNTM5LCAgICAgICAgICAvKiAyMDk6ICJORkNfUUMiLCAiTkZDX1F1aWNrX0NoZWNrIiAqLworICAgIDU0MSwgLTU0MiwgICAgICAgICAgLyogMjExOiAiTkZEX1FDIiwgIk5GRF9RdWlja19DaGVjayIgKi8KKyAgICA1NDQsIC01NDUsICAgICAgICAgIC8qIDIxMzogIk5GS0NfUUMiLCAiTkZLQ19RdWlja19DaGVjayIgKi8KKyAgICA1NDcsIC01NDgsICAgICAgICAgIC8qIDIxNTogIk5GS0RfUUMiLCAiTkZLRF9RdWlja19DaGVjayIgKi8KKyAgICA5MjQsIC01OTAsICAgICAgICAgIC8qIDIxNzogIm50IiwgIk51bWVyaWNfVHlwZSIgKi8KKyAgICA5MjgsIC03MDYsICAgICAgICAgIC8qIDIxOTogInNjIiwgIlNjcmlwdCIgKi8KKyAgICA2ODYsIC03MTMsICAgICAgICAgIC8qIDIyMTogIlNCIiwgIlNlbnRlbmNlX0JyZWFrIiAqLworICAgIDk0MiwgLTgwNCwgICAgICAgICAgLyogMjIzOiAidGNjYyIsICJUcmFpbF9DYW5vbmljYWxfQ29tYmluaW5nX0NsYXNzIiAqLworICAgIDg0MCwgLTg0OSwgICAgICAgICAgLyogMjI1OiAiV0IiLCAiV29yZF9CcmVhayIgKi8KKyAgICA5MDMsIC0yODEsICAgICAgICAgIC8qIDIyNzogImdjbSIsICJHZW5lcmFsX0NhdGVnb3J5X01hc2siICovCisgICAgOTMwLCAtNzA3LCAgICAgICAgICAvKiAyMjk6ICJzY3giLCAiU2NyaXB0X0V4dGVuc2lvbnMiICovCisgICAgODg0LCAtMjEsICAgICAgICAgICAvKiAyMzE6ICJhZ2UiLCAiQWdlIiAqLworICAgIDg4OSwgLTgwLCAgICAgICAgICAgLyogMjMzOiAiYm1nIiwgIkJpZGlfTWlycm9yaW5nX0dseXBoIiAqLworICAgIDg5MiwgLTE0MSwgICAgICAgICAgLyogMjM1OiAiY2YiLCAiQ2FzZV9Gb2xkaW5nIiAqLworICAgIDkwNywgLTM1OSwgICAgICAgICAgLyogMjM3OiAiaXNjIiwgIklTT19Db21tZW50IiAqLworICAgIDkxMiwgLTQ3NywgICAgICAgICAgLyogMjM5OiAibGMiLCAiTG93ZXJjYXNlX01hcHBpbmciICovCisgICAgOTE1LCAtNTU3LCAgICAgICAgICAvKiAyNDE6ICJuYSIsICJOYW1lIiAqLworICAgIDkyOSwgNzIxLCAtOTMyLCAgICAgLyogMjQzOiAic2NmIiwgIlNpbXBsZV9DYXNlX0ZvbGRpbmciLCAic2ZjIiAqLworICAgIDkzMywgLTcyMiwgICAgICAgICAgLyogMjQ2OiAic2xjIiwgIlNpbXBsZV9Mb3dlcmNhc2VfTWFwcGluZyIgKi8KKyAgICA5MzcsIC03MjMsICAgICAgICAgIC8qIDI0ODogInN0YyIsICJTaW1wbGVfVGl0bGVjYXNlX01hcHBpbmciICovCisgICAgOTM5LCAtNzI0LCAgICAgICAgICAvKiAyNTA6ICJzdWMiLCAiU2ltcGxlX1VwcGVyY2FzZV9NYXBwaW5nIiAqLworICAgIDk0MSwgLTgwMywgICAgICAgICAgLyogMjUyOiAidGMiLCAiVGl0bGVjYXNlX01hcHBpbmciICovCisgICAgOTE2LCAtODE1LCAgICAgICAgICAvKiAyNTQ6ICJuYTEiLCAiVW5pY29kZV8xX05hbWUiICovCisgICAgOTQzLCAtODIzLCAgICAgICAgICAvKiAyNTY6ICJ1YyIsICJVcHBlcmNhc2VfTWFwcGluZyIgKi8KKyAgICA2LCAtMzYsICAgICAgICAgICAgIC8qIDI1ODogIkFOIiwgIkFyYWJpY19OdW1iZXIiICovCisgICAgNTEsIC02MjYsICAgICAgICAgICAvKiAyNjA6ICJCIiwgIlBhcmFncmFwaF9TZXBhcmF0b3IiICovCisgICAgNTcsIC04NywgICAgICAgICAgICAvKiAyNjI6ICJCTiIsICJCb3VuZGFyeV9OZXV0cmFsIiAqLworICAgIDEyNCwgLTE3MywgICAgICAgICAgLyogMjY0OiAiQ1MiLCAiQ29tbW9uX1NlcGFyYXRvciIgKi8KKyAgICA1NTQsIC01NzksICAgICAgICAgIC8qIDI2NjogIk5TTSIsICJOb25zcGFjaW5nX01hcmsiICovCisgICAgMjMwLCAtMjUyLCAgICAgICAgICAvKiAyNjg6ICJFTiIsICJFdXJvcGVhbl9OdW1iZXIiICovCisgICAgMjMxLCAtMjUzLCAgICAgICAgICAvKiAyNzA6ICJFUyIsICJFdXJvcGVhbl9TZXBhcmF0b3IiICovCisgICAgMjMyLCAtMjU0LCAgICAgICAgICAvKiAyNzI6ICJFVCIsICJFdXJvcGVhbl9UZXJtaW5hdG9yIiAqLworICAgIDQxNywgLTQ0OSwgICAgICAgICAgLyogMjc0OiAiTCIsICJMZWZ0X1RvX1JpZ2h0IiAqLworICAgIDQyMywgLTQ1MCwgICAgICAgICAgLyogMjc2OiAiTFJFIiwgIkxlZnRfVG9fUmlnaHRfRW1iZWRkaW5nIiAqLworICAgIDQyNCwgLTQ1MSwgICAgICAgICAgLyogMjc4OiAiTFJPIiwgIkxlZnRfVG9fUmlnaHRfT3ZlcnJpZGUiICovCisgICAgNTk1LCAtNjE1LCAgICAgICAgICAvKiAyODA6ICJPTiIsICJPdGhlcl9OZXV0cmFsIiAqLworICAgIDYyMSwgLTY1MCwgICAgICAgICAgLyogMjgyOiAiUERGIiwgIlBvcF9EaXJlY3Rpb25hbF9Gb3JtYXQiICovCisgICAgNjY3LCAtNjc2LCAgICAgICAgICAvKiAyODQ6ICJSIiwgIlJpZ2h0X1RvX0xlZnQiICovCisgICAgNCwgLTM1LCAgICAgICAgICAgICAvKiAyODY6ICJBTCIsICJBcmFiaWNfTGV0dGVyIiAqLworICAgIDY2OCwgLTY3NywgICAgICAgICAgLyogMjg4OiAiUkxFIiwgIlJpZ2h0X1RvX0xlZnRfRW1iZWRkaW5nIiAqLworICAgIDY2OSwgLTY3OCwgICAgICAgICAgLyogMjkwOiAiUkxPIiwgIlJpZ2h0X1RvX0xlZnRfT3ZlcnJpZGUiICovCisgICAgNjg0LCAtNzA5LCAgICAgICAgICAvKiAyOTI6ICJTIiwgIlNlZ21lbnRfU2VwYXJhdG9yIiAqLworICAgIDg0MiwgLTg0NiwgICAgICAgICAgLyogMjk0OiAiV1MiLCAiV2hpdGVfU3BhY2UiICovCisgICAgNTM0LCA1NzIsIDI2MCwgLTI2MiwgLyogMjk2OiAiTiIsICJObyIsICJGIiwgIkZhbHNlIiAqLworICAgIDg1OCwgODYyLCA3NjgsIC04MDgsIC8qIDMwMDogIlkiLCAiWWVzIiwgIlQiLCAiVHJ1ZSIgKi8KKyAgICAwLCAtMTksICAgICAgICAgICAgIC8qIDMwNDogIiIsICJBZWdlYW5fTnVtYmVycyIgKi8KKyAgICAwLCAtMjQsICAgICAgICAgICAgIC8qIDMwNjogIiIsICJBbGNoZW1pY2FsX1N5bWJvbHMiICovCisgICAgMCwgLTI4LCAgICAgICAgICAgICAvKiAzMDg6ICIiLCAiQWxwaGFiZXRpY19QcmVzZW50YXRpb25fRm9ybXMiICovCisgICAgMCwgLTMwLCAgICAgICAgICAgICAvKiAzMTA6ICIiLCAiQW5jaWVudF9HcmVla19NdXNpY2FsX05vdGF0aW9uIiAqLworICAgIDAsIC0zMSwgICAgICAgICAgICAgLyogMzEyOiAiIiwgIkFuY2llbnRfR3JlZWtfTnVtYmVycyIgKi8KKyAgICAwLCAtMzIsICAgICAgICAgICAgIC8qIDMxNDogIiIsICJBbmNpZW50X1N5bWJvbHMiICovCisgICAgMCwgLTM0LCAgICAgICAgICAgICAvKiAzMTY6ICIiLCAiQXJhYmljIiAqLworICAgIDAsIDM4LCAtMzcsICAgICAgICAgLyogMzE4OiAiIiwgIkFyYWJpY19QcmVzZW50YXRpb25fRm9ybXNfQSIsICJBcmFiaWNfUHJlc2VudGF0aW9uX0Zvcm1zLUEiICovCisgICAgMCwgLTM5LCAgICAgICAgICAgICAvKiAzMjE6ICIiLCAiQXJhYmljX1ByZXNlbnRhdGlvbl9Gb3Jtc19CIiAqLworICAgIDAsIC00MCwgICAgICAgICAgICAgLyogMzIzOiAiIiwgIkFyYWJpY19TdXBwbGVtZW50IiAqLworICAgIDAsIC00MSwgICAgICAgICAgICAgLyogMzI1OiAiIiwgIkFybWVuaWFuIiAqLworICAgIDAsIC00NCwgICAgICAgICAgICAgLyogMzI3OiAiIiwgIkFycm93cyIgKi8KKyAgICAwLCAtNDksICAgICAgICAgICAgIC8qIDMyOTogIiIsICJBdmVzdGFuIiAqLworICAgIDAsIC02MCwgICAgICAgICAgICAgLyogMzMxOiAiIiwgIkJhbGluZXNlIiAqLworICAgIDAsIC02MiwgICAgICAgICAgICAgLyogMzMzOiAiIiwgIkJhbXVtIiAqLworICAgIDAsIC02MywgICAgICAgICAgICAgLyogMzM1OiAiIiwgIkJhbXVtX1N1cHBsZW1lbnQiICovCisgICAgMCwgNjQsIC04LCAgICAgICAgICAvKiAzMzc6ICIiLCAiQmFzaWNfTGF0aW4iLCAiQVNDSUkiICovCisgICAgMCwgLTY2LCAgICAgICAgICAgICAvKiAzNDA6ICIiLCAiQmF0YWsiICovCisgICAgMCwgLTczLCAgICAgICAgICAgICAvKiAzNDI6ICIiLCAiQmVuZ2FsaSIgKi8KKyAgICAwLCAtODMsICAgICAgICAgICAgIC8qIDM0NDogIiIsICJCbG9ja19FbGVtZW50cyIgKi8KKyAgICAwLCAtODUsICAgICAgICAgICAgIC8qIDM0NjogIiIsICJCb3BvbW9mbyIgKi8KKyAgICAwLCAtODYsICAgICAgICAgICAgIC8qIDM0ODogIiIsICJCb3BvbW9mb19FeHRlbmRlZCIgKi8KKyAgICAwLCAtODgsICAgICAgICAgICAgIC8qIDM1MDogIiIsICJCb3hfRHJhd2luZyIgKi8KKyAgICAwLCAtOTAsICAgICAgICAgICAgIC8qIDM1MjogIiIsICJCcmFobWkiICovCisgICAgMCwgLTkzLCAgICAgICAgICAgICAvKiAzNTQ6ICIiLCAiQnJhaWxsZV9QYXR0ZXJucyIgKi8KKyAgICAwLCAtOTksICAgICAgICAgICAgIC8qIDM1NjogIiIsICJCdWdpbmVzZSIgKi8KKyAgICAwLCAtMTAxLCAgICAgICAgICAgIC8qIDM1ODogIiIsICJCdWhpZCIgKi8KKyAgICAwLCAtMTAzLCAgICAgICAgICAgIC8qIDM2MDogIiIsICJCeXphbnRpbmVfTXVzaWNhbF9TeW1ib2xzIiAqLworICAgIDAsIC0xMzksICAgICAgICAgICAgLyogMzYyOiAiIiwgIkNhcmlhbiIgKi8KKyAgICAwLCAtMTQ4LCAgICAgICAgICAgIC8qIDM2NDogIiIsICJDaGFtIiAqLworICAgIDAsIC0xNTYsICAgICAgICAgICAgLyogMzY2OiAiIiwgIkNoZXJva2VlIiAqLworICAgIDAsIC0xMDcsICAgICAgICAgICAgLyogMzY4OiAiIiwgIkNKS19Db21wYXRpYmlsaXR5IiAqLworICAgIDAsIC0xMDgsICAgICAgICAgICAgLyogMzcwOiAiIiwgIkNKS19Db21wYXRpYmlsaXR5X0Zvcm1zIiAqLworICAgIDAsIC0xMDksICAgICAgICAgICAgLyogMzcyOiAiIiwgIkNKS19Db21wYXRpYmlsaXR5X0lkZW9ncmFwaHMiICovCisgICAgMCwgLTExMCwgICAgICAgICAgICAvKiAzNzQ6ICIiLCAiQ0pLX0NvbXBhdGliaWxpdHlfSWRlb2dyYXBoc19TdXBwbGVtZW50IiAqLworICAgIDAsIC0xMTEsICAgICAgICAgICAgLyogMzc2OiAiIiwgIkNKS19SYWRpY2Fsc19TdXBwbGVtZW50IiAqLworICAgIDAsIC0xMTIsICAgICAgICAgICAgLyogMzc4OiAiIiwgIkNKS19TdHJva2VzIiAqLworICAgIDAsIC0xMTMsICAgICAgICAgICAgLyogMzgwOiAiIiwgIkNKS19TeW1ib2xzX0FuZF9QdW5jdHVhdGlvbiIgKi8KKyAgICAwLCAtMTE0LCAgICAgICAgICAgIC8qIDM4MjogIiIsICJDSktfVW5pZmllZF9JZGVvZ3JhcGhzIiAqLworICAgIDAsIC0xMTUsICAgICAgICAgICAgLyogMzg0OiAiIiwgIkNKS19VbmlmaWVkX0lkZW9ncmFwaHNfRXh0ZW5zaW9uX0EiICovCisgICAgMCwgLTExNiwgICAgICAgICAgICAvKiAzODY6ICIiLCAiQ0pLX1VuaWZpZWRfSWRlb2dyYXBoc19FeHRlbnNpb25fQiIgKi8KKyAgICAwLCAtMTE3LCAgICAgICAgICAgIC8qIDM4ODogIiIsICJDSktfVW5pZmllZF9JZGVvZ3JhcGhzX0V4dGVuc2lvbl9DIiAqLworICAgIDAsIC0xMTgsICAgICAgICAgICAgLyogMzkwOiAiIiwgIkNKS19VbmlmaWVkX0lkZW9ncmFwaHNfRXh0ZW5zaW9uX0QiICovCisgICAgMCwgLTE2NSwgICAgICAgICAgICAvKiAzOTI6ICIiLCAiQ29tYmluaW5nX0RpYWNyaXRpY2FsX01hcmtzIiAqLworICAgIDAsIC0xNjcsICAgICAgICAgICAgLyogMzk0OiAiIiwgIkNvbWJpbmluZ19EaWFjcml0aWNhbF9NYXJrc19TdXBwbGVtZW50IiAqLworICAgIDAsIC0xNjgsICAgICAgICAgICAgLyogMzk2OiAiIiwgIkNvbWJpbmluZ19IYWxmX01hcmtzIiAqLworICAgIDAsIDE2NiwgLTE3MCwgICAgICAgLyogMzk4OiAiIiwgIkNvbWJpbmluZ19EaWFjcml0aWNhbF9NYXJrc19Gb3JfU3ltYm9scyIsICJDb21iaW5pbmdfTWFya3NfRm9yX1N5bWJvbHMiICovCisgICAgMCwgLTE3MiwgICAgICAgICAgICAvKiA0MDE6ICIiLCAiQ29tbW9uX0luZGljX051bWJlcl9Gb3JtcyIgKi8KKyAgICAwLCAtMTgwLCAgICAgICAgICAgIC8qIDQwMzogIiIsICJDb250cm9sX1BpY3R1cmVzIiAqLworICAgIDAsIC0xODIsICAgICAgICAgICAgLyogNDA1OiAiIiwgIkNvcHRpYyIgKi8KKyAgICAwLCAtMTgzLCAgICAgICAgICAgIC8qIDQwNzogIiIsICJDb3VudGluZ19Sb2RfTnVtZXJhbHMiICovCisgICAgMCwgLTE4NiwgICAgICAgICAgICAvKiA0MDk6ICIiLCAiQ3VuZWlmb3JtIiAqLworICAgIDAsIC0xODcsICAgICAgICAgICAgLyogNDExOiAiIiwgIkN1bmVpZm9ybV9OdW1iZXJzX0FuZF9QdW5jdHVhdGlvbiIgKi8KKyAgICAwLCAtMTg5LCAgICAgICAgICAgIC8qIDQxMzogIiIsICJDdXJyZW5jeV9TeW1ib2xzIiAqLworICAgIDAsIC0xOTEsICAgICAgICAgICAgLyogNDE1OiAiIiwgIkN5cHJpb3RfU3lsbGFiYXJ5IiAqLworICAgIDAsIC0xOTIsICAgICAgICAgICAgLyogNDE3OiAiIiwgIkN5cmlsbGljIiAqLworICAgIDAsIC0xOTMsICAgICAgICAgICAgLyogNDE5OiAiIiwgIkN5cmlsbGljX0V4dGVuZGVkX0EiICovCisgICAgMCwgLTE5NCwgICAgICAgICAgICAvKiA0MjE6ICIiLCAiQ3lyaWxsaWNfRXh0ZW5kZWRfQiIgKi8KKyAgICAwLCAxOTUsIC0xOTYsICAgICAgIC8qIDQyMzogIiIsICJDeXJpbGxpY19TdXBwbGVtZW50IiwgIkN5cmlsbGljX1N1cHBsZW1lbnRhcnkiICovCisgICAgMCwgLTIxNCwgICAgICAgICAgICAvKiA0MjY6ICIiLCAiRGVzZXJldCIgKi8KKyAgICAwLCAtMjE2LCAgICAgICAgICAgIC8qIDQyODogIiIsICJEZXZhbmFnYXJpIiAqLworICAgIDAsIC0yMTcsICAgICAgICAgICAgLyogNDMwOiAiIiwgIkRldmFuYWdhcmlfRXh0ZW5kZWQiICovCisgICAgMCwgLTIyMiwgICAgICAgICAgICAvKiA0MzI6ICIiLCAiRGluZ2JhdHMiICovCisgICAgMCwgLTIyMywgICAgICAgICAgICAvKiA0MzQ6ICIiLCAiRG9taW5vX1RpbGVzIiAqLworICAgIDAsIC0yMzgsICAgICAgICAgICAgLyogNDM2OiAiIiwgIkVneXB0aWFuX0hpZXJvZ2x5cGhzIiAqLworICAgIDAsIC0yNDAsICAgICAgICAgICAgLyogNDM4OiAiIiwgIkVtb3RpY29ucyIgKi8KKyAgICAwLCAtMjQzLCAgICAgICAgICAgIC8qIDQ0MDogIiIsICJFbmNsb3NlZF9BbHBoYW51bWVyaWNzIiAqLworICAgIDAsIC0yNDIsICAgICAgICAgICAgLyogNDQyOiAiIiwgIkVuY2xvc2VkX0FscGhhbnVtZXJpY19TdXBwbGVtZW50IiAqLworICAgIDAsIC0yNDQsICAgICAgICAgICAgLyogNDQ0OiAiIiwgIkVuY2xvc2VkX0NKS19MZXR0ZXJzX0FuZF9Nb250aHMiICovCisgICAgMCwgLTI0NSwgICAgICAgICAgICAvKiA0NDY6ICIiLCAiRW5jbG9zZWRfSWRlb2dyYXBoaWNfU3VwcGxlbWVudCIgKi8KKyAgICAwLCAtMjQ4LCAgICAgICAgICAgIC8qIDQ0ODogIiIsICJFdGhpb3BpYyIgKi8KKyAgICAwLCAtMjQ5LCAgICAgICAgICAgIC8qIDQ1MDogIiIsICJFdGhpb3BpY19FeHRlbmRlZCIgKi8KKyAgICAwLCAtMjUwLCAgICAgICAgICAgIC8qIDQ1MjogIiIsICJFdGhpb3BpY19FeHRlbmRlZF9BIiAqLworICAgIDAsIC0yNTEsICAgICAgICAgICAgLyogNDU0OiAiIiwgIkV0aGlvcGljX1N1cHBsZW1lbnQiICovCisgICAgMCwgLTI4MiwgICAgICAgICAgICAvKiA0NTY6ICIiLCAiR2VuZXJhbF9QdW5jdHVhdGlvbiIgKi8KKyAgICAwLCAtMjg0LCAgICAgICAgICAgIC8qIDQ1ODogIiIsICJHZW9tZXRyaWNfU2hhcGVzIiAqLworICAgIDAsIC0yODYsICAgICAgICAgICAgLyogNDYwOiAiIiwgIkdlb3JnaWFuIiAqLworICAgIDAsIC0yODcsICAgICAgICAgICAgLyogNDYyOiAiIiwgIkdlb3JnaWFuX1N1cHBsZW1lbnQiICovCisgICAgMCwgLTI4OSwgICAgICAgICAgICAvKiA0NjQ6ICIiLCAiR2xhZ29saXRpYyIgKi8KKyAgICAwLCAtMjkyLCAgICAgICAgICAgIC8qIDQ2NjogIiIsICJHb3RoaWMiICovCisgICAgMCwgMzAyLCAtMzAxLCAgICAgICAvKiA0Njg6ICIiLCAiR3JlZWtfQW5kX0NvcHRpYyIsICJHcmVlayIgKi8KKyAgICAwLCAtMzAzLCAgICAgICAgICAgIC8qIDQ3MTogIiIsICJHcmVla19FeHRlbmRlZCIgKi8KKyAgICAwLCAtMzA1LCAgICAgICAgICAgIC8qIDQ3MzogIiIsICJHdWphcmF0aSIgKi8KKyAgICAwLCAtMzA3LCAgICAgICAgICAgIC8qIDQ3NTogIiIsICJHdXJtdWtoaSIgKi8KKyAgICAwLCAtMzE1LCAgICAgICAgICAgIC8qIDQ3NzogIiIsICJIYWxmd2lkdGhfQW5kX0Z1bGx3aWR0aF9Gb3JtcyIgKi8KKyAgICAwLCAtMzIwLCAgICAgICAgICAgIC8qIDQ3OTogIiIsICJIYW5ndWxfQ29tcGF0aWJpbGl0eV9KYW1vIiAqLworICAgIDAsIC0zMjEsICAgICAgICAgICAgLyogNDgxOiAiIiwgIkhhbmd1bF9KYW1vIiAqLworICAgIDAsIC0zMjIsICAgICAgICAgICAgLyogNDgzOiAiIiwgIkhhbmd1bF9KYW1vX0V4dGVuZGVkX0EiICovCisgICAgMCwgLTMyMywgICAgICAgICAgICAvKiA0ODU6ICIiLCAiSGFuZ3VsX0phbW9fRXh0ZW5kZWRfQiIgKi8KKyAgICAwLCAtMzI1LCAgICAgICAgICAgIC8qIDQ4NzogIiIsICJIYW5ndWxfU3lsbGFibGVzIiAqLworICAgIDAsIC0zMzAsICAgICAgICAgICAgLyogNDg5OiAiIiwgIkhhbnVub28iICovCisgICAgMCwgLTMzMywgICAgICAgICAgICAvKiA0OTE6ICIiLCAiSGVicmV3IiAqLworICAgIDAsIC0zMzksICAgICAgICAgICAgLyogNDkzOiAiIiwgIkhpZ2hfUHJpdmF0ZV9Vc2VfU3Vycm9nYXRlcyIgKi8KKyAgICAwLCAtMzQwLCAgICAgICAgICAgIC8qIDQ5NTogIiIsICJIaWdoX1N1cnJvZ2F0ZXMiICovCisgICAgMCwgLTM0MiwgICAgICAgICAgICAvKiA0OTc6ICIiLCAiSGlyYWdhbmEiICovCisgICAgMCwgLTM2MiwgICAgICAgICAgICAvKiA0OTk6ICIiLCAiSWRlb2dyYXBoaWNfRGVzY3JpcHRpb25fQ2hhcmFjdGVycyIgKi8KKyAgICAwLCAtMzYzLCAgICAgICAgICAgIC8qIDUwMTogIiIsICJJbXBlcmlhbF9BcmFtYWljIiAqLworICAgIDAsIC0zNzAsICAgICAgICAgICAgLyogNTAzOiAiIiwgIkluc2NyaXB0aW9uYWxfUGFobGF2aSIgKi8KKyAgICAwLCAtMzcxLCAgICAgICAgICAgIC8qIDUwNTogIiIsICJJbnNjcmlwdGlvbmFsX1BhcnRoaWFuIiAqLworICAgIDAsIC0zNTcsICAgICAgICAgICAgLyogNTA3OiAiIiwgIklQQV9FeHRlbnNpb25zIiAqLworICAgIDAsIC0zODIsICAgICAgICAgICAgLyogNTA5OiAiIiwgIkphdmFuZXNlIiAqLworICAgIDAsIC0zOTMsICAgICAgICAgICAgLyogNTExOiAiIiwgIkthaXRoaSIgKi8KKyAgICAwLCAtMzk2LCAgICAgICAgICAgIC8qIDUxMzogIiIsICJLYW5hX1N1cHBsZW1lbnQiICovCisgICAgMCwgLTM5OCwgICAgICAgICAgICAvKiA1MTU6ICIiLCAiS2FuYnVuIiAqLworICAgIDAsIC0zOTksICAgICAgICAgICAgLyogNTE3OiAiIiwgIkthbmd4aV9SYWRpY2FscyIgKi8KKyAgICAwLCAtNDAwLCAgICAgICAgICAgIC8qIDUxOTogIiIsICJLYW5uYWRhIiAqLworICAgIDAsIC00MDIsICAgICAgICAgICAgLyogNTIxOiAiIiwgIkthdGFrYW5hIiAqLworICAgIDAsIC00MDQsICAgICAgICAgICAgLyogNTIzOiAiIiwgIkthdGFrYW5hX1Bob25ldGljX0V4dGVuc2lvbnMiICovCisgICAgMCwgLTQwNSwgICAgICAgICAgICAvKiA1MjU6ICIiLCAiS2F5YWhfTGkiICovCisgICAgMCwgLTQwOCwgICAgICAgICAgICAvKiA1Mjc6ICIiLCAiS2hhcm9zaHRoaSIgKi8KKyAgICAwLCAtNDA5LCAgICAgICAgICAgIC8qIDUyOTogIiIsICJLaG1lciIgKi8KKyAgICAwLCAtNDEwLCAgICAgICAgICAgIC8qIDUzMTogIiIsICJLaG1lcl9TeW1ib2xzIiAqLworICAgIDAsIC00MzIsICAgICAgICAgICAgLyogNTMzOiAiIiwgIkxhbyIgKi8KKyAgICAwLCA0MzgsIC00MzcsICAgICAgIC8qIDUzNTogIiIsICJMYXRpbl8xX1N1cHBsZW1lbnQiLCAiTGF0aW5fMSIgKi8KKyAgICAwLCAtNDM5LCAgICAgICAgICAgIC8qIDUzODogIiIsICJMYXRpbl9FeHRlbmRlZF9BIiAqLworICAgIDAsIC00NDAsICAgICAgICAgICAgLyogNTQwOiAiIiwgIkxhdGluX0V4dGVuZGVkX0FkZGl0aW9uYWwiICovCisgICAgMCwgLTQ0MSwgICAgICAgICAgICAvKiA1NDI6ICIiLCAiTGF0aW5fRXh0ZW5kZWRfQiIgKi8KKyAgICAwLCAtNDQyLCAgICAgICAgICAgIC8qIDU0NDogIiIsICJMYXRpbl9FeHRlbmRlZF9DIiAqLworICAgIDAsIC00NDMsICAgICAgICAgICAgLyogNTQ2OiAiIiwgIkxhdGluX0V4dGVuZGVkX0QiICovCisgICAgMCwgLTQ1MywgICAgICAgICAgICAvKiA1NDg6ICIiLCAiTGVwY2hhIiAqLworICAgIDAsIC00NTYsICAgICAgICAgICAgLyogNTUwOiAiIiwgIkxldHRlcmxpa2VfU3ltYm9scyIgKi8KKyAgICAwLCAtNDU4LCAgICAgICAgICAgIC8qIDU1MjogIiIsICJMaW1idSIgKi8KKyAgICAwLCAtNDY1LCAgICAgICAgICAgIC8qIDU1NDogIiIsICJMaW5lYXJfQl9JZGVvZ3JhbXMiICovCisgICAgMCwgLTQ2NiwgICAgICAgICAgICAvKiA1NTY6ICIiLCAiTGluZWFyX0JfU3lsbGFiYXJ5IiAqLworICAgIDAsIC00NjcsICAgICAgICAgICAgLyogNTU4OiAiIiwgIkxpc3UiICovCisgICAgMCwgLTQ3MywgICAgICAgICAgICAvKiA1NjA6ICIiLCAiTG93X1N1cnJvZ2F0ZXMiICovCisgICAgMCwgLTQ4MSwgICAgICAgICAgICAvKiA1NjI6ICIiLCAiTHljaWFuIiAqLworICAgIDAsIC00ODMsICAgICAgICAgICAgLyogNTY0OiAiIiwgIkx5ZGlhbiIgKi8KKyAgICAwLCAtNDg4LCAgICAgICAgICAgIC8qIDU2NjogIiIsICJNYWhqb25nX1RpbGVzIiAqLworICAgIDAsIC00ODksICAgICAgICAgICAgLyogNTY4OiAiIiwgIk1hbGF5YWxhbSIgKi8KKyAgICAwLCAtNDkxLCAgICAgICAgICAgIC8qIDU3MDogIiIsICJNYW5kYWljIiAqLworICAgIDAsIC00OTcsICAgICAgICAgICAgLyogNTcyOiAiIiwgIk1hdGhlbWF0aWNhbF9BbHBoYW51bWVyaWNfU3ltYm9scyIgKi8KKyAgICAwLCAtNDk4LCAgICAgICAgICAgIC8qIDU3NDogIiIsICJNYXRoZW1hdGljYWxfT3BlcmF0b3JzIiAqLworICAgIDAsIC01MDYsICAgICAgICAgICAgLyogNTc2OiAiIiwgIk1lZXRlaV9NYXllayIgKi8KKyAgICAwLCAtNTE0LCAgICAgICAgICAgIC8qIDU3ODogIiIsICJNaXNjZWxsYW5lb3VzX01hdGhlbWF0aWNhbF9TeW1ib2xzX0EiICovCisgICAgMCwgLTUxNSwgICAgICAgICAgICAvKiA1ODA6ICIiLCAiTWlzY2VsbGFuZW91c19NYXRoZW1hdGljYWxfU3ltYm9sc19CIiAqLworICAgIDAsIC01MTYsICAgICAgICAgICAgLyogNTgyOiAiIiwgIk1pc2NlbGxhbmVvdXNfU3ltYm9scyIgKi8KKyAgICAwLCAtNTE3LCAgICAgICAgICAgIC8qIDU4NDogIiIsICJNaXNjZWxsYW5lb3VzX1N5bWJvbHNfQW5kX0Fycm93cyIgKi8KKyAgICAwLCAtNTE4LCAgICAgICAgICAgIC8qIDU4NjogIiIsICJNaXNjZWxsYW5lb3VzX1N5bWJvbHNfQW5kX1BpY3RvZ3JhcGhzIiAqLworICAgIDAsIC01MTksICAgICAgICAgICAgLyogNTg4OiAiIiwgIk1pc2NlbGxhbmVvdXNfVGVjaG5pY2FsIiAqLworICAgIDAsIC01MjQsICAgICAgICAgICAgLyogNTkwOiAiIiwgIk1vZGlmaWVyX1RvbmVfTGV0dGVycyIgKi8KKyAgICAwLCAtNTI2LCAgICAgICAgICAgIC8qIDU5MjogIiIsICJNb25nb2xpYW4iICovCisgICAgMCwgLTUzMCwgICAgICAgICAgICAvKiA1OTQ6ICIiLCAiTXVzaWNhbF9TeW1ib2xzIiAqLworICAgIDAsIC01MzEsICAgICAgICAgICAgLyogNTk2OiAiIiwgIk15YW5tYXIiICovCisgICAgMCwgLTUzMiwgICAgICAgICAgICAvKiA1OTg6ICIiLCAiTXlhbm1hcl9FeHRlbmRlZF9BIiAqLworICAgIDAsIC01NjUsICAgICAgICAgICAgLyogNjAwOiAiIiwgIk5ld19UYWlfTHVlIiAqLworICAgIDAsIC01NTAsICAgICAgICAgICAgLyogNjAyOiAiIiwgIk5LbyIgKi8KKyAgICAwLCAtNTczLCAgICAgICAgICAgIC8qIDYwNDogIiIsICJOb19CbG9jayIgKi8KKyAgICAwLCAtNTg4LCAgICAgICAgICAgIC8qIDYwNjogIiIsICJOdW1iZXJfRm9ybXMiICovCisgICAgMCwgLTU5OSwgICAgICAgICAgICAvKiA2MDg6ICIiLCAiT2doYW0iICovCisgICAgMCwgLTYwMiwgICAgICAgICAgICAvKiA2MTA6ICIiLCAiT2xkX0l0YWxpYyIgKi8KKyAgICAwLCAtNjAzLCAgICAgICAgICAgIC8qIDYxMjogIiIsICJPbGRfUGVyc2lhbiIgKi8KKyAgICAwLCAtNjA0LCAgICAgICAgICAgIC8qIDYxNDogIiIsICJPbGRfU291dGhfQXJhYmlhbiIgKi8KKyAgICAwLCAtNjA1LCAgICAgICAgICAgIC8qIDYxNjogIiIsICJPbGRfVHVya2ljIiAqLworICAgIDAsIC02MDAsICAgICAgICAgICAgLyogNjE4OiAiIiwgIk9sX0NoaWtpIiAqLworICAgIDAsIC02MDcsICAgICAgICAgICAgLyogNjIwOiAiIiwgIk9wdGljYWxfQ2hhcmFjdGVyX1JlY29nbml0aW9uIiAqLworICAgIDAsIC02MDgsICAgICAgICAgICAgLyogNjIyOiAiIiwgIk9yaXlhIiAqLworICAgIDAsIC02MTIsICAgICAgICAgICAgLyogNjI0OiAiIiwgIk9zbWFueWEiICovCisgICAgMCwgLTYzNywgICAgICAgICAgICAvKiA2MjY6ICIiLCAiUGhhZ3NfUGEiICovCisgICAgMCwgLTYzOCwgICAgICAgICAgICAvKiA2Mjg6ICIiLCAiUGhhaXN0b3NfRGlzYyIgKi8KKyAgICAwLCAtNjQzLCAgICAgICAgICAgIC8qIDYzMDogIiIsICJQaG9lbmljaWFuIiAqLworICAgIDAsIC02NDQsICAgICAgICAgICAgLyogNjMyOiAiIiwgIlBob25ldGljX0V4dGVuc2lvbnMiICovCisgICAgMCwgLTY0NSwgICAgICAgICAgICAvKiA2MzQ6ICIiLCAiUGhvbmV0aWNfRXh0ZW5zaW9uc19TdXBwbGVtZW50IiAqLworICAgIDAsIC02NDcsICAgICAgICAgICAgLyogNjM2OiAiIiwgIlBsYXlpbmdfQ2FyZHMiICovCisgICAgMCwgNjU1LCAtNjU0LCAgICAgICAvKiA2Mzg6ICIiLCAiUHJpdmF0ZV9Vc2VfQXJlYSIsICJQcml2YXRlX1VzZSIgKi8KKyAgICAwLCAtNjcyLCAgICAgICAgICAgIC8qIDY0MTogIiIsICJSZWphbmciICovCisgICAgMCwgLTY4MSwgICAgICAgICAgICAvKiA2NDM6ICIiLCAiUnVtaV9OdW1lcmFsX1N5bWJvbHMiICovCisgICAgMCwgLTY4MiwgICAgICAgICAgICAvKiA2NDU6ICIiLCAiUnVuaWMiICovCisgICAgMCwgLTY5OSwgICAgICAgICAgICAvKiA2NDc6ICIiLCAiU2FtYXJpdGFuIiAqLworICAgIDAsIC03MDQsICAgICAgICAgICAgLyogNjQ5OiAiIiwgIlNhdXJhc2h0cmEiICovCisgICAgMCwgLTcxNywgICAgICAgICAgICAvKiA2NTE6ICIiLCAiU2hhdmlhbiIgKi8KKyAgICAwLCAtNzI3LCAgICAgICAgICAgIC8qIDY1MzogIiIsICJTaW5oYWxhIiAqLworICAgIDAsIC03MzEsICAgICAgICAgICAgLyogNjU1OiAiIiwgIlNtYWxsX0Zvcm1fVmFyaWFudHMiICovCisgICAgMCwgLTc0MSwgICAgICAgICAgICAvKiA2NTc6ICIiLCAiU3BhY2luZ19Nb2RpZmllcl9MZXR0ZXJzIiAqLworICAgIDAsIC03NDIsICAgICAgICAgICAgLyogNjU5OiAiIiwgIlNwZWNpYWxzIiAqLworICAgIDAsIC03NDcsICAgICAgICAgICAgLyogNjYxOiAiIiwgIlN1bmRhbmVzZSIgKi8KKyAgICAwLCAtNzUwLCAgICAgICAgICAgIC8qIDY2MzogIiIsICJTdXBlcnNjcmlwdHNfQW5kX1N1YnNjcmlwdHMiICovCisgICAgMCwgLTc1MSwgICAgICAgICAgICAvKiA2NjU6ICIiLCAiU3VwcGxlbWVudGFsX0Fycm93c19BIiAqLworICAgIDAsIC03NTIsICAgICAgICAgICAgLyogNjY3OiAiIiwgIlN1cHBsZW1lbnRhbF9BcnJvd3NfQiIgKi8KKyAgICAwLCAtNzUzLCAgICAgICAgICAgIC8qIDY2OTogIiIsICJTdXBwbGVtZW50YWxfTWF0aGVtYXRpY2FsX09wZXJhdG9ycyIgKi8KKyAgICAwLCAtNzU0LCAgICAgICAgICAgIC8qIDY3MTogIiIsICJTdXBwbGVtZW50YWxfUHVuY3R1YXRpb24iICovCisgICAgMCwgLTc1NSwgICAgICAgICAgICAvKiA2NzM6ICIiLCAiU3VwcGxlbWVudGFyeV9Qcml2YXRlX1VzZV9BcmVhX0EiICovCisgICAgMCwgLTc1NiwgICAgICAgICAgICAvKiA2NzU6ICIiLCAiU3VwcGxlbWVudGFyeV9Qcml2YXRlX1VzZV9BcmVhX0IiICovCisgICAgMCwgLTc2MCwgICAgICAgICAgICAvKiA2Nzc6ICIiLCAiU3lsb3RpX05hZ3JpIiAqLworICAgIDAsIC03NjQsICAgICAgICAgICAgLyogNjc5OiAiIiwgIlN5cmlhYyIgKi8KKyAgICAwLCAtNzY5LCAgICAgICAgICAgIC8qIDY4MTogIiIsICJUYWdhbG9nIiAqLworICAgIDAsIC03NzEsICAgICAgICAgICAgLyogNjgzOiAiIiwgIlRhZ2JhbndhIiAqLworICAgIDAsIC03NzIsICAgICAgICAgICAgLyogNjg1OiAiIiwgIlRhZ3MiICovCisgICAgMCwgLTc3NCwgICAgICAgICAgICAvKiA2ODc6ICIiLCAiVGFpX0xlIiAqLworICAgIDAsIC03NzUsICAgICAgICAgICAgLyogNjg5OiAiIiwgIlRhaV9UaGFtIiAqLworICAgIDAsIC03NzYsICAgICAgICAgICAgLyogNjkxOiAiIiwgIlRhaV9WaWV0IiAqLworICAgIDAsIC03NzcsICAgICAgICAgICAgLyogNjkzOiAiIiwgIlRhaV9YdWFuX0ppbmdfU3ltYm9scyIgKi8KKyAgICAwLCAtNzgxLCAgICAgICAgICAgIC8qIDY5NTogIiIsICJUYW1pbCIgKi8KKyAgICAwLCAtNzg5LCAgICAgICAgICAgIC8qIDY5NzogIiIsICJUZWx1Z3UiICovCisgICAgMCwgLTc5NywgICAgICAgICAgICAvKiA2OTk6ICIiLCAiVGhhYW5hIiAqLworICAgIDAsIC03OTgsICAgICAgICAgICAgLyogNzAxOiAiIiwgIlRoYWkiICovCisgICAgMCwgLTc5OSwgICAgICAgICAgICAvKiA3MDM6ICIiLCAiVGliZXRhbiIgKi8KKyAgICAwLCAtODAxLCAgICAgICAgICAgIC8qIDcwNTogIiIsICJUaWZpbmFnaCIgKi8KKyAgICAwLCAtODA3LCAgICAgICAgICAgIC8qIDcwNzogIiIsICJUcmFuc3BvcnRfQW5kX01hcF9TeW1ib2xzIiAqLworICAgIDAsIC04MTMsICAgICAgICAgICAgLyogNzA5OiAiIiwgIlVnYXJpdGljIiAqLworICAgIDAsIDgxNiwgLTEzNCwgICAgICAgLyogNzExOiAiIiwgIlVuaWZpZWRfQ2FuYWRpYW5fQWJvcmlnaW5hbF9TeWxsYWJpY3MiLCAiQ2FuYWRpYW5fU3lsbGFiaWNzIiAqLworICAgIDAsIC04MTcsICAgICAgICAgICAgLyogNzE0OiAiIiwgIlVuaWZpZWRfQ2FuYWRpYW5fQWJvcmlnaW5hbF9TeWxsYWJpY3NfRXh0ZW5kZWQiICovCisgICAgMCwgLTgyNywgICAgICAgICAgICAvKiA3MTY6ICIiLCAiVmFpIiAqLworICAgIDAsIC04MzAsICAgICAgICAgICAgLyogNzE4OiAiIiwgIlZhcmlhdGlvbl9TZWxlY3RvcnMiICovCisgICAgMCwgLTgzMSwgICAgICAgICAgICAvKiA3MjA6ICIiLCAiVmFyaWF0aW9uX1NlbGVjdG9yc19TdXBwbGVtZW50IiAqLworICAgIDAsIC04MzIsICAgICAgICAgICAgLyogNzIyOiAiIiwgIlZlZGljX0V4dGVuc2lvbnMiICovCisgICAgMCwgLTgzNSwgICAgICAgICAgICAvKiA3MjQ6ICIiLCAiVmVydGljYWxfRm9ybXMiICovCisgICAgMCwgLTg2NywgICAgICAgICAgICAvKiA3MjY6ICIiLCAiWWlqaW5nX0hleGFncmFtX1N5bWJvbHMiICovCisgICAgMCwgLTg2NCwgICAgICAgICAgICAvKiA3Mjg6ICIiLCAiWWlfUmFkaWNhbHMiICovCisgICAgMCwgLTg2NSwgICAgICAgICAgICAvKiA3MzA6ICIiLCAiWWlfU3lsbGFibGVzIiAqLworICAgIDU1MiwgLTU4MywgICAgICAgICAgLyogNzMyOiAiTlIiLCAiTm90X1Jlb3JkZXJlZCIgKi8KKyAgICA1OTcsIC02MTksICAgICAgICAgIC8qIDczNDogIk9WIiwgIk92ZXJsYXkiICovCisgICAgMTQsIC00OCwgICAgICAgICAgICAvKiA3MzY6ICJBVEJMIiwgIkF0dGFjaGVkX0JlbG93X0xlZnQiICovCisgICAgMTMsIC00NywgICAgICAgICAgICAvKiA3Mzg6ICJBVEIiLCAiQXR0YWNoZWRfQmVsb3ciICovCisgICAgMTEsIC00NSwgICAgICAgICAgICAvKiA3NDA6ICJBVEEiLCAiQXR0YWNoZWRfQWJvdmUiICovCisgICAgMTIsIC00NiwgICAgICAgICAgICAvKiA3NDI6ICJBVEFSIiwgIkF0dGFjaGVkX0Fib3ZlX1JpZ2h0IiAqLworICAgIDU2LCAtNzAsICAgICAgICAgICAgLyogNzQ0OiAiQkwiLCAiQmVsb3dfTGVmdCIgKi8KKyAgICA1MSwgLTY5LCAgICAgICAgICAgIC8qIDc0NjogIkIiLCAiQmVsb3ciICovCisgICAgNTgsIC03MSwgICAgICAgICAgICAvKiA3NDg6ICJCUiIsICJCZWxvd19SaWdodCIgKi8KKyAgICA0MTcsIC00NDcsICAgICAgICAgIC8qIDc1MDogIkwiLCAiTGVmdCIgKi8KKyAgICA2NjcsIC02NzQsICAgICAgICAgIC8qIDc1MjogIlIiLCAiUmlnaHQiICovCisgICAgNCwgLTE3LCAgICAgICAgICAgICAvKiA3NTQ6ICJBTCIsICJBYm92ZV9MZWZ0IiAqLworICAgIDEsIC0xNiwgICAgICAgICAgICAgLyogNzU2OiAiQSIsICJBYm92ZSIgKi8KKyAgICA3LCAtMTgsICAgICAgICAgICAgIC8qIDc1ODogIkFSIiwgIkFib3ZlX1JpZ2h0IiAqLworICAgIDIwMSwgLTIyNSwgICAgICAgICAgLyogNzYwOiAiREIiLCAiRG91YmxlX0JlbG93IiAqLworICAgIDIwMCwgLTIyNCwgICAgICAgICAgLyogNzYyOiAiREEiLCAiRG91YmxlX0Fib3ZlIiAqLworICAgIDM1OCwgLTM3NCwgICAgICAgICAgLyogNzY0OiAiSVMiLCAiSW90YV9TdWJzY3JpcHQiICovCisgICAgNTQ5LCAtNTg2LCAgICAgICAgICAvKiA3NjY6ICJOSyIsICJOdWt0YSIgKi8KKyAgICAzOTEsIC0zOTcsICAgICAgICAgIC8qIDc2ODogIktWIiwgIkthbmFfVm9pY2luZyIgKi8KKyAgICA4MjUsIC04MzYsICAgICAgICAgIC8qIDc3MDogIlZSIiwgIlZpcmFtYSIgKi8KKyAgICAxMzIsIDEzNSwgLTg5MCwgICAgIC8qIDc3MjogIkNhbiIsICJDYW5vbmljYWwiLCAiY2FuIiAqLworICAgIDI0MSwgMTU3LCAtODk4LCAgICAgLyogNzc1OiAiRW5jIiwgIkNpcmNsZSIsICJlbmMiICovCisgICAgMTY0LCAxNzUsIC04OTQsICAgICAvKiA3Nzg6ICJDb20iLCAiQ29tcGF0IiwgImNvbSIgKi8KKyAgICAyNjYsIDI2NywgLTg5OSwgICAgIC8qIDc4MTogIkZpbiIsICJGaW5hbCIsICJmaW4iICovCisgICAgMjcwLCAtOTAwLCAgICAgICAgICAvKiA3ODQ6ICJGb250IiwgImZvbnQiICovCisgICAgMjcyLCAyNzMsIC05MDEsICAgICAvKiA3ODY6ICJGcmEiLCAiRnJhY3Rpb24iLCAiZnJhIiAqLworICAgIDM2NywgMzY4LCAtOTA2LCAgICAgLyogNzg5OiAiSW5pdCIsICJJbml0aWFsIiwgImluaXQiICovCisgICAgMzc1LCAzNzYsIC05MDgsICAgICAvKiA3OTI6ICJJc28iLCAiSXNvbGF0ZWQiLCAiaXNvIiAqLworICAgIDUwMywgNTA0LCAtOTE0LCAgICAgLyogNzk1OiAiTWVkIiwgIk1lZGlhbCIsICJtZWQiICovCisgICAgNTU4LCA1NjAsIC05MTcsICAgICAvKiA3OTg6ICJOYXIiLCAiTmFycm93IiwgIm5hciIgKi8KKyAgICA1NjEsIDU3NSwgLTkxOCwgICAgIC8qIDgwMTogIk5iIiwgIk5vYnJlYWsiLCAibmIiICovCisgICAgNTc4LCAtOTIzLCAgICAgICAgICAvKiA4MDQ6ICJOb25lIiwgIm5vbmUiICovCisgICAgNzMyLCA3MzAsIC05MzQsICAgICAvKiA4MDY6ICJTbWwiLCAiU21hbGwiLCAic21sIiAqLworICAgIDc0MywgNzQ0LCAtOTM2LCAgICAgLyogODA5OiAiU3FyIiwgIlNxdWFyZSIsICJzcXIiICovCisgICAgNzQ1LCAtOTM4LCAgICAgICAgICAvKiA4MTI6ICJTdWIiLCAic3ViIiAqLworICAgIDc0OCwgNzQ5LCAtOTQwLCAgICAgLyogODE0OiAiU3VwIiwgIlN1cGVyIiwgInN1cCIgKi8KKyAgICA4MzMsIDgzNCwgLTk0NCwgICAgIC8qIDgxNzogIlZlcnQiLCAiVmVydGljYWwiLCAidmVydCIgKi8KKyAgICA4NDcsIC05NDUsICAgICAgICAgIC8qIDgyMDogIldpZGUiLCAid2lkZSIgKi8KKyAgICAxLCAtMjksICAgICAgICAgICAgIC8qIDgyMjogIkEiLCAiQW1iaWd1b3VzIiAqLworICAgIDI2MCwgLTI3NSwgICAgICAgICAgLyogODI0OiAiRiIsICJGdWxsd2lkdGgiICovCisgICAgMzA5LCAtMzE0LCAgICAgICAgICAvKiA4MjY6ICJIIiwgIkhhbGZ3aWR0aCIgKi8KKyAgICA1NTYsIC01NjAsICAgICAgICAgIC8qIDgyODogIk5hIiwgIk5hcnJvdyIgKi8KKyAgICA1MzQsIC01NjQsICAgICAgICAgIC8qIDgzMDogIk4iLCAiTmV1dHJhbCIgKi8KKyAgICA4MzksIC04NDcsICAgICAgICAgIC8qIDgzMjogIlciLCAiV2lkZSIgKi8KKyAgICA1MDEsIC03NDAsICAgICAgICAgIC8qIDgzNDogIk1jIiwgIlNwYWNpbmdfTWFyayIgKi8KKyAgICA2MzEsIC0xNzcsICAgICAgICAgIC8qIDgzNjogIlBjIiwgIkNvbm5lY3Rvcl9QdW5jdHVhdGlvbiIgKi8KKyAgICAxNDYsIDE3OSwgLTg5MywgICAgIC8qIDgzODogIkNjIiwgIkNvbnRyb2wiLCAiY250cmwiICovCisgICAgNzA1LCAtMTg4LCAgICAgICAgICAvKiA4NDE6ICJTYyIsICJDdXJyZW5jeV9TeW1ib2wiICovCisgICAgNjMyLCAtMjA2LCAgICAgICAgICAvKiA4NDM6ICJQZCIsICJEYXNoX1B1bmN0dWF0aW9uIiAqLworICAgIDU2MywgMjA5LCAtODk1LCAgICAgLyogODQ1OiAiTmQiLCAiRGVjaW1hbF9OdW1iZXIiLCAiZGlnaXQiICovCisgICAgNTAyLCAtMjQ2LCAgICAgICAgICAvKiA4NDg6ICJNZSIsICJFbmNsb3NpbmdfTWFyayIgKi8KKyAgICA2MzMsIC0xNjEsICAgICAgICAgIC8qIDg1MDogIlBlIiwgIkNsb3NlX1B1bmN0dWF0aW9uIiAqLworICAgIDYzNSwgLTI2OCwgICAgICAgICAgLyogODUyOiAiUGYiLCAiRmluYWxfUHVuY3R1YXRpb24iICovCisgICAgMTQ3LCAtMjcxLCAgICAgICAgICAvKiA4NTQ6ICJDZiIsICJGb3JtYXQiICovCisgICAgMTYyLCAtODE0LCAgICAgICAgICAvKiA4NTY6ICJDbiIsICJVbmFzc2lnbmVkIiAqLworICAgIDY0NiwgLTM2OSwgICAgICAgICAgLyogODU4OiAiUGkiLCAiSW5pdGlhbF9QdW5jdHVhdGlvbiIgKi8KKyAgICA1NzEsIC00NTUsICAgICAgICAgIC8qIDg2MDogIk5sIiwgIkxldHRlcl9OdW1iZXIiICovCisgICAgODc2LCAtNDYzLCAgICAgICAgICAvKiA4NjI6ICJabCIsICJMaW5lX1NlcGFyYXRvciIgKi8KKyAgICA0NjgsIC00NzYsICAgICAgICAgIC8qIDg2NDogIkxsIiwgIkxvd2VyY2FzZV9MZXR0ZXIiICovCisgICAgNzI5LCAtNDk2LCAgICAgICAgICAvKiA4NjY6ICJTbSIsICJNYXRoX1N5bWJvbCIgKi8KKyAgICA0NjksIC01MjIsICAgICAgICAgIC8qIDg2ODogIkxtIiwgIk1vZGlmaWVyX0xldHRlciIgKi8KKyAgICA3MjgsIC01MjMsICAgICAgICAgIC8qIDg3MDogIlNrIiwgIk1vZGlmaWVyX1N5bWJvbCIgKi8KKyAgICA1MjEsIC01NzksICAgICAgICAgIC8qIDg3MjogIk1uIiwgIk5vbnNwYWNpbmdfTWFyayIgKi8KKyAgICA0NzAsIC02MTQsICAgICAgICAgIC8qIDg3NDogIkxvIiwgIk90aGVyX0xldHRlciIgKi8KKyAgICA1NzIsIC02MTYsICAgICAgICAgIC8qIDg3NjogIk5vIiwgIk90aGVyX051bWJlciIgKi8KKyAgICA2NDksIC02MTcsICAgICAgICAgIC8qIDg3ODogIlBvIiwgIk90aGVyX1B1bmN0dWF0aW9uIiAqLworICAgIDczMywgLTYxOCwgICAgICAgICAgLyogODgwOiAiU28iLCAiT3RoZXJfU3ltYm9sIiAqLworICAgIDg3OCwgLTYyNiwgICAgICAgICAgLyogODgyOiAiWnAiLCAiUGFyYWdyYXBoX1NlcGFyYXRvciIgKi8KKyAgICAxNjMsIC02NTQsICAgICAgICAgIC8qIDg4NDogIkNvIiwgIlByaXZhdGVfVXNlIiAqLworICAgIDg3OSwgLTczOCwgICAgICAgICAgLyogODg2OiAiWnMiLCAiU3BhY2VfU2VwYXJhdG9yIiAqLworICAgIDY1NywgLTYwNiwgICAgICAgICAgLyogODg4OiAiUHMiLCAiT3Blbl9QdW5jdHVhdGlvbiIgKi8KKyAgICAxODUsIC03NTcsICAgICAgICAgIC8qIDg5MDogIkNzIiwgIlN1cnJvZ2F0ZSIgKi8KKyAgICA0NzgsIC04MDIsICAgICAgICAgIC8qIDg5MjogIkx0IiwgIlRpdGxlY2FzZV9MZXR0ZXIiICovCisgICAgNDc5LCAtODIyLCAgICAgICAgICAvKiA4OTQ6ICJMdSIsICJVcHBlcmNhc2VfTGV0dGVyIiAqLworICAgIDEwNCwgLTYxMywgICAgICAgICAgLyogODk2OiAiQyIsICJPdGhlciIgKi8KKyAgICA0MTgsIC0xNDUsICAgICAgICAgIC8qIDg5ODogIkxDIiwgIkNhc2VkX0xldHRlciIgKi8KKyAgICA0MTcsIC00NTQsICAgICAgICAgIC8qIDkwMDogIkwiLCAiTGV0dGVyIiAqLworICAgIDQ4NCwgLTQ5NCwgICAgICAgICAgLyogOTAyOiAiTSIsICJNYXJrIiAqLworICAgIDUzNCwgLTU4NywgICAgICAgICAgLyogOTA0OiAiTiIsICJOdW1iZXIiICovCisgICAgNjIwLCA2NTgsIC05MjcsICAgICAvKiA5MDY6ICJQIiwgIlB1bmN0dWF0aW9uIiwgInB1bmN0IiAqLworICAgIDY4NCwgLTc2MSwgICAgICAgICAgLyogOTA5OiAiUyIsICJTeW1ib2wiICovCisgICAgODcwLCAtNzE1LCAgICAgICAgICAvKiA5MTE6ICJaIiwgIlNlcGFyYXRvciIgKi8KKyAgICA0MTcsIC00NDYsICAgICAgICAgIC8qIDkxMzogIkwiLCAiTGVhZGluZ19KYW1vIiAqLworICAgIDQyNiwgLTQyNywgICAgICAgICAgLyogOTE1OiAiTFZUIiwgIkxWVF9TeWxsYWJsZSIgKi8KKyAgICA0MjUsIC00MjgsICAgICAgICAgIC8qIDkxNzogIkxWIiwgIkxWX1N5bGxhYmxlIiAqLworICAgIDUzNSwgLTU4MiwgICAgICAgICAgLyogOTE5OiAiTkEiLCAiTm90X0FwcGxpY2FibGUiICovCisgICAgNzY4LCAtODA1LCAgICAgICAgICAvKiA5MjE6ICJUIiwgIlRyYWlsaW5nX0phbW8iICovCisgICAgODI0LCAtODM4LCAgICAgICAgICAvKiA5MjM6ICJWIiwgIlZvd2VsX0phbW8iICovCisgICAgMCwgLTIyLCAgICAgICAgICAgICAvKiA5MjU6ICIiLCAiQWluIiAqLworICAgIDAsIC0yMywgICAgICAgICAgICAgLyogOTI3OiAiIiwgIkFsYXBoIiAqLworICAgIDAsIC0yNSwgICAgICAgICAgICAgLyogOTI5OiAiIiwgIkFsZWYiICovCisgICAgMCwgLTY4LCAgICAgICAgICAgICAvKiA5MzE6ICIiLCAiQmVoIiAqLworICAgIDAsIC03NCwgICAgICAgICAgICAgLyogOTMzOiAiIiwgIkJldGgiICovCisgICAgMCwgLTEwMiwgICAgICAgICAgICAvKiA5MzU6ICIiLCAiQnVydXNoYXNraV9ZZWhfQmFycmVlIiAqLworICAgIDAsIC0yMDMsICAgICAgICAgICAgLyogOTM3OiAiIiwgIkRhbCIgKi8KKyAgICAwLCAtMjA0LCAgICAgICAgICAgIC8qIDkzOTogIiIsICJEYWxhdGhfUmlzaCIgKi8KKyAgICAwLCAtMjI5LCAgICAgICAgICAgIC8qIDk0MTogIiIsICJFIiAqLworICAgIDAsIC0yNjMsICAgICAgICAgICAgLyogOTQzOiAiIiwgIkZhcnNpX1llaCIgKi8KKyAgICAwLCAtMjY0LCAgICAgICAgICAgIC8qIDk0NTogIiIsICJGZSIgKi8KKyAgICAwLCAtMjY1LCAgICAgICAgICAgIC8qIDk0NzogIiIsICJGZWgiICovCisgICAgMCwgLTI2OSwgICAgICAgICAgICAvKiA5NDk6ICIiLCAiRmluYWxfU2Vta2F0aCIgKi8KKyAgICAwLCAtMjc4LCAgICAgICAgICAgIC8qIDk1MTogIiIsICJHYWYiICovCisgICAgMCwgLTI3OSwgICAgICAgICAgICAvKiA5NTM6ICIiLCAiR2FtYWwiICovCisgICAgMCwgLTMxMywgICAgICAgICAgICAvKiA5NTU6ICIiLCAiSGFoIiAqLworICAgIDAsIC0zMzEsICAgICAgICAgICAgLyogOTU3OiAiIiwgIkhlIiAqLworICAgIDAsIC0zMzQsICAgICAgICAgICAgLyogOTU5OiAiIiwgIkhlaCIgKi8KKyAgICAwLCAtMzM1LCAgICAgICAgICAgIC8qIDk2MTogIiIsICJIZWhfR29hbCIgKi8KKyAgICAwLCAtMzM2LCAgICAgICAgICAgIC8qIDk2MzogIiIsICJIZXRoIiAqLworICAgIDAsIC0zOTIsICAgICAgICAgICAgLyogOTY1OiAiIiwgIkthZiIgKi8KKyAgICAwLCAtNDAxLCAgICAgICAgICAgIC8qIDk2NzogIiIsICJLYXBoIiAqLworICAgIDAsIC00MDYsICAgICAgICAgICAgLyogOTY5OiAiIiwgIktoYXBoIiAqLworICAgIDAsIC00MTMsICAgICAgICAgICAgLyogOTcxOiAiIiwgIktub3R0ZWRfSGVoIiAqLworICAgIDAsIC00MjksICAgICAgICAgICAgLyogOTczOiAiIiwgIkxhbSIgKi8KKyAgICAwLCAtNDMwLCAgICAgICAgICAgIC8qIDk3NTogIiIsICJMYW1hZGgiICovCisgICAgMCwgLTUwNSwgICAgICAgICAgICAvKiA5Nzc6ICIiLCAiTWVlbSIgKi8KKyAgICAwLCAtNTEzLCAgICAgICAgICAgIC8qIDk3OTogIiIsICJNaW0iICovCisgICAgMCwgLTU4MSwgICAgICAgICAgICAvKiA5ODE6ICIiLCAiTm9vbiIgKi8KKyAgICAwLCAtNTc0LCAgICAgICAgICAgIC8qIDk4MzogIiIsICJOb19Kb2luaW5nX0dyb3VwIiAqLworICAgIDAsIC01OTIsICAgICAgICAgICAgLyogOTg1OiAiIiwgIk51biIgKi8KKyAgICAwLCAtNTkzLCAgICAgICAgICAgIC8qIDk4NzogIiIsICJOeWEiICovCisgICAgMCwgLTYzMywgICAgICAgICAgICAvKiA5ODk6ICIiLCAiUGUiICovCisgICAgMCwgLTY2MywgICAgICAgICAgICAvKiA5OTE6ICIiLCAiUWFmIiAqLworICAgIDAsIC02NjQsICAgICAgICAgICAgLyogOTkzOiAiIiwgIlFhcGgiICovCisgICAgMCwgLTY3MSwgICAgICAgICAgICAvKiA5OTU6ICIiLCAiUmVoIiAqLworICAgIDAsIC02NzMsICAgICAgICAgICAgLyogOTk3OiAiIiwgIlJldmVyc2VkX1BlIiAqLworICAgIDAsIC02OTcsICAgICAgICAgICAgLyogOTk5OiAiIiwgIlNhZCIgKi8KKyAgICAwLCAtNjk4LCAgICAgICAgICAgIC8qIDEwMDE6ICIiLCAiU2FkaGUiICovCisgICAgMCwgLTcwOCwgICAgICAgICAgICAvKiAxMDAzOiAiIiwgIlNlZW4iICovCisgICAgMCwgLTcxMSwgICAgICAgICAgICAvKiAxMDA1OiAiIiwgIlNlbWthdGgiICovCisgICAgMCwgLTcxOSwgICAgICAgICAgICAvKiAxMDA3OiAiIiwgIlNoaW4iICovCisgICAgMCwgLTc1OCwgICAgICAgICAgICAvKiAxMDA5OiAiIiwgIlN3YXNoX0thZiIgKi8KKyAgICAwLCAtNzY1LCAgICAgICAgICAgIC8qIDEwMTE6ICIiLCAiU3lyaWFjX1dhdyIgKi8KKyAgICAwLCAtNzczLCAgICAgICAgICAgIC8qIDEwMTM6ICIiLCAiVGFoIiAqLworICAgIDAsIC03ODUsICAgICAgICAgICAgLyogMTAxNTogIiIsICJUYXciICovCisgICAgMCwgLTc4NiwgICAgICAgICAgICAvKiAxMDE3OiAiIiwgIlRlaF9NYXJidXRhIiAqLworICAgIDAsIDc4NywgLTMxNiwgICAgICAgLyogMTAxOTogIiIsICJUZWhfTWFyYnV0YV9Hb2FsIiwgIkhhbXphX09uX0hlaF9Hb2FsIiAqLworICAgIDAsIC03OTMsICAgICAgICAgICAgLyogMTAyMjogIiIsICJUZXRoIiAqLworICAgIDAsIC04NDUsICAgICAgICAgICAgLyogMTAyNDogIiIsICJXYXciICovCisgICAgMCwgLTg1OSwgICAgICAgICAgICAvKiAxMDI2OiAiIiwgIlllaCIgKi8KKyAgICAwLCAtODYwLCAgICAgICAgICAgIC8qIDEwMjg6ICIiLCAiWWVoX0JhcnJlZSIgKi8KKyAgICAwLCAtODYxLCAgICAgICAgICAgIC8qIDEwMzA6ICIiLCAiWWVoX1dpdGhfVGFpbCIgKi8KKyAgICAwLCAtODY4LCAgICAgICAgICAgIC8qIDEwMzI6ICIiLCAiWXVkaCIgKi8KKyAgICAwLCAtODY5LCAgICAgICAgICAgIC8qIDEwMzQ6ICIiLCAiWXVkaF9IZSIgKi8KKyAgICAwLCAtODczLCAgICAgICAgICAgIC8qIDEwMzY6ICIiLCAiWmFpbiIgKi8KKyAgICAwLCAtODc0LCAgICAgICAgICAgIC8qIDEwMzg6ICIiLCAiWmhhaW4iICovCisgICAgMTk5LCAtMjI3LCAgICAgICAgICAvKiAxMDQwOiAiRCIsICJEdWFsX0pvaW5pbmciICovCisgICAgMTA0LCAtMzg0LCAgICAgICAgICAvKiAxMDQyOiAiQyIsICJKb2luX0NhdXNpbmciICovCisgICAgNDE3LCAtNDQ4LCAgICAgICAgICAvKiAxMDQ0OiAiTCIsICJMZWZ0X0pvaW5pbmciICovCisgICAgODA5LCAtNTc2LCAgICAgICAgICAvKiAxMDQ2OiAiVSIsICJOb25fSm9pbmluZyIgKi8KKyAgICA2NjcsIC02NzUsICAgICAgICAgIC8qIDEwNDg6ICJSIiwgIlJpZ2h0X0pvaW5pbmciICovCisgICAgNzY4LCAtODA2LCAgICAgICAgICAvKiAxMDUwOiAiVCIsICJUcmFuc3BhcmVudCIgKi8KKyAgICA0LCAtMjcsICAgICAgICAgICAgIC8qIDEwNTI6ICJBTCIsICJBbHBoYWJldGljIiAqLworICAgIDMsIC0yOSwgICAgICAgICAgICAgLyogMTA1NDogIkFJIiwgIkFtYmlndW91cyIgKi8KKyAgICA1MywgLTk0LCAgICAgICAgICAgIC8qIDEwNTY6ICJCQSIsICJCcmVha19BZnRlciIgKi8KKyAgICA1NCwgLTk1LCAgICAgICAgICAgIC8qIDEwNTg6ICJCQiIsICJCcmVha19CZWZvcmUiICovCisgICAgNTIsIC05NiwgICAgICAgICAgICAvKiAxMDYwOiAiQjIiLCAiQnJlYWtfQm90aCIgKi8KKyAgICA2OTYsIC05NywgICAgICAgICAgIC8qIDEwNjI6ICJTWSIsICJCcmVha19TeW1ib2xzIiAqLworICAgIDEyMywgLTE0MCwgICAgICAgICAgLyogMTA2NDogIkNSIiwgIkNhcnJpYWdlX1JldHVybiIgKi8KKyAgICAxMjIsIC0xNjAsICAgICAgICAgIC8qIDEwNjY6ICJDUCIsICJDbG9zZV9QYXJlbnRoZXNpcyIgKi8KKyAgICAxMTksIC0xNjEsICAgICAgICAgIC8qIDEwNjg6ICJDTCIsICJDbG9zZV9QdW5jdHVhdGlvbiIgKi8KKyAgICAxMjAsIC0xNjksICAgICAgICAgIC8qIDEwNzA6ICJDTSIsICJDb21iaW5pbmdfTWFyayIgKi8KKyAgICA2ODUsIC0xNzYsICAgICAgICAgIC8qIDEwNzI6ICJTQSIsICJDb21wbGV4X0NvbnRleHQiICovCisgICAgMTA1LCAtMTc4LCAgICAgICAgICAvKiAxMDc0OiAiQ0IiLCAiQ29udGluZ2VudF9CcmVhayIgKi8KKyAgICAyMzMsIC0yNTUsICAgICAgICAgIC8qIDEwNzY6ICJFWCIsICJFeGNsYW1hdGlvbiIgKi8KKyAgICAyNzcsIC0yOTAsICAgICAgICAgIC8qIDEwNzg6ICJHTCIsICJHbHVlIiAqLworICAgIDMxMCwgLTMxMCwgICAgICAgICAgLyogMTA4MDogIkgyIiwgIkgyIiAqLworICAgIDMxMSwgLTMxMSwgICAgICAgICAgLyogMTA4MjogIkgzIiwgIkgzIiAqLworICAgIDMxMiwgLTM0NiwgICAgICAgICAgLyogMTA4NDogIkhZIiwgIkh5cGhlbiIgKi8KKyAgICAzNDcsIC0zNjEsICAgICAgICAgIC8qIDEwODY6ICJJRCIsICJJZGVvZ3JhcGhpYyIgKi8KKyAgICAzNTgsIC0zNjUsICAgICAgICAgIC8qIDEwODg6ICJJUyIsICJJbmZpeF9OdW1lcmljIiAqLworICAgIDM1NiwgMzcyLCAtMzczLCAgICAgLyogMTA5MDogIklOIiwgIkluc2VwYXJhYmxlIiwgIkluc2VwZXJhYmxlIiAqLworICAgIDM3OCwgLTM3OCwgICAgICAgICAgLyogMTA5MzogIkpMIiwgIkpMIiAqLworICAgIDM3OSwgLTM3OSwgICAgICAgICAgLyogMTA5NTogIkpUIiwgIkpUIiAqLworICAgIDM4MCwgLTM4MCwgICAgICAgICAgLyogMTA5NzogIkpWIiwgIkpWIiAqLworICAgIDQyMCwgLTQ2MiwgICAgICAgICAgLyogMTA5OTogIkxGIiwgIkxpbmVfRmVlZCIgKi8KKyAgICA1NSwgLTQ5MiwgICAgICAgICAgIC8qIDExMDE6ICJCSyIsICJNYW5kYXRvcnlfQnJlYWsiICovCisgICAgNTUxLCAtNTY3LCAgICAgICAgICAvKiAxMTAzOiAiTkwiLCAiTmV4dF9MaW5lIiAqLworICAgIDU1MywgLTU4MCwgICAgICAgICAgLyogMTEwNTogIk5TIiwgIk5vbnN0YXJ0ZXIiICovCisgICAgNTk2LCAtNjA2LCAgICAgICAgICAvKiAxMTA3OiAiT1AiLCAiT3Blbl9QdW5jdHVhdGlvbiIgKi8KKyAgICA2MjIsIC02NTEsICAgICAgICAgIC8qIDExMDk6ICJQTyIsICJQb3N0Zml4X051bWVyaWMiICovCisgICAgNjI0LCAtNjUyLCAgICAgICAgICAvKiAxMTExOiAiUFIiLCAiUHJlZml4X051bWVyaWMiICovCisgICAgNjYwLCAtNjY1LCAgICAgICAgICAvKiAxMTEzOiAiUVUiLCAiUXVvdGF0aW9uIiAqLworICAgIDY5MywgLTczNywgICAgICAgICAgLyogMTExNTogIlNQIiwgIlNwYWNlIiAqLworICAgIDY5MSwgLTc1NywgICAgICAgICAgLyogMTExNzogIlNHIiwgIlN1cnJvZ2F0ZSIgKi8KKyAgICA4NTUsIC04MTksICAgICAgICAgIC8qIDExMTk6ICJYWCIsICJVbmtub3duIiAqLworICAgIDg0MSwgLTg1MCwgICAgICAgICAgLyogMTEyMTogIldKIiwgIldvcmRfSm9pbmVyIiAqLworICAgIDg3MSwgLTg3MiwgICAgICAgICAgLyogMTEyMzogIlpXIiwgIlpXU3BhY2UiICovCisgICAgMjA3LCAtMjA4LCAgICAgICAgICAvKiAxMTI1OiAiRGUiLCAiRGVjaW1hbCIgKi8KKyAgICAyMTgsIC0yMjEsICAgICAgICAgIC8qIDExMjc6ICJEaSIsICJEaWdpdCIgKi8KKyAgICA1NzgsIC01NzgsICAgICAgICAgIC8qIDExMjk6ICJOb25lIiwgIk5vbmUiICovCisgICAgNTg1LCAtNTg5LCAgICAgICAgICAvKiAxMTMxOiAiTnUiLCAiTnVtZXJpYyIgKi8KKyAgICAyMCwgLTIwLCAgICAgICAgICAgIC8qIDExMzM6ICJBZmFrIiwgIkFmYWsiICovCisgICAgMzMsIC0zNCwgICAgICAgICAgICAvKiAxMTM1OiAiQXJhYiIsICJBcmFiaWMiICovCisgICAgNDMsIC00MSwgICAgICAgICAgICAvKiAxMTM3OiAiQXJtbiIsICJBcm1lbmlhbiIgKi8KKyAgICA1MCwgLTQ5LCAgICAgICAgICAgIC8qIDExMzk6ICJBdnN0IiwgIkF2ZXN0YW4iICovCisgICAgNTksIC02MCwgICAgICAgICAgICAvKiAxMTQxOiAiQmFsaSIsICJCYWxpbmVzZSIgKi8KKyAgICA2MSwgLTYyLCAgICAgICAgICAgIC8qIDExNDM6ICJCYW11IiwgIkJhbXVtIiAqLworICAgIDY1LCAtNjUsICAgICAgICAgICAgLyogMTE0NTogIkJhc3MiLCAiQmFzcyIgKi8KKyAgICA2NywgLTY2LCAgICAgICAgICAgIC8qIDExNDc6ICJCYXRrIiwgIkJhdGFrIiAqLworICAgIDcyLCAtNzMsICAgICAgICAgICAgLyogMTE0OTogIkJlbmciLCAiQmVuZ2FsaSIgKi8KKyAgICA4MSwgLTgxLCAgICAgICAgICAgIC8qIDExNTE6ICJCbGlzIiwgIkJsaXMiICovCisgICAgNjQxLCAtNjQxLCAgICAgICAgICAvKiAxMTUzOiAiUGhsdiIsICJQaGx2IiAqLworICAgIDg0LCAtODUsICAgICAgICAgICAgLyogMTE1NTogIkJvcG8iLCAiQm9wb21vZm8iICovCisgICAgODksIC05MCwgICAgICAgICAgICAvKiAxMTU3OiAiQnJhaCIsICJCcmFobWkiICovCisgICAgOTEsIC05MiwgICAgICAgICAgICAvKiAxMTU5OiAiQnJhaSIsICJCcmFpbGxlIiAqLworICAgIDk4LCAtOTksICAgICAgICAgICAgLyogMTE2MTogIkJ1Z2kiLCAiQnVnaW5lc2UiICovCisgICAgMTAwLCAtMTAxLCAgICAgICAgICAvKiAxMTYzOiAiQnVoZCIsICJCdWhpZCIgKi8KKyAgICAxMzcsIC0xMzMsICAgICAgICAgIC8qIDExNjU6ICJDYW5zIiwgIkNhbmFkaWFuX0Fib3JpZ2luYWwiICovCisgICAgMTM4LCAtMTM5LCAgICAgICAgICAvKiAxMTY3OiAiQ2FyaSIsICJDYXJpYW4iICovCisgICAgMTMxLCAtMTMxLCAgICAgICAgICAvKiAxMTY5OiAiQ2FrbSIsICJDYWttIiAqLworICAgIDE0OCwgLTE0OCwgICAgICAgICAgLyogMTE3MTogIkNoYW0iLCAiQ2hhbSIgKi8KKyAgICAxNTUsIC0xNTYsICAgICAgICAgIC8qIDExNzM6ICJDaGVyIiwgIkNoZXJva2VlIiAqLworICAgIDE1OCwgLTE1OCwgICAgICAgICAgLyogMTE3NTogIkNpcnQiLCAiQ2lydCIgKi8KKyAgICA4ODIsIC0xNzEsICAgICAgICAgIC8qIDExNzc6ICJaeXl5IiwgIkNvbW1vbiIgKi8KKyAgICAxODEsIDE4MiwgLTY2MSwgICAgIC8qIDExNzk6ICJDb3B0IiwgIkNvcHRpYyIsICJRYWFjIiAqLworICAgIDg1NywgLTE4NiwgICAgICAgICAgLyogMTE4MjogIlhzdXgiLCAiQ3VuZWlmb3JtIiAqLworICAgIDE4NCwgLTE5MCwgICAgICAgICAgLyogMTE4NDogIkNwcnQiLCAiQ3lwcmlvdCIgKi8KKyAgICAxOTcsIC0xOTIsICAgICAgICAgIC8qIDExODY6ICJDeXJsIiwgIkN5cmlsbGljIiAqLworICAgIDIzNSwgLTIzNSwgICAgICAgICAgLyogMTE4ODogIkVneWQiLCAiRWd5ZCIgKi8KKyAgICAyMjYsIC0yMTQsICAgICAgICAgIC8qIDExOTA6ICJEc3J0IiwgIkRlc2VyZXQiICovCisgICAgMjE1LCAtMjE2LCAgICAgICAgICAvKiAxMTkyOiAiRGV2YSIsICJEZXZhbmFnYXJpIiAqLworICAgIDIyOCwgLTIyOCwgICAgICAgICAgLyogMTE5NDogIkR1cGwiLCAiRHVwbCIgKi8KKyAgICA3NjcsIC03NjcsICAgICAgICAgIC8qIDExOTY6ICJTeXJuIiwgIlN5cm4iICovCisgICAgMjM3LCAtMjM4LCAgICAgICAgICAvKiAxMTk4OiAiRWd5cCIsICJFZ3lwdGlhbl9IaWVyb2dseXBocyIgKi8KKyAgICAyMzksIC0yMzksICAgICAgICAgIC8qIDEyMDA6ICJFbGJhIiwgIkVsYmEiICovCisgICAgNzYzLCAtNzYzLCAgICAgICAgICAvKiAxMjAyOiAiU3lyZSIsICJTeXJlIiAqLworICAgIDI0NywgLTI0OCwgICAgICAgICAgLyogMTIwNDogIkV0aGkiLCAiRXRoaW9waWMiICovCisgICAgMjg1LCAtMjg2LCAgICAgICAgICAvKiAxMjA2OiAiR2VvciIsICJHZW9yZ2lhbiIgKi8KKyAgICAyODgsIC0yODksICAgICAgICAgIC8qIDEyMDg6ICJHbGFnIiwgIkdsYWdvbGl0aWMiICovCisgICAgMjkxLCAtMjkyLCAgICAgICAgICAvKiAxMjEwOiAiR290aCIsICJHb3RoaWMiICovCisgICAgMjk2LCAtMjk2LCAgICAgICAgICAvKiAxMjEyOiAiR3JhbiIsICJHcmFuIiAqLworICAgIDMwNCwgLTMwMSwgICAgICAgICAgLyogMTIxNDogIkdyZWsiLCAiR3JlZWsiICovCisgICAgMzA2LCAtMzA1LCAgICAgICAgICAvKiAxMjE2OiAiR3VqciIsICJHdWphcmF0aSIgKi8KKyAgICAzMDgsIC0zMDcsICAgICAgICAgIC8qIDEyMTg6ICJHdXJ1IiwgIkd1cm11a2hpIiAqLworICAgIDMyNiwgLTMxNywgICAgICAgICAgLyogMTIyMDogIkhhbmkiLCAiSGFuIiAqLworICAgIDMxOCwgLTMxOSwgICAgICAgICAgLyogMTIyMjogIkhhbmciLCAiSGFuZ3VsIiAqLworICAgIDMyNywgLTMzMCwgICAgICAgICAgLyogMTIyNDogIkhhbm8iLCAiSGFudW5vbyIgKi8KKyAgICAzNjQsIC0zNjQsICAgICAgICAgIC8qIDEyMjY6ICJJbmRzIiwgIkluZHMiICovCisgICAgMzMyLCAtMzMzLCAgICAgICAgICAvKiAxMjI4OiAiSGViciIsICJIZWJyZXciICovCisgICAgMjM2LCAtMjM2LCAgICAgICAgICAvKiAxMjMwOiAiRWd5aCIsICJFZ3loIiAqLworICAgIDM0MSwgLTM0MiwgICAgICAgICAgLyogMTIzMjogIkhpcmEiLCAiSGlyYWdhbmEiICovCisgICAgNDIsIC0zNjMsICAgICAgICAgICAvKiAxMjM0OiAiQXJtaSIsICJJbXBlcmlhbF9BcmFtYWljIiAqLworICAgIDg3NSwgMzY2LCAtNjYyLCAgICAgLyogMTIzNjogIlppbmgiLCAiSW5oZXJpdGVkIiwgIlFhYWkiICovCisgICAgNjM5LCAtMzcwLCAgICAgICAgICAvKiAxMjM5OiAiUGhsaSIsICJJbnNjcmlwdGlvbmFsX1BhaGxhdmkiICovCisgICAgNjU2LCAtMzcxLCAgICAgICAgICAvKiAxMjQxOiAiUHJ0aSIsICJJbnNjcmlwdGlvbmFsX1BhcnRoaWFuIiAqLworICAgIDM4OCwgLTM4OCwgICAgICAgICAgLyogMTI0MzogIkpwYW4iLCAiSnBhbiIgKi8KKyAgICAzODEsIC0zODIsICAgICAgICAgIC8qIDEyNDU6ICJKYXZhIiwgIkphdmFuZXNlIiAqLworICAgIDM4OSwgLTM4OSwgICAgICAgICAgLyogMTI0NzogIkp1cmMiLCAiSnVyYyIgKi8KKyAgICA0MTYsIC0zOTMsICAgICAgICAgIC8qIDEyNDk6ICJLdGhpIiwgIkthaXRoaSIgKi8KKyAgICA0MTIsIC00MDAsICAgICAgICAgIC8qIDEyNTE6ICJLbmRhIiwgIkthbm5hZGEiICovCisgICAgMzk1LCAtNDAyLCAgICAgICAgICAvKiAxMjUzOiAiS2FuYSIsICJLYXRha2FuYSIgKi8KKyAgICAzNDQsIC00MDMsICAgICAgICAgIC8qIDEyNTU6ICJIcmt0IiwgIkthdGFrYW5hX09yX0hpcmFnYW5hIiAqLworICAgIDM5NCwgLTQwNSwgICAgICAgICAgLyogMTI1NzogIkthbGkiLCAiS2F5YWhfTGkiICovCisgICAgNDA3LCAtNDA4LCAgICAgICAgICAvKiAxMjU5OiAiS2hhciIsICJLaGFyb3NodGhpIiAqLworICAgIDQxMSwgLTQwOSwgICAgICAgICAgLyogMTI2MTogIktobXIiLCAiS2htZXIiICovCisgICAgMjgzLCAtMjgzLCAgICAgICAgICAvKiAxMjYzOiAiR2VvayIsICJHZW9rIiAqLworICAgIDQxNCwgLTQxNCwgICAgICAgICAgLyogMTI2NTogIktvcmUiLCAiS29yZSIgKi8KKyAgICA0MTUsIC00MTUsICAgICAgICAgIC8qIDEyNjc6ICJLcGVsIiwgIktwZWwiICovCisgICAgNDMxLCAtNzc1LCAgICAgICAgICAvKiAxMjY5OiAiTGFuYSIsICJUYWlfVGhhbSIgKi8KKyAgICA0MzMsIC00MzIsICAgICAgICAgIC8qIDEyNzE6ICJMYW9vIiwgIkxhbyIgKi8KKyAgICA0NDQsIC00MzYsICAgICAgICAgIC8qIDEyNzM6ICJMYXRuIiwgIkxhdGluIiAqLworICAgIDQzNCwgLTQzNCwgICAgICAgICAgLyogMTI3NTogIkxhdGYiLCAiTGF0ZiIgKi8KKyAgICA0MzUsIC00MzUsICAgICAgICAgIC8qIDEyNzc6ICJMYXRnIiwgIkxhdGciICovCisgICAgNDUyLCAtNDUzLCAgICAgICAgICAvKiAxMjc5OiAiTGVwYyIsICJMZXBjaGEiICovCisgICAgNDU3LCAtNDU4LCAgICAgICAgICAvKiAxMjgxOiAiTGltYiIsICJMaW1idSIgKi8KKyAgICA0NTksIC00NTksICAgICAgICAgIC8qIDEyODM6ICJMaW5hIiwgIkxpbmEiICovCisgICAgNDYwLCAtNDY0LCAgICAgICAgICAvKiAxMjg1OiAiTGluYiIsICJMaW5lYXJfQiIgKi8KKyAgICA0NjcsIC00NjcsICAgICAgICAgIC8qIDEyODc6ICJMaXN1IiwgIkxpc3UiICovCisgICAgNDcyLCAtNDcyLCAgICAgICAgICAvKiAxMjg5OiAiTG9tYSIsICJMb21hIiAqLworICAgIDQ4MCwgLTQ4MSwgICAgICAgICAgLyogMTI5MTogIkx5Y2kiLCAiTHljaWFuIiAqLworICAgIDQ4MiwgLTQ4MywgICAgICAgICAgLyogMTI5MzogIkx5ZGkiLCAiTHlkaWFuIiAqLworICAgIDUyMCwgLTQ4OSwgICAgICAgICAgLyogMTI5NTogIk1seW0iLCAiTWFsYXlhbGFtIiAqLworICAgIDQ5MCwgLTQ5MSwgICAgICAgICAgLyogMTI5NzogIk1hbmQiLCAiTWFuZGFpYyIgKi8KKyAgICA0OTMsIC00OTMsICAgICAgICAgIC8qIDEyOTk6ICJNYW5pIiwgIk1hbmkiICovCisgICAgODc3LCAtODc3LCAgICAgICAgICAvKiAxMzAxOiAiWm10aCIsICJabXRoIiAqLworICAgIDQ5OSwgLTQ5OSwgICAgICAgICAgLyogMTMwMzogIk1heWEiLCAiTWF5YSIgKi8KKyAgICA1MjksIC01MDYsICAgICAgICAgIC8qIDEzMDU6ICJNdGVpIiwgIk1lZXRlaV9NYXllayIgKi8KKyAgICA1MDcsIC01MDcsICAgICAgICAgIC8qIDEzMDc6ICJNZW5kIiwgIk1lbmQiICovCisgICAgNTA4LCAtNTA4LCAgICAgICAgICAvKiAxMzA5OiAiTWVyYyIsICJNZXJjIiAqLworICAgIDUwOSwgLTUwOSwgICAgICAgICAgLyogMTMxMTogIk1lcm8iLCAiTWVybyIgKi8KKyAgICA1MjUsIC01MjYsICAgICAgICAgIC8qIDEzMTM6ICJNb25nIiwgIk1vbmdvbGlhbiIgKi8KKyAgICA1MjcsIC01MjcsICAgICAgICAgIC8qIDEzMTU6ICJNb29uIiwgIk1vb24iICovCisgICAgNTI4LCAtNTI4LCAgICAgICAgICAvKiAxMzE3OiAiTXJvbyIsICJNcm9vIiAqLworICAgIDUzMywgLTUzMSwgICAgICAgICAgLyogMTMxOTogIk15bXIiLCAiTXlhbm1hciIgKi8KKyAgICA1NjIsIC01NjIsICAgICAgICAgIC8qIDEzMjE6ICJOYmF0IiwgIk5iYXQiICovCisgICAgNTY4LCAtNTY4LCAgICAgICAgICAvKiAxMzIzOiAiTmtnYiIsICJOa2diIiAqLworICAgIDc4MCwgLTU2NSwgICAgICAgICAgLyogMTMyNTogIlRhbHUiLCAiTmV3X1RhaV9MdWUiICovCisgICAgNTcwLCAtNTY5LCAgICAgICAgICAvKiAxMzI3OiAiTmtvbyIsICJOa28iICovCisgICAgNTg0LCAtNTg0LCAgICAgICAgICAvKiAxMzI5OiAiTnNodSIsICJOc2h1IiAqLworICAgIDU5OCwgLTU5OSwgICAgICAgICAgLyogMTMzMTogIk9nYW0iLCAiT2doYW0iICovCisgICAgMTk4LCAtMTk4LCAgICAgICAgICAvKiAxMzMzOiAiQ3lycyIsICJDeXJzIiAqLworICAgIDM0NSwgLTM0NSwgICAgICAgICAgLyogMTMzNTogIkh1bmciLCAiSHVuZyIgKi8KKyAgICAzNzcsIC02MDIsICAgICAgICAgIC8qIDEzMzc6ICJJdGFsIiwgIk9sZF9JdGFsaWMiICovCisgICAgNTU5LCAtNTU5LCAgICAgICAgICAvKiAxMzM5OiAiTmFyYiIsICJOYXJiIiAqLworICAgIDYzNCwgLTYzNCwgICAgICAgICAgLyogMTM0MTogIlBlcm0iLCAiUGVybSIgKi8KKyAgICA4NTYsIC02MDMsICAgICAgICAgIC8qIDEzNDM6ICJYcGVvIiwgIk9sZF9QZXJzaWFuIiAqLworICAgIDcwMiwgLTYwNCwgICAgICAgICAgLyogMTM0NTogIlNhcmIiLCAiT2xkX1NvdXRoX0FyYWJpYW4iICovCisgICAgNjAxLCAtNjAwLCAgICAgICAgICAvKiAxMzQ3OiAiT2xjayIsICJPbF9DaGlraSIgKi8KKyAgICA2MTAsIC02MDgsICAgICAgICAgIC8qIDEzNDk6ICJPcnlhIiwgIk9yaXlhIiAqLworICAgIDYwOSwgLTYwNSwgICAgICAgICAgLyogMTM1MTogIk9ya2giLCAiT2xkX1R1cmtpYyIgKi8KKyAgICA2MTEsIC02MTIsICAgICAgICAgIC8qIDEzNTM6ICJPc21hIiwgIk9zbWFueWEiICovCisgICAgMzQzLCAtMzQzLCAgICAgICAgICAvKiAxMzU1OiAiSG1uZyIsICJIbW5nIiAqLworICAgIDYyNSwgLTYyNSwgICAgICAgICAgLyogMTM1NzogIlBhbG0iLCAiUGFsbSIgKi8KKyAgICA2MzYsIC02MzcsICAgICAgICAgIC8qIDEzNTk6ICJQaGFnIiwgIlBoYWdzX1BhIiAqLworICAgIDY0MiwgLTY0MywgICAgICAgICAgLyogMTM2MTogIlBobngiLCAiUGhvZW5pY2lhbiIgKi8KKyAgICA2NDgsIC02NDgsICAgICAgICAgIC8qIDEzNjM6ICJQbHJkIiwgIlBscmQiICovCisgICAgNjQwLCAtNjQwLCAgICAgICAgICAvKiAxMzY1OiAiUGhscCIsICJQaGxwIiAqLworICAgIDY3OSwgLTY3MiwgICAgICAgICAgLyogMTM2NzogIlJqbmciLCAiUmVqYW5nIiAqLworICAgIDY4MCwgLTY4MCwgICAgICAgICAgLyogMTM2OTogIlJvcm8iLCAiUm9ybyIgKi8KKyAgICA2ODMsIC02ODIsICAgICAgICAgIC8qIDEzNzE6ICJSdW5yIiwgIlJ1bmljIiAqLworICAgIDcwMCwgLTY5OSwgICAgICAgICAgLyogMTM3MzogIlNhbXIiLCAiU2FtYXJpdGFuIiAqLworICAgIDcwMSwgLTcwMSwgICAgICAgICAgLyogMTM3NTogIlNhcmEiLCAiU2FyYSIgKi8KKyAgICA3MDMsIC03MDQsICAgICAgICAgIC8qIDEzNzc6ICJTYXVyIiwgIlNhdXJhc2h0cmEiICovCisgICAgNzIwLCAtNzIwLCAgICAgICAgICAvKiAxMzc5OiAiU2hyZCIsICJTaHJkIiAqLworICAgIDcxOCwgLTcxNywgICAgICAgICAgLyogMTM4MTogIlNoYXciLCAiU2hhdmlhbiIgKi8KKyAgICA3MTYsIC03MTYsICAgICAgICAgIC8qIDEzODM6ICJTZ253IiwgIlNnbnciICovCisgICAgMzI4LCAtMzI4LCAgICAgICAgICAvKiAxMzg1OiAiSGFucyIsICJIYW5zIiAqLworICAgIDcyNSwgLTcyNSwgICAgICAgICAgLyogMTM4NzogIlNpbmQiLCAiU2luZCIgKi8KKyAgICA3MjYsIC03MjcsICAgICAgICAgIC8qIDEzODk6ICJTaW5oIiwgIlNpbmhhbGEiICovCisgICAgNzM1LCAtNzM1LCAgICAgICAgICAvKiAxMzkxOiAiU29yYSIsICJTb3JhIiAqLworICAgIDc0NiwgLTc0NywgICAgICAgICAgLyogMTM5MzogIlN1bmQiLCAiU3VuZGFuZXNlIiAqLworICAgIDc1OSwgLTc2MCwgICAgICAgICAgLyogMTM5NTogIlN5bG8iLCAiU3lsb3RpX05hZ3JpIiAqLworICAgIDg4MCwgLTg4MCwgICAgICAgICAgLyogMTM5NzogIlpzeW0iLCAiWnN5bSIgKi8KKyAgICA3NjIsIC03NjQsICAgICAgICAgIC8qIDEzOTk6ICJTeXJjIiwgIlN5cmlhYyIgKi8KKyAgICA3OTUsIC03NjksICAgICAgICAgIC8qIDE0MDE6ICJUZ2xnIiwgIlRhZ2Fsb2ciICovCisgICAgNzcwLCAtNzcxLCAgICAgICAgICAvKiAxNDAzOiAiVGFnYiIsICJUYWdiYW53YSIgKi8KKyAgICA3NzksIC03NzQsICAgICAgICAgIC8qIDE0MDU6ICJUYWxlIiwgIlRhaV9MZSIgKi8KKyAgICA3ODQsIC03NzYsICAgICAgICAgIC8qIDE0MDc6ICJUYXZ0IiwgIlRhaV9WaWV0IiAqLworICAgIDc3OCwgLTc3OCwgICAgICAgICAgLyogMTQwOTogIlRha3IiLCAiVGFrciIgKi8KKyAgICA3ODIsIC03ODEsICAgICAgICAgIC8qIDE0MTE6ICJUYW1sIiwgIlRhbWlsIiAqLworICAgIDc4MywgLTc4MywgICAgICAgICAgLyogMTQxMzogIlRhbmciLCAiVGFuZyIgKi8KKyAgICA3ODgsIC03ODksICAgICAgICAgIC8qIDE0MTU6ICJUZWx1IiwgIlRlbHVndSIgKi8KKyAgICA3OTAsIC03OTAsICAgICAgICAgIC8qIDE0MTc6ICJUZW5nIiwgIlRlbmciICovCisgICAgNzk2LCAtNzk3LCAgICAgICAgICAvKiAxNDE5OiAiVGhhYSIsICJUaGFhbmEiICovCisgICAgNzk4LCAtNzk4LCAgICAgICAgICAvKiAxNDIxOiAiVGhhaSIsICJUaGFpIiAqLworICAgIDgwMCwgLTc5OSwgICAgICAgICAgLyogMTQyMzogIlRpYnQiLCAiVGliZXRhbiIgKi8KKyAgICA3OTQsIC04MDEsICAgICAgICAgIC8qIDE0MjU6ICJUZm5nIiwgIlRpZmluYWdoIiAqLworICAgIDMyOSwgLTMyOSwgICAgICAgICAgLyogMTQyNzogIkhhbnQiLCAiSGFudCIgKi8KKyAgICA4MTIsIC04MTMsICAgICAgICAgIC8qIDE0Mjk6ICJVZ2FyIiwgIlVnYXJpdGljIiAqLworICAgIDg4MywgLTgxOSwgICAgICAgICAgLyogMTQzMTogIlp6enoiLCAiVW5rbm93biIgKi8KKyAgICA4ODEsIC04ODEsICAgICAgICAgIC8qIDE0MzM6ICJaeHh4IiwgIlp4eHgiICovCisgICAgODI4LCAtODI3LCAgICAgICAgICAvKiAxNDM1OiAiVmFpaSIsICJWYWkiICovCisgICAgODM3LCAtODM3LCAgICAgICAgICAvKiAxNDM3OiAiVmlzcCIsICJWaXNwIiAqLworICAgIDg0NCwgLTg0NCwgICAgICAgICAgLyogMTQzOTogIldhcmEiLCAiV2FyYSIgKi8KKyAgICA3NjYsIC03NjYsICAgICAgICAgIC8qIDE0NDE6ICJTeXJqIiwgIlN5cmoiICovCisgICAgODQ4LCAtODQ4LCAgICAgICAgICAvKiAxNDQzOiAiV29sZSIsICJXb2xlIiAqLworICAgIDg2NiwgLTg2MywgICAgICAgICAgLyogMTQ0NTogIllpaWkiLCAiWWkiICovCit9OworCisjZGVmaW5lIE1BWF9OQU1FU19QRVJfR1JPVVAgNAorCitjb25zdCBpbnQzMl90IFZBTFVFU19HQ0JfQ09VTlQgPSAxMjsKKworY29uc3QgQWxpYXMgVkFMVUVTX0dDQltdID0geworICAgIEFsaWFzKChpbnQzMl90KSBVX0dDQl9DT05UUk9MLCAwKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9HQ0JfQ1IsIDIpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0dDQl9FWFRFTkQsIDQpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0dDQl9MLCA2KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9HQ0JfTEYsIDgpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0dDQl9MViwgMTApLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0dDQl9MVlQsIDEyKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9HQ0JfT1RIRVIsIDE0KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9HQ0JfUFJFUEVORCwgMTYpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0dDQl9TUEFDSU5HX01BUkssIDE4KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9HQ0JfVCwgMjApLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0dDQl9WLCAyMiksCit9OworCitjb25zdCBpbnQzMl90IFZBTFVFU19ORkNfUUNfQ09VTlQgPSAzOworCitjb25zdCBBbGlhcyBWQUxVRVNfTkZDX1FDW10gPSB7CisgICAgQWxpYXMoKGludDMyX3QpIFVOT1JNX01BWUJFLCAyNCksCisgICAgQWxpYXMoKGludDMyX3QpIFVOT1JNX05PLCAyNiksCisgICAgQWxpYXMoKGludDMyX3QpIFVOT1JNX1lFUywgMjgpLAorfTsKKworY29uc3QgaW50MzJfdCBWQUxVRVNfTkZEX1FDX0NPVU5UID0gMjsKKworY29uc3QgQWxpYXMgVkFMVUVTX05GRF9RQ1tdID0geworICAgIEFsaWFzKChpbnQzMl90KSBVTk9STV9OTywgMjYpLAorICAgIEFsaWFzKChpbnQzMl90KSBVTk9STV9ZRVMsIDI4KSwKK307CisKK2NvbnN0IGludDMyX3QgVkFMVUVTX05GS0NfUUNfQ09VTlQgPSAzOworCitjb25zdCBBbGlhcyBWQUxVRVNfTkZLQ19RQ1tdID0geworICAgIEFsaWFzKChpbnQzMl90KSBVTk9STV9NQVlCRSwgMjQpLAorICAgIEFsaWFzKChpbnQzMl90KSBVTk9STV9OTywgMjYpLAorICAgIEFsaWFzKChpbnQzMl90KSBVTk9STV9ZRVMsIDI4KSwKK307CisKK2NvbnN0IGludDMyX3QgVkFMVUVTX05GS0RfUUNfQ09VTlQgPSAyOworCitjb25zdCBBbGlhcyBWQUxVRVNfTkZLRF9RQ1tdID0geworICAgIEFsaWFzKChpbnQzMl90KSBVTk9STV9OTywgMjYpLAorICAgIEFsaWFzKChpbnQzMl90KSBVTk9STV9ZRVMsIDI4KSwKK307CisKK2NvbnN0IGludDMyX3QgVkFMVUVTX1NCX0NPVU5UID0gMTU7CisKK2NvbnN0IEFsaWFzIFZBTFVFU19TQltdID0geworICAgIEFsaWFzKChpbnQzMl90KSBVX1NCX0FURVJNLCAzMCksCisgICAgQWxpYXMoKGludDMyX3QpIFVfU0JfQ0xPU0UsIDMyKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9TQl9DUiwgMiksCisgICAgQWxpYXMoKGludDMyX3QpIFVfU0JfRVhURU5ELCA0KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9TQl9GT1JNQVQsIDM0KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9TQl9MRiwgOCksCisgICAgQWxpYXMoKGludDMyX3QpIFVfU0JfTE9XRVIsIDM2KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9TQl9OVU1FUklDLCAzOCksCisgICAgQWxpYXMoKGludDMyX3QpIFVfU0JfT0xFVFRFUiwgNDApLAorICAgIEFsaWFzKChpbnQzMl90KSBVX1NCX09USEVSLCAxNCksCisgICAgQWxpYXMoKGludDMyX3QpIFVfU0JfU0NPTlRJTlVFLCA0MiksCisgICAgQWxpYXMoKGludDMyX3QpIFVfU0JfU0VQLCA0NCksCisgICAgQWxpYXMoKGludDMyX3QpIFVfU0JfU1AsIDQ2KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9TQl9TVEVSTSwgNDgpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX1NCX1VQUEVSLCA1MCksCit9OworCitjb25zdCBpbnQzMl90IFZBTFVFU19XQl9DT1VOVCA9IDEzOworCitjb25zdCBBbGlhcyBWQUxVRVNfV0JbXSA9IHsKKyAgICBBbGlhcygoaW50MzJfdCkgVV9XQl9BTEVUVEVSLCA1MiksCisgICAgQWxpYXMoKGludDMyX3QpIFVfV0JfQ1IsIDIpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX1dCX0VYVEVORCwgNTQpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX1dCX0VYVEVORE5VTUxFVCwgNTYpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX1dCX0ZPUk1BVCwgMzQpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX1dCX0tBVEFLQU5BLCA1OCksCisgICAgQWxpYXMoKGludDMyX3QpIFVfV0JfTEYsIDgpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX1dCX01JRExFVFRFUiwgNjApLAorICAgIEFsaWFzKChpbnQzMl90KSBVX1dCX01JRE5VTSwgNjIpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX1dCX01JRE5VTUxFVCwgNjQpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX1dCX05FV0xJTkUsIDY2KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9XQl9OVU1FUklDLCAzOCksCisgICAgQWxpYXMoKGludDMyX3QpIFVfV0JfT1RIRVIsIDE0KSwKK307CisKK2NvbnN0IGludDMyX3QgVkFMVUVTX2JjX0NPVU5UID0gMTk7CisKK2NvbnN0IEFsaWFzIFZBTFVFU19iY1tdID0geworICAgIEFsaWFzKChpbnQzMl90KSBVX0FSQUJJQ19OVU1CRVIsIDI1OCksCisgICAgQWxpYXMoKGludDMyX3QpIFVfQkxPQ0tfU0VQQVJBVE9SLCAyNjApLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0JPVU5EQVJZX05FVVRSQUwsIDI2MiksCisgICAgQWxpYXMoKGludDMyX3QpIFVfQ09NTU9OX05VTUJFUl9TRVBBUkFUT1IsIDI2NCksCisgICAgQWxpYXMoKGludDMyX3QpIFVfRElSX05PTl9TUEFDSU5HX01BUkssIDI2NiksCisgICAgQWxpYXMoKGludDMyX3QpIFVfRVVST1BFQU5fTlVNQkVSLCAyNjgpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0VVUk9QRUFOX05VTUJFUl9TRVBBUkFUT1IsIDI3MCksCisgICAgQWxpYXMoKGludDMyX3QpIFVfRVVST1BFQU5fTlVNQkVSX1RFUk1JTkFUT1IsIDI3MiksCisgICAgQWxpYXMoKGludDMyX3QpIFVfTEVGVF9UT19SSUdIVCwgMjc0KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9MRUZUX1RPX1JJR0hUX0VNQkVERElORywgMjc2KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9MRUZUX1RPX1JJR0hUX09WRVJSSURFLCAyNzgpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX09USEVSX05FVVRSQUwsIDI4MCksCisgICAgQWxpYXMoKGludDMyX3QpIFVfUE9QX0RJUkVDVElPTkFMX0ZPUk1BVCwgMjgyKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9SSUdIVF9UT19MRUZULCAyODQpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX1JJR0hUX1RPX0xFRlRfQVJBQklDLCAyODYpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX1JJR0hUX1RPX0xFRlRfRU1CRURESU5HLCAyODgpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX1JJR0hUX1RPX0xFRlRfT1ZFUlJJREUsIDI5MCksCisgICAgQWxpYXMoKGludDMyX3QpIFVfU0VHTUVOVF9TRVBBUkFUT1IsIDI5MiksCisgICAgQWxpYXMoKGludDMyX3QpIFVfV0hJVEVfU1BBQ0VfTkVVVFJBTCwgMjk0KSwKK307CisKK2NvbnN0IGludDMyX3QgVkFMVUVTX2JpbnByb3BfQ09VTlQgPSAyOworCitjb25zdCBBbGlhcyBWQUxVRVNfYmlucHJvcFtdID0geworICAgIEFsaWFzKChpbnQzMl90KSAwLCAyOTYpLAorICAgIEFsaWFzKChpbnQzMl90KSAxLCAzMDApLAorfTsKKworY29uc3QgaW50MzJfdCBWQUxVRVNfYmxrX0NPVU5UID0gMjEwOworCitjb25zdCBBbGlhcyBWQUxVRVNfYmxrW10gPSB7CisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19BRUdFQU5fTlVNQkVSUywgMzA0KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX0FMQ0hFTUlDQUxfU1lNQk9MUywgMzA2KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX0FMUEhBQkVUSUNfUFJFU0VOVEFUSU9OX0ZPUk1TLCAzMDgpLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfQU5DSUVOVF9HUkVFS19NVVNJQ0FMX05PVEFUSU9OLCAzMTApLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfQU5DSUVOVF9HUkVFS19OVU1CRVJTLCAzMTIpLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfQU5DSUVOVF9TWU1CT0xTLCAzMTQpLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfQVJBQklDLCAzMTYpLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfQVJBQklDX1BSRVNFTlRBVElPTl9GT1JNU19BLCAzMTgpLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfQVJBQklDX1BSRVNFTlRBVElPTl9GT1JNU19CLCAzMjEpLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfQVJBQklDX1NVUFBMRU1FTlQsIDMyMyksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19BUk1FTklBTiwgMzI1KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX0FSUk9XUywgMzI3KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX0FWRVNUQU4sIDMyOSksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19CQUxJTkVTRSwgMzMxKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX0JBTVVNLCAzMzMpLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfQkFNVU1fU1VQUExFTUVOVCwgMzM1KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX0JBU0lDX0xBVElOLCAzMzcpLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfQkFUQUssIDM0MCksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19CRU5HQUxJLCAzNDIpLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfQkxPQ0tfRUxFTUVOVFMsIDM0NCksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19CT1BPTU9GTywgMzQ2KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX0JPUE9NT0ZPX0VYVEVOREVELCAzNDgpLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfQk9YX0RSQVdJTkcsIDM1MCksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19CUkFITUksIDM1MiksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19CUkFJTExFX1BBVFRFUk5TLCAzNTQpLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfQlVHSU5FU0UsIDM1NiksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19CVUhJRCwgMzU4KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX0JZWkFOVElORV9NVVNJQ0FMX1NZTUJPTFMsIDM2MCksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19DQVJJQU4sIDM2MiksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19DSEFNLCAzNjQpLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfQ0hFUk9LRUUsIDM2NiksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19DSktfQ09NUEFUSUJJTElUWSwgMzY4KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX0NKS19DT01QQVRJQklMSVRZX0ZPUk1TLCAzNzApLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfQ0pLX0NPTVBBVElCSUxJVFlfSURFT0dSQVBIUywgMzcyKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX0NKS19DT01QQVRJQklMSVRZX0lERU9HUkFQSFNfU1VQUExFTUVOVCwgMzc0KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX0NKS19SQURJQ0FMU19TVVBQTEVNRU5ULCAzNzYpLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfQ0pLX1NUUk9LRVMsIDM3OCksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19DSktfU1lNQk9MU19BTkRfUFVOQ1RVQVRJT04sIDM4MCksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19DSktfVU5JRklFRF9JREVPR1JBUEhTLCAzODIpLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfQ0pLX1VOSUZJRURfSURFT0dSQVBIU19FWFRFTlNJT05fQSwgMzg0KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX0NKS19VTklGSUVEX0lERU9HUkFQSFNfRVhURU5TSU9OX0IsIDM4NiksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19DSktfVU5JRklFRF9JREVPR1JBUEhTX0VYVEVOU0lPTl9DLCAzODgpLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfQ0pLX1VOSUZJRURfSURFT0dSQVBIU19FWFRFTlNJT05fRCwgMzkwKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX0NPTUJJTklOR19ESUFDUklUSUNBTF9NQVJLUywgMzkyKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX0NPTUJJTklOR19ESUFDUklUSUNBTF9NQVJLU19TVVBQTEVNRU5ULCAzOTQpLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfQ09NQklOSU5HX0hBTEZfTUFSS1MsIDM5NiksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19DT01CSU5JTkdfTUFSS1NfRk9SX1NZTUJPTFMsIDM5OCksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19DT01NT05fSU5ESUNfTlVNQkVSX0ZPUk1TLCA0MDEpLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfQ09OVFJPTF9QSUNUVVJFUywgNDAzKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX0NPUFRJQywgNDA1KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX0NPVU5USU5HX1JPRF9OVU1FUkFMUywgNDA3KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX0NVTkVJRk9STSwgNDA5KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX0NVTkVJRk9STV9OVU1CRVJTX0FORF9QVU5DVFVBVElPTiwgNDExKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX0NVUlJFTkNZX1NZTUJPTFMsIDQxMyksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19DWVBSSU9UX1NZTExBQkFSWSwgNDE1KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX0NZUklMTElDLCA0MTcpLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfQ1lSSUxMSUNfRVhURU5ERURfQSwgNDE5KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX0NZUklMTElDX0VYVEVOREVEX0IsIDQyMSksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19DWVJJTExJQ19TVVBQTEVNRU5ULCA0MjMpLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfREVTRVJFVCwgNDI2KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX0RFVkFOQUdBUkksIDQyOCksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19ERVZBTkFHQVJJX0VYVEVOREVELCA0MzApLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfRElOR0JBVFMsIDQzMiksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19ET01JTk9fVElMRVMsIDQzNCksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19FR1lQVElBTl9ISUVST0dMWVBIUywgNDM2KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX0VNT1RJQ09OUywgNDM4KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX0VOQ0xPU0VEX0FMUEhBTlVNRVJJQ1MsIDQ0MCksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19FTkNMT1NFRF9BTFBIQU5VTUVSSUNfU1VQUExFTUVOVCwgNDQyKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX0VOQ0xPU0VEX0NKS19MRVRURVJTX0FORF9NT05USFMsIDQ0NCksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19FTkNMT1NFRF9JREVPR1JBUEhJQ19TVVBQTEVNRU5ULCA0NDYpLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfRVRISU9QSUMsIDQ0OCksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19FVEhJT1BJQ19FWFRFTkRFRCwgNDUwKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX0VUSElPUElDX0VYVEVOREVEX0EsIDQ1MiksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19FVEhJT1BJQ19TVVBQTEVNRU5ULCA0NTQpLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfR0VORVJBTF9QVU5DVFVBVElPTiwgNDU2KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX0dFT01FVFJJQ19TSEFQRVMsIDQ1OCksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19HRU9SR0lBTiwgNDYwKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX0dFT1JHSUFOX1NVUFBMRU1FTlQsIDQ2MiksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19HTEFHT0xJVElDLCA0NjQpLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfR09USElDLCA0NjYpLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfR1JFRUssIDQ2OCksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19HUkVFS19FWFRFTkRFRCwgNDcxKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX0dVSkFSQVRJLCA0NzMpLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfR1VSTVVLSEksIDQ3NSksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19IQUxGV0lEVEhfQU5EX0ZVTExXSURUSF9GT1JNUywgNDc3KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX0hBTkdVTF9DT01QQVRJQklMSVRZX0pBTU8sIDQ3OSksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19IQU5HVUxfSkFNTywgNDgxKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX0hBTkdVTF9KQU1PX0VYVEVOREVEX0EsIDQ4MyksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19IQU5HVUxfSkFNT19FWFRFTkRFRF9CLCA0ODUpLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfSEFOR1VMX1NZTExBQkxFUywgNDg3KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX0hBTlVOT08sIDQ4OSksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19IRUJSRVcsIDQ5MSksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19ISUdIX1BSSVZBVEVfVVNFX1NVUlJPR0FURVMsIDQ5MyksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19ISUdIX1NVUlJPR0FURVMsIDQ5NSksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19ISVJBR0FOQSwgNDk3KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX0lERU9HUkFQSElDX0RFU0NSSVBUSU9OX0NIQVJBQ1RFUlMsIDQ5OSksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19JTVBFUklBTF9BUkFNQUlDLCA1MDEpLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfSU5TQ1JJUFRJT05BTF9QQUhMQVZJLCA1MDMpLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfSU5TQ1JJUFRJT05BTF9QQVJUSElBTiwgNTA1KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX0lQQV9FWFRFTlNJT05TLCA1MDcpLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfSkFWQU5FU0UsIDUwOSksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19LQUlUSEksIDUxMSksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19LQU5BX1NVUFBMRU1FTlQsIDUxMyksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19LQU5CVU4sIDUxNSksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19LQU5HWElfUkFESUNBTFMsIDUxNyksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19LQU5OQURBLCA1MTkpLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfS0FUQUtBTkEsIDUyMSksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19LQVRBS0FOQV9QSE9ORVRJQ19FWFRFTlNJT05TLCA1MjMpLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfS0FZQUhfTEksIDUyNSksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19LSEFST1NIVEhJLCA1MjcpLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfS0hNRVIsIDUyOSksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19LSE1FUl9TWU1CT0xTLCA1MzEpLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfTEFPLCA1MzMpLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfTEFUSU5fMV9TVVBQTEVNRU5ULCA1MzUpLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfTEFUSU5fRVhURU5ERURfQSwgNTM4KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX0xBVElOX0VYVEVOREVEX0FERElUSU9OQUwsIDU0MCksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19MQVRJTl9FWFRFTkRFRF9CLCA1NDIpLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfTEFUSU5fRVhURU5ERURfQywgNTQ0KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX0xBVElOX0VYVEVOREVEX0QsIDU0NiksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19MRVBDSEEsIDU0OCksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19MRVRURVJMSUtFX1NZTUJPTFMsIDU1MCksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19MSU1CVSwgNTUyKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX0xJTkVBUl9CX0lERU9HUkFNUywgNTU0KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX0xJTkVBUl9CX1NZTExBQkFSWSwgNTU2KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX0xJU1UsIDU1OCksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19MT1dfU1VSUk9HQVRFUywgNTYwKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX0xZQ0lBTiwgNTYyKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX0xZRElBTiwgNTY0KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX01BSEpPTkdfVElMRVMsIDU2NiksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19NQUxBWUFMQU0sIDU2OCksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19NQU5EQUlDLCA1NzApLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfTUFUSEVNQVRJQ0FMX0FMUEhBTlVNRVJJQ19TWU1CT0xTLCA1NzIpLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfTUFUSEVNQVRJQ0FMX09QRVJBVE9SUywgNTc0KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX01FRVRFSV9NQVlFSywgNTc2KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX01JU0NFTExBTkVPVVNfTUFUSEVNQVRJQ0FMX1NZTUJPTFNfQSwgNTc4KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX01JU0NFTExBTkVPVVNfTUFUSEVNQVRJQ0FMX1NZTUJPTFNfQiwgNTgwKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX01JU0NFTExBTkVPVVNfU1lNQk9MUywgNTgyKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX01JU0NFTExBTkVPVVNfU1lNQk9MU19BTkRfQVJST1dTLCA1ODQpLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfTUlTQ0VMTEFORU9VU19TWU1CT0xTX0FORF9QSUNUT0dSQVBIUywgNTg2KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX01JU0NFTExBTkVPVVNfVEVDSE5JQ0FMLCA1ODgpLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfTU9ESUZJRVJfVE9ORV9MRVRURVJTLCA1OTApLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfTU9OR09MSUFOLCA1OTIpLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfTVVTSUNBTF9TWU1CT0xTLCA1OTQpLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfTVlBTk1BUiwgNTk2KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX01ZQU5NQVJfRVhURU5ERURfQSwgNTk4KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX05FV19UQUlfTFVFLCA2MDApLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfTktPLCA2MDIpLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfTk9fQkxPQ0ssIDYwNCksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19OVU1CRVJfRk9STVMsIDYwNiksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19PR0hBTSwgNjA4KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX09MRF9JVEFMSUMsIDYxMCksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19PTERfUEVSU0lBTiwgNjEyKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX09MRF9TT1VUSF9BUkFCSUFOLCA2MTQpLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfT0xEX1RVUktJQywgNjE2KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX09MX0NISUtJLCA2MTgpLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfT1BUSUNBTF9DSEFSQUNURVJfUkVDT0dOSVRJT04sIDYyMCksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19PUklZQSwgNjIyKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX09TTUFOWUEsIDYyNCksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19QSEFHU19QQSwgNjI2KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX1BIQUlTVE9TX0RJU0MsIDYyOCksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19QSE9FTklDSUFOLCA2MzApLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfUEhPTkVUSUNfRVhURU5TSU9OUywgNjMyKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX1BIT05FVElDX0VYVEVOU0lPTlNfU1VQUExFTUVOVCwgNjM0KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX1BMQVlJTkdfQ0FSRFMsIDYzNiksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19QUklWQVRFX1VTRV9BUkVBLCA2MzgpLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfUkVKQU5HLCA2NDEpLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfUlVNSV9OVU1FUkFMX1NZTUJPTFMsIDY0MyksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19SVU5JQywgNjQ1KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX1NBTUFSSVRBTiwgNjQ3KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX1NBVVJBU0hUUkEsIDY0OSksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19TSEFWSUFOLCA2NTEpLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfU0lOSEFMQSwgNjUzKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX1NNQUxMX0ZPUk1fVkFSSUFOVFMsIDY1NSksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19TUEFDSU5HX01PRElGSUVSX0xFVFRFUlMsIDY1NyksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19TUEVDSUFMUywgNjU5KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX1NVTkRBTkVTRSwgNjYxKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX1NVUEVSU0NSSVBUU19BTkRfU1VCU0NSSVBUUywgNjYzKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX1NVUFBMRU1FTlRBTF9BUlJPV1NfQSwgNjY1KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX1NVUFBMRU1FTlRBTF9BUlJPV1NfQiwgNjY3KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX1NVUFBMRU1FTlRBTF9NQVRIRU1BVElDQUxfT1BFUkFUT1JTLCA2NjkpLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfU1VQUExFTUVOVEFMX1BVTkNUVUFUSU9OLCA2NzEpLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfU1VQUExFTUVOVEFSWV9QUklWQVRFX1VTRV9BUkVBX0EsIDY3MyksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19TVVBQTEVNRU5UQVJZX1BSSVZBVEVfVVNFX0FSRUFfQiwgNjc1KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX1NZTE9USV9OQUdSSSwgNjc3KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX1NZUklBQywgNjc5KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX1RBR0FMT0csIDY4MSksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19UQUdCQU5XQSwgNjgzKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX1RBR1MsIDY4NSksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19UQUlfTEUsIDY4NyksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19UQUlfVEhBTSwgNjg5KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX1RBSV9WSUVULCA2OTEpLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfVEFJX1hVQU5fSklOR19TWU1CT0xTLCA2OTMpLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfVEFNSUwsIDY5NSksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19URUxVR1UsIDY5NyksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19USEFBTkEsIDY5OSksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19USEFJLCA3MDEpLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfVElCRVRBTiwgNzAzKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX1RJRklOQUdILCA3MDUpLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfVFJBTlNQT1JUX0FORF9NQVBfU1lNQk9MUywgNzA3KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX1VHQVJJVElDLCA3MDkpLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfVU5JRklFRF9DQU5BRElBTl9BQk9SSUdJTkFMX1NZTExBQklDUywgNzExKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX1VOSUZJRURfQ0FOQURJQU5fQUJPUklHSU5BTF9TWUxMQUJJQ1NfRVhURU5ERUQsIDcxNCksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19WQUksIDcxNiksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19WQVJJQVRJT05fU0VMRUNUT1JTLCA3MTgpLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfVkFSSUFUSU9OX1NFTEVDVE9SU19TVVBQTEVNRU5ULCA3MjApLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfVkVESUNfRVhURU5TSU9OUywgNzIyKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX1ZFUlRJQ0FMX0ZPUk1TLCA3MjQpLAorICAgIEFsaWFzKChpbnQzMl90KSBVQkxPQ0tfWUlKSU5HX0hFWEFHUkFNX1NZTUJPTFMsIDcyNiksCisgICAgQWxpYXMoKGludDMyX3QpIFVCTE9DS19ZSV9SQURJQ0FMUywgNzI4KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVUJMT0NLX1lJX1NZTExBQkxFUywgNzMwKSwKK307CisKK2NvbnN0IGludDMyX3QgVkFMVUVTX2NjY19DT1VOVCA9IDIwOworCitjb25zdCBBbGlhcyBWQUxVRVNfY2NjW10gPSB7CisgICAgQWxpYXMoKGludDMyX3QpIDAsIDczMiksCisgICAgQWxpYXMoKGludDMyX3QpIDEsIDczNCksCisgICAgQWxpYXMoKGludDMyX3QpIDIwMCwgNzM2KSwKKyAgICBBbGlhcygoaW50MzJfdCkgMjAyLCA3MzgpLAorICAgIEFsaWFzKChpbnQzMl90KSAyMTQsIDc0MCksCisgICAgQWxpYXMoKGludDMyX3QpIDIxNiwgNzQyKSwKKyAgICBBbGlhcygoaW50MzJfdCkgMjE4LCA3NDQpLAorICAgIEFsaWFzKChpbnQzMl90KSAyMjAsIDc0NiksCisgICAgQWxpYXMoKGludDMyX3QpIDIyMiwgNzQ4KSwKKyAgICBBbGlhcygoaW50MzJfdCkgMjI0LCA3NTApLAorICAgIEFsaWFzKChpbnQzMl90KSAyMjYsIDc1MiksCisgICAgQWxpYXMoKGludDMyX3QpIDIyOCwgNzU0KSwKKyAgICBBbGlhcygoaW50MzJfdCkgMjMwLCA3NTYpLAorICAgIEFsaWFzKChpbnQzMl90KSAyMzIsIDc1OCksCisgICAgQWxpYXMoKGludDMyX3QpIDIzMywgNzYwKSwKKyAgICBBbGlhcygoaW50MzJfdCkgMjM0LCA3NjIpLAorICAgIEFsaWFzKChpbnQzMl90KSAyNDAsIDc2NCksCisgICAgQWxpYXMoKGludDMyX3QpIDcsIDc2NiksCisgICAgQWxpYXMoKGludDMyX3QpIDgsIDc2OCksCisgICAgQWxpYXMoKGludDMyX3QpIDksIDc3MCksCit9OworCitjb25zdCBpbnQzMl90IFZBTFVFU19kdF9DT1VOVCA9IDE4OworCitjb25zdCBBbGlhcyBWQUxVRVNfZHRbXSA9IHsKKyAgICBBbGlhcygoaW50MzJfdCkgVV9EVF9DQU5PTklDQUwsIDc3MiksCisgICAgQWxpYXMoKGludDMyX3QpIFVfRFRfQ0lSQ0xFLCA3NzUpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0RUX0NPTVBBVCwgNzc4KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9EVF9GSU5BTCwgNzgxKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9EVF9GT05ULCA3ODQpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0RUX0ZSQUNUSU9OLCA3ODYpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0RUX0lOSVRJQUwsIDc4OSksCisgICAgQWxpYXMoKGludDMyX3QpIFVfRFRfSVNPTEFURUQsIDc5MiksCisgICAgQWxpYXMoKGludDMyX3QpIFVfRFRfTUVESUFMLCA3OTUpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0RUX05BUlJPVywgNzk4KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9EVF9OT0JSRUFLLCA4MDEpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0RUX05PTkUsIDgwNCksCisgICAgQWxpYXMoKGludDMyX3QpIFVfRFRfU01BTEwsIDgwNiksCisgICAgQWxpYXMoKGludDMyX3QpIFVfRFRfU1FVQVJFLCA4MDkpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0RUX1NVQiwgODEyKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9EVF9TVVBFUiwgODE0KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9EVF9WRVJUSUNBTCwgODE3KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9EVF9XSURFLCA4MjApLAorfTsKKworY29uc3QgaW50MzJfdCBWQUxVRVNfZWFfQ09VTlQgPSA2OworCitjb25zdCBBbGlhcyBWQUxVRVNfZWFbXSA9IHsKKyAgICBBbGlhcygoaW50MzJfdCkgVV9FQV9BTUJJR1VPVVMsIDgyMiksCisgICAgQWxpYXMoKGludDMyX3QpIFVfRUFfRlVMTFdJRFRILCA4MjQpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0VBX0hBTEZXSURUSCwgODI2KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9FQV9OQVJST1csIDgyOCksCisgICAgQWxpYXMoKGludDMyX3QpIFVfRUFfTkVVVFJBTCwgODMwKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9FQV9XSURFLCA4MzIpLAorfTsKKworY29uc3QgaW50MzJfdCBWQUxVRVNfZ2NfQ09VTlQgPSAzMDsKKworY29uc3QgQWxpYXMgVkFMVUVTX2djW10gPSB7CisgICAgQWxpYXMoKGludDMyX3QpIFVfQ09NQklOSU5HX1NQQUNJTkdfTUFSSywgODM0KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9DT05ORUNUT1JfUFVOQ1RVQVRJT04sIDgzNiksCisgICAgQWxpYXMoKGludDMyX3QpIFVfQ09OVFJPTF9DSEFSLCA4MzgpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0NVUlJFTkNZX1NZTUJPTCwgODQxKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9EQVNIX1BVTkNUVUFUSU9OLCA4NDMpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0RFQ0lNQUxfRElHSVRfTlVNQkVSLCA4NDUpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0VOQ0xPU0lOR19NQVJLLCA4NDgpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0VORF9QVU5DVFVBVElPTiwgODUwKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9GSU5BTF9QVU5DVFVBVElPTiwgODUyKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9GT1JNQVRfQ0hBUiwgODU0KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9HRU5FUkFMX09USEVSX1RZUEVTLCA4NTYpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0lOSVRJQUxfUFVOQ1RVQVRJT04sIDg1OCksCisgICAgQWxpYXMoKGludDMyX3QpIFVfTEVUVEVSX05VTUJFUiwgODYwKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9MSU5FX1NFUEFSQVRPUiwgODYyKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9MT1dFUkNBU0VfTEVUVEVSLCA4NjQpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX01BVEhfU1lNQk9MLCA4NjYpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX01PRElGSUVSX0xFVFRFUiwgODY4KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9NT0RJRklFUl9TWU1CT0wsIDg3MCksCisgICAgQWxpYXMoKGludDMyX3QpIFVfTk9OX1NQQUNJTkdfTUFSSywgODcyKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9PVEhFUl9MRVRURVIsIDg3NCksCisgICAgQWxpYXMoKGludDMyX3QpIFVfT1RIRVJfTlVNQkVSLCA4NzYpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX09USEVSX1BVTkNUVUFUSU9OLCA4NzgpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX09USEVSX1NZTUJPTCwgODgwKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9QQVJBR1JBUEhfU0VQQVJBVE9SLCA4ODIpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX1BSSVZBVEVfVVNFX0NIQVIsIDg4NCksCisgICAgQWxpYXMoKGludDMyX3QpIFVfU1BBQ0VfU0VQQVJBVE9SLCA4ODYpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX1NUQVJUX1BVTkNUVUFUSU9OLCA4ODgpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX1NVUlJPR0FURSwgODkwKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9USVRMRUNBU0VfTEVUVEVSLCA4OTIpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX1VQUEVSQ0FTRV9MRVRURVIsIDg5NCksCit9OworCitjb25zdCBpbnQzMl90IFZBTFVFU19nY21fQ09VTlQgPSAzODsKKworY29uc3QgQWxpYXMgVkFMVUVTX2djbVtdID0geworICAgIEFsaWFzKChpbnQzMl90KSBVX0dDX0NDX01BU0ssIDgzOCksCisgICAgQWxpYXMoKGludDMyX3QpIFVfR0NfQ0ZfTUFTSywgODU0KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9HQ19DTl9NQVNLLCA4NTYpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0dDX0NPX01BU0ssIDg4NCksCisgICAgQWxpYXMoKGludDMyX3QpIFVfR0NfQ1NfTUFTSywgODkwKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9HQ19DX01BU0ssIDg5NiksCisgICAgQWxpYXMoKGludDMyX3QpIFVfR0NfTENfTUFTSywgODk4KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9HQ19MTF9NQVNLLCA4NjQpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0dDX0xNX01BU0ssIDg2OCksCisgICAgQWxpYXMoKGludDMyX3QpIFVfR0NfTE9fTUFTSywgODc0KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9HQ19MVF9NQVNLLCA4OTIpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0dDX0xVX01BU0ssIDg5NCksCisgICAgQWxpYXMoKGludDMyX3QpIFVfR0NfTF9NQVNLLCA5MDApLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0dDX01DX01BU0ssIDgzNCksCisgICAgQWxpYXMoKGludDMyX3QpIFVfR0NfTUVfTUFTSywgODQ4KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9HQ19NTl9NQVNLLCA4NzIpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0dDX01fTUFTSywgOTAyKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9HQ19ORF9NQVNLLCA4NDUpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0dDX05MX01BU0ssIDg2MCksCisgICAgQWxpYXMoKGludDMyX3QpIFVfR0NfTk9fTUFTSywgODc2KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9HQ19OX01BU0ssIDkwNCksCisgICAgQWxpYXMoKGludDMyX3QpIFVfR0NfUENfTUFTSywgODM2KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9HQ19QRF9NQVNLLCA4NDMpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0dDX1BFX01BU0ssIDg1MCksCisgICAgQWxpYXMoKGludDMyX3QpIFVfR0NfUEZfTUFTSywgODUyKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9HQ19QSV9NQVNLLCA4NTgpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0dDX1BPX01BU0ssIDg3OCksCisgICAgQWxpYXMoKGludDMyX3QpIFVfR0NfUFNfTUFTSywgODg4KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9HQ19QX01BU0ssIDkwNiksCisgICAgQWxpYXMoKGludDMyX3QpIFVfR0NfU0NfTUFTSywgODQxKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9HQ19TS19NQVNLLCA4NzApLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0dDX1NNX01BU0ssIDg2NiksCisgICAgQWxpYXMoKGludDMyX3QpIFVfR0NfU09fTUFTSywgODgwKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9HQ19TX01BU0ssIDkwOSksCisgICAgQWxpYXMoKGludDMyX3QpIFVfR0NfWkxfTUFTSywgODYyKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9HQ19aUF9NQVNLLCA4ODIpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0dDX1pTX01BU0ssIDg4NiksCisgICAgQWxpYXMoKGludDMyX3QpIFVfR0NfWl9NQVNLLCA5MTEpLAorfTsKKworY29uc3QgaW50MzJfdCBWQUxVRVNfaHN0X0NPVU5UID0gNjsKKworY29uc3QgQWxpYXMgVkFMVUVTX2hzdFtdID0geworICAgIEFsaWFzKChpbnQzMl90KSBVX0hTVF9MRUFESU5HX0pBTU8sIDkxMyksCisgICAgQWxpYXMoKGludDMyX3QpIFVfSFNUX0xWVF9TWUxMQUJMRSwgOTE1KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9IU1RfTFZfU1lMTEFCTEUsIDkxNyksCisgICAgQWxpYXMoKGludDMyX3QpIFVfSFNUX05PVF9BUFBMSUNBQkxFLCA5MTkpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0hTVF9UUkFJTElOR19KQU1PLCA5MjEpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0hTVF9WT1dFTF9KQU1PLCA5MjMpLAorfTsKKworY29uc3QgaW50MzJfdCBWQUxVRVNfamdfQ09VTlQgPSA1NzsKKworY29uc3QgQWxpYXMgVkFMVUVTX2pnW10gPSB7CisgICAgQWxpYXMoKGludDMyX3QpIFVfSkdfQUlOLCA5MjUpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0pHX0FMQVBILCA5MjcpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0pHX0FMRUYsIDkyOSksCisgICAgQWxpYXMoKGludDMyX3QpIFVfSkdfQkVILCA5MzEpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0pHX0JFVEgsIDkzMyksCisgICAgQWxpYXMoKGludDMyX3QpIFVfSkdfQlVSVVNIQVNLSV9ZRUhfQkFSUkVFLCA5MzUpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0pHX0RBTCwgOTM3KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9KR19EQUxBVEhfUklTSCwgOTM5KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9KR19FLCA5NDEpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0pHX0ZBUlNJX1lFSCwgOTQzKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9KR19GRSwgOTQ1KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9KR19GRUgsIDk0NyksCisgICAgQWxpYXMoKGludDMyX3QpIFVfSkdfRklOQUxfU0VNS0FUSCwgOTQ5KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9KR19HQUYsIDk1MSksCisgICAgQWxpYXMoKGludDMyX3QpIFVfSkdfR0FNQUwsIDk1MyksCisgICAgQWxpYXMoKGludDMyX3QpIFVfSkdfSEFILCA5NTUpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0pHX0hFLCA5NTcpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0pHX0hFSCwgOTU5KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9KR19IRUhfR09BTCwgOTYxKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9KR19IRVRILCA5NjMpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0pHX0tBRiwgOTY1KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9KR19LQVBILCA5NjcpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0pHX0tIQVBILCA5NjkpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0pHX0tOT1RURURfSEVILCA5NzEpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0pHX0xBTSwgOTczKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9KR19MQU1BREgsIDk3NSksCisgICAgQWxpYXMoKGludDMyX3QpIFVfSkdfTUVFTSwgOTc3KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9KR19NSU0sIDk3OSksCisgICAgQWxpYXMoKGludDMyX3QpIFVfSkdfTk9PTiwgOTgxKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9KR19OT19KT0lOSU5HX0dST1VQLCA5ODMpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0pHX05VTiwgOTg1KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9KR19OWUEsIDk4NyksCisgICAgQWxpYXMoKGludDMyX3QpIFVfSkdfUEUsIDk4OSksCisgICAgQWxpYXMoKGludDMyX3QpIFVfSkdfUUFGLCA5OTEpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0pHX1FBUEgsIDk5MyksCisgICAgQWxpYXMoKGludDMyX3QpIFVfSkdfUkVILCA5OTUpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0pHX1JFVkVSU0VEX1BFLCA5OTcpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0pHX1NBRCwgOTk5KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9KR19TQURIRSwgMTAwMSksCisgICAgQWxpYXMoKGludDMyX3QpIFVfSkdfU0VFTiwgMTAwMyksCisgICAgQWxpYXMoKGludDMyX3QpIFVfSkdfU0VNS0FUSCwgMTAwNSksCisgICAgQWxpYXMoKGludDMyX3QpIFVfSkdfU0hJTiwgMTAwNyksCisgICAgQWxpYXMoKGludDMyX3QpIFVfSkdfU1dBU0hfS0FGLCAxMDA5KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9KR19TWVJJQUNfV0FXLCAxMDExKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9KR19UQUgsIDEwMTMpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0pHX1RBVywgMTAxNSksCisgICAgQWxpYXMoKGludDMyX3QpIFVfSkdfVEVIX01BUkJVVEEsIDEwMTcpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0pHX1RFSF9NQVJCVVRBX0dPQUwsIDEwMTkpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0pHX1RFVEgsIDEwMjIpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0pHX1dBVywgMTAyNCksCisgICAgQWxpYXMoKGludDMyX3QpIFVfSkdfWUVILCAxMDI2KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9KR19ZRUhfQkFSUkVFLCAxMDI4KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9KR19ZRUhfV0lUSF9UQUlMLCAxMDMwKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9KR19ZVURILCAxMDMyKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9KR19ZVURIX0hFLCAxMDM0KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9KR19aQUlOLCAxMDM2KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9KR19aSEFJTiwgMTAzOCksCit9OworCitjb25zdCBpbnQzMl90IFZBTFVFU19qdF9DT1VOVCA9IDY7CisKK2NvbnN0IEFsaWFzIFZBTFVFU19qdFtdID0geworICAgIEFsaWFzKChpbnQzMl90KSBVX0pUX0RVQUxfSk9JTklORywgMTA0MCksCisgICAgQWxpYXMoKGludDMyX3QpIFVfSlRfSk9JTl9DQVVTSU5HLCAxMDQyKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9KVF9MRUZUX0pPSU5JTkcsIDEwNDQpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0pUX05PTl9KT0lOSU5HLCAxMDQ2KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9KVF9SSUdIVF9KT0lOSU5HLCAxMDQ4KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9KVF9UUkFOU1BBUkVOVCwgMTA1MCksCit9OworCitjb25zdCBpbnQzMl90IFZBTFVFU19sYl9DT1VOVCA9IDM3OworCitjb25zdCBBbGlhcyBWQUxVRVNfbGJbXSA9IHsKKyAgICBBbGlhcygoaW50MzJfdCkgVV9MQl9BTFBIQUJFVElDLCAxMDUyKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9MQl9BTUJJR1VPVVMsIDEwNTQpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0xCX0JSRUFLX0FGVEVSLCAxMDU2KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9MQl9CUkVBS19CRUZPUkUsIDEwNTgpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0xCX0JSRUFLX0JPVEgsIDEwNjApLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0xCX0JSRUFLX1NZTUJPTFMsIDEwNjIpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0xCX0NBUlJJQUdFX1JFVFVSTiwgMTA2NCksCisgICAgQWxpYXMoKGludDMyX3QpIFVfTEJfQ0xPU0VfUEFSRU5USEVTSVMsIDEwNjYpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0xCX0NMT1NFX1BVTkNUVUFUSU9OLCAxMDY4KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9MQl9DT01CSU5JTkdfTUFSSywgMTA3MCksCisgICAgQWxpYXMoKGludDMyX3QpIFVfTEJfQ09NUExFWF9DT05URVhULCAxMDcyKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9MQl9DT05USU5HRU5UX0JSRUFLLCAxMDc0KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9MQl9FWENMQU1BVElPTiwgMTA3NiksCisgICAgQWxpYXMoKGludDMyX3QpIFVfTEJfR0xVRSwgMTA3OCksCisgICAgQWxpYXMoKGludDMyX3QpIFVfTEJfSDIsIDEwODApLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0xCX0gzLCAxMDgyKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9MQl9IWVBIRU4sIDEwODQpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0xCX0lERU9HUkFQSElDLCAxMDg2KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9MQl9JTkZJWF9OVU1FUklDLCAxMDg4KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9MQl9JTlNFUEFSQUJMRSwgMTA5MCksCisgICAgQWxpYXMoKGludDMyX3QpIFVfTEJfSkwsIDEwOTMpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0xCX0pULCAxMDk1KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9MQl9KViwgMTA5NyksCisgICAgQWxpYXMoKGludDMyX3QpIFVfTEJfTElORV9GRUVELCAxMDk5KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9MQl9NQU5EQVRPUllfQlJFQUssIDExMDEpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0xCX05FWFRfTElORSwgMTEwMyksCisgICAgQWxpYXMoKGludDMyX3QpIFVfTEJfTk9OU1RBUlRFUiwgMTEwNSksCisgICAgQWxpYXMoKGludDMyX3QpIFVfTEJfTlVNRVJJQywgMzgpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0xCX09QRU5fUFVOQ1RVQVRJT04sIDExMDcpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0xCX1BPU1RGSVhfTlVNRVJJQywgMTEwOSksCisgICAgQWxpYXMoKGludDMyX3QpIFVfTEJfUFJFRklYX05VTUVSSUMsIDExMTEpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0xCX1FVT1RBVElPTiwgMTExMyksCisgICAgQWxpYXMoKGludDMyX3QpIFVfTEJfU1BBQ0UsIDExMTUpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0xCX1NVUlJPR0FURSwgMTExNyksCisgICAgQWxpYXMoKGludDMyX3QpIFVfTEJfVU5LTk9XTiwgMTExOSksCisgICAgQWxpYXMoKGludDMyX3QpIFVfTEJfV09SRF9KT0lORVIsIDExMjEpLAorICAgIEFsaWFzKChpbnQzMl90KSBVX0xCX1pXU1BBQ0UsIDExMjMpLAorfTsKKworY29uc3QgaW50MzJfdCBWQUxVRVNfbGNjY19DT1VOVCA9IDIwOworCitjb25zdCBBbGlhcyBWQUxVRVNfbGNjY1tdID0geworICAgIEFsaWFzKChpbnQzMl90KSAwLCA3MzIpLAorICAgIEFsaWFzKChpbnQzMl90KSAxLCA3MzQpLAorICAgIEFsaWFzKChpbnQzMl90KSAyMDAsIDczNiksCisgICAgQWxpYXMoKGludDMyX3QpIDIwMiwgNzM4KSwKKyAgICBBbGlhcygoaW50MzJfdCkgMjE0LCA3NDApLAorICAgIEFsaWFzKChpbnQzMl90KSAyMTYsIDc0MiksCisgICAgQWxpYXMoKGludDMyX3QpIDIxOCwgNzQ0KSwKKyAgICBBbGlhcygoaW50MzJfdCkgMjIwLCA3NDYpLAorICAgIEFsaWFzKChpbnQzMl90KSAyMjIsIDc0OCksCisgICAgQWxpYXMoKGludDMyX3QpIDIyNCwgNzUwKSwKKyAgICBBbGlhcygoaW50MzJfdCkgMjI2LCA3NTIpLAorICAgIEFsaWFzKChpbnQzMl90KSAyMjgsIDc1NCksCisgICAgQWxpYXMoKGludDMyX3QpIDIzMCwgNzU2KSwKKyAgICBBbGlhcygoaW50MzJfdCkgMjMyLCA3NTgpLAorICAgIEFsaWFzKChpbnQzMl90KSAyMzMsIDc2MCksCisgICAgQWxpYXMoKGludDMyX3QpIDIzNCwgNzYyKSwKKyAgICBBbGlhcygoaW50MzJfdCkgMjQwLCA3NjQpLAorICAgIEFsaWFzKChpbnQzMl90KSA3LCA3NjYpLAorICAgIEFsaWFzKChpbnQzMl90KSA4LCA3NjgpLAorICAgIEFsaWFzKChpbnQzMl90KSA5LCA3NzApLAorfTsKKworY29uc3QgaW50MzJfdCBWQUxVRVNfbnRfQ09VTlQgPSA0OworCitjb25zdCBBbGlhcyBWQUxVRVNfbnRbXSA9IHsKKyAgICBBbGlhcygoaW50MzJfdCkgVV9OVF9ERUNJTUFMLCAxMTI1KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVV9OVF9ESUdJVCwgMTEyNyksCisgICAgQWxpYXMoKGludDMyX3QpIFVfTlRfTk9ORSwgMTEyOSksCisgICAgQWxpYXMoKGludDMyX3QpIFVfTlRfTlVNRVJJQywgMTEzMSksCit9OworCitjb25zdCBpbnQzMl90IFZBTFVFU19zY19DT1VOVCA9IDE1NjsKKworY29uc3QgQWxpYXMgVkFMVUVTX3NjW10gPSB7CisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfQUZBS0EsIDExMzMpLAorICAgIEFsaWFzKChpbnQzMl90KSBVU0NSSVBUX0FSQUJJQywgMTEzNSksCisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfQVJNRU5JQU4sIDExMzcpLAorICAgIEFsaWFzKChpbnQzMl90KSBVU0NSSVBUX0FWRVNUQU4sIDExMzkpLAorICAgIEFsaWFzKChpbnQzMl90KSBVU0NSSVBUX0JBTElORVNFLCAxMTQxKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVVNDUklQVF9CQU1VTSwgMTE0MyksCisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfQkFTU0FfVkFILCAxMTQ1KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVVNDUklQVF9CQVRBSywgMTE0NyksCisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfQkVOR0FMSSwgMTE0OSksCisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfQkxJU1NZTUJPTFMsIDExNTEpLAorICAgIEFsaWFzKChpbnQzMl90KSBVU0NSSVBUX0JPT0tfUEFITEFWSSwgMTE1MyksCisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfQk9QT01PRk8sIDExNTUpLAorICAgIEFsaWFzKChpbnQzMl90KSBVU0NSSVBUX0JSQUhNSSwgMTE1NyksCisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfQlJBSUxMRSwgMTE1OSksCisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfQlVHSU5FU0UsIDExNjEpLAorICAgIEFsaWFzKChpbnQzMl90KSBVU0NSSVBUX0JVSElELCAxMTYzKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVVNDUklQVF9DQU5BRElBTl9BQk9SSUdJTkFMLCAxMTY1KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVVNDUklQVF9DQVJJQU4sIDExNjcpLAorICAgIEFsaWFzKChpbnQzMl90KSBVU0NSSVBUX0NIQUtNQSwgMTE2OSksCisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfQ0hBTSwgMTE3MSksCisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfQ0hFUk9LRUUsIDExNzMpLAorICAgIEFsaWFzKChpbnQzMl90KSBVU0NSSVBUX0NJUlRILCAxMTc1KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVVNDUklQVF9DT01NT04sIDExNzcpLAorICAgIEFsaWFzKChpbnQzMl90KSBVU0NSSVBUX0NPUFRJQywgMTE3OSksCisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfQ1VORUlGT1JNLCAxMTgyKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVVNDUklQVF9DWVBSSU9ULCAxMTg0KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVVNDUklQVF9DWVJJTExJQywgMTE4NiksCisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfREVNT1RJQ19FR1lQVElBTiwgMTE4OCksCisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfREVTRVJFVCwgMTE5MCksCisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfREVWQU5BR0FSSSwgMTE5MiksCisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfRFVQTE9ZQU5fU0hPUlRBTkQsIDExOTQpLAorICAgIEFsaWFzKChpbnQzMl90KSBVU0NSSVBUX0VBU1RFUk5fU1lSSUFDLCAxMTk2KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVVNDUklQVF9FR1lQVElBTl9ISUVST0dMWVBIUywgMTE5OCksCisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfRUxCQVNBTiwgMTIwMCksCisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfRVNUUkFOR0VMT19TWVJJQUMsIDEyMDIpLAorICAgIEFsaWFzKChpbnQzMl90KSBVU0NSSVBUX0VUSElPUElDLCAxMjA0KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVVNDUklQVF9HRU9SR0lBTiwgMTIwNiksCisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfR0xBR09MSVRJQywgMTIwOCksCisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfR09USElDLCAxMjEwKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVVNDUklQVF9HUkFOVEhBLCAxMjEyKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVVNDUklQVF9HUkVFSywgMTIxNCksCisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfR1VKQVJBVEksIDEyMTYpLAorICAgIEFsaWFzKChpbnQzMl90KSBVU0NSSVBUX0dVUk1VS0hJLCAxMjE4KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVVNDUklQVF9IQU4sIDEyMjApLAorICAgIEFsaWFzKChpbnQzMl90KSBVU0NSSVBUX0hBTkdVTCwgMTIyMiksCisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfSEFOVU5PTywgMTIyNCksCisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfSEFSQVBQQU5fSU5EVVMsIDEyMjYpLAorICAgIEFsaWFzKChpbnQzMl90KSBVU0NSSVBUX0hFQlJFVywgMTIyOCksCisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfSElFUkFUSUNfRUdZUFRJQU4sIDEyMzApLAorICAgIEFsaWFzKChpbnQzMl90KSBVU0NSSVBUX0hJUkFHQU5BLCAxMjMyKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVVNDUklQVF9JTVBFUklBTF9BUkFNQUlDLCAxMjM0KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVVNDUklQVF9JTkhFUklURUQsIDEyMzYpLAorICAgIEFsaWFzKChpbnQzMl90KSBVU0NSSVBUX0lOU0NSSVBUSU9OQUxfUEFITEFWSSwgMTIzOSksCisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfSU5TQ1JJUFRJT05BTF9QQVJUSElBTiwgMTI0MSksCisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfSkFQQU5FU0UsIDEyNDMpLAorICAgIEFsaWFzKChpbnQzMl90KSBVU0NSSVBUX0pBVkFORVNFLCAxMjQ1KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVVNDUklQVF9KVVJDSEVOLCAxMjQ3KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVVNDUklQVF9LQUlUSEksIDEyNDkpLAorICAgIEFsaWFzKChpbnQzMl90KSBVU0NSSVBUX0tBTk5BREEsIDEyNTEpLAorICAgIEFsaWFzKChpbnQzMl90KSBVU0NSSVBUX0tBVEFLQU5BLCAxMjUzKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVVNDUklQVF9LQVRBS0FOQV9PUl9ISVJBR0FOQSwgMTI1NSksCisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfS0FZQUhfTEksIDEyNTcpLAorICAgIEFsaWFzKChpbnQzMl90KSBVU0NSSVBUX0tIQVJPU0hUSEksIDEyNTkpLAorICAgIEFsaWFzKChpbnQzMl90KSBVU0NSSVBUX0tITUVSLCAxMjYxKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVVNDUklQVF9LSFVUU1VSSSwgMTI2MyksCisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfS09SRUFOLCAxMjY1KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVVNDUklQVF9LUEVMTEUsIDEyNjcpLAorICAgIEFsaWFzKChpbnQzMl90KSBVU0NSSVBUX0xBTk5BLCAxMjY5KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVVNDUklQVF9MQU8sIDEyNzEpLAorICAgIEFsaWFzKChpbnQzMl90KSBVU0NSSVBUX0xBVElOLCAxMjczKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVVNDUklQVF9MQVRJTl9GUkFLVFVSLCAxMjc1KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVVNDUklQVF9MQVRJTl9HQUVMSUMsIDEyNzcpLAorICAgIEFsaWFzKChpbnQzMl90KSBVU0NSSVBUX0xFUENIQSwgMTI3OSksCisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfTElNQlUsIDEyODEpLAorICAgIEFsaWFzKChpbnQzMl90KSBVU0NSSVBUX0xJTkVBUl9BLCAxMjgzKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVVNDUklQVF9MSU5FQVJfQiwgMTI4NSksCisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfTElTVSwgMTI4NyksCisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfTE9NQSwgMTI4OSksCisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfTFlDSUFOLCAxMjkxKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVVNDUklQVF9MWURJQU4sIDEyOTMpLAorICAgIEFsaWFzKChpbnQzMl90KSBVU0NSSVBUX01BTEFZQUxBTSwgMTI5NSksCisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfTUFOREFJQywgMTI5NyksCisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfTUFOSUNIQUVBTiwgMTI5OSksCisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfTUFUSEVNQVRJQ0FMX05PVEFUSU9OLCAxMzAxKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVVNDUklQVF9NQVlBTl9ISUVST0dMWVBIUywgMTMwMyksCisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfTUVJVEVJX01BWUVLLCAxMzA1KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVVNDUklQVF9NRU5ERSwgMTMwNyksCisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfTUVST0lUSUNfQ1VSU0lWRSwgMTMwOSksCisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfTUVST0lUSUNfSElFUk9HTFlQSFMsIDEzMTEpLAorICAgIEFsaWFzKChpbnQzMl90KSBVU0NSSVBUX01PTkdPTElBTiwgMTMxMyksCisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfTU9PTiwgMTMxNSksCisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfTVJPLCAxMzE3KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVVNDUklQVF9NWUFOTUFSLCAxMzE5KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVVNDUklQVF9OQUJBVEFFQU4sIDEzMjEpLAorICAgIEFsaWFzKChpbnQzMl90KSBVU0NSSVBUX05BS0hJX0dFQkEsIDEzMjMpLAorICAgIEFsaWFzKChpbnQzMl90KSBVU0NSSVBUX05FV19UQUlfTFVFLCAxMzI1KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVVNDUklQVF9OS08sIDEzMjcpLAorICAgIEFsaWFzKChpbnQzMl90KSBVU0NSSVBUX05VU0hVLCAxMzI5KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVVNDUklQVF9PR0hBTSwgMTMzMSksCisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfT0xEX0NIVVJDSF9TTEFWT05JQ19DWVJJTExJQywgMTMzMyksCisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfT0xEX0hVTkdBUklBTiwgMTMzNSksCisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfT0xEX0lUQUxJQywgMTMzNyksCisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfT0xEX05PUlRIX0FSQUJJQU4sIDEzMzkpLAorICAgIEFsaWFzKChpbnQzMl90KSBVU0NSSVBUX09MRF9QRVJNSUMsIDEzNDEpLAorICAgIEFsaWFzKChpbnQzMl90KSBVU0NSSVBUX09MRF9QRVJTSUFOLCAxMzQzKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVVNDUklQVF9PTERfU09VVEhfQVJBQklBTiwgMTM0NSksCisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfT0xfQ0hJS0ksIDEzNDcpLAorICAgIEFsaWFzKChpbnQzMl90KSBVU0NSSVBUX09SSVlBLCAxMzQ5KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVVNDUklQVF9PUktIT04sIDEzNTEpLAorICAgIEFsaWFzKChpbnQzMl90KSBVU0NSSVBUX09TTUFOWUEsIDEzNTMpLAorICAgIEFsaWFzKChpbnQzMl90KSBVU0NSSVBUX1BBSEFXSF9ITU9ORywgMTM1NSksCisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfUEFMTVlSRU5FLCAxMzU3KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVVNDUklQVF9QSEFHU19QQSwgMTM1OSksCisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfUEhPRU5JQ0lBTiwgMTM2MSksCisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfUEhPTkVUSUNfUE9MTEFSRCwgMTM2MyksCisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfUFNBTFRFUl9QQUhMQVZJLCAxMzY1KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVVNDUklQVF9SRUpBTkcsIDEzNjcpLAorICAgIEFsaWFzKChpbnQzMl90KSBVU0NSSVBUX1JPTkdPUk9OR08sIDEzNjkpLAorICAgIEFsaWFzKChpbnQzMl90KSBVU0NSSVBUX1JVTklDLCAxMzcxKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVVNDUklQVF9TQU1BUklUQU4sIDEzNzMpLAorICAgIEFsaWFzKChpbnQzMl90KSBVU0NSSVBUX1NBUkFUSSwgMTM3NSksCisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfU0FVUkFTSFRSQSwgMTM3NyksCisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfU0hBUkFEQSwgMTM3OSksCisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfU0hBVklBTiwgMTM4MSksCisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfU0lHTl9XUklUSU5HLCAxMzgzKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVVNDUklQVF9TSU1QTElGSUVEX0hBTiwgMTM4NSksCisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfU0lOREhJLCAxMzg3KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVVNDUklQVF9TSU5IQUxBLCAxMzg5KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVVNDUklQVF9TT1JBX1NPTVBFTkcsIDEzOTEpLAorICAgIEFsaWFzKChpbnQzMl90KSBVU0NSSVBUX1NVTkRBTkVTRSwgMTM5MyksCisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfU1lMT1RJX05BR1JJLCAxMzk1KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVVNDUklQVF9TWU1CT0xTLCAxMzk3KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVVNDUklQVF9TWVJJQUMsIDEzOTkpLAorICAgIEFsaWFzKChpbnQzMl90KSBVU0NSSVBUX1RBR0FMT0csIDE0MDEpLAorICAgIEFsaWFzKChpbnQzMl90KSBVU0NSSVBUX1RBR0JBTldBLCAxNDAzKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVVNDUklQVF9UQUlfTEUsIDE0MDUpLAorICAgIEFsaWFzKChpbnQzMl90KSBVU0NSSVBUX1RBSV9WSUVULCAxNDA3KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVVNDUklQVF9UQUtSSSwgMTQwOSksCisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfVEFNSUwsIDE0MTEpLAorICAgIEFsaWFzKChpbnQzMl90KSBVU0NSSVBUX1RBTkdVVCwgMTQxMyksCisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfVEVMVUdVLCAxNDE1KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVVNDUklQVF9URU5HV0FSLCAxNDE3KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVVNDUklQVF9USEFBTkEsIDE0MTkpLAorICAgIEFsaWFzKChpbnQzMl90KSBVU0NSSVBUX1RIQUksIDE0MjEpLAorICAgIEFsaWFzKChpbnQzMl90KSBVU0NSSVBUX1RJQkVUQU4sIDE0MjMpLAorICAgIEFsaWFzKChpbnQzMl90KSBVU0NSSVBUX1RJRklOQUdILCAxNDI1KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVVNDUklQVF9UUkFESVRJT05BTF9IQU4sIDE0MjcpLAorICAgIEFsaWFzKChpbnQzMl90KSBVU0NSSVBUX1VHQVJJVElDLCAxNDI5KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVVNDUklQVF9VTktOT1dOLCAxNDMxKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVVNDUklQVF9VTldSSVRURU5fTEFOR1VBR0VTLCAxNDMzKSwKKyAgICBBbGlhcygoaW50MzJfdCkgVVNDUklQVF9WQUksIDE0MzUpLAorICAgIEFsaWFzKChpbnQzMl90KSBVU0NSSVBUX1ZJU0lCTEVfU1BFRUNILCAxNDM3KSwKKyAgICBBbGlhcygoaW50MzJfdCkgVVNDUklQVF9XQVJBTkdfQ0lUSSwgMTQzOSksCisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfV0VTVEVSTl9TWVJJQUMsIDE0NDEpLAorICAgIEFsaWFzKChpbnQzMl90KSBVU0NSSVBUX1dPTEVBSSwgMTQ0MyksCisgICAgQWxpYXMoKGludDMyX3QpIFVTQ1JJUFRfWUksIDE0NDUpLAorfTsKKworY29uc3QgaW50MzJfdCBWQUxVRVNfdGNjY19DT1VOVCA9IDIwOworCitjb25zdCBBbGlhcyBWQUxVRVNfdGNjY1tdID0geworICAgIEFsaWFzKChpbnQzMl90KSAwLCA3MzIpLAorICAgIEFsaWFzKChpbnQzMl90KSAxLCA3MzQpLAorICAgIEFsaWFzKChpbnQzMl90KSAyMDAsIDczNiksCisgICAgQWxpYXMoKGludDMyX3QpIDIwMiwgNzM4KSwKKyAgICBBbGlhcygoaW50MzJfdCkgMjE0LCA3NDApLAorICAgIEFsaWFzKChpbnQzMl90KSAyMTYsIDc0MiksCisgICAgQWxpYXMoKGludDMyX3QpIDIxOCwgNzQ0KSwKKyAgICBBbGlhcygoaW50MzJfdCkgMjIwLCA3NDYpLAorICAgIEFsaWFzKChpbnQzMl90KSAyMjIsIDc0OCksCisgICAgQWxpYXMoKGludDMyX3QpIDIyNCwgNzUwKSwKKyAgICBBbGlhcygoaW50MzJfdCkgMjI2LCA3NTIpLAorICAgIEFsaWFzKChpbnQzMl90KSAyMjgsIDc1NCksCisgICAgQWxpYXMoKGludDMyX3QpIDIzMCwgNzU2KSwKKyAgICBBbGlhcygoaW50MzJfdCkgMjMyLCA3NTgpLAorICAgIEFsaWFzKChpbnQzMl90KSAyMzMsIDc2MCksCisgICAgQWxpYXMoKGludDMyX3QpIDIzNCwgNzYyKSwKKyAgICBBbGlhcygoaW50MzJfdCkgMjQwLCA3NjQpLAorICAgIEFsaWFzKChpbnQzMl90KSA3LCA3NjYpLAorICAgIEFsaWFzKChpbnQzMl90KSA4LCA3NjgpLAorICAgIEFsaWFzKChpbnQzMl90KSA5LCA3NzApLAorfTsKKworY29uc3QgaW50MzJfdCBQUk9QRVJUWV9DT1VOVCA9IDk0OworCitjb25zdCBQcm9wZXJ0eSBQUk9QRVJUWVtdID0geworICAgIFByb3BlcnR5KChpbnQzMl90KSBVQ0hBUl9BTFBIQUJFVElDLCA2OCwgVkFMVUVTX2JpbnByb3BfQ09VTlQsIFZBTFVFU19iaW5wcm9wKSwKKyAgICBQcm9wZXJ0eSgoaW50MzJfdCkgVUNIQVJfQVNDSUlfSEVYX0RJR0lULCA3MCwgVkFMVUVTX2JpbnByb3BfQ09VTlQsIFZBTFVFU19iaW5wcm9wKSwKKyAgICBQcm9wZXJ0eSgoaW50MzJfdCkgVUNIQVJfQklESV9DT05UUk9MLCA3MiwgVkFMVUVTX2JpbnByb3BfQ09VTlQsIFZBTFVFU19iaW5wcm9wKSwKKyAgICBQcm9wZXJ0eSgoaW50MzJfdCkgVUNIQVJfQklESV9NSVJST1JFRCwgNzQsIFZBTFVFU19iaW5wcm9wX0NPVU5ULCBWQUxVRVNfYmlucHJvcCksCisgICAgUHJvcGVydHkoKGludDMyX3QpIFVDSEFSX0NBU0VELCA3NiwgVkFMVUVTX2JpbnByb3BfQ09VTlQsIFZBTFVFU19iaW5wcm9wKSwKKyAgICBQcm9wZXJ0eSgoaW50MzJfdCkgVUNIQVJfQ0FTRV9JR05PUkFCTEUsIDc4LCBWQUxVRVNfYmlucHJvcF9DT1VOVCwgVkFMVUVTX2JpbnByb3ApLAorICAgIFByb3BlcnR5KChpbnQzMl90KSBVQ0hBUl9DQVNFX1NFTlNJVElWRSwgODAsIFZBTFVFU19iaW5wcm9wX0NPVU5ULCBWQUxVRVNfYmlucHJvcCksCisgICAgUHJvcGVydHkoKGludDMyX3QpIFVDSEFSX0NIQU5HRVNfV0hFTl9DQVNFRk9MREVELCA4MiwgVkFMVUVTX2JpbnByb3BfQ09VTlQsIFZBTFVFU19iaW5wcm9wKSwKKyAgICBQcm9wZXJ0eSgoaW50MzJfdCkgVUNIQVJfQ0hBTkdFU19XSEVOX0NBU0VNQVBQRUQsIDg0LCBWQUxVRVNfYmlucHJvcF9DT1VOVCwgVkFMVUVTX2JpbnByb3ApLAorICAgIFByb3BlcnR5KChpbnQzMl90KSBVQ0hBUl9DSEFOR0VTX1dIRU5fTE9XRVJDQVNFRCwgODYsIFZBTFVFU19iaW5wcm9wX0NPVU5ULCBWQUxVRVNfYmlucHJvcCksCisgICAgUHJvcGVydHkoKGludDMyX3QpIFVDSEFSX0NIQU5HRVNfV0hFTl9ORktDX0NBU0VGT0xERUQsIDg4LCBWQUxVRVNfYmlucHJvcF9DT1VOVCwgVkFMVUVTX2JpbnByb3ApLAorICAgIFByb3BlcnR5KChpbnQzMl90KSBVQ0hBUl9DSEFOR0VTX1dIRU5fVElUTEVDQVNFRCwgOTAsIFZBTFVFU19iaW5wcm9wX0NPVU5ULCBWQUxVRVNfYmlucHJvcCksCisgICAgUHJvcGVydHkoKGludDMyX3QpIFVDSEFSX0NIQU5HRVNfV0hFTl9VUFBFUkNBU0VELCA5MiwgVkFMVUVTX2JpbnByb3BfQ09VTlQsIFZBTFVFU19iaW5wcm9wKSwKKyAgICBQcm9wZXJ0eSgoaW50MzJfdCkgVUNIQVJfREFTSCwgOTQsIFZBTFVFU19iaW5wcm9wX0NPVU5ULCBWQUxVRVNfYmlucHJvcCksCisgICAgUHJvcGVydHkoKGludDMyX3QpIFVDSEFSX0RFRkFVTFRfSUdOT1JBQkxFX0NPREVfUE9JTlQsIDk2LCBWQUxVRVNfYmlucHJvcF9DT1VOVCwgVkFMVUVTX2JpbnByb3ApLAorICAgIFByb3BlcnR5KChpbnQzMl90KSBVQ0hBUl9ERVBSRUNBVEVELCA5OCwgVkFMVUVTX2JpbnByb3BfQ09VTlQsIFZBTFVFU19iaW5wcm9wKSwKKyAgICBQcm9wZXJ0eSgoaW50MzJfdCkgVUNIQVJfRElBQ1JJVElDLCAxMDAsIFZBTFVFU19iaW5wcm9wX0NPVU5ULCBWQUxVRVNfYmlucHJvcCksCisgICAgUHJvcGVydHkoKGludDMyX3QpIFVDSEFSX0VYVEVOREVSLCAxMDIsIFZBTFVFU19iaW5wcm9wX0NPVU5ULCBWQUxVRVNfYmlucHJvcCksCisgICAgUHJvcGVydHkoKGludDMyX3QpIFVDSEFSX0ZVTExfQ09NUE9TSVRJT05fRVhDTFVTSU9OLCAxMDQsIFZBTFVFU19iaW5wcm9wX0NPVU5ULCBWQUxVRVNfYmlucHJvcCksCisgICAgUHJvcGVydHkoKGludDMyX3QpIFVDSEFSX0dSQVBIRU1FX0JBU0UsIDEwNiwgVkFMVUVTX2JpbnByb3BfQ09VTlQsIFZBTFVFU19iaW5wcm9wKSwKKyAgICBQcm9wZXJ0eSgoaW50MzJfdCkgVUNIQVJfR1JBUEhFTUVfRVhURU5ELCAxMDgsIFZBTFVFU19iaW5wcm9wX0NPVU5ULCBWQUxVRVNfYmlucHJvcCksCisgICAgUHJvcGVydHkoKGludDMyX3QpIFVDSEFSX0dSQVBIRU1FX0xJTkssIDExMCwgVkFMVUVTX2JpbnByb3BfQ09VTlQsIFZBTFVFU19iaW5wcm9wKSwKKyAgICBQcm9wZXJ0eSgoaW50MzJfdCkgVUNIQVJfSEVYX0RJR0lULCAxMTIsIFZBTFVFU19iaW5wcm9wX0NPVU5ULCBWQUxVRVNfYmlucHJvcCksCisgICAgUHJvcGVydHkoKGludDMyX3QpIFVDSEFSX0hZUEhFTiwgMTE0LCBWQUxVRVNfYmlucHJvcF9DT1VOVCwgVkFMVUVTX2JpbnByb3ApLAorICAgIFByb3BlcnR5KChpbnQzMl90KSBVQ0hBUl9JREVPR1JBUEhJQywgMTE2LCBWQUxVRVNfYmlucHJvcF9DT1VOVCwgVkFMVUVTX2JpbnByb3ApLAorICAgIFByb3BlcnR5KChpbnQzMl90KSBVQ0hBUl9JRFNfQklOQVJZX09QRVJBVE9SLCAxMTgsIFZBTFVFU19iaW5wcm9wX0NPVU5ULCBWQUxVRVNfYmlucHJvcCksCisgICAgUHJvcGVydHkoKGludDMyX3QpIFVDSEFSX0lEU19UUklOQVJZX09QRVJBVE9SLCAxMjAsIFZBTFVFU19iaW5wcm9wX0NPVU5ULCBWQUxVRVNfYmlucHJvcCksCisgICAgUHJvcGVydHkoKGludDMyX3QpIFVDSEFSX0lEX0NPTlRJTlVFLCAxMjIsIFZBTFVFU19iaW5wcm9wX0NPVU5ULCBWQUxVRVNfYmlucHJvcCksCisgICAgUHJvcGVydHkoKGludDMyX3QpIFVDSEFSX0lEX1NUQVJULCAxMjQsIFZBTFVFU19iaW5wcm9wX0NPVU5ULCBWQUxVRVNfYmlucHJvcCksCisgICAgUHJvcGVydHkoKGludDMyX3QpIFVDSEFSX0pPSU5fQ09OVFJPTCwgMTI2LCBWQUxVRVNfYmlucHJvcF9DT1VOVCwgVkFMVUVTX2JpbnByb3ApLAorICAgIFByb3BlcnR5KChpbnQzMl90KSBVQ0hBUl9MT0dJQ0FMX09SREVSX0VYQ0VQVElPTiwgMTI4LCBWQUxVRVNfYmlucHJvcF9DT1VOVCwgVkFMVUVTX2JpbnByb3ApLAorICAgIFByb3BlcnR5KChpbnQzMl90KSBVQ0hBUl9MT1dFUkNBU0UsIDEzMCwgVkFMVUVTX2JpbnByb3BfQ09VTlQsIFZBTFVFU19iaW5wcm9wKSwKKyAgICBQcm9wZXJ0eSgoaW50MzJfdCkgVUNIQVJfTUFUSCwgMTMyLCBWQUxVRVNfYmlucHJvcF9DT1VOVCwgVkFMVUVTX2JpbnByb3ApLAorICAgIFByb3BlcnR5KChpbnQzMl90KSBVQ0hBUl9ORkNfSU5FUlQsIDEzNCwgVkFMVUVTX2JpbnByb3BfQ09VTlQsIFZBTFVFU19iaW5wcm9wKSwKKyAgICBQcm9wZXJ0eSgoaW50MzJfdCkgVUNIQVJfTkZEX0lORVJULCAxMzYsIFZBTFVFU19iaW5wcm9wX0NPVU5ULCBWQUxVRVNfYmlucHJvcCksCisgICAgUHJvcGVydHkoKGludDMyX3QpIFVDSEFSX05GS0NfSU5FUlQsIDEzOCwgVkFMVUVTX2JpbnByb3BfQ09VTlQsIFZBTFVFU19iaW5wcm9wKSwKKyAgICBQcm9wZXJ0eSgoaW50MzJfdCkgVUNIQVJfTkZLRF9JTkVSVCwgMTQwLCBWQUxVRVNfYmlucHJvcF9DT1VOVCwgVkFMVUVTX2JpbnByb3ApLAorICAgIFByb3BlcnR5KChpbnQzMl90KSBVQ0hBUl9OT05DSEFSQUNURVJfQ09ERV9QT0lOVCwgMTQyLCBWQUxVRVNfYmlucHJvcF9DT1VOVCwgVkFMVUVTX2JpbnByb3ApLAorICAgIFByb3BlcnR5KChpbnQzMl90KSBVQ0hBUl9QQVRURVJOX1NZTlRBWCwgMTQ0LCBWQUxVRVNfYmlucHJvcF9DT1VOVCwgVkFMVUVTX2JpbnByb3ApLAorICAgIFByb3BlcnR5KChpbnQzMl90KSBVQ0hBUl9QQVRURVJOX1dISVRFX1NQQUNFLCAxNDYsIFZBTFVFU19iaW5wcm9wX0NPVU5ULCBWQUxVRVNfYmlucHJvcCksCisgICAgUHJvcGVydHkoKGludDMyX3QpIFVDSEFSX1BPU0lYX0FMTlVNLCAxNDgsIFZBTFVFU19iaW5wcm9wX0NPVU5ULCBWQUxVRVNfYmlucHJvcCksCisgICAgUHJvcGVydHkoKGludDMyX3QpIFVDSEFSX1BPU0lYX0JMQU5LLCAxNTAsIFZBTFVFU19iaW5wcm9wX0NPVU5ULCBWQUxVRVNfYmlucHJvcCksCisgICAgUHJvcGVydHkoKGludDMyX3QpIFVDSEFSX1BPU0lYX0dSQVBILCAxNTIsIFZBTFVFU19iaW5wcm9wX0NPVU5ULCBWQUxVRVNfYmlucHJvcCksCisgICAgUHJvcGVydHkoKGludDMyX3QpIFVDSEFSX1BPU0lYX1BSSU5ULCAxNTQsIFZBTFVFU19iaW5wcm9wX0NPVU5ULCBWQUxVRVNfYmlucHJvcCksCisgICAgUHJvcGVydHkoKGludDMyX3QpIFVDSEFSX1BPU0lYX1hESUdJVCwgMTU2LCBWQUxVRVNfYmlucHJvcF9DT1VOVCwgVkFMVUVTX2JpbnByb3ApLAorICAgIFByb3BlcnR5KChpbnQzMl90KSBVQ0hBUl9RVU9UQVRJT05fTUFSSywgMTU4LCBWQUxVRVNfYmlucHJvcF9DT1VOVCwgVkFMVUVTX2JpbnByb3ApLAorICAgIFByb3BlcnR5KChpbnQzMl90KSBVQ0hBUl9SQURJQ0FMLCAxNjAsIFZBTFVFU19iaW5wcm9wX0NPVU5ULCBWQUxVRVNfYmlucHJvcCksCisgICAgUHJvcGVydHkoKGludDMyX3QpIFVDSEFSX1NFR01FTlRfU1RBUlRFUiwgMTYyLCBWQUxVRVNfYmlucHJvcF9DT1VOVCwgVkFMVUVTX2JpbnByb3ApLAorICAgIFByb3BlcnR5KChpbnQzMl90KSBVQ0hBUl9TT0ZUX0RPVFRFRCwgMTY0LCBWQUxVRVNfYmlucHJvcF9DT1VOVCwgVkFMVUVTX2JpbnByb3ApLAorICAgIFByb3BlcnR5KChpbnQzMl90KSBVQ0hBUl9TX1RFUk0sIDE2NiwgVkFMVUVTX2JpbnByb3BfQ09VTlQsIFZBTFVFU19iaW5wcm9wKSwKKyAgICBQcm9wZXJ0eSgoaW50MzJfdCkgVUNIQVJfVEVSTUlOQUxfUFVOQ1RVQVRJT04sIDE2OCwgVkFMVUVTX2JpbnByb3BfQ09VTlQsIFZBTFVFU19iaW5wcm9wKSwKKyAgICBQcm9wZXJ0eSgoaW50MzJfdCkgVUNIQVJfVU5JRklFRF9JREVPR1JBUEgsIDE3MCwgVkFMVUVTX2JpbnByb3BfQ09VTlQsIFZBTFVFU19iaW5wcm9wKSwKKyAgICBQcm9wZXJ0eSgoaW50MzJfdCkgVUNIQVJfVVBQRVJDQVNFLCAxNzIsIFZBTFVFU19iaW5wcm9wX0NPVU5ULCBWQUxVRVNfYmlucHJvcCksCisgICAgUHJvcGVydHkoKGludDMyX3QpIFVDSEFSX1ZBUklBVElPTl9TRUxFQ1RPUiwgMTc0LCBWQUxVRVNfYmlucHJvcF9DT1VOVCwgVkFMVUVTX2JpbnByb3ApLAorICAgIFByb3BlcnR5KChpbnQzMl90KSBVQ0hBUl9XSElURV9TUEFDRSwgMTc2LCBWQUxVRVNfYmlucHJvcF9DT1VOVCwgVkFMVUVTX2JpbnByb3ApLAorICAgIFByb3BlcnR5KChpbnQzMl90KSBVQ0hBUl9YSURfQ09OVElOVUUsIDE3OSwgVkFMVUVTX2JpbnByb3BfQ09VTlQsIFZBTFVFU19iaW5wcm9wKSwKKyAgICBQcm9wZXJ0eSgoaW50MzJfdCkgVUNIQVJfWElEX1NUQVJULCAxODEsIFZBTFVFU19iaW5wcm9wX0NPVU5ULCBWQUxVRVNfYmlucHJvcCksCisgICAgUHJvcGVydHkoKGludDMyX3QpIFVDSEFSX0JJRElfQ0xBU1MsIDE4NSwgVkFMVUVTX2JjX0NPVU5ULCBWQUxVRVNfYmMpLAorICAgIFByb3BlcnR5KChpbnQzMl90KSBVQ0hBUl9CTE9DSywgMTg3LCBWQUxVRVNfYmxrX0NPVU5ULCBWQUxVRVNfYmxrKSwKKyAgICBQcm9wZXJ0eSgoaW50MzJfdCkgVUNIQVJfQ0FOT05JQ0FMX0NPTUJJTklOR19DTEFTUywgMTg5LCBWQUxVRVNfY2NjX0NPVU5ULCBWQUxVRVNfY2NjKSwKKyAgICBQcm9wZXJ0eSgoaW50MzJfdCkgVUNIQVJfREVDT01QT1NJVElPTl9UWVBFLCAxOTEsIFZBTFVFU19kdF9DT1VOVCwgVkFMVUVTX2R0KSwKKyAgICBQcm9wZXJ0eSgoaW50MzJfdCkgVUNIQVJfRUFTVF9BU0lBTl9XSURUSCwgMTkzLCBWQUxVRVNfZWFfQ09VTlQsIFZBTFVFU19lYSksCisgICAgUHJvcGVydHkoKGludDMyX3QpIFVDSEFSX0dFTkVSQUxfQ0FURUdPUlksIDE5NSwgVkFMVUVTX2djX0NPVU5ULCBWQUxVRVNfZ2MpLAorICAgIFByb3BlcnR5KChpbnQzMl90KSBVQ0hBUl9HUkFQSEVNRV9DTFVTVEVSX0JSRUFLLCAxOTcsIFZBTFVFU19HQ0JfQ09VTlQsIFZBTFVFU19HQ0IpLAorICAgIFByb3BlcnR5KChpbnQzMl90KSBVQ0hBUl9IQU5HVUxfU1lMTEFCTEVfVFlQRSwgMTk5LCBWQUxVRVNfaHN0X0NPVU5ULCBWQUxVRVNfaHN0KSwKKyAgICBQcm9wZXJ0eSgoaW50MzJfdCkgVUNIQVJfSk9JTklOR19HUk9VUCwgMjAxLCBWQUxVRVNfamdfQ09VTlQsIFZBTFVFU19qZyksCisgICAgUHJvcGVydHkoKGludDMyX3QpIFVDSEFSX0pPSU5JTkdfVFlQRSwgMjAzLCBWQUxVRVNfanRfQ09VTlQsIFZBTFVFU19qdCksCisgICAgUHJvcGVydHkoKGludDMyX3QpIFVDSEFSX0xFQURfQ0FOT05JQ0FMX0NPTUJJTklOR19DTEFTUywgMjA1LCBWQUxVRVNfbGNjY19DT1VOVCwgVkFMVUVTX2xjY2MpLAorICAgIFByb3BlcnR5KChpbnQzMl90KSBVQ0hBUl9MSU5FX0JSRUFLLCAyMDcsIFZBTFVFU19sYl9DT1VOVCwgVkFMVUVTX2xiKSwKKyAgICBQcm9wZXJ0eSgoaW50MzJfdCkgVUNIQVJfTkZDX1FVSUNLX0NIRUNLLCAyMDksIFZBTFVFU19ORkNfUUNfQ09VTlQsIFZBTFVFU19ORkNfUUMpLAorICAgIFByb3BlcnR5KChpbnQzMl90KSBVQ0hBUl9ORkRfUVVJQ0tfQ0hFQ0ssIDIxMSwgVkFMVUVTX05GRF9RQ19DT1VOVCwgVkFMVUVTX05GRF9RQyksCisgICAgUHJvcGVydHkoKGludDMyX3QpIFVDSEFSX05GS0NfUVVJQ0tfQ0hFQ0ssIDIxMywgVkFMVUVTX05GS0NfUUNfQ09VTlQsIFZBTFVFU19ORktDX1FDKSwKKyAgICBQcm9wZXJ0eSgoaW50MzJfdCkgVUNIQVJfTkZLRF9RVUlDS19DSEVDSywgMjE1LCBWQUxVRVNfTkZLRF9RQ19DT1VOVCwgVkFMVUVTX05GS0RfUUMpLAorICAgIFByb3BlcnR5KChpbnQzMl90KSBVQ0hBUl9OVU1FUklDX1RZUEUsIDIxNywgVkFMVUVTX250X0NPVU5ULCBWQUxVRVNfbnQpLAorICAgIFByb3BlcnR5KChpbnQzMl90KSBVQ0hBUl9TQ1JJUFQsIDIxOSwgVkFMVUVTX3NjX0NPVU5ULCBWQUxVRVNfc2MpLAorICAgIFByb3BlcnR5KChpbnQzMl90KSBVQ0hBUl9TRU5URU5DRV9CUkVBSywgMjIxLCBWQUxVRVNfU0JfQ09VTlQsIFZBTFVFU19TQiksCisgICAgUHJvcGVydHkoKGludDMyX3QpIFVDSEFSX1RSQUlMX0NBTk9OSUNBTF9DT01CSU5JTkdfQ0xBU1MsIDIyMywgVkFMVUVTX3RjY2NfQ09VTlQsIFZBTFVFU190Y2NjKSwKKyAgICBQcm9wZXJ0eSgoaW50MzJfdCkgVUNIQVJfV09SRF9CUkVBSywgMjI1LCBWQUxVRVNfV0JfQ09VTlQsIFZBTFVFU19XQiksCisgICAgUHJvcGVydHkoKGludDMyX3QpIFVDSEFSX0FHRSwgMjMxLCAwLCBOVUxMKSwKKyAgICBQcm9wZXJ0eSgoaW50MzJfdCkgVUNIQVJfQklESV9NSVJST1JJTkdfR0xZUEgsIDIzMywgMCwgTlVMTCksCisgICAgUHJvcGVydHkoKGludDMyX3QpIFVDSEFSX0NBU0VfRk9MRElORywgMjM1LCAwLCBOVUxMKSwKKyAgICBQcm9wZXJ0eSgoaW50MzJfdCkgVUNIQVJfSVNPX0NPTU1FTlQsIDIzNywgMCwgTlVMTCksCisgICAgUHJvcGVydHkoKGludDMyX3QpIFVDSEFSX0xPV0VSQ0FTRV9NQVBQSU5HLCAyMzksIDAsIE5VTEwpLAorICAgIFByb3BlcnR5KChpbnQzMl90KSBVQ0hBUl9OQU1FLCAyNDEsIDAsIE5VTEwpLAorICAgIFByb3BlcnR5KChpbnQzMl90KSBVQ0hBUl9TSU1QTEVfQ0FTRV9GT0xESU5HLCAyNDMsIDAsIE5VTEwpLAorICAgIFByb3BlcnR5KChpbnQzMl90KSBVQ0hBUl9TSU1QTEVfTE9XRVJDQVNFX01BUFBJTkcsIDI0NiwgMCwgTlVMTCksCisgICAgUHJvcGVydHkoKGludDMyX3QpIFVDSEFSX1NJTVBMRV9USVRMRUNBU0VfTUFQUElORywgMjQ4LCAwLCBOVUxMKSwKKyAgICBQcm9wZXJ0eSgoaW50MzJfdCkgVUNIQVJfU0lNUExFX1VQUEVSQ0FTRV9NQVBQSU5HLCAyNTAsIDAsIE5VTEwpLAorICAgIFByb3BlcnR5KChpbnQzMl90KSBVQ0hBUl9USVRMRUNBU0VfTUFQUElORywgMjUyLCAwLCBOVUxMKSwKKyAgICBQcm9wZXJ0eSgoaW50MzJfdCkgVUNIQVJfVU5JQ09ERV8xX05BTUUsIDI1NCwgMCwgTlVMTCksCisgICAgUHJvcGVydHkoKGludDMyX3QpIFVDSEFSX1VQUEVSQ0FTRV9NQVBQSU5HLCAyNTYsIDAsIE5VTEwpLAorICAgIFByb3BlcnR5KChpbnQzMl90KSBVQ0hBUl9OVU1FUklDX1ZBTFVFLCAxODMsIDAsIE5VTEwpLAorICAgIFByb3BlcnR5KChpbnQzMl90KSBVQ0hBUl9HRU5FUkFMX0NBVEVHT1JZX01BU0ssIDIyNywgVkFMVUVTX2djbV9DT1VOVCwgVkFMVUVTX2djbSksCisgICAgUHJvcGVydHkoKGludDMyX3QpIFVDSEFSX1NDUklQVF9FWFRFTlNJT05TLCAyMjksIDAsIE5VTEwpLAorfTsKKworLyplb2YqLwpkaWZmIC0tZ2l0IGEvdW5pY29kZS9jL2dlbnBuYW1lL2dlbnBuYW1lLmNwcCBiL3VuaWNvZGUvYy9nZW5wbmFtZS9nZW5wbmFtZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQxZDZkZQotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGUvYy9nZW5wbmFtZS9nZW5wbmFtZS5jcHAKQEAgLTAsMCArMSw1NDQgQEAKKy8qCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMTEsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMKKyogICBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICBEYXRlICAgICAgICBOYW1lICAgICAgICBEZXNjcmlwdGlvbgorKiAgIDEwLzExLzAyICAgIGFsaXUgICAgICAgIENyZWF0aW9uLgorKiAgIDIwMTBub3YxOSAgIE1hcmt1cyBTY2hlcmVyICBSZXdyaXRlIGZvciBmb3JtYXRWZXJzaW9uIDIuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCisjaW5jbHVkZSAidW5pY29kZS91dHlwZXMuaCIKKyNpbmNsdWRlICJ1bmljb2RlL2J5dGVzdHJpZWJ1aWxkZXIuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3B1dGlsLmgiCisjaW5jbHVkZSAidW5pY29kZS91Y2xlYW4uaCIKKyNpbmNsdWRlICJjbWVtb3J5LmgiCisjaW5jbHVkZSAiY2hhcnN0ci5oIgorI2luY2x1ZGUgImNzdHJpbmcuaCIKKyNpbmNsdWRlICJkZW5zZXJhbmdlcy5oIgorI2luY2x1ZGUgInVuZXdkYXRhLmgiCisjaW5jbHVkZSAidW9wdGlvbnMuaCIKKyNpbmNsdWRlICJwcm9wbmFtZS5oIgorI2luY2x1ZGUgInRvb2x1dGlsLmgiCisjaW5jbHVkZSAidXZlY3RyMzIuaCIKKyNpbmNsdWRlICJ3cml0ZXNyYy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworLy8gV2UgdGVzdCBmb3IgQVNDSUkgZGVsaW1pdGVycyBhbmQgV2hpdGVfU3BhY2UsIGFuZCBidWlsZCBBU0NJSSBzdHJpbmcgQnl0ZXNUcmllcy4KKyNpZiBVX0NIQVJTRVRfRkFNSUxZIT1VX0FTQ0lJX0ZBTUlMWQorIyAgIGVycm9yIFRoaXMgYnVpbGRlciByZXF1aXJlcyBVX0NIQVJTRVRfRkFNSUxZPT1VX0FTQ0lJX0ZBTUlMWS4KKyNlbmRpZgorCisjZGVmaW5lIExFTkdUSE9GKGFycmF5KSAoaW50MzJfdCkoc2l6ZW9mKGFycmF5KS9zaXplb2YoKGFycmF5KVswXSkpCisKK1VfTkFNRVNQQUNFX1VTRQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEJFR0lOIERBVEEKKy8vIAorLy8gVGhpcyBpcyB0aGUgcmF3IGRhdGEgdG8gYmUgb3V0cHV0LiAgV2UgZGVmaW5lIHRoZSBkYXRhIHN0cnVjdHVyZSwKKy8vIHRoZW4gaW5jbHVkZSBhIG1hY2hpbmUtZ2VuZXJhdGVkIGhlYWRlciB0aGF0IGNvbnRhaW5zIHRoZSBhY3R1YWwKKy8vIGRhdGEuCisKKyNpbmNsdWRlICJ1bmljb2RlL3VjaGFyLmgiCisjaW5jbHVkZSAidW5pY29kZS91c2NyaXB0LmgiCisjaW5jbHVkZSAidW5pY29kZS91bm9ybS5oIgorI2luY2x1ZGUgInVuaWNvZGUvdW5vcm0yLmgiCisKK2NsYXNzIEFsaWFzTmFtZSB7CitwdWJsaWM6CisgICAgY29uc3QgY2hhciogc3RyOworICAgIGludDMyX3QgICAgIGluZGV4OworICAgIGNoYXIgICAgICAgIG5vcm1hbGl6ZWRbNjRdOworCisgICAgQWxpYXNOYW1lKGNvbnN0IGNoYXIqIHN0ciwgaW50MzJfdCBpbmRleCk7CisKKyAgICBpbnQgY29tcGFyZShjb25zdCBBbGlhc05hbWUmIG90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiB1cHJ2X3N0cmNtcChub3JtYWxpemVkLCBvdGhlci5ub3JtYWxpemVkKTsKKyAgICB9CisKKyAgICBVQm9vbCBvcGVyYXRvcj09KGNvbnN0IEFsaWFzTmFtZSYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGNvbXBhcmUob3RoZXIpID09IDA7CisgICAgfQorCisgICAgVUJvb2wgb3BlcmF0b3IhPShjb25zdCBBbGlhc05hbWUmIG90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBjb21wYXJlKG90aGVyKSAhPSAwOworICAgIH0KK307CisKK0FsaWFzTmFtZTo6QWxpYXNOYW1lKGNvbnN0IGNoYXIqIF9zdHIsCisgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IF9pbmRleCkgOgorICAgIHN0cihfc3RyKSwKKyAgICBpbmRleChfaW5kZXgpCit7CisgICAgLy8gQnVpbGQgdGhlIG5vcm1hbGl6ZWQgZm9ybSBvZiB0aGUgYWxpYXMuCisgICAgY29uc3QgY2hhciAqcz1zdHI7CisgICAgY2hhciBjOworICAgIGludDMyX3QgaT0wOworICAgIHdoaWxlKChjPSpzKyspIT0wKSB7CisgICAgICAgIC8vIElnbm9yZSBkZWxpbWl0ZXJzICctJywgJ18nLCBhbmQgQVNDSUkgV2hpdGVfU3BhY2UuCisgICAgICAgIGlmKGM9PTB4MmQgfHwgYz09MHg1ZiB8fCBjPT0weDIwIHx8ICgweDA5PD1jICYmIGM8PTB4MGQpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBub3JtYWxpemVkW2krK109dXBydl90b2xvd2VyKGMpOworICAgIH0KKyAgICBub3JtYWxpemVkW2ldPTA7CisgICAgaWYoaT49TEVOR1RIT0Yobm9ybWFsaXplZCkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgIkVycm9yOiBQcm9wZXJ0eSAodmFsdWUpIGFsaWFzICclcycgcmVzdWx0cyBpbiAiCisgICAgICAgICAgICAgICAgInRvby1sb25nIG5vcm1hbGl6ZWQgc3RyaW5nIChsZW5ndGggJWQpXG4iLAorICAgICAgICAgICAgICAgIHN0ciwgKGludClpKTsKKyAgICAgICAgZXhpdChVX0JVRkZFUl9PVkVSRkxPV19FUlJPUik7CisgICAgfQorfQorCitjbGFzcyBBbGlhcyB7CitwdWJsaWM6CisgICAgaW50MzJfdCAgICAgZW51bVZhbHVlOworICAgIGludDMyX3QgICAgIG5hbWVHcm91cEluZGV4OworCisgICAgQWxpYXMoaW50MzJfdCBlbnVtVmFsdWUsIGludDMyX3QgbmFtZUdyb3VwSW5kZXgpOworCisgICAgaW50MzJfdCBnZXRVbmlxdWVOYW1lcyhpbnQzMl90KiBuYW1lR3JvdXBJbmRpY2VzKSBjb25zdDsKK307CisKK0FsaWFzOjpBbGlhcyhpbnQzMl90IGFuRW51bVZhbHVlLCBpbnQzMl90IGFOYW1lR3JvdXBJbmRleCkgOgorICAgIGVudW1WYWx1ZShhbkVudW1WYWx1ZSksCisgICAgbmFtZUdyb3VwSW5kZXgoYU5hbWVHcm91cEluZGV4KQoreworfQorCitjbGFzcyBQcm9wZXJ0eSA6IHB1YmxpYyBBbGlhcyB7CitwdWJsaWM6CisgICAgaW50MzJfdCAgICAgICAgIHZhbHVlQ291bnQ7CisgICAgY29uc3QgQWxpYXMqIHZhbHVlTGlzdDsKKworICAgIFByb3BlcnR5KGludDMyX3QgZW51bVZhbHVlLAorICAgICAgICAgICAgIGludDMyX3QgbmFtZUdyb3VwSW5kZXgsCisgICAgICAgICAgICAgaW50MzJfdCB2YWx1ZUNvdW50LAorICAgICAgICAgICAgIGNvbnN0IEFsaWFzKiB2YWx1ZUxpc3QpOworfTsKKworUHJvcGVydHk6OlByb3BlcnR5KGludDMyX3QgX2VudW1WYWx1ZSwKKyAgICAgICAgICAgICAgICAgICBpbnQzMl90IF9uYW1lR3JvdXBJbmRleCwKKyAgICAgICAgICAgICAgICAgICBpbnQzMl90IF92YWx1ZUNvdW50LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IEFsaWFzKiBfdmFsdWVMaXN0KSA6CisgICAgQWxpYXMoX2VudW1WYWx1ZSwgX25hbWVHcm91cEluZGV4KSwKKyAgICB2YWx1ZUNvdW50KF92YWx1ZUNvdW50KSwKKyAgICB2YWx1ZUxpc3QoX3ZhbHVlTGlzdCkKK3sKK30KKworLy8gKioqIEluY2x1ZGUgdGhlIGRhdGEgaGVhZGVyICoqKgorI2luY2x1ZGUgImRhdGEuaCIKKworLyogcmV0dXJuIGEgbGlzdCBvZiB1bmlxdWUgbmFtZXMsIG5vdCBpbmNsdWRpbmcgIiIsIGZvciB0aGlzIHByb3BlcnR5CisgKiBAcGFyYW0gc3RyaW5nSW5kaWNlcyBhcnJheSBvZiBhdCBsZWFzdCBNQVhfTkFNRVNfUEVSX0dST1VQCisgKiBlbGVtZW50cywgd2lsbCBiZSBmaWxsZWQgd2l0aCBpbmRpY2VzIGludG8gU1RSSU5HX1RBQkxFCisgKiBAcmV0dXJuIG51bWJlciBvZiBpbmRpY2VzLCA+PSAxCisgKi8KK2ludDMyX3QgQWxpYXM6OmdldFVuaXF1ZU5hbWVzKGludDMyX3QqIHN0cmluZ0luZGljZXMpIGNvbnN0IHsKKyAgICBpbnQzMl90IGNvdW50ID0gMDsKKyAgICBpbnQzMl90IGkgPSBuYW1lR3JvdXBJbmRleDsKKyAgICBVQm9vbCBkb25lID0gRkFMU0U7CisgICAgd2hpbGUgKCFkb25lKSB7CisgICAgICAgIGludDMyX3QgaiA9IE5BTUVfR1JPVVBbaSsrXTsKKyAgICAgICAgaWYgKGogPCAwKSB7CisgICAgICAgICAgICBkb25lID0gVFJVRTsKKyAgICAgICAgICAgIGogPSAtajsKKyAgICAgICAgfQorICAgICAgICBpZiAoaiA9PSAwKSBjb250aW51ZTsgLy8gb21pdCAiIiBlbnRyaWVzCisgICAgICAgIFVCb29sIGR1cGUgPSBGQUxTRTsKKyAgICAgICAgZm9yIChpbnQzMl90IGs9MDsgazxjb3VudDsgKytrKSB7CisgICAgICAgICAgICBpZiAoc3RyaW5nSW5kaWNlc1trXSA9PSBqKSB7CisgICAgICAgICAgICAgICAgZHVwZSA9IFRSVUU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBhbHNvIGRvIGEgc3RyaW5nIGNoZWNrIGZvciB0aGluZ3MgbGlrZSAiYWdlfEFnZSIKKyAgICAgICAgICAgIGlmIChTVFJJTkdfVEFCTEVbc3RyaW5nSW5kaWNlc1trXV0gPT0gU1RSSU5HX1RBQkxFW2pdKSB7CisgICAgICAgICAgICAgICAgLy9wcmludGYoIkZvdW5kIGR1cGUgJXN8JXNcbiIsCisgICAgICAgICAgICAgICAgLy8gICAgICAgU1RSSU5HX1RBQkxFW3N0cmluZ0luZGljZXNba11dLnN0ciwKKyAgICAgICAgICAgICAgICAvLyAgICAgICBTVFJJTkdfVEFCTEVbal0uc3RyKTsKKyAgICAgICAgICAgICAgICBkdXBlID0gVFJVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZHVwZSkgY29udGludWU7IC8vIG9taXQgZHVwbGljYXRlcworICAgICAgICBzdHJpbmdJbmRpY2VzW2NvdW50KytdID0gajsKKyAgICB9CisgICAgcmV0dXJuIGNvdW50OworfQorCisvLyBFTkQgREFUQQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIEJ1aWxkZXIgeworcHVibGljOgorICAgIEJ1aWxkZXIoVUVycm9yQ29kZSAmZXJyb3JDb2RlKSA6IHZhbHVlTWFwcyhlcnJvckNvZGUpLCBidGIoZXJyb3JDb2RlKSwgbWF4TmFtZUxlbmd0aCgwKSB7fQorCisgICAgdm9pZCBidWlsZCgpIHsKKyAgICAgICAgSWN1VG9vbEVycm9yQ29kZSBlcnJvckNvZGUoImdlbnBuYW1lIEJ1aWxkZXI6OmJ1aWxkKCkiKTsKKworICAgICAgICAvLyBCdWlsZCBtYWluIHByb3BlcnR5IGFsaWFzZXMgdmFsdWUgbWFwIGF0IHZhbHVlIG1hcCBvZmZzZXQgMCwKKyAgICAgICAgLy8gc28gdGhhdCB3ZSBuZWVkIG5vdCBzdG9yZSBhbm90aGVyIG9mZnNldCBmb3IgaXQuCisgICAgICAgIFVWZWN0b3IzMiBwcm9wRW51bXMoZXJyb3JDb2RlKTsKKyAgICAgICAgaW50MzJfdCBwcm9wSW5kZXg7CisgICAgICAgIGZvcihwcm9wSW5kZXg9MDsgcHJvcEluZGV4PFBST1BFUlRZX0NPVU5UOyArK3Byb3BJbmRleCkgeworICAgICAgICAgICAgcHJvcEVudW1zLnNvcnRlZEluc2VydChQUk9QRVJUWVtwcm9wSW5kZXhdLmVudW1WYWx1ZSwgZXJyb3JDb2RlKTsKKyAgICAgICAgfQorICAgICAgICBpbnQzMl90IHJhbmdlc1sxMF1bMl07CisgICAgICAgIGludDMyX3QgbnVtUHJvcFJhbmdlcz11cHJ2X21ha2VEZW5zZVJhbmdlcyhwcm9wRW51bXMuZ2V0QnVmZmVyKCksIFBST1BFUlRZX0NPVU5ULCAweDEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlcywgTEVOR1RIT0YocmFuZ2VzKSk7CisgICAgICAgIHZhbHVlTWFwcy5hZGRFbGVtZW50KG51bVByb3BSYW5nZXMsIGVycm9yQ29kZSk7CisgICAgICAgIGludDMyX3QgaSwgajsKKyAgICAgICAgZm9yKGk9MDsgaTxudW1Qcm9wUmFuZ2VzOyArK2kpIHsKKyAgICAgICAgICAgIHZhbHVlTWFwcy5hZGRFbGVtZW50KHJhbmdlc1tpXVswXSwgZXJyb3JDb2RlKTsKKyAgICAgICAgICAgIHZhbHVlTWFwcy5hZGRFbGVtZW50KHJhbmdlc1tpXVsxXSsxLCBlcnJvckNvZGUpOworICAgICAgICAgICAgZm9yKGo9cmFuZ2VzW2ldWzBdOyBqPD1yYW5nZXNbaV1bMV07ICsraikgeworICAgICAgICAgICAgICAgIC8vIFJlc2VydmUgdHdvIHNsb3RzIHBlciBwcm9wZXJ0eSBmb3IgdGhlIG5hbWUgZ3JvdXAgb2Zmc2V0IGFuZCB0aGUgdmFsdWUtbWFwIG9mZnNldC4KKyAgICAgICAgICAgICAgICB2YWx1ZU1hcHMuYWRkRWxlbWVudCgwLCBlcnJvckNvZGUpOworICAgICAgICAgICAgICAgIHZhbHVlTWFwcy5hZGRFbGVtZW50KDAsIGVycm9yQ29kZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBCdWlsZCB0aGUgcHJvcGVydGllcyB0cmllIGZpcnN0LCBhdCBCeXRlc1RyaWUgb2Zmc2V0IDAsCisgICAgICAgIC8vIHNvIHRoYXQgd2UgbmVlZCBub3Qgc3RvcmUgYW5vdGhlciBvZmZzZXQgZm9yIGl0LgorICAgICAgICBidWlsZEFsaWFzZXNCeXRlc1RyaWUoUFJPUEVSVFksIFBST1BFUlRZX0NPVU5ULCBlcnJvckNvZGUpOworCisgICAgICAgIC8vIEJ1aWxkIHRoZSBuYW1lIGdyb3VwIGZvciB0aGUgZmlyc3QgcHJvcGVydHksIGF0IG5hbWVHcm91cHMgb2Zmc2V0IDAuCisgICAgICAgIC8vIE5hbWUgZ3JvdXBzIGZvciAqdmFsdWUqIGFsaWFzZXMgbXVzdCBub3Qgc3RhcnQgYXQgb2Zmc2V0IDAKKyAgICAgICAgLy8gYmVjYXVzZSB0aGF0IGlzIGEgbWlzc2luZy12YWx1ZSBtYXJrZXIgZm9yIHNwYXJzZSB2YWx1ZSByYW5nZXMuCisgICAgICAgIHNldFByb3BlcnR5SW50KFBST1BFUlRZWzBdLmVudW1WYWx1ZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVOYW1lR3JvdXAoUFJPUEVSVFlbMF0sIGVycm9yQ29kZSkpOworCisgICAgICAgIC8vIEJ1aWxkIHRoZSBrbm93bi1yZXBlYXRlZCBiaW5hcnkgcHJvcGVydGllcyBvbmNlLgorICAgICAgICBpbnQzMl90IGJpblByb3BzVmFsdWVNYXBPZmZzZXQ9dmFsdWVNYXBzLnNpemUoKTsKKyAgICAgICAgaW50MzJfdCBieXRlc1RyaWVPZmZzZXQ9YnVpbGRBbGlhc2VzQnl0ZXNUcmllKFZBTFVFU19iaW5wcm9wLCBWQUxVRVNfYmlucHJvcF9DT1VOVCwgZXJyb3JDb2RlKTsKKyAgICAgICAgdmFsdWVNYXBzLmFkZEVsZW1lbnQoYnl0ZXNUcmllT2Zmc2V0LCBlcnJvckNvZGUpOworICAgICAgICBidWlsZFZhbHVlTWFwKFZBTFVFU19iaW5wcm9wLCBWQUxVRVNfYmlucHJvcF9DT1VOVCwgZXJyb3JDb2RlKTsKKworICAgICAgICAvLyBCdWlsZCB0aGUga25vd24tcmVwZWF0ZWQgY2Fub25pY2FsIGNvbWJpbmluZyBjbGFzcyBwcm9wZXJ0aWVzIG9uY2UuCisgICAgICAgIGludDMyX3QgY2NjVmFsdWVNYXBPZmZzZXQ9dmFsdWVNYXBzLnNpemUoKTsKKyAgICAgICAgYnl0ZXNUcmllT2Zmc2V0PWJ1aWxkQWxpYXNlc0J5dGVzVHJpZShWQUxVRVNfY2NjLCBWQUxVRVNfY2NjX0NPVU5ULCBlcnJvckNvZGUpOworICAgICAgICB2YWx1ZU1hcHMuYWRkRWxlbWVudChieXRlc1RyaWVPZmZzZXQsIGVycm9yQ29kZSk7CisgICAgICAgIGJ1aWxkVmFsdWVNYXAoVkFMVUVTX2NjYywgVkFMVUVTX2NjY19DT1VOVCwgZXJyb3JDb2RlKTsKKworICAgICAgICAvLyBCdWlsZCB0aGUgcmVzdCBvZiB0aGUgZGF0YS4KKyAgICAgICAgZm9yKHByb3BJbmRleD0wOyBwcm9wSW5kZXg8UFJPUEVSVFlfQ09VTlQ7ICsrcHJvcEluZGV4KSB7CisgICAgICAgICAgICBpZihwcm9wSW5kZXg+MCkgeworICAgICAgICAgICAgICAgIC8vIHdyaXRlTmFtZUdyb3VwKFBST1BFUlRZWzBdLCAuLi4pIGFscmVhZHkgZG9uZQorICAgICAgICAgICAgICAgIHNldFByb3BlcnR5SW50KFBST1BFUlRZW3Byb3BJbmRleF0uZW51bVZhbHVlLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlTmFtZUdyb3VwKFBST1BFUlRZW3Byb3BJbmRleF0sIGVycm9yQ29kZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50MzJfdCB2YWx1ZUNvdW50PVBST1BFUlRZW3Byb3BJbmRleF0udmFsdWVDb3VudDsKKyAgICAgICAgICAgIGlmKHZhbHVlQ291bnQ+MCkgeworICAgICAgICAgICAgICAgIGludDMyX3QgdmFsdWVNYXBPZmZzZXQ7CisgICAgICAgICAgICAgICAgY29uc3QgQWxpYXMgKnZhbHVlTGlzdD1QUk9QRVJUWVtwcm9wSW5kZXhdLnZhbHVlTGlzdDsKKyAgICAgICAgICAgICAgICBpZih2YWx1ZUxpc3Q9PVZBTFVFU19iaW5wcm9wKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlTWFwT2Zmc2V0PWJpblByb3BzVmFsdWVNYXBPZmZzZXQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmKHZhbHVlTGlzdD09VkFMVUVTX2NjYyB8fCB2YWx1ZUxpc3Q9PVZBTFVFU19sY2NjIHx8IHZhbHVlTGlzdD09VkFMVUVTX3RjY2MpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVNYXBPZmZzZXQ9Y2NjVmFsdWVNYXBPZmZzZXQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVNYXBPZmZzZXQ9dmFsdWVNYXBzLnNpemUoKTsKKyAgICAgICAgICAgICAgICAgICAgYnl0ZXNUcmllT2Zmc2V0PWJ1aWxkQWxpYXNlc0J5dGVzVHJpZSh2YWx1ZUxpc3QsIHZhbHVlQ291bnQsIGVycm9yQ29kZSk7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlTWFwcy5hZGRFbGVtZW50KGJ5dGVzVHJpZU9mZnNldCwgZXJyb3JDb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgYnVpbGRWYWx1ZU1hcCh2YWx1ZUxpc3QsIHZhbHVlQ291bnQsIGVycm9yQ29kZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNldFByb3BlcnR5SW50KFBST1BFUlRZW3Byb3BJbmRleF0uZW51bVZhbHVlLCAxLCB2YWx1ZU1hcE9mZnNldCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBXcml0ZSB0aGUgaW5kZXhlcy4KKyAgICAgICAgaW50MzJfdCBvZmZzZXQ9KGludDMyX3Qpc2l6ZW9mKGluZGV4ZXMpOworICAgICAgICBpbmRleGVzW1Byb3BOYW1lRGF0YTo6SVhfVkFMVUVfTUFQU19PRkZTRVRdPW9mZnNldDsKKyAgICAgICAgb2Zmc2V0Kz12YWx1ZU1hcHMuc2l6ZSgpKjQ7CisgICAgICAgIGluZGV4ZXNbUHJvcE5hbWVEYXRhOjpJWF9CWVRFX1RSSUVTX09GRlNFVF09b2Zmc2V0OworICAgICAgICBvZmZzZXQrPWJ5dGVzVHJpZXMubGVuZ3RoKCk7CisgICAgICAgIGluZGV4ZXNbUHJvcE5hbWVEYXRhOjpJWF9OQU1FX0dST1VQU19PRkZTRVRdPW9mZnNldDsKKyAgICAgICAgb2Zmc2V0Kz1uYW1lR3JvdXBzLmxlbmd0aCgpOworICAgICAgICBmb3IoaT1Qcm9wTmFtZURhdGE6OklYX1JFU0VSVkVEM19PRkZTRVQ7IGk8PVByb3BOYW1lRGF0YTo6SVhfVE9UQUxfU0laRTsgKytpKSB7CisgICAgICAgICAgICBpbmRleGVzW2ldPW9mZnNldDsKKyAgICAgICAgfQorICAgICAgICBpbmRleGVzW1Byb3BOYW1lRGF0YTo6SVhfTUFYX05BTUVfTEVOR1RIXT1tYXhOYW1lTGVuZ3RoOworICAgICAgICBmb3IoaT1Qcm9wTmFtZURhdGE6OklYX1JFU0VSVkVENzsgaTxQcm9wTmFtZURhdGE6OklYX0NPVU5UOyArK2kpIHsKKyAgICAgICAgICAgIGluZGV4ZXNbaV09MDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGludDMyX3Qgd3JpdGVOYW1lR3JvdXAoY29uc3QgQWxpYXMgJmFsaWFzLCBVRXJyb3JDb2RlICZlcnJvckNvZGUpIHsKKyAgICAgICAgaW50MzJfdCBuYW1lT2Zmc2V0PW5hbWVHcm91cHMubGVuZ3RoKCk7CisgICAgICAgIC8vIENvdW50IGhvdyBtYW55IGFsaWFzZXMgdGhpcyBncm91cCBoYXMuCisgICAgICAgIGludDMyX3QgaT1hbGlhcy5uYW1lR3JvdXBJbmRleDsKKyAgICAgICAgaW50MzJfdCBuYW1lSW5kZXg7CisgICAgICAgIGRvIHsgbmFtZUluZGV4PU5BTUVfR1JPVVBbaSsrXTsgfSB3aGlsZShuYW1lSW5kZXg+PTApOworICAgICAgICBpbnQzMl90IGNvdW50PWktYWxpYXMubmFtZUdyb3VwSW5kZXg7CisgICAgICAgIC8vIFRoZSBmaXJzdCBieXRlIHRlbGxzIHVzIGhvdyBtYW55IGFsaWFzZXMgdGhlcmUgYXJlLgorICAgICAgICAvLyBXZSB1c2Ugb25seSB2YWx1ZXMgMC4uMHgxZiBpbiB0aGUgZmlyc3QgYnl0ZSBiZWNhdXNlIHdoZW4gd2Ugd3JpdGUKKyAgICAgICAgLy8gdGhlIG5hbWUgZ3JvdXBzIGFzIGFuIGludmFyaWFudC1jaGFyYWN0ZXIgc3RyaW5nIGludG8gYSBzb3VyY2UgZmlsZSwKKyAgICAgICAgLy8gdGhvc2UgdmFsdWVzIChDMCBjb250cm9sIGNvZGVzKSBhcmUgd3JpdHRlbiBhcyBudW1iZXJzIHJhdGhlciB0aGFuIGFzIGNoYXJhY3RlcnMuCisgICAgICAgIGlmKGNvdW50Pj0weDIwKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiBUb28gbWFueSBhbGlhc2VzIGluIHRoZSBncm91cCB3aXRoIGluZGV4ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAoaW50KWFsaWFzLm5hbWVHcm91cEluZGV4KTsKKyAgICAgICAgICAgIGV4aXQoVV9JTkRFWF9PVVRPRkJPVU5EU19FUlJPUik7CisgICAgICAgIH0KKyAgICAgICAgbmFtZUdyb3Vwcy5hcHBlbmQoKGNoYXIpY291bnQsIGVycm9yQ29kZSk7CisgICAgICAgIC8vIFRoZXJlIGlzIGF0IGxlYXN0IGEgc2hvcnQgbmFtZSAoc29tZXRpbWVzIGVtcHR5KSBhbmQgYSBsb25nIG5hbWUuIChjb3VudD49MikKKyAgICAgICAgLy8gTm90ZTogU29tZXRpbWVzIHRoZSBzaG9ydCBhbmQgbG9uZyBuYW1lcyBhcmUgdGhlIHNhbWUuCisgICAgICAgIC8vIEluIHN1Y2ggYSBjYXNlLCB3ZSBjb3VsZCBzZXQgYSBmbGFnIGFuZCBvbWl0IHRoZSBkdXBsaWNhdGUsCisgICAgICAgIC8vIGJ1dCB0aGF0IHdvdWxkIHNhdmUgb25seSBhYm91dCAxLjM1JSBvZiB0b3RhbCBkYXRhIHNpemUgKFVuaWNvZGUgNi4wL0lDVSA0LjYpCisgICAgICAgIC8vIHdoaWNoIGlzIG5vdCB3b3J0aCB0aGUgdHJvdWJsZS4KKyAgICAgICAgaT1hbGlhcy5uYW1lR3JvdXBJbmRleDsKKyAgICAgICAgaW50MzJfdCBuOworICAgICAgICBkbyB7CisgICAgICAgICAgICBuYW1lSW5kZXg9bj1OQU1FX0dST1VQW2krK107CisgICAgICAgICAgICBpZihuYW1lSW5kZXg8MCkgeworICAgICAgICAgICAgICAgIG5hbWVJbmRleD0tbmFtZUluZGV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uc3QgY2hhciAqcz1TVFJJTkdfVEFCTEVbbmFtZUluZGV4XS5zdHI7CisgICAgICAgICAgICBpbnQzMl90IHNMZW5ndGg9dXBydl9zdHJsZW4ocykrMTsKKyAgICAgICAgICAgIGlmKHNMZW5ndGg+bWF4TmFtZUxlbmd0aCkgeworICAgICAgICAgICAgICAgIG1heE5hbWVMZW5ndGg9c0xlbmd0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5hbWVHcm91cHMuYXBwZW5kKHMsIHNMZW5ndGgsIGVycm9yQ29kZSk7ICAvLyBpbmNsdWRpbmcgTlVMCisgICAgICAgIH0gd2hpbGUobj49MCk7CisgICAgICAgIHJldHVybiBuYW1lT2Zmc2V0OworICAgIH0KKworICAgIHZvaWQgYnVpbGRWYWx1ZU1hcChjb25zdCBBbGlhcyBhbGlhc2VzW10sIGludDMyX3QgbGVuZ3RoLCBVRXJyb3JDb2RlICZlcnJvckNvZGUpIHsKKyAgICAgICAgVVZlY3RvcjMyIHNvcnRlZFZhbHVlcyhlcnJvckNvZGUpOworICAgICAgICBVVmVjdG9yMzIgbmFtZU9mZnNldHMoZXJyb3JDb2RlKTsgIC8vIFBhcmFsbGVsIHRvIGFsaWFzZXNbXS4KKyAgICAgICAgaW50MzJfdCBpOworICAgICAgICBmb3IoaT0wOyBpPGxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBzb3J0ZWRWYWx1ZXMuc29ydGVkSW5zZXJ0KGFsaWFzZXNbaV0uZW51bVZhbHVlLCBlcnJvckNvZGUpOworICAgICAgICAgICAgbmFtZU9mZnNldHMuYWRkRWxlbWVudCh3cml0ZU5hbWVHcm91cChhbGlhc2VzW2ldLCBlcnJvckNvZGUpLCBlcnJvckNvZGUpOworICAgICAgICB9CisgICAgICAgIGludDMyX3QgcmFuZ2VzWzEwXVsyXTsKKyAgICAgICAgaW50MzJfdCBudW1SYW5nZXM9dXBydl9tYWtlRGVuc2VSYW5nZXMoc29ydGVkVmFsdWVzLmdldEJ1ZmZlcigpLCBsZW5ndGgsIDB4ZTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlcywgTEVOR1RIT0YocmFuZ2VzKSk7CisgICAgICAgIGlmKG51bVJhbmdlcz4wKSB7CisgICAgICAgICAgICB2YWx1ZU1hcHMuYWRkRWxlbWVudChudW1SYW5nZXMsIGVycm9yQ29kZSk7CisgICAgICAgICAgICBmb3IoaT0wOyBpPG51bVJhbmdlczsgKytpKSB7CisgICAgICAgICAgICAgICAgdmFsdWVNYXBzLmFkZEVsZW1lbnQocmFuZ2VzW2ldWzBdLCBlcnJvckNvZGUpOworICAgICAgICAgICAgICAgIHZhbHVlTWFwcy5hZGRFbGVtZW50KHJhbmdlc1tpXVsxXSsxLCBlcnJvckNvZGUpOworICAgICAgICAgICAgICAgIGZvcihpbnQzMl90IGo9cmFuZ2VzW2ldWzBdOyBqPD1yYW5nZXNbaV1bMV07ICsraikgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcmFuZ2UgbWlnaHQgbm90IGJlIGNvbXBsZXRlbHkgZGVuc2UsIHNvIGogbWlnaHQgbm90IGhhdmUgYW4gZW50cnksCisgICAgICAgICAgICAgICAgICAgIC8vIGluIHdoaWNoIGNhc2Ugd2Ugd3JpdGUgYSBuYW1lT2Zmc2V0IG9mIDAuCisgICAgICAgICAgICAgICAgICAgIC8vIFJlYWwgbmFtZU9mZnNldHMgZm9yIHByb3BlcnR5IHZhbHVlcyBhcmUgbmV2ZXIgMC4KKyAgICAgICAgICAgICAgICAgICAgLy8gKFRoZSBmaXJzdCBuYW1lIGdyb3VwIGlzIGZvciB0aGUgZmlyc3QgcHJvcGVydHkgbmFtZS4pCisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYWxpYXNJbmRleD1hbGlhc2VzSW5kZXhPZihhbGlhc2VzLCBsZW5ndGgsIGopOworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5hbWVPZmZzZXQ9IGFsaWFzSW5kZXg+PTAgPyBuYW1lT2Zmc2V0cy5lbGVtZW50QXRpKGFsaWFzSW5kZXgpIDogMDsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVNYXBzLmFkZEVsZW1lbnQobmFtZU9mZnNldCwgZXJyb3JDb2RlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBObyBkZW5zZSByYW5nZXMuCisgICAgICAgICAgICB2YWx1ZU1hcHMuYWRkRWxlbWVudCgweDEwK2xlbmd0aCwgZXJyb3JDb2RlKTsKKyAgICAgICAgICAgIGZvcihpPTA7IGk8bGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgICAgICB2YWx1ZU1hcHMuYWRkRWxlbWVudChzb3J0ZWRWYWx1ZXMuZWxlbWVudEF0aShpKSwgZXJyb3JDb2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvcihpPTA7IGk8bGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgICAgICB2YWx1ZU1hcHMuYWRkRWxlbWVudCgKKyAgICAgICAgICAgICAgICAgICAgbmFtZU9mZnNldHMuZWxlbWVudEF0aSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzZXNJbmRleE9mKGFsaWFzZXMsIGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRlZFZhbHVlcy5lbGVtZW50QXRpKGkpKSksIGVycm9yQ29kZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgaW50MzJfdCBhbGlhc2VzSW5kZXhPZihjb25zdCBBbGlhcyBhbGlhc2VzW10sIGludDMyX3QgbGVuZ3RoLCBpbnQzMl90IHZhbHVlKSB7CisgICAgICAgIGZvcihpbnQzMl90IGk9MDs7ICsraSkgeworICAgICAgICAgICAgaWYoYWxpYXNlc1tpXS5lbnVtVmFsdWU9PXZhbHVlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHZvaWQgc2V0UHJvcGVydHlJbnQoaW50MzJfdCBwcm9wLCBpbnQzMl90IHN1YkluZGV4LCBpbnQzMl90IHZhbHVlKSB7CisgICAgICAgIC8vIEFzc3VtZSB0aGF0IHByb3AgaXMgaW4gdGhlIHZhbHVlTWFwcy5lbGVtZW50QXRpKDApIHJhbmdlcy4KKyAgICAgICAgaW50MzJfdCBpbmRleD0xOworICAgICAgICBmb3IoOzspIHsKKyAgICAgICAgICAgIGludDMyX3QgcmFuZ2VTdGFydD12YWx1ZU1hcHMuZWxlbWVudEF0aShpbmRleCk7CisgICAgICAgICAgICBpbnQzMl90IHJhbmdlTGltaXQ9dmFsdWVNYXBzLmVsZW1lbnRBdGkoaW5kZXgrMSk7CisgICAgICAgICAgICBpbmRleCs9MjsKKyAgICAgICAgICAgIGlmKHJhbmdlU3RhcnQ8PXByb3AgJiYgcHJvcDxyYW5nZUxpbWl0KSB7CisgICAgICAgICAgICAgICAgdmFsdWVNYXBzLnNldEVsZW1lbnRBdCh2YWx1ZSwgaW5kZXgrMioocHJvcC1yYW5nZVN0YXJ0KStzdWJJbmRleCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbmRleCs9MioocmFuZ2VMaW1pdC1yYW5nZVN0YXJ0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgYWRkQWxpYXNUb0J5dGVzVHJpZShjb25zdCBBbGlhcyAmYWxpYXMsIFVFcnJvckNvZGUgJmVycm9yQ29kZSkgeworICAgICAgICBpbnQzMl90IG5hbWVzW01BWF9OQU1FU19QRVJfR1JPVVBdOworICAgICAgICBpbnQzMl90IG51bU5hbWVzPWFsaWFzLmdldFVuaXF1ZU5hbWVzKG5hbWVzKTsKKyAgICAgICAgZm9yKGludDMyX3QgaT0wOyBpPG51bU5hbWVzOyArK2kpIHsKKyAgICAgICAgICAgIC8vIHByaW50ZigiKiBhZGRpbmcgJXM6IDB4JWx4XG4iLCBTVFJJTkdfVEFCTEVbbmFtZXNbaV1dLm5vcm1hbGl6ZWQsIChsb25nKWFsaWFzLmVudW1WYWx1ZSk7CisgICAgICAgICAgICBidGIuYWRkKFNUUklOR19UQUJMRVtuYW1lc1tpXV0ubm9ybWFsaXplZCwgYWxpYXMuZW51bVZhbHVlLCBlcnJvckNvZGUpOworICAgICAgICB9CisgICAgfQorCisgICAgaW50MzJfdCBidWlsZEFsaWFzZXNCeXRlc1RyaWUoY29uc3QgQWxpYXMgYWxpYXNlc1tdLCBpbnQzMl90IGxlbmd0aCwgVUVycm9yQ29kZSAmZXJyb3JDb2RlKSB7CisgICAgICAgIGJ0Yi5jbGVhcigpOworICAgICAgICBmb3IoaW50MzJfdCBpPTA7IGk8bGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGFkZEFsaWFzVG9CeXRlc1RyaWUoYWxpYXNlc1tpXSwgZXJyb3JDb2RlKTsKKyAgICAgICAgfQorICAgICAgICBpbnQzMl90IGJ5dGVzVHJpZU9mZnNldD1ieXRlc1RyaWVzLmxlbmd0aCgpOworICAgICAgICBieXRlc1RyaWVzLmFwcGVuZChidGIuYnVpbGRTdHJpbmdQaWVjZShVU1RSSU5HVFJJRV9CVUlMRF9TTUFMTCwgZXJyb3JDb2RlKSwgZXJyb3JDb2RlKTsKKyAgICAgICAgcmV0dXJuIGJ5dGVzVHJpZU9mZnNldDsKKyAgICB9CisKKyAgICAvLyBPdmVybG9hZCBmb3IgUHJvcGVydHkuIFByb3BlcnR5IGlzLWFuIEFsaWFzLCBidXQgd2hlbiB3ZSBpdGVyYXRlIHRocm91Z2gKKyAgICAvLyB0aGUgYXJyYXkgd2UgbmVlZCB0byBpbmNyZW1lbnQgYnkgdGhlIHJpZ2h0IG9iamVjdCBzaXplLgorICAgIGludDMyX3QgYnVpbGRBbGlhc2VzQnl0ZXNUcmllKGNvbnN0IFByb3BlcnR5IGFsaWFzZXNbXSwgaW50MzJfdCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSAmZXJyb3JDb2RlKSB7CisgICAgICAgIGJ0Yi5jbGVhcigpOworICAgICAgICBmb3IoaW50MzJfdCBpPTA7IGk8bGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGFkZEFsaWFzVG9CeXRlc1RyaWUoYWxpYXNlc1tpXSwgZXJyb3JDb2RlKTsKKyAgICAgICAgfQorICAgICAgICBpbnQzMl90IGJ5dGVzVHJpZU9mZnNldD1ieXRlc1RyaWVzLmxlbmd0aCgpOworICAgICAgICBieXRlc1RyaWVzLmFwcGVuZChidGIuYnVpbGRTdHJpbmdQaWVjZShVU1RSSU5HVFJJRV9CVUlMRF9TTUFMTCwgZXJyb3JDb2RlKSwgZXJyb3JDb2RlKTsKKyAgICAgICAgcmV0dXJuIGJ5dGVzVHJpZU9mZnNldDsKKyAgICB9CisKKyAgICBpbnQzMl90IGluZGV4ZXNbUHJvcE5hbWVEYXRhOjpJWF9DT1VOVF07CisgICAgVVZlY3RvcjMyIHZhbHVlTWFwczsKKyAgICBCeXRlc1RyaWVCdWlsZGVyIGJ0YjsKKyAgICBDaGFyU3RyaW5nIGJ5dGVzVHJpZXM7CisgICAgQ2hhclN0cmluZyBuYW1lR3JvdXBzOworICAgIGludDMyX3QgbWF4TmFtZUxlbmd0aDsKK307CisKKy8qIFVEYXRhSW5mbyBjZi4gdWRhdGEuaCAqLworc3RhdGljIGNvbnN0IFVEYXRhSW5mbyBkYXRhSW5mbyA9IHsKKyAgICBzaXplb2YoVURhdGFJbmZvKSwKKyAgICAwLAorCisgICAgVV9JU19CSUdfRU5ESUFOLAorICAgIFVfQ0hBUlNFVF9GQU1JTFksCisgICAgc2l6ZW9mKFVDaGFyKSwKKyAgICAwLAorCisgICAgeyBQTkFNRV9TSUdfMCwgUE5BTUVfU0lHXzEsIFBOQU1FX1NJR18yLCBQTkFNRV9TSUdfMyB9LAorICAgIHsgMiwgMCwgMCwgMCB9LCAgICAgICAgICAgICAgICAgLyogZm9ybWF0VmVyc2lvbiAqLworICAgIHsgVkVSU0lPTl8wLCBWRVJTSU9OXzEsIFZFUlNJT05fMiwgVkVSU0lPTl8zIH0gLyogVW5pY29kZSB2ZXJzaW9uICovCit9OworCitzdGF0aWMgdm9pZCB3cml0ZURhdGFGaWxlKGNvbnN0IGNoYXIgKmRlc3RkaXIsIGNvbnN0IEJ1aWxkZXImIGJ1aWxkZXIsIFVCb29sIHVzZUNvcHlyaWdodCkgeworICAgIEljdVRvb2xFcnJvckNvZGUgZXJyb3JDb2RlKCJnZW5wbmFtZSB3cml0ZURhdGFGaWxlKCkiKTsKKyAgICBVTmV3RGF0YU1lbW9yeSAqcGRhdGE9dWRhdGFfY3JlYXRlKGRlc3RkaXIsIFBOQU1FX0RBVEFfVFlQRSwgUE5BTUVfREFUQV9OQU1FLCAmZGF0YUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VDb3B5cmlnaHQgPyBVX0NPUFlSSUdIVF9TVFJJTkcgOiAwLCBlcnJvckNvZGUpOworICAgIGVycm9yQ29kZS5hc3NlcnRTdWNjZXNzKCk7CisKKyAgICB1ZGF0YV93cml0ZUJsb2NrKHBkYXRhLCBidWlsZGVyLmluZGV4ZXMsIFByb3BOYW1lRGF0YTo6SVhfQ09VTlQqNCk7CisgICAgdWRhdGFfd3JpdGVCbG9jayhwZGF0YSwgYnVpbGRlci52YWx1ZU1hcHMuZ2V0QnVmZmVyKCksIGJ1aWxkZXIudmFsdWVNYXBzLnNpemUoKSo0KTsKKyAgICB1ZGF0YV93cml0ZUJsb2NrKHBkYXRhLCBidWlsZGVyLmJ5dGVzVHJpZXMuZGF0YSgpLCBidWlsZGVyLmJ5dGVzVHJpZXMubGVuZ3RoKCkpOworICAgIHVkYXRhX3dyaXRlQmxvY2socGRhdGEsIGJ1aWxkZXIubmFtZUdyb3Vwcy5kYXRhKCksIGJ1aWxkZXIubmFtZUdyb3Vwcy5sZW5ndGgoKSk7CisKKyAgICBpbnQzMl90IGRhdGFMZW5ndGg9KGludDMyX3QpdWRhdGFfZmluaXNoKHBkYXRhLCBlcnJvckNvZGUpOworICAgIGlmKGRhdGFMZW5ndGghPWJ1aWxkZXIuaW5kZXhlc1tQcm9wTmFtZURhdGE6OklYX1RPVEFMX1NJWkVdKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICJ1ZGF0YV9maW5pc2gocG5hbWVzLmljdSkgcmVwb3J0cyAlbGQgYnl0ZXMgd3JpdHRlbiBidXQgc2hvdWxkIGJlICVsZFxuIiwKKyAgICAgICAgICAgICAgICAobG9uZylkYXRhTGVuZ3RoLCAobG9uZylidWlsZGVyLmluZGV4ZXNbUHJvcE5hbWVEYXRhOjpJWF9UT1RBTF9TSVpFXSk7CisgICAgICAgIGV4aXQoVV9JTlRFUk5BTF9QUk9HUkFNX0VSUk9SKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlQ1NvdXJjZUZpbGUoY29uc3QgY2hhciAqZGVzdGRpciwgY29uc3QgQnVpbGRlciYgYnVpbGRlcikgeworICAgIEZJTEUgKmY9dXNyY19jcmVhdGUoZGVzdGRpciwgInByb3BuYW1lX2RhdGEuaCIpOworICAgIGlmKGY9PU5VTEwpIHsKKyAgICAgICAgcmV0dXJuOyAgLy8gdXNyY19jcmVhdGUoKSByZXBvcnRlZCBhbiBlcnJvci4KKyAgICB9CisKKyAgICBmcHV0cygiI2lmbmRlZiBJTkNMVURFRF9GUk9NX1BST1BOQU1FX0NQUFxuIgorICAgICAgICAgICIjICAgZXJyb3IgVGhpcyBmaWxlIG11c3QgYmUgI2luY2x1ZGVkIGZyb20gcHJvcG5hbWUuY3BwIG9ubHkuXG4iCisgICAgICAgICAgIiNlbmRpZlxuXG4iLCBmKTsKKworICAgIGZwdXRzKCJVX05BTUVTUEFDRV9CRUdJTlxuXG4iLCBmKTsKKworICAgIHVzcmNfd3JpdGVBcnJheShmLCAiY29uc3QgaW50MzJfdCBQcm9wTmFtZURhdGE6OmluZGV4ZXNbJWxkXT17IiwKKyAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5pbmRleGVzLCAzMiwgUHJvcE5hbWVEYXRhOjpJWF9DT1VOVCwKKyAgICAgICAgICAgICAgICAgICAgIn07XG5cbiIpOworICAgIHVzcmNfd3JpdGVBcnJheShmLCAiY29uc3QgaW50MzJfdCBQcm9wTmFtZURhdGE6OnZhbHVlTWFwc1slbGRdPXtcbiIsCisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIudmFsdWVNYXBzLmdldEJ1ZmZlcigpLCAzMiwgYnVpbGRlci52YWx1ZU1hcHMuc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAiXG59O1xuXG4iKTsKKyAgICB1c3JjX3dyaXRlQXJyYXkoZiwgImNvbnN0IHVpbnQ4X3QgUHJvcE5hbWVEYXRhOjpieXRlc1RyaWVzWyVsZF09e1xuIiwKKyAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5ieXRlc1RyaWVzLmRhdGEoKSwgOCwgYnVpbGRlci5ieXRlc1RyaWVzLmxlbmd0aCgpLAorICAgICAgICAgICAgICAgICAgICAiXG59O1xuXG4iKTsKKyAgICB1c3JjX3dyaXRlQXJyYXlPZk1vc3RseUludkNoYXJzKAorICAgICAgICBmLCAiY29uc3QgY2hhciBQcm9wTmFtZURhdGE6Om5hbWVHcm91cHNbJWxkXT17XG4iLAorICAgICAgICBidWlsZGVyLm5hbWVHcm91cHMuZGF0YSgpLCBidWlsZGVyLm5hbWVHcm91cHMubGVuZ3RoKCksCisgICAgICAgICJcbn07XG5cbiIpOworCisgICAgZnB1dHMoIlVfTkFNRVNQQUNFX0VORFxuIiwgZik7CisKKyAgICBmY2xvc2UoZik7Cit9CisKK2VudW0geworICAgIEhFTFBfSCwKKyAgICBIRUxQX1FVRVNUSU9OX01BUkssCisgICAgVkVSQk9TRSwKKyAgICBDT1BZUklHSFQsCisgICAgREVTVERJUiwKKyAgICBDU09VUkNFCit9OworCisvKiBLZWVwIHRoZXNlIHZhbHVlcyBpbiBzeW5jIHdpdGggdGhlIGFib3ZlIGVudW1zICovCitzdGF0aWMgVU9wdGlvbiBvcHRpb25zW109eworICAgIFVPUFRJT05fSEVMUF9ILAorICAgIFVPUFRJT05fSEVMUF9RVUVTVElPTl9NQVJLLAorICAgIFVPUFRJT05fVkVSQk9TRSwKKyAgICBVT1BUSU9OX0NPUFlSSUdIVCwKKyAgICBVT1BUSU9OX0RFU1RESVIsCisgICAgVU9QVElPTl9ERUYoImNzb3VyY2UiLCAnQycsIFVPUFRfTk9fQVJHKQorfTsKKworZXh0ZXJuIGludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKKyAgICBVX01BSU5fSU5JVF9BUkdTKGFyZ2MsIGFyZ3YpOworCisgICAgLyogcHJlc2V0IHRoZW4gcmVhZCBjb21tYW5kIGxpbmUgb3B0aW9ucyAqLworICAgIG9wdGlvbnNbREVTVERJUl0udmFsdWU9dV9nZXREYXRhRGlyZWN0b3J5KCk7CisgICAgYXJnYz11X3BhcnNlQXJncyhhcmdjLCBhcmd2LCBMRU5HVEhPRihvcHRpb25zKSwgb3B0aW9ucyk7CisKKyAgICAvKiBlcnJvciBoYW5kbGluZywgcHJpbnRpbmcgdXNhZ2UgbWVzc2FnZSAqLworICAgIGlmKGFyZ2M8MCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImVycm9yIGluIGNvbW1hbmQgbGluZSBhcmd1bWVudCBcIiVzXCJcbiIsIGFyZ3ZbLWFyZ2NdKTsKKyAgICB9CisgICAgaWYoYXJnYyE9MSB8fCBvcHRpb25zW0hFTFBfSF0uZG9lc09jY3VyIHx8IG9wdGlvbnNbSEVMUF9RVUVTVElPTl9NQVJLXS5kb2VzT2NjdXIpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAiVXNhZ2U6ICVzIFstb3B0aW9uc11cbiIKKyAgICAgICAgICAgICJcdENyZWF0ZXMgIiBQTkFNRV9EQVRBX05BTUUgIi4iIFBOQU1FX0RBVEFfVFlQRSAiXG4iCisgICAgICAgICAgICAiXG4iLAorICAgICAgICAgICAgYXJndlswXSk7CisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgIk9wdGlvbnM6XG4iCisgICAgICAgICAgICAiXHQtaCBvciAtPyBvciAtLWhlbHAgIHRoaXMgdXNhZ2UgdGV4dFxuIgorICAgICAgICAgICAgIlx0LXYgb3IgLS12ZXJib3NlICAgICB0dXJuIG9uIHZlcmJvc2Ugb3V0cHV0XG4iCisgICAgICAgICAgICAiXHQtYyBvciAtLWNvcHlyaWdodCAgIGluY2x1ZGUgYSBjb3B5cmlnaHQgbm90aWNlXG4iCisgICAgICAgICAgICAiXHQtZCBvciAtLWRlc3RkaXIgICAgIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSwgZm9sbG93ZWQgYnkgdGhlIHBhdGhcbiIKKyAgICAgICAgICAgICJcdC1DIG9yIC0tY3NvdXJjZSAgICAgZ2VuZXJhdGUgYSAuaCBzb3VyY2UgZmlsZSByYXRoZXIgdGhhbiB0aGUgLmljdSBiaW5hcnlcbiIpOworICAgICAgICByZXR1cm4gYXJnYyE9MSA/IFVfSUxMRUdBTF9BUkdVTUVOVF9FUlJPUiA6IFVfWkVST19FUlJPUjsKKyAgICB9CisKKyAgICBJY3VUb29sRXJyb3JDb2RlIGVycm9yQ29kZSgiZ2VucG5hbWUgbWFpbigpIEJ1aWxkZXIoKSIpOworICAgIEJ1aWxkZXIgYnVpbGRlcihlcnJvckNvZGUpOworICAgIGVycm9yQ29kZS5hc3NlcnRTdWNjZXNzKCk7CisgICAgYnVpbGRlci5idWlsZCgpOworICAgIGlmKG9wdGlvbnNbVkVSQk9TRV0uZG9lc09jY3VyKSB7CisgICAgICAgIHByaW50ZigibGVuZ3RoIG9mIGFsbCB2YWx1ZSBtYXBzOiAgJTZsZFxuIiwgKGxvbmcpYnVpbGRlci52YWx1ZU1hcHMuc2l6ZSgpKTsKKyAgICAgICAgcHJpbnRmKCJsZW5ndGggb2YgYWxsIEJ5dGVzVHJpZXM6ICAlNmxkXG4iLCAobG9uZylidWlsZGVyLmJ5dGVzVHJpZXMubGVuZ3RoKCkpOworICAgICAgICBwcmludGYoImxlbmd0aCBvZiBhbGwgbmFtZSBncm91cHM6ICU2bGRcbiIsIChsb25nKWJ1aWxkZXIubmFtZUdyb3Vwcy5sZW5ndGgoKSk7CisgICAgICAgIHByaW50ZigibGVuZ3RoIG9mIHBuYW1lcy5pY3UgZGF0YTogJTZsZFxuIiwgKGxvbmcpYnVpbGRlci5pbmRleGVzW1Byb3BOYW1lRGF0YTo6SVhfVE9UQUxfU0laRV0pOworICAgIH0KKworICAgIGlmKG9wdGlvbnNbQ1NPVVJDRV0uZG9lc09jY3VyKSB7CisgICAgICAgIHdyaXRlQ1NvdXJjZUZpbGUob3B0aW9uc1tERVNURElSXS52YWx1ZSwgYnVpbGRlcik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgd3JpdGVEYXRhRmlsZShvcHRpb25zW0RFU1RESVJdLnZhbHVlLCBidWlsZGVyLCBvcHRpb25zW0NPUFlSSUdIVF0uZG9lc09jY3VyKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsgLy8gc3VjY2VzcworfQpkaWZmIC0tZ2l0IGEvdW5pY29kZS9jL2dlbnBuYW1lL2dlbnBuYW1lLnZjcHJvaiBiL3VuaWNvZGUvYy9nZW5wbmFtZS9nZW5wbmFtZS52Y3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjczM2Q2YwotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGUvYy9nZW5wbmFtZS9nZW5wbmFtZS52Y3Byb2oKQEAgLTAsMCArMSw0MDMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/PgorPFZpc3VhbFN0dWRpb1Byb2plY3QKKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyIKKwlWZXJzaW9uPSI5LjAwIgorCU5hbWU9ImdlbnBuYW1lIgorCVByb2plY3RHVUlEPSJ7REJDMEFGMEItQjlGRi00QjIzLTkwNUItNEQ0Q0RDMkE5MUNCfSIKKwlUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPSIxMzEwNzIiCisJPgorCTxQbGF0Zm9ybXM+CisJCTxQbGF0Zm9ybQorCQkJTmFtZT0iV2luMzIiCisJCS8+CisJCTxQbGF0Zm9ybQorCQkJTmFtZT0ieDY0IgorCQkvPgorCTwvUGxhdGZvcm1zPgorCTxUb29sRmlsZXM+CisJPC9Ub29sRmlsZXM+CisJPENvbmZpZ3VyYXRpb25zPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iUmVsZWFzZXxXaW4zMiIKKwkJCU91dHB1dERpcmVjdG9yeT0iLlx4ODZcUmVsZWFzZSIKKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlx4ODZcUmVsZWFzZSIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIgorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIgorCQkJVXNlT2ZNRkM9IjAiCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiCisJCQlDaGFyYWN0ZXJTZXQ9IjIiCisJCQk+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCQlDb21tYW5kTGluZT0iY29weSAmcXVvdDskKFRhcmdldFBhdGgpJnF1b3Q7IC4uXC4uXC4uXGJpbiYjeDBEOyYjeDBBOyIKKwkJCQlPdXRwdXRzPSIuLlwuLlwuLlxiaW5cJChUYXJnZXRGaWxlTmFtZSkiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCQlUeXBlTGlicmFyeU5hbWU9Ii5ceDg2XFJlbGVhc2UvZ2VucG5hbWUudGxiIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlxjb21tb247Li5cdG9vbHV0aWwiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjMyO05ERUJVRztfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUiCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSIKKwkJCQlSdW50aW1lTGlicmFyeT0iMiIKKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSIKKwkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJ0cnVlIgorCQkJCVRyZWF0V0NoYXJfdEFzQnVpbHRJblR5cGU9InRydWUiCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXHg4NlxSZWxlYXNlL2dlbnBuYW1lLnBjaCIKKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5ceDg2XFJlbGVhc2UvIgorCQkJCU9iamVjdEZpbGU9Ii5ceDg2XFJlbGVhc2UvIgorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXHg4NlxSZWxlYXNlLyIKKwkJCQlXYXJuaW5nTGV2ZWw9IjMiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCUNvbXBpbGVBcz0iMCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIgorCQkJCUN1bHR1cmU9IjEwMzMiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiCisJCQkJT3V0cHV0RmlsZT0iLlx4ODZcUmVsZWFzZS9nZW5wbmFtZS5leGUiCisJCQkJTGlua0luY3JlbWVudGFsPSIxIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXHg4NlxSZWxlYXNlL2dlbnBuYW1lLnBkYiIKKwkJCQlTdWJTeXN0ZW09IjEiCisJCQkJUmFuZG9taXplZEJhc2VBZGRyZXNzPSIxIgorCQkJCURhdGFFeGVjdXRpb25QcmV2ZW50aW9uPSIwIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5ceDg2XERlYnVnIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXHg4NlxEZWJ1ZyIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIgorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIgorCQkJVXNlT2ZNRkM9IjAiCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiCisJCQlDaGFyYWN0ZXJTZXQ9IjIiCisJCQk+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCQlDb21tYW5kTGluZT0iY29weSAmcXVvdDskKFRhcmdldFBhdGgpJnF1b3Q7IC4uXC4uXC4uXGJpbiYjeDBEOyYjeDBBOyIKKwkJCQlPdXRwdXRzPSIuLlwuLlwuLlxiaW5cJChUYXJnZXRGaWxlTmFtZSkiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCQlUeXBlTGlicmFyeU5hbWU9Ii5ceDg2XERlYnVnL2dlbnBuYW1lLnRsYiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJT3B0aW1pemF0aW9uPSIwIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXGNvbW1vbjsuLlx0b29sdXRpbCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7X0RFQlVHO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSIKKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiCisJCQkJUnVudGltZUxpYnJhcnk9IjMiCisJCQkJQnVmZmVyU2VjdXJpdHlDaGVjaz0idHJ1ZSIKKwkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJ0cnVlIgorCQkJCVRyZWF0V0NoYXJfdEFzQnVpbHRJblR5cGU9InRydWUiCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXHg4NlxEZWJ1Zy9nZW5wbmFtZS5wY2giCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXHg4NlxEZWJ1Zy8iCisJCQkJT2JqZWN0RmlsZT0iLlx4ODZcRGVidWcvIgorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXHg4NlxEZWJ1Zy8iCisJCQkJQnJvd3NlSW5mb3JtYXRpb249IjEiCisJCQkJV2FybmluZ0xldmVsPSIzIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSI0IgorCQkJCUNvbXBpbGVBcz0iMCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iX0RFQlVHIgorCQkJCUN1bHR1cmU9IjEwMzMiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiCisJCQkJT3V0cHV0RmlsZT0iLlx4ODZcRGVidWcvZ2VucG5hbWUuZXhlIgorCQkJCUxpbmtJbmNyZW1lbnRhbD0iMiIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPSJ0cnVlIgorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5ceDg2XERlYnVnL2dlbnBuYW1lLnBkYiIKKwkJCQlTdWJTeXN0ZW09IjEiCisJCQkJUmFuZG9taXplZEJhc2VBZGRyZXNzPSIxIgorCQkJCURhdGFFeGVjdXRpb25QcmV2ZW50aW9uPSIwIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCIKKwkJCQlVc2VGQVQzMldvcmthcm91bmQ9InRydWUiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDRnhDb3BUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCTwvQ29uZmlndXJhdGlvbj4KKwkJPENvbmZpZ3VyYXRpb24KKwkJCU5hbWU9IlJlbGVhc2V8eDY0IgorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXHg2NFxSZWxlYXNlIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXHg2NFxSZWxlYXNlIgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiCisJCQlVc2VPZk1GQz0iMCIKKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIKKwkJCUNoYXJhY3RlclNldD0iMiIKKwkJCT4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJCUNvbW1hbmRMaW5lPSJjb3B5ICZxdW90OyQoVGFyZ2V0UGF0aCkmcXVvdDsgLi5cLi5cLi5cYmluNjQmI3gwRDsmI3gwQTsiCisJCQkJT3V0cHV0cz0iLi5cLi5cLi5cYmluNjRcJChUYXJnZXRGaWxlTmFtZSkiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMyIKKwkJCQlUeXBlTGlicmFyeU5hbWU9Ii5ceDY0XFJlbGVhc2UvZ2VucG5hbWUudGxiIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlxjb21tb247Li5cdG9vbHV0aWwiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjY0O1dJTjMyO05ERUJVRztfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUiCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSIKKwkJCQlSdW50aW1lTGlicmFyeT0iMiIKKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSIKKwkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJ0cnVlIgorCQkJCVRyZWF0V0NoYXJfdEFzQnVpbHRJblR5cGU9InRydWUiCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXHg2NFxSZWxlYXNlL2dlbnBuYW1lLnBjaCIKKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5ceDY0XFJlbGVhc2UvIgorCQkJCU9iamVjdEZpbGU9Ii5ceDY0XFJlbGVhc2UvIgorCQkJCVByb2dyYW1EYXRhQmFzZUZpbGVOYW1lPSIuXHg2NFxSZWxlYXNlLyIKKwkJCQlXYXJuaW5nTGV2ZWw9IjMiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCUNvbXBpbGVBcz0iMCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuYWdlZFJlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iTkRFQlVHIgorCQkJCUN1bHR1cmU9IjEwMzMiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiCisJCQkJT3V0cHV0RmlsZT0iLlx4NjRcUmVsZWFzZS9nZW5wbmFtZS5leGUiCisJCQkJTGlua0luY3JlbWVudGFsPSIxIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXHg2NFxSZWxlYXNlL2dlbnBuYW1lLnBkYiIKKwkJCQlTdWJTeXN0ZW09IjEiCisJCQkJVGFyZ2V0TWFjaGluZT0iMTciCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iRGVidWd8eDY0IgorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXHg2NFxEZWJ1ZyIKKwkJCUludGVybWVkaWF0ZURpcmVjdG9yeT0iLlx4NjRcRGVidWciCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSIKKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyIKKwkJCVVzZU9mTUZDPSIwIgorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIgorCQkJQ2hhcmFjdGVyU2V0PSIyIgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkJQ29tbWFuZExpbmU9ImNvcHkgJnF1b3Q7JChUYXJnZXRQYXRoKSZxdW90OyAuLlwuLlwuLlxiaW42NCYjeDBEOyYjeDBBOyIKKwkJCQlPdXRwdXRzPSIuLlwuLlwuLlxiaW42NFwkKFRhcmdldEZpbGVOYW1lKSIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIgorCQkJCVRhcmdldEVudmlyb25tZW50PSIzIgorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iLlx4NjRcRGVidWcvZ2VucG5hbWUudGxiIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlPcHRpbWl6YXRpb249IjAiCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cY29tbW9uOy4uXHRvb2x1dGlsIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU42NDtXSU4zMjtfREVCVUc7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIgorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyIKKwkJCQlSdW50aW1lTGlicmFyeT0iMyIKKwkJCQlCdWZmZXJTZWN1cml0eUNoZWNrPSJ0cnVlIgorCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9InRydWUiCisJCQkJVHJlYXRXQ2hhcl90QXNCdWlsdEluVHlwZT0idHJ1ZSIKKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5ceDY0XERlYnVnL2dlbnBuYW1lLnBjaCIKKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5ceDY0XERlYnVnLyIKKwkJCQlPYmplY3RGaWxlPSIuXHg2NFxEZWJ1Zy8iCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5ceDY0XERlYnVnLyIKKwkJCQlCcm93c2VJbmZvcm1hdGlvbj0iMSIKKwkJCQlXYXJuaW5nTGV2ZWw9IjMiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjMiCisJCQkJQ29tcGlsZUFzPSIwIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciCisJCQkJQ3VsdHVyZT0iMTAzMyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKKwkJCQlPdXRwdXRGaWxlPSIuXHg2NFxEZWJ1Zy9nZW5wbmFtZS5leGUiCisJCQkJTGlua0luY3JlbWVudGFsPSIyIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlx4NjRcRGVidWcvZ2VucG5hbWUucGRiIgorCQkJCVN1YlN5c3RlbT0iMSIKKwkJCQlUYXJnZXRNYWNoaW5lPSIxNyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiCisJCQkJVXNlRkFUMzJXb3JrYXJvdW5kPSJ0cnVlIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCTwvQ29uZmlndXJhdGlvbnM+CisJPFJlZmVyZW5jZXM+CisJPC9SZWZlcmVuY2VzPgorCTxGaWxlcz4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLlxkYXRhLmgiCisJCQk+CisJCTwvRmlsZT4KKwkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLlxnZW5wbmFtZS5jcHAiCisJCQk+CisJCTwvRmlsZT4KKwk8L0ZpbGVzPgorCTxHbG9iYWxzPgorCTwvR2xvYmFscz4KKzwvVmlzdWFsU3R1ZGlvUHJvamVjdD4KZGlmZiAtLWdpdCBhL3VuaWNvZGUvYy9nZW5wbmFtZS9nZW5zdnBhLnBsIGIvdW5pY29kZS9jL2dlbnBuYW1lL2dlbnN2cGEucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmNiZjFjYwotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGUvYy9nZW5wbmFtZS9nZW5zdnBhLnBsCkBAIC0wLDAgKzEsMTYxIEBACisjIS91c3IvYmluL3BlcmwKKyMqCisjKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIyogICBDb3B5cmlnaHQgKEMpIDIwMDYsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMKKyMqICAgQ29ycG9yYXRpb24gYW5kIG90aGVycy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIyoKKyMqICAgZmlsZSBuYW1lOiAgZ2Vuc3B2YS5wbAorIyogICBlbmNvZGluZzogICBVUy1BU0NJSQorIyogICB0YWIgc2l6ZTogICA4IChub3QgdXNlZCkKKyMqICAgaW5kZW50YXRpb246NAorIyoKKyMqICAgQ3JlYXRlZCBieTogUmFtIFZpc3dhbmFkaGEKKyMqCisjKiBUaGlzIGZpbGUgZmlsdGVycyBpc28xNTkyNC11dGY4LTxkYXRlPi50eHQKKyMqCisKK3VzZSBGaWxlOjpGaW5kOwordXNlIEZpbGU6OkJhc2VuYW1lOwordXNlIElPOjpGaWxlOwordXNlIEN3ZDsKK3VzZSBGaWxlOjpDb3B5OwordXNlIEdldG9wdDo6TG9uZzsKK3VzZSBGaWxlOjpQYXRoOwordXNlIEZpbGU6OkNvcHk7CisKKyNydW4gdGhlIHByb2dyYW0KK21haW4oKTsKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUaGUgbWFpbiBwcm9ncmFtCisKK3N1YiBtYWluKCl7CisgICAgR2V0T3B0aW9ucygKKyAgICAgICAgICAgIi0tZGVzdGRpcj1zIiA9PiBcJGRlc3RkaXIsCisgICAgICAgICAgICItLWlzbzE1OTI0PXMiICA9PiBcJGlzbywKKyAgICAgICAgICAgIi0tcHJvcD1zIiAgPT4gXCRwcm9wLAorICAgICAgICAgICAiLS1jb2RlLXN0YXJ0PXMiICA9PiBcJGNvZGUsCisgICAgICAgICAgICk7CisgICAgdXNhZ2UoKSB1bmxlc3MgZGVmaW5lZCAkZGVzdGRpcjsKKyAgICB1c2FnZSgpIHVubGVzcyBkZWZpbmVkICRpc287CisgICAgdXNhZ2UoKSB1bmxlc3MgZGVmaW5lZCAkcHJvcDsKKyAgICAKKyAgICAkb3V0ZmlsZSA9ICIkZGVzdGRpci9TeW50aGV0aWNQcm9wZXJ0eVZhbHVlQWxpYXNlcy50eHQiOworICAgICRwcm9wRkggPSBJTzo6RmlsZS0+bmV3KCRwcm9wLCJyIikKKyAgICAgICAgICAgIG9yIGRpZSAgImNvdWxkIG5vdCBvcGVuIHRoZSBmaWxlICRwcm9wIGZvciByZWFkaW5nOiAkISBcbiI7CisgICAgJGlzb0ZIID0gSU86OkZpbGUtPm5ldygkaXNvLCJyIikKKyAgICAgICAgICAgIG9yIGRpZSAgImNvdWxkIG5vdCBvcGVuIHRoZSBmaWxlICRpc28gZm9yIHJlYWRpbmc6ICQhIFxuIjsKKyAgICAkb3V0RkggPSBJTzo6RmlsZS0+bmV3KCRvdXRmaWxlLCJ3IikKKyAgICAgICAgICAgIG9yIGRpZSAgImNvdWxkIG5vdCBvcGVuIHRoZSBmaWxlICRvdXRmaWxlIGZvciByZWFkaW5nOiAkISBcbiI7CisgICAgbXkgQHByb3BMaW5lczsKKyAgICB3aGlsZSAoPCRwcm9wRkg+KSB7CisgICAgICAgIG5leHQgaWYoISgkXyA9fi9zYyA7IC8pKTsKKyAgICAgICAgcHVzaChAcHJvcExpbmVzLCAkXyk7CisgICAgfQorICAgIHByaW50SGVhZGVyKCRvdXRGSCk7CisgICAgaWYoZGVmaW5lZCAkY29kZSl7CisgICAgICAgIHByaW50ICJQbGVhc2UgYWRkIHRoZSBmb2xsb3dpbmcgdG8gVVNjcmlwdENvZGUgZW51bSBpbiB1c2NyaXB0LmguXG4iOworICAgICAgICBwcmludCAiI2lmbmRlZiBVX0hJREVfRFJBRlRfQVBJXG4iOworICAgIH0KKyAgICB3aGlsZSAoPCRpc29GSD4pIHsKKyAgICAgICAgbmV4dCBpZigkXz1+L14jLyk7I3NraXAgaWYgdGhlIGxpbmUgc3RhcnRzIHdpdGggYSBjb21tZW50IGNoYXIKKyAgICAgICAgKCRzY3JpcHQsICR0LCAkbmFtZSwgJHJlc3QpID0gc3BsaXQoLzsvLCRfLDQpOworICAgICAgICAjc2MgOyBBcmFiCisgICAgICAgICRvdXRzdHIgPSAic2MgOyAkc2NyaXB0IjsKKyAgICAgICAgJGVuY29kZWQgPSAwOyAjZmFsc2UKKyAgICAgICAgCisgICAgICAgICMgc2VhY2ggdGhlIHByb3BMaW5lcyB0byBtYWtlIHN1cmUgdGhhdCB0aGlzIHNjaXB0IGNvZGUgaXMgbm90IAorICAgICAgICAjIGVuY29kZWQgaW4gVW5pY29kZQorICAgICAgICBmb3JlYWNoICRrZXkgKEBwcm9wTGluZXMpeworICAgICAgICAgICAgaWYoJGtleSA9fiAvJG91dHN0ci8peworICAgICAgICAgICAgICAgICRlbmNvZGVkID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBuZXh0IGlmKCRlbmNvZGVkID09IDEpOworICAgICAgICAjaWdub3JlIHByaXZhdGUgdXNlIGNvZGVzIAorICAgICAgICBuZXh0IGlmKCRzY3JpcHQgPX4gL1FhW2FiXVthLXpdLyk7CisgICAgICAgIAorICAgICAgICAjaWYoJHNjcmlwdCBlcSAiUWFhYSIpeworICAgICAgICAjICAgICRvdXRzdHIgPSAkb3V0c3RyLiIgOyBQcml2YXRlX1VzZV9TdGFydFxuIjsKKyAgICAgICAgI31lbHNpZigkc2NyaXB0IGVxICAiUWFieCIpeworICAgICAgICAjICAgICRvdXRzdHIgPSAkb3V0c3RyLiIgOyBQcml2YXRlX1VzZV9FbmRcbiI7CisgICAgICAgICN9ZWxzZXsKKyAgICAgICAgIyAgICAkb3V0c3RyID0gJG91dHN0ci4iIDsgJHNjcmlwdCBcbiI7CisgICAgICAgICN9IAorICAgICAgICAKKyAgICAgICAgJG91dHN0ciA9ICRvdXRzdHIuIiA7ICRzY3JpcHQgXG4iOworICAgICAgICBwcmludCAkb3V0RkggJG91dHN0cjsKKyAgICAgICAgCisgICAgICAgICNwcmludCB0byBjb25zb2xlCisgICAgICAgIGlmKGRlZmluZWQgJGNvZGUpeworICAgICAgICAgICAgaWYoJG5hbWUgPX4gL1soXHMsXHg4MC1ceEZGXS8peworICAgICAgICAgICAgICAgICRuYW1lID0gJHNjcmlwdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICRuYW1lID1+cy8tL18vZzsKKyAgICAgICAgCisgICAgICAgICAgICAkc2NyaXB0Y29kZSA9ICAiVVNDUklQVF8iLnVjKCRuYW1lKTsKKyAgICAgICAgICAgIHByaW50ICIgICAgICAkc2NyaXB0Y29kZSAgICAgICAgICA9ICRjb2RlLCAvKiAkc2NyaXB0ICovXG4iOworICAgICAgICAgICAgJGNvZGUrKzsKKyAgICAgICAgfQorICAgICAgICAKKyAgICB9CisgICAgaWYoZGVmaW5lZCAkY29kZSl7CisgICAgICAgIHByaW50ICIjZW5kaWYgLyogVV9ISURFX0RSQUZUX0FQSSAqL1xuIjsKKyAgICB9CisgICAgZm9yKCRpPTA7ICRpPDI7ICRpKyspeworICAgICAgICAKKyAgICB9CisgICAgY2xvc2UoJGlzb0ZIKTsKKyAgICBjbG9zZSgkcHJvcEZIKTsKKyAgICBjbG9zZSgkb3V0RkgpOworfQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWIgcHJpbnRIZWFkZXJ7CisgICAgKCRvdXRGSCkgPSBAXzsKKyAgICAoJERBWSwgJE1PTlRILCAkWUVBUikgPSAobG9jYWx0aW1lKVszLDQsNV07CisgICAgJFlFQVIgKz0gMTkwMDsKKyAgICAjV2Ugd2lsbCBwcmludCBvdXIgY29weXJpZ2h0IGhlcmUgKyB3YXJuaW5ncworcHJpbnQgJG91dEZIIDw8RU5EX0hFQURFUl9DT01NRU5UOworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvcHlyaWdodCAoYykgMjAwNi0kWUVBUiwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcworIyBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAgIGZpbGUgbmFtZTogICAgICBTeW50aGV0aWNQcm9wZXJ0eVZhbHVlQWxpYXNlcy50eHQKKyMgICBlbmNvZGluZzogICAgICAgVVMtQVNDSUkKKyMgICB0YWIgc2l6ZTogICAgICAgOCAobm90IHVzZWQpCisjICAgaW5kZW50YXRpb246ICAgIDQKKyMgICBjcmVhdGVkIGJ5OiAgICAgZ2Vuc3ZwYS5wbAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgVGhpcyBmaWxlIGZvbGxvd3MgdGhlIGZvcm1hdCBvZiBQcm9wZXJ0eVZhbHVlQWxpYXNlcy50eHQKKyMgSXQgY29udGFpbnMgc3ludGhldGljIHByb3BlcnR5IHZhbHVlIGFsaWFzZXMgbm90IHByZXNlbnQKKyMgaW4gdGhlIFVDRC4gIFVubGlrZSBQcm9wZXJ0eVZhbHVlQWxpYXNlcy50eHQsIGl0IHNob3VsZAorIyBOT1QgY29udGFpbiBhIHZlcnNpb24gbnVtYmVyLgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgIFRISVMgRklMRSBJUyBNQUNISU5FLUdFTkVSQVRFRCwgRE9OJ1QgUExBWSBXSVRIIElUIElGIFlPVSBET04nVCBLTk9XCisjICBXSEFUIFlPVSBBUkUgRE9JTkcsIE9USEVSV0lTRSBWRVJZIEJBRCBUSElOR1MgV0lMTCBIQVBQRU4hCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBzZXQgdGhlIHNhbWUgbmFtZXMgYXMgc2hvcnQgYW5kIGxvbmcgbmFtZXMgdG8gZml0IHRoZSBzeW50YXggd2l0aG91dCAKKyMgaW52ZW50aW5nIG5hbWVzIHRoYXQgd2Ugd291bGQgaGF2ZSB0byBzdXBwb3J0IGZvcmV2ZXIKKworIyBTY3JpcHQgKHNjKQorCitFTkRfSEVBREVSX0NPTU1FTlQKK30KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3ViIHVzYWdlIHsKKyAgICBwcmludCA8PCAiRU5EIjsKK1VzYWdlOgorZ2Vuc3ZwYS5wbAorT3B0aW9uczoKKyAgICAgICAgLS1kZXN0ZGlyPTxkaXJlY3Rvcnk+CisgICAgICAgIC0taXNvMTU5MjQ9PGZpbGUgbmFtZT4KKyAgICAgICAgLS1wcm9wPTxQcm9wZXJ0eVZhbHVlQWxpYXNlcy50eHQ+CisgICAgICAgIC0tY29kZS1zdGFydD1zCitlLmcuOiBnZW5zdnBhLnBsICAtLWRlc3RkaXI9PGljdT4vc291cmNlL3Rvb2xzL2dlbnBuYW1lIC0taXNvMTU5MjQ9aXNvMTU5MjQtdXRmOC0yMDA0MTAyNS50eHQgLS1wcm9wPTxpY3U+L3NvdXJjZS9kYXRhL3VuaWRhdGEgLS1jb2RlLXN0YXJ0PTYwCitFTkQKKyAgICBleGl0KDApOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VuaWNvZGUvYy9nZW5wbmFtZS9wcmVwYXJzZS5wbCBiL3VuaWNvZGUvYy9nZW5wbmFtZS9wcmVwYXJzZS5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45MGU1N2MyCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZS9jL2dlbnBuYW1lL3ByZXBhcnNlLnBsCkBAIC0wLDAgKzEsMTMyMyBAQAorIyEvYmluL3BlcmwgLXcKKyMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjIENPUFlSSUdIVDoKKyMgQ29weXJpZ2h0IChjKSAyMDAyLTIwMTAsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kCisjIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyMgVGhpcyBzY3JpcHQgcmVhZHMgaW4gVUNEIGZpbGVzIFByb3BlcnR5QWxpYXNlcy50eHQgYW5kCisjIFByb3BlcnR5VmFsdWVBbGlhc2VzLnR4dCBhbmQgY29ycmVsYXRlcyB0aGVtIHdpdGggSUNVIGVudW1zCisjIGRlZmluZWQgaW4gdWNoYXIuaCBhbmQgdXNjcmlwdC5oLiAgSXQgdGhlbiBvdXRwdXRzIGEgaGVhZGVyCisjIGZpbGUgd2hpY2ggY29udGFpbnMgYWxsIG5hbWVzIGFuZCBlbnVtcy4gIFRoZSBoZWFkZXIgaXMgaW5jbHVkZWQKKyMgYnkgdGhlIGdlbnBuYW1lIHRvb2wgQysrIHNvdXJjZSBmaWxlLCB3aGljaCBwcm9kdWNlcyB0aGUgYWN0dWFsCisjIGJpbmFyeSBkYXRhIGZpbGUuCisjCisjIFNlZSB1c2FnZSBub3RlIGJlbG93LgorIworIyBOT1RFOiBBcyBvZiBJQ1UgMi42LCB0aGlzIHNjcmlwdCBoYXMgYmVlbiBtb2RpZmllZCB0byBrbm93IGFib3V0IHRoZQorIyBwc2V1ZG8tcHJvcGVydHkgZ2NtL0dlbmVyYWxfQ2F0ZWdvcnlfTWFzaywgd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlCisjIHVjaGFyLmggcHJvcGVydHkgVUNIQVJfR0VORVJBTF9DQVRFR09SWV9NQVNLLiAgVGhpcyBwcm9wZXJ0eQorIyBjb3JyZXNwb25kcyB0byBHZW5lcmFsX0NhdGVnb3J5IGJ1dCBpcyBhIGJpdG1hc2sgdmFsdWUuICBJdCBkb2VzIG5vdAorIyBleGlzdCBpbiB0aGUgVUNELiAgVGhlcmVmb3JlLCBJIHNwZWNpYWwgY2FzZSBpdCBpbiBzZXZlcmFsIHBsYWNlcworIyAoc2VhcmNoIGZvciBHZW5lcmFsX0NhdGVnb3J5X01hc2sgYW5kIGdjbSkuCisjCisjIE5PVEU6IEFzIG9mIElDVSAyLjYsIHRoaXMgc2NyaXB0IHJlYWRzIGFuIGF1eGlsaWFyeSBkYXRhIGZpbGUsCisjIFN5bnRoZXRpY1Byb3BlcnR5QWxpYXNlcy50eHQsIGNvbnRhaW5pbmcgcHJvcGVydHkgYWxpYXNlcyBub3QKKyMgcHJlc2VudCBpbiB0aGUgVUNEIGJ1dCBwcmVzZW50IGluIElDVS4gIFRoaXMgZmlsZSByZXNpZGVzIGluIHRoZQorIyBzYW1lIGRpcmVjdG9yeSBhcyB0aGlzIHNjcmlwdC4gIEl0cyBjb250ZW50cyBhcmUgbWVyZ2VkIGludG8gdGhvc2UKKyMgb2YgUHJvcGVydHlBbGlhc2VzLnR4dCBhcyBpZiB0aGUgdHdvIGZpbGVzIHdlcmUgYXBwZW5kZWQuCisjCisjIE5PVEU6IFRoZSBmb2xsb3dpbmcgbmFtZXMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5LiAgU2VlIHNjcmlwdCBiZWxvdworIyBmb3IgZGV0YWlscy4KKyMKKyMgICBUL1RydWUKKyMgICBGL0ZhbHNlCisjICAgTm9fQmxvY2sKKyMKKyMgQXV0aG9yOiBBbGFuIExpdQorIyBDcmVhdGVkOiBPY3RvYmVyIDE0IDIwMDIKKyMgU2luY2U6IElDVSAyLjQKKwordXNlIEZpbGVIYW5kbGU7Cit1c2Ugc3RyaWN0OwordXNlIER1bXB2YWx1ZTsKKworbXkgJERFQlVHID0gMTsKK215ICREVU1QRVIgPSBuZXcgRHVtcHZhbHVlOworCitteSAkY291bnQgPSBAQVJHVjsKK215ICRJQ1VfRElSID0gc2hpZnQoKSB8fCAnJzsKK215ICRPVVRfRklMRSA9IHNoaWZ0KCkgfHwgJ2RhdGEuaCc7CitteSAkSEVBREVSX0RJUiA9ICIkSUNVX0RJUi9zb3VyY2UvY29tbW9uL3VuaWNvZGUiOworbXkgJFVOSURBVEFfRElSID0gIiRJQ1VfRElSL3NvdXJjZS9kYXRhL3VuaWRhdGEiOworCisjIEdldCB0aGUgY3VycmVudCB5ZWFyIGZyb20gdGhlIHN5c3RlbQorbXkgJFlFQVIgPSAxOTAwK0B7W2xvY2FsdGltZV19WzVdOyAjIEdldCB0aGUgY3VycmVudCB5ZWFyCisKKyMgVXNlZCB0byBtYWtlICJuL2EiIHByb3BlcnR5IFt2YWx1ZV0gYWxpYXNlcyAoVW5pY29kZSBvciBTeW50aGV0aWMpIHVuaXF1ZQorbXkgJHByb3BOQSA9IDA7CitteSAkdmFsdWVOQSA9IDA7CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRvcCBsZXZlbCBwcm9wZXJ0eSBrZXlzIGZvciBiaW5hcnksIGVudW1lcmF0ZWQsIHN0cmluZywgZG91YmxlLCBhbmQgb3RoZXIgcHJvcHMKK215IEBUT1AgICAgID0gcXcoIF9icCBfZXAgX3NwIF9kcCBfb3AgKTsKKworIyBUb3AgbGV2ZWwgcHJvcGVydGllcyBhcmUgZ3JvdXBlZCBpbnRvIG91dHB1dCBhcnJheXMuCitteSAlVE9QX1BST1BTID0gKCAiIiAgID0+IFsgJ19icCcsICdfZXAnLCAnX3NwJywgJ19kcCcsICdfb3AnIF0gKTsKKworbXkgJVBST1BfVFlQRSA9IChCaW5hcnkgPT4gIl9icCIsCisgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAiX3NwIiwKKyAgICAgICAgICAgICAgICAgRG91YmxlID0+ICJfZHAiLAorICAgICAgICAgICAgICAgICBFbnVtZXJhdGVkID0+ICJfZXAiLAorICAgICAgICAgICAgICAgICBPdGhlciA9PiAiX29wIik7CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFByb3BlcnRpZXMgdGhhdCBhcmUgdW5zdXBwb3J0ZWQgaW4gSUNVCitteSAlVU5TVVBQT1JURUQgPSAoQ29tcG9zaXRpb25fRXhjbHVzaW9uID0+IDEsCisgICAgICAgICAgICAgICAgICAgRGVjb21wb3NpdGlvbl9NYXBwaW5nID0+IDEsCisgICAgICAgICAgICAgICAgICAgRXhwYW5kc19Pbl9ORkMgPT4gMSwKKyAgICAgICAgICAgICAgICAgICBFeHBhbmRzX09uX05GRCA9PiAxLAorICAgICAgICAgICAgICAgICAgIEV4cGFuZHNfT25fTkZLQyA9PiAxLAorICAgICAgICAgICAgICAgICAgIEV4cGFuZHNfT25fTkZLRCA9PiAxLAorICAgICAgICAgICAgICAgICAgIEZDX05GS0NfQ2xvc3VyZSA9PiAxLAorICAgICAgICAgICAgICAgICAgIElEX1N0YXJ0X0V4Y2VwdGlvbnMgPT4gMSwKKyAgICAgICAgICAgICAgICAgICBTcGVjaWFsX0Nhc2VfQ29uZGl0aW9uID0+IDEsCisgICAgICAgICAgICAgICAgICAgKTsKKworIyBTaG9ydCBuYW1lcyBvZiBwcm9wZXJ0aWVzIHRoYXQgd2VyZW4ndCBzZWVuIGluIHVjaGFyLmguICBJZiB0aGUKKyMgcHJvcGVydGllcyB3ZXJlbid0IHNlZW4sIGRvbid0IGNvbXBsYWluIGFib3V0IHRoZSBwcm9wZXJ0eSB2YWx1ZXMKKyMgbWlzc2luZy4KK215ICVNSVNTSU5HX0ZST01fVUNIQVI7CisKKyMgQWRkaXRpb25hbCBwcm9wZXJ0eSBhbGlhc2VzIGJleW9uZCBzaG9ydCBhbmQgbG9uZyBuYW1lcywKKyMgbGlrZSBzcGFjZSBpbiBhZGRpdGlvbiB0byBXU3BhY2UgYW5kIFdoaXRlX1NwYWNlIGluIFVuaWNvZGUgNC4xLgorIyBIYXNodGFibGUsIG1hcHMgbG9uZyBuYW1lIHRvIGFsaWFzLgorIyBGb3IgZXhhbXBsZSwgbWFwcyBXaGl0ZV9TcGFjZS0+c3BhY2UuCisjCisjIElmIG11bHRpcGxlIGFkZGl0aW9uYWwgYWxpYXNlcyBhcmUgZGVmaW5lZCwKKyMgdGhlbiB0aGV5IGFyZSBzZXBhcmF0ZWQgaW4gdGhlIHZhbHVlIHN0cmluZyB3aXRoICd8Jy4KKyMgRm9yIGV4YW1wbGUsIFdoaXRlX1NwYWNlLT5zcGFjZXxvdXRlcl9zcGFjZQorbXkgJWFkZGl0aW9uYWxfcHJvcGVydHlfYWxpYXNlczsKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBFbWl0dGVkIGNsYXNzIG5hbWVzCitteSAoJFNUUklOR19DTEFTUywgJEFMSUFTX0NMQVNTLCAkUFJPUEVSVFlfQ0xBU1MpID0gcXcoQWxpYXNOYW1lIEFsaWFzIFByb3BlcnR5KTsKKworaWYgKCRjb3VudCA8IDEgfHwgJGNvdW50ID4gMiB8fAorICAgICEtZCAkSEVBREVSX0RJUiB8fAorICAgICEtZCAkVU5JREFUQV9ESVIpIHsKKyAgICBteSAkbWUgPSAkMDsKKyAgICAkbWUgPX4gc3wuK1svXFxdfHw7CisgICAgbXkgJGxtID0gJyAnIHggbGVuZ3RoKCRtZSk7CisgICAgcHJpbnQgPDwiRU5EIjsKKworJG1lOiBSZWFkcyBJQ1U0QyBoZWFkZXJzIGFuZCBVbmljb2RlIGRhdGEgZmlsZXMgYW5kIGNyZWF0ZXMKKyRsbSAgYSBDIGhlYWRlciBmaWxlIHRoYXQgaXMgaW5jbHVkZWQgYnkgZ2VucG5hbWUuICBUaGUgaGVhZGVyCiskbG0gIGZpbGUgbWF0Y2hlcyBjb25zdGFudHMgZGVmaW5lZCBpbiB0aGUgSUNVNEMgaGVhZGVycyB3aXRoCiskbG0gIHByb3BlcnR5fHZhbHVlIGFsaWFzZXMgaW4gdGhlIFVuaWNvZGUgZGF0YSBmaWxlcy4KKworVXNhZ2U6ICRtZSA8aWN1X2Rpcj4gWzxvdXRfZmlsZT5dCisKKzxpY3VfZGlyPiAgIElDVTRDIHJvb3QgZGlyZWN0b3J5LCBjb250YWluaW5nCisgICAgICAgICAgICAgICBzb3VyY2UvY29tbW9uL3VuaWNvZGUvdWNoYXIuaAorICAgICAgICAgICAgICAgc291cmNlL2NvbW1vbi91bmljb2RlL3VzY3JpcHQuaAorICAgICAgICAgICAgICAgc291cmNlL2RhdGEvdW5pZGF0YS9CbG9ja3MudHh0CisgICAgICAgICAgICAgICBzb3VyY2UvZGF0YS91bmlkYXRhL1Byb3BlcnR5QWxpYXNlcy50eHQKKyAgICAgICAgICAgICAgIHNvdXJjZS9kYXRhL3VuaWRhdGEvUHJvcGVydHlWYWx1ZUFsaWFzZXMudHh0Cis8b3V0X2ZpbGU+ICBGaWxlIG5hbWUgb2YgaGVhZGVyIHRvIGJlIHdyaXR0ZW47CisgICAgICAgICAgICBkZWZhdWx0IGlzICdkYXRhLmgnLgorCitUaGUgVW5pY29kZSB2ZXJzaW9ucyBvZiBhbGwgaW5wdXQgZmlsZXMgbXVzdCBtYXRjaC4KK0VORAorICAgIGV4aXQoMSk7Cit9CisKK215ICgkaCwgJHZlcnNpb24pID0gcmVhZEFuZE1lcmdlKCRIRUFERVJfRElSLCAkVU5JREFUQV9ESVIpOworCitpZiAoJERFQlVHKSB7CisgICAgcHJpbnQgIk1lcmdlZCBoYXNoOlxuIjsKKyAgICBmb3IgbXkgJGtleSAoc29ydCBrZXlzICUkaCkgeworICAgICAgICBteSAkaGggPSAkaC0+eyRrZXl9OworICAgICAgICBmb3IgbXkgJHN1YmtleSAoc29ydCBrZXlzICUkaGgpIHsKKyAgICAgICAgICAgIHByaW50ICIka2V5OiRzdWJrZXk6IiwgJGhoLT57JHN1YmtleX0sICJcbiI7CisgICAgICAgIH0KKyAgICB9Cit9CisKK215ICRvdXQgPSBuZXcgRmlsZUhhbmRsZSgkT1VUX0ZJTEUsICd3Jyk7CitkaWUgIkVycm9yOiBDYW4ndCB3cml0ZSB0byAkT1VUX0ZJTEU6ICQhIiB1bmxlc3MgKGRlZmluZWQgJG91dCk7CitteSAkc2F2ZSA9IHNlbGVjdCgkb3V0KTsKK2Zvcm1hdERhdGEoJGgsICR2ZXJzaW9uKTsKK3NlbGVjdCgkc2F2ZSk7Ciskb3V0LT5jbG9zZSgpOworCitleGl0KDApOworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGcm9tIFByb3BMaXN0Lmh0bWw6ICJUaGUgcHJvcGVydGllcyBvZiB0aGUgZm9ybSBPdGhlcl9YWFgKKyMgYXJlIHVzZWQgdG8gZ2VuZXJhdGUgcHJvcGVydGllcyBpbiBEZXJpdmVkQ29yZVByb3BlcnRpZXMudHh0LgorIyBUaGV5IGFyZSBub3QgaW50ZW5kZWQgZm9yIGdlbmVyYWwgdXNlLCBzdWNoIGFzIGluIEFQSXMgdGhhdAorIyByZXR1cm4gcHJvcGVydHkgdmFsdWVzLgorIyBOb25fQnJlYWsgaXMgbm90IGEgdmFsaWQgcHJvcGVydHkgYXMgb2YgMy4yLgorc3ViIGlzSWdub3JlZFByb3BlcnR5IHsKKyAgICBsb2NhbCAkXyA9IHNoaWZ0OworICAgIC9eT3RoZXJfL2kgfHwgL15Ob25fQnJlYWskL2k7Cit9CisKKyMgJ3FjJyBpcyBhIHBzZXVkby1wcm9wZXJ0eSBtYXRjaGluZyBhbnkgcXVpY2stY2hlY2sgcHJvcGVydHkKKyMgc2VlIFByb3BlcnR5VmFsdWVBbGlhc2VzLnR4dCBmaWxlIGNvbW1lbnRzLiAgJ2JpbnByb3AnIGlzCisjIGEgc3ludGhldGljIGJpbmFyeSB2YWx1ZSBhbGlhcyAiVHJ1ZSIvIkZhbHNlIiwgbm90IHByZXNlbnQKKyMgaW4gUHJvcGVydHlWYWx1ZUFsaWFzZXMudHh0IHVudGlsIFVuaWNvZGUgNS4wLgorIyBTdGFydGluZyB3aXRoIFVuaWNvZGUgNS4xLCBQcm9wZXJ0eVZhbHVlQWxpYXNlcy50eHQgZG9lcyBoYXZlCisjIGV4cGxpY2l0IHZhbHVlcyBmb3IgYmluYXJ5IHByb3BlcnRpZXMuCitzdWIgaXNQc2V1ZG9Qcm9wZXJ0eSB7CisgICAgJF9bMF0gZXEgJ3FjJyB8fAorICAgICAgICAkX1swXSBlcSAnYmlucHJvcCc7Cit9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEVtaXQgdGhlIGNvbWJpbmVkIGRhdGEgZnJvbSBoZWFkZXJzIGFuZCB0aGUgVW5pY29kZSBkYXRhYmFzZSBhcyBhCisjIEMgc291cmNlIGNvZGUgaGVhZGVyIGZpbGUuCisjCisjIEBwYXJhbSByZWYgdG8gaGFzaCB3aXRoIHRoZSBkYXRhCisjIEBwYXJhbSBVbmljb2RlIHZlcnNpb24sIGFzIGEgc3RyaW5nCitzdWIgZm9ybWF0RGF0YSB7CisgICAgbXkgJGggPSBzaGlmdDsKKyAgICBteSAkdmVyc2lvbiA9IHNoaWZ0OworCisgICAgbXkgJGRhdGUgPSBzY2FsYXIgbG9jYWx0aW1lKCk7CisgICAgcHJpbnQgPDwiRU5EIjsKKy8qKgorICogQ29weXJpZ2h0IChDKSAyMDAyLSRZRUFSLCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZAorICogb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIE1BQ0hJTkUgR0VORVJBVEVEIEZJTEUuICAhISEgRG8gbm90IGVkaXQgbWFudWFsbHkgISEhCisgKgorICogR2VuZXJhdGVkIGZyb20KKyAqICAgdWNoYXIuaAorICogICB1c2NyaXB0LmgKKyAqICAgQmxvY2tzLnR4dAorICogICBQcm9wZXJ0eUFsaWFzZXMudHh0CisgKiAgIFByb3BlcnR5VmFsdWVBbGlhc2VzLnR4dAorICoKKyAqIERhdGU6ICRkYXRlCisgKiBVbmljb2RlIHZlcnNpb246ICR2ZXJzaW9uCisgKiBTY3JpcHQ6ICQwCisgKi8KKworRU5ECisKKyAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBFbWl0IFVuaWNvZGUgdmVyc2lvbgorICAgIHByaW50ICIvKiBVbmljb2RlIHZlcnNpb24gJHZlcnNpb24gKi9cbiI7CisgICAgbXkgQHYgPSBzcGxpdCgvXC4vLCAkdmVyc2lvbik7CisgICAgcHVzaCBAdiwgJzAnIHdoaWxlIChAdiA8IDQpOworICAgIGZvciAobXkgJGk9MDsgJGk8QHY7ICsrJGkpIHsKKyAgICAgICAgcHJpbnQgImNvbnN0IHVpbnQ4X3QgVkVSU0lPTl8kaSA9ICR2WyRpXTtcbiI7CisgICAgfQorICAgIHByaW50ICJcbiI7CisKKyAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBFbWl0IFN0cmluZyB0YWJsZQorICAgICMgW0EgdGFibGUgb2YgYWxsIGlkZW50aWZpZXJzLCB0aGF0IGlzLCBhbGwgbG9uZyBvciBzaG9ydCBwcm9wZXJ0eQorICAgICMgb3IgdmFsdWUgbmFtZXMuICBUaGUgbGlzdCBuZWVkIE5PVCBiZSBzb3J0ZWQ7IGl0IHdpbGwgYmUgc29ydGVkCisgICAgIyBieSB0aGUgQyBwcm9ncmFtLiAgU3RyaW5ncyBhcmUgcmVmZXJlbmNlZCBieSB0aGVpciBpbmRleCBpbnRvCisgICAgIyB0aGlzIHRhYmxlLiAgQWZ0ZXIgc29ydGluZywgYSBSRU1BUFtdIGFycmF5IGlzIHVzZWQgdG8gbWFwIHRoZQorICAgICMgb2xkIHBvc2l0aW9uIGluZGljZXMgdG8gdGhlIG5ldyBwb3NpdGlvbnMuXQorICAgIG15ICVzdHJpbmdzOworICAgIGZvciBteSAkcHJvcCAoc29ydCBrZXlzICUkaCkgeworICAgICAgICBteSAkaGggPSAkaC0+eyRwcm9wfTsKKyAgICAgICAgZm9yIG15ICRlbnVtIChzb3J0IGtleXMgJSRoaCkgeworICAgICAgICAgICAgbXkgQGEgPSBzcGxpdCgvXHwvLCAkaGgtPnskZW51bX0pOworICAgICAgICAgICAgZm9yIChAYSkgeworICAgICAgICAgICAgICAgICRzdHJpbmdzeyRffSA9IDEgaWYgKGxlbmd0aCgkXykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIG15IEBzdHJpbmdzID0gc29ydCBrZXlzICVzdHJpbmdzOworICAgIHVuc2hpZnQgQHN0cmluZ3MsICIiOworCisgICAgcHJpbnQgImNvbnN0IGludDMyX3QgU1RSSU5HX0NPVU5UID0gIiwgc2NhbGFyIEBzdHJpbmdzLCAiO1xuXG4iOyAKKworICAgICMgd2hpbGUgcHJpbnRpbmcsIGNyZWF0ZSBhIG1hcHBpbmcgaGFzaCBmcm9tIHN0cmluZyB0YWJsZSBlbnRyeSB0byBpbmRleAorICAgIG15ICVzdHJpbmdUb0lEOworICAgIHByaW50ICIvKiB0byBiZSBzb3J0ZWQgKi9cbiI7CisgICAgcHJpbnQgImNvbnN0ICRTVFJJTkdfQ0xBU1MgU1RSSU5HX1RBQkxFW10gPSB7XG4iOworICAgIGZvciAobXkgJGk9MDsgJGk8QHN0cmluZ3M7ICsrJGkpIHsKKyAgICAgICAgcHJpbnQgIiAgICAkU1RSSU5HX0NMQVNTKFwiJHN0cmluZ3NbJGldXCIsICRpKSxcbiI7CisgICAgICAgICRzdHJpbmdUb0lEeyRzdHJpbmdzWyRpXX0gPSAkaTsKKyAgICB9CisgICAgcHJpbnQgIn07XG5cbiI7CisKKyAgICAjIHBsYWNlaG9sZGVyIGZvciB0aGUgcmVtYXBwaW5nIGluZGV4LiAgdGhpcyBpcyB1c2VkIHRvIG1hcAorICAgICMgaW5kaWNlcyB0aGF0IHdlIGNvbXB1dGUgaGVyZSB0byBpbmRpY2VzIG9mIHRoZSBzb3J0ZWQKKyAgICAjIFNUUklOR19UQUJMRS4gIFNUUklOR19UQUJMRSB3aWxsIGJlIHNvcnRlZCBieSB0aGUgQysrIHByb2dyYW0KKyAgICAjIHVzaW5nIHRoZSB1cHJ2X2NvbXBhcmVQcm9wZXJ0eU5hbWVzKCkgZnVuY3Rpb24uICB0aGlzIHdpbGwKKyAgICAjIHJlc2h1ZmZsZSB0aGUgb3JkZXIuICB3ZSB0aGVuIHVzZSB0aGUgaW5kaWNlcyAocGFzc2VkIHRvIHRoZQorICAgICMgU3RyaW5nIGNvbnN0cnVjdG9yKSB0byBjcmVhdGUgYSBSRU1BUFtdIGFycmF5LgorICAgIHByaW50ICIvKiB0byBiZSBmaWxsZWQgaW4gKi9cbiI7CisgICAgcHJpbnQgImludDMyX3QgUkVNQVBbIiwgc2NhbGFyIEBzdHJpbmdzLCAiXTtcblxuIjsKKyAgICAKKyAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBFbWl0IHRoZSBuYW1lIGdyb3VwIHRhYmxlCisgICAgIyBbQSB0YWJsZSBvZiBuYW1lIGdyb3Vwcy4gIEEgbmFtZSBncm91cCBpcyBvbmUgb3IgbW9yZSBuYW1lcworICAgICMgZm9yIGEgcHJvcGVydHkgb3IgcHJvcGVydHkgdmFsdWUuICBUaGUgVW5pY29kZSBkYXRhIGZpbGVzIHNwZWNpZnkKKyAgICAjIHRoYXQgdGhlcmUgbWF5IGJlIG1vcmUgdGhhbiAyLCBhbHRob3VnaCBhcyBvZiBVbmljb2RlIDMuMiB0aGVyZQorICAgICMgYXJlIGF0IG1vc3QgMi4gIFRoZSBuYW1lIGdyb3VwIHRhYmxlIGxvb2tzIGxpa2UgdGhpczoKKyAgICAjCisgICAgIyAgMTE0LCAtMTE1LCAxMTYsIC0xMTcsIDAsIC0xMTgsIDY1LCAtNjQsIC4uLgorICAgICMgIFswXSAgICAgICAgWzJdICAgICAgICBbNF0gICAgICBbNl0KKyAgICAjCisgICAgIyBUaGUgZW50cnkgYXQgWzBdIGNvbnNpc3RzIG9mIDIgc3RyaW5ncywgMTE0IGFuZCAxMTUuCisgICAgIyBUaGUgZW50cnkgYXQgWzJdIGNvbnNpc3RzIG9mIDExNiBhbmQgMTE3LiAgVGhlIGVudHJ5IGF0CisgICAgIyBbNF0gaXMgb25lIHN0cmluZywgMTE4LiAgVGhlcmUgaXMgYWx3YXlzIGF0IGxlYXN0IG9uZQorICAgICMgc3RyaW5nOyB0eXBpY2FsbHkgdGhlcmUgYXJlIHR3by4gIElmIHRoZXJlIGFyZSB0d28sIHRoZSBmaXJzdAorICAgICMgaXMgdGhlIFNIT1JUIG5hbWUgYW5kIHRoZSBzZWNvbmQgaXMgdGhlIExPTkcuICBJZiB0aGVyZSBpcworICAgICMgb25lLCB0aGVuIHRoZSBtaXNzaW5nIGVudHJ5IChhbHdheXMgdGhlIHNob3J0IG5hbWUsIGluIDMuMikKKyAgICAjIGlzIHplcm8sIHdoaWNoIGlzIGJ5IGRlZmluaXRpb24gdGhlIGluZGV4IG9mICIiLiAgVGhlCisgICAgIyAncHJlZmVycmVkJyBuYW1lIHdpbGwgZ2VuZXJhbGx5IGJlIHRoZSBMT05HIG5hbWUsIGlmIHRoZXJlIGFyZQorICAgICMgbW9yZSB0aGFuIDIgZW50cmllcy4gIFRoZSBsYXN0IGVudHJ5IGlzIG5lZ2F0aXZlLgorCisgICAgIyBCdWlsZCBuYW1lIGdyb3VwIGxpc3QgYW5kIHJlcGxhY2Ugc3RyaW5nIHJlZnMgd2l0aCBuYW1lR3JvdXAgaW5kaWNlcworICAgIG15IEBuYW1lR3JvdXBzOworICAgIAorICAgICMgQ2hlY2sgZm9yIGR1cGxpY2F0ZSBuYW1lIGdyb3VwcywgYW5kIHJldXNlIHRoZW0gaWYgcG9zc2libGUKKyAgICBteSAlZ3JvdXBUb0ludDsgIyBNYXAgZ3JvdXAgc3RyaW5ncyB0byBpbnRzCisgICAgZm9yIG15ICRwcm9wIChzb3J0IGtleXMgJSRoKSB7CisgICAgICAgIG15ICRoaCA9ICRoLT57JHByb3B9OworICAgICAgICBmb3IgbXkgJGVudW0gKHNvcnQga2V5cyAlJGhoKSB7CisgICAgICAgICAgICBteSAkZ3JvdXBTdHJpbmcgPSAkaGgtPnskZW51bX07CisgICAgICAgICAgICBteSAkaTsKKyAgICAgICAgICAgIGlmIChleGlzdHMgJGdyb3VwVG9JbnR7JGdyb3VwU3RyaW5nfSkgeworICAgICAgICAgICAgICAgICRpID0gJGdyb3VwVG9JbnR7JGdyb3VwU3RyaW5nfTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbXkgQG5hbWVzID0gc3BsaXQoL1x8LywgJGdyb3VwU3RyaW5nKTsKKyAgICAgICAgICAgICAgICBkaWUgIkVycm9yOiBXcm9uZyBudW1iZXIgb2YgbmFtZXMgaW4gIiAuICRncm91cFN0cmluZyBpZiAoQG5hbWVzIDwgMSk7CisgICAgICAgICAgICAgICAgJGkgPSBAbmFtZUdyb3VwczsgIyBpbmRleCBvZiBncm91cCB3ZSBhcmUgbWFraW5nIAorICAgICAgICAgICAgICAgICRncm91cFRvSW50eyRncm91cFN0cmluZ30gPSAkaTsgIyBDYWNoZSBmb3IgcmV1c2UKKyAgICAgICAgICAgICAgICBwdXNoIEBuYW1lR3JvdXBzLCBtYXAgeyAkc3RyaW5nVG9JRHskX30gfSBAbmFtZXM7CisgICAgICAgICAgICAgICAgJG5hbWVHcm91cHNbJCNuYW1lR3JvdXBzXSA9IC0kbmFtZUdyb3Vwc1skI25hbWVHcm91cHNdOyAjIG1hcmsgZW5kCisgICAgICAgICAgICB9CisgICAgICAgICAgICAjIG5vdywgcmVwbGFjZSBzdHJpbmcgbGlzdCB3aXRoIHJlZiB0byBuYW1lIGdyb3VwCisgICAgICAgICAgICAkaGgtPnskZW51bX0gPSAkaTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaW50ICJjb25zdCBpbnQzMl90IE5BTUVfR1JPVVBfQ09VTlQgPSAiLAorICAgICAgICAgIHNjYWxhciBAbmFtZUdyb3VwcywgIjtcblxuIjsKKworICAgIHByaW50ICJpbnQzMl90IE5BTUVfR1JPVVBbXSA9IHtcbiI7CisgICAgIyBlbWl0IG9uZSBncm91cCBwZXIgbGluZSwgd2l0aCBhbm5vdGF0aW9ucworICAgIG15ICRtYXhfbmFtZXMgPSAwOworICAgIGZvciAobXkgJGk9MDsgJGk8QG5hbWVHcm91cHM7ICkgeworICAgICAgICBteSBAYTsKKyAgICAgICAgbXkgJGxpbmU7CisgICAgICAgIG15ICRzdGFydCA9ICRpOworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICBteSAkaiA9ICRuYW1lR3JvdXBzWyRpKytdOworICAgICAgICAgICAgJGxpbmUgLj0gIiRqLCAiOworICAgICAgICAgICAgcHVzaCBAYSwgYWJzKCRqKTsKKyAgICAgICAgICAgIGxhc3QgaWYgKCRqIDwgMCk7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnQgIiAgICAiLAorICAgICAgICAgICAgICAkbGluZSwKKyAgICAgICAgICAgICAgJyAneCgyMC1sZW5ndGgoJGxpbmUpKSwKKyAgICAgICAgICAgICAgIi8qICIsIHNwcmludGYoIiUzZCIsICRzdGFydCksCisgICAgICAgICAgICAgICI6IFwiIiwgam9pbigiXCIsIFwiIiwgbWFwIHsgJHN0cmluZ3NbJF9dIH0gQGEpLCAiXCIgKi9cbiI7CisgICAgICAgICRtYXhfbmFtZXMgPSBAYSBpZihAYSA+ICRtYXhfbmFtZXMpOworICAgICAgICAgIAorICAgIH0KKyAgICBwcmludCAifTtcblxuIjsKKyAgICAKKyAgICAjIFRoaXMgaXMgZml4ZWQgZm9yIDMuMiBhdCAiMiIgYnV0IHNob3VsZCBiZSBjYWxjdWxhdGVkIGR5bmFtaWNhbGx5CisgICAgIyB3aGVuIG1vcmUgdGhhbiAyIG5hbWVzIGFwcGVhciBpbiBQcm9wZXJ0eVtWYWx1ZV1BbGlhc2VzLnR4dC4KKyAgICBwcmludCAiI2RlZmluZSBNQVhfTkFNRVNfUEVSX0dST1VQICRtYXhfbmFtZXNcblxuIjsKKworICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIEVtaXQgZW51bWVyYXRlZCBwcm9wZXJ0eSB2YWx1ZXMKKyAgICBmb3IgbXkgJHByb3AgKHNvcnQga2V5cyAlJGgpIHsKKyAgICAgICAgbmV4dCBpZiAoJHByb3AgPX4gL15fLyk7CisgICAgICAgIG15ICR2aCA9ICRoLT57JHByb3B9OworICAgICAgICBteSAkY291bnQgPSBzY2FsYXIga2V5cyAlJHZoOworCisgICAgICAgIHByaW50ICJjb25zdCBpbnQzMl90IFZBTFVFU18ke3Byb3B9X0NPVU5UID0gIiwKKyAgICAgICAgICAgICAgJGNvdW50LCAiO1xuXG4iOworICAgICAgICAKKyAgICAgICAgcHJpbnQgImNvbnN0ICRBTElBU19DTEFTUyBWQUxVRVNfJHtwcm9wfVxbXSA9IHtcbiI7CisgICAgICAgIGZvciBteSAkZW51bSAoc29ydCBrZXlzICUkdmgpIHsKKyAgICAgICAgICAgICNteSBAbmFtZXMgPSBzcGxpdCgvXHwvLCAkdmgtPnskZW51bX0pOworICAgICAgICAgICAgI2RpZSAiRXJyb3I6IFdyb25nIG51bWJlciBvZiBuYW1lcyBmb3IgJHByb3A6JGVudW0gaW4gWyIgLiBqb2luKCIsIiwgQG5hbWVzKSAuICJdIgorICAgICAgICAgICAgIyAgICBpZiAoQG5hbWVzICE9IDIpOworICAgICAgICAgICAgcHJpbnQgIiAgICAkQUxJQVNfQ0xBU1MoKGludDMyX3QpICRlbnVtLCAiLCAkdmgtPnskZW51bX0sICIpLFxuIjsKKyAgICAgICAgICAgICAgICAgICMkc3RyaW5nVG9JRHskbmFtZXNbMF19LCAiLCAiLAorICAgICAgICAgICAgICAgICAgIyRzdHJpbmdUb0lEeyRuYW1lc1sxXX0sICIpLFxuIjsKKyAgICAgICAgICAgICMgICAgICAiXCIiLCAkbmFtZXNbMF0sICJcIiwgIiwKKyAgICAgICAgICAgICMgICAgICAiXCIiLCAkbmFtZXNbMV0sICJcIiksXG4iOworICAgICAgICB9CisgICAgICAgIHByaW50ICJ9O1xuXG4iOworICAgIH0KKworICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIEVtaXQgdG9wLWxldmVsIHByb3BlcnRpZXMgKGJpbmFyeSwgZW51bWVyYXRlZCwgZXRjLikKKyAgICBmb3IgbXkgJHRvcE5hbWUgKHNvcnQga2V5cyAlVE9QX1BST1BTKSB7CisgICAgICAgIG15ICRhID0gJFRPUF9QUk9QU3skdG9wTmFtZX07CisgICAgICAgIG15ICRjb3VudCA9IDA7CisgICAgICAgIGZvciBteSAkdHlwZSAoQCRhKSB7ICMgIl9icCIsICJfZXAiLCBldGMuCisgICAgICAgICAgICAkY291bnQgKz0gc2NhbGFyIGtleXMgJXskaC0+eyR0eXBlfX07CisgICAgICAgIH0KKworICAgICAgICBwcmludCAiY29uc3QgaW50MzJfdCAke3RvcE5hbWV9UFJPUEVSVFlfQ09VTlQgPSAkY291bnQ7XG5cbiI7CisgICAgICAgIAorICAgICAgICBwcmludCAiY29uc3QgJFBST1BFUlRZX0NMQVNTICR7dG9wTmFtZX1QUk9QRVJUWVtdID0ge1xuIjsKKworICAgICAgICBmb3IgbXkgJHR5cGUgKEAkYSkgeyAjICJfYnAiLCAiX2VwIiwgZXRjLgorICAgICAgICAgICAgbXkgJHAgPSAkaC0+eyR0eXBlfTsKKworICAgICAgICAgICAgZm9yIG15ICRlbnVtIChzb3J0IGtleXMgJSRwKSB7CisgICAgICAgICAgICAgICAgbXkgJG5hbWUgPSAkc3RyaW5nc1skbmFtZUdyb3Vwc1skcC0+eyRlbnVtfV1dOworICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgbXkgJHZhbHVlUmVmID0gIjAsIE5VTEwiOworICAgICAgICAgICAgICAgIGlmICgkdHlwZSBlcSAnX2JwJykgeworICAgICAgICAgICAgICAgICAgICAkdmFsdWVSZWYgPSAiVkFMVUVTX2JpbnByb3BfQ09VTlQsIFZBTFVFU19iaW5wcm9wIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzaWYgKGV4aXN0cyAkaC0+eyRuYW1lfSkgeworICAgICAgICAgICAgICAgICAgICAkdmFsdWVSZWYgPSAiVkFMVUVTXyR7bmFtZX1fQ09VTlQsIFZBTFVFU18kbmFtZSI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHByaW50ICIgICAgJFBST1BFUlRZX0NMQVNTKChpbnQzMl90KSAkZW51bSwgIiwKKyAgICAgICAgICAgICAgICAgICAgICAkcC0+eyRlbnVtfSwgIiwgJHZhbHVlUmVmKSxcbiI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHJpbnQgIn07XG5cbiI7CisgICAgfQorCisgICAgcHJpbnQgIi8qZW9mKi9cbiI7Cit9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFJlYWQgaW4gdGhlIGZpbGVzIHVjaGFyLmgsIHVzY3JpcHQuaCwgQmxvY2tzLnR4dCwKKyMgUHJvcGVydHlBbGlhc2VzLnR4dCwgYW5kIFByb3BlcnR5VmFsdWVBbGlhc2VzLnR4dCwKKyMgYW5kIGNvbWJpbmUgdGhlbSBpbnRvIG9uZSBoYXNoLgorIworIyBAcGFyYW0gZGlyZWN0b3J5IGNvbnRhaW5pbmcgaGVhZGVycworIyBAcGFyYW0gZGlyZWN0b3J5IGNvbnRhaW5pbiBVbmljb2RlIGRhdGEgZmlsZXMKKyMKKyMgQHJldHVybiBoYXNoIHJlZiwgVW5pY29kZSB2ZXJzaW9uCitzdWIgcmVhZEFuZE1lcmdlIHsKKworICAgIG15ICgkaGVhZGVyRGlyLCAkdW5pZGF0YURpcikgPSBAXzsKKworICAgIG15ICRoID0gcmVhZF91Y2hhcigiJGhlYWRlckRpci91Y2hhci5oIik7CisgICAgbXkgJHMgPSByZWFkX3VzY3JpcHQoIiRoZWFkZXJEaXIvdXNjcmlwdC5oIik7CisgICAgbXkgJGIgPSByZWFkX0Jsb2NrcygiJHVuaWRhdGFEaXIvQmxvY2tzLnR4dCIpOworICAgIG15ICRwYSA9IHt9OworICAgIHJlYWRfUHJvcGVydHlBbGlhc2VzKCRwYSwgIiR1bmlkYXRhRGlyL1Byb3BlcnR5QWxpYXNlcy50eHQiKTsKKyAgICByZWFkX1Byb3BlcnR5QWxpYXNlcygkcGEsICJTeW50aGV0aWNQcm9wZXJ0eUFsaWFzZXMudHh0Iik7CisgICAgbXkgJHZhID0ge307CisgICAgcmVhZF9Qcm9wZXJ0eVZhbHVlQWxpYXNlcygkdmEsICIkdW5pZGF0YURpci9Qcm9wZXJ0eVZhbHVlQWxpYXNlcy50eHQiKTsKKyAgICByZWFkX1Byb3BlcnR5VmFsdWVBbGlhc2VzKCR2YSwgIlN5bnRoZXRpY1Byb3BlcnR5VmFsdWVBbGlhc2VzLnR4dCIpOworICAgIAorICAgICMgRXh0cmFjdCBwcm9wZXJ0eSBmYW1pbHkgaGFzaAorICAgIG15ICRmYW0gPSAkcGEtPnsnX2ZhbWlseSd9OworICAgIGRlbGV0ZSAkcGEtPnsnX2ZhbWlseSd9OworICAgIAorICAgICMgTm90ZTogdXNjcmlwdC5oIGhhcyBubyB2ZXJzaW9uIHN0cmluZywgc28gZG9uJ3QgY2hlY2sgaXQKKyAgICBteSAkdmVyc2lvbiA9IGNoZWNrX3ZlcnNpb25zKFsgJ3VjaGFyLmgnLCAkaCBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyAnQmxvY2tzLnR4dCcsICRiIF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbICdQcm9wZXJ0eUFsaWFzZXMudHh0JywgJHBhIF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbICdQcm9wZXJ0eVZhbHVlQWxpYXNlcy50eHQnLCAkdmEgXSk7CisgICAgCisgICAgIyBEbyB0aGlzIEJFRk9SRSBtZXJnaW5nOyBtZXJnaW5nIG1vZGlmaWVzIHRoZSBoYXNoZXMKKyAgICBjaGVja19Qcm9wZXJ0eVZhbHVlQWxpYXNlcygkcGEsICR2YSk7CisgICAgCisgICAgIyBEdW1wIG91dCB0aGUgJHZhIGhhc2ggZm9yIGRlYnVnZ2luZworICAgIGlmICgkREVCVUcpIHsKKyAgICAgICAgcHJpbnQgIlByb3BlcnR5IHZhbHVlcyBoYXNoOlxuIjsKKyAgICAgICAgZm9yIG15ICRrZXkgKHNvcnQga2V5cyAlJHZhKSB7CisgICAgICAgICAgICBteSAkaGggPSAkdmEtPnska2V5fTsKKyAgICAgICAgICAgIGZvciBteSAkc3Via2V5IChzb3J0IGtleXMgJSRoaCkgeworICAgICAgICAgICAgICAgIHByaW50ICIka2V5OiRzdWJrZXk6IiwgJGhoLT57JHN1YmtleX0sICJcbiI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgIyBEdW1wIG91dCB0aGUgJHMgaGFzaCBmb3IgZGVidWdnaW5nCisgICAgaWYgKCRERUJVRykgeworICAgICAgICBwcmludCAiU2NyaXB0IGhhc2g6XG4iOworICAgICAgICBmb3IgbXkgJGtleSAoc29ydCBrZXlzICUkcykgeworICAgICAgICAgICAgcHJpbnQgIiRrZXk6IiwgJHMtPnska2V5fSwgIlxuIjsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAjIExpbmsgaW4gdGhlIHNjcmlwdCBkYXRhCisgICAgJGgtPnsnc2MnfSA9ICRzOworICAgIAorICAgIG1lcmdlX0Jsb2NrcygkaCwgJGIpOworICAgIAorICAgIG1lcmdlX1Byb3BlcnR5QWxpYXNlcygkaCwgJHBhLCAkZmFtKTsKKyAgICAKKyAgICBtZXJnZV9Qcm9wZXJ0eVZhbHVlQWxpYXNlcygkaCwgJHZhKTsKKyAgICAKKyAgICAoJGgsICR2ZXJzaW9uKTsKK30KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRW5zdXJlIHRoYXQgdGhlIHZlcnNpb24gc3RyaW5ncyBpbiB0aGUgZ2l2ZW4gaGFzaGVzICh1bmRlciB0aGUga2V5CisjICdfdmVyc2lvbicpIGFyZSBjb21wYXRpYmxlLiAgQ3VycmVudGx5IHRoaXMgbWVhbnMgdGhleSBtdXN0IGJlCisjIGlkZW50aWNhbCwgd2l0aCB0aGUgZXhjZXB0aW9uIHRoYXQgIlguWSIgd2lsbCBtYXRjaCAiWC5ZLjAiLgorIyBBbGwgaGFzaGVzIG11c3QgZGVmaW5lIHRoZSBrZXkgJ192ZXJzaW9uJy4KKyMKKyMgQHBhcmFtIGEgbGlzdCBvZiBwYWlycyBvZiAoZmlsZSBuYW1lLCBoYXNoIHJlZmVyZW5jZSkKKyMKKyMgQHJldHVybiB0aGUgdmVyc2lvbiBvZiBhbGwgdGhlIGhhc2hlcy4gIFVwb24gcmV0dXJuLCB0aGUgJ192ZXJzaW9uJworIyB3aWxsIGJlIHJlbW92ZWQgZnJvbSBhbGwgaGFzaGVzLgorc3ViIGNoZWNrX3ZlcnNpb25zIHsKKyAgICBteSAkdmVyc2lvbiA9ICcnOworICAgIG15ICRtc2cgPSAnJzsKKyAgICBmb3JlYWNoIG15ICRhIChAXykgeworICAgICAgICBteSAkbmFtZSA9ICRhLT5bMF07CisgICAgICAgIG15ICRoICAgID0gJGEtPlsxXTsKKyAgICAgICAgZGllICJFcnJvcjogTm8gdmVyc2lvbiBmb3VuZCIgdW5sZXNzIChleGlzdHMgJGgtPnsnX3ZlcnNpb24nfSk7CisgICAgICAgIG15ICR2ID0gJGgtPnsnX3ZlcnNpb24nfTsKKyAgICAgICAgZGVsZXRlICRoLT57J192ZXJzaW9uJ307CisKKyAgICAgICAgIyBhcHBlbmQgIi4wIiBpZiBuZWNlc3NhcnksIHRvIHN0YW5kYXJkaXplIHRvIFguWS5aCisgICAgICAgICR2IC49ICcuMCcgdW5sZXNzICgkdiA9fiAvXC5cZCtcLi8pOworICAgICAgICAkdiAuPSAnLjAnIHVubGVzcyAoJHYgPX4gL1wuXGQrXC4vKTsKKyAgICAgICAgJG1zZyAuPSAiJG5hbWUgPSAkdlxuIjsKKyAgICAgICAgaWYgKCR2ZXJzaW9uKSB7CisgICAgICAgICAgICBkaWUgIkVycm9yOiBNaXNtYXRjaGVkIFVuaWNvZGUgdmVyc2lvbnNcbiRtc2ciCisgICAgICAgICAgICAgICAgdW5sZXNzICgkdmVyc2lvbiBlcSAkdik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkdmVyc2lvbiA9ICR2OworICAgICAgICB9CisgICAgfQorICAgICR2ZXJzaW9uOworfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBNYWtlIHN1cmUgdGhlIHByb3BlcnR5IG5hbWVzIGluIFByb3BlcnR5VmFsdWVBbGlhc2VzLnR4dCBtYXRjaCB0aG9zZQorIyBpbiBQcm9wZXJ0eUFsaWFzZXMudHh0LgorIworIyBAcGFyYW0gYSBoYXNoIHJlZiBmcm9tIHJlYWRfUHJvcGVydHlBbGlhc2VzLgorIyBAcGFyYW0gYSBoYXNoIHJlZiBmcm9tIHJlYWRfUHJvcGVydHlWYWx1ZUFsaWFzZXMuCitzdWIgY2hlY2tfUHJvcGVydHlWYWx1ZUFsaWFzZXMgeworICAgIG15ICgkcGEsICR2YSkgPSBAXzsKKworICAgICMgbWFrZSBhIHJldmVyc2UgaGFzaCBvZiBzaG9ydC0+bG9uZworICAgIG15ICVyZXY7CisgICAgZm9yIChrZXlzICUkcGEpIHsgJHJldnskcGEtPnskX319ID0gJF87IH0KKyAgICAKKyAgICBmb3IgbXkgJHByb3AgKGtleXMgJSR2YSkgeworICAgICAgICBpZiAoIWV4aXN0cyAkcmV2eyRwcm9wfSAmJiAhaXNQc2V1ZG9Qcm9wZXJ0eSgkcHJvcCkpIHsKKyAgICAgICAgICAgIHByaW50ICJXYXJuaW5nOiBQcm9wZXJ0eSAkcHJvcCBmcm9tIFByb3BlcnR5VmFsdWVBbGlhc2VzIG5vdCBsaXN0ZWQgaW4gUHJvcGVydHlBbGlhc2VzXG4iOworICAgICAgICB9CisgICAgfQorfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBNZXJnZSBibG9ja3MgZGF0YSBpbnRvIHVjaGFyLmggZW51bSBkYXRhLiAgSW4gdGhlICdibGsnIHN1Ymhhc2ggYWxsCisjIGNvZGUgcG9pbnQgdmFsdWVzLCBhcyByZXR1cm5lZCBmcm9tIHJlYWRfdWNoYXIsIGFyZSByZXBsYWNlZCBieQorIyBibG9jayBuYW1lcywgYXMgcmVhZCBmcm9tIEJsb2Nrcy50eHQgYW5kIHJldHVybmVkIGJ5IHJlYWRfQmxvY2tzLgorIyBUaGUgbWF0Y2ggbXVzdCBiZSAxLXRvLTEuICBJZiB0aGVyZSBpcyBhbnkgZmFpbHVyZSBvZiAxLXRvLTEKKyMgbWFwcGluZywgYW4gZXJyb3IgaXMgc2lnbmFsZWQuICBVcG9uIHJldHVybiwgdGhlIHJlYWRfQmxvY2tzIGhhc2gKKyMgaXMgZW1wdGllZCBvZiBhbGwgY29udGVudHMsIGV4Y2VwdCBmb3IgdGhvc2UgdGhhdCBmYWlsZWQgdG8gbWF0Y2guCisjCisjIFRoZSBtYXBwaW5nIGluIHRoZSAnYmxrJyBzdWJoYXNoLCBhZnRlciB0aGlzIGZ1bmN0aW9uIHJldHVybnMsIGlzCisjIGZyb20gdWNoYXIuaCBlbnVtIG5hbWUsIGUuZy4gIlVCTE9DS19CQVNJQ19MQVRJTiIsIHRvIEJsb2Nrcy5oCisjIHBzZXVkby1uYW1lLCBlLmcuICJCYXNpYyBMYXRpbiIuCisjCisjIEBwYXJhbSBhIGhhc2ggcmVmIGZyb20gcmVhZF91Y2hhci4KKyMgQHBhcmFtIGEgaGFzaCByZWYgZnJvbSByZWFkX0Jsb2Nrcy4KK3N1YiBtZXJnZV9CbG9ja3MgeworICAgIG15ICgkaCwgJGIpID0gQF87CisKKyAgICBkaWUgIkVycm9yOiBObyBibG9ja3MgZGF0YSBpbiB1Y2hhci5oIgorICAgICAgICB1bmxlc3MgKGV4aXN0cyAkaC0+eydibGsnfSk7CisgICAgbXkgJGJsayA9ICRoLT57J2Jsayd9OworICAgIGZvciBteSAkZW51bSAoa2V5cyAlJGJsaykgeworICAgICAgICBteSAkY3AgPSAkYmxrLT57JGVudW19OworICAgICAgICBpZiAoJGNwICYmICFleGlzdHMgJGItPnskY3B9KSB7CisgICAgICAgICAgICBkaWUgIkVycm9yOiBObyBibG9jayBmb3VuZCBhdCAkY3AgaW4gQmxvY2tzLnR4dCI7CisgICAgICAgIH0KKyAgICAgICAgIyBDb252ZXJ0IGNvZGUgcG9pbnQgdG8gcHNldWRvLW5hbWU6CisgICAgICAgICRibGstPnskZW51bX0gPSAkYi0+eyRjcH07CisgICAgICAgIGRlbGV0ZSAkYi0+eyRjcH07CisgICAgfQorICAgIG15ICRlcnIgPSAnJzsKKyAgICBmb3IgbXkgJGNwIChrZXlzICUkYikgeworICAgICAgICAkZXJyIC49ICJFcnJvcjogQmxvY2sgIiAuICRiLT57JGNwfSAuICIgbm90IGxpc3RlZCBpbiB1Y2hhci5oXG4iOworICAgIH0KKyAgICBkaWUgJGVyciBpZiAoJGVycik7Cit9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE1lcmdlIHByb3BlcnR5IGFsaWFzIG5hbWVzIGludG8gdGhlIHVjaGFyLmggaGFzaC4gIFRoZSBzdWJoYXNoZXMKKyMgdW5kZXIgdGhlIGtleXMgXyogKGIoaW5hcnksIGUobnVtZXJhdGVkLCBzKHRyaW5nLCBkKG91YmxlKSBhcmUKKyMgZXhhbWluZWQgYW5kIHRoZSB2YWx1ZXMgb2YgdGhvc2Ugc3ViaGFzaGVzIGFyZSBhc3N1bWVkIHRvIGJlIGxvbmcKKyMgbmFtZXMgaW4gUHJvcGVydHlBbGlhc2VzLnR4dC4gIFRoZXkgYXJlIHZhbGlkYXRlZCBhbmQgcmVwbGFjZWQgYnkKKyMgIjxzaG9ydD58PGxvbmc+Ii4gIFVwb24gcmV0dXJuLCB0aGUgcmVhZF9Qcm9wZXJ0eUFsaWFzZXMgaGFzaCBpcworIyBlbXB0aWVkIG9mIGFsbCBjb250ZW50cywgZXhjZXB0IGZvciB0aG9zZSB0aGF0IGZhaWxlZCB0byBtYXRjaC4KKyMgVW5tYXRjaGVkIG5hbWVzIGluIFByb3BlcnR5QWxpYXNlcyBhcmUgbGlzdGVkIGFzIGEgd2FybmluZyBidXQgZG8KKyMgTk9UIGNhdXNlIHRoZSBzY3JpcHQgdG8gZGllLgorIworIyBAcGFyYW0gYSBoYXNoIHJlZiBmcm9tIHJlYWRfdWNoYXIuCisjIEBwYXJhbSBhIGhhc2ggcmVmIGZyb20gcmVhZF9Qcm9wZXJ0eUFsaWFzZXMuCisjIEBwYXJhbSBhIGhhc2ggbWFwcGluZyBsb25nIG5hbWVzIHRvIHByb3BlcnR5IGZhbWlseSAoZS5nLiwgJ2JpbmFyeScpCitzdWIgbWVyZ2VfUHJvcGVydHlBbGlhc2VzIHsKKyAgICBteSAoJGgsICRwYSwgJGZhbSkgPSBAXzsKKworICAgIGZvciBteSAkayAoQFRPUCkgeworICAgICAgICBkaWUgIkVycm9yOiBObyBwcm9wZXJ0aWVzIGRhdGEgZm9yICRrIGluIHVjaGFyLmgiCisgICAgICAgICAgICB1bmxlc3MgKGV4aXN0cyAkaC0+eyRrfSk7CisgICAgfQorCisgICAgZm9yIG15ICRzdWJoIChtYXAgeyAkaC0+eyRffSB9IEBUT1ApIHsKKyAgICAgICAgZm9yIG15ICRlbnVtIChrZXlzICUkc3ViaCkgeworICAgICAgICAgICAgbXkgJGxvbmdfbmFtZSA9ICRzdWJoLT57JGVudW19OworICAgICAgICAgICAgaWYgKCFleGlzdHMgJHBhLT57JGxvbmdfbmFtZX0pIHsKKyAgICAgICAgICAgICAgICBkaWUgIkVycm9yOiBQcm9wZXJ0eSAkbG9uZ19uYW1lIG5vdCBmb3VuZCAob3IgdXNlZCBtb3JlIHRoYW4gb25jZSkiOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBteSAkdmFsdWU7CisgICAgICAgICAgICBpZigkcGEtPnskbG9uZ19uYW1lfSA9fiBtfF5uL2FcZCokfCkgeworICAgICAgICAgICAgICAgICMgcmVwbGFjZSBhbiAibi9hIiBzaG9ydCBuYW1lIHdpdGggYW4gZW1wdHkgbmFtZSAobm90aGluZyBiZWZvcmUgInwiKTsKKyAgICAgICAgICAgICAgICAjIGRvbid0IHJlbW92ZSBpdCAoZG9uJ3QgcmVtb3ZlIHRoZSAifCIpOiB0aGVyZSBtdXN0IGFsd2F5cyBiZSBhIGxvbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAjIGFuZCBpZiB0aGUgc2hvcnQgbmFtZSBpcyByZW1vdmVkLCB0aGVuIHRoZSBsb25nIG5hbWUgYmVjb21lcyB0aGUKKyAgICAgICAgICAgICAgICAjIHNob3J0IG5hbWUgYW5kIHRoZXJlIGlzIG5vIGxvbmcgbmFtZSBsZWZ0ICh1bmxlc3MgdGhlcmUgaXMgYW5vdGhlciBhbGlhcykKKyAgICAgICAgICAgICAgICAkdmFsdWUgPSAifCIgLiAkbG9uZ19uYW1lOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAkdmFsdWUgPSAkcGEtPnskbG9uZ19uYW1lfSAuICJ8IiAuICRsb25nX25hbWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZXhpc3RzICRhZGRpdGlvbmFsX3Byb3BlcnR5X2FsaWFzZXN7JGxvbmdfbmFtZX0pIHsKKyAgICAgICAgICAgICAgICAkdmFsdWUgLj0gInwiIC4gJGFkZGl0aW9uYWxfcHJvcGVydHlfYWxpYXNlc3skbG9uZ19uYW1lfTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICRzdWJoLT57JGVudW19ID0gJHZhbHVlOworICAgICAgICAgICAgZGVsZXRlICRwYS0+eyRsb25nX25hbWV9OworICAgICAgICB9CisgICAgfQorCisgICAgbXkgQGVycjsKKyAgICBmb3IgbXkgJG5hbWUgKGtleXMgJSRwYSkgeworICAgICAgICAkTUlTU0lOR19GUk9NX1VDSEFSeyRwYS0+eyRuYW1lfX0gPSAxOworICAgICAgICBpZiAoZXhpc3RzICRVTlNVUFBPUlRFRHskbmFtZX0pIHsKKyAgICAgICAgICAgIHB1c2ggQGVyciwgIkluZm86IE5vIGVudW0gZm9yICIgLiAkZmFtLT57JG5hbWV9IC4gIiBwcm9wZXJ0eSAkbmFtZSBpbiB1Y2hhci5oIjsKKyAgICAgICAgfSBlbHNpZiAoIWlzSWdub3JlZFByb3BlcnR5KCRuYW1lKSkgeworICAgICAgICAgICAgcHVzaCBAZXJyLCAiV2FybmluZzogTm8gZW51bSBmb3IgIiAuICRmYW0tPnskbmFtZX0gLiAiIHByb3BlcnR5ICRuYW1lIGluIHVjaGFyLmgiOworICAgICAgICB9CisgICAgfQorICAgIHByaW50IGpvaW4oIlxuIiwgc29ydCBAZXJyKSwgIlxuIiBpZiAoQGVycik7Cit9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFJldHVybiAxIGlmIHR3byBuYW1lcyBtYXRjaCBpZ25vcmluZyB3aGl0ZXNwYWNlLCAnLScsIGFuZCAnXycuCisjIFVzZWQgdG8gbWF0Y2ggbmFtZXMgaW4gQmxvY2tzLnR4dCB3aXRoIHRob3NlIGluIFByb3BlcnR5VmFsdWVBbGlhc2VzLnR4dAorIyBhcyBvZiBVbmljb2RlIDQuMC4KK3N1YiBtYXRjaGVzTG9vc2VseSB7CisgICAgbXkgKCRhLCAkYikgPSBAXzsKKyAgICAkYSA9fiBzL1tcc1wtX10vL2c7CisgICAgJGIgPX4gcy9bXHNcLV9dLy9nOworICAgICRhID1+IC9eJGIkL2k7Cit9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE1lcmdlIFByb3BlcnR5VmFsdWVBbGlhc2VzLnR4dCBkYXRhIGludG8gdGhlIHVjaGFyLmggaGFzaC4gIEFsbAorIyBwcm9wZXJ0aWVzIG90aGVyIHRoYW4gYmxrLCBfYnAsIGFuZCBfZXAgYXJlIGFuYWx5emVkIGFuZCBtYXBwZWQgdG8KKyMgdGhlIG5hbWVzIGxpc3RlZCBpbiBQcm9wZXJ0eVZhbHVlQWxpYXNlcy4gIFRoZXkgYXJlIHRoZW4gcmVwbGFjZWQKKyMgd2l0aCBhIHN0cmluZyBvZiB0aGUgZm9ybSAiPHNob3J0Pnw8bG9uZz4iLiAgVGhlIHNob3J0IG9yIGxvbmcgbmFtZQorIyBtYXkgYmUgbWlzc2luZy4KKyMKKyMgQHBhcmFtIGEgaGFzaCByZWYgZnJvbSByZWFkX3VjaGFyLgorIyBAcGFyYW0gYSBoYXNoIHJlZiBmcm9tIHJlYWRfUHJvcGVydHlWYWx1ZUFsaWFzZXMuCitzdWIgbWVyZ2VfUHJvcGVydHlWYWx1ZUFsaWFzZXMgeworICAgIG15ICgkaCwgJHZhKSA9IEBfOworCisgICAgbXkgJWdjQ291bnQ7CisgICAgZm9yIG15ICRwcm9wIChrZXlzICUkaCkgeworICAgICAgICAjIF9icCwgX2VwIGhhbmRsZWQgaW4gbWVyZ2VfUHJvcGVydHlBbGlhc2VzCisgICAgICAgIG5leHQgaWYgKCRwcm9wID1+IC9eXy8pOworCisgICAgICAgICMgU3BlY2lhbCBjYXNlOiBnY20KKyAgICAgICAgbXkgJHByb3AyID0gKCRwcm9wIGVxICdnY20nKSA/ICdnYycgOiAkcHJvcDsKKworICAgICAgICAjIGZpbmQgY29ycmVzcG9uZGluZyBQcm9wZXJ0eVZhbHVlQWxpYXNlcyBkYXRhCisgICAgICAgIGRpZSAiRXJyb3I6IENhbid0IGZpbmQgJHByb3AgaW4gUHJvcGVydHlWYWx1ZUFsaWFzZXMudHh0IgorICAgICAgICAgICAgdW5sZXNzIChleGlzdHMgJHZhLT57JHByb3AyfSk7CisgICAgICAgIG15ICRwdmEgPSAkdmEtPnskcHJvcDJ9OworCisgICAgICAgICMgbWF0Y2ggdXAgZGF0YQorICAgICAgICBteSAkaGggPSAkaC0+eyRwcm9wfTsKKyAgICAgICAgZm9yIG15ICRlbnVtIChrZXlzICUkaGgpIHsKKworICAgICAgICAgICAgbXkgJG5hbWUgPSAkaGgtPnskZW51bX07CisKKyAgICAgICAgICAgICMgbG9vayB1cCBib3RoIGxvbmcgYW5kIHNob3J0ICYgaWdub3JlIGNhc2UKKyAgICAgICAgICAgIG15ICRuOworICAgICAgICAgICAgaWYgKGV4aXN0cyAkcHZhLT57JG5hbWV9KSB7CisgICAgICAgICAgICAgICAgJG4gPSAkbmFtZTsgCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICMgaXRlcmF0ZSAoc2xvdykKK2l0ZXJhdGVBbGlhc2VzOgorICAgICAgICAgICAgICAgIGZvciBteSAkYSAoa2V5cyAlJHB2YSkgeworICAgICAgICAgICAgICAgICAgICAjIGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2gKKyAgICAgICAgICAgICAgICAgICAgIyAmIGNhc2UtaW5zZW5zaXRpdmUgcmV2ZXJzZSBtYXRjaAorICAgICAgICAgICAgICAgICAgICBpZiAoJGEgPX4gL14kbmFtZSQvaSkgeworICAgICAgICAgICAgICAgICAgICAgICAgJG4gPSAkYTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3Q7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBteSBAYWxpYXNlcyA9IHNwbGl0KC9cfC8sICRwdmEtPnskYX0pOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChAYWxpYXNlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgvXiRuYW1lJC9pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRuID0gJGE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgaXRlcmF0ZUFsaWFzZXM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAjIEZvciBibG9ja3MsIGRvIGEgbG9vc2UgbWF0Y2ggZnJvbSBCbG9ja3MudHh0IHBzZXVkby1uYW1lCisgICAgICAgICAgICAjIHRvIFByb3BlcnR5VmFsdWVBbGlhc2VzIGxvbmcgbmFtZS4KKyAgICAgICAgICAgIGlmICghJG4gJiYgJHByb3AgZXEgJ2JsaycpIHsKKyAgICAgICAgICAgICAgICBmb3IgbXkgJGEgKGtleXMgJSRwdmEpIHsKKyAgICAgICAgICAgICAgICAgICAgIyBUaGUgYmxvY2sgaXMgb25seSBnb2luZyB0byBtYXRjaCB0aGUgbG9uZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAjIGJ1dCB3ZSBjaGVjayBib3RoIGZvciBjb21wbGV0ZW5lc3MuICBBcyBvZiBVbmljb2RlCisgICAgICAgICAgICAgICAgICAgICMgNC4wLCBibG9ja3MgZG8gbm90IGhhdmUgc2hvcnQgbmFtZXMuCisgICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaGVzTG9vc2VseSgkbmFtZSwgJHB2YS0+eyRhfSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXNMb29zZWx5KCRuYW1lLCAkYSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICRuID0gJGE7CisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkaWUgIkVycm9yOiBQcm9wZXJ0eSB2YWx1ZSAkcHJvcDokbmFtZSBub3QgZm91bmQiIHVubGVzcyAoJG4pOworCisgICAgICAgICAgICBteSAkbCA9ICRuOworICAgICAgICAgICAgbXkgJHIgPSAkcHZhLT57JG59OworICAgICAgICAgICAgIyBjb252ZXJ0IHxuL2FcZCp8IHRvIGJsYW5rCisgICAgICAgICAgICAkbCA9ICcnIGlmICgkbCA9fiBtfF5uL2FcZCokfCk7CisgICAgICAgICAgICAkciA9ICcnIGlmICgkciA9fiBtfF5uL2FcZCokfCk7CisKKyAgICAgICAgICAgICRoaC0+eyRlbnVtfSA9ICIkbHwkciI7CisgICAgICAgICAgICAjIERvbid0IGRlbGV0ZSB0aGUgJ2djJyBwcm9wZXJ0aWVzIGJlY2F1c2Ugd2UgbmVlZCB0byBzaGFyZQorICAgICAgICAgICAgIyB0aGVtIGJldHdlZW4gJ2djJyBhbmQgJ2djbScuICBDb3VudCBlYWNoIHVzZSBpbnN0ZWFkLgorICAgICAgICAgICAgaWYgKCRwcm9wMiBlcSAnZ2MnKSB7CisgICAgICAgICAgICAgICAgKyskZ2NDb3VudHskbn07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRlbGV0ZSAkcHZhLT57JG59OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgIyBNZXJnZSB0aGUgY29tYmluaW5nIGNsYXNzIHZhbHVlcyBpbiBtYW51YWxseQorICAgICMgQWRkIHRoZSBzYW1lIHZhbHVlcyB0byB0aGUgc3ludGhldGljIGxjY2MgYW5kIHRjY2MgcHJvcGVydGllcworICAgIGRpZSAiRXJyb3I6IE5vIGNjYyBkYXRhIgorICAgICAgICB1bmxlc3MgZXhpc3RzICR2YS0+eydjY2MnfTsKKyAgICBmb3IgbXkgJGNjYyAoa2V5cyAleyR2YS0+eydjY2MnfX0pIHsKKyAgICAgICAgZGllICJFcnJvcjogQ2FuJ3Qgb3ZlcndyaXRlIGNjYyAkY2NjIgorICAgICAgICAgICAgaWYgKGV4aXN0cyAkaC0+eydjY2MnfS0+eyRjY2N9KTsKKyAgICAgICAgJGgtPnsnbGNjYyd9LT57JGNjY30gPQorICAgICAgICAkaC0+eyd0Y2NjJ30tPnskY2NjfSA9CisgICAgICAgICRoLT57J2NjYyd9LT57JGNjY30gPSAkdmEtPnsnY2NjJ30tPnskY2NjfTsKKyAgICB9CisgICAgZGVsZXRlICR2YS0+eydjY2MnfTsKKworICAgICMgTWVyZ2Ugc3ludGhldGljIGJpbmFyeSBwcm9wZXJ0eSB2YWx1ZXMgaW4gbWFudWFsbHkuCisgICAgIyBUaGVzZSBhcmUgdGhlICJUcnVlIiBhbmQgIkZhbHNlIiB2YWx1ZSBhbGlhc2VzLgorICAgIGRpZSAiRXJyb3I6IE5vIFRydWUvRmFsc2UgdmFsdWUgYWxpYXNlcyIKKyAgICAgICAgdW5sZXNzIGV4aXN0cyAkdmEtPnsnYmlucHJvcCd9OworICAgIGZvciBteSAkYnAgKGtleXMgJXskdmEtPnsnYmlucHJvcCd9fSkgeworICAgICAgICAkaC0+eydiaW5wcm9wJ30tPnskYnB9ID0gJHZhLT57J2JpbnByb3AnfS0+eyRicH07CisgICAgfQorICAgIGRlbGV0ZSAkdmEtPnsnYmlucHJvcCd9OworCisgICAgbXkgJGVyciA9ICcnOworICAgIGZvciBteSAkcHJvcCAoc29ydCBrZXlzICUkdmEpIHsKKyAgICAgICAgbXkgJGhoID0gJHZhLT57JHByb3B9OworICAgICAgICBmb3IgbXkgJHN1YmtleSAoc29ydCBrZXlzICUkaGgpIHsKKyAgICAgICAgICAgICMgJ2djJyBwcm9wcyBhcmUgc2hhcmVkIHdpdGggJ2djbSc7IG1ha2Ugc3VyZSB0aGV5IHdlcmUgdXNlZAorICAgICAgICAgICAgIyBvbmNlIG9yIHR3aWNlLgorICAgICAgICAgICAgaWYgKCRwcm9wIGVxICdnYycpIHsKKyAgICAgICAgICAgICAgICBteSAkbiA9ICRnY0NvdW50eyRzdWJrZXl9OworICAgICAgICAgICAgICAgIG5leHQgaWYgKCRuID49IDEgJiYgJG4gPD0gMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAkZXJyIC49ICJXYXJuaW5nOiBFbnVtIGZvciB2YWx1ZSAkcHJvcDokc3Via2V5IG5vdCBmb3VuZCBpbiB1Y2hhci5oXG4iCisgICAgICAgICAgICAgICAgdW5sZXNzIGV4aXN0cyAkTUlTU0lOR19GUk9NX1VDSEFSeyRwcm9wfTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwcmludCAkZXJyIGlmICgkZXJyKTsKK30KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUmVhZCB0aGUgUHJvcGVydHlBbGlhc2VzLnR4dCBmaWxlLiAgUmV0dXJuIGEgaGFzaCB0aGF0IG1hcHMgdGhlIGxvbmcKKyMgbmFtZSB0byB0aGUgc2hvcnQgbmFtZS4gIFRoZSBzcGVjaWFsIGtleSAnX3ZlcnNpb24nIHdpbGwgbWFwIHRvIHRoZQorIyBVbmljb2RlIHZlcnNpb24gb2YgdGhlIGZpbGUuICBUaGUgc3BlY2lhbCBrZXkgJ19mYW1pbHknIGhvbGRzIGEKKyMgc3ViaGFzaCB0aGF0IG1hcHMgbG9uZyBuYW1lcyB0byBhIGZhbWlseSBzdHJpbmcsIGZvciBkZXNjcmlwdGl2ZQorIyBwdXJwb3Nlcy4KKyMKKyMgQHBhcmFtIGEgZmlsZW5hbWUgZm9yIFByb3BlcnR5QWxpYXNlcy50eHQKKyMgQHBhcmFtIHJlZmVyZW5jZSB0byBoYXNoIHRvIHJlY2VpdmUgZGF0YS4gIEtleXMgYXJlIGxvbmcgbmFtZXMuCisjIFZhbHVlcyBhcmUgc2hvcnQgbmFtZXMuCitzdWIgcmVhZF9Qcm9wZXJ0eUFsaWFzZXMgeworCisgICAgbXkgJGhhc2ggPSBzaGlmdDsgICAgICAgICAjIHJlc3VsdAorCisgICAgbXkgJGZpbGVuYW1lID0gc2hpZnQ7IAorCisgICAgbXkgJGZhbSA9IHt9OyAgIyBtYXAgbG9uZyBuYW1lcyB0byBmYW1pbHkgc3RyaW5nCisgICAgJGZhbSA9ICRoYXNoLT57J19mYW1pbHknfSBpZiAoZXhpc3RzICRoYXNoLT57J19mYW1pbHknfSk7CisKKyAgICBteSAkZmFtaWx5OyAjIGJpbmFyeSwgZW51bWVyYXRlZCwgZXRjLgorCisgICAgbXkgJGluID0gbmV3IEZpbGVIYW5kbGUoJGZpbGVuYW1lLCAncicpOworICAgIGRpZSAiRXJyb3I6IENhbm5vdCBvcGVuICRmaWxlbmFtZSIgaWYgKCFkZWZpbmVkICRpbik7CisKKyAgICB3aGlsZSAoPCRpbj4pIHsKKworICAgICAgICAjIFJlYWQgdmVyc2lvbiAoZW1iZWRkZWQgaW4gYSBjb21tZW50KQorICAgICAgICBpZiAoL1Byb3BlcnR5QWxpYXNlcy0oXGQrXC5cZCtcLlxkKykvaSkgeworICAgICAgICAgICAgZGllICJFcnJvcjogTXVsdGlwbGUgdmVyc2lvbnMgaW4gJGZpbGVuYW1lIgorICAgICAgICAgICAgICAgIGlmIChleGlzdHMgJGhhc2gtPnsnX3ZlcnNpb24nfSk7CisgICAgICAgICAgICAkaGFzaC0+eydfdmVyc2lvbid9ID0gJDE7CisgICAgICAgIH0KKworICAgICAgICAjIFJlYWQgZmFtaWx5IGhlYWRpbmcKKyAgICAgICAgaWYgKC9eXHMqXCNccyooLis/KVxzKlByb3BlcnRpZXNccyokLykgeworICAgICAgICAgICAgJGZhbWlseSA9ICQxOworICAgICAgICB9CisKKyAgICAgICAgIyBJZ25vcmUgY29tbWVudHMgYW5kIGJsYW5rIGxpbmVzCisgICAgICAgIHMvXCMuKi8vOworICAgICAgICBuZXh0IHVubGVzcyAoL1xTLyk7CisKKyAgICAgICAgaWYgKC9eXHMqKC4rPylccyo7LykgeworICAgICAgICAgICAgbXkgJHNob3J0ID0gJDE7CisgICAgICAgICAgICBteSBAZmllbGRzID0gLztccyooW15ccztdKykvZzsKKyAgICAgICAgICAgIGlmIChAZmllbGRzIDwgMSkgeworICAgICAgICAgICAgICAgIG15ICRudW1iZXIgPSBAZmllbGRzOworICAgICAgICAgICAgICAgIGRpZSAiRXJyb3I6IFdyb25nIG51bWJlciBvZiBmaWVsZHMgKCRudW1iZXIpIGluICRmaWxlbmFtZSBhdCAkXyI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICMgTWFrZSAibi9hIiBzdHJpbmdzIHVuaXF1ZQorICAgICAgICAgICAgaWYgKCRzaG9ydCBlcSAnbi9hJykgeworICAgICAgICAgICAgICAgICRzaG9ydCAuPSBzcHJpbnRmKCIlMDNkIiwgJHByb3BOQSsrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG15ICRsb25nID0gJGZpZWxkc1swXTsKKyAgICAgICAgICAgIGlmICgkbG9uZyBlcSAnbi9hJykgeworICAgICAgICAgICAgICAgICRsb25nIC49IHNwcmludGYoIiUwM2QiLCAkcHJvcE5BKyspOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAjIEFkZCBsb25nIG5hbWUtPnNob3J0IG5hbWUgdG8gdGhlIGhhc2g9cGEgaGFzaCB0YWJsZQorICAgICAgICAgICAgaWYgKGV4aXN0cyAkaGFzaC0+eyRsb25nfSkgeworICAgICAgICAgICAgICAgIGRpZSAiRXJyb3I6IER1cGxpY2F0ZSBwcm9wZXJ0eSAkbG9uZyBpbiAkZmlsZW5hbWUiCisgICAgICAgICAgICB9CisgICAgICAgICAgICAkaGFzaC0+eyRsb25nfSA9ICRzaG9ydDsKKyAgICAgICAgICAgICRmYW0tPnskbG9uZ30gPSAkZmFtaWx5OworCisgICAgICAgICAgICAjIEFkZCB0aGUgbGlzdCBvZiBmdXJ0aGVyIGFsaWFzZXMgdG8gdGhlIGFkZGl0aW9uYWxfcHJvcGVydHlfYWxpYXNlcyBoYXNoIHRhYmxlLAorICAgICAgICAgICAgIyB1c2luZyB0aGUgbG9uZyBwcm9wZXJ0eSBuYW1lIGFzIHRoZSBrZXkuCisgICAgICAgICAgICAjIEZvciBleGFtcGxlOgorICAgICAgICAgICAgIyAgIFdoaXRlX1NwYWNlLT5zcGFjZXxvdXRlcl9zcGFjZQorICAgICAgICAgICAgaWYgKEBmaWVsZHMgPiAxKSB7CisgICAgICAgICAgICAgICAgbXkgJHZhbHVlID0gcG9wIEBmaWVsZHM7CisgICAgICAgICAgICAgICAgd2hpbGUgKEBmaWVsZHMgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgICR2YWx1ZSAuPSAifCIgLiBwb3AgQGZpZWxkczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgJGFkZGl0aW9uYWxfcHJvcGVydHlfYWxpYXNlc3skbG9uZ30gPSAkdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkaWUgIkVycm9yOiBDYW4ndCBwYXJzZSAkXyBpbiAkZmlsZW5hbWUiOworICAgICAgICB9CisgICAgfQorCisgICAgJGluLT5jbG9zZSgpOworCisgICAgJGhhc2gtPnsnX2ZhbWlseSd9ID0gJGZhbTsKK30KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUmVhZCB0aGUgUHJvcGVydHlWYWx1ZUFsaWFzZXMudHh0IGZpbGUuICBSZXR1cm4gYSB0d28gbGV2ZWwgaGFzaAorIyB0aGF0IG1hcHMgcHJvcGVydHlfc2hvcnRfbmFtZTp2YWx1ZV9zaG9ydF9uYW1lOnZhbHVlX2xvbmdfbmFtZS4gIEluCisjIHRoZSBjYXNlIG9mIHRoZSAnY2NjJyBwcm9wZXJ0eSwgdGhlIHNob3J0IG5hbWUgaXMgdGhlIG51bWVyaWMgY2xhc3MKKyMgYW5kIHRoZSBsb25nIG5hbWUgaXMgIjxzaG9ydD58PGxvbmc+Ii4gIFRoZSBzcGVjaWFsIGtleSAnX3ZlcnNpb24nCisjIHdpbGwgbWFwIHRvIHRoZSBVbmljb2RlIHZlcnNpb24gb2YgdGhlIGZpbGUuCisjCisjIEBwYXJhbSBhIGZpbGVuYW1lIGZvciBQcm9wZXJ0eVZhbHVlQWxpYXNlcy50eHQKKyMKKyMgQHJldHVybiBhIGhhc2ggcmVmZXJlbmNlLgorc3ViIHJlYWRfUHJvcGVydHlWYWx1ZUFsaWFzZXMgeworCisgICAgbXkgJGhhc2ggPSBzaGlmdDsgICAgICAgICAjIHJlc3VsdAorCisgICAgbXkgJGZpbGVuYW1lID0gc2hpZnQ7IAorCisgICAgbXkgJGluID0gbmV3IEZpbGVIYW5kbGUoJGZpbGVuYW1lLCAncicpOworICAgIGRpZSAiRXJyb3I6IENhbm5vdCBvcGVuICRmaWxlbmFtZSIgaWYgKCFkZWZpbmVkICRpbik7CisKKyAgICB3aGlsZSAoPCRpbj4pIHsKKworICAgICAgICAjIFJlYWQgdmVyc2lvbiAoZW1iZWRkZWQgaW4gYSBjb21tZW50KQorICAgICAgICBpZiAoL1Byb3BlcnR5VmFsdWVBbGlhc2VzLShcZCtcLlxkK1wuXGQrKS9pKSB7CisgICAgICAgICAgICBkaWUgIkVycm9yOiBNdWx0aXBsZSB2ZXJzaW9ucyBpbiAkZmlsZW5hbWUiCisgICAgICAgICAgICAgICAgaWYgKGV4aXN0cyAkaGFzaC0+eydfdmVyc2lvbid9KTsKKyAgICAgICAgICAgICRoYXNoLT57J192ZXJzaW9uJ30gPSAkMTsKKyAgICAgICAgfQorCisgICAgICAgICMgSWdub3JlIGNvbW1lbnRzIGFuZCBibGFuayBsaW5lcworICAgICAgICBzL1wjLiovLzsKKyAgICAgICAgbmV4dCB1bmxlc3MgKC9cUy8pOworCisgICAgICAgIGlmICgvXlxzKiguKz8pXHMqOy9pKSB7CisgICAgICAgICAgICBteSAkcHJvcCA9ICQxOworICAgICAgICAgICAgbXkgQGZpZWxkcyA9IC87XHMqKFteXHM7XSspL2c7CisgICAgICAgICAgICBkaWUgIkVycm9yOiBXcm9uZyBudW1iZXIgb2YgZmllbGRzIGluICRmaWxlbmFtZSIKKyAgICAgICAgICAgICAgICBpZiAoQGZpZWxkcyA8IDIgfHwgQGZpZWxkcyA+IDUpOworICAgICAgICAgICAgIyBNYWtlICJuL2EiIHN0cmluZ3MgdW5pcXVlCisgICAgICAgICAgICAkZmllbGRzWzBdIC49IHNwcmludGYoIiUwM2QiLCAkdmFsdWVOQSsrKSBpZiAoJGZpZWxkc1swXSBlcSAnbi9hJyk7CisgICAgICAgICAgICAjIFNxdWFzaCBleHRyYSBmaWVsZHMgdG9nZXRoZXIKKyAgICAgICAgICAgIHdoaWxlIChAZmllbGRzID4gMikgeworICAgICAgICAgICAgICAgIG15ICRmID0gcG9wIEBmaWVsZHM7CisgICAgICAgICAgICAgICAgJGZpZWxkc1skI2ZpZWxkc10gLj0gJ3wnIC4gJGY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhZGREYXR1bSgkaGFzaCwgJHByb3AsIEBmaWVsZHMpOworICAgICAgICB9CisKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBkaWUgIkVycm9yOiBDYW4ndCBwYXJzZSAkXyBpbiAkZmlsZW5hbWUiOworICAgICAgICB9CisgICAgfQorCisgICAgJGluLT5jbG9zZSgpOworCisgICAgIyBTY3JpcHQgQ29wdD1RYWFjIChDb3B0aWMpIGlzIGEgc3BlY2lhbCBjYXNlLgorICAgICMgQmVmb3JlIHRoZSBDb3B0IGNvZGUgd2FzIGRlZmluZWQsIHRoZSBwcml2YXRlLXVzZSBjb2RlIFFhYWMgd2FzIHVzZWQuCisgICAgIyBTdGFydGluZyB3aXRoIFVuaWNvZGUgNC4xLCBQcm9wZXJ0eVZhbHVlQWxpYXNlcy50eHQgY29udGFpbnMKKyAgICAjIENvcHQgYXMgdGhlIHNob3J0IG5hbWUgYXMgd2VsbCBhcyBRYWFjIGFzIGFuIGFsaWFzLgorICAgICMgRm9yIHVzZSB3aXRoIG9sZGVyIFVuaWNvZGUgZGF0YSBmaWxlcywgd2UgYWRkIGhlcmUgYSBRYWFjLT5Db3B0aWMgZW50cnkuCisgICAgIyBUaGlzIHNob3VsZCBub3QgZG8gYW55dGhpbmcgZm9yIDQuMS1hbmQtbGF0ZXIgVW5pY29kZSBkYXRhIGZpbGVzLgorICAgICMgU2VlIGFsc28gVUFYICMyNDogU2NyaXB0IE5hbWVzIGh0dHA6Ly93d3cudW5pY29kZS5vcmcvdW5pY29kZS9yZXBvcnRzL3RyMjQvCisgICAgJGhhc2gtPnsnc2MnfS0+eydRYWFjJ30gPSAnQ29wdGljJworICAgICAgICB1bmxlc3MgKGV4aXN0cyAkaGFzaC0+eydzYyd9LT57J1FhYWMnfSB8fCBleGlzdHMgJGhhc2gtPnsnc2MnfS0+eydDb3B0J30pOworCisgICAgIyBBZGQgTnxOb3xUfFRydWUgYW5kIFl8WWVzfEZ8RmFsc2UgLS0gdGhlc2UgYXJlIHZhbHVlcyB3ZSByZWNvZ25pemUgZm9yCisgICAgIyBiaW5hcnkgcHJvcGVydGllcyAodW50aWwgVW5pY29kZSA1LjAgTk9UIGZyb20gUHJvcGVydHlWYWx1ZUFsaWFzZXMudHh0KS4KKyAgICAjIFRoZXNlIGFyZSBvZiB0aGUgc2FtZSBmb3JtIGFzIHRoZSAnY2NjJyB2YWx1ZSBhbGlhc2VzLgorICAgICMgU3RhcnRpbmcgd2l0aCBVbmljb2RlIDUuMSwgUHJvcGVydHlWYWx1ZUFsaWFzZXMudHh0IGRvZXMgaGF2ZSB2YWx1ZXMKKyAgICAjIGZvciBiaW5hcnkgcHJvcGVydGllcy4KKyAgICBpZiAoIWV4aXN0cyAkaGFzaC0+eydiaW5wcm9wJ30tPnsnMCd9KSB7CisgICAgICAgIGlmIChleGlzdHMgJGhhc2gtPnsnQWxwaGEnfS0+eydOJ30pIHsKKyAgICAgICAgICAgICMgVW5pY29kZSA1LjEgYW5kIGxhdGVyOiBNYWtlIHRoZSBudW1lcmljIHZhbHVlIHRoZSBrZXkuCisgICAgICAgICAgICAkaGFzaC0+eydiaW5wcm9wJ30tPnsnMCd9ID0gJ058JyAuICRoYXNoLT57J0FscGhhJ30tPnsnTid9OworICAgICAgICAgICAgJGhhc2gtPnsnYmlucHJvcCd9LT57JzEnfSA9ICdZfCcgLiAkaGFzaC0+eydBbHBoYSd9LT57J1knfTsKKyAgICAgICAgfSBlbHNpZiAoZXhpc3RzICRoYXNoLT57J0FscGhhJ30pIHsKKyAgICAgICAgICAgIGRpZSAiRXJyb3I6IFVucmVjb2duaXplZCBzaG9ydCB2YWx1ZSBuYW1lIGZvciBiaW5hcnkgcHJvcGVydHkgJ0FscGhhJ1xuIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICMgVW5pY29kZSA1LjAgYW5kIGVhcmxpZXI6IEFkZCBtYW51YWxseS4KKyAgICAgICAgICAgICRoYXNoLT57J2JpbnByb3AnfS0+eycwJ30gPSAnTnxOb3xGfEZhbHNlJzsKKyAgICAgICAgICAgICRoYXNoLT57J2JpbnByb3AnfS0+eycxJ30gPSAnWXxZZXN8VHxUcnVlJzsKKyAgICAgICAgfQorICAgIH0KK30KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUmVhZCB0aGUgQmxvY2tzLnR4dCBmaWxlLiAgUmV0dXJuIGEgaGFzaCB0aGF0IG1hcHMgdGhlIGNvZGUgcG9pbnQKKyMgcmFuZ2Ugc3RhcnQgdG8gdGhlIGJsb2NrIG5hbWUuICBUaGUgc3BlY2lhbCBrZXkgJ192ZXJzaW9uJyB3aWxsIG1hcAorIyB0byB0aGUgVW5pY29kZSB2ZXJzaW9uIG9mIHRoZSBmaWxlLgorIworIyBBcyBvZiBVbmljb2RlIDQuMCwgdGhlIG5hbWVzIGluIHRoZSBCbG9ja3MudHh0IGFyZSBubyBsb25nZXIgdGhlCisjIHByb3BlciBuYW1lcy4gIFRoZSBwcm9wZXIgbmFtZXMgYXJlIG5vdyBsaXN0ZWQgaW4gUHJvcGVydHlWYWx1ZUFsaWFzZXMuCisjIFRoZXkgYXJlIHNpbWlsYXIgYnV0IG5vdCBpZGVudGljYWwuICBGdXJ0aGVybW9yZSwgNC4wIGludHJvZHVjZXMKKyMgYSBuZXcgYmxvY2sgbmFtZSwgTm9fQmxvY2ssIHdoaWNoIGlzIGxpc3RlZCBvbmx5IGluIFByb3BlcnR5VmFsdWVBbGlhc2VzCisjIGFuZCBub3QgaW4gQmxvY2tzLnR4dC4gIEFzIGEgcmVzdWx0LCB3ZSBoYW5kbGUgYmxvY2tzIGFzIGZvbGxvd3M6CisjCisjIDEuIFJlYWQgQmxvY2tzLnR4dCB0byBtYXAgY29kZSBwb2ludCByYW5nZSBzdGFydCB0byBxdWFzaS1ibG9jayBuYW1lLgorIyAyLiBBZGQgdG8gQmxvY2tzLnR4dCBhIHN5bnRoZXRpYyBObyBCbG9jayBjb2RlIHBvaW50ICYgbmFtZToKKyMgICAgWCAtPiBObyBCbG9jaworIyAzLiBNYXAgcXVhc2ktbmFtZXMgZnJvbSBCbG9ja3MudHh0IChpbmNsdWRpbmcgTm8gQmxvY2spIHRvIGFjdHVhbAorIyAgICBuYW1lcyBmcm9tIFByb3BlcnR5VmFsdWVBbGlhc2VzLiAgVGhpcyBvY2N1cnMgaW4KKyMgICAgbWVyZ2VfUHJvcGVydHlWYWx1ZUFsaWFzZXMuCisjCisjIEBwYXJhbSBhIGZpbGVuYW1lIGZvciBCbG9ja3MudHh0CisjCisjIEByZXR1cm4gYSByZWYgdG8gYSBoYXNoLiAgS2V5cyBhcmUgY29kZSBwb2ludHMsIGFzIHRleHQsIGUuZy4sCisjICIxNzIwIi4gIFZhbHVlcyBhcmUgcHNldWRvLWJsb2NrIG5hbWVzLCBlLmcuLCAiSGFudW5vbyIuCitzdWIgcmVhZF9CbG9ja3MgeworCisgICAgbXkgJGZpbGVuYW1lID0gc2hpZnQ7IAorCisgICAgbXkgJGhhc2ggPSB7fTsgICAgICAgICAjIHJlc3VsdAorCisgICAgbXkgJGluID0gbmV3IEZpbGVIYW5kbGUoJGZpbGVuYW1lLCAncicpOworICAgIGRpZSAiRXJyb3I6IENhbm5vdCBvcGVuICRmaWxlbmFtZSIgaWYgKCFkZWZpbmVkICRpbik7CisKKyAgICB3aGlsZSAoPCRpbj4pIHsKKworICAgICAgICAjIFJlYWQgdmVyc2lvbiAoZW1iZWRkZWQgaW4gYSBjb21tZW50KQorICAgICAgICBpZiAoL0Jsb2Nrcy0oXGQrXC5cZCtcLlxkKykvaSkgeworICAgICAgICAgICAgZGllICJFcnJvcjogTXVsdGlwbGUgdmVyc2lvbnMgaW4gJGZpbGVuYW1lIgorICAgICAgICAgICAgICAgIGlmIChleGlzdHMgJGhhc2gtPnsnX3ZlcnNpb24nfSk7CisgICAgICAgICAgICAkaGFzaC0+eydfdmVyc2lvbid9ID0gJDE7CisgICAgICAgIH0KKworICAgICAgICAjIElnbm9yZSBjb21tZW50cyBhbmQgYmxhbmsgbGluZXMKKyAgICAgICAgcy9cIy4qLy87CisgICAgICAgIG5leHQgdW5sZXNzICgvXFMvKTsKKworICAgICAgICBpZiAoL14oWzAtOWEtZl0rKVwuXC5bMC05YS1mXStccyo7XHMqKC4rPylccyokL2kpIHsKKyAgICAgICAgICAgIGRpZSAiRXJyb3I6IER1cGxpY2F0ZSByYW5nZSAkMSBpbiAkZmlsZW5hbWUiCisgICAgICAgICAgICAgICAgaWYgKGV4aXN0cyAkaGFzaC0+eyQxfSk7CisgICAgICAgICAgICAkaGFzaC0+eyQxfSA9ICQyOworICAgICAgICB9CisKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBkaWUgIkVycm9yOiBDYW4ndCBwYXJzZSAkXyBpbiAkZmlsZW5hbWUiOworICAgICAgICB9CisgICAgfQorCisgICAgJGluLT5jbG9zZSgpOworCisgICAgIyBBZGQgcHNldWRvLW5hbWUgZm9yIE5vIEJsb2NrCisgICAgJGhhc2gtPnsnbm9uZSd9ID0gJ05vIEJsb2NrJzsKKworICAgICRoYXNoOworfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBSZWFkIHRoZSB1c2NyaXB0LmggZmlsZSBhbmQgY29tcGlsZSBhIG1hcHBpbmcgb2YgVW5pY29kZSBzeW1ib2xzIHRvCisjIGljdTRjIGVudW0gdmFsdWVzLgorIworIyBAcGFyYW0gYSBmaWxlbmFtZSBmb3IgdXNjcmlwdC5oCisjCisjIEByZXR1cm4gYSByZWYgdG8gYSBoYXNoLiAgVGhlIGtleXMgb2YgdGhlIGhhc2ggYXJlIGVudW0gc3ltYm9scyBmcm9tCisjIHVzY3JpcHQuaCwgYW5kIHRoZSB2YWx1ZXMgYXJlIHNjcmlwdCBuYW1lcy4KK3N1YiByZWFkX3VzY3JpcHQgeworCisgICAgbXkgJGZpbGVuYW1lID0gc2hpZnQ7IAorCisgICAgbXkgJG1vZGUgPSAnJzsgICAgICAgICAjIHN0YXRlIG1hY2hpbmUgbW9kZSBhbmQgc3VibW9kZQorICAgIG15ICRzdWJtb2RlID0gJyc7CisKKyAgICBteSAkbGFzdCA9ICcnOyAgICAgICAgICMgZm9yIGxpbmUgZm9sZGluZworCisgICAgbXkgJGhhc2ggPSB7fTsgICAgICAgICAjIHJlc3VsdAorICAgIG15ICRrZXk7ICAgICAgICAgICAgICAgIyBmaXJzdC1sZXZlbCBrZXkKKworICAgIG15ICRpbiA9IG5ldyBGaWxlSGFuZGxlKCRmaWxlbmFtZSwgJ3InKTsKKyAgICBkaWUgIkVycm9yOiBDYW5ub3Qgb3BlbiAkZmlsZW5hbWUiIGlmICghZGVmaW5lZCAkaW4pOworCisgICAgd2hpbGUgKDwkaW4+KSB7CisgICAgICAgICMgRm9sZCBjb250aW51ZWQgbGluZXMgdG9nZXRoZXIKKyAgICAgICAgaWYgKC9eKC4qKVxcJC8pIHsKKyAgICAgICAgICAgICRsYXN0ID0gJDE7CisgICAgICAgICAgICBuZXh0OworICAgICAgICB9IGVsc2lmICgkbGFzdCkgeworICAgICAgICAgICAgJF8gPSAkbGFzdCAuICRfOworICAgICAgICAgICAgJGxhc3QgPSAnJzsKKyAgICAgICAgfQorCisgICAgICAgICMgRXhpdCBhbGwgbW9kZXMgaGVyZQorICAgICAgICBpZiAoJG1vZGUgJiYgJG1vZGUgbmUgJ0RFUFJFQ0FURUQnKSB7CisgICAgICAgICAgICBpZiAoL15ccypcfS8pIHsKKyAgICAgICAgICAgICAgICAkbW9kZSA9ICcnOworICAgICAgICAgICAgICAgIG5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAjIEhhbmRsZSBpbmRpdmlkdWFsIG1vZGVzCisKKyAgICAgICAgaWYgKCRtb2RlIGVxICdVU2NyaXB0Q29kZScpIHsKKyAgICAgICAgICAgIGlmIChtfF5ccyooVVNDUklQVF9cdyspLis/L1wqXHMqKFx3Kyl8KSB7CisgICAgICAgICAgICAgICAgbXkgKCRlbnVtLCAkY29kZSkgPSAoJDEsICQyKTsKKyAgICAgICAgICAgICAgICBkaWUgIkVycm9yOiBEdXBsaWNhdGUgc2NyaXB0ICRlbnVtIgorICAgICAgICAgICAgICAgICAgICBpZiAoZXhpc3RzICRoYXNoLT57JGVudW19KTsKKyAgICAgICAgICAgICAgICAkaGFzaC0+eyRlbnVtfSA9ICRjb2RlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZWxzaWYgKCRtb2RlIGVxICdERVBSRUNBVEVEJykgeworICAgICAgICAgICAgaWYgKC9ccypcI2lmZGVmLykgeworICAgICAgICAgICAgICAgIGRpZSAiRXJyb3I6IE5lc3RlZCAjaWZkZWYiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2lmICgvXHMqXCNlbmRpZi8pIHsKKyAgICAgICAgICAgICAgICAkbW9kZSA9ICcnOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZWxzaWYgKCEkbW9kZSkgeworICAgICAgICAgICAgaWYgKC9eXHMqdHlwZWRlZlxzK2VudW1ccysoXHcrKVxzKlx7LyB8fAorICAgICAgICAgICAgICAgICAgIC9eXHMqdHlwZWRlZlxzK2VudW1ccysoXHcrKVxzKiQvKSB7CisgICAgICAgICAgICAgICAgJG1vZGUgPSAkMTsKKyAgICAgICAgICAgICAgICAjcHJpbnQgIlBhcnNpbmcgJG1vZGVcbiI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVsc2lmICgvXlxzKlwjaWZkZWZccytJQ1VfVUNIQVJfVVNFX0RFUFJFQ0FURVNcYi8pIHsKKyAgICAgICAgICAgICAgICAkbW9kZSA9ICdERVBSRUNBVEVEJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgICRpbi0+Y2xvc2UoKTsKKworICAgICRoYXNoOworfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBSZWFkIHRoZSB1Y2hhci5oIGZpbGUgYW5kIGNvbXBpbGUgYSBtYXBwaW5nIG9mIFVuaWNvZGUgc3ltYm9scyB0bworIyBpY3U0YyBlbnVtIHZhbHVlcy4KKyMKKyMgQHBhcmFtIGEgZmlsZW5hbWUgZm9yIHVjaGFyLmgKKyMKKyMgQHJldHVybiBhIHJlZiB0byBhIGhhc2guICBUaGUga2V5cyBvZiB0aGUgaGFzaCBhcmUgJ19icCcgZm9yIGJpbmFyeQorIyBwcm9wZXJ0aWVzLCAnX2VwJyBmb3IgZW51bWVyYXRlZCBwcm9wZXJ0aWVzLCAnX2RwJy8nX3NwJy8nX29wJyBmb3IKKyMgZG91YmxlL3N0cmluZy9tYXNrIHByb3BlcnRpZXMsIGFuZCAnZ2MnLCAnZ2NtJywgJ2JjJywgJ2JsaycsCisjICdlYScsICdkdCcsICdqdCcsICdqZycsICdsYicsIG9yICdudCcgZm9yIGNvcnJlc3BvbmRpbmcgcHJvcGVydHkKKyMgdmFsdWUgYWxpYXNlcy4gIFRoZSB2YWx1ZXMgb2YgdGhlIGhhc2ggYXJlIHN1Ymhhc2hlcy4gIFRoZSBzdWJoYXNoZXMKKyMgaGF2ZSBhIGtleSBvZiB0aGUgdWNoYXIuaCBlbnVtIHN5bWJvbCwgYW5kIGEgdmFsdWUgb2YgdGhlIGFsaWFzCisjIHN0cmluZyAoYXMgbGlzdGVkIGluIFByb3BlcnR5VmFsdWVBbGlhc2VzLnR4dCkuICBOT1RFOiBUaGUgYWxpYXMKKyMgc3RyaW5nIGlzIHdoYXRldmVyIGFsaWFzIHVjaGFyLmggbGlzdHMuICBUaGlzIG1heSBiZSBlaXRoZXIgc2hvcnQgb3IKKyMgbG9uZywgZGVwZW5kaW5nIG9uIHRoZSBzcGVjaWZpYyBlbnVtLiAgTk9URTogRm9yIGJsb2NrcyAoJ2JsaycpLCB0aGUKKyMgdmFsdWUgaXMgYSBoZXggY29kZSBwb2ludCBmb3IgdGhlIHN0YXJ0IG9mIHRoZSBhc3NvY2lhdGVkIGJsb2NrLgorIyBOT1RFOiBUaGUgc3BlY2lhbCBrZXkgX3ZlcnNpb24gd2lsbCBtYXAgdG8gdGhlIFVuaWNvZGUgdmVyc2lvbiBvZgorIyB0aGUgZmlsZS4KK3N1YiByZWFkX3VjaGFyIHsKKworICAgIG15ICRmaWxlbmFtZSA9IHNoaWZ0OyAKKworICAgIG15ICRtb2RlID0gJyc7ICAgICAgICAgIyBzdGF0ZSBtYWNoaW5lIG1vZGUgYW5kIHN1Ym1vZGUKKyAgICBteSAkc3VibW9kZSA9ICcnOworCisgICAgbXkgJGxhc3QgPSAnJzsgICAgICAgICAjIGZvciBsaW5lIGZvbGRpbmcKKworICAgIG15ICRoYXNoID0ge307ICAgICAgICAgIyByZXN1bHQKKyAgICBteSAka2V5OyAgICAgICAgICAgICAgICMgZmlyc3QtbGV2ZWwga2V5CisKKyAgICBteSAkaW4gPSBuZXcgRmlsZUhhbmRsZSgkZmlsZW5hbWUsICdyJyk7CisgICAgZGllICJFcnJvcjogQ2Fubm90IG9wZW4gJGZpbGVuYW1lIiBpZiAoIWRlZmluZWQgJGluKTsKKworICAgIHdoaWxlICg8JGluPikgeworICAgICAgICAjIEZvbGQgY29udGludWVkIGxpbmVzIHRvZ2V0aGVyCisgICAgICAgIGlmICgvXiguKilcXCQvKSB7CisgICAgICAgICAgICAkbGFzdCAuPSAkMTsKKyAgICAgICAgICAgIG5leHQ7CisgICAgICAgIH0gZWxzaWYgKCRsYXN0KSB7CisgICAgICAgICAgICAkXyA9ICRsYXN0IC4gJF87CisgICAgICAgICAgICAkbGFzdCA9ICcnOworICAgICAgICB9CisKKyAgICAgICAgIyBFeGl0IGFsbCBtb2RlcyBoZXJlCisgICAgICAgIGlmICgkbW9kZSAmJiAkbW9kZSBuZSAnREVQUkVDQVRFRCcpIHsKKyAgICAgICAgICAgIGlmICgvXlxzKlx9LykgeworICAgICAgICAgICAgICAgICRtb2RlID0gJyc7CisgICAgICAgICAgICAgICAgbmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICMgSGFuZGxlIGluZGl2aWR1YWwgbW9kZXMKKworICAgICAgICBpZiAoJG1vZGUgZXEgJ1VQcm9wZXJ0eScpIHsKKyAgICAgICAgICAgIGlmICgvXlxzKihVQ0hBUl9cdyspXHMqWyw9XS8gfHwgL15ccysoVUNIQVJfXHcrKVxzKiQvKSB7CisgICAgICAgICAgICAgICAgaWYgKCRzdWJtb2RlKSB7CisgICAgICAgICAgICAgICAgICAgIGFkZERhdHVtKCRoYXNoLCAka2V5LCAkMSwgJHN1Ym1vZGUpOworICAgICAgICAgICAgICAgICAgICAkc3VibW9kZSA9ICcnOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICNwcmludCAiV2FybmluZzogSWdub3JpbmcgJDFcbiI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBlbHNpZiAobXxeXHMqL1wqXCpccyooXHcrKVxzK3Byb3BlcnR5XHMrKFx3Kyl8aSkgeworICAgICAgICAgICAgICAgIGRpZSAiRXJyb3I6IFVubWF0Y2hlZCB0YWcgJHN1Ym1vZGUiIGlmICgkc3VibW9kZSk7CisgICAgICAgICAgICAgICAgaWYgKGV4aXN0cyAkUFJPUF9UWVBFeyQxfSkgeworICAgICAgICAgICAgICAgICAgICAka2V5ID0gJFBST1BfVFlQRXskMX07CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJGtleSA9ICRQUk9QX1RZUEV7Ik90aGVyIn07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICRzdWJtb2RlID0gJDI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBlbHNpZiAoJG1vZGUgZXEgJ1VDaGFyQ2F0ZWdvcnknKSB7CisgICAgICAgICAgICBpZiAoL15ccyooVV9cdyspXHMqPS8pIHsKKyAgICAgICAgICAgICAgICBpZiAoJHN1Ym1vZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkRGF0dW0oJGhhc2gsICdnYycsICQxLCAkc3VibW9kZSk7CisgICAgICAgICAgICAgICAgICAgICRzdWJtb2RlID0gJyc7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgI3ByaW50ICJXYXJuaW5nOiBJZ25vcmluZyAkMVxuIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVsc2lmIChtfF5ccyovXCpcKlxzKihbQS1aXVthLXpdKVxzfCkgeworICAgICAgICAgICAgICAgIGRpZSAiRXJyb3I6IFVubWF0Y2hlZCB0YWcgJHN1Ym1vZGUiIGlmICgkc3VibW9kZSk7CisgICAgICAgICAgICAgICAgJHN1Ym1vZGUgPSAkMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGVsc2lmICgkbW9kZSBlcSAnVUNoYXJEaXJlY3Rpb24nKSB7CisgICAgICAgICAgICBpZiAoL15ccyooVV9cdyspXHMqWyw9XS8gfHwgL15ccysoVV9cdyspXHMqJC8pIHsKKyAgICAgICAgICAgICAgICBpZiAoJHN1Ym1vZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkRGF0dW0oJGhhc2gsICRrZXksICQxLCAkc3VibW9kZSk7CisgICAgICAgICAgICAgICAgICAgICRzdWJtb2RlID0gJyc7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgI3ByaW50ICJXYXJuaW5nOiBJZ25vcmluZyAkMVxuIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVsc2lmIChtfC9cKlwqXHMqKFtBLVpdKylcc3wpIHsKKyAgICAgICAgICAgICAgICBkaWUgIkVycm9yOiBVbm1hdGNoZWQgdGFnICRzdWJtb2RlIiBpZiAoJHN1Ym1vZGUpOworICAgICAgICAgICAgICAgICRrZXkgPSAnYmMnOworICAgICAgICAgICAgICAgICRzdWJtb2RlID0gJDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBlbHNpZiAoJG1vZGUgZXEgJ1VCbG9ja0NvZGUnKSB7CisgICAgICAgICAgICBpZiAobXxeXHMqKFVCTE9DS19cdyspLis/L1wqXFsoLis/KVxdXCovfCkgeworICAgICAgICAgICAgICAgIGFkZERhdHVtKCRoYXNoLCAnYmxrJywgJDEsICQyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGVsc2lmICgkbW9kZSBlcSAnVUVhc3RBc2lhbldpZHRoJykgeworICAgICAgICAgICAgaWYgKG18XlxzKihVX0VBX1x3KykuKz8vXCpcWyguKz8pXF1cKi98KSB7CisgICAgICAgICAgICAgICAgYWRkRGF0dW0oJGhhc2gsICdlYScsICQxLCAkMik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBlbHNpZiAoJG1vZGUgZXEgJ1VEZWNvbXBvc2l0aW9uVHlwZScpIHsKKyAgICAgICAgICAgIGlmIChtfF5ccyooVV9EVF9cdyspLis/L1wqXFsoLis/KVxdXCovfCkgeworICAgICAgICAgICAgICAgIGFkZERhdHVtKCRoYXNoLCAnZHQnLCAkMSwgJDIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZWxzaWYgKCRtb2RlIGVxICdVSm9pbmluZ1R5cGUnKSB7CisgICAgICAgICAgICBpZiAobXxeXHMqKFVfSlRfXHcrKS4rPy9cKlxbKC4rPylcXVwqL3wpIHsKKyAgICAgICAgICAgICAgICBhZGREYXR1bSgkaGFzaCwgJ2p0JywgJDEsICQyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGVsc2lmICgkbW9kZSBlcSAnVUpvaW5pbmdHcm91cCcpIHsKKyAgICAgICAgICAgICMgSWdub3JlIGFsaWFzZXMgbGlrZSBVX0pHX0hBTVpBX09OX0hFSF9HT0FMPVVfSkdfVEVIX01BUkJVVEFfR09BTC4KKyAgICAgICAgICAgICMgKFRoZXkgaGF2ZSBhbiA9IHNpZ24gcmF0aGVyIHRoYW4gYSBjb21tYSBhZnRlciB0aGUgY29uc3RhbnQgbmFtZS4pCisgICAgICAgICAgICBpZiAoL15ccyooVV9KR18oXHcrKSlccyosLykgeworICAgICAgICAgICAgICAgIGFkZERhdHVtKCRoYXNoLCAnamcnLCAkMSwgJDIpIHVubGVzcyAoJDIgZXEgJ0NPVU5UJyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBlbHNpZiAoJG1vZGUgZXEgJ1VHcmFwaGVtZUNsdXN0ZXJCcmVhaycpIHsKKyAgICAgICAgICAgIGlmIChtfF5ccyooVV9HQ0JfXHcrKS4rPy9cKlxbKC4rPylcXVwqL3wpIHsKKyAgICAgICAgICAgICAgICBhZGREYXR1bSgkaGFzaCwgJ0dDQicsICQxLCAkMik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBlbHNpZiAoJG1vZGUgZXEgJ1VXb3JkQnJlYWtWYWx1ZXMnKSB7CisgICAgICAgICAgICBpZiAobXxeXHMqKFVfV0JfXHcrKS4rPy9cKlxbKC4rPylcXVwqL3wpIHsKKyAgICAgICAgICAgICAgICBhZGREYXR1bSgkaGFzaCwgJ1dCJywgJDEsICQyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGVsc2lmICgkbW9kZSBlcSAnVVNlbnRlbmNlQnJlYWsnKSB7CisgICAgICAgICAgICBpZiAobXxeXHMqKFVfU0JfXHcrKS4rPy9cKlxbKC4rPylcXVwqL3wpIHsKKyAgICAgICAgICAgICAgICBhZGREYXR1bSgkaGFzaCwgJ1NCJywgJDEsICQyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGVsc2lmICgkbW9kZSBlcSAnVUxpbmVCcmVhaycpIHsKKyAgICAgICAgICAgIGlmIChtfF5ccyooVV9MQl9cdyspLis/L1wqXFsoLis/KVxdXCovfCkgeworICAgICAgICAgICAgICAgIGFkZERhdHVtKCRoYXNoLCAnbGInLCAkMSwgJDIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZWxzaWYgKCRtb2RlIGVxICdVTnVtZXJpY1R5cGUnKSB7CisgICAgICAgICAgICBpZiAobXxeXHMqKFVfTlRfXHcrKS4rPy9cKlxbKC4rPylcXVwqL3wpIHsKKyAgICAgICAgICAgICAgICBhZGREYXR1bSgkaGFzaCwgJ250JywgJDEsICQyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGVsc2lmICgkbW9kZSBlcSAnVUhhbmd1bFN5bGxhYmxlVHlwZScpIHsKKyAgICAgICAgICAgIGlmIChtfF5ccyooVV9IU1RfXHcrKS4rPy9cKlxbKC4rPylcXVwqL3wpIHsKKyAgICAgICAgICAgICAgICBhZGREYXR1bSgkaGFzaCwgJ2hzdCcsICQxLCAkMik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBlbHNpZiAoJG1vZGUgZXEgJ0RFUFJFQ0FURUQnKSB7CisgICAgICAgICAgICBpZiAoL1xzKlwjaWZkZWYvKSB7CisgICAgICAgICAgICAgICAgZGllICJFcnJvcjogTmVzdGVkICNpZmRlZiI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzaWYgKC9ccypcI2VuZGlmLykgeworICAgICAgICAgICAgICAgICRtb2RlID0gJyc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBlbHNpZiAoISRtb2RlKSB7CisgICAgICAgICAgICBpZiAoL15ccypcI2RlZmluZVxzKyhcdyspXHMrKC4rKS8pIHsKKyAgICAgICAgICAgICAgICAjICNkZWZpbmUgJGxlZnQgJHJpZ2h0CisgICAgICAgICAgICAgICAgbXkgKCRsZWZ0LCAkcmlnaHQpID0gKCQxLCAkMik7CisKKyAgICAgICAgICAgICAgICBpZiAoJGxlZnQgZXEgJ1VfVU5JQ09ERV9WRVJTSU9OJykgeworICAgICAgICAgICAgICAgICAgICBteSAkdmVyc2lvbiA9ICRyaWdodDsKKyAgICAgICAgICAgICAgICAgICAgJHZlcnNpb24gPSAkMSBpZiAoJHZlcnNpb24gPX4gL15cIiguKilcIi8pOworICAgICAgICAgICAgICAgICAgICAjIHByaW50ICJVbmljb2RlIHZlcnNpb246ICIsICR2ZXJzaW9uLCAiXG4iOworICAgICAgICAgICAgICAgICAgICBkaWUgIkVycm9yOiBNdWx0aXBsZSB2ZXJzaW9ucyBpbiAkZmlsZW5hbWUiCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVmaW5lZCAkaGFzaC0+eydfdmVyc2lvbid9KTsKKyAgICAgICAgICAgICAgICAgICAgJGhhc2gtPnsnX3ZlcnNpb24nfSA9ICR2ZXJzaW9uOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGVsc2lmICgkbGVmdCA9fiAvVV9HQ18oXHcrPylfTUFTSy8pIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkRGF0dW0oJGhhc2gsICdnY20nLCAkbGVmdCwgJDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZWxzaWYgKC9eXHMqdHlwZWRlZlxzK2VudW1ccysoXHcrKVxzKlx7LyB8fAorICAgICAgICAgICAgICAgICAgIC9eXHMqdHlwZWRlZlxzK2VudW1ccysoXHcrKVxzKiQvKSB7CisgICAgICAgICAgICAgICAgJG1vZGUgPSAkMTsKKyAgICAgICAgICAgICAgICAjcHJpbnQgIlBhcnNpbmcgJG1vZGVcbiI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVsc2lmICgvXlxzKmVudW1ccysoXHcrKVxzKlx7LyB8fAorICAgICAgICAgICAgICAgICAgIC9eXHMqZW51bVxzKyhcdyspXHMqJC8pIHsKKyAgICAgICAgICAgICAgICAkbW9kZSA9ICQxOworICAgICAgICAgICAgICAgICNwcmludCAiUGFyc2luZyAkbW9kZVxuIjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZWxzaWYgKC9eXHMqXCNpZmRlZlxzK0lDVV9VQ0hBUl9VU0VfREVQUkVDQVRFU1xiLykgeworICAgICAgICAgICAgICAgICRtb2RlID0gJ0RFUFJFQ0FURUQnOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgJGluLT5jbG9zZSgpOworCisgICAgIyBoYXJkY29kZSBrbm93biB2YWx1ZXMgZm9yIHRoZSBub3JtYWxpemF0aW9uIHF1aWNrIGNoZWNrIHByb3BlcnRpZXMKKyAgICAjIHNlZSB1bm9ybS5oIGZvciB0aGUgVU5vcm1hbGl6YXRpb25DaGVja1Jlc3VsdCBlbnVtCisKKyAgICBhZGREYXR1bSgkaGFzaCwgJ05GQ19RQycsICdVTk9STV9OTycsICAgICdOJyk7CisgICAgYWRkRGF0dW0oJGhhc2gsICdORkNfUUMnLCAnVU5PUk1fWUVTJywgICAnWScpOworICAgIGFkZERhdHVtKCRoYXNoLCAnTkZDX1FDJywgJ1VOT1JNX01BWUJFJywgJ00nKTsKKworICAgIGFkZERhdHVtKCRoYXNoLCAnTkZLQ19RQycsICdVTk9STV9OTycsICAgICdOJyk7CisgICAgYWRkRGF0dW0oJGhhc2gsICdORktDX1FDJywgJ1VOT1JNX1lFUycsICAgJ1knKTsKKyAgICBhZGREYXR1bSgkaGFzaCwgJ05GS0NfUUMnLCAnVU5PUk1fTUFZQkUnLCAnTScpOworCisgICAgIyBubyAibWF5YmUiIHZhbHVlcyBmb3IgTkZbS11ECisKKyAgICBhZGREYXR1bSgkaGFzaCwgJ05GRF9RQycsICdVTk9STV9OTycsICAgICdOJyk7CisgICAgYWRkRGF0dW0oJGhhc2gsICdORkRfUUMnLCAnVU5PUk1fWUVTJywgICAnWScpOworCisgICAgYWRkRGF0dW0oJGhhc2gsICdORktEX1FDJywgJ1VOT1JNX05PJywgICAgJ04nKTsKKyAgICBhZGREYXR1bSgkaGFzaCwgJ05GS0RfUUMnLCAnVU5PUk1fWUVTJywgICAnWScpOworCisgICAgJGhhc2g7Cit9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEFkZCBhIG5ldyB2YWx1ZSB0byBhIHR3by1sZXZlbCBoYXNoLiAgVGhhdCBpcywgZ2l2ZW4gYSByZWYgdG8KKyMgYSBoYXNoLCB0d28ga2V5cywgYW5kIGEgdmFsdWUsIGFkZCAkaGFzaC0+eyRrZXkxfS0+eyRrZXkyfSA9ICR2YWx1ZS4KK3N1YiBhZGREYXR1bSB7CisgICAgbXkgKCRoLCAkazEsICRrMiwgJHYpID0gQF87CisgICAgaWYgKGV4aXN0cyAkaC0+eyRrMX0tPnskazJ9KSB7CisgICAgICAgIGRpZSAiRXJyb3I6ICRrMTokazIgYWxyZWFkeSBzZXQgdG8gIiAuCisgICAgICAgICAgICAkaC0+eyRrMX0tPnskazJ9IC4gIiwgY2Fubm90IHNldCB0byAiIC4gJHY7CisgICAgfQorICAgICRoLT57JGsxfS0+eyRrMn0gPSAkdjsKK30KKworI2VvZgpkaWZmIC0tZ2l0IGEvdW5pY29kZS9jL2dlbnByb3BzL0NNYWtlTGlzdHMudHh0IGIvdW5pY29kZS9jL2dlbnByb3BzL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZjQ4NTQKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RlL2MvZ2VucHJvcHMvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw5IEBACisjIENvcHlyaWdodCAoQykgMjAxMCwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcworIyBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgY3JlYXRlZCBvbjogMjAxMGp1bjAzCisjIGNyZWF0ZWQgYnk6IE1hcmt1cyBXLiBTY2hlcmVyCisjIGVkaXRlZCBvbjogMjAxMGp1bDIwCisjIGVkaXRlZCBieTogU3R1YXJ0IEcuIEdpbGwKK2FkZF9leGVjdXRhYmxlKGdlbnByb3BzIGdlbnByb3BzLmNwcCBwcm9wczIuY3BwIHN0b3JlLmMpCit0YXJnZXRfbGlua19saWJyYXJpZXMoZ2VucHJvcHMgaWN1dWMgaWN1dHUpCmRpZmYgLS1naXQgYS91bmljb2RlL2MvZ2VucHJvcHMvTWFrZWZpbGUuaW4gYi91bmljb2RlL2MvZ2VucHJvcHMvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg1NmVkZgotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGUvYy9nZW5wcm9wcy9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDk3IEBACisjIyBNYWtlZmlsZS5pbiBmb3IgSUNVIC0gdG9vbHMvZ2VucHJvcHMKKyMjIENvcHlyaWdodCAoYykgMTk5OS0yMDA1LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZAorIyMgb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyMgU3RldmVuIFIuIExvb21pcworCisjIyBTb3VyY2UgZGlyZWN0b3J5IGluZm9ybWF0aW9uCitzcmNkaXIgPSBAc3JjZGlyQAordG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAorCit0b3BfYnVpbGRkaXIgPSAuLi8uLgorCitpbmNsdWRlICQodG9wX2J1aWxkZGlyKS9pY3VkZWZzLm1rCisKKyMjIEJ1aWxkIGRpcmVjdG9yeSBpbmZvcm1hdGlvbgorc3ViZGlyID0gdG9vbHMvZ2VucHJvcHMKKworVEFSR0VUX1NUVUJfTkFNRSA9IGdlbnByb3BzCisKK1NFQ1RJT04gPSA4CisKKyNNQU5fRklMRVMgPSAkKFRBUkdFVF9TVFVCX05BTUUpLiQoU0VDVElPTikKKworCisjIyBFeHRyYSBmaWxlcyB0byByZW1vdmUgZm9yICdtYWtlIGNsZWFuJworQ0xFQU5GSUxFUyA9ICp+ICQoREVQUykgJChNQU5fRklMRVMpCisKKyMjIFRhcmdldCBpbmZvcm1hdGlvbgorVEFSR0VUID0gJChCSU5ESVIpLyQoVEFSR0VUX1NUVUJfTkFNRSkkKEVYRUVYVCkKKworaWZuZXEgKCQodG9wX2J1aWxkZGlyKSwkKHRvcF9zcmNkaXIpKQorQ1BQRkxBR1MgKz0gLUkkKHRvcF9idWlsZGRpcikvY29tbW9uCitlbmRpZgorQ1BQRkxBR1MgKz0gLUkkKHRvcF9zcmNkaXIpL2NvbW1vbiAtSSQoc3JjZGlyKS8uLi90b29sdXRpbAorTElCUyA9ICQoTElCSUNVVE9PTFVUSUwpICQoTElCSUNVSTE4TikgJChMSUJJQ1VVQykgJChERUZBVUxUX0xJQlMpICQoTElCX00pCisKK09CSkVDVFMgPSBnZW5wcm9wcy5vIHByb3BzMi5vIHN0b3JlLm8KKworREVQUyA9ICQoT0JKRUNUUzoubz0uZCkKKworIyMgTGlzdCBvZiBwaG9ueSB0YXJnZXRzCisuUEhPTlkgOiBhbGwgYWxsLWxvY2FsIGluc3RhbGwgaW5zdGFsbC1sb2NhbCBjbGVhbiBjbGVhbi1sb2NhbAlcCitkaXN0Y2xlYW4gZGlzdGNsZWFuLWxvY2FsIGRpc3QgZGlzdC1sb2NhbCBjaGVjayBjaGVjay1sb2NhbCBpbnN0YWxsLW1hbgorCisjIyBDbGVhciBzdWZmaXggbGlzdAorLlNVRkZJWEVTIDoKKworIyMgTGlzdCBvZiBzdGFuZGFyZCB0YXJnZXRzCithbGw6IGFsbC1sb2NhbAoraW5zdGFsbDogaW5zdGFsbC1sb2NhbAorY2xlYW46IGNsZWFuLWxvY2FsCitkaXN0Y2xlYW4gOiBkaXN0Y2xlYW4tbG9jYWwKK2Rpc3Q6IGRpc3QtbG9jYWwKK2NoZWNrOiBhbGwgY2hlY2stbG9jYWwKKworYWxsLWxvY2FsOiAkKFRBUkdFVCkgJChNQU5fRklMRVMpCisKK2luc3RhbGwtbG9jYWw6IGFsbC1sb2NhbCBpbnN0YWxsLW1hbgorIwkkKE1LSU5TVEFMTERJUlMpICQoREVTVERJUikkKHNiaW5kaXIpCisjCSQoSU5TVEFMTCkgJChUQVJHRVQpICQoREVTVERJUikkKHNiaW5kaXIpCisKK2luc3RhbGwtbWFuOiAkKE1BTl9GSUxFUykKKyMJJChNS0lOU1RBTExESVJTKSAkKERFU1RESVIpJChtYW5kaXIpL21hbiQoU0VDVElPTikKKyMJJChJTlNUQUxMX0RBVEEpICQ/ICQoREVTVERJUikkKG1hbmRpcikvbWFuJChTRUNUSU9OKQorCitkaXN0LWxvY2FsOgorCitjbGVhbi1sb2NhbDoKKwl0ZXN0IC16ICIkKENMRUFORklMRVMpIiB8fCAkKFJNVikgJChDTEVBTkZJTEVTKQorCSQoUk1WKSAkKFRBUkdFVCkgJChPQkpFQ1RTKQorCitkaXN0Y2xlYW4tbG9jYWw6IGNsZWFuLWxvY2FsCisJJChSTVYpIE1ha2VmaWxlCisKK2NoZWNrLWxvY2FsOiBhbGwtbG9jYWwKKworTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAgJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKKwljZCAkKHRvcF9idWlsZGRpcikgXAorCSAmJiBDT05GSUdfRklMRVM9JChzdWJkaXIpLyRAIENPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKKworJChUQVJHRVQpIDogJChPQkpFQ1RTKQorCSQoTElOSy5jYykgJChPVVRPUFQpJEAgJF4gJChMSUJTKSAKKwkkKFBPU1RfQlVJTERfU1RFUCkKKworCislLiQoU0VDVElPTik6ICQoc3JjZGlyKS8lLiQoU0VDVElPTikuaW4KKwljZCAkKHRvcF9idWlsZGRpcikgXAorCSAmJiBDT05GSUdfRklMRVM9JChzdWJkaXIpLyRAIENPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKKworCitpZmVxICgsJChNQUtFQ01ER09BTFMpKQorLWluY2x1ZGUgJChERVBTKQorZWxzZQoraWZuZXEgKCQocGF0c3Vic3QgJWNsZWFuLCwkKE1BS0VDTURHT0FMUykpLCkKKy1pbmNsdWRlICQoREVQUykKK2VuZGlmCitlbmRpZgorCmRpZmYgLS1naXQgYS91bmljb2RlL2MvZ2VucHJvcHMvZ2VucHJvcHMuY3BwIGIvdW5pY29kZS9jL2dlbnByb3BzL2dlbnByb3BzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzJkZDZhCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZS9jL2dlbnByb3BzL2dlbnByb3BzLmNwcApAQCAtMCwwICsxLDU5MiBAQAorLyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICBDb3B5cmlnaHQgKEMpIDE5OTktMjAxMCwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcworKiAgIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgIGZpbGUgbmFtZTogIGdlbnByb3BzLmNwcAorKiAgIGVuY29kaW5nOiAgIFVTLUFTQ0lJCisqICAgdGFiIHNpemU6ICAgOCAobm90IHVzZWQpCisqICAgaW5kZW50YXRpb246NAorKgorKiAgIGNyZWF0ZWQgb246IDE5OTlkZWMwOAorKiAgIGNyZWF0ZWQgYnk6IE1hcmt1cyBXLiBTY2hlcmVyCisqCisqICAgVGhpcyBwcm9ncmFtIHJlYWRzIHNldmVyYWwgb2YgdGhlIFVuaWNvZGUgY2hhcmFjdGVyIGRhdGFiYXNlIHRleHQgZmlsZXMsCisqICAgcGFyc2VzIHRoZW0sIGFuZCBleHRyYWN0cyBtb3N0IG9mIHRoZSBwcm9wZXJ0aWVzIGZvciBlYWNoIGNoYXJhY3Rlci4KKyogICBJdCB0aGVuIHdyaXRlcyBhIGJpbmFyeSBmaWxlIGNvbnRhaW5pbmcgdGhlIHByb3BlcnRpZXMKKyogICB0aGF0IGlzIGRlc2lnbmVkIHRvIGJlIHVzZWQgZGlyZWN0bHkgZm9yIHJhbmRvbS1hY2Nlc3MgdG8KKyogICB0aGUgcHJvcGVydGllcyBvZiBlYWNoIFVuaWNvZGUgY2hhcmFjdGVyLgorKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAidW5pY29kZS91dHlwZXMuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3VjaGFyLmgiCisjaW5jbHVkZSAidW5pY29kZS9wdXRpbC5oIgorI2luY2x1ZGUgInVuaWNvZGUvdWNsZWFuLmgiCisjaW5jbHVkZSAiY21lbW9yeS5oIgorI2luY2x1ZGUgImNzdHJpbmcuaCIKKyNpbmNsdWRlICJ1bmV3ZGF0YS5oIgorI2luY2x1ZGUgInVvcHRpb25zLmgiCisjaW5jbHVkZSAidXBhcnNlLmgiCisjaW5jbHVkZSAidXByb3BzLmgiCisjaW5jbHVkZSAicHJvcHN2ZWMuaCIKKworVV9DREVDTF9CRUdJTgorI2luY2x1ZGUgImdlbnByb3BzLmgiCitVX0NERUNMX0VORAorCisjZGVmaW5lIExFTkdUSE9GKGFycmF5KSAoc2l6ZW9mKGFycmF5KS9zaXplb2YoKGFycmF5KVswXSkpCisKK1VfTkFNRVNQQUNFX1VTRQorCitVQm9vbCBiZVZlcmJvc2U9RkFMU0UsIGhhdmVDb3B5cmlnaHQ9VFJVRTsKKworLyogcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQKK3BhcnNlREIoY29uc3QgY2hhciAqZmlsZW5hbWUsIFVFcnJvckNvZGUgKnBFcnJvckNvZGUpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitlbnVtCit7CisgICAgSEVMUF9ILAorICAgIEhFTFBfUVVFU1RJT05fTUFSSywKKyAgICBWRVJCT1NFLAorICAgIENPUFlSSUdIVCwKKyAgICBERVNURElSLAorICAgIFNPVVJDRURJUiwKKyAgICBVTklDT0RFX1ZFUlNJT04sCisgICAgSUNVREFUQURJUiwKKyAgICBDU09VUkNFCit9OworCisvKiBLZWVwIHRoZXNlIHZhbHVlcyBpbiBzeW5jIHdpdGggdGhlIGFib3ZlIGVudW1zICovCitzdGF0aWMgVU9wdGlvbiBvcHRpb25zW109eworICAgIFVPUFRJT05fSEVMUF9ILAorICAgIFVPUFRJT05fSEVMUF9RVUVTVElPTl9NQVJLLAorICAgIFVPUFRJT05fVkVSQk9TRSwKKyAgICBVT1BUSU9OX0NPUFlSSUdIVCwKKyAgICBVT1BUSU9OX0RFU1RESVIsCisgICAgVU9QVElPTl9TT1VSQ0VESVIsCisgICAgVU9QVElPTl9ERUYoInVuaWNvZGUiLCAndScsIFVPUFRfUkVRVUlSRVNfQVJHKSwKKyAgICBVT1BUSU9OX0lDVURBVEFESVIsCisgICAgVU9QVElPTl9ERUYoImNzb3VyY2UiLCAnQycsIFVPUFRfTk9fQVJHKQorfTsKKworZXh0ZXJuIGludAorbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisgICAgY2hhciBmaWxlbmFtZVszMDBdOworICAgIGNvbnN0IGNoYXIgKnNyY0Rpcj1OVUxMLCAqZGVzdERpcj1OVUxMLCAqc3VmZml4PU5VTEw7CisgICAgY2hhciAqYmFzZW5hbWU9TlVMTDsKKyAgICBVRXJyb3JDb2RlIGVycm9yQ29kZT1VX1pFUk9fRVJST1I7CisKKyAgICBVX01BSU5fSU5JVF9BUkdTKGFyZ2MsIGFyZ3YpOworCisgICAgLyogcHJlc2V0IHRoZW4gcmVhZCBjb21tYW5kIGxpbmUgb3B0aW9ucyAqLworICAgIG9wdGlvbnNbREVTVERJUl0udmFsdWU9dV9nZXREYXRhRGlyZWN0b3J5KCk7CisgICAgb3B0aW9uc1tTT1VSQ0VESVJdLnZhbHVlPSIiOworICAgIG9wdGlvbnNbVU5JQ09ERV9WRVJTSU9OXS52YWx1ZT0iIjsKKyAgICBvcHRpb25zW0lDVURBVEFESVJdLnZhbHVlPXVfZ2V0RGF0YURpcmVjdG9yeSgpOworICAgIGFyZ2M9dV9wYXJzZUFyZ3MoYXJnYywgYXJndiwgc2l6ZW9mKG9wdGlvbnMpL3NpemVvZihvcHRpb25zWzBdKSwgb3B0aW9ucyk7CisKKyAgICAvKiBlcnJvciBoYW5kbGluZywgcHJpbnRpbmcgdXNhZ2UgbWVzc2FnZSAqLworICAgIGlmKGFyZ2M8MCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICJlcnJvciBpbiBjb21tYW5kIGxpbmUgYXJndW1lbnQgXCIlc1wiXG4iLAorICAgICAgICAgICAgYXJndlstYXJnY10pOworICAgIH0KKyAgICBpZihhcmdjPDAgfHwgb3B0aW9uc1tIRUxQX0hdLmRvZXNPY2N1ciB8fCBvcHRpb25zW0hFTFBfUVVFU1RJT05fTUFSS10uZG9lc09jY3VyKSB7CisgICAgICAgIC8qCisgICAgICAgICAqIEJyb2tlbiBpbnRvIGNodWNrcyBiZWNhdXNlIHRoZSBDODkgc3RhbmRhcmQgc2F5cyB0aGUgbWluaW11bQorICAgICAgICAgKiByZXF1aXJlZCBzdXBwb3J0ZWQgc3RyaW5nIGxlbmd0aCBpcyA1MDkgYnl0ZXMuCisgICAgICAgICAqLworICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICJVc2FnZTogJXMgWy1vcHRpb25zXSBbc3VmZml4XVxuIgorICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgInJlYWQgdGhlIFVuaWNvZGVEYXRhLnR4dCBmaWxlIGFuZCBvdGhlciBVbmljb2RlIHByb3BlcnRpZXMgZmlsZXMgYW5kXG4iCisgICAgICAgICAgICAiY3JlYXRlIGEgYmluYXJ5IGZpbGUgIiBEQVRBX05BTUUgIi4iIERBVEFfVFlQRSAiIHdpdGggdGhlIGNoYXJhY3RlciBwcm9wZXJ0aWVzXG4iCisgICAgICAgICAgICAiXG4iLAorICAgICAgICAgICAgYXJndlswXSk7CisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgIk9wdGlvbnM6XG4iCisgICAgICAgICAgICAiXHQtaCBvciAtPyBvciAtLWhlbHAgIHRoaXMgdXNhZ2UgdGV4dFxuIgorICAgICAgICAgICAgIlx0LXYgb3IgLS12ZXJib3NlICAgICB2ZXJib3NlIG91dHB1dFxuIgorICAgICAgICAgICAgIlx0LWMgb3IgLS1jb3B5cmlnaHQgICBpbmNsdWRlIGEgY29weXJpZ2h0IG5vdGljZVxuIgorICAgICAgICAgICAgIlx0LXUgb3IgLS11bmljb2RlICAgICBVbmljb2RlIHZlcnNpb24sIGZvbGxvd2VkIGJ5IHRoZSB2ZXJzaW9uIGxpa2UgMy4wLjBcbiIKKyAgICAgICAgICAgICJcdC1DIG9yIC0tY3NvdXJjZSAgICAgZ2VuZXJhdGUgYSAuYyBzb3VyY2UgZmlsZSByYXRoZXIgdGhhbiB0aGUgLmljdSBiaW5hcnlcbiIpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICJcdC1kIG9yIC0tZGVzdGRpciAgICAgZGVzdGluYXRpb24gZGlyZWN0b3J5LCBmb2xsb3dlZCBieSB0aGUgcGF0aFxuIgorICAgICAgICAgICAgIlx0LXMgb3IgLS1zb3VyY2VkaXIgICBzb3VyY2UgZGlyZWN0b3J5LCBmb2xsb3dlZCBieSB0aGUgcGF0aFxuIgorICAgICAgICAgICAgIlx0LWkgb3IgLS1pY3VkYXRhZGlyICBkaXJlY3RvcnkgZm9yIGxvY2F0aW5nIGFueSBuZWVkZWQgaW50ZXJtZWRpYXRlIGRhdGEgZmlsZXMsXG4iCisgICAgICAgICAgICAiXHQgICAgICAgICAgICAgICAgICAgIGZvbGxvd2VkIGJ5IHBhdGgsIGRlZmF1bHRzIHRvICVzXG4iCisgICAgICAgICAgICAiXHRzdWZmaXggICAgICAgICAgICAgIHN1ZmZpeCB0aGF0IGlzIHRvIGJlIGFwcGVuZGVkIHdpdGggYSAnLSdcbiIKKyAgICAgICAgICAgICJcdCAgICAgICAgICAgICAgICAgICAgdG8gdGhlIHNvdXJjZSBmaWxlIGJhc2VuYW1lcyBiZWZvcmUgb3BlbmluZztcbiIKKyAgICAgICAgICAgICJcdCAgICAgICAgICAgICAgICAgICAgJ2dlbnByb3BzIG5ldycgd2lsbCByZWFkIFVuaWNvZGVEYXRhLW5ldy50eHQgZXRjLlxuIiwKKyAgICAgICAgICAgIHVfZ2V0RGF0YURpcmVjdG9yeSgpKTsKKyAgICAgICAgcmV0dXJuIGFyZ2M8MCA/IFVfSUxMRUdBTF9BUkdVTUVOVF9FUlJPUiA6IFVfWkVST19FUlJPUjsKKyAgICB9CisKKyAgICAvKiBnZXQgdGhlIG9wdGlvbnMgdmFsdWVzICovCisgICAgYmVWZXJib3NlPW9wdGlvbnNbVkVSQk9TRV0uZG9lc09jY3VyOworICAgIGhhdmVDb3B5cmlnaHQ9b3B0aW9uc1tDT1BZUklHSFRdLmRvZXNPY2N1cjsKKyAgICBzcmNEaXI9b3B0aW9uc1tTT1VSQ0VESVJdLnZhbHVlOworICAgIGRlc3REaXI9b3B0aW9uc1tERVNURElSXS52YWx1ZTsKKworICAgIGlmKGFyZ2M+PTIpIHsKKyAgICAgICAgc3VmZml4PWFyZ3ZbMV07CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3VmZml4PU5VTEw7CisgICAgfQorCisgICAgaWYob3B0aW9uc1tVTklDT0RFX1ZFUlNJT05dLmRvZXNPY2N1cikgeworICAgICAgICBzZXRVbmljb2RlVmVyc2lvbihvcHRpb25zW1VOSUNPREVfVkVSU0lPTl0udmFsdWUpOworICAgIH0KKyAgICAvKiBlbHNlIHVzZSB0aGUgZGVmYXVsdCBkYXRhVmVyc2lvbiBpbiBzdG9yZS5jICovCisKKyAgICBpZiAob3B0aW9uc1tJQ1VEQVRBRElSXS5kb2VzT2NjdXIpIHsKKyAgICAgICAgdV9zZXREYXRhRGlyZWN0b3J5KG9wdGlvbnNbSUNVREFUQURJUl0udmFsdWUpOworICAgIH0KKworICAgIC8qIHByZXBhcmUgdGhlIGZpbGVuYW1lIGJlZ2lubmluZyB3aXRoIHRoZSBzb3VyY2UgZGlyICovCisgICAgdXBydl9zdHJjcHkoZmlsZW5hbWUsIHNyY0Rpcik7CisgICAgYmFzZW5hbWU9ZmlsZW5hbWUrdXBydl9zdHJsZW4oZmlsZW5hbWUpOworICAgIGlmKGJhc2VuYW1lPmZpbGVuYW1lICYmICooYmFzZW5hbWUtMSkhPVVfRklMRV9TRVBfQ0hBUikgeworICAgICAgICAqYmFzZW5hbWUrKz1VX0ZJTEVfU0VQX0NIQVI7CisgICAgfQorCisgICAgLyogaW5pdGlhbGl6ZSAqLworICAgIGluaXRTdG9yZSgpOworCisgICAgLyogcHJvY2VzcyBVbmljb2RlRGF0YS50eHQgKi8KKyAgICB3cml0ZVVDREZpbGVuYW1lKGJhc2VuYW1lLCAiVW5pY29kZURhdGEiLCBzdWZmaXgpOworICAgIHBhcnNlREIoZmlsZW5hbWUsICZlcnJvckNvZGUpOworCisgICAgLyogcHJvY2VzcyBhZGRpdGlvbmFsIHByb3BlcnRpZXMgZmlsZXMgKi8KKyAgICAqYmFzZW5hbWU9MDsKKyAgICBnZW5lcmF0ZUFkZGl0aW9uYWxQcm9wZXJ0aWVzKGZpbGVuYW1lLCBzdWZmaXgsICZlcnJvckNvZGUpOworCisgICAgLyogcHJvY2VzcyBwYXJzZWQgZGF0YSAqLworICAgIGlmKFVfU1VDQ0VTUyhlcnJvckNvZGUpKSB7CisgICAgICAgIC8qIHdyaXRlIHRoZSBwcm9wZXJ0aWVzIGRhdGEgZmlsZSAqLworICAgICAgICBnZW5lcmF0ZURhdGEoZGVzdERpciwgb3B0aW9uc1tDU09VUkNFXS5kb2VzT2NjdXIpOworICAgIH0KKworICAgIGV4aXRTdG9yZSgpOworICAgIHVfY2xlYW51cCgpOworICAgIHJldHVybiBlcnJvckNvZGU7Cit9CisKK1VfQ0ZVTkMgdm9pZAord3JpdGVVQ0RGaWxlbmFtZShjaGFyICpiYXNlbmFtZSwgY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKnN1ZmZpeCkgeworICAgIGludDMyX3QgbGVuZ3RoPShpbnQzMl90KXVwcnZfc3RybGVuKGZpbGVuYW1lKTsKKyAgICB1cHJ2X3N0cmNweShiYXNlbmFtZSwgZmlsZW5hbWUpOworICAgIGlmKHN1ZmZpeCE9TlVMTCkgeworICAgICAgICBiYXNlbmFtZVtsZW5ndGgrK109Jy0nOworICAgICAgICB1cHJ2X3N0cmNweShiYXNlbmFtZStsZW5ndGgsIHN1ZmZpeCk7CisgICAgICAgIGxlbmd0aCs9KGludDMyX3QpdXBydl9zdHJsZW4oc3VmZml4KTsKKyAgICB9CisgICAgdXBydl9zdHJjcHkoYmFzZW5hbWUrbGVuZ3RoLCAiLnR4dCIpOworfQorCitVX0NGVU5DIFVCb29sCitpc1Rva2VuKGNvbnN0IGNoYXIgKnRva2VuLCBjb25zdCBjaGFyICpzKSB7CisgICAgY29uc3QgY2hhciAqejsKKyAgICBpbnQzMl90IGo7CisKKyAgICBzPXVfc2tpcFdoaXRlc3BhY2Uocyk7CisgICAgZm9yKGo9MDs7ICsraikgeworICAgICAgICBpZih0b2tlbltqXSE9MCkgeworICAgICAgICAgICAgaWYoc1tqXSE9dG9rZW5bal0pIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHo9dV9za2lwV2hpdGVzcGFjZShzK2opOworICAgICAgICAgICAgaWYoKno9PSc7JyB8fCAqej09MCkgeworICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBGQUxTRTsKK30KKworVV9DRlVOQyBpbnQzMl90CitnZXRUb2tlbkluZGV4KGNvbnN0IGNoYXIgKmNvbnN0IHRva2Vuc1tdLCBpbnQzMl90IGNvdW50VG9rZW5zLCBjb25zdCBjaGFyICpzKSB7CisgICAgY29uc3QgY2hhciAqdCwgKno7CisgICAgaW50MzJfdCBpLCBqOworCisgICAgcz11X3NraXBXaGl0ZXNwYWNlKHMpOworICAgIGZvcihpPTA7IGk8Y291bnRUb2tlbnM7ICsraSkgeworICAgICAgICB0PXRva2Vuc1tpXTsKKyAgICAgICAgaWYodCE9TlVMTCkgeworICAgICAgICAgICAgZm9yKGo9MDs7ICsraikgeworICAgICAgICAgICAgICAgIGlmKHRbal0hPTApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoc1tqXSE9dFtqXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB6PXVfc2tpcFdoaXRlc3BhY2UocytqKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoKno9PSc7JyB8fCAqej09MCB8fCAqej09JyMnIHx8ICp6PT0nXHInIHx8ICp6PT0nXG4nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworLyogcGFyc2VyIGZvciBVbmljb2RlRGF0YS50eHQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogZ2VuZXJhbCBjYXRlZ29yaWVzICovCitjb25zdCBjaGFyICpjb25zdAorZ2VuQ2F0ZWdvcnlOYW1lc1tVX0NIQVJfQ0FURUdPUllfQ09VTlRdPXsKKyAgICAiQ24iLAorICAgICJMdSIsICJMbCIsICJMdCIsICJMbSIsICJMbyIsICJNbiIsICJNZSIsCisgICAgIk1jIiwgIk5kIiwgIk5sIiwgIk5vIiwKKyAgICAiWnMiLCAiWmwiLCAiWnAiLAorICAgICJDYyIsICJDZiIsICJDbyIsICJDcyIsCisgICAgIlBkIiwgIlBzIiwgIlBlIiwgIlBjIiwgIlBvIiwKKyAgICAiU20iLCAiU2MiLCAiU2siLCAiU28iLAorICAgICJQaSIsICJQZiIKK307CisKK2NvbnN0IGNoYXIgKmNvbnN0CitkZWNvbXBvc2l0aW9uVHlwZU5hbWVzW1VfRFRfQ09VTlRdPXsKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgImNvbXBhdCIsCisgICAgImNpcmNsZSIsCisgICAgImZpbmFsIiwKKyAgICAiZm9udCIsCisgICAgImZyYWN0aW9uIiwKKyAgICAiaW5pdGlhbCIsCisgICAgImlzb2xhdGVkIiwKKyAgICAibWVkaWFsIiwKKyAgICAibmFycm93IiwKKyAgICAibm9CcmVhayIsCisgICAgInNtYWxsIiwKKyAgICAic3F1YXJlIiwKKyAgICAic3ViIiwKKyAgICAic3VwZXIiLAorICAgICJ2ZXJ0aWNhbCIsCisgICAgIndpZGUiCit9OworCitzdGF0aWMgc3RydWN0IHsKKyAgICB1aW50MzJfdCBmaXJzdCwgbGFzdCwgcHJvcHM7CisgICAgY2hhciBuYW1lWzgwXTsKK30gdW5pY29kZUFyZWFzWzMyXTsKKworc3RhdGljIGludDMyX3QgdW5pY29kZUFyZWFJbmRleD0wOworCitzdGF0aWMgdm9pZCBVX0NBTExDT05WCit1bmljb2RlRGF0YUxpbmVGbih2b2lkICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgY2hhciAqZmllbGRzW11bMl0sIGludDMyX3QgZmllbGRDb3VudCwKKyAgICAgICAgICAgICAgICAgIFVFcnJvckNvZGUgKnBFcnJvckNvZGUpIHsKKyAgICBQcm9wcyBwOworICAgIGNoYXIgKmVuZDsKKyAgICBzdGF0aWMgdWludDMyX3QgcHJldkNvZGU9MDsKKyAgICB1aW50MzJfdCB2YWx1ZTsKKyAgICBpbnQzMl90IGk7CisKKyAgICAvKiByZXNldCB0aGUgcHJvcGVydGllcyAqLworICAgIHVwcnZfbWVtc2V0KCZwLCAwLCBzaXplb2YoUHJvcHMpKTsKKworICAgIC8qIGdldCB0aGUgY2hhcmFjdGVyIGNvZGUsIGZpZWxkIDAgKi8KKyAgICBwLmNvZGU9KHVpbnQzMl90KXVwcnZfc3RydG91bChmaWVsZHNbMF1bMF0sICZlbmQsIDE2KTsKKyAgICBpZihlbmQ8PWZpZWxkc1swXVswXSB8fCBlbmQhPWZpZWxkc1swXVsxXSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbnByb3BzOiBzeW50YXggZXJyb3IgaW4gZmllbGQgMCBhdCAlc1xuIiwgZmllbGRzWzBdWzBdKTsKKyAgICAgICAgKnBFcnJvckNvZGU9VV9QQVJTRV9FUlJPUjsKKyAgICAgICAgZXhpdChVX1BBUlNFX0VSUk9SKTsKKyAgICB9CisKKyAgICAvKiBnZXQgZ2VuZXJhbCBjYXRlZ29yeSwgZmllbGQgMiAqLworICAgIGk9Z2V0VG9rZW5JbmRleChnZW5DYXRlZ29yeU5hbWVzLCBVX0NIQVJfQ0FURUdPUllfQ09VTlQsIGZpZWxkc1syXVswXSk7CisgICAgaWYoaT49MCkgeworICAgICAgICBwLmdlbmVyYWxDYXRlZ29yeT0odWludDhfdClpOworICAgIH0gZWxzZSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2VucHJvcHM6IHVua25vd24gZ2VuZXJhbCBjYXRlZ29yeSBcIiVzXCIgYXQgY29kZSAweCVseFxuIiwKKyAgICAgICAgICAgIGZpZWxkc1syXVswXSwgKHVuc2lnbmVkIGxvbmcpcC5jb2RlKTsKKyAgICAgICAgKnBFcnJvckNvZGU9VV9QQVJTRV9FUlJPUjsKKyAgICAgICAgZXhpdChVX1BBUlNFX0VSUk9SKTsKKyAgICB9CisKKyAgICAvKiBnZXQgZGVjb21wb3NpdGlvbiB0eXBlLCBmaWVsZCA1ICovCisgICAgaWYoZmllbGRzWzVdWzBdPGZpZWxkc1s1XVsxXSkgeworICAgICAgICAvKiB0aGVyZSBpcyBzb21lIGRlY29tcG9zaXRpb24gKi8KKyAgICAgICAgaWYoKmZpZWxkc1s1XVswXSE9JzwnKSB7CisgICAgICAgICAgICAvKiBjYW5vbmljYWwgKi8KKyAgICAgICAgICAgIGk9VV9EVF9DQU5PTklDQUw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBnZXQgY29tcGF0aWJpbGl0eSB0eXBlICovCisgICAgICAgICAgICBlbmQ9ZmllbGRzWzVdWzBdKzE7CisgICAgICAgICAgICB3aGlsZShlbmQ8ZmllbGRzWzVdWzFdICYmICplbmQhPSc+JykgeworICAgICAgICAgICAgICAgICsrZW5kOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKmVuZD0nIyc7CisgICAgICAgICAgICBpPWdldFRva2VuSW5kZXgoZGVjb21wb3NpdGlvblR5cGVOYW1lcywgVV9EVF9DT1VOVCwgZmllbGRzWzVdWzBdKzEpOworICAgICAgICAgICAgaWYoaTwwKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5wcm9wczogdW5rbm93biBkZWNvbXBvc2l0aW9uIHR5cGUgXCIlc1wiIGF0IGNvZGUgMHglbHhcbiIsCisgICAgICAgICAgICAgICAgICAgIGZpZWxkc1s1XVswXSwgKHVuc2lnbmVkIGxvbmcpcC5jb2RlKTsKKyAgICAgICAgICAgICAgICAqcEVycm9yQ29kZT1VX1BBUlNFX0VSUk9SOworICAgICAgICAgICAgICAgIGV4aXQoVV9QQVJTRV9FUlJPUik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdXB2ZWNfc2V0VmFsdWUocHYsIHAuY29kZSwgcC5jb2RlLCAyLCAodWludDMyX3QpaSwgVVBST1BTX0RUX01BU0ssIHBFcnJvckNvZGUpOworICAgICAgICBpZihVX0ZBSUxVUkUoKnBFcnJvckNvZGUpKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbnByb3BzIGVycm9yOiB1bmFibGUgdG8gc2V0IGRlY29tcG9zaXRpb24gdHlwZTogJXNcbiIsIHVfZXJyb3JOYW1lKCpwRXJyb3JDb2RlKSk7CisgICAgICAgICAgICBleGl0KCpwRXJyb3JDb2RlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGRlY2ltYWwgZGlnaXQgdmFsdWUsIGZpZWxkIDYgKi8KKyAgICBpZihmaWVsZHNbNl1bMF08ZmllbGRzWzZdWzFdKSB7CisgICAgICAgIHZhbHVlPSh1aW50MzJfdCl1cHJ2X3N0cnRvdWwoZmllbGRzWzZdWzBdLCAmZW5kLCAxMCk7CisgICAgICAgIGlmKGVuZCE9ZmllbGRzWzZdWzFdIHx8IHZhbHVlPjB4N2ZmZikgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5wcm9wczogc3ludGF4IGVycm9yIGluIGZpZWxkIDYgYXQgY29kZSAweCVseFxuIiwKKyAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylwLmNvZGUpOworICAgICAgICAgICAgKnBFcnJvckNvZGU9VV9QQVJTRV9FUlJPUjsKKyAgICAgICAgICAgIGV4aXQoVV9QQVJTRV9FUlJPUik7CisgICAgICAgIH0KKyAgICAgICAgcC5udW1lcmljVmFsdWU9KGludDMyX3QpdmFsdWU7CisgICAgICAgIHAubnVtZXJpY1R5cGU9MTsKKyAgICB9CisKKyAgICAvKiBkaWdpdCB2YWx1ZSwgZmllbGQgNyAqLworICAgIGlmKGZpZWxkc1s3XVswXTxmaWVsZHNbN11bMV0pIHsKKyAgICAgICAgdmFsdWU9KHVpbnQzMl90KXVwcnZfc3RydG91bChmaWVsZHNbN11bMF0sICZlbmQsIDEwKTsKKyAgICAgICAgaWYoZW5kIT1maWVsZHNbN11bMV0gfHwgdmFsdWU+MHg3ZmZmKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbnByb3BzOiBzeW50YXggZXJyb3IgaW4gZmllbGQgNyBhdCBjb2RlIDB4JWx4XG4iLAorICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKXAuY29kZSk7CisgICAgICAgICAgICAqcEVycm9yQ29kZT1VX1BBUlNFX0VSUk9SOworICAgICAgICAgICAgZXhpdChVX1BBUlNFX0VSUk9SKTsKKyAgICAgICAgfQorICAgICAgICBpZihwLm51bWVyaWNUeXBlPT0wKSB7CisgICAgICAgICAgICBwLm51bWVyaWNWYWx1ZT0oaW50MzJfdCl2YWx1ZTsKKyAgICAgICAgICAgIHAubnVtZXJpY1R5cGU9MjsKKyAgICAgICAgfSBlbHNlIGlmKChpbnQzMl90KXZhbHVlIT1wLm51bWVyaWNWYWx1ZSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5wcm9wcyBlcnJvcjogbnVtZXJpYyB2YWx1ZXMgaW4gZmllbGRzIDYgJiA3IGRpZmZlcmVudCBhdCBjb2RlIDB4JWx4XG4iLAorICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKXAuY29kZSk7CisgICAgICAgICAgICAqcEVycm9yQ29kZT1VX1BBUlNFX0VSUk9SOworICAgICAgICAgICAgZXhpdChVX1BBUlNFX0VSUk9SKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIG51bWVyaWMgdmFsdWUsIGZpZWxkIDggKi8KKyAgICBpZihmaWVsZHNbOF1bMF08ZmllbGRzWzhdWzFdKSB7CisgICAgICAgIGNoYXIgKnM9ZmllbGRzWzhdWzBdOworICAgICAgICBVQm9vbCBpc05lZ2F0aXZlOworCisgICAgICAgIC8qIGdldCBhIHBvc3NpYmxlIG1pbnVzIHNpZ24gKi8KKyAgICAgICAgaWYoKnM9PSctJykgeworICAgICAgICAgICAgaXNOZWdhdGl2ZT1UUlVFOworICAgICAgICAgICAgKytzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaXNOZWdhdGl2ZT1GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIHZhbHVlPSh1aW50MzJfdCl1cHJ2X3N0cnRvdWwocywgJmVuZCwgMTApOworICAgICAgICBpZih2YWx1ZT4wICYmICplbmQ9PScvJykgeworICAgICAgICAgICAgLyogZmllbGQgOCBtYXkgY29udGFpbiBhIGZyYWN0aW9uYWwgdmFsdWUsIGdldCB0aGUgZGVub21pbmF0b3IgKi8KKyAgICAgICAgICAgIGlmKHAubnVtZXJpY1R5cGU+MCkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2VucHJvcHMgZXJyb3I6IG51bWVyaWMgdmFsdWVzIGluIGZpZWxkcyA2Li44IGRpZmZlcmVudCBhdCBjb2RlIDB4JWx4XG4iLAorICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylwLmNvZGUpOworICAgICAgICAgICAgICAgICpwRXJyb3JDb2RlPVVfUEFSU0VfRVJST1I7CisgICAgICAgICAgICAgICAgZXhpdChVX1BBUlNFX0VSUk9SKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcC5kZW5vbWluYXRvcj0odWludDMyX3QpdXBydl9zdHJ0b3VsKGVuZCsxLCAmZW5kLCAxMCk7CisgICAgICAgICAgICBpZihwLmRlbm9taW5hdG9yPT0wKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5wcm9wczogZGVub21pbmF0b3IgaXMgMCBpbiBmaWVsZCA4IGF0IGNvZGUgMHglbHhcbiIsCisgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKXAuY29kZSk7CisgICAgICAgICAgICAgICAgKnBFcnJvckNvZGU9VV9QQVJTRV9FUlJPUjsKKyAgICAgICAgICAgICAgICBleGl0KFVfUEFSU0VfRVJST1IpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmKGVuZCE9ZmllbGRzWzhdWzFdIHx8IHZhbHVlPjB4N2ZmZmZmZmYpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2VucHJvcHM6IHN5bnRheCBlcnJvciBpbiBmaWVsZCA4IGF0IGNvZGUgMHglbHhcbiIsCisgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpcC5jb2RlKTsKKyAgICAgICAgICAgICpwRXJyb3JDb2RlPVVfUEFSU0VfRVJST1I7CisgICAgICAgICAgICBleGl0KFVfUEFSU0VfRVJST1IpOworICAgICAgICB9CisKKyAgICAgICAgaWYocC5udW1lcmljVHlwZT09MCkgeworICAgICAgICAgICAgaWYoaXNOZWdhdGl2ZSkgeworICAgICAgICAgICAgICAgIHAubnVtZXJpY1ZhbHVlPS0oaW50MzJfdCl2YWx1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcC5udW1lcmljVmFsdWU9KGludDMyX3QpdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwLm51bWVyaWNUeXBlPTM7CisgICAgICAgIH0gZWxzZSBpZigoaW50MzJfdCl2YWx1ZSE9cC5udW1lcmljVmFsdWUpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2VucHJvcHMgZXJyb3I6IG51bWVyaWMgdmFsdWVzIGluIGZpZWxkcyA2Li44IGRpZmZlcmVudCBhdCBjb2RlIDB4JWx4XG4iLAorICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKXAuY29kZSk7CisgICAgICAgICAgICAqcEVycm9yQ29kZT1VX1BBUlNFX0VSUk9SOworICAgICAgICAgICAgZXhpdChVX1BBUlNFX0VSUk9SKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZhbHVlPW1ha2VQcm9wcygmcCk7CisKKyAgICBpZigqZmllbGRzWzFdWzBdPT0nPCcpIHsKKyAgICAgICAgLyogZmlyc3Qgb3IgbGFzdCBlbnRyeSBvZiBhIFVuaWNvZGUgYXJlYSAqLworICAgICAgICBzaXplX3QgbGVuZ3RoPWZpZWxkc1sxXVsxXS1maWVsZHNbMV1bMF07CisKKyAgICAgICAgaWYobGVuZ3RoPDkpIHsKKyAgICAgICAgICAgIC8qIG5hbWUgdG9vIHNob3J0IGZvciBhbiBhcmVhIG5hbWUgKi8KKyAgICAgICAgfSBlbHNlIGlmKDA9PXVwcnZfbWVtY21wKCIsIEZpcnN0PiIsIGZpZWxkc1sxXVsxXS04LCA4KSkgeworICAgICAgICAgICAgLyogc2V0IHRoZSBjdXJyZW50IGFyZWEgKi8KKyAgICAgICAgICAgIGlmKHVuaWNvZGVBcmVhc1t1bmljb2RlQXJlYUluZGV4XS5maXJzdD09MHhmZmZmZmZmZikgeworICAgICAgICAgICAgICAgIGxlbmd0aC09OTsKKyAgICAgICAgICAgICAgICB1bmljb2RlQXJlYXNbdW5pY29kZUFyZWFJbmRleF0uZmlyc3Q9cC5jb2RlOworICAgICAgICAgICAgICAgIHVuaWNvZGVBcmVhc1t1bmljb2RlQXJlYUluZGV4XS5wcm9wcz12YWx1ZTsKKyAgICAgICAgICAgICAgICB1cHJ2X21lbWNweSh1bmljb2RlQXJlYXNbdW5pY29kZUFyZWFJbmRleF0ubmFtZSwgZmllbGRzWzFdWzBdKzEsIGxlbmd0aCk7CisgICAgICAgICAgICAgICAgdW5pY29kZUFyZWFzW3VuaWNvZGVBcmVhSW5kZXhdLm5hbWVbbGVuZ3RoXT0wOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBlcnJvcjogYSBwcmV2aW91cyBhcmVhIGlzIGluY29tcGxldGUgKi8KKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbnByb3BzOiBlcnJvciAtIGFyZWEgXCIlc1wiIGlzIGluY29tcGxldGVcbiIsIHVuaWNvZGVBcmVhc1t1bmljb2RlQXJlYUluZGV4XS5uYW1lKTsKKyAgICAgICAgICAgICAgICAqcEVycm9yQ29kZT1VX1BBUlNFX0VSUk9SOworICAgICAgICAgICAgICAgIGV4aXQoVV9QQVJTRV9FUlJPUik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZigwPT11cHJ2X21lbWNtcCgiLCBMYXN0PiIsIGZpZWxkc1sxXVsxXS03LCA3KSkgeworICAgICAgICAgICAgLyogY2hlY2sgdGhhdCB0aGUgY3VycmVudCBhcmVhIG1hdGNoZXMsIGFuZCBjb21wbGV0ZSBpdCB3aXRoIHRoZSBsYXN0IGNvZGUgcG9pbnQgKi8KKyAgICAgICAgICAgIGxlbmd0aC09ODsKKyAgICAgICAgICAgIGlmKCB1bmljb2RlQXJlYXNbdW5pY29kZUFyZWFJbmRleF0ucHJvcHM9PXZhbHVlICYmCisgICAgICAgICAgICAgICAgMD09dXBydl9tZW1jbXAodW5pY29kZUFyZWFzW3VuaWNvZGVBcmVhSW5kZXhdLm5hbWUsIGZpZWxkc1sxXVswXSsxLCBsZW5ndGgpICYmCisgICAgICAgICAgICAgICAgdW5pY29kZUFyZWFzW3VuaWNvZGVBcmVhSW5kZXhdLm5hbWVbbGVuZ3RoXT09MCAmJgorICAgICAgICAgICAgICAgIHVuaWNvZGVBcmVhc1t1bmljb2RlQXJlYUluZGV4XS5maXJzdDxwLmNvZGUKKyAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgIHVuaWNvZGVBcmVhc1t1bmljb2RlQXJlYUluZGV4XS5sYXN0PXAuY29kZTsKKyAgICAgICAgICAgICAgICBpZihiZVZlcmJvc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJVbmljb2RlIGFyZWEgVSslMDRseC4uVSslMDRseCBcIiVzXCJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyl1bmljb2RlQXJlYXNbdW5pY29kZUFyZWFJbmRleF0uZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyl1bmljb2RlQXJlYXNbdW5pY29kZUFyZWFJbmRleF0ubGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuaWNvZGVBcmVhc1t1bmljb2RlQXJlYUluZGV4XS5uYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdW5pY29kZUFyZWFzWysrdW5pY29kZUFyZWFJbmRleF0uZmlyc3Q9MHhmZmZmZmZmZjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogZXJyb3I6IGRpZmZlcmVudCBwcm9wZXJ0aWVzIGJldHdlZW4gZmlyc3QgJiBsYXN0LCBkaWZmZXJlbnQgYXJlYSBuYW1lLCBmaXJzdD49bGFzdCAqLworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2VucHJvcHM6IGVycm9yIC0gTGFzdCBvZiBhcmVhIFwiJXNcIiBpcyBpbmNvcnJlY3RcbiIsIHVuaWNvZGVBcmVhc1t1bmljb2RlQXJlYUluZGV4XS5uYW1lKTsKKyAgICAgICAgICAgICAgICAqcEVycm9yQ29kZT1VX1BBUlNFX0VSUk9SOworICAgICAgICAgICAgICAgIGV4aXQoVV9QQVJTRV9FUlJPUik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBub3QgYW4gYXJlYSBuYW1lICovCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBjaGVjayBmb3Igbm9uLWNoYXJhY3RlciBjb2RlIHBvaW50cyAqLworICAgIGlmKChwLmNvZGUmMHhmZmZlKT09MHhmZmZlIHx8ICh1aW50MzJfdCkocC5jb2RlLTB4ZmRkMCk8MHgyMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbnByb3BzOiBlcnJvciAtIHByb3BlcnRpZXMgZm9yIG5vbi1jaGFyYWN0ZXIgY29kZSBwb2ludCBVKyUwNGx4XG4iLAorICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKXAuY29kZSk7CisgICAgICAgICpwRXJyb3JDb2RlPVVfUEFSU0VfRVJST1I7CisgICAgICAgIGV4aXQoVV9QQVJTRV9FUlJPUik7CisgICAgfQorCisgICAgLyogY2hlY2sgdGhhdCB0aGUgY29kZSBwb2ludHMgKHAuY29kZSkgYXJlIGluIGFzY2VuZGluZyBvcmRlciAqLworICAgIGlmKHAuY29kZTw9cHJldkNvZGUgJiYgcC5jb2RlPjApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5wcm9wczogZXJyb3IgLSBVbmljb2RlRGF0YSBlbnRyaWVzIG91dCBvZiBvcmRlciwgVSslMDRseCBhZnRlciBVKyUwNGx4XG4iLAorICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKXAuY29kZSwgKHVuc2lnbmVkIGxvbmcpcHJldkNvZGUpOworICAgICAgICAqcEVycm9yQ29kZT1VX1BBUlNFX0VSUk9SOworICAgICAgICBleGl0KFVfUEFSU0VfRVJST1IpOworICAgIH0KKyAgICBwcmV2Q29kZT1wLmNvZGU7CisKKyAgICAvKiBwcm9wZXJ0aWVzIGZvciBhIHNpbmdsZSBjb2RlIHBvaW50ICovCisgICAgYWRkUHJvcHMocC5jb2RlLCB2YWx1ZSk7Cit9CisKKy8qIHNldCByZXBlYXRlZCBwcm9wZXJ0aWVzIGZvciB0aGUgYXJlYXMgKi8KK3N0YXRpYyB2b2lkCityZXBlYXRBcmVhUHJvcHMoKSB7CisgICAgdWludDMyX3QgcHVhUHJvcHM7CisgICAgaW50MzJfdCBpOworICAgIFVCb29sIGhhc1BsYW5lMTVQVUEsIGhhc1BsYW5lMTZQVUE7CisgICAgVUVycm9yQ29kZSBlcnJvckNvZGU7CisKKyAgICAvKgorICAgICAqIFVuaWNvZGVEYXRhLnR4dCBiZWZvcmUgMy4wLjEgZGlkIG5vdCBjb250YWluIHRoZSBQVUFzIG9uCisgICAgICogcGxhbmVzIDE1IGFuZCAxNi4KKyAgICAgKiBJZiB0aGF0IGlzIHRoZSBjYXNlLCB0aGVuIHdlIGFkZCB0aGVtIGhlcmUsIHVzaW5nIHRoZSBwcm9wZXJ0aWVzCisgICAgICogZnJvbSB0aGUgQk1QIFBVQS4KKyAgICAgKi8KKyAgICBwdWFQcm9wcz0wOworICAgIGhhc1BsYW5lMTVQVUE9aGFzUGxhbmUxNlBVQT1GQUxTRTsKKworICAgIGZvcihpPTA7IGk8dW5pY29kZUFyZWFJbmRleDsgKytpKSB7CisgICAgICAgIHJlcGVhdFByb3BzKHVuaWNvZGVBcmVhc1tpXS5maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgdW5pY29kZUFyZWFzW2ldLmxhc3QsCisgICAgICAgICAgICAgICAgICAgIHVuaWNvZGVBcmVhc1tpXS5wcm9wcyk7CisgICAgICAgIGlmKHVuaWNvZGVBcmVhc1tpXS5maXJzdD09MHhlMDAwKSB7CisgICAgICAgICAgICBwdWFQcm9wcz11bmljb2RlQXJlYXNbaV0ucHJvcHM7CisgICAgICAgIH0gZWxzZSBpZih1bmljb2RlQXJlYXNbaV0uZmlyc3Q9PTB4ZjAwMDApIHsKKyAgICAgICAgICAgIGhhc1BsYW5lMTVQVUE9VFJVRTsKKyAgICAgICAgfSBlbHNlIGlmKHVuaWNvZGVBcmVhc1tpXS5maXJzdD09MHgxMDAwMDApIHsKKyAgICAgICAgICAgIGhhc1BsYW5lMTZQVUE9VFJVRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKHB1YVByb3BzIT0wKSB7CisgICAgICAgIGlmKCFoYXNQbGFuZTE1UFVBKSB7CisgICAgICAgICAgICByZXBlYXRQcm9wcygweGYwMDAwLCAweGZmZmZkLCBwdWFQcm9wcyk7CisgICAgICAgIH0KKyAgICAgICAgaWYoIWhhc1BsYW5lMTZQVUEpIHsKKyAgICAgICAgICAgIHJlcGVhdFByb3BzKDB4MTAwMDAwLCAweDEwZmZmZCwgcHVhUHJvcHMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogSGFuZ3VsIGhhdmUgY2Fub25pY2FsIGRlY29tcG9zaXRpb25zICovCisgICAgZXJyb3JDb2RlPVVfWkVST19FUlJPUjsKKyAgICB1cHZlY19zZXRWYWx1ZShwdiwgMHhhYzAwLCAweGQ3YTMsIDIsICh1aW50MzJfdClVX0RUX0NBTk9OSUNBTCwgVVBST1BTX0RUX01BU0ssICZlcnJvckNvZGUpOworICAgIGlmKFVfRkFJTFVSRShlcnJvckNvZGUpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2VucHJvcHMgZXJyb3I6IHVuYWJsZSB0byBzZXQgZGVjb21wb3NpdGlvbiB0eXBlOiAlc1xuIiwgdV9lcnJvck5hbWUoZXJyb3JDb2RlKSk7CisgICAgICAgIGV4aXQoZXJyb3JDb2RlKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitwYXJzZURCKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBVRXJyb3JDb2RlICpwRXJyb3JDb2RlKSB7CisgICAgY2hhciAqZmllbGRzWzE1XVsyXTsKKworICAgIGlmKHBFcnJvckNvZGU9PU5VTEwgfHwgVV9GQUlMVVJFKCpwRXJyb3JDb2RlKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogd2hpbGUgdW5pY29kZUFyZWFzW3VuaWNvZGVBcmVhSW5kZXhdIGlzIHVudXNlZCwgc2V0IGl0cyBmaXJzdCB0byBhIGJvZ3VzIHZhbHVlICovCisgICAgdW5pY29kZUFyZWFzWzBdLmZpcnN0PTB4ZmZmZmZmZmY7CisKKyAgICB1X3BhcnNlRGVsaW1pdGVkRmlsZShmaWxlbmFtZSwgJzsnLCBmaWVsZHMsIDE1LCB1bmljb2RlRGF0YUxpbmVGbiwgTlVMTCwgcEVycm9yQ29kZSk7CisKKyAgICBpZih1bmljb2RlQXJlYXNbdW5pY29kZUFyZWFJbmRleF0uZmlyc3QhPTB4ZmZmZmZmZmYpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5wcm9wczogZXJyb3IgLSB0aGUgbGFzdCBhcmVhIFwiJXNcIiBmcm9tIFUrJTA0bHggaXMgaW5jb21wbGV0ZVxuIiwKKyAgICAgICAgICAgIHVuaWNvZGVBcmVhc1t1bmljb2RlQXJlYUluZGV4XS5uYW1lLAorICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpdW5pY29kZUFyZWFzW3VuaWNvZGVBcmVhSW5kZXhdLmZpcnN0KTsKKyAgICAgICAgKnBFcnJvckNvZGU9VV9QQVJTRV9FUlJPUjsKKyAgICAgICAgZXhpdChVX1BBUlNFX0VSUk9SKTsKKyAgICB9CisKKyAgICByZXBlYXRBcmVhUHJvcHMoKTsKKworICAgIGlmKFVfRkFJTFVSRSgqcEVycm9yQ29kZSkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KK30KKworLyoKKyAqIEhleSwgRW1hY3MsIHBsZWFzZSBzZXQgdGhlIGZvbGxvd2luZzoKKyAqCisgKiBMb2NhbCBWYXJpYWJsZXM6CisgKiBpbmRlbnQtdGFicy1tb2RlOiBuaWwKKyAqIEVuZDoKKyAqCisgKi8KZGlmZiAtLWdpdCBhL3VuaWNvZGUvYy9nZW5wcm9wcy9nZW5wcm9wcy5oIGIvdW5pY29kZS9jL2dlbnByb3BzL2dlbnByb3BzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlhYjIyOQotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGUvYy9nZW5wcm9wcy9nZW5wcm9wcy5oCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgQ29weXJpZ2h0IChDKSAxOTk5LTIwMTAsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMKKyogICBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICBmaWxlIG5hbWU6ICBnZW5wcm9wcy5oCisqICAgZW5jb2Rpbmc6ICAgVVMtQVNDSUkKKyogICB0YWIgc2l6ZTogICA4IChub3QgdXNlZCkKKyogICBpbmRlbnRhdGlvbjo0CisqCisqICAgY3JlYXRlZCBvbjogMTk5OWRlYzEzCisqICAgY3JlYXRlZCBieTogTWFya3VzIFcuIFNjaGVyZXIKKyovCisKKyNpZm5kZWYgX19HRU5QUk9QU19IX18KKyNkZWZpbmUgX19HRU5QUk9QU19IX18KKworI2luY2x1ZGUgInVuaWNvZGUvdXR5cGVzLmgiCisjaW5jbHVkZSAidXRyaWUuaCIKKyNpbmNsdWRlICJwcm9wc3ZlYy5oIgorCisvKiBmaWxlIGRlZmluaXRpb25zICovCisjZGVmaW5lIERBVEFfTkFNRSAidXByb3BzIgorI2RlZmluZSBEQVRBX1RZUEUgImljdSIKKworLyogY2hhcmFjdGVyIHByb3BlcnRpZXMgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50MzJfdCBjb2RlOworICAgIGludDMyX3QgbnVtZXJpY1ZhbHVlOyAvKiBzZWUgbnVtZXJpY1R5cGUgKi8KKyAgICB1aW50MzJfdCBkZW5vbWluYXRvcjsgLyogMDogbm8gdmFsdWUgKi8KKyAgICB1aW50OF90IGdlbmVyYWxDYXRlZ29yeSwgbnVtZXJpY1R5cGUsIGV4cG9uZW50OworfSBQcm9wczsKKworLyogZ2xvYmFsIGZsYWdzICovCitVX0NGVU5DIFVCb29sIGJlVmVyYm9zZSwgaGF2ZUNvcHlyaWdodDsKKworVV9DRlVOQyBjb25zdCBjaGFyICpjb25zdAorZ2VuQ2F0ZWdvcnlOYW1lc1tdOworCisvKiBwcm9wZXJ0aWVzIHZlY3RvcnMgaW4gcHJvcHMyLmNwcCAqLworVV9DRlVOQyBVUHJvcHNWZWN0b3JzICpwdjsKKworLyogcHJvdG90eXBlcyAqLworVV9DRlVOQyB2b2lkCit3cml0ZVVDREZpbGVuYW1lKGNoYXIgKmJhc2VuYW1lLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqc3VmZml4KTsKKworVV9DRlVOQyBVQm9vbAoraXNUb2tlbihjb25zdCBjaGFyICp0b2tlbiwgY29uc3QgY2hhciAqcyk7CisKK1VfQ0ZVTkMgaW50MzJfdAorZ2V0VG9rZW5JbmRleChjb25zdCBjaGFyICpjb25zdCB0b2tlbnNbXSwgaW50MzJfdCBjb3VudFRva2VucywgY29uc3QgY2hhciAqcyk7CisKK1VfQ0ZVTkMgdm9pZAorc2V0VW5pY29kZVZlcnNpb24oY29uc3QgY2hhciAqdik7CisKK1VfQ0ZVTkMgdm9pZAoraW5pdFN0b3JlKHZvaWQpOworCitVX0NGVU5DIHZvaWQKK2V4aXRTdG9yZSh2b2lkKTsKKworVV9DRlVOQyB1aW50MzJfdAorbWFrZVByb3BzKFByb3BzICpwKTsKKworVV9DRlVOQyB2b2lkCithZGRQcm9wcyh1aW50MzJfdCBjLCB1aW50MzJfdCBwcm9wcyk7CisKK1VfQ0ZVTkMgdWludDMyX3QKK2dldFByb3BzKHVpbnQzMl90IGMpOworCitVX0NGVU5DIHZvaWQKK3JlcGVhdFByb3BzKHVpbnQzMl90IGZpcnN0LCB1aW50MzJfdCBsYXN0LCB1aW50MzJfdCBwcm9wcyk7CisKK1VfQ0ZVTkMgdm9pZAorZ2VuZXJhdGVEYXRhKGNvbnN0IGNoYXIgKmRhdGFEaXIsIFVCb29sIGNzb3VyY2UpOworCisvKiBwcm9wczIuYyAqLworVV9DRlVOQyB2b2lkCitpbml0QWRkaXRpb25hbFByb3BlcnRpZXModm9pZCk7CisKK1VfQ0ZVTkMgdm9pZAorZXhpdEFkZGl0aW9uYWxQcm9wZXJ0aWVzKHZvaWQpOworCitVX0NGVU5DIHZvaWQKK2dlbmVyYXRlQWRkaXRpb25hbFByb3BlcnRpZXMoY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKnN1ZmZpeCwgVUVycm9yQ29kZSAqcEVycm9yQ29kZSk7CisKK1VfQ0ZVTkMgaW50MzJfdAord3JpdGVBZGRpdGlvbmFsRGF0YShGSUxFICpmLCB1aW50OF90ICpwLCBpbnQzMl90IGNhcGFjaXR5LCBpbnQzMl90IGluZGV4ZXNbMTZdKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS91bmljb2RlL2MvZ2VucHJvcHMvZ2VucHJvcHMudmNwcm9qIGIvdW5pY29kZS9jL2dlbnByb3BzL2dlbnByb3BzLnZjcHJvagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzFhYmYzCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZS9jL2dlbnByb3BzL2dlbnByb3BzLnZjcHJvagpAQCAtMCwwICsxLDQyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+Cis8VmlzdWFsU3R1ZGlvUHJvamVjdAorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIgorCVZlcnNpb249IjkuMDAiCisJTmFtZT0iZ2VucHJvcHMiCisJUHJvamVjdEdVSUQ9Ins2Rjc0NDY0OC1EMTVGLTQ3OEEtOTBDNi01OEUzNTNCNUREQjN9IgorCVRhcmdldEZyYW1ld29ya1ZlcnNpb249IjEzMTA3MiIKKwk+CisJPFBsYXRmb3Jtcz4KKwkJPFBsYXRmb3JtCisJCQlOYW1lPSJXaW4zMiIKKwkJLz4KKwkJPFBsYXRmb3JtCisJCQlOYW1lPSJ4NjQiCisJCS8+CisJPC9QbGF0Zm9ybXM+CisJPFRvb2xGaWxlcz4KKwk8L1Rvb2xGaWxlcz4KKwk8Q29uZmlndXJhdGlvbnM+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIgorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXHg4NlxSZWxlYXNlIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXHg4NlxSZWxlYXNlIgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiCisJCQlVc2VPZk1GQz0iMCIKKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIKKwkJCUNoYXJhY3RlclNldD0iMiIKKwkJCT4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJCUNvbW1hbmRMaW5lPSJjb3B5ICZxdW90OyQoVGFyZ2V0UGF0aCkmcXVvdDsgLi5cLi5cLi5cYmluJiN4MEQ7JiN4MEE7IgorCQkJCU91dHB1dHM9Ii4uXC4uXC4uXGJpblwkKFRhcmdldEZpbGVOYW1lKSIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIgorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iLlx4ODZcUmVsZWFzZS9nZW5wcm9wcy50bGIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXGNvbW1vbjsuLlx0b29sdXRpbCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7TkRFQlVHO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSIKKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIgorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIgorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIgorCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9InRydWUiCisJCQkJVHJlYXRXQ2hhcl90QXNCdWlsdEluVHlwZT0idHJ1ZSIKKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5ceDg2XFJlbGVhc2UvZ2VucHJvcHMucGNoIgorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlx4ODZcUmVsZWFzZS8iCisJCQkJT2JqZWN0RmlsZT0iLlx4ODZcUmVsZWFzZS8iCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5ceDg2XFJlbGVhc2UvIgorCQkJCVdhcm5pbmdMZXZlbD0iMyIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJQ29tcGlsZUFzPSIwIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciCisJCQkJQ3VsdHVyZT0iMTAzMyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKKwkJCQlPdXRwdXRGaWxlPSIuXHg4NlxSZWxlYXNlL2dlbnByb3BzLmV4ZSIKKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5ceDg2XFJlbGVhc2UvZ2VucHJvcHMucGRiIgorCQkJCVN1YlN5c3RlbT0iMSIKKwkJCQlSYW5kb21pemVkQmFzZUFkZHJlc3M9IjEiCisJCQkJRGF0YUV4ZWN1dGlvblByZXZlbnRpb249IjAiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJEZWJ1Z3xXaW4zMiIKKwkJCU91dHB1dERpcmVjdG9yeT0iLlx4ODZcRGVidWciCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5ceDg2XERlYnVnIgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiCisJCQlVc2VPZk1GQz0iMCIKKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIKKwkJCUNoYXJhY3RlclNldD0iMiIKKwkJCT4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJCUNvbW1hbmRMaW5lPSJjb3B5ICZxdW90OyQoVGFyZ2V0UGF0aCkmcXVvdDsgLi5cLi5cLi5cYmluJiN4MEQ7JiN4MEE7IgorCQkJCU91dHB1dHM9Ii4uXC4uXC4uXGJpblwkKFRhcmdldEZpbGVOYW1lKSIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIgorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iLlx4ODZcRGVidWcvZ2VucHJvcHMudGxiIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlPcHRpbWl6YXRpb249IjAiCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cY29tbW9uOy4uXHRvb2x1dGlsIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtfREVCVUc7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIgorCQkJCUJhc2ljUnVudGltZUNoZWNrcz0iMyIKKwkJCQlSdW50aW1lTGlicmFyeT0iMyIKKwkJCQlCdWZmZXJTZWN1cml0eUNoZWNrPSJ0cnVlIgorCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9InRydWUiCisJCQkJVHJlYXRXQ2hhcl90QXNCdWlsdEluVHlwZT0idHJ1ZSIKKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5ceDg2XERlYnVnL2dlbnByb3BzLnBjaCIKKwkJCQlBc3NlbWJsZXJMaXN0aW5nTG9jYXRpb249Ii5ceDg2XERlYnVnLyIKKwkJCQlPYmplY3RGaWxlPSIuXHg4NlxEZWJ1Zy8iCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5ceDg2XERlYnVnLyIKKwkJCQlCcm93c2VJbmZvcm1hdGlvbj0iMSIKKwkJCQlXYXJuaW5nTGV2ZWw9IjMiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjQiCisJCQkJQ29tcGlsZUFzPSIwIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJfREVCVUciCisJCQkJQ3VsdHVyZT0iMTAzMyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKKwkJCQlPdXRwdXRGaWxlPSIuXHg4NlxEZWJ1Zy9nZW5wcm9wcy5leGUiCisJCQkJTGlua0luY3JlbWVudGFsPSIyIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlx4ODZcRGVidWcvZ2VucHJvcHMucGRiIgorCQkJCVN1YlN5c3RlbT0iMSIKKwkJCQlSYW5kb21pemVkQmFzZUFkZHJlc3M9IjEiCisJCQkJRGF0YUV4ZWN1dGlvblByZXZlbnRpb249IjAiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIgorCQkJCVVzZUZBVDMyV29ya2Fyb3VuZD0idHJ1ZSIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iUmVsZWFzZXx4NjQiCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5ceDY0XFJlbGVhc2UiCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5ceDY0XFJlbGVhc2UiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSIKKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyIKKwkJCVVzZU9mTUZDPSIwIgorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIgorCQkJQ2hhcmFjdGVyU2V0PSIyIgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkJQ29tbWFuZExpbmU9ImNvcHkgJnF1b3Q7JChUYXJnZXRQYXRoKSZxdW90OyAuLlwuLlwuLlxiaW42NCYjeDBEOyYjeDBBOyIKKwkJCQlPdXRwdXRzPSIuLlwuLlwuLlxiaW42NFwkKFRhcmdldEZpbGVOYW1lKSIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIgorCQkJCVRhcmdldEVudmlyb25tZW50PSIzIgorCQkJCVR5cGVMaWJyYXJ5TmFtZT0iLlx4NjRcUmVsZWFzZS9nZW5wcm9wcy50bGIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXGNvbW1vbjsuLlx0b29sdXRpbCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lONjQ7V0lOMzI7TkRFQlVHO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSIKKwkJCQlTdHJpbmdQb29saW5nPSJ0cnVlIgorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIgorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIgorCQkJCURpc2FibGVMYW5ndWFnZUV4dGVuc2lvbnM9InRydWUiCisJCQkJVHJlYXRXQ2hhcl90QXNCdWlsdEluVHlwZT0idHJ1ZSIKKwkJCQlQcmVjb21waWxlZEhlYWRlckZpbGU9Ii5ceDY0XFJlbGVhc2UvZ2VucHJvcHMucGNoIgorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlx4NjRcUmVsZWFzZS8iCisJCQkJT2JqZWN0RmlsZT0iLlx4NjRcUmVsZWFzZS8iCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5ceDY0XFJlbGVhc2UvIgorCQkJCVdhcm5pbmdMZXZlbD0iMyIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJQ29tcGlsZUFzPSIwIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciCisJCQkJQ3VsdHVyZT0iMTAzMyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKKwkJCQlPdXRwdXRGaWxlPSIuXHg2NFxSZWxlYXNlL2dlbnByb3BzLmV4ZSIKKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5ceDY0XFJlbGVhc2UvZ2VucHJvcHMucGRiIgorCQkJCVN1YlN5c3RlbT0iMSIKKwkJCQlUYXJnZXRNYWNoaW5lPSIxNyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDRnhDb3BUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJEZWJ1Z3x4NjQiCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5ceDY0XERlYnVnIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXHg2NFxEZWJ1ZyIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIgorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIgorCQkJVXNlT2ZNRkM9IjAiCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiCisJCQlDaGFyYWN0ZXJTZXQ9IjIiCisJCQk+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCQlDb21tYW5kTGluZT0iY29weSAmcXVvdDskKFRhcmdldFBhdGgpJnF1b3Q7IC4uXC4uXC4uXGJpbjY0JiN4MEQ7JiN4MEE7IgorCQkJCU91dHB1dHM9Ii4uXC4uXC4uXGJpbjY0XCQoVGFyZ2V0RmlsZU5hbWUpIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiCisJCQkJVGFyZ2V0RW52aXJvbm1lbnQ9IjMiCisJCQkJVHlwZUxpYnJhcnlOYW1lPSIuXHg2NFxEZWJ1Zy9nZW5wcm9wcy50bGIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCU9wdGltaXphdGlvbj0iMCIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlxjb21tb247Li5cdG9vbHV0aWwiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjY0O1dJTjMyO19ERUJVRztfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUiCisJCQkJQmFzaWNSdW50aW1lQ2hlY2tzPSIzIgorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIzIgorCQkJCUJ1ZmZlclNlY3VyaXR5Q2hlY2s9InRydWUiCisJCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0idHJ1ZSIKKwkJCQlUcmVhdFdDaGFyX3RBc0J1aWx0SW5UeXBlPSJ0cnVlIgorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlx4NjRcRGVidWcvZ2VucHJvcHMucGNoIgorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlx4NjRcRGVidWcvIgorCQkJCU9iamVjdEZpbGU9Ii5ceDY0XERlYnVnLyIKKwkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlx4NjRcRGVidWcvIgorCQkJCUJyb3dzZUluZm9ybWF0aW9uPSIxIgorCQkJCVdhcm5pbmdMZXZlbD0iMyIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyIKKwkJCQlDb21waWxlQXM9IjAiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyIKKwkJCQlDdWx0dXJlPSIxMDMzIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIgorCQkJCU91dHB1dEZpbGU9Ii5ceDY0XERlYnVnL2dlbnByb3BzLmV4ZSIKKwkJCQlMaW5rSW5jcmVtZW50YWw9IjIiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0idHJ1ZSIKKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXHg2NFxEZWJ1Zy9nZW5wcm9wcy5wZGIiCisJCQkJU3ViU3lzdGVtPSIxIgorCQkJCVRhcmdldE1hY2hpbmU9IjE3IgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCIKKwkJCQlVc2VGQVQzMldvcmthcm91bmQ9InRydWUiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDRnhDb3BUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYkRlcGxveW1lbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJPC9Db25maWd1cmF0aW9ucz4KKwk8UmVmZXJlbmNlcz4KKwk8L1JlZmVyZW5jZXM+CisJPEZpbGVzPgorCQk8RmlsdGVyCisJCQlOYW1lPSJTb3VyY2UgRmlsZXMiCisJCQlGaWx0ZXI9ImM7Y3BwO3JjIgorCQkJPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cZ2VucHJvcHMuYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxwcm9wczIuYyIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxzdG9yZS5jIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJPC9GaWx0ZXI+CisJCTxGaWx0ZXIKKwkJCU5hbWU9IkhlYWRlciBGaWxlcyIKKwkJCUZpbHRlcj0iaCIKKwkJCT4KKwkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuXGdlbnByb3BzLmgiCisJCQkJPgorCQkJPC9GaWxlPgorCQk8L0ZpbHRlcj4KKwkJPEZpbHRlcgorCQkJTmFtZT0iUmVzb3VyY2UgRmlsZXMiCisJCQlGaWx0ZXI9ImljbztjdXI7Ym1wO2RsZztyYzI7cmN0O2JpbjtyZ3M7Z2lmO2pwZztqcGVnO2pwZSIKKwkJCT4KKwkJPC9GaWx0ZXI+CisJPC9GaWxlcz4KKwk8R2xvYmFscz4KKwk8L0dsb2JhbHM+Cis8L1Zpc3VhbFN0dWRpb1Byb2plY3Q+CmRpZmYgLS1naXQgYS91bmljb2RlL2MvZ2VucHJvcHMvbWlzYy91Y2Rjb3B5LnB5IGIvdW5pY29kZS9jL2dlbnByb3BzL21pc2MvdWNkY29weS5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mMDdmNTQwCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZS9jL2dlbnByb3BzL21pc2MvdWNkY29weS5weQpAQCAtMCwwICsxLDE4MiBAQAorIyEvdXNyL2Jpbi9weXRob24yLjQKKyMgQ29weXJpZ2h0IChjKSAyMDA5LTIwMTAgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcworIyBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyAgIGZpbGUgbmFtZTogIHVjZGNvcHkucHkKKyMgICBlbmNvZGluZzogICBVUy1BU0NJSQorIyAgIHRhYiBzaXplOiAgIDggKG5vdCB1c2VkKQorIyAgIGluZGVudGF0aW9uOjQKKyMKKyMgICBjcmVhdGVkIG9uOiAyMDA5YXVnMDQKKyMgICBjcmVhdGVkIGJ5OiBNYXJrdXMgVy4gU2NoZXJlcgorIworIyBDb3B5IFVuaWNvZGUgQ2hhcmFjdGVyIERhdGFiYXNlICh1Y2QpIGZpbGVzIGZyb20gYSB0cmVlCisjIG9mIGZpbGVzIGRvd25sb2FkZWQgZnJvbSBmdHA6Ly93d3cudW5pY29kZS5vcmcvUHVibGljLzUuMi4wLworIyB0byBhIGZvbGRlciBsaWtlIElDVSdzIHNvdXJjZS9kYXRhL3VuaWRhdGEvCisjIGFuZCBtb2RpZnkgc29tZSBvZiB0aGUgZmlsZXMgdG8gbWFrZSB0aGVtIG1vcmUgY29tcGFjdC4KKyMKKyMgSW52b2tlIHdpdGggdHdvIGNvbW1hbmQtbGluZSBwYXJhbWV0ZXJzLCBmb3IgdGhlIHNvdXJjZQorIyBhbmQgZGVzdGluYXRpb24gZm9sZGVycy4KKworaW1wb3J0IG9zCitpbXBvcnQgb3MucGF0aAoraW1wb3J0IHJlCitpbXBvcnQgc2h1dGlsCitpbXBvcnQgc3lzCisKK19zdHJpcF9yZSA9IHJlLmNvbXBpbGUoIl4oWzAtOWEtZkEtRl0rLis/KSAqIy4qIikKK19jb2RlX3BvaW50X3JlID0gcmUuY29tcGlsZSgiXHMqKFswLTlhLWZBLUZdKylccyo7IikKKworZGVmIENvcHlBbmRTdHJpcFdpdGhPcHRpb25hbE1lcmdlKHMsIHQsIGRvX21lcmdlKToKKyAgaW5fZmlsZSA9IG9wZW4ocywgInIiKQorICBvdXRfZmlsZSA9IG9wZW4odCwgInciKQorICBmaXJzdCA9IC0xICAjIEZpcnN0IGNvZGUgcG9pbnQgd2l0aCBmaXJzdF9kYXRhLgorICBsYXN0ID0gLTEgICMgTGFzdCBjb2RlIHBvaW50IHdpdGggZmlyc3RfZGF0YS4KKyAgZmlyc3RfZGF0YSA9ICIiICAjIENvbW1vbiBkYXRhIGZvciBjb2RlIHBvaW50cyBbZmlyc3QuLmxhc3RdLgorICBmb3IgbGluZSBpbiBpbl9maWxlOgorICAgIG1hdGNoID0gX3N0cmlwX3JlLm1hdGNoKGxpbmUpCisgICAgaWYgbWF0Y2g6CisgICAgICBsaW5lID0gbWF0Y2guZ3JvdXAoMSkKKyAgICBlbHNlOgorICAgICAgbGluZSA9IGxpbmUucnN0cmlwKCkKKyAgICBpZiBkb19tZXJnZToKKyAgICAgIG1hdGNoID0gX2NvZGVfcG9pbnRfcmUubWF0Y2gobGluZSkKKyAgICAgIGlmIG1hdGNoOgorICAgICAgICBjID0gaW50KG1hdGNoLmdyb3VwKDEpLCAxNikKKyAgICAgICAgZGF0YSA9IGxpbmVbbWF0Y2guZW5kKCkgLSAxOl0KKyAgICAgIGVsc2U6CisgICAgICAgIGMgPSAtMQorICAgICAgICBkYXRhID0gIiIKKyAgICAgIGlmIGxhc3QgPj0gMCBhbmQgKGMgIT0gKGxhc3QgKyAxKSBvciBkYXRhICE9IGZpcnN0X2RhdGEpOgorICAgICAgICAjIG91dHB1dCB0aGUgY3VycmVudCByYW5nZQorICAgICAgICBpZiBmaXJzdCA9PSBsYXN0OgorICAgICAgICAgIG91dF9maWxlLndyaXRlKCIlMDRYJXNcbiIgJSAoZmlyc3QsIGZpcnN0X2RhdGEpKQorICAgICAgICBlbHNlOgorICAgICAgICAgIG91dF9maWxlLndyaXRlKCIlMDRYLi4lMDRYJXNcbiIgJSAoZmlyc3QsIGxhc3QsIGZpcnN0X2RhdGEpKQorICAgICAgICBmaXJzdCA9IC0xCisgICAgICAgIGxhc3QgPSAtMQorICAgICAgICBmaXJzdF9kYXRhID0gIiIKKyAgICAgIGlmIGMgPCAwOgorICAgICAgICAjIG5vIGRhdGEgb24gdGhpcyBsaW5lLCBvdXRwdXQgYXMgaXMKKyAgICAgICAgb3V0X2ZpbGUud3JpdGUobGluZSkKKyAgICAgICAgb3V0X2ZpbGUud3JpdGUoIlxuIikKKyAgICAgIGVsc2U6CisgICAgICAgICMgZGF0YSBvbiB0aGlzIGxpbmUsIHN0b3JlIGZvciBwb3NzaWJsZSByYW5nZSBjb21wYWN0aW9uCisgICAgICAgIGlmIGxhc3QgPCAwOgorICAgICAgICAgICMgc2V0IGFzIHRoZSBmaXJzdCBsaW5lIGluIGEgcG9zc2libGUgcmFuZ2UKKyAgICAgICAgICBmaXJzdCA9IGMKKyAgICAgICAgICBsYXN0ID0gYworICAgICAgICAgIGZpcnN0X2RhdGEgPSBkYXRhCisgICAgICAgIGVsc2U6CisgICAgICAgICAgIyBtdXN0IGJlIGMgPT0gKGxhc3QgKyAxKSBhbmQgZGF0YSA9PSBmaXJzdF9kYXRhCisgICAgICAgICAgIyBiZWNhdXNlIG9mIHByZXZpb3VzIGNvbmRpdGlvbnMKKyAgICAgICAgICAjIGNvbnRpbnVlIHdpdGggdGhlIGN1cnJlbnQgcmFuZ2UKKyAgICAgICAgICBsYXN0ID0gYworICAgIGVsc2U6CisgICAgICAjIE9ubHkgc3RyaXAsIGRvbid0IG1lcmdlOiBqdXN0IG91dHB1dCB0aGUgc3RyaXBwZWQgbGluZS4KKyAgICAgIG91dF9maWxlLndyaXRlKGxpbmUpCisgICAgICBvdXRfZmlsZS53cml0ZSgiXG4iKQorICBpZiBkb19tZXJnZSBhbmQgbGFzdCA+PSAwOgorICAgICMgb3V0cHV0IHRoZSBsYXN0IHJhbmdlIGluIHRoZSBmaWxlCisgICAgaWYgZmlyc3QgPT0gbGFzdDoKKyAgICAgIG91dF9maWxlLndyaXRlKCIlMDRYJXNcbiIgJSAoZmlyc3QsIGZpcnN0X2RhdGEpKQorICAgIGVsc2U6CisgICAgICBvdXRfZmlsZS53cml0ZSgiJTA0WC4uJTA0WCVzXG4iICUgKGZpcnN0LCBsYXN0LCBmaXJzdF9kYXRhKSkKKyAgICBmaXJzdCA9IC0xCisgICAgbGFzdCA9IC0xCisgICAgZmlyc3RfZGF0YSA9ICIiCisgIGluX2ZpbGUuY2xvc2UoKQorICBvdXRfZmlsZS5mbHVzaCgpCisgIG91dF9maWxlLmNsb3NlKCkKKworCitkZWYgQ29weUFuZFN0cmlwKHMsIHQpOgorICAiIiJDb3BpZXMgYSBmaWxlIGFuZCByZW1vdmVzIGNvbW1lbnRzIGJlaGluZCBkYXRhIGxpbmVzIGJ1dCBub3QgaW4gb3RoZXJzLiIiIgorICBDb3B5QW5kU3RyaXBXaXRoT3B0aW9uYWxNZXJnZShzLCB0LCBGYWxzZSkKKworCitkZWYgQ29weUFuZFN0cmlwQW5kTWVyZ2UocywgdCk6CisgICIiIkNvcGllcyBhbmQgc3RyaXBzIGEgZmlsZSBhbmQgbWVyZ2VzIGxpbmVzLgorCisgIENvcGllcyBhIGZpbGUsIHJlbW92ZXMgY29tbWVudHMsIGFuZAorICBtZXJnZXMgbGluZXMgd2l0aCBhZGphY2VudCBjb2RlIHBvaW50IHJhbmdlcyBhbmQgaWRlbnRpY2FsIHBlci1jb2RlIHBvaW50CisgIGRhdGEgbGluZXMgaW50byBvbmUgbGluZSB3aXRoIHJhbmdlIHN5bnRheC4KKyAgIiIiCisgIENvcHlBbmRTdHJpcFdpdGhPcHRpb25hbE1lcmdlKHMsIHQsIFRydWUpCisKKworX2ZpbGVzID0geworICAjIFNpbXBseSBjb3B5IHRoZXNlIGZpbGVzLgorICAiQmlkaU1pcnJvcmluZy50eHQiOiBzaHV0aWwuY29weSwKKyAgIkJpZGlUZXN0LnR4dCI6IChzaHV0aWwuY29weSwgInRlc3RkYXRhIiksCisgICJCbG9ja3MudHh0Ijogc2h1dGlsLmNvcHksCisgICJDYXNlRm9sZGluZy50eHQiOiBzaHV0aWwuY29weSwKKyAgIkRlcml2ZWRBZ2UudHh0Ijogc2h1dGlsLmNvcHksCisgICJEZXJpdmVkQmlkaUNsYXNzLnR4dCI6IHNodXRpbC5jb3B5LAorICAiRGVyaXZlZEpvaW5pbmdHcm91cC50eHQiOiBzaHV0aWwuY29weSwKKyAgIkRlcml2ZWRKb2luaW5nVHlwZS50eHQiOiBzaHV0aWwuY29weSwKKyAgIkRlcml2ZWROdW1lcmljVmFsdWVzLnR4dCI6IHNodXRpbC5jb3B5LAorICAiR3JhcGhlbWVCcmVha1Rlc3QudHh0IjogKHNodXRpbC5jb3B5LCAidGVzdGRhdGEiKSwKKyAgIkxpbmVCcmVha1Rlc3QudHh0IjogKHNodXRpbC5jb3B5LCAidGVzdGRhdGEiKSwKKyAgIk5hbWVBbGlhc2VzLnR4dCI6IHNodXRpbC5jb3B5LAorICAiTm9ybWFsaXphdGlvbkNvcnJlY3Rpb25zLnR4dCI6IHNodXRpbC5jb3B5LAorICAiUHJvcGVydHlBbGlhc2VzLnR4dCI6IHNodXRpbC5jb3B5LAorICAiUHJvcGVydHlWYWx1ZUFsaWFzZXMudHh0Ijogc2h1dGlsLmNvcHksCisgICJTZW50ZW5jZUJyZWFrVGVzdC50eHQiOiAoc2h1dGlsLmNvcHksICJ0ZXN0ZGF0YSIpLAorICAiU2NyaXB0RXh0ZW5zaW9ucy50eHQiOiBzaHV0aWwuY29weSwKKyAgIlNwZWNpYWxDYXNpbmcudHh0Ijogc2h1dGlsLmNvcHksCisgICJVbmljb2RlRGF0YS50eHQiOiBzaHV0aWwuY29weSwKKyAgIldvcmRCcmVha1Rlc3QudHh0IjogKHNodXRpbC5jb3B5LCAidGVzdGRhdGEiKSwKKworICAjIENvcHkgdGhlc2UgZmlsZXMgYW5kIHJlbW92ZSBjb21tZW50cyBiZWhpbmQgZGF0YSBsaW5lcyBidXQgbm90IGluIG90aGVycy4KKyAgIkRlcml2ZWRDb3JlUHJvcGVydGllcy50eHQiOiBDb3B5QW5kU3RyaXAsCisgICJEZXJpdmVkTm9ybWFsaXphdGlvblByb3BzLnR4dCI6IENvcHlBbmRTdHJpcCwKKyAgIkdyYXBoZW1lQnJlYWtQcm9wZXJ0eS50eHQiOiBDb3B5QW5kU3RyaXAsCisgICJOb3JtYWxpemF0aW9uVGVzdC50eHQiOiBDb3B5QW5kU3RyaXAsCisgICJQcm9wTGlzdC50eHQiOiBDb3B5QW5kU3RyaXAsCisgICJTY3JpcHRzLnR4dCI6IENvcHlBbmRTdHJpcCwKKyAgIlNlbnRlbmNlQnJlYWtQcm9wZXJ0eS50eHQiOiBDb3B5QW5kU3RyaXAsCisgICJXb3JkQnJlYWtQcm9wZXJ0eS50eHQiOiBDb3B5QW5kU3RyaXAsCisKKyAgIyBBbHNvIG1lcmdlIGxpbmVzIHdpdGggYWRqYWNlbnQgY29kZSBwb2ludCByYW5nZXMuCisgICJFYXN0QXNpYW5XaWR0aC50eHQiOiBDb3B5QW5kU3RyaXBBbmRNZXJnZSwKKyAgIkxpbmVCcmVhay50eHQiOiBDb3B5QW5kU3RyaXBBbmRNZXJnZQorfQorCitfZmlsZV92ZXJzaW9uX3JlID0gcmUuY29tcGlsZSgiXihbYS16QS1aMC05XSspIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLVswLTldKD86XFwuWzAtOV0pKig/OmRbMC05XSspPyIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihcXC5bYS16XSspJCIpCisKK2RlZiBtYWluKCk6CisgIHNvdXJjZV9yb290ID0gc3lzLmFyZ3ZbMV0KKyAgZGVzdF9yb290ID0gc3lzLmFyZ3ZbMl0KKyAgc291cmNlX2ZpbGVzID0gW10KKyAgZm9yIHJvb3QsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsoc291cmNlX3Jvb3QpOgorICAgIGZvciBmaWxlIGluIGZpbGVzOgorICAgICAgc291cmNlX2ZpbGVzLmFwcGVuZChvcy5wYXRoLmpvaW4ocm9vdCwgZmlsZSkpCisgIGZpbGVzX3Byb2Nlc3NlZCA9IHNldCgpCisgIGZvciBzb3VyY2VfZmlsZSBpbiBzb3VyY2VfZmlsZXM6CisgICAgYmFzZW5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKHNvdXJjZV9maWxlKQorICAgIG1hdGNoID0gX2ZpbGVfdmVyc2lvbl9yZS5tYXRjaChiYXNlbmFtZSkKKyAgICBpZiBtYXRjaDoKKyAgICAgIGJhc2VuYW1lID0gbWF0Y2guZ3JvdXAoMSkgKyBtYXRjaC5ncm91cCgyKQorICAgICAgcHJpbnQgYmFzZW5hbWUKKyAgICBpZiBiYXNlbmFtZSBpbiBfZmlsZXM6CisgICAgICBpZiBiYXNlbmFtZSBpbiBmaWxlc19wcm9jZXNzZWQ6CisgICAgICAgIHByaW50ICJkdXBsaWNhdGUgZmlsZSBiYXNlbmFtZSAlcyEiICUgYmFzZW5hbWUKKyAgICAgICAgc3lzLmV4aXQoMSkKKyAgICAgIGZpbGVzX3Byb2Nlc3NlZC5hZGQoYmFzZW5hbWUpCisgICAgICBhY3Rpb24gPSBfZmlsZXNbYmFzZW5hbWVdCisgICAgICBpZiBpc2luc3RhbmNlKGFjdGlvbiwgdHVwbGUpOgorICAgICAgICBkZXN0X2ZvbGRlciA9IGFjdGlvblsxXQorICAgICAgICBhY3Rpb24gPSBhY3Rpb25bMF0KKyAgICAgIGVsc2U6CisgICAgICAgIGRlc3RfZm9sZGVyID0gInVuaWRhdGEiCisgICAgICBkZXN0X3BhdGggPSBvcy5wYXRoLmpvaW4oZGVzdF9yb290LCBkZXN0X2ZvbGRlcikKKyAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhkZXN0X3BhdGgpOiBvcy5tYWtlZGlycyhkZXN0X3BhdGgpCisgICAgICBkZXN0X2ZpbGUgPSBvcy5wYXRoLmpvaW4oZGVzdF9wYXRoLCBiYXNlbmFtZSkKKyAgICAgIGFjdGlvbihzb3VyY2VfZmlsZSwgZGVzdF9maWxlKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgIG1haW4oKQpkaWZmIC0tZ2l0IGEvdW5pY29kZS9jL2dlbnByb3BzL21pc2MvdWNkbWVyZ2UuYyBiL3VuaWNvZGUvYy9nZW5wcm9wcy9taXNjL3VjZG1lcmdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVmNjg1MAotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGUvYy9nZW5wcm9wcy9taXNjL3VjZG1lcmdlLmMKQEAgLTAsMCArMSwxNDkgQEAKKy8qCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgQ29weXJpZ2h0IChDKSAyMDAzLCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzCisqICAgQ29ycG9yYXRpb24gYW5kIG90aGVycy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgZmlsZSBuYW1lOiAgdWNkbWVyZ2UuYworKiAgIGVuY29kaW5nOiAgIFVTLUFTQ0lJCisqICAgdGFiIHNpemU6ICAgOCAobm90IHVzZWQpCisqICAgaW5kZW50YXRpb246NAorKgorKiAgIGNyZWF0ZWQgb246IDIwMDNmZWIyMAorKiAgIGNyZWF0ZWQgYnk6IE1hcmt1cyBXLiBTY2hlcmVyCisqCisqICAgU2ltcGxlIHRvb2wgZm9yIFVuaWNvZGUgQ2hhcmFjdGVyIERhdGFiYXNlIGZpbGVzIHdpdGggc2VtaWNvbG9uLWRlbGltaXRlZCBmaWVsZHMuCisqICAgTWVyZ2VzIGFkamFjZW50LCBpZGVudGljYWwgcGVyLWNvZGUgcG9pbnQgZGF0YSBsaW5lcyBpbnRvIG9uZSBsaW5lIHdpdGggcmFuZ2Ugc3ludGF4LgorKgorKiAgIFRvIGNvbXBpbGUsIGp1c3QgY2FsbCBhIEMgY29tcGlsZXIvbGlua2VyIHdpdGggdGhpcyBzb3VyY2UgZmlsZS4KKyogICBPbiBXaW5kb3dzOiBjbCB1Y2RtZXJnZS5jCisqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworc3RhdGljIGNvbnN0IGNoYXIgKgorc2tpcFdoaXRlc3BhY2UoY29uc3QgY2hhciAqcykgeworICAgIHdoaWxlKCpzPT0nICcgfHwgKnM9PSdcdCcpIHsKKyAgICAgICAgKytzOworICAgIH0KKyAgICByZXR1cm4gczsKK30KKworLyogcmV0dXJuIHRoZSBmaXJzdCBjaGFyYWN0ZXIgcG9zaXRpb24gYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgZGF0YSAqLworc3RhdGljIGNoYXIgKgorZW5kT2ZEYXRhKGNvbnN0IGNoYXIgKmwpIHsKKyAgICBjaGFyICplbmQ7CisgICAgY2hhciBjOworCisgICAgZW5kPXN0cmNocihsLCAnIycpOworICAgIGlmKGVuZCE9TlVMTCkgeworICAgICAgICAvKiBpZ25vcmUgd2hpdGVzcGFjZSBiZWZvcmUgdGhlIGNvbW1lbnQgKi8KKyAgICAgICAgd2hpbGUobCE9ZW5kICYmICgoYz0qKGVuZC0xKSk9PScgJyB8fCBjPT0nXHQnKSkgeworICAgICAgICAgICAgLS1lbmQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBlbmQ9c3RyY2hyKGwsIDApOworICAgIH0KKyAgICByZXR1cm4gZW5kOworfQorCitzdGF0aWMgaW50CitzYW1lRGF0YShjb25zdCBjaGFyICpsMSwgY29uc3QgY2hhciAqbDIpIHsKKyAgICBjaGFyICplbmQxLCAqZW5kMjsKKyAgICBpbnQgbGVuZ3RoOworCisgICAgLyogZmluZCB0aGUgZmlyc3Qgc2VtaWNvbG9uIGluIGVhY2ggbGluZSAtIHRoZXJlIG11c3QgYmUgb25lICovCisgICAgbDE9c3RyY2hyKGwxLCAnOycpKzE7CisgICAgbDI9c3RyY2hyKGwyLCAnOycpKzE7CisKKyAgICAvKiBmaW5kIHRoZSBlbmQgb2YgZGF0YTogZW5kIG9mIHN0cmluZyBvciBzdGFydCBvZiBjb21tZW50ICovCisgICAgZW5kMT1lbmRPZkRhdGEobDEpOworICAgIGVuZDI9ZW5kT2ZEYXRhKGwyKTsKKworICAgIC8qIGNvbXBhcmUgdGhlIGxpbmUgZGF0YSBwb3J0aW9ucyAqLworICAgIGxlbmd0aD1lbmQxLWwxOworICAgIHJldHVybiBsZW5ndGg9PShlbmQyLWwyKSAmJiAwPT1tZW1jbXAobDEsIGwyLCBsZW5ndGgpOworfQorCitleHRlcm4gaW50CittYWluKGludCBhcmdjLCBjb25zdCBjaGFyICphcmd2W10pIHsKKyAgICBzdGF0aWMgY2hhciBsaW5lWzIwMDBdLCBmaXJzdExpbmVbMjAwMF0sIGxhc3RMaW5lWzIwMDBdOworICAgIGNoYXIgKmVuZDsKKyAgICBsb25nIGZpcnN0LCBsYXN0LCBjOworICAgIGludCBmaW5pc2hlZDsKKworICAgIGZpcnN0PWxhc3Q9LTE7CisgICAgZmluaXNoZWQ9MDsKKworICAgIGZvcig7OykgeworICAgICAgICBpZihnZXRzKGxpbmUpIT1OVUxMKSB7CisgICAgICAgICAgICAvKiBwYXJzZSB0aGUgaW5pdGlhbCBjb2RlIHBvaW50LCBpZiBhbnkgKi8KKyAgICAgICAgICAgIGM9c3RydG9sKGxpbmUsICZlbmQsIDE2KTsKKyAgICAgICAgICAgIGlmKGVuZCE9bGluZSAmJiAqc2tpcFdoaXRlc3BhY2UoZW5kKT09JzsnKSB7CisgICAgICAgICAgICAgICAgLyogc2luZ2xlIGNvZGUgcG9pbnQgZm9sbG93ZWQgYnkgc2VtaWNvbG9uIGFuZCBkYXRhLCBrZWVwIGMgKi8KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYz0tMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxpbmVbMF09MDsKKyAgICAgICAgICAgIGM9LTE7CisgICAgICAgICAgICBmaW5pc2hlZD0xOworICAgICAgICB9CisKKyAgICAgICAgaWYobGFzdD49MCAmJiAoYyE9KGxhc3QrMSkgfHwgIXNhbWVEYXRhKGZpcnN0TGluZSwgbGluZSkpKSB7CisgICAgICAgICAgICAvKiBvdXRwdXQgdGhlIGN1cnJlbnQgcmFuZ2UgKi8KKyAgICAgICAgICAgIGlmKGZpcnN0PT1sYXN0KSB7CisgICAgICAgICAgICAgICAgLyogdGhlcmUgd2FzIG5vIHJhbmdlLCBqdXN0IG91dHB1dCB0aGUgb25lIGxpbmUgd2UgZm91bmQgKi8KKyAgICAgICAgICAgICAgICBwdXRzKGZpcnN0TGluZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIHRoZXJlIHdhcyBhIHJlYWwgcmFuZ2UsIG1lcmdlIHRoZWlyIGxpbmVzICovCisgICAgICAgICAgICAgICAgZW5kPXN0cmNocihsYXN0TGluZSwgJyMnKTsKKyAgICAgICAgICAgICAgICBpZihlbmQ9PU5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogbm8gY29tbWVudCBpbiBzZWNvbmQgbGluZSAqLworICAgICAgICAgICAgICAgICAgICBwcmludGYoIiUwNGxYLi4lMDRsWCVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0LCBsYXN0LCAgICAgICAgICAgIC8qIGNvZGUgcG9pbnQgcmFuZ2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJjaHIoZmlyc3RMaW5lLCAnOycpKTsvKiBmaXJzdCBsaW5lIHN0YXJ0aW5nIGZyb20gdGhlIGZpcnN0IDsgKi8KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYoc3RyY2hyKGZpcnN0TGluZSwgJyMnKT09TlVMTCkgeworICAgICAgICAgICAgICAgICAgICAvKiBubyBjb21tZW50IGluIGZpcnN0IGxpbmUgKi8KKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlMDRsWC4uJTA0bFglcyVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0LCBsYXN0LCAgICAgICAgICAgIC8qIGNvZGUgcG9pbnQgcmFuZ2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJjaHIoZmlyc3RMaW5lLCAnOycpLCAvKiBmaXJzdCBsaW5lIHN0YXJ0aW5nIGZyb20gdGhlIGZpcnN0IDsgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQpOyAgICAgICAgICAgICAgICAgICAvKiBjb21tZW50IGZyb20gc2Vjb25kIGxpbmUgKi8KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiBtZXJnZSBjb21tZW50cyBmcm9tIGJvdGggbGluZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlMDRsWC4uJTA0bFglcy4uJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QsIGxhc3QsICAgICAgICAgICAgLyogY29kZSBwb2ludCByYW5nZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNocihmaXJzdExpbmUsICc7JyksIC8qIGZpcnN0IGxpbmUgc3RhcnRpbmcgZnJvbSB0aGUgZmlyc3QgOyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXBXaGl0ZXNwYWNlKGVuZCsxKSk7IC8qIGNvbW1lbnQgZnJvbSBzZWNvbmQgbGluZSwgYWZ0ZXIgIyBhbmQgc3BhY2VzICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZmlyc3Q9bGFzdD0tMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKGM8MCkgeworICAgICAgICAgICAgaWYoZmluaXNoZWQpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogbm8gZGF0YSBvbiB0aGlzIGxpbmUsIG91dHB1dCBhcyBpcyAqLworICAgICAgICAgICAgcHV0cyhsaW5lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIGRhdGEgb24gdGhpcyBsaW5lLCBzdG9yZSBmb3IgcG9zc2libGUgcmFuZ2UgY29tcGFjdGlvbiAqLworICAgICAgICAgICAgaWYobGFzdDwwKSB7CisgICAgICAgICAgICAgICAgLyogc2V0IGFzIHRoZSBmaXJzdCBsaW5lIGluIGEgcG9zc2libGUgcmFuZ2UgKi8KKyAgICAgICAgICAgICAgICBmaXJzdD1sYXN0PWM7CisgICAgICAgICAgICAgICAgc3RyY3B5KGZpcnN0TGluZSwgbGluZSk7CisgICAgICAgICAgICAgICAgbGFzdExpbmVbMF09MDsKKyAgICAgICAgICAgIH0gZWxzZSAvKiBtdXN0IGJlIGM9PShsYXN0KzEpICYmIHNhbWVEYXRhKCkgYmVjYXVzZSBvZiBwcmV2aW91cyBjb25kaXRpb25zICovIHsKKyAgICAgICAgICAgICAgICAvKiBjb250aW51ZSB3aXRoIHRoZSBjdXJyZW50IHJhbmdlICovCisgICAgICAgICAgICAgICAgbGFzdD1jOworICAgICAgICAgICAgICAgIHN0cmNweShsYXN0TGluZSwgbGluZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3VuaWNvZGUvYy9nZW5wcm9wcy9taXNjL3VjZHN0cmlwLmMgYi91bmljb2RlL2MvZ2VucHJvcHMvbWlzYy91Y2RzdHJpcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZWY1M2YKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RlL2MvZ2VucHJvcHMvbWlzYy91Y2RzdHJpcC5jCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgQ29weXJpZ2h0IChDKSAyMDAzLCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzCisqICAgQ29ycG9yYXRpb24gYW5kIG90aGVycy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgZmlsZSBuYW1lOiAgdWNkc3RyaXAuYworKiAgIGVuY29kaW5nOiAgIFVTLUFTQ0lJCisqICAgdGFiIHNpemU6ICAgOCAobm90IHVzZWQpCisqICAgaW5kZW50YXRpb246NAorKgorKiAgIGNyZWF0ZWQgb246IDIwMDNmZWIyMAorKiAgIGNyZWF0ZWQgYnk6IE1hcmt1cyBXLiBTY2hlcmVyCisqCisqICAgU2ltcGxlIHRvb2wgZm9yIFVuaWNvZGUgQ2hhcmFjdGVyIERhdGFiYXNlIGZpbGVzIHdpdGggc2VtaWNvbG9uLWRlbGltaXRlZCBmaWVsZHMuCisqICAgUmVtb3ZlcyBjb21tZW50cyBiZWhpbmQgZGF0YSBsaW5lcyBidXQgbm90IGluIG90aGVycy4KKyoKKyogICBUbyBjb21waWxlLCBqdXN0IGNhbGwgYSBDIGNvbXBpbGVyL2xpbmtlciB3aXRoIHRoaXMgc291cmNlIGZpbGUuCisqICAgT24gV2luZG93czogY2wgdWNkc3RyaXAuYworKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKy8qIHJldHVybiB0aGUgZmlyc3QgY2hhcmFjdGVyIHBvc2l0aW9uIGFmdGVyIHRoZSBlbmQgb2YgdGhlIGRhdGEgKi8KK3N0YXRpYyBjaGFyICoKK2VuZE9mRGF0YShjb25zdCBjaGFyICpsKSB7CisgICAgY2hhciAqZW5kOworICAgIGNoYXIgYzsKKworICAgIGVuZD1zdHJjaHIobCwgJyMnKTsKKyAgICBpZihlbmQhPU5VTEwpIHsKKyAgICAgICAgLyogaWdub3JlIHdoaXRlc3BhY2UgYmVmb3JlIHRoZSBjb21tZW50ICovCisgICAgICAgIHdoaWxlKGwhPWVuZCAmJiAoKGM9KihlbmQtMSkpPT0nICcgfHwgYz09J1x0JykpIHsKKyAgICAgICAgICAgIC0tZW5kOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZW5kPXN0cmNocihsLCAwKTsKKyAgICB9CisgICAgcmV0dXJuIGVuZDsKK30KKworZXh0ZXJuIGludAorbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqYXJndltdKSB7CisgICAgc3RhdGljIGNoYXIgbGluZVsyMDAwXTsKKyAgICBjaGFyICplbmQ7CisKKyAgICB3aGlsZShnZXRzKGxpbmUpIT1OVUxMKSB7CisgICAgICAgIGlmKHN0cnRvbChsaW5lLCAmZW5kLCAxNik+PTAgJiYgZW5kIT1saW5lKSB7CisgICAgICAgICAgICAvKiBjb2RlIHBvaW50IG9yIHJhbmdlIGZvbGxvd2VkIGJ5IHNlbWljb2xvbiBhbmQgZGF0YSwgcmVtb3ZlIGNvbW1lbnQgKi8KKyAgICAgICAgICAgICplbmRPZkRhdGEobGluZSk9MDsKKyAgICAgICAgfQorICAgICAgICBwdXRzKGxpbmUpOworICAgIH0KKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdW5pY29kZS9jL2dlbnByb3BzL21pc2MvdWNkc3RyaXAucGwgYi91bmljb2RlL2MvZ2VucHJvcHMvbWlzYy91Y2RzdHJpcC5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42MTA5NzcwCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZS9jL2dlbnByb3BzL21pc2MvdWNkc3RyaXAucGwKQEAgLTAsMCArMSw3IEBACisjIS91c3IvbGliL3BlcmwgLXAKKyMgQ29weXJpZ2h0IChjKSAyMDAxLTIwMDMgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcworIyBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBTaW1wbGUgdG9vbCBmb3IgVW5pY29kZSBDaGFyYWN0ZXIgRGF0YWJhc2UgZmlsZXMgd2l0aCBzZW1pY29sb24tZGVsaW1pdGVkIGZpZWxkcy4KKyMgUmVtb3ZlcyBjb21tZW50cyBiZWhpbmQgZGF0YSBsaW5lcyBidXQgbm90IGluIG90aGVycy4KKyMgVGhlIFBlcmwgb3B0aW9uIC1wIGFib3ZlIHJ1bnMgYSB3aGlsZSg8PikgbG9vcCBhbmQgcHJpbnRzIHRoZSBleHByZXNzaW9uIG91dHB1dC4KK3MvXihbMC05YS1mQS1GXSsuKz8pICojLiovXDEvOwpkaWZmIC0tZ2l0IGEvdW5pY29kZS9jL2dlbnByb3BzL3Byb3BzMi5jcHAgYi91bmljb2RlL2MvZ2VucHJvcHMvcHJvcHMyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjhiZDVhCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZS9jL2dlbnByb3BzL3Byb3BzMi5jcHAKQEAgLTAsMCArMSw5MjAgQEAKKy8qCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgQ29weXJpZ2h0IChDKSAyMDAyLTIwMTAsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMKKyogICBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICBmaWxlIG5hbWU6ICBwcm9wczIuY3BwCisqICAgZW5jb2Rpbmc6ICAgVVMtQVNDSUkKKyogICB0YWIgc2l6ZTogICA4IChub3QgdXNlZCkKKyogICBpbmRlbnRhdGlvbjo0CisqCisqICAgY3JlYXRlZCBvbjogMjAwMmZlYjI0CisqICAgY3JlYXRlZCBieTogTWFya3VzIFcuIFNjaGVyZXIKKyoKKyogICBQYXJzZSBtb3JlIFVuaWNvZGUgQ2hhcmFjdGVyIERhdGFiYXNlIGZpbGVzIGFuZCBzdG9yZQorKiAgIGFkZGl0aW9uYWwgVW5pY29kZSBjaGFyYWN0ZXIgcHJvcGVydGllcyBpbiBiaXQgc2V0IHZlY3RvcnMuCisqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJ1bmljb2RlL3V0eXBlcy5oIgorI2luY2x1ZGUgInVuaWNvZGUvdWNoYXIuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3VuaXN0ci5oIgorI2luY2x1ZGUgInVuaWNvZGUvdXNjcmlwdC5oIgorI2luY2x1ZGUgImNzdHJpbmcuaCIKKyNpbmNsdWRlICJjbWVtb3J5LmgiCisjaW5jbHVkZSAidXRyaWUyLmgiCisjaW5jbHVkZSAidXByb3BzLmgiCisjaW5jbHVkZSAicHJvcHN2ZWMuaCIKKyNpbmNsdWRlICJ1cGFyc2UuaCIKKyNpbmNsdWRlICJ3cml0ZXNyYy5oIgorI2luY2x1ZGUgImdlbnByb3BzLmgiCisKKyNkZWZpbmUgTEVOR1RIT0YoYXJyYXkpIChpbnQzMl90KShzaXplb2YoYXJyYXkpL3NpemVvZigoYXJyYXkpWzBdKSkKKworVV9OQU1FU1BBQ0VfVVNFCisKKy8qIGRhdGEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBVVHJpZTIgKm5ld1RyaWU7CitVUHJvcHNWZWN0b3JzICpwdjsKKworc3RhdGljIFVuaWNvZGVTdHJpbmcgKnNjcmlwdEV4dGVuc2lvbnM7CisKKy8qIG1pc2NlbGxhbmVvdXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBjaGFyICoKK3RyaW1UZXJtaW5hdGVGaWVsZChjaGFyICpzLCBjaGFyICpsaW1pdCkgeworICAgIC8qIHRyaW0gbGVhZGluZyB3aGl0ZXNwYWNlICovCisgICAgcz0oY2hhciAqKXVfc2tpcFdoaXRlc3BhY2Uocyk7CisKKyAgICAvKiB0cmltIHRyYWlsaW5nIHdoaXRlc3BhY2UgKi8KKyAgICB3aGlsZShzPGxpbWl0ICYmIFVfSVNfSU5WX1dISVRFU1BBQ0UoKihsaW1pdC0xKSkpIHsKKyAgICAgICAgLS1saW1pdDsKKyAgICB9CisgICAgKmxpbWl0PTA7CisKKyAgICByZXR1cm4gczsKK30KKworc3RhdGljIHZvaWQKK3BhcnNlVHdvRmllbGRGaWxlKGNoYXIgKmZpbGVuYW1lLCBjaGFyICpiYXNlbmFtZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVjZEZpbGUsIGNvbnN0IGNoYXIgKnN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgIFVQYXJzZUxpbmVGbiAqbGluZUZuLAorICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSAqcEVycm9yQ29kZSkgeworICAgIGNoYXIgKmZpZWxkc1syXVsyXTsKKworICAgIGlmKHBFcnJvckNvZGU9PU5VTEwgfHwgVV9GQUlMVVJFKCpwRXJyb3JDb2RlKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgd3JpdGVVQ0RGaWxlbmFtZShiYXNlbmFtZSwgdWNkRmlsZSwgc3VmZml4KTsKKworICAgIHVfcGFyc2VEZWxpbWl0ZWRGaWxlKGZpbGVuYW1lLCAnOycsIGZpZWxkcywgMiwgbGluZUZuLCBOVUxMLCBwRXJyb3JDb2RlKTsKKyAgICBpZihVX0ZBSUxVUkUoKnBFcnJvckNvZGUpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZXJyb3IgcGFyc2luZyAlcy50eHQ6ICVzXG4iLCB1Y2RGaWxlLCB1X2Vycm9yTmFtZSgqcEVycm9yQ29kZSkpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgVV9DQUxMQ09OVgorYWdlTGluZUZuKHZvaWQgKmNvbnRleHQsCisgICAgICAgICAgY2hhciAqZmllbGRzW11bMl0sIGludDMyX3QgZmllbGRDb3VudCwKKyAgICAgICAgICBVRXJyb3JDb2RlICpwRXJyb3JDb2RlKTsKKworc3RhdGljIHZvaWQgVV9DQUxMQ09OVgorc2NyaXB0RXh0ZW5zaW9uc0xpbmVGbih2b2lkICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpmaWVsZHNbXVsyXSwgaW50MzJfdCBmaWVsZENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICpwRXJyb3JDb2RlKTsKKworc3RhdGljIHZvaWQKK3BhcnNlTXVsdGlGaWVsZEZpbGUoY2hhciAqZmlsZW5hbWUsIGNoYXIgKmJhc2VuYW1lLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp1Y2RGaWxlLCBjb25zdCBjaGFyICpzdWZmaXgsCisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZmllbGRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgVVBhcnNlTGluZUZuICpsaW5lRm4sCisgICAgICAgICAgICAgICAgICAgIFVFcnJvckNvZGUgKnBFcnJvckNvZGUpIHsKKyAgICBjaGFyICpmaWVsZHNbMjBdWzJdOworCisgICAgaWYocEVycm9yQ29kZT09TlVMTCB8fCBVX0ZBSUxVUkUoKnBFcnJvckNvZGUpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB3cml0ZVVDREZpbGVuYW1lKGJhc2VuYW1lLCB1Y2RGaWxlLCBzdWZmaXgpOworCisgICAgdV9wYXJzZURlbGltaXRlZEZpbGUoZmlsZW5hbWUsICc7JywgZmllbGRzLCBmaWVsZENvdW50LCBsaW5lRm4sIE5VTEwsIHBFcnJvckNvZGUpOworICAgIGlmKFVfRkFJTFVSRSgqcEVycm9yQ29kZSkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJlcnJvciBwYXJzaW5nICVzLnR4dDogJXNcbiIsIHVjZEZpbGUsIHVfZXJyb3JOYW1lKCpwRXJyb3JDb2RlKSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBVX0NBTExDT05WCitudW1lcmljTGluZUZuKHZvaWQgKmNvbnRleHQsCisgICAgICAgICAgICAgIGNoYXIgKmZpZWxkc1tdWzJdLCBpbnQzMl90IGZpZWxkQ291bnQsCisgICAgICAgICAgICAgIFVFcnJvckNvZGUgKnBFcnJvckNvZGUpOworCisvKiBwYXJzZSBmaWxlcyB3aXRoIHNpbmdsZSBlbnVtZXJhdGVkIHByb3BlcnRpZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdHJ1Y3QgU2luZ2xlRW51bSB7CisgICAgY29uc3QgY2hhciAqdWNkRmlsZSwgKnByb3BOYW1lOworICAgIFVQcm9wZXJ0eSBwcm9wOworICAgIGludDMyX3QgdmVjV29yZCwgdmVjU2hpZnQ7CisgICAgdWludDMyX3QgdmVjTWFzazsKK307Cit0eXBlZGVmIHN0cnVjdCBTaW5nbGVFbnVtIFNpbmdsZUVudW07CisKK3N0YXRpYyB2b2lkCitwYXJzZVNpbmdsZUVudW1GaWxlKGNoYXIgKmZpbGVuYW1lLCBjaGFyICpiYXNlbmFtZSwgY29uc3QgY2hhciAqc3VmZml4LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBTaW5nbGVFbnVtICpzZW4sCisgICAgICAgICAgICAgICAgICAgIFVFcnJvckNvZGUgKnBFcnJvckNvZGUpOworCitzdGF0aWMgY29uc3QgU2luZ2xlRW51bSBzY3JpcHRTaW5nbGVFbnVtPXsgCisgICAgIlNjcmlwdHMiLCAic2NyaXB0IiwgCisgICAgVUNIQVJfU0NSSVBULCAKKyAgICAwLCAwLCBVUFJPUFNfU0NSSVBUX01BU0sKK307CisKK3N0YXRpYyBjb25zdCBTaW5nbGVFbnVtIGJsb2NrU2luZ2xlRW51bT17CisgICAgIkJsb2NrcyIsICJibG9jayIsCisgICAgVUNIQVJfQkxPQ0ssCisgICAgMCwgVVBST1BTX0JMT0NLX1NISUZULCBVUFJPUFNfQkxPQ0tfTUFTSworfTsKKworc3RhdGljIGNvbnN0IFNpbmdsZUVudW0gZ3JhcGhlbWVDbHVzdGVyQnJlYWtTaW5nbGVFbnVtPXsKKyAgICAiR3JhcGhlbWVCcmVha1Byb3BlcnR5IiwgIkdyYXBoZW1lX0NsdXN0ZXJfQnJlYWsiLAorICAgIFVDSEFSX0dSQVBIRU1FX0NMVVNURVJfQlJFQUssCisgICAgMiwgVVBST1BTX0dDQl9TSElGVCwgVVBST1BTX0dDQl9NQVNLCit9OworCitzdGF0aWMgY29uc3QgU2luZ2xlRW51bSB3b3JkQnJlYWtTaW5nbGVFbnVtPXsKKyAgICAiV29yZEJyZWFrUHJvcGVydHkiLCAiV29yZF9CcmVhayIsCisgICAgVUNIQVJfV09SRF9CUkVBSywKKyAgICAyLCBVUFJPUFNfV0JfU0hJRlQsIFVQUk9QU19XQl9NQVNLCit9OworCitzdGF0aWMgY29uc3QgU2luZ2xlRW51bSBzZW50ZW5jZUJyZWFrU2luZ2xlRW51bT17CisgICAgIlNlbnRlbmNlQnJlYWtQcm9wZXJ0eSIsICJTZW50ZW5jZV9CcmVhayIsCisgICAgVUNIQVJfU0VOVEVOQ0VfQlJFQUssCisgICAgMiwgVVBST1BTX1NCX1NISUZULCBVUFJPUFNfU0JfTUFTSworfTsKKworc3RhdGljIGNvbnN0IFNpbmdsZUVudW0gbGluZUJyZWFrU2luZ2xlRW51bT17CisgICAgIkxpbmVCcmVhayIsICJsaW5lIGJyZWFrIiwKKyAgICBVQ0hBUl9MSU5FX0JSRUFLLAorICAgIDIsIFVQUk9QU19MQl9TSElGVCwgVVBST1BTX0xCX01BU0sKK307CisKK3N0YXRpYyBjb25zdCBTaW5nbGVFbnVtIGVhd1NpbmdsZUVudW09eworICAgICJFYXN0QXNpYW5XaWR0aCIsICJlYXN0IGFzaWFuIHdpZHRoIiwKKyAgICBVQ0hBUl9FQVNUX0FTSUFOX1dJRFRILAorICAgIDAsIFVQUk9QU19FQV9TSElGVCwgVVBST1BTX0VBX01BU0sKK307CisKK3N0YXRpYyB2b2lkIFVfQ0FMTENPTlYKK3NpbmdsZUVudW1MaW5lRm4odm9pZCAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgY2hhciAqZmllbGRzW11bMl0sIGludDMyX3QgZmllbGRDb3VudCwKKyAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSAqcEVycm9yQ29kZSkgeworICAgIGNvbnN0IFNpbmdsZUVudW0gKnNlbjsKKyAgICBjaGFyICpzOworICAgIHVpbnQzMl90IHN0YXJ0LCBlbmQsIHV2OworICAgIGludDMyX3QgdmFsdWU7CisKKyAgICBzZW49KGNvbnN0IFNpbmdsZUVudW0gKiljb250ZXh0OworCisgICAgdV9wYXJzZUNvZGVQb2ludFJhbmdlKGZpZWxkc1swXVswXSwgJnN0YXJ0LCAmZW5kLCBwRXJyb3JDb2RlKTsKKyAgICBpZihVX0ZBSUxVUkUoKnBFcnJvckNvZGUpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2VucHJvcHM6IHN5bnRheCBlcnJvciBpbiAlcy50eHQgZmllbGQgMCBhdCAlc1xuIiwgc2VuLT51Y2RGaWxlLCBmaWVsZHNbMF1bMF0pOworICAgICAgICBleGl0KCpwRXJyb3JDb2RlKTsKKyAgICB9CisKKyAgICAvKiBwYXJzZSBwcm9wZXJ0eSBhbGlhcyAqLworICAgIHM9dHJpbVRlcm1pbmF0ZUZpZWxkKGZpZWxkc1sxXVswXSwgZmllbGRzWzFdWzFdKTsKKyAgICB2YWx1ZT11X2dldFByb3BlcnR5VmFsdWVFbnVtKHNlbi0+cHJvcCwgcyk7CisgICAgaWYodmFsdWU8MCkgeworICAgICAgICBpZihzZW4tPnByb3A9PVVDSEFSX0JMT0NLKSB7CisgICAgICAgICAgICBpZihpc1Rva2VuKCJHcmVlayIsIHMpKSB7CisgICAgICAgICAgICAgICAgdmFsdWU9VUJMT0NLX0dSRUVLOyAvKiBVbmljb2RlIDMuMiByZW5hbWVzIHRoaXMgdG8gIkdyZWVrIGFuZCBDb3B0aWMiICovCisgICAgICAgICAgICB9IGVsc2UgaWYoaXNUb2tlbigiQ29tYmluaW5nIE1hcmtzIGZvciBTeW1ib2xzIiwgcykpIHsKKyAgICAgICAgICAgICAgICB2YWx1ZT1VQkxPQ0tfQ09NQklOSU5HX01BUktTX0ZPUl9TWU1CT0xTOyAvKiBVbmljb2RlIDMuMiByZW5hbWVzIHRoaXMgdG8gIkNvbWJpbmluZyBEaWFjcml0aWNhbCBNYXJrcyBmb3IgU3ltYm9scyIgKi8KKyAgICAgICAgICAgIH0gZWxzZSBpZihpc1Rva2VuKCJQcml2YXRlIFVzZSIsIHMpKSB7CisgICAgICAgICAgICAgICAgdmFsdWU9VUJMT0NLX1BSSVZBVEVfVVNFOyAvKiBVbmljb2RlIDMuMiByZW5hbWVzIHRoaXMgdG8gIlByaXZhdGUgVXNlIEFyZWEiICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYodmFsdWU8MCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbnByb3BzIGVycm9yOiB1bmtub3duICVzIG5hbWUgaW4gJXMudHh0IGZpZWxkIDEgYXQgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBzZW4tPnByb3BOYW1lLCBzZW4tPnVjZEZpbGUsIHMpOworICAgICAgICBleGl0KFVfUEFSU0VfRVJST1IpOworICAgIH0KKworICAgIHV2PSh1aW50MzJfdCkodmFsdWU8PHNlbi0+dmVjU2hpZnQpOworICAgIGlmKCh1diZzZW4tPnZlY01hc2spIT11dikgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbnByb3BzIGVycm9yOiAlcyB2YWx1ZSBvdmVyZmxvdyAoMHgleCkgYXQgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBzZW4tPnByb3BOYW1lLCAoaW50KXV2LCBzKTsKKyAgICAgICAgZXhpdChVX0lOVEVSTkFMX1BST0dSQU1fRVJST1IpOworICAgIH0KKworICAgIGlmKHN0YXJ0PT0wICYmIGVuZD09MHgxMGZmZmYpIHsKKyAgICAgICAgLyogQWxzbyBzZXQgYml0cyBmb3IgaW5pdGlhbFZhbHVlIGFuZCBlcnJvclZhbHVlLiAqLworICAgICAgICBlbmQ9VVBWRUNfTUFYX0NQOworICAgIH0KKyAgICB1cHZlY19zZXRWYWx1ZShwdiwgc3RhcnQsIGVuZCwgc2VuLT52ZWNXb3JkLCB1diwgc2VuLT52ZWNNYXNrLCBwRXJyb3JDb2RlKTsKKyAgICBpZihVX0ZBSUxVUkUoKnBFcnJvckNvZGUpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2VucHJvcHMgZXJyb3I6IHVuYWJsZSB0byBzZXQgJXMgY29kZTogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBzZW4tPnByb3BOYW1lLCB1X2Vycm9yTmFtZSgqcEVycm9yQ29kZSkpOworICAgICAgICBleGl0KCpwRXJyb3JDb2RlKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitwYXJzZVNpbmdsZUVudW1GaWxlKGNoYXIgKmZpbGVuYW1lLCBjaGFyICpiYXNlbmFtZSwgY29uc3QgY2hhciAqc3VmZml4LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBTaW5nbGVFbnVtICpzZW4sCisgICAgICAgICAgICAgICAgICAgIFVFcnJvckNvZGUgKnBFcnJvckNvZGUpIHsKKyAgICBjaGFyICpmaWVsZHNbMl1bMl07CisKKyAgICBpZihwRXJyb3JDb2RlPT1OVUxMIHx8IFVfRkFJTFVSRSgqcEVycm9yQ29kZSkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHdyaXRlVUNERmlsZW5hbWUoYmFzZW5hbWUsIHNlbi0+dWNkRmlsZSwgc3VmZml4KTsKKworICAgIHVfcGFyc2VEZWxpbWl0ZWRGaWxlKGZpbGVuYW1lLCAnOycsIGZpZWxkcywgMiwgc2luZ2xlRW51bUxpbmVGbiwgKHZvaWQgKilzZW4sIHBFcnJvckNvZGUpOworICAgIGlmKFVfRkFJTFVSRSgqcEVycm9yQ29kZSkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJlcnJvciBwYXJzaW5nICVzLnR4dDogJXNcbiIsIHNlbi0+dWNkRmlsZSwgdV9lcnJvck5hbWUoKnBFcnJvckNvZGUpKTsKKyAgICB9Cit9CisKKy8qIHBhcnNlIGZpbGVzIHdpdGggbXVsdGlwbGUgYmluYXJ5IHByb3BlcnRpZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0cnVjdCBCaW5hcnkgeworICAgIGNvbnN0IGNoYXIgKnByb3BOYW1lOworICAgIGludDMyX3QgdmVjV29yZCwgdmVjU2hpZnQ7Cit9OwordHlwZWRlZiBzdHJ1Y3QgQmluYXJ5IEJpbmFyeTsKKworc3RydWN0IEJpbmFyaWVzIHsKKyAgICBjb25zdCBjaGFyICp1Y2RGaWxlOworICAgIGNvbnN0IEJpbmFyeSAqYmluYXJpZXM7CisgICAgaW50MzJfdCBiaW5hcmllc0NvdW50OworfTsKK3R5cGVkZWYgc3RydWN0IEJpbmFyaWVzIEJpbmFyaWVzOworCitzdGF0aWMgY29uc3QgQmluYXJ5Citwcm9wTGlzdE5hbWVzW109eworICAgIHsgIldoaXRlX1NwYWNlIiwgICAgICAgICAgICAgICAgICAgICAgICAxLCBVUFJPUFNfV0hJVEVfU1BBQ0UgfSwKKyAgICB7ICJEYXNoIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgVVBST1BTX0RBU0ggfSwKKyAgICB7ICJIeXBoZW4iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgVVBST1BTX0hZUEhFTiB9LAorICAgIHsgIlF1b3RhdGlvbl9NYXJrIiwgICAgICAgICAgICAgICAgICAgICAxLCBVUFJPUFNfUVVPVEFUSU9OX01BUksgfSwKKyAgICB7ICJUZXJtaW5hbF9QdW5jdHVhdGlvbiIsICAgICAgICAgICAgICAgMSwgVVBST1BTX1RFUk1JTkFMX1BVTkNUVUFUSU9OIH0sCisgICAgeyAiSGV4X0RpZ2l0IiwgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIFVQUk9QU19IRVhfRElHSVQgfSwKKyAgICB7ICJBU0NJSV9IZXhfRGlnaXQiLCAgICAgICAgICAgICAgICAgICAgMSwgVVBST1BTX0FTQ0lJX0hFWF9ESUdJVCB9LAorICAgIHsgIklkZW9ncmFwaGljIiwgICAgICAgICAgICAgICAgICAgICAgICAxLCBVUFJPUFNfSURFT0dSQVBISUMgfSwKKyAgICB7ICJEaWFjcml0aWMiLCAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgVVBST1BTX0RJQUNSSVRJQyB9LAorICAgIHsgIkV4dGVuZGVyIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBVUFJPUFNfRVhURU5ERVIgfSwKKyAgICB7ICJOb25jaGFyYWN0ZXJfQ29kZV9Qb2ludCIsICAgICAgICAgICAgMSwgVVBST1BTX05PTkNIQVJBQ1RFUl9DT0RFX1BPSU5UIH0sCisgICAgeyAiR3JhcGhlbWVfTGluayIsICAgICAgICAgICAgICAgICAgICAgIDEsIFVQUk9QU19HUkFQSEVNRV9MSU5LIH0sCisgICAgeyAiSURTX0JpbmFyeV9PcGVyYXRvciIsICAgICAgICAgICAgICAgIDEsIFVQUk9QU19JRFNfQklOQVJZX09QRVJBVE9SIH0sCisgICAgeyAiSURTX1RyaW5hcnlfT3BlcmF0b3IiLCAgICAgICAgICAgICAgIDEsIFVQUk9QU19JRFNfVFJJTkFSWV9PUEVSQVRPUiB9LAorICAgIHsgIlJhZGljYWwiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBVUFJPUFNfUkFESUNBTCB9LAorICAgIHsgIlVuaWZpZWRfSWRlb2dyYXBoIiwgICAgICAgICAgICAgICAgICAxLCBVUFJPUFNfVU5JRklFRF9JREVPR1JBUEggfSwKKyAgICB7ICJEZXByZWNhdGVkIiwgICAgICAgICAgICAgICAgICAgICAgICAgMSwgVVBST1BTX0RFUFJFQ0FURUQgfSwKKyAgICB7ICJMb2dpY2FsX09yZGVyX0V4Y2VwdGlvbiIsICAgICAgICAgICAgMSwgVVBST1BTX0xPR0lDQUxfT1JERVJfRVhDRVBUSU9OIH0sCisKKyAgICAvKiBuZXcgcHJvcGVydGllcyBpbiBVbmljb2RlIDQuMC4xICovCisgICAgeyAiU1Rlcm0iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIFVQUk9QU19TX1RFUk0gfSwKKyAgICB7ICJWYXJpYXRpb25fU2VsZWN0b3IiLCAgICAgICAgICAgICAgICAgMSwgVVBST1BTX1ZBUklBVElPTl9TRUxFQ1RPUiB9LAorCisgICAgLyogbmV3IHByb3BlcnRpZXMgaW4gVW5pY29kZSA0LjEgKi8KKyAgICB7ICJQYXR0ZXJuX1N5bnRheCIsICAgICAgICAgICAgICAgICAgICAgMSwgVVBST1BTX1BBVFRFUk5fU1lOVEFYIH0sCisgICAgeyAiUGF0dGVybl9XaGl0ZV9TcGFjZSIsICAgICAgICAgICAgICAgIDEsIFVQUk9QU19QQVRURVJOX1dISVRFX1NQQUNFIH0KK307CisKK3N0YXRpYyBjb25zdCBCaW5hcmllcworcHJvcExpc3RCaW5hcmllcz17CisgICAgIlByb3BMaXN0IiwgcHJvcExpc3ROYW1lcywgTEVOR1RIT0YocHJvcExpc3ROYW1lcykKK307CisKK3N0YXRpYyBjb25zdCBCaW5hcnkKK2RlckNvcmVQcm9wc05hbWVzW109eworICAgIHsgIlhJRF9TdGFydCIsICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBVUFJPUFNfWElEX1NUQVJUIH0sCisgICAgeyAiWElEX0NvbnRpbnVlIiwgICAgICAgICAgICAgICAgICAgICAgIDEsIFVQUk9QU19YSURfQ09OVElOVUUgfSwKKworICAgIC8qIGJlZm9yZSBVbmljb2RlIDQvSUNVIDIuNi9mb3JtYXQgdmVyc2lvbiAzLjIsIHRoZXNlIHVzZWQgdG8gYmUgT3RoZXJfWFlaIGZyb20gUHJvcExpc3QudHh0ICovCisgICAgeyAiTWF0aCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIFVQUk9QU19NQVRIIH0sCisgICAgeyAiQWxwaGFiZXRpYyIsICAgICAgICAgICAgICAgICAgICAgICAgIDEsIFVQUk9QU19BTFBIQUJFVElDIH0sCisgICAgeyAiR3JhcGhlbWVfRXh0ZW5kIiwgICAgICAgICAgICAgICAgICAgIDEsIFVQUk9QU19HUkFQSEVNRV9FWFRFTkQgfSwKKyAgICB7ICJEZWZhdWx0X0lnbm9yYWJsZV9Db2RlX1BvaW50IiwgICAgICAgMSwgVVBST1BTX0RFRkFVTFRfSUdOT1JBQkxFX0NPREVfUE9JTlQgfSwKKworICAgIC8qIG5ldyBwcm9wZXJ0aWVzIGJpdHMgaW4gSUNVIDIuNi9mb3JtYXQgdmVyc2lvbiAzLjIgKi8KKyAgICB7ICJJRF9TdGFydCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgVVBST1BTX0lEX1NUQVJUIH0sCisgICAgeyAiSURfQ29udGludWUiLCAgICAgICAgICAgICAgICAgICAgICAgIDEsIFVQUk9QU19JRF9DT05USU5VRSB9LAorICAgIHsgIkdyYXBoZW1lX0Jhc2UiLCAgICAgICAgICAgICAgICAgICAgICAxLCBVUFJPUFNfR1JBUEhFTUVfQkFTRSB9LAorCisgICAgLyoKKyAgICAgKiBVbmljb2RlIDUvSUNVIDMuNiBtb3ZlcyBHcmFwaGVtZV9MaW5rIGZyb20gUHJvcExpc3QudHh0CisgICAgICogdG8gRGVyaXZlZENvcmVQcm9wZXJ0aWVzLnR4dCBhbmQgZGVwcmVjYXRlcyBpdC4KKyAgICAgKi8KKyAgICB7ICJHcmFwaGVtZV9MaW5rIiwgICAgICAgICAgICAgICAgICAgICAgMSwgVVBST1BTX0dSQVBIRU1FX0xJTksgfQorfTsKKworc3RhdGljIGNvbnN0IEJpbmFyaWVzCitkZXJDb3JlUHJvcHNCaW5hcmllcz17CisgICAgIkRlcml2ZWRDb3JlUHJvcGVydGllcyIsIGRlckNvcmVQcm9wc05hbWVzLCBMRU5HVEhPRihkZXJDb3JlUHJvcHNOYW1lcykKK307CisKK3N0YXRpYyBjaGFyIGlnbm9yZWRQcm9wc1sxMDBdWzY0XTsKK3N0YXRpYyBpbnQzMl90IGlnbm9yZWRQcm9wc0NvdW50OworCitzdGF0aWMgdm9pZAorYWRkSWdub3JlZFByb3AoY2hhciAqcywgY2hhciAqbGltaXQpIHsKKyAgICBpbnQzMl90IGk7CisKKyAgICBzPXRyaW1UZXJtaW5hdGVGaWVsZChzLCBsaW1pdCk7CisgICAgZm9yKGk9MDsgaTxpZ25vcmVkUHJvcHNDb3VudDsgKytpKSB7CisgICAgICAgIGlmKDA9PXVwcnZfc3RyY21wKGlnbm9yZWRQcm9wc1tpXSwgcykpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICB1cHJ2X3N0cmNweShpZ25vcmVkUHJvcHNbaWdub3JlZFByb3BzQ291bnQrK10sIHMpOworfQorCitzdGF0aWMgdm9pZCBVX0NBTExDT05WCitiaW5hcmllc0xpbmVGbih2b2lkICpjb250ZXh0LAorICAgICAgICAgICAgICAgY2hhciAqZmllbGRzW11bMl0sIGludDMyX3QgZmllbGRDb3VudCwKKyAgICAgICAgICAgICAgIFVFcnJvckNvZGUgKnBFcnJvckNvZGUpIHsKKyAgICBjb25zdCBCaW5hcmllcyAqYmluOworICAgIGNoYXIgKnM7CisgICAgdWludDMyX3Qgc3RhcnQsIGVuZCwgdXY7CisgICAgaW50MzJfdCBpOworCisgICAgYmluPShjb25zdCBCaW5hcmllcyAqKWNvbnRleHQ7CisKKyAgICB1X3BhcnNlQ29kZVBvaW50UmFuZ2UoZmllbGRzWzBdWzBdLCAmc3RhcnQsICZlbmQsIHBFcnJvckNvZGUpOworICAgIGlmKFVfRkFJTFVSRSgqcEVycm9yQ29kZSkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5wcm9wczogc3ludGF4IGVycm9yIGluICVzLnR4dCBmaWVsZCAwIGF0ICVzXG4iLCBiaW4tPnVjZEZpbGUsIGZpZWxkc1swXVswXSk7CisgICAgICAgIGV4aXQoKnBFcnJvckNvZGUpOworICAgIH0KKworICAgIC8qIHBhcnNlIGJpbmFyeSBwcm9wZXJ0eSBuYW1lICovCisgICAgcz0oY2hhciAqKXVfc2tpcFdoaXRlc3BhY2UoZmllbGRzWzFdWzBdKTsKKyAgICBmb3IoaT0wOzsgKytpKSB7CisgICAgICAgIGlmKGk9PWJpbi0+YmluYXJpZXNDb3VudCkgeworICAgICAgICAgICAgLyogaWdub3JlIHVucmVjb2duaXplZCBwcm9wZXJ0aWVzICovCisgICAgICAgICAgICBpZihiZVZlcmJvc2UpIHsKKyAgICAgICAgICAgICAgICBhZGRJZ25vcmVkUHJvcChzLCBmaWVsZHNbMV1bMV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmKGlzVG9rZW4oYmluLT5iaW5hcmllc1tpXS5wcm9wTmFtZSwgcykpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYoYmluLT5iaW5hcmllc1tpXS52ZWNTaGlmdD49MzIpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5wcm9wcyBlcnJvcjogc2hpZnQgdmFsdWUgJWQ+PTMyIGZvciAlcyAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpYmluLT5iaW5hcmllc1tpXS52ZWNTaGlmdCwgYmluLT51Y2RGaWxlLCBiaW4tPmJpbmFyaWVzW2ldLnByb3BOYW1lKTsKKyAgICAgICAgZXhpdChVX0lOVEVSTkFMX1BST0dSQU1fRVJST1IpOworICAgIH0KKyAgICB1dj1VX01BU0soYmluLT5iaW5hcmllc1tpXS52ZWNTaGlmdCk7CisKKyAgICBpZihzdGFydD09MCAmJiBlbmQ9PTB4MTBmZmZmKSB7CisgICAgICAgIC8qIEFsc28gc2V0IGJpdHMgZm9yIGluaXRpYWxWYWx1ZSBhbmQgZXJyb3JWYWx1ZS4gKi8KKyAgICAgICAgZW5kPVVQVkVDX01BWF9DUDsKKyAgICB9CisgICAgdXB2ZWNfc2V0VmFsdWUocHYsIHN0YXJ0LCBlbmQsIGJpbi0+YmluYXJpZXNbaV0udmVjV29yZCwgdXYsIHV2LCBwRXJyb3JDb2RlKTsKKyAgICBpZihVX0ZBSUxVUkUoKnBFcnJvckNvZGUpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2VucHJvcHMgZXJyb3I6IHVuYWJsZSB0byBzZXQgJXMgY29kZTogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBiaW4tPmJpbmFyaWVzW2ldLnByb3BOYW1lLCB1X2Vycm9yTmFtZSgqcEVycm9yQ29kZSkpOworICAgICAgICBleGl0KCpwRXJyb3JDb2RlKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitwYXJzZUJpbmFyaWVzRmlsZShjaGFyICpmaWxlbmFtZSwgY2hhciAqYmFzZW5hbWUsIGNvbnN0IGNoYXIgKnN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IEJpbmFyaWVzICpiaW4sCisgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICpwRXJyb3JDb2RlKSB7CisgICAgY2hhciAqZmllbGRzWzJdWzJdOworICAgIGludDMyX3QgaTsKKworICAgIGlmKHBFcnJvckNvZGU9PU5VTEwgfHwgVV9GQUlMVVJFKCpwRXJyb3JDb2RlKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgd3JpdGVVQ0RGaWxlbmFtZShiYXNlbmFtZSwgYmluLT51Y2RGaWxlLCBzdWZmaXgpOworCisgICAgaWdub3JlZFByb3BzQ291bnQ9MDsKKworICAgIHVfcGFyc2VEZWxpbWl0ZWRGaWxlKGZpbGVuYW1lLCAnOycsIGZpZWxkcywgMiwgYmluYXJpZXNMaW5lRm4sICh2b2lkICopYmluLCBwRXJyb3JDb2RlKTsKKyAgICBpZihVX0ZBSUxVUkUoKnBFcnJvckNvZGUpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZXJyb3IgcGFyc2luZyAlcy50eHQ6ICVzXG4iLCBiaW4tPnVjZEZpbGUsIHVfZXJyb3JOYW1lKCpwRXJyb3JDb2RlKSk7CisgICAgfQorCisgICAgaWYoYmVWZXJib3NlKSB7CisgICAgICAgIGZvcihpPTA7IGk8aWdub3JlZFByb3BzQ291bnQ7ICsraSkgeworICAgICAgICAgICAgcHJpbnRmKCJnZW5wcm9wczogaWdub3JpbmcgcHJvcGVydHkgJXMgaW4gJXMudHh0XG4iLCBpZ25vcmVkUHJvcHNbaV0sIGJpbi0+dWNkRmlsZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK1VfQ0ZVTkMgdm9pZAoraW5pdEFkZGl0aW9uYWxQcm9wZXJ0aWVzKCkgeworICAgIFVFcnJvckNvZGUgZXJyb3JDb2RlPVVfWkVST19FUlJPUjsKKyAgICBwdj11cHZlY19vcGVuKFVQUk9QU19WRUNUT1JfV09SRFMsICZlcnJvckNvZGUpOworICAgIGlmKFVfRkFJTFVSRShlcnJvckNvZGUpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZXJyb3I6IHVwdmVjX29wZW4oKSBmYWlsZWQgLSAlc1xuIiwgdV9lcnJvck5hbWUoZXJyb3JDb2RlKSk7CisgICAgICAgIGV4aXQoZXJyb3JDb2RlKTsKKyAgICB9CisgICAgc2NyaXB0RXh0ZW5zaW9ucz1uZXcgVW5pY29kZVN0cmluZzsKK30KKworVV9DRlVOQyB2b2lkCitleGl0QWRkaXRpb25hbFByb3BlcnRpZXMoKSB7CisgICAgdXRyaWUyX2Nsb3NlKG5ld1RyaWUpOworICAgIHVwdmVjX2Nsb3NlKHB2KTsKKyAgICBkZWxldGUgc2NyaXB0RXh0ZW5zaW9uczsKK30KKworVV9DRlVOQyB2b2lkCitnZW5lcmF0ZUFkZGl0aW9uYWxQcm9wZXJ0aWVzKGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICpzdWZmaXgsIFVFcnJvckNvZGUgKnBFcnJvckNvZGUpIHsKKyAgICBjaGFyICpiYXNlbmFtZTsKKworICAgIGJhc2VuYW1lPWZpbGVuYW1lK3VwcnZfc3RybGVuKGZpbGVuYW1lKTsKKworICAgIC8qIHByb2Nlc3MgdmFyaW91cyBVQ0QgLnR4dCBmaWxlcyAqLworCisgICAgLyogYWRkIEhhbiBudW1lcmljIHR5cGVzICYgdmFsdWVzICovCisgICAgcGFyc2VNdWx0aUZpZWxkRmlsZShmaWxlbmFtZSwgYmFzZW5hbWUsICJEZXJpdmVkTnVtZXJpY1ZhbHVlcyIsIHN1ZmZpeCwgMiwgbnVtZXJpY0xpbmVGbiwgcEVycm9yQ29kZSk7CisKKyAgICBwYXJzZVR3b0ZpZWxkRmlsZShmaWxlbmFtZSwgYmFzZW5hbWUsICJEZXJpdmVkQWdlIiwgc3VmZml4LCBhZ2VMaW5lRm4sIHBFcnJvckNvZGUpOworCisgICAgcGFyc2VTaW5nbGVFbnVtRmlsZShmaWxlbmFtZSwgYmFzZW5hbWUsIHN1ZmZpeCwgJnNjcmlwdFNpbmdsZUVudW0sIHBFcnJvckNvZGUpOworCisgICAgcGFyc2VUd29GaWVsZEZpbGUoZmlsZW5hbWUsIGJhc2VuYW1lLCAiU2NyaXB0RXh0ZW5zaW9ucyIsIHN1ZmZpeCwgc2NyaXB0RXh0ZW5zaW9uc0xpbmVGbiwgcEVycm9yQ29kZSk7CisKKyAgICBwYXJzZVNpbmdsZUVudW1GaWxlKGZpbGVuYW1lLCBiYXNlbmFtZSwgc3VmZml4LCAmYmxvY2tTaW5nbGVFbnVtLCBwRXJyb3JDb2RlKTsKKworICAgIHBhcnNlQmluYXJpZXNGaWxlKGZpbGVuYW1lLCBiYXNlbmFtZSwgc3VmZml4LCAmcHJvcExpc3RCaW5hcmllcywgcEVycm9yQ29kZSk7CisKKyAgICBwYXJzZUJpbmFyaWVzRmlsZShmaWxlbmFtZSwgYmFzZW5hbWUsIHN1ZmZpeCwgJmRlckNvcmVQcm9wc0JpbmFyaWVzLCBwRXJyb3JDb2RlKTsKKworICAgIHBhcnNlU2luZ2xlRW51bUZpbGUoZmlsZW5hbWUsIGJhc2VuYW1lLCBzdWZmaXgsICZncmFwaGVtZUNsdXN0ZXJCcmVha1NpbmdsZUVudW0sIHBFcnJvckNvZGUpOworCisgICAgcGFyc2VTaW5nbGVFbnVtRmlsZShmaWxlbmFtZSwgYmFzZW5hbWUsIHN1ZmZpeCwgJndvcmRCcmVha1NpbmdsZUVudW0sIHBFcnJvckNvZGUpOworCisgICAgcGFyc2VTaW5nbGVFbnVtRmlsZShmaWxlbmFtZSwgYmFzZW5hbWUsIHN1ZmZpeCwgJnNlbnRlbmNlQnJlYWtTaW5nbGVFbnVtLCBwRXJyb3JDb2RlKTsKKworICAgIC8qCisgICAgICogTGluZUJyZWFrLTQuMC4wLnR4dDoKKyAgICAgKiAgLSBBbGwgY29kZSBwb2ludHMsIGFzc2lnbmVkIGFuZCB1bmFzc2lnbmVkLCB0aGF0IGFyZSBub3QgbGlzdGVkIAorICAgICAqICAgICAgICAgZXhwbGljaXRseSBhcmUgZ2l2ZW4gdGhlIHZhbHVlICJYWCIuCisgICAgICoKKyAgICAgKiBYWD09VV9MQl9VTktOT1dOPT0wIC0gbm90aGluZyB0byBkbworICAgICAqLworICAgIHBhcnNlU2luZ2xlRW51bUZpbGUoZmlsZW5hbWUsIGJhc2VuYW1lLCBzdWZmaXgsICZsaW5lQnJlYWtTaW5nbGVFbnVtLCBwRXJyb3JDb2RlKTsKKworICAgIC8qCisgICAgICogUHJlc2V0IEVhc3QgQXNpYW4gV2lkdGggZGVmYXVsdHM6CisgICAgICoKKyAgICAgKiBodHRwOi8vd3d3LnVuaWNvZGUub3JnL3JlcG9ydHMvdHIxMS8jVW5hc3NpZ25lZAorICAgICAqIDcuMSBVbmFzc2lnbmVkIGFuZCBQcml2YXRlIFVzZSBjaGFyYWN0ZXJzCisgICAgICoKKyAgICAgKiBBbGwgdW5hc3NpZ25lZCBjaGFyYWN0ZXJzIGFyZSBieSBkZWZhdWx0IGNsYXNzaWZpZWQgYXMgbm9uLUVhc3QgQXNpYW4gbmV1dHJhbCwKKyAgICAgKiBleGNlcHQgZm9yIHRoZSByYW5nZSBVKzIwMDAwIHRvIFUrMkZGRkQsCisgICAgICogc2luY2UgYWxsIGNvZGUgcG9zaXRpb25zIGZyb20gVSsyMDAwMCB0byBVKzJGRkZEIGFyZSBpbnRlbmRlZCBmb3IgQ0pLIGlkZW9ncmFwaHMgKFcpLgorICAgICAqIEFsbCBQcml2YXRlIHVzZSBjaGFyYWN0ZXJzIGFyZSBieSBkZWZhdWx0IGNsYXNzaWZpZWQgYXMgYW1iaWd1b3VzLAorICAgICAqIHNpbmNlIHRoZWlyIGRlZmluaXRpb24gZGVwZW5kcyBvbiBjb250ZXh0LgorICAgICAqCisgICAgICogTiBmb3IgYWxsID09MCAtIG5vdGhpbmcgdG8gZG8KKyAgICAgKiBBIGZvciBQcml2YXRlIFVzZQorICAgICAqIFcgZm9yIHBsYW5lIDIKKyAgICAgKi8KKyAgICAqcEVycm9yQ29kZT1VX1pFUk9fRVJST1I7CisgICAgdXB2ZWNfc2V0VmFsdWUocHYsIDB4ZTAwMCwgMHhmOGZmLCAwLCAodWludDMyX3QpKFVfRUFfQU1CSUdVT1VTPDxVUFJPUFNfRUFfU0hJRlQpLCBVUFJPUFNfRUFfTUFTSywgcEVycm9yQ29kZSk7CisgICAgdXB2ZWNfc2V0VmFsdWUocHYsIDB4ZjAwMDAsIDB4ZmZmZmQsIDAsICh1aW50MzJfdCkoVV9FQV9BTUJJR1VPVVM8PFVQUk9QU19FQV9TSElGVCksIFVQUk9QU19FQV9NQVNLLCBwRXJyb3JDb2RlKTsKKyAgICB1cHZlY19zZXRWYWx1ZShwdiwgMHgxMDAwMDAsIDB4MTBmZmZkLCAwLCAodWludDMyX3QpKFVfRUFfQU1CSUdVT1VTPDxVUFJPUFNfRUFfU0hJRlQpLCBVUFJPUFNfRUFfTUFTSywgcEVycm9yQ29kZSk7CisgICAgdXB2ZWNfc2V0VmFsdWUocHYsIDB4MjAwMDAsIDB4MmZmZmQsIDAsICh1aW50MzJfdCkoVV9FQV9XSURFPDxVUFJPUFNfRUFfU0hJRlQpLCBVUFJPUFNfRUFfTUFTSywgcEVycm9yQ29kZSk7CisgICAgaWYoVV9GQUlMVVJFKCpwRXJyb3JDb2RlKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbnByb3BzOiB1bmFibGUgdG8gc2V0IGRlZmF1bHQgRWFzdCBBc2lhbiBXaWR0aHM6ICVzXG4iLCB1X2Vycm9yTmFtZSgqcEVycm9yQ29kZSkpOworICAgICAgICBleGl0KCpwRXJyb3JDb2RlKTsKKyAgICB9CisKKyAgICAvKiBwYXJzZSBFYXN0QXNpYW5XaWR0aC50eHQgKi8KKyAgICBwYXJzZVNpbmdsZUVudW1GaWxlKGZpbGVuYW1lLCBiYXNlbmFtZSwgc3VmZml4LCAmZWF3U2luZ2xlRW51bSwgcEVycm9yQ29kZSk7CisKKyAgICBuZXdUcmllPXVwdmVjX2NvbXBhY3RUb1VUcmllMldpdGhSb3dJbmRleGVzKHB2LCBwRXJyb3JDb2RlKTsKKyAgICBpZihVX0ZBSUxVUkUoKnBFcnJvckNvZGUpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2VucHJvcHMgZXJyb3I6IHVuYWJsZSB0byBidWlsZCB0cmllIGZvciBhZGRpdGlvbmFsIHByb3BlcnRpZXM6ICVzXG4iLAorICAgICAgICAgICAgICAgIHVfZXJyb3JOYW1lKCpwRXJyb3JDb2RlKSk7CisgICAgICAgIGV4aXQoKnBFcnJvckNvZGUpOworICAgIH0KK30KKworLyogRGVyaXZlZEFnZS50eHQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgVV9DQUxMQ09OVgorYWdlTGluZUZuKHZvaWQgKmNvbnRleHQsCisgICAgICAgICAgY2hhciAqZmllbGRzW11bMl0sIGludDMyX3QgZmllbGRDb3VudCwKKyAgICAgICAgICBVRXJyb3JDb2RlICpwRXJyb3JDb2RlKSB7CisgICAgY2hhciAqcywgKm51bWJlckxpbWl0OworICAgIHVpbnQzMl90IHZhbHVlLCBzdGFydCwgZW5kLCB2ZXJzaW9uOworCisgICAgdV9wYXJzZUNvZGVQb2ludFJhbmdlKGZpZWxkc1swXVswXSwgJnN0YXJ0LCAmZW5kLCBwRXJyb3JDb2RlKTsKKyAgICBpZihVX0ZBSUxVUkUoKnBFcnJvckNvZGUpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2VucHJvcHM6IHN5bnRheCBlcnJvciBpbiBEZXJpdmVkQWdlLnR4dCBmaWVsZCAwIGF0ICVzXG4iLCBmaWVsZHNbMF1bMF0pOworICAgICAgICBleGl0KCpwRXJyb3JDb2RlKTsKKyAgICB9CisKKyAgICAvKiBpZ25vcmUgInVuYXNzaWduZWQiICh0aGUgZGVmYXVsdCBpcyBhbHJlYWR5IHNldCB0byAwLjApICovCisgICAgcz0oY2hhciAqKXVfc2tpcFdoaXRlc3BhY2UoZmllbGRzWzFdWzBdKTsKKyAgICBpZigwPT11cHJ2X3N0cm5jbXAocywgInVuYXNzaWduZWQiLCAxMCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIHBhcnNlIHZlcnNpb24gbnVtYmVyICovCisgICAgdmFsdWU9KHVpbnQzMl90KXVwcnZfc3RydG91bChzLCAmbnVtYmVyTGltaXQsIDEwKTsKKyAgICBpZihzPT1udW1iZXJMaW1pdCB8fCB2YWx1ZT09MCB8fCB2YWx1ZT4xNSB8fCAoKm51bWJlckxpbWl0IT0nLicgJiYgKm51bWJlckxpbWl0IT0nICcgJiYgKm51bWJlckxpbWl0IT0nXHQnICYmICpudW1iZXJMaW1pdCE9MCkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5wcm9wczogc3ludGF4IGVycm9yIGluIERlcml2ZWRBZ2UudHh0IGZpZWxkIDEgYXQgJXNcbiIsIGZpZWxkc1sxXVswXSk7CisgICAgICAgICpwRXJyb3JDb2RlPVVfUEFSU0VfRVJST1I7CisgICAgICAgIGV4aXQoVV9QQVJTRV9FUlJPUik7CisgICAgfQorICAgIHZlcnNpb249dmFsdWU8PDQ7CisKKyAgICAvKiBwYXJzZSBtaW5vciB2ZXJzaW9uIG51bWJlciAqLworICAgIGlmKCpudW1iZXJMaW1pdD09Jy4nKSB7CisgICAgICAgIHM9KGNoYXIgKil1X3NraXBXaGl0ZXNwYWNlKG51bWJlckxpbWl0KzEpOworICAgICAgICB2YWx1ZT0odWludDMyX3QpdXBydl9zdHJ0b3VsKHMsICZudW1iZXJMaW1pdCwgMTApOworICAgICAgICBpZihzPT1udW1iZXJMaW1pdCB8fCB2YWx1ZT4xNSB8fCAoKm51bWJlckxpbWl0IT0nICcgJiYgKm51bWJlckxpbWl0IT0nXHQnICYmICpudW1iZXJMaW1pdCE9MCkpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2VucHJvcHM6IHN5bnRheCBlcnJvciBpbiBEZXJpdmVkQWdlLnR4dCBmaWVsZCAxIGF0ICVzXG4iLCBmaWVsZHNbMV1bMF0pOworICAgICAgICAgICAgKnBFcnJvckNvZGU9VV9QQVJTRV9FUlJPUjsKKyAgICAgICAgICAgIGV4aXQoVV9QQVJTRV9FUlJPUik7CisgICAgICAgIH0KKyAgICAgICAgdmVyc2lvbnw9dmFsdWU7CisgICAgfQorCisgICAgaWYoc3RhcnQ9PTAgJiYgZW5kPT0weDEwZmZmZikgeworICAgICAgICAvKiBBbHNvIHNldCBiaXRzIGZvciBpbml0aWFsVmFsdWUgYW5kIGVycm9yVmFsdWUuICovCisgICAgICAgIGVuZD1VUFZFQ19NQVhfQ1A7CisgICAgfQorICAgIHVwdmVjX3NldFZhbHVlKHB2LCBzdGFydCwgZW5kLCAwLCB2ZXJzaW9uPDxVUFJPUFNfQUdFX1NISUZULCBVUFJPUFNfQUdFX01BU0ssIHBFcnJvckNvZGUpOworICAgIGlmKFVfRkFJTFVSRSgqcEVycm9yQ29kZSkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5wcm9wcyBlcnJvcjogdW5hYmxlIHRvIHNldCBjaGFyYWN0ZXIgYWdlOiAlc1xuIiwgdV9lcnJvck5hbWUoKnBFcnJvckNvZGUpKTsKKyAgICAgICAgZXhpdCgqcEVycm9yQ29kZSk7CisgICAgfQorfQorCisvKiBTY3JpcHRFeHRlbnNpb25zLnR4dCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBVX0NBTExDT05WCitzY3JpcHRFeHRlbnNpb25zTGluZUZuKHZvaWQgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmZpZWxkc1tdWzJdLCBpbnQzMl90IGZpZWxkQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgIFVFcnJvckNvZGUgKnBFcnJvckNvZGUpIHsKKyAgICB1aW50MzJfdCBzdGFydCwgZW5kOworICAgIHVfcGFyc2VDb2RlUG9pbnRSYW5nZShmaWVsZHNbMF1bMF0sICZzdGFydCwgJmVuZCwgcEVycm9yQ29kZSk7CisgICAgaWYoVV9GQUlMVVJFKCpwRXJyb3JDb2RlKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbnByb3BzOiBzeW50YXggZXJyb3IgaW4gU2NyaXB0RXh0ZW5zaW9ucy50eHQgZmllbGQgMCBhdCAlc1xuIiwgZmllbGRzWzBdWzBdKTsKKyAgICAgICAgZXhpdCgqcEVycm9yQ29kZSk7CisgICAgfQorCisgICAgLyogcGFyc2UgbGlzdCBvZiBzY3JpcHQgY29kZXMgKi8KKyAgICBVbmljb2RlU3RyaW5nIGNvZGVzOyAgLy8gdmVjdG9yIG9mIDE2LWJpdCBVU2NyaXB0Q29kZSB2YWx1ZXMKKyAgICBjaGFyICpzPWZpZWxkc1sxXVswXTsKKyAgICBmb3IoOzspIHsKKyAgICAgICAgLy8gc2tpcCB3aGl0ZXNwYWNlIGJlZm9yZSBlYWNoIHRva2VuCisgICAgICAgIHM9KGNoYXIgKil1X3NraXBXaGl0ZXNwYWNlKHMpOworICAgICAgICBpZigqcz09MCB8fCAqcz09JzsnKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvLyBza2lwIG5vbi13aGl0ZXNwYWNlLCBub24tdGVybWluYXRvciBjaGFyYWN0ZXJzIHRvIGZpbmQgdGhlIHRva2VuIGxpbWl0CisgICAgICAgIGNoYXIgKmxpbWl0PXM7CisgICAgICAgIGNoYXIgYzsKKyAgICAgICAgZG8geworICAgICAgICAgICAgYz0qKytsaW1pdDsKKyAgICAgICAgfSB3aGlsZSghVV9JU19JTlZfV0hJVEVTUEFDRShjKSAmJiBjIT0wICYmIGMhPSc7Jyk7CisgICAgICAgIC8vIE5VTC10ZXJtaW5hdGVkIHRoaXMgdG9rZW4KKyAgICAgICAgKmxpbWl0PTA7CisgICAgICAgIC8vIGNvbnZlcnQgdGhlIHRva2VuIChzY3JpcHQgcHJvcGVydHkgdmFsdWUgYWxpYXMpIGludG8gYSBVU2NyaXB0Q29kZSB2YWx1ZQorICAgICAgICBpbnQzMl90IHZhbHVlPXVfZ2V0UHJvcGVydHlWYWx1ZUVudW0oVUNIQVJfU0NSSVBULCBzKTsKKyAgICAgICAgaWYodmFsdWU8MCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5wcm9wczogc3ludGF4IGVycm9yIGluIFNjcmlwdEV4dGVuc2lvbnMudHh0IGZpZWxkIDEgYXQgJXNcbiIsIHMpOworICAgICAgICAgICAgZXhpdChVX0lOVkFMSURfRk9STUFUX0VSUk9SKTsKKyAgICAgICAgfQorICAgICAgICAvLyBJbnNlcnRpb24gc29ydCBpbnRvIHRoZSBsaXN0IG9mIHNjcmlwdCBjb2Rlcy4KKyAgICAgICAgZm9yKGludDMyX3QgaT0wOzsgKytpKSB7CisgICAgICAgICAgICBpZihpPGNvZGVzLmxlbmd0aCgpKSB7CisgICAgICAgICAgICAgICAgaWYodmFsdWU8Y29kZXNbaV0pIHsKKyAgICAgICAgICAgICAgICAgICAgY29kZXMuaW5zZXJ0KGksIChVQ2hhcil2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZih2YWx1ZT09Y29kZXNbaV0pIHsKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdlbnByb3BzOiBkdXBsaWNhdGUgc2NyaXB0IGNvZGUgaW4gU2NyaXB0RXh0ZW5zaW9ucy50eHQgZmllbGQgMSBhdCAlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvciBVKyUwNGx4Li5VKyUwNGx4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMsIChsb25nKXN0YXJ0LCAobG9uZyllbmQpOworICAgICAgICAgICAgICAgICAgICBleGl0KFVfSU5WQUxJRF9GT1JNQVRfRVJST1IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBjb250aW51ZSB3aGlsZSB2YWx1ZT5jb2Rlc1tpXQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb2Rlcy5hcHBlbmQoKFVDaGFyKXZhbHVlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZihjPT0wIHx8IGM9PSc7JykgeworICAgICAgICAgICAgLy8gdGhlIHRva2VuIGVuZGVkIGF0IGEgdGVybWluYXRvcgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyB0aGUgdG9rZW4gZW5kZWQgYXQgVV9JU19JTlZfV0hJVEVTUEFDRShjKSwgY29udGludWUgYWZ0ZXIgYworICAgICAgICAgICAgcz1saW1pdCsxOworICAgICAgICB9CisgICAgfQorICAgIGludDMyX3QgbGVuZ3RoPWNvZGVzLmxlbmd0aCgpOworICAgIGlmKGxlbmd0aD09MCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAiZ2VucHJvcHM6IG1pc3NpbmcgdmFsdWVzIGluIFNjcmlwdEV4dGVuc2lvbnMudHh0IGZpZWxkIDEgIgorICAgICAgICAgICAgICAgICJmb3IgVSslMDRseC4uVSslMDRseFxuIiwKKyAgICAgICAgICAgICAgICAobG9uZylzdGFydCwgKGxvbmcpZW5kKTsKKyAgICAgICAgZXhpdChVX0lOVkFMSURfRk9STUFUX0VSUk9SKTsKKyAgICB9CisgICAgLy8gU2V0IGJpdCAxNSBvbiB0aGUgbGFzdCBzY3JpcHQgY29kZSwgZm9yIHRlcm1pbmF0aW9uLgorICAgIGNvZGVzLnNldENoYXJBdChsZW5ndGgtMSwgKFVDaGFyKShjb2Rlc1tsZW5ndGgtMV18MHg4MDAwKSk7CisgICAgLy8gRmluZCB0aGlzIGxpc3Qgb2YgY29kZXMgaW4gdGhlIFNjcmlwdF9FeHRlbnNpb25zIGRhdGEgc28gZmFyLCBvciBhZGQgdGhpcyBsaXN0LgorICAgIGludDMyX3QgaW5kZXg9c2NyaXB0RXh0ZW5zaW9ucy0+aW5kZXhPZihjb2Rlcyk7CisgICAgaWYoaW5kZXg8MCkgeworICAgICAgICBpbmRleD1zY3JpcHRFeHRlbnNpb25zLT5sZW5ndGgoKTsKKyAgICAgICAgc2NyaXB0RXh0ZW5zaW9ucy0+YXBwZW5kKGNvZGVzKTsKKyAgICB9CisgICAgLy8gTW9kaWZ5IHRoZSBTY3JpcHQgZGF0YSBmb3IgZWFjaCBvZiB0aGUgc3RhcnQuLmVuZCBjb2RlIHBvaW50cworICAgIC8vIHRvIGluY2x1ZGUgdGhlIFNjcmlwdF9FeHRlbnNpb25zIGluZGV4LgorICAgIGRvIHsKKyAgICAgICAgdWludDMyX3Qgc2NyaXB0WD11cHZlY19nZXRWYWx1ZShwdiwgKFVDaGFyMzIpc3RhcnQsIDApJlVQUk9QU19TQ1JJUFRfWF9NQVNLOworICAgICAgICAvLyBGaW5kIHRoZSBuZXh0IGNvZGUgcG9pbnQgdGhhdCBoYXMgYSBkaWZmZXJlbnQgc2NyaXB0IHZhbHVlLgorICAgICAgICAvLyBXZSB3YW50IHRvIGFkZCB0aGUgU2NyaXB0X0V4dGVuc2lvbnMgaW5kZXggdG8gdGhlIGNvZGUgcG9pbnQgcmFuZ2Ugc3RhcnQuLm5leHQtMS4KKyAgICAgICAgVUNoYXIzMiBuZXh0OworICAgICAgICBmb3IobmV4dD0oVUNoYXIzMilzdGFydCsxOworICAgICAgICAgICAgbmV4dDw9KFVDaGFyMzIpZW5kICYmIHNjcmlwdFg9PSh1cHZlY19nZXRWYWx1ZShwdiwgbmV4dCwgMCkmVVBST1BTX1NDUklQVF9YX01BU0spOworICAgICAgICAgICAgKytuZXh0KSB7fQorICAgICAgICBpZihzY3JpcHRYPj1VUFJPUFNfU0NSSVBUX1hfV0lUSF9DT01NT04pIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICAgICAiZ2VucHJvcHM6IFNjcmlwdEV4dGVuc2lvbnMudHh0IGhhcyB2YWx1ZXMgZm9yIFUrJTA0bHguLlUrJTA0bHggIgorICAgICAgICAgICAgICAgICAgICAid2hpY2ggb3ZlcmxhcHMgd2l0aCBhIHJhbmdlIGluY2x1ZGluZyBVKyUwNGx4Li5VKyUwNGx4XG4iLAorICAgICAgICAgICAgICAgICAgICAobG9uZylzdGFydCwgKGxvbmcpZW5kLCAobG9uZylzdGFydCwgKGxvbmcpKG5leHQtMSkpOworICAgICAgICAgICAgZXhpdChVX0lOVkFMSURfRk9STUFUX0VSUk9SKTsKKyAgICAgICAgfQorICAgICAgICAvLyBFbmNvZGUgdGhlIChTY3JpcHQsIFNjcmlwdF9FeHRlbnNpb25zIGluZGV4KSBwYWlyLgorICAgICAgICBpZihzY3JpcHRYPT1VU0NSSVBUX0NPTU1PTikgeworICAgICAgICAgICAgc2NyaXB0WD1VUFJPUFNfU0NSSVBUX1hfV0lUSF9DT01NT058KHVpbnQzMl90KWluZGV4OworICAgICAgICB9IGVsc2UgaWYoc2NyaXB0WD09VVNDUklQVF9JTkhFUklURUQpIHsKKyAgICAgICAgICAgIHNjcmlwdFg9VVBST1BTX1NDUklQVF9YX1dJVEhfSU5IRVJJVEVEfCh1aW50MzJfdClpbmRleDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFN0b3JlIGFuIGFkZGl0aW9uYWwgcGFpciBvZiAxNi1iaXQgdW5pdHMgZm9yIGFuIHVudXN1YWwgbWFpbiBTY3JpcHQgY29kZQorICAgICAgICAgICAgLy8gdG9nZXRoZXIgd2l0aCB0aGUgU2NyaXB0X0V4dGVuc2lvbnMgaW5kZXguCisgICAgICAgICAgICBVbmljb2RlU3RyaW5nIGNvZGVJbmRleFBhaXI7CisgICAgICAgICAgICBjb2RlSW5kZXhQYWlyLmFwcGVuZCgoVUNoYXIpc2NyaXB0WCkuYXBwZW5kKChVQ2hhcilpbmRleCk7CisgICAgICAgICAgICBpbmRleD1zY3JpcHRFeHRlbnNpb25zLT5pbmRleE9mKGNvZGVJbmRleFBhaXIpOworICAgICAgICAgICAgaWYoaW5kZXg8MCkgeworICAgICAgICAgICAgICAgIGluZGV4PXNjcmlwdEV4dGVuc2lvbnMtPmxlbmd0aCgpOworICAgICAgICAgICAgICAgIHNjcmlwdEV4dGVuc2lvbnMtPmFwcGVuZChjb2RlSW5kZXhQYWlyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNjcmlwdFg9VVBST1BTX1NDUklQVF9YX1dJVEhfT1RIRVJ8KHVpbnQzMl90KWluZGV4OworICAgICAgICB9CisgICAgICAgIGlmKGluZGV4PlVQUk9QU19TQ1JJUFRfTUFTSykgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5wcm9wczogU2NyaXB0X0V4dGVuc2lvbnMgaW5kZXhlcyBvdmVyZmxvdyBiaXQgZmllbGRcbiIpOworICAgICAgICAgICAgZXhpdChVX0JVRkZFUl9PVkVSRkxPV19FUlJPUik7CisgICAgICAgIH0KKyAgICAgICAgLy8gV3JpdGUgdGhlIChTY3JpcHQsIFNjcmlwdF9FeHRlbnNpb25zIGluZGV4KSBwYWlyIGludG8KKyAgICAgICAgLy8gdGhlIHByb3BlcnRpZXMgdmVjdG9yIGZvciBzdGFydC4ubmV4dC0xLgorICAgICAgICB1cHZlY19zZXRWYWx1ZShwdiwgKFVDaGFyMzIpc3RhcnQsIChVQ2hhcjMyKShuZXh0LTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgc2NyaXB0WCwgVVBST1BTX1NDUklQVF9YX01BU0ssIHBFcnJvckNvZGUpOworICAgICAgICBpZihVX0ZBSUxVUkUoKnBFcnJvckNvZGUpKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbnByb3BzIGVycm9yOiB1bmFibGUgdG8gc2V0IFNjcmlwdF9FeHRlbnNpb25zOiAlc1xuIiwgdV9lcnJvck5hbWUoKnBFcnJvckNvZGUpKTsKKyAgICAgICAgICAgIGV4aXQoKnBFcnJvckNvZGUpOworICAgICAgICB9CisgICAgICAgIHN0YXJ0PW5leHQ7CisgICAgfSB3aGlsZShzdGFydDw9ZW5kKTsKK30KKworLyogRGVyaXZlZE51bWVyaWNWYWx1ZXMudHh0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgVV9DQUxMQ09OVgorbnVtZXJpY0xpbmVGbih2b2lkICpjb250ZXh0LAorICAgICAgICAgICAgICBjaGFyICpmaWVsZHNbXVsyXSwgaW50MzJfdCBmaWVsZENvdW50LAorICAgICAgICAgICAgICBVRXJyb3JDb2RlICpwRXJyb3JDb2RlKSB7CisgICAgUHJvcHMgbmV3UHJvcHM9eyAwIH07CisgICAgY2hhciAqcywgKm51bWJlckxpbWl0OworICAgIHVpbnQzMl90IHN0YXJ0LCBlbmQsIHZhbHVlLCBvbGRQcm9wczMyOworICAgIGNoYXIgYzsKKyAgICBVQm9vbCBpc0ZyYWN0aW9uOworCisgICAgLyogZ2V0IHRoZSBjb2RlIHBvaW50IHJhbmdlICovCisgICAgdV9wYXJzZUNvZGVQb2ludFJhbmdlKGZpZWxkc1swXVswXSwgJnN0YXJ0LCAmZW5kLCBwRXJyb3JDb2RlKTsKKyAgICBpZihVX0ZBSUxVUkUoKnBFcnJvckNvZGUpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2VucHJvcHM6IHN5bnRheCBlcnJvciBpbiBEZXJpdmVkTnVtZXJpY1ZhbHVlcy50eHQgZmllbGQgMCBhdCAlc1xuIiwgZmllbGRzWzBdWzBdKTsKKyAgICAgICAgZXhpdCgqcEVycm9yQ29kZSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBJZ25vcmUgdGhlCisgICAgICogIyBAbWlzc2luZzogMDAwMC4uMTBGRkZGOyBOYU4KKyAgICAgKiBsaW5lIGZyb20gVW5pY29kZSA1LjEncyBEZXJpdmVkTnVtZXJpY1ZhbHVlcy50eHQ6CisgICAgICogVGhlIGZvbGxvd2luZyBjb2RlIGNhbm5vdCBwYXJzZSAiTmFOIiwgYW5kIHdlIGRvbid0IHdhbnQgdG8gb3ZlcndyaXRlCisgICAgICogdGhlIG51bWVyaWMgdmFsdWVzIGZvciBhbGwgY2hhcmFjdGVycyBhZnRlciByZWFkaW5nIG1vc3QKKyAgICAgKiBmcm9tIFVuaWNvZGVEYXRhLnR4dCBhbHJlYWR5LgorICAgICAqLworICAgIGlmKHN0YXJ0PT0wICYmIGVuZD09MHgxMGZmZmYpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIGNoZWNrIGlmIHRoZSBudW1lcmljIHZhbHVlIGlzIGEgZnJhY3Rpb24gKHRoaXMgY29kZSBkb2VzIG5vdCBoYW5kbGUgYW55KSAqLworICAgIGlzRnJhY3Rpb249RkFMU0U7CisgICAgcz11cHJ2X3N0cmNocihmaWVsZHNbMV1bMF0sICcuJyk7CisgICAgaWYocyE9TlVMTCkgeworICAgICAgICBudW1iZXJMaW1pdD1zKzE7CisgICAgICAgIHdoaWxlKCcwJzw9KGM9Km51bWJlckxpbWl0KyspICYmIGM8PSc5JykgeworICAgICAgICAgICAgaWYoYyE9JzAnKSB7CisgICAgICAgICAgICAgICAgaXNGcmFjdGlvbj1UUlVFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYoaXNGcmFjdGlvbikgeworICAgICAgICB2YWx1ZT0wOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIHBhcnNlIG51bWVyaWMgdmFsdWUgKi8KKyAgICAgICAgcz0oY2hhciAqKXVfc2tpcFdoaXRlc3BhY2UoZmllbGRzWzFdWzBdKTsKKworICAgICAgICAvKiB0cnkgbGFyZ2UsIHNpbmdsZS1zaWduaWZpY2FudC1kaWdpdCBudW1iZXJzLCBtYXkgb3RoZXJ3aXNlIG92ZXJmbG93IHN0cnRvdWwoKSAqLworICAgICAgICBpZignMSc8PXNbMF0gJiYgc1swXTw9JzknICYmIHNbMV09PScwJyAmJiBzWzJdPT0nMCcpIHsKKyAgICAgICAgICAgIC8qIGxhcmdlIGludGVnZXJzIGFyZSBlbmNvZGVkIGluIGEgc3BlY2lhbCB3YXksIHNlZSBzdG9yZS5jICovCisgICAgICAgICAgICB1aW50OF90IGV4cD0wOworCisgICAgICAgICAgICB2YWx1ZT1zWzBdLScwJzsKKyAgICAgICAgICAgIG51bWJlckxpbWl0PXM7CisgICAgICAgICAgICB3aGlsZSgqKCsrbnVtYmVyTGltaXQpPT0nMCcpIHsKKyAgICAgICAgICAgICAgICArK2V4cDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5ld1Byb3BzLmV4cG9uZW50PWV4cDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIG5vcm1hbCBudW1iZXIgcGFyc2luZyAqLworICAgICAgICAgICAgdmFsdWU9KHVpbnQzMl90KXVwcnZfc3RydG91bChzLCAmbnVtYmVyTGltaXQsIDEwKTsKKyAgICAgICAgfQorICAgICAgICBpZihudW1iZXJMaW1pdDw9cyB8fCAoKm51bWJlckxpbWl0IT0nLicgJiYgdV9za2lwV2hpdGVzcGFjZShudW1iZXJMaW1pdCkhPWZpZWxkc1sxXVsxXSkgfHwgdmFsdWU+PTB4ODAwMDAwMDApIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2VucHJvcHM6IHN5bnRheCBlcnJvciBpbiBEZXJpdmVkTnVtZXJpY1ZhbHVlcy50eHQgZmllbGQgMSBhdCAlc1xuIiwgZmllbGRzWzBdWzBdKTsKKyAgICAgICAgICAgIGV4aXQoVV9QQVJTRV9FUlJPUik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFVuaWNvZGUgNC4wLjEgcmVtb3ZlcyB0aGUgdGhpcmQgY29sdW1uIHRoYXQgdXNlZCB0byBsaXN0IHRoZSBudW1lcmljIHR5cGUuCisgICAgICogQXNzdW1lIHRoYXQgZWl0aGVyIHRoZSBkYXRhIGlzIHRoZSBzYW1lIGFzIGluIFVuaWNvZGVEYXRhLnR4dCwKKyAgICAgKiBvciBlbHNlIHRoYXQgdGhlIG51bWVyaWMgdHlwZSBpcyAibnVtZXJpYyIuCisgICAgICogVGhpcyBzaG91bGQgd29yayBiZWNhdXNlIHdlIG9ubHkgZXhwZWN0IHRvIGFkZCBudW1lcmljIHZhbHVlcyBmb3IKKyAgICAgKiBIYW4gY2hhcmFjdGVyczsgZm9yIHRob3NlLCBVbmljb2RlRGF0YS50eHQgbGlzdHMgb25seSByYW5nZXMgd2l0aG91dAorICAgICAqIHNwZWNpZmljIHByb3BlcnRpZXMgZm9yIHNpbmdsZSBjaGFyYWN0ZXJzLgorICAgICAqLworCisgICAgLyogc2V0IHRoZSBuZXcgbnVtZXJpYyB2YWx1ZSAqLworICAgIG5ld1Byb3BzLmNvZGU9c3RhcnQ7CisgICAgbmV3UHJvcHMubnVtZXJpY1ZhbHVlPShpbnQzMl90KXZhbHVlOyAgICAgICAvKiBuZXdseSBwYXJzZWQgbnVtZXJpYyB2YWx1ZSAqLworICAgIC8qIHRoZSBleHBvbmVudCBtYXkgaGF2ZSBiZWVuIHNldCBhYm92ZSAqLworCisgICAgZm9yKDsgc3RhcnQ8PWVuZDsgKytzdGFydCkgeworICAgICAgICB1aW50MzJfdCBuZXdQcm9wczMyOworICAgICAgICBpbnQzMl90IG9sZE50djsKKyAgICAgICAgb2xkUHJvcHMzMj1nZXRQcm9wcyhzdGFydCk7CisgICAgICAgIG9sZE50dj0oaW50MzJfdClHRVRfTlVNRVJJQ19UWVBFX1ZBTFVFKG9sZFByb3BzMzIpOworCisgICAgICAgIGlmKGlzRnJhY3Rpb24pIHsKKyAgICAgICAgICAgIGlmKFVQUk9QU19OVFZfRlJBQ1RJT05fU1RBUlQ8PW9sZE50diAmJiBvbGROdHY8VVBST1BTX05UVl9MQVJHRV9TVEFSVCkgeworICAgICAgICAgICAgICAgIC8qIHRoaXMgY29kZSBwb2ludCB3YXMgYWxyZWFkeSBsaXN0ZWQgd2l0aCBpdHMgbnVtZXJpYyB2YWx1ZSBpbiBVbmljb2RlRGF0YS50eHQgKi8KKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5wcm9wczogbm90IHByZXBhcmVkIGZvciBuZXcgZnJhY3Rpb25zIGluIERlcml2ZWROdW1lcmljVmFsdWVzLnR4dCBmaWVsZCAxIGF0ICVzXG4iLCBmaWVsZHNbMV1bMF0pOworICAgICAgICAgICAgICAgIGV4aXQoVV9QQVJTRV9FUlJPUik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBGb3Igc2ltcGxpY2l0eSwgYW5kIGJlY2F1c2Ugd2Ugb25seSBleHBlY3QgdG8gc2V0IG51bWVyaWMgdmFsdWVzIGZvciBIYW4gY2hhcmFjdGVycywKKyAgICAgICAgICogZm9yIG5vdyB3ZSBvbmx5IGFsbG93IHRvIHNldCB0aGVzZSB2YWx1ZXMgZm9yIExvIGNoYXJhY3RlcnMuCisgICAgICAgICAqLworICAgICAgICBpZihvbGROdHY9PVVQUk9QU19OVFZfTk9ORSAmJiBHRVRfQ0FURUdPUlkob2xkUHJvcHMzMikhPVVfT1RIRVJfTEVUVEVSKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbnByb3BzIGVycm9yOiBuZXcgbnVtZXJpYyB2YWx1ZSBmb3IgYSBjaGFyYWN0ZXIgb3RoZXIgdGhhbiBMbyBpbiBEZXJpdmVkTnVtZXJpY1ZhbHVlcy50eHQgYXQgJXNcbiIsIGZpZWxkc1swXVswXSk7CisgICAgICAgICAgICBleGl0KFVfUEFSU0VfRVJST1IpOworICAgICAgICB9CisKKyAgICAgICAgLyogdmVyaWZ5IHRoYXQgd2UgZG8gbm90IGNoYW5nZSBhbiBleGlzdGluZyB2YWx1ZSAoZnJhY3Rpb25zIHdlcmUgZXhjbHVkZWQgYWJvdmUpICovCisgICAgICAgIGlmKG9sZE50diE9VVBST1BTX05UVl9OT05FKSB7CisgICAgICAgICAgICAvKiB0aGUgY29kZSBwb2ludCBhbHJlYWR5IGhhcyBhIHZhbHVlIHN0b3JlZCAqLworICAgICAgICAgICAgbmV3UHJvcHMubnVtZXJpY1R5cGU9VVBST1BTX05UVl9HRVRfVFlQRShvbGROdHYpOworICAgICAgICAgICAgbmV3UHJvcHMzMj1tYWtlUHJvcHMoJm5ld1Byb3BzKTsKKyAgICAgICAgICAgIGlmKG9sZE50diE9R0VUX05VTUVSSUNfVFlQRV9WQUxVRShuZXdQcm9wczMyKSkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2VucHJvcHMgZXJyb3I6IG5ldyBudW1lcmljIHZhbHVlIGRpZmZlcnMgZnJvbSBvbGQgb25lIGZvciBVKyUwNGx4XG4iLCAobG9uZylzdGFydCk7CisgICAgICAgICAgICAgICAgZXhpdChVX1BBUlNFX0VSUk9SKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIHNhbWUgdmFsdWUsIGNvbnRpbnVlICovCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiB0aGUgY29kZSBwb2ludCBpcyBnZXR0aW5nIGEgbmV3IG51bWVyaWMgdmFsdWUgKi8KKyAgICAgICAgICAgIG5ld1Byb3BzLm51bWVyaWNUeXBlPSh1aW50OF90KVVfTlRfTlVNRVJJQzsgLyogYXNzdW1lZCBudW1lcmljIHR5cGUsIHNlZSBVbmljb2RlIDQuMC4xIGNvbW1lbnQgKi8KKyAgICAgICAgICAgIG5ld1Byb3BzMzI9bWFrZVByb3BzKCZuZXdQcm9wcyk7CisgICAgICAgICAgICBpZihiZVZlcmJvc2UpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoImFkZGluZyBVKyUwNHggbnVtZXJpYyB0eXBlICVkIGVuY29kZWQtbnVtZXJpYy10eXBlLXZhbHVlIDB4JTAzeCBmcm9tICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAoaW50KXN0YXJ0LCBVX05UX05VTUVSSUMsIChpbnQpR0VUX05VTUVSSUNfVFlQRV9WQUxVRShuZXdQcm9wczMyKSwgZmllbGRzWzBdWzBdKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYWRkUHJvcHMoc3RhcnQsIG5ld1Byb3BzMzJ8R0VUX0NBVEVHT1JZKG9sZFByb3BzMzIpKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyogZGF0YSBzZXJpYWxpemF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworVV9DRlVOQyBpbnQzMl90Cit3cml0ZUFkZGl0aW9uYWxEYXRhKEZJTEUgKmYsIHVpbnQ4X3QgKnAsIGludDMyX3QgY2FwYWNpdHksIGludDMyX3QgaW5kZXhlc1tVUFJPUFNfSU5ERVhfQ09VTlRdKSB7CisgICAgY29uc3QgdWludDMyX3QgKnB2QXJyYXk7CisgICAgaW50MzJfdCBwdlJvd3MsIHB2Q291bnQ7CisgICAgaW50MzJfdCBsZW5ndGg7CisgICAgVUVycm9yQ29kZSBlcnJvckNvZGU7CisKKyAgICBwdkFycmF5PXVwdmVjX2dldEFycmF5KHB2LCAmcHZSb3dzLCBOVUxMKTsKKyAgICBwdkNvdW50PXB2Um93cypVUFJPUFNfVkVDVE9SX1dPUkRTOworCisgICAgZXJyb3JDb2RlPVVfWkVST19FUlJPUjsKKyAgICBsZW5ndGg9dXRyaWUyX3NlcmlhbGl6ZShuZXdUcmllLCBwLCBjYXBhY2l0eSwgJmVycm9yQ29kZSk7CisgICAgaWYoVV9GQUlMVVJFKGVycm9yQ29kZSkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgImdlbnByb3BzIGVycm9yOiB1dHJpZTJfZnJlZXplKGFkZGl0aW9uYWwgcHJvcGVydGllcykrdXRyaWUyX3NlcmlhbGl6ZSgpIGZhaWxlZDogJXNcbiIsCisgICAgICAgICAgICAgICAgdV9lcnJvck5hbWUoZXJyb3JDb2RlKSk7CisgICAgICAgIGV4aXQoZXJyb3JDb2RlKTsKKyAgICB9CisKKyAgICAvKiByb3VuZCB1cCBzY3JpcHRFeHRlbnNpb25zIHRvIG11bHRpcGxlIG9mIDQgYnl0ZXMgKi8KKyAgICBpZihzY3JpcHRFeHRlbnNpb25zLT5sZW5ndGgoKSYxKSB7CisgICAgICAgIHNjcmlwdEV4dGVuc2lvbnMtPmFwcGVuZCgoVUNoYXIpMCk7CisgICAgfQorCisgICAgLyogc2V0IGluZGV4ZXMgKi8KKyAgICBpbmRleGVzW1VQUk9QU19BRERJVElPTkFMX1ZFQ1RPUlNfSU5ERVhdPQorICAgICAgICBpbmRleGVzW1VQUk9QU19BRERJVElPTkFMX1RSSUVfSU5ERVhdK2xlbmd0aC80OworICAgIGluZGV4ZXNbVVBST1BTX0FERElUSU9OQUxfVkVDVE9SU19DT0xVTU5TX0lOREVYXT1VUFJPUFNfVkVDVE9SX1dPUkRTOworICAgIGluZGV4ZXNbVVBST1BTX1NDUklQVF9FWFRFTlNJT05TX0lOREVYXT0KKyAgICAgICAgaW5kZXhlc1tVUFJPUFNfQURESVRJT05BTF9WRUNUT1JTX0lOREVYXStwdkNvdW50OworICAgIGluZGV4ZXNbVVBST1BTX1JFU0VSVkVEX0lOREVYXzddPQorICAgICAgICBpbmRleGVzW1VQUk9QU19TQ1JJUFRfRVhURU5TSU9OU19JTkRFWF0rc2NyaXB0RXh0ZW5zaW9ucy0+bGVuZ3RoKCkvMjsKKyAgICBpbmRleGVzW1VQUk9QU19SRVNFUlZFRF9JTkRFWF84XT1pbmRleGVzW1VQUk9QU19SRVNFUlZFRF9JTkRFWF83XTsKKyAgICBpbmRleGVzW1VQUk9QU19EQVRBX1RPUF9JTkRFWF09aW5kZXhlc1tVUFJPUFNfUkVTRVJWRURfSU5ERVhfOF07CisKKyAgICBpbmRleGVzW1VQUk9QU19NQVhfVkFMVUVTX0lOREVYXT0KKyAgICAgICAgKCgoaW50MzJfdClVX0VBX0NPVU5ULTEpPDxVUFJPUFNfRUFfU0hJRlQpfAorICAgICAgICAoKChpbnQzMl90KVVCTE9DS19DT1VOVC0xKTw8VVBST1BTX0JMT0NLX1NISUZUKXwKKyAgICAgICAgKCgoaW50MzJfdClVU0NSSVBUX0NPREVfTElNSVQtMSkmVVBST1BTX1NDUklQVF9NQVNLKTsKKyAgICBpbmRleGVzW1VQUk9QU19NQVhfVkFMVUVTXzJfSU5ERVhdPQorICAgICAgICAoKChpbnQzMl90KVVfTEJfQ09VTlQtMSk8PFVQUk9QU19MQl9TSElGVCl8CisgICAgICAgICgoKGludDMyX3QpVV9TQl9DT1VOVC0xKTw8VVBST1BTX1NCX1NISUZUKXwKKyAgICAgICAgKCgoaW50MzJfdClVX1dCX0NPVU5ULTEpPDxVUFJPUFNfV0JfU0hJRlQpfAorICAgICAgICAoKChpbnQzMl90KVVfR0NCX0NPVU5ULTEpPDxVUFJPUFNfR0NCX1NISUZUKXwKKyAgICAgICAgKChpbnQzMl90KVVfRFRfQ09VTlQtMSk7CisKKyAgICBpbnQzMl90IGFkZGl0aW9uYWxQcm9wc1NpemU9NCooaW5kZXhlc1tVUFJPUFNfREFUQV9UT1BfSU5ERVhdLWluZGV4ZXNbVVBST1BTX0FERElUSU9OQUxfVFJJRV9JTkRFWF0pOworICAgIGlmKHAhPU5VTEwgJiYgYWRkaXRpb25hbFByb3BzU2l6ZTw9Y2FwYWNpdHkpIHsKKyAgICAgICAgaWYoYmVWZXJib3NlKSB7CisgICAgICAgICAgICBwcmludGYoInNpemUgaW4gYnl0ZXMgb2YgYWRkaXRpb25hbCBwcm9wcyB0cmllOiU1dVxuIiwgKGludClsZW5ndGgpOworICAgICAgICB9CisgICAgICAgIGlmKGYhPU5VTEwpIHsKKyAgICAgICAgICAgIHVzcmNfd3JpdGVVVHJpZTJBcnJheXMoZiwKKyAgICAgICAgICAgICAgICAic3RhdGljIGNvbnN0IHVpbnQxNl90IHByb3BzVmVjdG9yc1RyaWVfaW5kZXhbJWxkXT17XG4iLCBOVUxMLAorICAgICAgICAgICAgICAgIG5ld1RyaWUsCisgICAgICAgICAgICAgICAgIlxufTtcblxuIik7CisgICAgICAgICAgICB1c3JjX3dyaXRlVVRyaWUyU3RydWN0KGYsCisgICAgICAgICAgICAgICAgInN0YXRpYyBjb25zdCBVVHJpZTIgcHJvcHNWZWN0b3JzVHJpZT17XG4iLAorICAgICAgICAgICAgICAgIG5ld1RyaWUsICJwcm9wc1ZlY3RvcnNUcmllX2luZGV4IiwgTlVMTCwKKyAgICAgICAgICAgICAgICAifTtcblxuIik7CisKKyAgICAgICAgICAgIHVzcmNfd3JpdGVBcnJheShmLAorICAgICAgICAgICAgICAgICJzdGF0aWMgY29uc3QgdWludDMyX3QgcHJvcHNWZWN0b3JzWyVsZF09e1xuIiwKKyAgICAgICAgICAgICAgICBwdkFycmF5LCAzMiwgcHZDb3VudCwKKyAgICAgICAgICAgICAgICAifTtcblxuIik7CisgICAgICAgICAgICBmcHJpbnRmKGYsICJzdGF0aWMgY29uc3QgaW50MzJfdCBjb3VudFByb3BzVmVjdG9ycz0lbGQ7XG4iLCAobG9uZylwdkNvdW50KTsKKyAgICAgICAgICAgIGZwcmludGYoZiwgInN0YXRpYyBjb25zdCBpbnQzMl90IHByb3BzVmVjdG9yc0NvbHVtbnM9JWxkO1xuIiwgKGxvbmcpaW5kZXhlc1tVUFJPUFNfQURESVRJT05BTF9WRUNUT1JTX0NPTFVNTlNfSU5ERVhdKTsKKworICAgICAgICAgICAgdXNyY193cml0ZUFycmF5KGYsCisgICAgICAgICAgICAgICAgInN0YXRpYyBjb25zdCB1aW50MTZfdCBzY3JpcHRFeHRlbnNpb25zWyVsZF09e1xuIiwKKyAgICAgICAgICAgICAgICBzY3JpcHRFeHRlbnNpb25zLT5nZXRCdWZmZXIoKSwgMTYsIHNjcmlwdEV4dGVuc2lvbnMtPmxlbmd0aCgpLAorICAgICAgICAgICAgICAgICJ9O1xuXG4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHArPWxlbmd0aDsKKyAgICAgICAgICAgIGxlbmd0aD1wdkNvdW50KjQ7CisgICAgICAgICAgICB1cHJ2X21lbWNweShwLCBwdkFycmF5LCBsZW5ndGgpOworCisgICAgICAgICAgICBwKz1sZW5ndGg7CisgICAgICAgICAgICBsZW5ndGg9c2NyaXB0RXh0ZW5zaW9ucy0+bGVuZ3RoKCkqMjsKKyAgICAgICAgICAgIHVwcnZfbWVtY3B5KHAsIHNjcmlwdEV4dGVuc2lvbnMtPmdldEJ1ZmZlcigpLCBsZW5ndGgpOworICAgICAgICB9CisgICAgICAgIGlmKGJlVmVyYm9zZSkgeworICAgICAgICAgICAgcHJpbnRmKCJudW1iZXIgb2YgYWRkaXRpb25hbCBwcm9wcyB2ZWN0b3JzOiAgICAlNXVcbiIsIChpbnQpcHZSb3dzKTsKKyAgICAgICAgICAgIHByaW50ZigibnVtYmVyIG9mIDMyLWJpdCB3b3JkcyBwZXIgdmVjdG9yOiAgICAgJTV1XG4iLCBVUFJPUFNfVkVDVE9SX1dPUkRTKTsKKyAgICAgICAgICAgIHByaW50ZigibnVtYmVyIG9mIDE2LWJpdCBzY3JpcHRFeHRlbnNpb25zOiAgICAgJTV1XG4iLCAoaW50KXNjcmlwdEV4dGVuc2lvbnMtPmxlbmd0aCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBhZGRpdGlvbmFsUHJvcHNTaXplOworfQpkaWZmIC0tZ2l0IGEvdW5pY29kZS9jL2dlbnByb3BzL3N0b3JlLmMgYi91bmljb2RlL2MvZ2VucHJvcHMvc3RvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjVjY2FjCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZS9jL2dlbnByb3BzL3N0b3JlLmMKQEAgLTAsMCArMSw1MDMgQEAKKy8qCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgQ29weXJpZ2h0IChDKSAxOTk5LTIwMTAsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMKKyogICBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICBmaWxlIG5hbWU6ICBzdG9yZS5jCisqICAgZW5jb2Rpbmc6ICAgVVMtQVNDSUkKKyogICB0YWIgc2l6ZTogICA4IChub3QgdXNlZCkKKyogICBpbmRlbnRhdGlvbjo0CisqCisqICAgY3JlYXRlZCBvbjogMTk5OWRlYzExCisqICAgY3JlYXRlZCBieTogTWFya3VzIFcuIFNjaGVyZXIKKyoKKyogICBTdG9yZSBVbmljb2RlIGNoYXJhY3RlciBwcm9wZXJ0aWVzIGVmZmljaWVudGx5IGZvcgorKiAgIHJhbmRvbSBhY2Nlc3MuCisqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJ1bmljb2RlL3V0eXBlcy5oIgorI2luY2x1ZGUgInVuaWNvZGUvdWNoYXIuaCIKKyNpbmNsdWRlICJjbWVtb3J5LmgiCisjaW5jbHVkZSAiY3N0cmluZy5oIgorI2luY2x1ZGUgInV0cmllMi5oIgorI2luY2x1ZGUgInVuaWNvZGUvdWRhdGEuaCIKKyNpbmNsdWRlICJ1bmV3ZGF0YS5oIgorI2luY2x1ZGUgIndyaXRlc3JjLmgiCisjaW5jbHVkZSAidXByb3BzLmgiCisjaW5jbHVkZSAiZ2VucHJvcHMuaCIKKworI2RlZmluZSBET19ERUJVR19PVVQgMAorCisvKiBVbmljb2RlIGNoYXJhY3RlciBwcm9wZXJ0aWVzIGZpbGUgZm9ybWF0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgZmlsZSBmb3JtYXQgcHJlcGFyZWQgYW5kIHdyaXR0ZW4gaGVyZSBjb250YWlucyBzZXZlcmFsIGRhdGEKK3N0cnVjdHVyZXMgdGhhdCBzdG9yZSBpbmRleGVzIG9yIGRhdGEuCisKK0JlZm9yZSB0aGUgZGF0YSBjb250ZW50cyBkZXNjcmliZWQgYmVsb3csIHRoZXJlIGFyZSB0aGUgaGVhZGVycyByZXF1aXJlZCBieQordGhlIHVkYXRhIEFQSSBmb3IgbG9hZGluZyBJQ1UgZGF0YS4gRXNwZWNpYWxseSwgYSBVRGF0YUluZm8gc3RydWN0dXJlCitwcmVjZWRlcyB0aGUgYWN0dWFsIGRhdGEuIEl0IGNvbnRhaW5zIHBsYXRmb3JtIHByb3BlcnRpZXMgdmFsdWVzIGFuZCB0aGUKK2ZpbGUgZm9ybWF0IHZlcnNpb24uCisKK1RoZSBmb2xsb3dpbmcgaXMgYSBkZXNjcmlwdGlvbiBvZiBmb3JtYXQgdmVyc2lvbiA3IC4KKworRGF0YSBjb250ZW50czoKKworVGhlIGNvbnRlbnRzIGlzIGEgcGFyc2VkLCBiaW5hcnkgZm9ybSBvZiBzZXZlcmFsIFVuaWNvZGUgY2hhcmFjdGVyCitkYXRhYmFzZSBmaWxlcywgbW9zdCBwcm9taW5lbnRseSBVbmljb2RlRGF0YS50eHQuCisKK0FueSBVbmljb2RlIGNvZGUgcG9pbnQgZnJvbSAwIHRvIDB4MTBmZmZmIGNhbiBiZSBsb29rZWQgdXAgdG8gZ2V0Cit0aGUgcHJvcGVydGllcywgaWYgYW55LCBmb3IgdGhhdCBjb2RlIHBvaW50LiBUaGlzIG1lYW5zIHRoYXQgdGhlIGlucHV0Cit0byB0aGUgbG9va3VwIGFyZSAyMS1iaXQgdW5zaWduZWQgaW50ZWdlcnMsIHdpdGggbm90IGFsbCBvZiB0aGUKKzIxLWJpdCByYW5nZSB1c2VkLgorCitJdCBpcyBhc3N1bWVkIHRoYXQgY2xpZW50IGNvZGUga2VlcHMgYSB1aW50MzJfdCBwb2ludGVyCit0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkYXRhOgorCisgICAgY29uc3QgdWludDMyX3QgKnAzMjsKKworRm9ybWFsbHksIHRoZSBmaWxlIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlczoKKworICAgIGNvbnN0IGludDMyX3QgaW5kZXhlc1sxNl0gd2l0aCB2YWx1ZXMgaTAuLmkxNToKKworICBpMCBpbmRpY2F0ZXMgdGhlIGxlbmd0aCBvZiB0aGUgbWFpbiB0cmllLgorICBpMC4uaTMgYWxsIGhhdmUgdGhlIHNhbWUgdmFsdWUgaW4gZm9ybWF0IHZlcnNpb25zIDQuMCBhbmQgaGlnaGVyOworICAgICAgICAgdGhlIHJlbGF0ZWQgcHJvcHMzMltdIGFuZCBleGNlcHRpb25zW10gYW5kIHVjaGFyc1tdIHdlcmUgdXNlZCBpbiBmb3JtYXQgdmVyc2lvbiAzCisKKyAgICBpMCBwcm9wc0luZGV4OyAtLSAzMi1iaXQgdW5pdCBpbmRleCB0byB0aGUgdGFibGUgb2YgMzItYml0IHByb3BlcnRpZXMgd29yZHMKKyAgICBpMSBleGNlcHRpb25zSW5kZXg7ICAtLSAzMi1iaXQgdW5pdCBpbmRleCB0byB0aGUgdGFibGUgb2YgMzItYml0IGV4Y2VwdGlvbiB3b3JkcworICAgIGkyIGV4Y2VwdGlvbnNUb3BJbmRleDsgLS0gMzItYml0IHVuaXQgaW5kZXggdG8gdGhlIGFycmF5IG9mIFVDaGFycyBmb3Igc3BlY2lhbCBtYXBwaW5ncworCisgICAgaTMgYWRkaXRpb25hbFRyaWVJbmRleDsgLS0gMzItYml0IHVuaXQgaW5kZXggdG8gdGhlIGFkZGl0aW9uYWwgdHJpZSBmb3IgbW9yZSBwcm9wZXJ0aWVzCisgICAgaTQgYWRkaXRpb25hbFZlY3RvcnNJbmRleDsgLS0gMzItYml0IHVuaXQgaW5kZXggdG8gdGhlIHRhYmxlIG9mIHByb3BlcnRpZXMgdmVjdG9ycworICAgIGk1IGFkZGl0aW9uYWxWZWN0b3JzQ29sdW1uczsgLS0gbnVtYmVyIG9mIDMyLWJpdCB3b3JkcyBwZXIgcHJvcGVydGllcyB2ZWN0b3IKKworICAgIGk2IHNjcmlwdEV4dGVuc2lvbnNJbmRleDsgLS0gMzItYml0IHVuaXQgaW5kZXggdG8gdGhlIFNjcmlwdF9FeHRlbnNpb25zIGRhdGEKKyAgICBpNyByZXNlcnZlZEluZGV4NzsgLS0gMzItYml0IHVuaXQgaW5kZXggdG8gdGhlIHRvcCBvZiB0aGUgU2NyaXB0X0V4dGVuc2lvbnMgZGF0YQorICAgIGk4IHJlc2VydmVkSW5kZXg4OyAtLSBmb3Igbm93OiBpNywgaTggYW5kIGk5IGhhdmUgdGhlIHNhbWUgdmFsdWVzCisgICAgaTkgZGF0YVRvcEluZGV4OyAtLSBzaXplIG9mIHRoZSBkYXRhIGZpbGUgKG51bWJlciBvZiAzMi1iaXQgdW5pdHMgYWZ0ZXIgdGhlIGhlYWRlcikKKworICAgIGkxMCBtYXhWYWx1ZXM7IC0tIG1heGltdW0gY29kZSB2YWx1ZXMgZm9yIHZlY3RvciB3b3JkIDAsIHNlZSB1cHJvcHMuaCAobmV3IGluIGZvcm1hdCB2ZXJzaW9uIDMuMSspCisgICAgaTExIG1heFZhbHVlczI7IC0tIG1heGltdW0gY29kZSB2YWx1ZXMgZm9yIHZlY3RvciB3b3JkIDIsIHNlZSB1cHJvcHMuaCAobmV3IGluIGZvcm1hdCB2ZXJzaW9uIDMuMikKKyAgICBpMTIuLmkxNSByZXNlcnZlZEluZGV4ZXM7IC0tIHJlc2VydmVkIHZhbHVlczsgMCBmb3Igbm93CisKKyAgICBQVCBzZXJpYWxpemVkIHByb3BlcnRpZXMgdHJpZSwgc2VlIHV0cmllMi5oIChieXRlIHNpemU6IDQqKGkwLTE2KSkKKworICBQLCBFLCBhbmQgVSBhcmUgbm90IHVzZWQgKGVtcHR5KSBpbiBmb3JtYXQgdmVyc2lvbnMgNCBhbmQgYWJvdmUKKworICAgIFAgIGNvbnN0IHVpbnQzMl90IHByb3BzMzJbaTEtaTBdOworICAgIEUgIGNvbnN0IHVpbnQzMl90IGV4Y2VwdGlvbnNbaTItaTFdOworICAgIFUgIGNvbnN0IFVDaGFyIHVjaGFyc1syKihpMy1pMildOworCisgICAgQVQgc2VyaWFsaXplZCB0cmllIGZvciBhZGRpdGlvbmFsIHByb3BlcnRpZXMgKGJ5dGUgc2l6ZTogNCooaTQtaTMpKQorICAgIFBWIGNvbnN0IHVpbnQzMl90IHByb3BzVmVjdG9yc1soaTYtaTQpL2k1XVtpNV09PXVpbnQzMl90IHByb3BzVmVjdG9yc1tpNi1pNF07CisKKyAgICBTQ1ggY29uc3QgdWludDE2X3Qgc2NyaXB0RXh0ZW5zaW9uc1syKihpNy1pNildOworCisgICAgICBTQ1ggY29udGFpbnMgU2NyaXB0X0V4dGVuc2lvbnMgbGlzdHMgYW5kIChTY3JpcHQgY29kZSwgU2NyaXB0X0V4dGVuc2lvbnMgaW5kZXgpIHBhaXJzLgorICAgICAgQSBTY3JpcHRfRXh0ZW5zaW9ucyBsaXN0IGlzIGEgc2VxdWVuY2Ugb2YgVVNjcmlwdENvZGUgdmFsdWVzIGluIGFzY2VuZGluZyBvcmRlciwKKyAgICAgIHdpdGggdGhlIGxhc3QgY29kZSBoYXZpbmcgYml0IDE1IHNldCBmb3IgdGVybWluYXRpb24uCisgICAgICBBIChTY3JpcHQgY29kZSwgU2NyaXB0X0V4dGVuc2lvbnMgaW5kZXgpIHBhaXIgaXMgdGhlIG1haW4gVVNjcmlwdENvZGUgKFNjcmlwdCB2YWx1ZSkKKyAgICAgIGZvbGxvd2VkIGJ5IHRoZSBpbmRleCBvZiB0aGUgU2NyaXB0X0V4dGVuc2lvbnMgbGlzdC4KKyAgICAgIElmIHRoZSBwcm9wc1ZlY3RvcnNbXSBjb2x1bW4gMCB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCB0aGVyZSBhcmUgU2NyaXB0X0V4dGVuc2lvbnMsCisgICAgICB0aGVuIHRoZSBVUFJPUFNfU0NSSVBUX01BU0sgYml0IGZpZWxkIGlzIGFuIGluZGV4IHRvIGVpdGhlciBhIGxpc3Qgb3IgYSBwYWlyIGluIFNDWCwKKyAgICAgIHJhdGhlciB0aGFuIHRoZSBTY3JpcHQgaXRzZWxmLiBUaGUgaGlnaCBiaXRzIGluIHRoZSBVUFJPUFNfU0NSSVBUX1hfTUFTSyBmaWVsZHMKKyAgICAgIGluZGljYXRlIHdoZXRoZXIgdGhlIG1haW4gU2NyaXB0IHZhbHVlIGlzIENvbW1vbiBvciBJbmhlcml0ZWQgKGFuZCB0aGUgaW5kZXggaXMgdG8gYSBsaXN0KQorICAgICAgdnMuIGFub3RoZXIgdmFsdWUgKGFuZCB0aGUgaW5kZXggaXMgdG8gYSBwYWlyKS4KKyAgICAgIChTZWUgVVBST1BTX1NDUklQVF9YX1dJVEhfQ09NTU9OIGV0Yy4gaW4gdXByb3BzLmguKQorCitUcmllIGxvb2t1cCBhbmQgcHJvcGVydGllczoKKworSW4gb3JkZXIgdG8gY29uZGVuc2UgdGhlIGRhdGEgZm9yIHRoZSAyMS1iaXQgY29kZSBzcGFjZSwgc2V2ZXJhbCBwcm9wZXJ0aWVzIG9mCit0aGUgVW5pY29kZSBjb2RlIGFzc2lnbm1lbnQgYXJlIGV4cGxvaXRlZDoKKy0gVGhlIGNvZGUgc3BhY2UgaXMgc3BhcnNlLgorLSBUaGVyZSBhcmUgc2V2ZXJhbCAxMGsgb2YgY29uc2VjdXRpdmUgY29kZXMgd2l0aCB0aGUgc2FtZSBwcm9wZXJ0aWVzLgorLSBDaGFyYWN0ZXJzIGFuZCBzY3JpcHRzIGFyZSBhbGxvY2F0ZWQgaW4gZ3JvdXBzIG9mIDE2IGNvZGUgcG9pbnRzLgorLSBJbnNpZGUgYmxvY2tzIGZvciBzY3JpcHRzIHRoZSBwcm9wZXJ0aWVzIGFyZSBvZnRlbiByZXBldGl0aXZlLgorLSBUaGUgMjEtYml0IHNwYWNlIGlzIG5vdCBmdWxseSB1c2VkIGZvciBVbmljb2RlLgorCitUaGUgbG9va3VwIG9mIHByb3BlcnRpZXMgZm9yIGEgZ2l2ZW4gY29kZSBwb2ludCBpcyBkb25lIHdpdGggYSB0cmllIGxvb2t1cCwKK3VzaW5nIHRoZSBVVHJpZSBpbXBsZW1lbnRhdGlvbi4KK1RoZSB0cmllIGxvb2t1cCByZXN1bHQgaXMgYSAxNi1iaXQgcHJvcGVydGllcyB3b3JkLgorCitXaXRoIGEgZ2l2ZW4gVW5pY29kZSBjb2RlIHBvaW50CisKKyAgICBVQ2hhcjMyIGM7CisKK2FuZCAwPD1jPDB4MTEwMDAwLCB0aGUgbG9va3VwIGlzIGRvbmUgbGlrZSB0aGlzOgorCisgICAgdWludDE2X3QgcHJvcHM7CisgICAgVVRSSUVfR0VUMTYodHJpZSwgYywgcHJvcHMpOworCitFYWNoIDE2LWJpdCBwcm9wZXJ0aWVzIHdvcmQgY29udGFpbnM6CisKKyAwLi4gNCAgZ2VuZXJhbCBjYXRlZ29yeQorICAgICA1ICByZXNlcnZlZAorIDYuLjE1ICBudW1lcmljIHR5cGUgYW5kIHZhbHVlIChudHYpCisKK0VuY29kaW5nIG9mIG51bWVyaWMgdHlwZSBhbmQgdmFsdWUgaW4gdGhlIDEwLWJpdCBudHYgZmllbGQ6CisgICAgbnR2ICAgICAgICAgICAgIHR5cGUgICAgICAgICAgICB2YWx1ZQorICAgIDAgICAgICAgICAgICAgICBVX05UX05PTkUgICAgICAgMAorICAgIDEuLjEwICAgICAgICAgICBVX05UX0RFQ0lNQUwgICAgMC4uOQorICAgIDExLi4yMCAgICAgICAgICBVX05UX0RJR0lUICAgICAgMC4uOQorICAgIDIxLi4weDJmZiAgICAgICBVX05UX05VTUVSSUMgICAgc2VlIGJlbG93CisgICAgMHgzMDAuLjB4M2ZmICAgIHJlc2VydmVkCisKKyAgICBGb3IgVV9OVF9OVU1FUklDOgorICAgIG50diAgICAgICAgICAgICB2YWx1ZQorICAgIDIxLi4weGFmICAgICAgICBpbnRlZ2VyICAgICAwLi4xNTQKKyAgICAweGIwLi4weDFkZiAgICAgZnJhY3Rpb24gICAgKChudHY+PjQpLTEyKSAvICgobnR2JjB4ZikrMSkgPSAtMS4uMTcgLyAxLi4xNgorICAgIDB4MWUwLi4weDJmZiAgICBsYXJnZSBpbnQgICAoKG50dj4+NSktMTQpICogMTBeKChudHYmMHgxZikrMikgPSAoMS4uOSkqKDEwXjIuLjEwXjMzKQorICAgICAgICAgICAgICAgICAgICAob25seSBvbmUgc2lnbmlmaWNhbnQgZGVjaW1hbCBkaWdpdCkKKworLS0tIEFkZGl0aW9uYWwgcHJvcGVydGllcyAobmV3IGluIGZvcm1hdCB2ZXJzaW9uIDIuMSkgLS0tCisKK1RoZSBzZWNvbmQgdHJpZSBmb3IgYWRkaXRpb25hbCBwcm9wZXJ0aWVzIChBVCkgaXMgYWxzbyBhIFVUcmllIHdpdGggMTYtYml0IGRhdGEuCitUaGUgZGF0YSB3b3JkcyBjb25zaXN0IG9mIDMyLWJpdCB1bml0IGluZGV4ZXMgKG5vdCByb3cgaW5kZXhlcyEpIGludG8gdGhlCit0YWJsZSBvZiB1bmlxdWUgcHJvcGVydGllcyB2ZWN0b3JzIChQVikuCitFYWNoIHZlY3RvciBjb250YWlucyBhIHNldCBvZiBwcm9wZXJ0aWVzLgorVGhlIHdpZHRoIG9mIGEgdmVjdG9yIChudW1iZXIgb2YgdWludDMyX3QgcGVyIHJvdykgbWF5IGNoYW5nZQord2l0aCB0aGUgZm9ybWF0VmVyc2lvbiwgaXQgaXMgc3RvcmVkIGluIGk1LgorCitDdXJyZW50IHByb3BlcnRpZXM6IHNlZSBpY3Uvc291cmNlL2NvbW1vbi91cHJvcHMuaAorCistLS0gQ2hhbmdlcyBpbiBmb3JtYXQgdmVyc2lvbiAzLjEgLS0tCisKK1NlZSBpMTAgbWF4VmFsdWVzIGFib3ZlLCBjb250YWlucyBvbmx5IFVCTE9DS19DT1VOVCBhbmQgVVNDUklQVF9DT0RFX0xJTUlULgorCistLS0gQ2hhbmdlcyBpbiBmb3JtYXQgdmVyc2lvbiAzLjIgLS0tCisKKy0gVGhlIHRyaWVzIHVzZSBsaW5lYXIgTGF0aW4tMSByYW5nZXMuCistIFRoZSBhZGRpdGlvbmFsIHByb3BlcnRpZXMgYml0cyBzdG9yZSBmdWxsIHByb3BlcnRpZXMgWFlaIGluc3RlYWQKKyAgb2YgcGFydGlhbCBPdGhlcl9YWVosIHNvIHRoYXQgY2hhbmdlcyBpbiB0aGUgZGVyaXZhdGlvbiBmb3JtdWxhcworICBuZWVkIG5vdCBiZSB0cmFja2VkIGluIHJ1bnRpbWUgbGlicmFyeSBjb2RlLgorLSBKb2luaW5nIFR5cGUgYW5kIExpbmUgQnJlYWsgYXJlIGFsc28gc3RvcmVkIGNvbXBsZXRlbHksIHNvIHRoYXQgdXByb3BzLmMKKyAgbmVlZHMgbm8gcnVudGltZSBmb3JtdWxhcyBmb3IgZW51bWVyYXRlZCBwcm9wZXJ0aWVzIGVpdGhlci4KKy0gU3RvcmUgdGhlIGNhc2Utc2Vuc2l0aXZlIGZsYWcgaW4gdGhlIG1haW4gcHJvcGVydGllcyB3b3JkLgorLSBpMTAgYWxzbyBjb250YWlucyBVX0xCX0NPVU5UIGFuZCBVX0VBX0NPVU5ULgorLSBpMTEgY29udGFpbnMgbWF4VmFsdWVzMiBmb3IgdmVjdG9yIHdvcmQgMi4KKworLS0tIENoYW5nZXMgaW4gZm9ybWF0IHZlcnNpb24gNCAtLS0KKworVGhlIGZvcm1hdCBjaGFuZ2VzIGJldHdlZW4gdmVyc2lvbiAzIGFuZCA0IGJlY2F1c2UgdGhlIHByb3BlcnRpZXMgcmVsYXRlZCB0bworY2FzZSBtYXBwaW5ncyBhbmQgYmlkaS9zaGFwaW5nIGFyZSBwdWxsZWQgb3V0IGludG8gc2VwYXJhdGUgZmlsZXMKK2ZvciBtb2R1bGFyaXphdGlvbi4KK0luIG9yZGVyIHRvIHJlZHVjZSB0aGUgbmVlZCBmb3IgY29kZSBjaGFuZ2VzLCBzb21lIG9mIHRoZSBwcmV2aW91cyBkYXRhCitzdHJ1Y3R1cmVzIGFyZSBvbWl0dGVkLCByYXRoZXIgdGhhbiByZWFycmFuZ2luZyBldmVyeXRoaW5nLgorCisoVGhlIGNoYW5nZSB0byBmb3JtYXQgdmVyc2lvbiA0IGlzIGZvciBJQ1UgMy40LiBUaGUgbGFzdCBDVlMgcmV2aXNpb24gb2YKK2dlbnByb3BzL3N0b3JlLmMgZm9yIGZvcm1hdCB2ZXJzaW9uIDMuMiBpcyAxLjQ4LikKKworVGhlIG1haW4gdHJpZSdzIGRhdGEgaXMgc2lnbmlmaWNhbnRseSBzaW1wbGlmaWVkOgorLSBUaGUgdHJpZSdzIDE2LWJpdCBkYXRhIHdvcmQgaXMgdXNlZCBkaXJlY3RseSBpbnN0ZWFkIG9mIGFzIGFuIGluZGV4CisgIGludG8gcHJvcHMzMltdLgorLSBUaGUgdHJpZSB1c2VzIHRoZSBkZWZhdWx0IHRyaWUgZm9sZGluZyBmdW5jdGlvbnMgaW5zdGVhZCBvZiBjdXN0b20gb25lcy4KKy0gTnVtZXJpYyB2YWx1ZXMgYXJlIHN0b3JlZCBkaXJlY3RseSBpbiB0aGUgdHJpZSBkYXRhIHdvcmQsIHdpdGggc3BlY2lhbAorICBlbmNvZGluZ3MuCistIE5vIG1vcmUgZXhjZXB0aW9uIGRhdGEgKHRoZSBkYXRhIHRoYXQgbmVlZGVkIGl0IHdhcyBwdWxsZWQgb3V0LCBvciwgaW4gdGhlCisgIGNhc2Ugb2YgbnVtZXJpYyB2YWx1ZXMsIGVuY29kZWQgZGlmZmVyZW50bHkpLgorLSBObyBtb3JlIHN0cmluZyBkYXRhIChwdWxsZWQgb3V0IC0gd2FzIGZvciBjYXNlIG1hcHBpbmdzKS4KKworQWxzbywgc29tZSBvZiB0aGUgcHJldmlvdXNseSB1c2VkIHByb3BlcnRpZXMgdmVjdG9yIGJpdHMgYXJlIHJlc2VydmVkIGFnYWluLgorCitUaGUgaW5kZXhlc1tdIHZhbHVlcyBmb3IgdGhlIG9taXR0ZWQgc3RydWN0dXJlcyBhcmUgc3RpbGwgZmlsbGVkIGluCisoaW5kaWNhdGluZyB6ZXJvLWxlbmd0aCBhcnJheXMpIHNvIHRoYXQgdGhlIHN3YXBwZXIgY29kZSByZW1haW5zIHVuY2hhbmdlZC4KKworLS0tIENoYW5nZXMgaW4gZm9ybWF0IHZlcnNpb24gNSAtLS0KKworRm9ybWF0IHZlcnNpb24gNSBiZWNhbWUgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIGJpdCBmaWVsZCBmb3Igc2NyaXB0IGNvZGVzCitvdmVyZmxvd2VkLiBUaGUgY2hhbmdlcyBhcmUgaW5jb21wYXRpYmxlIGJlY2F1c2UKK29sZCBjb2RlIHdvdWxkIGhhdmUgc2VlbiBub25zZW5zaWNhbGx5IGxvdyB2YWx1ZXMgZm9yIG5ldywgaGlnaGVyIHNjcmlwdCBjb2Rlcy4KKworUmVhcnJhbmdlZCBiaXQgZmllbGRzIGluIHRoZSBzZWNvbmQgdHJpZSAoQVQpIGFuZCB3aWRlbmVkIHRocmVlIChTY3JpcHQsIEJsb2NrLAorV29yZF9CcmVhaykgYnkgb25lIGJpdCBlYWNoLgorCitNb2RpZmllZCBiaXQgZmllbGRzIGluIGljdS9zb3VyY2UvY29tbW9uL3Vwcm9wcy5oCisKKy0tLSBDaGFuZ2VzIGluIGZvcm1hdCB2ZXJzaW9uIDYgLS0tCisKK0Zvcm1hdCB2ZXJzaW9uIDYgYmVjYW1lIG5lY2Vzc2FyeSBiZWNhdXNlIFVuaWNvZGUgNS4yIGFkZHMgZnJhY3Rpb25zIHdpdGgKK2Rlbm9taW5hdG9ycyA5LCAxMCBhbmQgMTYsIGFuZCBpdCB3YXMgZWFzaWVyIHRvIHJlZGVzaWduIHRoZSBlbmNvZGluZyBvZiBudW1lcmljCit0eXBlcyBhbmQgdmFsdWVzIHJhdGhlciB0aGFuIGFkZCBhbm90aGVyIHZhcmlhbnQgdG8gdGhlIHByZXZpb3VzIGZvcm1hdC4KKworLS0tIENoYW5nZXMgaW4gZm9ybWF0IHZlcnNpb24gNyAtLS0KKworVW5pY29kZSA2LjAgYWRkcyBTY3JpcHRfRXh0ZW5zaW9ucy4gRm9yIGNoYXJhY3RlcnMgd2l0aCBzY3JpcHQgZXh0ZW5zaW9ucyBkYXRhLAordGhlIHNjcmlwdCBjb2RlIGJpdHMgYXJlIGFuIGluZGV4IGludG8gdGhlIG5ldyBTY3JpcHRfRXh0ZW5zaW9ucyBhcnJheSByYXRoZXIKK3RoYW4gYSBzY3JpcHQgY29kZS4KKworQ2hhbmdlIGZyb20gVVRyaWUgdG8gVVRyaWUyLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBVRGF0YUluZm8gY2YuIHVkYXRhLmggKi8KK3N0YXRpYyBVRGF0YUluZm8gZGF0YUluZm89eworICAgIHNpemVvZihVRGF0YUluZm8pLAorICAgIDAsCisKKyAgICBVX0lTX0JJR19FTkRJQU4sCisgICAgVV9DSEFSU0VUX0ZBTUlMWSwKKyAgICBVX1NJWkVPRl9VQ0hBUiwKKyAgICAwLAorCisgICAgeyAweDU1LCAweDUwLCAweDcyLCAweDZmIH0sICAgICAgICAgICAgICAgICAvKiBkYXRhRm9ybWF0PSJVUHJvIiAqLworICAgIHsgNywgMCwgMCwgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZm9ybWF0VmVyc2lvbiAqLworICAgIHsgNiwgMCwgMCwgMCB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGF0YVZlcnNpb24gKi8KK307CisKK3N0YXRpYyBVVHJpZTIgKnBUcmllPU5VTEw7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK1VfQ0ZVTkMgdm9pZAorc2V0VW5pY29kZVZlcnNpb24oY29uc3QgY2hhciAqdikgeworICAgIFVWZXJzaW9uSW5mbyB2ZXJzaW9uOworICAgIHVfdmVyc2lvbkZyb21TdHJpbmcodmVyc2lvbiwgdik7CisgICAgdXBydl9tZW1jcHkoZGF0YUluZm8uZGF0YVZlcnNpb24sIHZlcnNpb24sIDQpOworfQorCitVX0NGVU5DIHZvaWQKK2luaXRTdG9yZSgpIHsKKyAgICBVRXJyb3JDb2RlIGVycm9yQ29kZT1VX1pFUk9fRVJST1I7CisgICAgcFRyaWU9dXRyaWUyX29wZW4oMCwgMCwgJmVycm9yQ29kZSk7CisgICAgaWYoVV9GQUlMVVJFKGVycm9yQ29kZSkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJlcnJvcjogdXRyaWUyX29wZW4oKSBmYWlsZWQgLSAlc1xuIiwgdV9lcnJvck5hbWUoZXJyb3JDb2RlKSk7CisgICAgICAgIGV4aXQoZXJyb3JDb2RlKTsKKyAgICB9CisKKyAgICBpbml0QWRkaXRpb25hbFByb3BlcnRpZXMoKTsKK30KKworVV9DRlVOQyB2b2lkCitleGl0U3RvcmUoKSB7CisgICAgdXRyaWUyX2Nsb3NlKHBUcmllKTsKKyAgICBleGl0QWRkaXRpb25hbFByb3BlcnRpZXMoKTsKK30KKworLyogc3RvcmUgYSBjaGFyYWN0ZXIncyBwcm9wZXJ0aWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworVV9DRlVOQyB1aW50MzJfdAorbWFrZVByb3BzKFByb3BzICpwKSB7CisgICAgdWludDMyX3QgZGVuOworICAgIGludDMyX3QgdHlwZSwgdmFsdWUsIGV4cCwgbnR2OworCisgICAgLyogZW5jb2RlIG51bWVyaWMgdHlwZSAmIHZhbHVlICovCisgICAgdHlwZT1wLT5udW1lcmljVHlwZTsKKyAgICB2YWx1ZT1wLT5udW1lcmljVmFsdWU7CisgICAgZGVuPXAtPmRlbm9taW5hdG9yOworICAgIGV4cD1wLT5leHBvbmVudDsKKworICAgIG50dj0tMTsgLyogdGhlIG51bWVyaWMgdHlwZSBhbmQgdmFsdWUgY2Fubm90IGJlIGVuY29kZWQgaWYgbnR2IHJlbWFpbnMgLTEgKi8KKyAgICBzd2l0Y2godHlwZSkgeworICAgIGNhc2UgVV9OVF9OT05FOgorICAgICAgICBpZih2YWx1ZT09MCAmJiBkZW49PTAgJiYgZXhwPT0wKSB7CisgICAgICAgICAgICBudHY9VVBST1BTX05UVl9OT05FOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVV9OVF9ERUNJTUFMOgorICAgICAgICBpZigwPD12YWx1ZSAmJiB2YWx1ZTw9OSAmJiBkZW49PTAgJiYgZXhwPT0wKSB7CisgICAgICAgICAgICBudHY9VVBST1BTX05UVl9ERUNJTUFMX1NUQVJUK3ZhbHVlOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVV9OVF9ESUdJVDoKKyAgICAgICAgaWYoMDw9dmFsdWUgJiYgdmFsdWU8PTkgJiYgZGVuPT0wICYmIGV4cD09MCkgeworICAgICAgICAgICAgbnR2PVVQUk9QU19OVFZfRElHSVRfU1RBUlQrdmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBVX05UX05VTUVSSUM6CisgICAgICAgIGlmKGRlbj09MCkgeworICAgICAgICAgICAgaWYoZXhwPT0yICYmICh2YWx1ZSoxMDApPD1VUFJPUFNfTlRWX01BWF9TTUFMTF9JTlQpIHsKKyAgICAgICAgICAgICAgICAvKiBzbWFsbCBpbnRlZ2VyIHBhcnNlZCBsaWtlIGEgbGFyZ2Ugb25lICovCisgICAgICAgICAgICAgICAgbnR2PVVQUk9QU19OVFZfTlVNRVJJQ19TVEFSVCt2YWx1ZSoxMDA7CisgICAgICAgICAgICB9IGVsc2UgaWYoZXhwPT0wICYmIHZhbHVlPj0wKSB7CisgICAgICAgICAgICAgICAgaWYodmFsdWU8PVVQUk9QU19OVFZfTUFYX1NNQUxMX0lOVCkgeworICAgICAgICAgICAgICAgICAgICAvKiBzbWFsbCBpbnRlZ2VyICovCisgICAgICAgICAgICAgICAgICAgIG50dj1VUFJPUFNfTlRWX05VTUVSSUNfU1RBUlQrdmFsdWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyogbGFyZ2UgaW50ZWdlciBwYXJzZWQgbGlrZSBhIHNtYWxsIG9uZSAqLworICAgICAgICAgICAgICAgICAgICAvKiBzcGxpdCB0aGUgdmFsdWUgaW50byBtYW50aXNzYSBhbmQgZXhwb25lbnQsIGJhc2UgMTAgKi8KKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtYW50PXZhbHVlOworICAgICAgICAgICAgICAgICAgICB3aGlsZSgobWFudCUxMCk9PTApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hbnQvPTEwOworICAgICAgICAgICAgICAgICAgICAgICAgKytleHA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYobWFudDw9OSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbnR2PSgobWFudCsxNCk8PDUpKyhleHAtMik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYoMjw9ZXhwICYmIGV4cDw9MzMgJiYgMTw9dmFsdWUgJiYgdmFsdWU8PTkpIHsKKyAgICAgICAgICAgICAgICAvKiBsYXJnZSwgc2luZ2xlLXNpZ25pZmljYW50LWRpZ2l0IGludGVnZXIgKi8KKyAgICAgICAgICAgICAgICBudHY9KCh2YWx1ZSsxNCk8PDUpKyhleHAtMik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZihleHA9PTApIHsKKyAgICAgICAgICAgIGlmKC0xPD12YWx1ZSAmJiB2YWx1ZTw9MTcgJiYgMTw9ZGVuICYmIGRlbjw9MTYpIHsKKyAgICAgICAgICAgICAgICAvKiBmcmFjdGlvbiAqLworICAgICAgICAgICAgICAgIG50dj0oKHZhbHVlKzEyKTw8NCkrKGRlbi0xKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZihudHY8MCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbnByb3BzIGVycm9yOiB1bmFibGUgdG8gZW5jb2RlIG51bWVyaWMgdHlwZSAlZCAmIHZhbHVlICVsZC8lbHUgRSVkXG4iLAorICAgICAgICAgICAgICAgIChpbnQpdHlwZSwgKGxvbmcpdmFsdWUsICh1bnNpZ25lZCBsb25nKWRlbiwgZXhwKTsKKyAgICAgICAgZXhpdChVX0lMTEVHQUxfQVJHVU1FTlRfRVJST1IpOworICAgIH0KKworICAgIC8qIGVuY29kZSB0aGUgcHJvcGVydGllcyAqLworICAgIHJldHVybgorICAgICAgICAodWludDMyX3QpcC0+Z2VuZXJhbENhdGVnb3J5IHwKKyAgICAgICAgKG50djw8VVBST1BTX05VTUVSSUNfVFlQRV9WQUxVRV9TSElGVCk7Cit9CisKK1VfQ0ZVTkMgdm9pZAorYWRkUHJvcHModWludDMyX3QgYywgdWludDMyX3QgeCkgeworICAgIFVFcnJvckNvZGUgZXJyb3JDb2RlPVVfWkVST19FUlJPUjsKKyAgICB1dHJpZTJfc2V0MzIocFRyaWUsIChVQ2hhcjMyKWMsIHgsICZlcnJvckNvZGUpOworICAgIGlmKFVfRkFJTFVSRShlcnJvckNvZGUpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZXJyb3I6IHV0cmllMl9zZXQzMihwcm9wZXJ0aWVzIHRyaWUpIGZhaWxlZCAtICVzXG4iLAorICAgICAgICAgICAgICAgIHVfZXJyb3JOYW1lKGVycm9yQ29kZSkpOworICAgICAgICBleGl0KGVycm9yQ29kZSk7CisgICAgfQorfQorCitVX0NGVU5DIHVpbnQzMl90CitnZXRQcm9wcyh1aW50MzJfdCBjKSB7CisgICAgcmV0dXJuIHV0cmllMl9nZXQzMihwVHJpZSwgKFVDaGFyMzIpYyk7Cit9CisKKy8qIGFyZWFzIG9mIHNhbWUgcHJvcGVydGllcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK1VfQ0ZVTkMgdm9pZAorcmVwZWF0UHJvcHModWludDMyX3QgZmlyc3QsIHVpbnQzMl90IGxhc3QsIHVpbnQzMl90IHgpIHsKKyAgICBVRXJyb3JDb2RlIGVycm9yQ29kZT1VX1pFUk9fRVJST1I7CisgICAgdXRyaWUyX3NldFJhbmdlMzIocFRyaWUsIChVQ2hhcjMyKWZpcnN0LCAoVUNoYXIzMilsYXN0LCB4LCBGQUxTRSwgJmVycm9yQ29kZSk7CisgICAgaWYoVV9GQUlMVVJFKGVycm9yQ29kZSkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJlcnJvcjogdXRyaWUyX3NldDMyKHByb3BlcnRpZXMgdHJpZSkgZmFpbGVkIC0gJXNcbiIsCisgICAgICAgICAgICAgICAgdV9lcnJvck5hbWUoZXJyb3JDb2RlKSk7CisgICAgICAgIGV4aXQoZXJyb3JDb2RlKTsKKyAgICB9Cit9CisKKy8qIGdlbmVyYXRlIG91dHB1dCBkYXRhIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK1VfQ0ZVTkMgdm9pZAorZ2VuZXJhdGVEYXRhKGNvbnN0IGNoYXIgKmRhdGFEaXIsIFVCb29sIGNzb3VyY2UpIHsKKyAgICBzdGF0aWMgaW50MzJfdCBpbmRleGVzW1VQUk9QU19JTkRFWF9DT1VOVF09eworICAgICAgICAwLCAwLCAwLCAwLAorICAgICAgICAwLCAwLCAwLCAwLAorICAgICAgICAwLCAwLCAwLCAwLAorICAgICAgICAwLCAwLCAwLCAwCisgICAgfTsKKyAgICBzdGF0aWMgdWludDhfdCB0cmllQmxvY2tbNDAwMDBdOworICAgIHN0YXRpYyB1aW50OF90IGFkZGl0aW9uYWxQcm9wc1sxMjAwMDBdOworCisgICAgVU5ld0RhdGFNZW1vcnkgKnBEYXRhOworICAgIFVFcnJvckNvZGUgZXJyb3JDb2RlPVVfWkVST19FUlJPUjsKKyAgICB1aW50MzJfdCBzaXplID0gMDsKKyAgICBpbnQzMl90IHRyaWVTaXplLCBhZGRpdGlvbmFsUHJvcHNTaXplLCBvZmZzZXQ7CisgICAgbG9uZyBkYXRhTGVuZ3RoOworCisgICAgdXRyaWUyX2ZyZWV6ZShwVHJpZSwgVVRSSUUyXzE2X1ZBTFVFX0JJVFMsICZlcnJvckNvZGUpOworICAgIHRyaWVTaXplPXV0cmllMl9zZXJpYWxpemUocFRyaWUsIHRyaWVCbG9jaywgc2l6ZW9mKHRyaWVCbG9jayksICZlcnJvckNvZGUpOworICAgIGlmKFVfRkFJTFVSRShlcnJvckNvZGUpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZXJyb3I6IHV0cmllMl9mcmVlemUobWFpbiB0cmllKSt1dHJpZTJfc2VyaWFsaXplKCkgZmFpbGVkOiAlcyAobGVuZ3RoICVsZClcbiIsCisgICAgICAgICAgICAgICAgdV9lcnJvck5hbWUoZXJyb3JDb2RlKSwgKGxvbmcpdHJpZVNpemUpOworICAgICAgICBleGl0KGVycm9yQ29kZSk7CisgICAgfQorCisgICAgb2Zmc2V0PXNpemVvZihpbmRleGVzKS80OyAgICAgICAgICAgICAgIC8qIHVpbnQzMl90IG9mZnNldCB0byB0aGUgcHJvcGVydGllcyB0cmllICovCisKKyAgICAvKiByb3VuZCB1cCB0cmllIHNpemUgdG8gNC1hbGlnbm1lbnQgKi8KKyAgICB3aGlsZSh0cmllU2l6ZSYzKSB7CisgICAgICAgIHRyaWVCbG9ja1t0cmllU2l6ZSsrXT0wOworICAgIH0KKyAgICBvZmZzZXQrPXRyaWVTaXplPj4yOworICAgIGluZGV4ZXNbVVBST1BTX1BST1BTMzJfSU5ERVhdPSAgICAgICAgICAvKiBzZXQgaW5kZXhlcyB0byB0aGUgc2FtZSBvZmZzZXRzIGZvciBlbXB0eSAqLworICAgIGluZGV4ZXNbVVBST1BTX0VYQ0VQVElPTlNfSU5ERVhdPSAgICAgICAvKiBzdHJ1Y3R1cmVzIGZyb20gdGhlIG9sZCBmb3JtYXQgdmVyc2lvbiAzICovCisgICAgaW5kZXhlc1tVUFJPUFNfRVhDRVBUSU9OU19UT1BfSU5ERVhdPSAgIC8qIHNvIHRoYXQgbGVzcyBydW50aW1lIGNvZGUgaGFzIHRvIGJlIGNoYW5nZWQgKi8KKyAgICBpbmRleGVzW1VQUk9QU19BRERJVElPTkFMX1RSSUVfSU5ERVhdPW9mZnNldDsKKworICAgIGlmKGJlVmVyYm9zZSkgeworICAgICAgICBwcmludGYoInRyaWUgc2l6ZSBpbiBieXRlczogICAgICAgICAgICAgICAgICAgICU1dVxuIiwgKGludCl0cmllU2l6ZSk7CisgICAgfQorCisgICAgaWYoY3NvdXJjZSkgeworICAgICAgICAvKiB3cml0ZSAuYyBmaWxlIGZvciBoYXJkY29kZWQgZGF0YSAqLworICAgICAgICBGSUxFICpmPXVzcmNfY3JlYXRlKGRhdGFEaXIsICJ1Y2hhcl9wcm9wc19kYXRhLmMiKTsKKyAgICAgICAgaWYoZiE9TlVMTCkgeworICAgICAgICAgICAgLyogdW51c2VkCisgICAgICAgICAgICB1c3JjX3dyaXRlQXJyYXkoZiwKKyAgICAgICAgICAgICAgICAic3RhdGljIGNvbnN0IFVWZXJzaW9uSW5mbyBmb3JtYXRWZXJzaW9uPXsiLAorICAgICAgICAgICAgICAgIGRhdGFJbmZvLmZvcm1hdFZlcnNpb24sIDgsIDQsCisgICAgICAgICAgICAgICAgIn07XG5cbiIpOworICAgICAgICAgICAgICovCisgICAgICAgICAgICB1c3JjX3dyaXRlQXJyYXkoZiwKKyAgICAgICAgICAgICAgICAic3RhdGljIGNvbnN0IFVWZXJzaW9uSW5mbyBkYXRhVmVyc2lvbj17IiwKKyAgICAgICAgICAgICAgICBkYXRhSW5mby5kYXRhVmVyc2lvbiwgOCwgNCwKKyAgICAgICAgICAgICAgICAifTtcblxuIik7CisgICAgICAgICAgICB1c3JjX3dyaXRlVVRyaWUyQXJyYXlzKGYsCisgICAgICAgICAgICAgICAgInN0YXRpYyBjb25zdCB1aW50MTZfdCBwcm9wc1RyaWVfaW5kZXhbJWxkXT17XG4iLCBOVUxMLAorICAgICAgICAgICAgICAgIHBUcmllLAorICAgICAgICAgICAgICAgICJcbn07XG5cbiIpOworICAgICAgICAgICAgdXNyY193cml0ZVVUcmllMlN0cnVjdChmLAorICAgICAgICAgICAgICAgICJzdGF0aWMgY29uc3QgVVRyaWUyIHByb3BzVHJpZT17XG4iLAorICAgICAgICAgICAgICAgIHBUcmllLCAicHJvcHNUcmllX2luZGV4IiwgTlVMTCwKKyAgICAgICAgICAgICAgICAifTtcblxuIik7CisKKyAgICAgICAgICAgIGFkZGl0aW9uYWxQcm9wc1NpemU9d3JpdGVBZGRpdGlvbmFsRGF0YShmLCBhZGRpdGlvbmFsUHJvcHMsIHNpemVvZihhZGRpdGlvbmFsUHJvcHMpLCBpbmRleGVzKTsKKyAgICAgICAgICAgIHNpemU9NCpvZmZzZXQrYWRkaXRpb25hbFByb3BzU2l6ZTsgICAgICAvKiB0b3RhbCBzaXplIG9mIGRhdGEgKi8KKworICAgICAgICAgICAgdXNyY193cml0ZUFycmF5KGYsCisgICAgICAgICAgICAgICAgInN0YXRpYyBjb25zdCBpbnQzMl90IGluZGV4ZXNbVVBST1BTX0lOREVYX0NPVU5UXT17IiwKKyAgICAgICAgICAgICAgICBpbmRleGVzLCAzMiwgVVBST1BTX0lOREVYX0NPVU5ULAorICAgICAgICAgICAgICAgICJ9O1xuXG4iKTsKKyAgICAgICAgICAgIGZjbG9zZShmKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8qIHdyaXRlIHRoZSBkYXRhICovCisgICAgICAgIHBEYXRhPXVkYXRhX2NyZWF0ZShkYXRhRGlyLCBEQVRBX1RZUEUsIERBVEFfTkFNRSwgJmRhdGFJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZUNvcHlyaWdodCA/IFVfQ09QWVJJR0hUX1NUUklORyA6IE5VTEwsICZlcnJvckNvZGUpOworICAgICAgICBpZihVX0ZBSUxVUkUoZXJyb3JDb2RlKSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZW5wcm9wczogdWRhdGFfY3JlYXRlKCVzLCAlcy4lcykgZmFpbGVkIC0gJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIGRhdGFEaXIsIERBVEFfTkFNRSwgREFUQV9UWVBFLAorICAgICAgICAgICAgICAgICAgICB1X2Vycm9yTmFtZShlcnJvckNvZGUpKTsKKyAgICAgICAgICAgIGV4aXQoZXJyb3JDb2RlKTsKKyAgICAgICAgfQorCisgICAgICAgIGFkZGl0aW9uYWxQcm9wc1NpemU9d3JpdGVBZGRpdGlvbmFsRGF0YShOVUxMLCBhZGRpdGlvbmFsUHJvcHMsIHNpemVvZihhZGRpdGlvbmFsUHJvcHMpLCBpbmRleGVzKTsKKyAgICAgICAgc2l6ZT00Km9mZnNldCthZGRpdGlvbmFsUHJvcHNTaXplOyAgICAgIC8qIHRvdGFsIHNpemUgb2YgZGF0YSAqLworCisgICAgICAgIHVkYXRhX3dyaXRlQmxvY2socERhdGEsIGluZGV4ZXMsIHNpemVvZihpbmRleGVzKSk7CisgICAgICAgIHVkYXRhX3dyaXRlQmxvY2socERhdGEsIHRyaWVCbG9jaywgdHJpZVNpemUpOworICAgICAgICB1ZGF0YV93cml0ZUJsb2NrKHBEYXRhLCBhZGRpdGlvbmFsUHJvcHMsIGFkZGl0aW9uYWxQcm9wc1NpemUpOworCisgICAgICAgIC8qIGZpbmlzaCB1cCAqLworICAgICAgICBkYXRhTGVuZ3RoPXVkYXRhX2ZpbmlzaChwRGF0YSwgJmVycm9yQ29kZSk7CisgICAgICAgIGlmKFVfRkFJTFVSRShlcnJvckNvZGUpKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdlbnByb3BzOiBlcnJvciAlZCB3cml0aW5nIHRoZSBvdXRwdXQgZmlsZVxuIiwgZXJyb3JDb2RlKTsKKyAgICAgICAgICAgIGV4aXQoZXJyb3JDb2RlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKGRhdGFMZW5ndGghPShsb25nKXNpemUpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2VucHJvcHM6IGRhdGEgbGVuZ3RoICVsZCAhPSBjYWxjdWxhdGVkIHNpemUgJWx1XG4iLAorICAgICAgICAgICAgICAgIGRhdGFMZW5ndGgsICh1bnNpZ25lZCBsb25nKXNpemUpOworICAgICAgICAgICAgZXhpdChVX0lOVEVSTkFMX1BST0dSQU1fRVJST1IpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYoYmVWZXJib3NlKSB7CisgICAgICAgIHByaW50ZigiZGF0YSBzaXplOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAlNmx1XG4iLCAodW5zaWduZWQgbG9uZylzaXplKTsKKyAgICB9Cit9CisKKy8qCisgKiBIZXksIEVtYWNzLCBwbGVhc2Ugc2V0IHRoZSBmb2xsb3dpbmc6CisgKgorICogTG9jYWwgVmFyaWFibGVzOgorICogaW5kZW50LXRhYnMtbW9kZTogbmlsCisgKiBFbmQ6CisgKgorICovCmRpZmYgLS1naXQgYS91bmljb2RlL2MvZ2VudWNhL0NNYWtlTGlzdHMudHh0IGIvdW5pY29kZS9jL2dlbnVjYS9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmQ3NTk1Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZS9jL2dlbnVjYS9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDkgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDEwLCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzCisjIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBjcmVhdGVkIG9uOiAyMDEwanVuMDMKKyMgY3JlYXRlZCBieTogTWFya3VzIFcuIFNjaGVyZXIKKyMgZWRpdGVkIG9uOiAyMDEwanVsMjAKKyMgZWRpdGVkIGJ5OiBTdHVhcnQgRy4gR2lsbAorYWRkX2V4ZWN1dGFibGUoZ2VudWNhIGdlbnVjYS5jcHApCit0YXJnZXRfbGlua19saWJyYXJpZXMoZ2VudWNhIGljdXVjIGljdWkxOG4gaWN1dHUpCmRpZmYgLS1naXQgYS91bmljb2RlL2MvZ2VudWNhL01ha2VmaWxlLmluIGIvdW5pY29kZS9jL2dlbnVjYS9NYWtlZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjEzOGUyCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZS9jL2dlbnVjYS9NYWtlZmlsZS5pbgpAQCAtMCwwICsxLDk2IEBACisjIyBNYWtlZmlsZS5pbiBmb3IgSUNVIC0gdG9vbHMvZ2VudWNhCisjIyBDb3B5cmlnaHQgKGMpIDE5OTktMjAwOCwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQKKyMjIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworIyMgU291cmNlIGRpcmVjdG9yeSBpbmZvcm1hdGlvbgorc3JjZGlyID0gQHNyY2RpckAKK3RvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKKwordG9wX2J1aWxkZGlyID0gLi4vLi4KKworaW5jbHVkZSAkKHRvcF9idWlsZGRpcikvaWN1ZGVmcy5taworCisjIyBCdWlsZCBkaXJlY3RvcnkgaW5mb3JtYXRpb24KK3N1YmRpciA9IHRvb2xzL2dlbnVjYQorCitUQVJHRVRfU1RVQl9OQU1FID0gZ2VudWNhCisKK1NFQ1RJT04gPSA4CisKK01BTl9GSUxFUyA9ICQoVEFSR0VUX1NUVUJfTkFNRSkuJChTRUNUSU9OKQorCisKKyMjIEV4dHJhIGZpbGVzIHRvIHJlbW92ZSBmb3IgJ21ha2UgY2xlYW4nCitDTEVBTkZJTEVTID0gKn4gJChERVBTKSAkKE1BTl9GSUxFUykKKworIyMgVGFyZ2V0IGluZm9ybWF0aW9uCitUQVJHRVQgPSAkKEJJTkRJUikvJChUQVJHRVRfU1RVQl9OQU1FKSQoRVhFRVhUKQorCitpZm5lcSAoJCh0b3BfYnVpbGRkaXIpLCQodG9wX3NyY2RpcikpCitDUFBGTEFHUyArPSAtSSQodG9wX2J1aWxkZGlyKS9jb21tb24KK2VuZGlmCitDUFBGTEFHUyArPSAtSSQodG9wX3NyY2RpcikvY29tbW9uIC1JJCh0b3Bfc3JjZGlyKS9pMThuIC1JJChzcmNkaXIpLy4uL3Rvb2x1dGlsCitMSUJTID0gJChMSUJJQ1VUT09MVVRJTCkgJChMSUJJQ1VJMThOKSAkKExJQklDVVVDKSAkKERFRkFVTFRfTElCUykgJChMSUJfTSkKKworT0JKRUNUUyA9IGdlbnVjYS5vIAorCitERVBTID0gJChPQkpFQ1RTOi5vPS5kKQorCisjIyBMaXN0IG9mIHBob255IHRhcmdldHMKKy5QSE9OWSA6IGFsbCBhbGwtbG9jYWwgaW5zdGFsbCBpbnN0YWxsLWxvY2FsIGNsZWFuIGNsZWFuLWxvY2FsCVwKK2Rpc3RjbGVhbiBkaXN0Y2xlYW4tbG9jYWwgZGlzdCBkaXN0LWxvY2FsIGNoZWNrIGNoZWNrLWxvY2FsIGluc3RhbGwtbWFuCisKKyMjIENsZWFyIHN1ZmZpeCBsaXN0CisuU1VGRklYRVMgOgorCisjIyBMaXN0IG9mIHN0YW5kYXJkIHRhcmdldHMKK2FsbDogYWxsLWxvY2FsCitpbnN0YWxsOiBpbnN0YWxsLWxvY2FsCitjbGVhbjogY2xlYW4tbG9jYWwKK2Rpc3RjbGVhbiA6IGRpc3RjbGVhbi1sb2NhbAorZGlzdDogZGlzdC1sb2NhbAorY2hlY2s6IGFsbCBjaGVjay1sb2NhbAorCithbGwtbG9jYWw6ICQoVEFSR0VUKSAkKE1BTl9GSUxFUykKKworaW5zdGFsbC1sb2NhbDogYWxsLWxvY2FsIGluc3RhbGwtbWFuCisJJChNS0lOU1RBTExESVJTKSAkKERFU1RESVIpJChzYmluZGlyKQorCSQoSU5TVEFMTCkgJChUQVJHRVQpICQoREVTVERJUikkKHNiaW5kaXIpCisKK2luc3RhbGwtbWFuOiAkKE1BTl9GSUxFUykKKwkkKE1LSU5TVEFMTERJUlMpICQoREVTVERJUikkKG1hbmRpcikvbWFuJChTRUNUSU9OKQorCSQoSU5TVEFMTF9EQVRBKSAkPyAkKERFU1RESVIpJChtYW5kaXIpL21hbiQoU0VDVElPTikKKworZGlzdC1sb2NhbDoKKworY2xlYW4tbG9jYWw6CisJdGVzdCAteiAiJChDTEVBTkZJTEVTKSIgfHwgJChSTVYpICQoQ0xFQU5GSUxFUykKKwkkKFJNVikgJChUQVJHRVQpICQoT0JKRUNUUykKKworZGlzdGNsZWFuLWxvY2FsOiBjbGVhbi1sb2NhbAorCSQoUk1WKSBNYWtlZmlsZQorCitjaGVjay1sb2NhbDogYWxsLWxvY2FsCisKK01ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCisJY2QgJCh0b3BfYnVpbGRkaXIpIFwKKwkgJiYgQ09ORklHX0ZJTEVTPSQoc3ViZGlyKS8kQCBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCisKKyQoVEFSR0VUKSA6ICQoT0JKRUNUUykKKwkkKExJTksuY2MpICQoT1VUT1BUKSRAICReICQoTElCUykgCisJJChQT1NUX0JVSUxEX1NURVApCisKKworJS4kKFNFQ1RJT04pOiAkKHNyY2RpcikvJS4kKFNFQ1RJT04pLmluCisJY2QgJCh0b3BfYnVpbGRkaXIpIFwKKwkgJiYgQ09ORklHX0ZJTEVTPSQoc3ViZGlyKS8kQCBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCisKKworaWZlcSAoLCQoTUFLRUNNREdPQUxTKSkKKy1pbmNsdWRlICQoREVQUykKK2Vsc2UKK2lmbmVxICgkKHBhdHN1YnN0ICVjbGVhbiwsJChNQUtFQ01ER09BTFMpKSwpCistaW5jbHVkZSAkKERFUFMpCitlbmRpZgorZW5kaWYKKwpkaWZmIC0tZ2l0IGEvdW5pY29kZS9jL2dlbnVjYS9nZW50ZXN0c3R1Yi5weSBiL3VuaWNvZGUvYy9nZW51Y2EvZ2VudGVzdHN0dWIucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTNmZGU4NQotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGUvYy9nZW51Y2EvZ2VudGVzdHN0dWIucHkKQEAgLTAsMCArMSw1MyBAQAorIyEvdXNyL2Jpbi9weXRob24KKyMgICBDb3B5cmlnaHQgKEMpIDIwMDksIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMKKyMgICBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgICBmaWxlIG5hbWU6ICBnZW50ZXN0c3R1Yi5weQorIyAgIGVuY29kaW5nOiAgIFVTLUFTQ0lJCisjICAgdGFiIHNpemU6ICAgOCAobm90IHVzZWQpCisjICAgaW5kZW50YXRpb246MgorCitfX2F1dGhvcl9fID0gIkNsYWlyZSBIbyIKKworaW1wb3J0IHN5cworCisjIHJlYWQgZmlsZQorcHJpbnQgImNvbW1hbmQ6ICBweXRob24gZ2VudGVzdHN0dWIucHkgPGlucHV0RmlsZU5hbWUudHh0PiAgPG91dHB1dEZpbGVOYW1lLnR4dD4iCitwcmludCAiaWYgdGhlIGZpbGVOYW1lLnR4dCBpcyBvbWl0dGVkLCB0aGUgZGVmYXVsdCBkYXRhIGZpbGUgaXMgQ29sbGF0aW9uVGVzdF9OT05fSUdOT1JBQkxFX1NIT1JULnR4dCIKK2lmIGxlbihzeXMuYXJndikgPj0gMjoKKyAgZm5hbWU9c3lzLmFyZ3ZbMV0KK2Vsc2UgOgorICBmbmFtZT0iQ29sbGF0aW9uVGVzdF9OT05fSUdOT1JBQkxFX1NIT1JULnR4dCIKK29wZW5maWxlID0gb3BlbihmbmFtZSwgJ3InKTsKKworI291dHB1dCBmaWxlIG5hbWUKK2V4dD1mbmFtZS5maW5kKCIudHh0Iik7CitpZiBsZW4oc3lzLmFyZ3YpID49MyA6CisgIHdGbmFtZSA9IHN5cy5hcmd2WzJdCitlbGlmIChleHQ+MCkgOgorICB3Rm5hbWUgPSBmbmFtZVs6ZXh0KzFdKyJfU1RVQi50eHQiCitlbHNlIDoKKyAgd0ZuYW1lID0gIm91dC50eHQiCit3cmZpbGUgPSBvcGVuKHdGbmFtZSwndycpCisKK3ByaW50ICJSZWFkaW5nIGZpbGU6ICIrZm5hbWUrIiAuLi4iCitwcmludCAiV3JpdGluZyBmaWxlOiAiK3dGbmFtZSsiIC4uLiIKK2NvdW50PTEwCitmb3IgbGluZSBpbiBvcGVuZmlsZS5yZWFkbGluZXMoKToKKyAgcG9zID0gbGluZS5maW5kKCIjIikKKyAgaWYgcG9zID09IDA6CisgICAgIyBwcmludCB0aGUgaGVhZGVyCisgICAgd3JmaWxlLndyaXRlKGxpbmUucnN0cmlwKCkrIlxuIikKKyAgICBjb250aW51ZQorICBpZiBwb3MgPj0gMDogbGluZSA9IGxpbmVbOnBvc10KKyAgbGluZSA9IGxpbmUucnN0cmlwKCkKKyAgaWYgbGluZToKKyAgICBpZiAoY291bnQ9PTEwKToKKyAgICAgIHdyZmlsZS53cml0ZShsaW5lKyJcbiIpCisgICAgICBjb3VudD0wCisgICAgY291bnQ9Y291bnQrMQoraWYgY291bnQhPTE6CisgIGlmIGxpbmU6CisgICAgd3JmaWxlLndyaXRlKGxpbmUrIlxuIikgICMgd3JpdGUgdGhlIGxhc3QgY2FzZQord3JmaWxlLmNsb3NlKCkKK29wZW5maWxlLmNsb3NlKCkKZGlmZiAtLWdpdCBhL3VuaWNvZGUvYy9nZW51Y2EvZ2VudWNhLjguaW4gYi91bmljb2RlL2MvZ2VudWNhL2dlbnVjYS44LmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4YWIyN2QKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RlL2MvZ2VudWNhL2dlbnVjYS44LmluCkBAIC0wLDAgKzEsOTQgQEAKKy5cIiBIZXksIEVtYWNzISBUaGlzIGlzIC0qLW5yb2ZmLSotIHlvdSBrbm93Li4uCisuXCIKKy5cIiBnZW51Y2EuODogbWFudWFsIHBhZ2UgZm9yIHRoZSBnZW51Y2EgdXRpbGl0eQorLlwiCisuXCIgQ29weXJpZ2h0IChDKSAyMDAwLTIwMDEgSUJNLCBJbmMuIGFuZCBvdGhlcnMuCisuXCIKKy5USCBHRU5VQ0EgOCAiMjIgRmVicnVhcnkgMjAwMSIgIklDVSBNQU5QQUdFIiAiSUNVIEBWRVJTSU9OQCBNYW51YWwiCisuU0ggTkFNRQorLkIgZ2VudWNhCitcLSBjcmVhdGUgdGhlIFVDQSBkYXRhIHRhYmxlCisuU0ggU1lOT1BTSVMKKy5CIGdlbnVjYQorWworLkJSICJcLWhcZlAsIFxmQlwtP1xmUCwgXGZCXC1cLWhlbHAiCitdCitbCisuQlIgIlwtVlxmUCwgXGZCXC1cLXZlcnNpb24iCitdCitbCisuQlIgIlwtdlxmUCwgXGZCXC1cLXZlcmJvc2UiCitdCitbCisuQkkgIlwtY1xmUCwgXGZCXC1cLWNvcHlyaWdodCIKK10KK1sKKy5CSSAiXC1zXGZQLCBcZkJcLVwtc291cmNlZGlyIiAiIHNvdXJjZSIKK10KK1sKKy5CSSAiXC1kXGZQLCBcZkJcLVwtZGVzdGRpciIgIiBkZXN0aW5hdGlvbiIKK10KK1sKKy5JUiBmaWxlCitdCisuU0ggREVTQ1JJUFRJT04KKy5CIGdlbnVjYQorY29tcGlsZXMgdGhlIFVuaWNvZGUgQ29sbGF0aW9uIEFsZ29yaXRobSAoVUNBKSBkYXRhIGZyb20KKy5JIGZpbGUKKyhvciBmcm9tCisuQiBGcmFjdGlvbmFsVUNBLnR4dAoraWYKKy5JIGZpbGUKK2lzIG9taXR0ZWQpIGludG8gaXRzIGJpbmFyeSBmb3JtLCB0aGUgZmlsZXMKKy5CIHVjYWRhdGEuZGF0CithbmQKKy5CUiBpbnZ1Y2EuZGF0IC4KK1RoZXNlIGJpbmFyeSBmaWxlcyBjYW4gdGhlbiBiZSByZWFkIGRpcmVjdGx5IGJ5IElDVSwgb3IgdXNlZCBieQorLkJSIHBrZ2RhdGEgKDgpCitmb3IgaW5jb3Jwb3JhdGlvbiBpbnRvIGEgbGFyZ2VyIGFyY2hpdmUgb3IgbGlicmFyeS4KKy5TSCBPUFRJT05TCisuVFAKKy5CUiAiXC1oXGZQLCBcZkJcLT9cZlAsIFxmQlwtXC1oZWxwIgorUHJpbnQgaGVscCBhYm91dCB1c2FnZSBhbmQgZXhpdC4KKy5UUAorLkJSICJcLVZcZlAsIFxmQlwtXC12ZXJzaW9uIgorUHJpbnQgdGhlIHZlcnNpb24gb2YKKy5CIGdlbnVjYQorYW5kIGV4aXQuCisuVFAKKy5CUiAiXC12XGZQLCBcZkJcLVwtdmVyYm9zZSIKK0Rpc3BsYXkgZXh0cmEgaW5mb3JtYXRpdmUgbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4KKy5UUAorLkJJICJcLWNcZlAsIFxmQlwtXC1jb3B5cmlnaHQiCitJbmNsdWRlIGEgY29weXJpZ2h0IG5vdGljZSBpbnRvIHRoZSBiaW5hcnkgZGF0YS4KKy5UUAorLkJJICJcLXNcZlAsIFxmQlwtXC1zb3VyY2VkaXIiICIgc291cmNlIgorU2V0IHRoZSBzb3VyY2UgZGlyZWN0b3J5IHRvCisuSVIgc291cmNlIC4KK1RoZSBkZWZhdWx0IHNvdXJjZSBkaXJlY3RvcnkgaXMgc3BlY2lmaWVkIGJ5IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQorLkJSIElDVV9EQVRBIC4KKy5UUAorLkJJICJcLWRcZlAsIFxmQlwtXC1kZXN0ZGlyIiAiIGRlc3RpbmF0aW9uIgorU2V0IHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgdG8KKy5JUiBkZXN0aW5hdGlvbiAuCitUaGUgZGVmYXVsdCBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgaXMgc3BlY2lmaWVkIGJ5IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQorLkJSIElDVV9EQVRBIC4KKy5TSCBFTlZJUk9OTUVOVAorLlRQIDEwCisuQiBJQ1VfREFUQQorU3BlY2lmaWVzIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBJQ1UgZGF0YS4gRGVmYXVsdHMgdG8KKy5CUiBAdGhlcGtnaWN1ZGF0YWRpckAvQFBBQ0tBR0VAL0BWRVJTSU9OQC8gLgorU29tZSB0b29scyBpbiBJQ1UgZGVwZW5kIG9uIHRoZSBwcmVzZW5jZSBvZiB0aGUgdHJhaWxpbmcgc2xhc2guIEl0IGlzIHRodXMKK2ltcG9ydGFudCB0byBtYWtlIHN1cmUgdGhhdCBpdCBpcyBwcmVzZW50IGlmCisuQiBJQ1VfREFUQQoraXMgc2V0LgorLlNIIEZJTEVTCisuVFAgMTUKKy5CIEZyYWN0aW9uYWxVQ0EudHh0CitNYWNoaW5lLXJlYWRhYmxlIGZpbGUgY29udGFpbmluZyBkYXRhIGZvciB0aGUgVW5pY29kZSBjb2xsYXRpb24gYWxnb3JpdGhtLgorLlNIIFZFUlNJT04KK0BWRVJTSU9OQAorLlNIIENPUFlSSUdIVAorQ29weXJpZ2h0IChDKSAyMDAxIElCTSwgSW5jLiBhbmQgb3RoZXJzLgorLlNIIFNFRSBBTFNPCisuQlIgcGtnZGF0YSAoOCkKZGlmZiAtLWdpdCBhL3VuaWNvZGUvYy9nZW51Y2EvZ2VudWNhLmNwcCBiL3VuaWNvZGUvYy9nZW51Y2EvZ2VudWNhLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmVjOWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZS9jL2dlbnVjYS9nZW51Y2EuY3BwCkBAIC0wLDAgKzEsMTU5MCBAQAorLyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAxMCwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcworKiAgIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgIGZpbGUgbmFtZTogIGdlbnVjYS5jcHAKKyogICBlbmNvZGluZzogICBVUy1BU0NJSQorKiAgIHRhYiBzaXplOiAgIDggKG5vdCB1c2VkKQorKiAgIGluZGVudGF0aW9uOjQKKyoKKyogICBjcmVhdGVkIGF0IHRoZSBlbmQgb2YgWFggY2VudHVyeQorKiAgIGNyZWF0ZWQgYnk6IFZsYWRpbWlyIFdlaW5zdGVpbgorKgorKiAgIFRoaXMgcHJvZ3JhbSByZWFkcyB0aGUgRnJhbmN0aW9uYWwgVUNBIHRhYmxlIGFuZCBnZW5lcmF0ZXMKKyogICBpbnRlcm5hbCBmb3JtYXQgZm9yIFVDQSB0YWJsZSBhcyB3ZWxsIGFzIGludmVyc2UgVUNBIHRhYmxlLgorKiAgIEl0IHRoZW4gd3JpdGVzIGJpbmFyeSBmaWxlcyBjb250YWluaW5nIHRoZSBkYXRhOiB1Y2FkYXRhLmRhdCAKKyogICAmIGludnVjYS5kYXQKKyogICBDaGFuZ2UgaGlzdG9yeToKKyogICAwMi8yMy8yMDAxICBncmhvdGVuICAgICAgICAgICAgICAgICBNYWRlIGl0IGludG8gYSB0b29sCisqICAgMDIvMjMvMjAwMSAgd2VpdiAgICAgICAgICAgICAgICAgICAgTW92ZWQgZWxlbWVudCAmIHRhYmxlIGhhbmRsaW5nIGNvZGUgdG8gaTE4bgorKiAgIDA1LzA5LzIwMDEgIHdlaXYgICAgICAgICAgICAgICAgICAgIENhc2UgYml0cyBhcmUgbm93IGluIHRoZSBDRXMsIG5vdCBpbiBmcm9udAorKiAgIDEwLzI2LzIwMTAgIHNnaWxsICAgICAgICAgICAgICAgICAgIFN1cHBvcnQgZm9yIHJlb3JkZXJpbmcgY29kZXMKKyovCisKKyNpbmNsdWRlICJ1bmljb2RlL3V0eXBlcy5oIgorI2luY2x1ZGUgInVuaWNvZGUvcHV0aWwuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3VkYXRhLmgiCisjaW5jbHVkZSAidW5pY29kZS91Y2xlYW4uaCIKKyNpbmNsdWRlICJ1bmljb2RlL3VzY3JpcHQuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3VzdHJpbmcuaCIKKyNpbmNsdWRlICJ1Y29sX2JsZC5oIgorI2luY2x1ZGUgInVjb2xfaW1wLmgiCisjaW5jbHVkZSAiZ2VudWNhLmgiCisjaW5jbHVkZSAidW9wdGlvbnMuaCIKKyNpbmNsdWRlICJ1cGFyc2UuaCIKKyNpbmNsdWRlICJ0b29sdXRpbC5oIgorI2luY2x1ZGUgInVuZXdkYXRhLmgiCisjaW5jbHVkZSAiY3N0cmluZy5oIgorI2luY2x1ZGUgImNtZW1vcnkuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNkZWZpbmUgTEVOR1RIT0YoYXJyYXkpIChpbnQzMl90KShzaXplb2YoYXJyYXkpL3NpemVvZigoYXJyYXkpWzBdKSkKKworCisvLyBzY3JpcHQgcmVvcmRlcmluZyBzdHJ1Y3R1cmVzCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDE2X3QgcmVvcmRlckNvZGU7CisgICAgdWludDE2X3Qgb2Zmc2V0OworfSBSZW9yZGVySW5kZXg7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50MTZfdCBMRUFEX0JZVEVfVE9fU0NSSVBUU19JTkRFWF9MRU5HVEg7CisgICAgdWludDE2X3QqIExFQURfQllURV9UT19TQ1JJUFRTX0lOREVYOworICAgIHVpbnQxNl90IExFQURfQllURV9UT19TQ1JJUFRTX0RBVEFfTEVOR1RIOworICAgIHVpbnQxNl90KiBMRUFEX0JZVEVfVE9fU0NSSVBUU19EQVRBOworICAgIHVpbnQxNl90IExFQURfQllURV9UT19TQ1JJUFRTX0RBVEFfT0ZGU0VUOworICAgIAorICAgIHVpbnQxNl90IFNDUklQVF9UT19MRUFEX0JZVEVTX0lOREVYX0xFTkdUSDsKKyAgICBSZW9yZGVySW5kZXgqIFNDUklQVF9UT19MRUFEX0JZVEVTX0lOREVYOworICAgIHVpbnQxNl90IFNDUklQVF9UT19MRUFEX0JZVEVTX0lOREVYX0NPVU5UOworICAgIHVpbnQxNl90IFNDUklQVF9UT19MRUFEX0JZVEVTX0RBVEFfTEVOR1RIOworICAgIHVpbnQxNl90KiBTQ1JJUFRfVE9fTEVBRF9CWVRFU19EQVRBOworICAgIHVpbnQxNl90IFNDUklQVF9UT19MRUFEX0JZVEVTX0RBVEFfT0ZGU0VUOworfSBMZWFkQnl0ZUNvbnN0YW50czsKKworaW50IFJlb3JkZXJJbmRleENvbXBhcmVyKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBSZW9yZGVySW5kZXgqPihhKS0+cmVvcmRlckNvZGUgLSByZWludGVycHJldF9jYXN0PGNvbnN0IFJlb3JkZXJJbmRleCo+KGIpLT5yZW9yZGVyQ29kZTsgICAgCit9CisKKy8qCisgKiBHbG9iYWwgLSB2ZXJib3NpdHkKKyAqLworVUJvb2wgVkVSQk9TRSA9IEZBTFNFOworCitzdGF0aWMgVVZlcnNpb25JbmZvIFVDQVZlcnNpb247CisKKyNpZiBVQ09ORklHX05PX0NPTExBVElPTgorCisvKiBkdW1teSBVRGF0YUluZm8gY2YuIHVkYXRhLmggKi8KK3N0YXRpYyBVRGF0YUluZm8gZHVtbXlEYXRhSW5mbyA9IHsKKyAgICBzaXplb2YoVURhdGFJbmZvKSwKKyAgICAwLAorCisgICAgVV9JU19CSUdfRU5ESUFOLAorICAgIFVfQ0hBUlNFVF9GQU1JTFksCisgICAgVV9TSVpFT0ZfVUNIQVIsCisgICAgMCwKKworICAgIHsgMCwgMCwgMCwgMCB9LCAgICAgICAgICAgICAgICAgLyogZHVtbXkgZGF0YUZvcm1hdCAqLworICAgIHsgMCwgMCwgMCwgMCB9LCAgICAgICAgICAgICAgICAgLyogZHVtbXkgZm9ybWF0VmVyc2lvbiAqLworICAgIHsgMCwgMCwgMCwgMCB9ICAgICAgICAgICAgICAgICAgLyogZHVtbXkgZGF0YVZlcnNpb24gKi8KK307CisKKyNlbHNlCisKK3N0YXRpYyBjb25zdCBVRGF0YUluZm8gdWNhRGF0YUluZm89eworICAgIHNpemVvZihVRGF0YUluZm8pLAorICAgIDAsCisKKyAgICBVX0lTX0JJR19FTkRJQU4sCisgICAgVV9DSEFSU0VUX0ZBTUlMWSwKKyAgICBzaXplb2YoVUNoYXIpLAorICAgIDAsCisKKyAgICB7VUNBX0RBVEFfRk9STUFUXzAsIFVDQV9EQVRBX0ZPUk1BVF8xLCBVQ0FfREFUQV9GT1JNQVRfMiwgVUNBX0RBVEFfRk9STUFUXzN9LCAgICAgLyogZGF0YUZvcm1hdD0iVUNvbCIgICAgICAgICAgICAqLworICAgIC8qIDAzLzI2LzIwMDIgYnVtcGVkIHVwIHZlcnNpb24gc2luY2UgZm9ybWF0IGhhcyBjaGFuZ2VkICovCisgICAgLyogMDkvMTYvMjAwMiBidW1wZWQgdXAgdmVyc2lvbiBzaW5jZSB3ZSB3ZW50IGZyb20gVUNvbEF0dHJpYnV0ZVZhbHVlICovCisgICAgLyogICAgICAgICAgICB0byBpbnQzMl90IGluIFVDb2xPcHRpb25TZXQgKi8KKyAgICAvKiAwNS8xMy8yMDAzIFRoaXMgb25lIGFsc28gdXBkYXRlZCBzaW5jZSB3ZSBhZGRlZCBVQ0EgYW5kIFVDRCB2ZXJzaW9ucyAqLworICAgIC8qICAgICAgICAgICAgdG8gaGVhZGVyICovCisgICAgLyogMDkvMTEvMjAwMyBBZGRpbmcgaW5mb3JtYXRpb24gcmVxdWlyZWQgYnkgZGF0YSBzd2FwcGVyICovCisgICAge1VDQV9GT1JNQVRfVkVSU0lPTl8wLCBVQ0FfRk9STUFUX1ZFUlNJT05fMSwgVUNBX0ZPUk1BVF9WRVJTSU9OXzIsIFVDQV9GT1JNQVRfVkVSU0lPTl8zfSwgICAgICAgICAgICAgICAgIC8qIGZvcm1hdFZlcnNpb24gICAgICAgICAgICAgICAgKi8KKyAgICB7MCwgMCwgMCwgMH0gICAgICAgICAgICAgICAgICAvKiBkYXRhVmVyc2lvbiA9IFVuaWNvZGUgVmVyc2lvbiovCit9OworCitzdGF0aWMgY29uc3QgVURhdGFJbmZvIGludlVjYURhdGFJbmZvPXsKKyAgICBzaXplb2YoVURhdGFJbmZvKSwKKyAgICAwLAorCisgICAgVV9JU19CSUdfRU5ESUFOLAorICAgIFVfQ0hBUlNFVF9GQU1JTFksCisgICAgc2l6ZW9mKFVDaGFyKSwKKyAgICAwLAorCisgICAge0lOVlVDQV9EQVRBX0ZPUk1BVF8wLCBJTlZVQ0FfREFUQV9GT1JNQVRfMSwgSU5WVUNBX0RBVEFfRk9STUFUXzIsIElOVlVDQV9EQVRBX0ZPUk1BVF8zfSwgICAgIC8qIGRhdGFGb3JtYXQ9IkludkMiICAgICAgICAgICAgKi8KKyAgICAvKiAwMy8yNi8yMDAyIGJ1bXBlZCB1cCB2ZXJzaW9uIHNpbmNlIGZvcm1hdCBoYXMgY2hhbmdlZCAqLworICAgIC8qIDA0LzI5LzIwMDMgMi4xIGZvcm1hdCAtIHdlIGhhdmUgYWRkZWQgVUNBIHZlcnNpb24gdG8gaGVhZGVyICovCisgICAge0lOVlVDQV9GT1JNQVRfVkVSU0lPTl8wLCBJTlZVQ0FfRk9STUFUX1ZFUlNJT05fMSwgSU5WVUNBX0ZPUk1BVF9WRVJTSU9OXzIsIElOVlVDQV9GT1JNQVRfVkVSU0lPTl8zfSwgICAgICAgICAgICAgICAgIC8qIGZvcm1hdFZlcnNpb24gICAgICAgICAgICAgICAgKi8KKyAgICB7MCwgMCwgMCwgMH0gICAgICAgICAgICAgICAgICAvKiBkYXRhVmVyc2lvbiA9IFVuaWNvZGUgVmVyc2lvbiovCit9OworCitVQ0FFbGVtZW50cyBsZTsKKworLy8gcmV0dXJucyBudW1iZXIgb2YgY2hhcmFjdGVycyByZWFkCitpbnQzMl90IHJlYWRFbGVtZW50KGNoYXIgKipmcm9tLCBjaGFyICp0bywgY2hhciBzZXBhcmF0b3IsIFVFcnJvckNvZGUgKnN0YXR1cykgeworICAgIGlmKFVfRkFJTFVSRSgqc3RhdHVzKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgY2hhciBidWZmZXJbMTAyNF07CisgICAgaW50MzJfdCBpID0gMDsKKyAgICB3aGlsZSgqKmZyb20gIT0gc2VwYXJhdG9yKSB7CisgICAgICAgIGlmICgqKmZyb20gPT0gJ1wwJykgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaWYoKipmcm9tICE9ICcgJykgeworICAgICAgICAgICAgKihidWZmZXIraSsrKSA9ICoqZnJvbTsKKyAgICAgICAgfQorICAgICAgICAoKmZyb20pKys7CisgICAgfQorICAgICgqZnJvbSkrKzsKKyAgICAqKGJ1ZmZlciArIGkpID0gMDsKKyAgICAvLyp0byA9IChjaGFyICopbWFsbG9jKHN0cmxlbihidWZmZXIpKzEpOworICAgIHN0cmNweSh0bywgYnVmZmVyKTsKKyAgICByZXR1cm4gaTsKK30KKworaW50MzJfdCBza2lwVW50aWxXaGl0ZVNwYWNlKGNoYXIgKipmcm9tLCBVRXJyb3JDb2RlICpzdGF0dXMpIHsKKyAgICBpZiAoVV9GQUlMVVJFKCpzdGF0dXMpKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpbnQzMl90IGNvdW50ID0gMDsKKyAgICB3aGlsZSAoKipmcm9tICE9ICcgJyAmJiAqKmZyb20gIT0gJ1x0JyAmJiAqKmZyb20gIT0gJ1wwJykgeworICAgICAgICAoKmZyb20pKys7CisgICAgICAgIGNvdW50Kys7CisgICAgfQorICAgIHJldHVybiBjb3VudDsKK30KKworaW50MzJfdCBza2lwV2hpdGVTcGFjZShjaGFyICoqZnJvbSwgVUVycm9yQ29kZSAqc3RhdHVzKSB7CisgICAgaWYgKFVfRkFJTFVSRSgqc3RhdHVzKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaW50MzJfdCBjb3VudCA9IDA7CisgICAgd2hpbGUgKCoqZnJvbSA9PSAnICcgfHwgKipmcm9tID09ICdcdCcpIHsKKyAgICAgICAgKCpmcm9tKSsrOworICAgICAgICBjb3VudCsrOworICAgIH0KKyAgICByZXR1cm4gY291bnQ7Cit9CisKK3VpbnQzMl90IGdldFNpbmdsZUNFVmFsdWUoY2hhciAqcHJpbWFyeSwgY2hhciAqc2Vjb25kYXJ5LCBjaGFyICp0ZXJ0aWFyeSwgVUVycm9yQ29kZSAqc3RhdHVzKSB7CisgICAgaWYoVV9GQUlMVVJFKCpzdGF0dXMpKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICB1aW50MzJfdCB2YWx1ZSA9IDA7CisgICAgY2hhciBwcmltc2F2ZSA9ICdcMCc7CisgICAgY2hhciBzZWNzYXZlID0gJ1wwJzsKKyAgICBjaGFyIHRlcnNhdmUgPSAnXDAnOworICAgIGNoYXIgKnByaW1lbmQgPSBwcmltYXJ5KzQ7CisgICAgaWYoc3RybGVuKHByaW1hcnkpID4gNCkgeworICAgICAgICBwcmltc2F2ZSA9ICpwcmltZW5kOworICAgICAgICAqcHJpbWVuZCA9ICdcMCc7CisgICAgfQorICAgIGNoYXIgKnNlY2VuZCA9IHNlY29uZGFyeSsyOworICAgIGlmKHN0cmxlbihzZWNvbmRhcnkpID4gMikgeworICAgICAgICBzZWNzYXZlID0gKnNlY2VuZDsKKyAgICAgICAgKnNlY2VuZCA9ICdcMCc7CisgICAgfQorICAgIGNoYXIgKnRlcmVuZCA9IHRlcnRpYXJ5KzI7CisgICAgaWYoc3RybGVuKHRlcnRpYXJ5KSA+IDIpIHsKKyAgICAgICAgdGVyc2F2ZSA9ICp0ZXJlbmQ7CisgICAgICAgICp0ZXJlbmQgPSAnXDAnOworICAgIH0KKyAgICB1aW50MzJfdCBwcmltdmFsdWUgPSAodWludDMyX3QpKCgqcHJpbWFyeSE9J1wwJyk/c3RydG91bChwcmltYXJ5LCAmcHJpbWVuZCwgMTYpOjApOworICAgIHVpbnQzMl90IHNlY3ZhbHVlID0gKHVpbnQzMl90KSgoKnNlY29uZGFyeSE9J1wwJyk/c3RydG91bChzZWNvbmRhcnksICZzZWNlbmQsIDE2KTowKTsKKyAgICB1aW50MzJfdCB0ZXJ2YWx1ZSA9ICh1aW50MzJfdCkoKCp0ZXJ0aWFyeSE9J1wwJyk/c3RydG91bCh0ZXJ0aWFyeSwgJnRlcmVuZCwgMTYpOjApOworICAgIGlmKHByaW12YWx1ZSA8PSAweEZGKSB7CisgICAgICBwcmltdmFsdWUgPDw9IDg7CisgICAgfQorCisgICAgdmFsdWUgPSAoKHByaW12YWx1ZTw8VUNPTF9QUklNQVJZT1JERVJTSElGVCkmVUNPTF9QUklNQVJZT1JERVJNQVNLKXwKKyAgICAgICAgKChzZWN2YWx1ZTw8VUNPTF9TRUNPTkRBUllPUkRFUlNISUZUKSZVQ09MX1NFQ09OREFSWU9SREVSTUFTSyl8CisgICAgICAgICh0ZXJ2YWx1ZSZVQ09MX1RFUlRJQVJZT1JERVJNQVNLKTsKKworICAgIGlmKHByaW1zYXZlIT0nXDAnKSB7CisgICAgICAgICpwcmltZW5kID0gcHJpbXNhdmU7CisgICAgfQorICAgIGlmKHNlY3NhdmUhPSdcMCcpIHsKKyAgICAgICAgKnNlY2VuZCA9IHNlY3NhdmU7CisgICAgfQorICAgIGlmKHRlcnNhdmUhPSdcMCcpIHsKKyAgICAgICAgKnRlcmVuZCA9IHRlcnNhdmU7CisgICAgfQorICAgIHJldHVybiB2YWx1ZTsKK30KKworc3RhdGljIHVpbnQzMl90IGludmVyc2VUYWJsZVsweEZGRkZdWzNdOworc3RhdGljIHVpbnQzMl90IGludmVyc2VQb3MgPSAwOworc3RhdGljIFVDaGFyIHN0cmluZ0NvbnRpbnVlWzB4RkZGRl07CitzdGF0aWMgdWludDMyX3Qgc0NvbnRQb3MgPSAwOworCitzdGF0aWMgdm9pZCBhZGROZXdJbnZlcnNlKFVDQUVsZW1lbnRzICplbGVtZW50LCBVRXJyb3JDb2RlICpzdGF0dXMpIHsKKyAgaWYoVV9GQUlMVVJFKCpzdGF0dXMpKSB7CisgICAgcmV0dXJuOworICB9CisgIGlmKFZFUkJPU0UgJiYgaXNDb250aW51YXRpb24oZWxlbWVudC0+Q0VzWzFdKSkgeworICAgIC8vZnByaW50ZihzdGRvdXQsICIrIik7CisgIH0KKyAgaW52ZXJzZVBvcysrOworICBpbnZlcnNlVGFibGVbaW52ZXJzZVBvc11bMF0gPSBlbGVtZW50LT5DRXNbMF07CisgIGlmKGVsZW1lbnQtPm5vT2ZDRXMgPiAxICYmIGlzQ29udGludWF0aW9uKGVsZW1lbnQtPkNFc1sxXSkpIHsKKyAgICBpbnZlcnNlVGFibGVbaW52ZXJzZVBvc11bMV0gPSBlbGVtZW50LT5DRXNbMV07CisgIH0gZWxzZSB7CisgICAgaW52ZXJzZVRhYmxlW2ludmVyc2VQb3NdWzFdID0gMDsKKyAgfQorICBpZihlbGVtZW50LT5jU2l6ZSA8IDIpIHsKKyAgICBpbnZlcnNlVGFibGVbaW52ZXJzZVBvc11bMl0gPSBlbGVtZW50LT5jUG9pbnRzWzBdOworICB9IGVsc2UgeyAvKiBhZGQgYSBuZXcgc3RvcmUgb2YgY3J1ZnQgKi8KKyAgICBpbnZlcnNlVGFibGVbaW52ZXJzZVBvc11bMl0gPSAoKGVsZW1lbnQtPmNTaXplKzEpIDw8IFVDT0xfSU5WX1NISUZUVkFMVUUpIHwgc0NvbnRQb3M7CisgICAgbWVtY3B5KHN0cmluZ0NvbnRpbnVlK3NDb250UG9zLCBlbGVtZW50LT5jUG9pbnRzLCBlbGVtZW50LT5jU2l6ZSpzaXplb2YoVUNoYXIpKTsKKyAgICBzQ29udFBvcyArPSBlbGVtZW50LT5jU2l6ZSsxOworICB9Cit9CisKK3N0YXRpYyB2b2lkIGluc2VydEludmVyc2UoVUNBRWxlbWVudHMgKmVsZW1lbnQsIHVpbnQzMl90IHBvc2l0aW9uLCBVRXJyb3JDb2RlICpzdGF0dXMpIHsKKyAgaWYoVV9GQUlMVVJFKCpzdGF0dXMpKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYoVkVSQk9TRSAmJiBpc0NvbnRpbnVhdGlvbihlbGVtZW50LT5DRXNbMV0pKSB7CisgICAgLy9mcHJpbnRmKHN0ZG91dCwgIisiKTsKKyAgfQorICBpZihwb3NpdGlvbiA8PSBpbnZlcnNlUG9zKSB7CisgICAgLyptb3ZlIHN0dWZmIGFyb3VuZCAqLworICAgIHVpbnQzMl90IGFtb3VudFRvTW92ZSA9IChpbnZlcnNlUG9zIC0gcG9zaXRpb24rMSkqc2l6ZW9mKGludmVyc2VUYWJsZVswXSk7CisgICAgdXBydl9tZW1tb3ZlKGludmVyc2VUYWJsZVtwb3NpdGlvbisxXSwgaW52ZXJzZVRhYmxlW3Bvc2l0aW9uXSwgYW1vdW50VG9Nb3ZlKTsKKyAgfQorICBpbnZlcnNlVGFibGVbcG9zaXRpb25dWzBdID0gZWxlbWVudC0+Q0VzWzBdOworICBpZihlbGVtZW50LT5ub09mQ0VzID4gMSAmJiBpc0NvbnRpbnVhdGlvbihlbGVtZW50LT5DRXNbMV0pKSB7CisgICAgaW52ZXJzZVRhYmxlW3Bvc2l0aW9uXVsxXSA9IGVsZW1lbnQtPkNFc1sxXTsKKyAgfSBlbHNlIHsKKyAgICBpbnZlcnNlVGFibGVbcG9zaXRpb25dWzFdID0gMDsKKyAgfQorICBpZihlbGVtZW50LT5jU2l6ZSA8IDIpIHsKKyAgICBpbnZlcnNlVGFibGVbcG9zaXRpb25dWzJdID0gZWxlbWVudC0+Y1BvaW50c1swXTsKKyAgfSBlbHNlIHsgLyogYWRkIGEgbmV3IHN0b3JlIG9mIGNydWZ0ICovCisgICAgaW52ZXJzZVRhYmxlW3Bvc2l0aW9uXVsyXSA9ICgoZWxlbWVudC0+Y1NpemUrMSkgPDwgVUNPTF9JTlZfU0hJRlRWQUxVRSkgfCBzQ29udFBvczsKKyAgICBtZW1jcHkoc3RyaW5nQ29udGludWUrc0NvbnRQb3MsIGVsZW1lbnQtPmNQb2ludHMsIGVsZW1lbnQtPmNTaXplKnNpemVvZihVQ2hhcikpOworICAgIHNDb250UG9zICs9IGVsZW1lbnQtPmNTaXplKzE7CisgIH0KKyAgaW52ZXJzZVBvcysrOworfQorCitzdGF0aWMgdm9pZCBhZGRUb0V4aXN0aW5nSW52ZXJzZShVQ0FFbGVtZW50cyAqZWxlbWVudCwgdWludDMyX3QgcG9zaXRpb24sIFVFcnJvckNvZGUgKnN0YXR1cykgeworCisgIGlmKFVfRkFJTFVSRSgqc3RhdHVzKSkgeworICAgIHJldHVybjsKKyAgfQorCisgICAgICBpZigoaW52ZXJzZVRhYmxlW3Bvc2l0aW9uXVsyXSAmIFVDT0xfSU5WX1NJWkVNQVNLKSA9PSAwKSB7IC8qIHNpbmdsZSBlbGVtZW50LCBoYXZlIHRvIG1ha2UgbmV3IGV4dGVuc2lvbiBwbGFjZSBhbmQgcHV0IGJvdGggZ3V5cyB0aGVyZSAqLworICAgICAgICBzdHJpbmdDb250aW51ZVtzQ29udFBvc10gPSAoVUNoYXIpaW52ZXJzZVRhYmxlW3Bvc2l0aW9uXVsyXTsKKyAgICAgICAgaW52ZXJzZVRhYmxlW3Bvc2l0aW9uXVsyXSA9ICgoZWxlbWVudC0+Y1NpemUrMykgPDwgVUNPTF9JTlZfU0hJRlRWQUxVRSkgfCBzQ29udFBvczsKKyAgICAgICAgc0NvbnRQb3MrKzsKKyAgICAgICAgc3RyaW5nQ29udGludWVbc0NvbnRQb3MrK10gPSAweEZGRkY7CisgICAgICAgIG1lbWNweShzdHJpbmdDb250aW51ZStzQ29udFBvcywgZWxlbWVudC0+Y1BvaW50cywgZWxlbWVudC0+Y1NpemUqc2l6ZW9mKFVDaGFyKSk7CisgICAgICAgIHNDb250UG9zICs9IGVsZW1lbnQtPmNTaXplOworICAgICAgICBzdHJpbmdDb250aW51ZVtzQ29udFBvcysrXSA9IDB4RkZGRTsKKyAgICAgIH0gZWxzZSB7IC8qIGFkZGluZyB0byB0aGUgYWxyZWFkeSBleGlzdGluZyBjb250aW51aW5nIHRhYmxlICovCisgICAgICAgIHVpbnQzMl90IGNvbnRJbmRleCA9IGludmVyc2VUYWJsZVtwb3NpdGlvbl1bMl0gJiBVQ09MX0lOVl9PRkZTRVRNQVNLOworICAgICAgICB1aW50MzJfdCBjb250U2l6ZSA9IChpbnZlcnNlVGFibGVbcG9zaXRpb25dWzJdICYgVUNPTF9JTlZfU0laRU1BU0spID4+IFVDT0xfSU5WX1NISUZUVkFMVUU7CisKKyAgICAgICAgaWYoY29udEluZGV4K2NvbnRTaXplIDwgc0NvbnRQb3MpIHsKKyAgICAgICAgICAvKmZwcmludGYoc3RkZXJyLCAiLiIsIHNDb250UG9zLCBjb250SW5kZXgrY29udFNpemUpOyovCisgICAgICAgICAgbWVtY3B5KHN0cmluZ0NvbnRpbnVlK2NvbnRJbmRleCtjb250U2l6ZStlbGVtZW50LT5jU2l6ZSsxLCBzdHJpbmdDb250aW51ZStjb250SW5kZXgrY29udFNpemUsIChlbGVtZW50LT5jU2l6ZSsxKSpzaXplb2YoVUNoYXIpKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0cmluZ0NvbnRpbnVlW2NvbnRJbmRleCtjb250U2l6ZS0xXSA9IDB4RkZGRjsKKyAgICAgICAgbWVtY3B5KHN0cmluZ0NvbnRpbnVlK2NvbnRJbmRleCtjb250U2l6ZSwgZWxlbWVudC0+Y1BvaW50cywgZWxlbWVudC0+Y1NpemUqc2l6ZW9mKFVDaGFyKSk7CisgICAgICAgIHNDb250UG9zICs9IGVsZW1lbnQtPmNTaXplKzE7CisgICAgICAgIHN0cmluZ0NvbnRpbnVlW2NvbnRJbmRleCtjb250U2l6ZStlbGVtZW50LT5jU2l6ZV0gPSAweEZGRkU7CisKKyAgICAgICAgaW52ZXJzZVRhYmxlW3Bvc2l0aW9uXVsyXSA9ICgoY29udFNpemUrZWxlbWVudC0+Y1NpemUrMSkgPDwgVUNPTF9JTlZfU0hJRlRWQUxVRSkgfCBjb250SW5kZXg7CisgICAgICB9Cit9CisKKy8qIAorICogVGFrZXMgdHdvIENFcyAobGVhZCBhbmQgY29udGludWF0aW9uKSBhbmQgCisgKiBjb21wYXJlcyB0aGVtIGFzIENFcyBzaG91bGQgYmUgY29tcGFyZWQ6CisgKiBwcmltYXJ5IHZzLiBwcmltYXJ5LCBzZWNvbmRhcnkgdnMuIHNlY29uZGFyeQorICogdGVydGlhcnkgdnMuIHRlcnRpYXJ5CisgKi8KK3N0YXRpYyBpbnQzMl90IGNvbXBhcmVDRXModWludDMyX3QgKnNvdXJjZSwgdWludDMyX3QgKnRhcmdldCkgeworICB1aW50MzJfdCBzMSA9IHNvdXJjZVswXSwgczIsIHQxID0gdGFyZ2V0WzBdLCB0MjsKKyAgaWYoaXNDb250aW51YXRpb24oc291cmNlWzFdKSkgeworICAgIHMyID0gc291cmNlWzFdOworICB9IGVsc2UgeworICAgIHMyID0gMDsKKyAgfQorICBpZihpc0NvbnRpbnVhdGlvbih0YXJnZXRbMV0pKSB7CisgICAgdDIgPSB0YXJnZXRbMV07CisgIH0gZWxzZSB7CisgICAgdDIgPSAwOworICB9CisgIAorICB1aW50MzJfdCBzID0gMCwgdCA9IDA7CisgIGlmKHMxID09IHQxICYmIHMyID09IHQyKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcyA9IChzMSAmIDB4RkZGRjAwMDApfCgoczIgJiAweEZGRkYwMDAwKT4+MTYpOyAKKyAgdCA9ICh0MSAmIDB4RkZGRjAwMDApfCgodDIgJiAweEZGRkYwMDAwKT4+MTYpOyAKKyAgaWYocyA8IHQpIHsKKyAgICByZXR1cm4gLTE7CisgIH0gZWxzZSBpZihzID4gdCkgeworICAgIHJldHVybiAxOworICB9IGVsc2UgeworICAgIHMgPSAoczEgJiAweDAwMDBGRjAwKSB8IChzMiAmIDB4MDAwMEZGMDApPj44OworICAgIHQgPSAodDEgJiAweDAwMDBGRjAwKSB8ICh0MiAmIDB4MDAwMEZGMDApPj44OworICAgIGlmKHMgPCB0KSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfSBlbHNlIGlmKHMgPiB0KSB7CisgICAgICByZXR1cm4gMTsKKyAgICB9IGVsc2UgeworICAgICAgcyA9IChzMSAmIDB4MDAwMDAwRkYpPDw4IHwgKHMyICYgMHgwMDAwMDBGRik7CisgICAgICB0ID0gKHQxICYgMHgwMDAwMDBGRik8PDggfCAodDIgJiAweDAwMDAwMEZGKTsKKyAgICAgIGlmKHMgPCB0KSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgIH0KKyAgfQorfQorCitzdGF0aWMgdWludDMyX3QgYWRkVG9JbnZlcnNlKFVDQUVsZW1lbnRzICplbGVtZW50LCBVRXJyb3JDb2RlICpzdGF0dXMpIHsKKyAgdWludDMyX3QgcG9zaXRpb24gPSBpbnZlcnNlUG9zOworICB1aW50MzJfdCBzYXZlRWxlbWVudCA9IGVsZW1lbnQtPkNFc1swXTsKKyAgaW50MzJfdCBjb21wUmVzdWx0ID0gMDsKKyAgZWxlbWVudC0+Q0VzWzBdICY9IDB4RkZGRkZGM0Y7CisgIGlmKGVsZW1lbnQtPm5vT2ZDRXMgPT0gMSkgeworICAgIGVsZW1lbnQtPkNFc1sxXSA9IDA7CisgIH0KKyAgaWYoaW52ZXJzZVBvcyA9PSAwKSB7CisgICAgaW52ZXJzZVRhYmxlWzBdWzBdID0gaW52ZXJzZVRhYmxlWzBdWzFdID0gaW52ZXJzZVRhYmxlWzBdWzJdID0gMDsKKyAgICBhZGROZXdJbnZlcnNlKGVsZW1lbnQsIHN0YXR1cyk7CisgIH0gZWxzZSBpZihjb21wYXJlQ0VzKGludmVyc2VUYWJsZVtpbnZlcnNlUG9zXSwgZWxlbWVudC0+Q0VzKSA+IDApIHsKKyAgICB3aGlsZSgoY29tcFJlc3VsdCA9IGNvbXBhcmVDRXMoaW52ZXJzZVRhYmxlWy0tcG9zaXRpb25dLCBlbGVtZW50LT5DRXMpKSA+IDApOworICAgIGlmKFZFUkJPU0UpIHsgZnByaW50ZihzdGRvdXQsICJwOiV1ICIsIChpbnQpcG9zaXRpb24pOyB9CisgICAgaWYoY29tcFJlc3VsdCA9PSAwKSB7CisgICAgICBhZGRUb0V4aXN0aW5nSW52ZXJzZShlbGVtZW50LCBwb3NpdGlvbiwgc3RhdHVzKTsKKyAgICB9IGVsc2UgeworICAgICAgaW5zZXJ0SW52ZXJzZShlbGVtZW50LCBwb3NpdGlvbisxLCBzdGF0dXMpOworICAgIH0KKyAgfSBlbHNlIGlmKGNvbXBhcmVDRXMoaW52ZXJzZVRhYmxlW2ludmVyc2VQb3NdLCBlbGVtZW50LT5DRXMpID09IDApIHsKKyAgICBhZGRUb0V4aXN0aW5nSW52ZXJzZShlbGVtZW50LCBpbnZlcnNlUG9zLCBzdGF0dXMpOworICB9IGVsc2UgeworICAgIGFkZE5ld0ludmVyc2UoZWxlbWVudCwgc3RhdHVzKTsKKyAgfQorICBlbGVtZW50LT5DRXNbMF0gPSBzYXZlRWxlbWVudDsKKyAgaWYoVkVSQk9TRSkgeyBmcHJpbnRmKHN0ZG91dCwgIisiKTsgfQorICByZXR1cm4gaW52ZXJzZVBvczsKK30KKworc3RhdGljIEludmVyc2VVQ0FUYWJsZUhlYWRlciAqYXNzZW1ibGVJbnZlcnNlVGFibGUoVUVycm9yQ29kZSAqc3RhdHVzKQoreworICBJbnZlcnNlVUNBVGFibGVIZWFkZXIgKnJlc3VsdCA9IE5VTEw7CisgIHVpbnQzMl90IGhlYWRlckJ5dGVTaXplID0gcGFkZGVkc2l6ZShzaXplb2YoSW52ZXJzZVVDQVRhYmxlSGVhZGVyKSk7CisgIHVpbnQzMl90IGludmVyc2VUYWJsZUJ5dGVTaXplID0gKGludmVyc2VQb3MrMikqc2l6ZW9mKHVpbnQzMl90KSozOworICB1aW50MzJfdCBjb250c0J5dGVTaXplID0gc0NvbnRQb3MgKiBzaXplb2YoVUNoYXIpOworICB1aW50MzJfdCBpID0gMDsKKworICByZXN1bHQgPSAoSW52ZXJzZVVDQVRhYmxlSGVhZGVyICopdXBydl9tYWxsb2MoaGVhZGVyQnl0ZVNpemUgKyBpbnZlcnNlVGFibGVCeXRlU2l6ZSArIGNvbnRzQnl0ZVNpemUpOworICB1cHJ2X21lbXNldChyZXN1bHQsIDAsIGhlYWRlckJ5dGVTaXplICsgaW52ZXJzZVRhYmxlQnl0ZVNpemUgKyBjb250c0J5dGVTaXplKTsKKyAgaWYocmVzdWx0ICE9IE5VTEwpIHsKKyAgICByZXN1bHQtPmJ5dGVTaXplID0gaGVhZGVyQnl0ZVNpemUgKyBpbnZlcnNlVGFibGVCeXRlU2l6ZSArIGNvbnRzQnl0ZVNpemU7CisKKyAgICBpbnZlcnNlUG9zKys7CisgICAgaW52ZXJzZVRhYmxlW2ludmVyc2VQb3NdWzBdID0gMHhGRkZGRkZGRjsKKyAgICBpbnZlcnNlVGFibGVbaW52ZXJzZVBvc11bMV0gPSAweEZGRkZGRkZGOworICAgIGludmVyc2VUYWJsZVtpbnZlcnNlUG9zXVsyXSA9IDB4MDAwMEZGRkY7CisgICAgaW52ZXJzZVBvcysrOworCisgICAgZm9yKGkgPSAyOyBpPGludmVyc2VQb3M7IGkrKykgeworICAgICAgaWYoY29tcGFyZUNFcyhpbnZlcnNlVGFibGVbaS0xXSwgaW52ZXJzZVRhYmxlW2ldKSA+IDApIHsgCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgYXQgJWk6ICUwOFggJiAlMDhYXG4iLCAoaW50KWksIChpbnQpaW52ZXJzZVRhYmxlW2ktMV1bMF0sIChpbnQpaW52ZXJzZVRhYmxlW2ldWzBdKTsKKyAgICAgIH0gZWxzZSBpZihpbnZlcnNlVGFibGVbaS0xXVswXSA9PSBpbnZlcnNlVGFibGVbaV1bMF0gJiYgIShpbnZlcnNlVGFibGVbaS0xXVsxXSA8IGludmVyc2VUYWJsZVtpXVsxXSkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb250aW51YXRpb24gZXJyb3IgYXQgJWk6ICUwOFggJTA4WCAmICUwOFggJTA4WFxuIiwgKGludClpLCAoaW50KWludmVyc2VUYWJsZVtpLTFdWzBdLCAoaW50KWludmVyc2VUYWJsZVtpLTFdWzFdLCAoaW50KWludmVyc2VUYWJsZVtpXVswXSwgKGludClpbnZlcnNlVGFibGVbaV1bMV0pOworICAgICAgfQorICAgIH0KKworICAgIHJlc3VsdC0+dGFibGVTaXplID0gaW52ZXJzZVBvczsKKyAgICByZXN1bHQtPmNvbnRzU2l6ZSA9IHNDb250UG9zOworCisgICAgcmVzdWx0LT50YWJsZSA9IGhlYWRlckJ5dGVTaXplOworICAgIHJlc3VsdC0+Y29udHMgPSBoZWFkZXJCeXRlU2l6ZSArIGludmVyc2VUYWJsZUJ5dGVTaXplOworCisgICAgbWVtY3B5KCh1aW50OF90ICopcmVzdWx0ICsgcmVzdWx0LT50YWJsZSwgaW52ZXJzZVRhYmxlLCBpbnZlcnNlVGFibGVCeXRlU2l6ZSk7CisgICAgbWVtY3B5KCh1aW50OF90ICopcmVzdWx0ICsgcmVzdWx0LT5jb250cywgc3RyaW5nQ29udGludWUsIGNvbnRzQnl0ZVNpemUpOworCisgIH0gZWxzZSB7CisgICAgKnN0YXR1cyA9IFVfTUVNT1JZX0FMTE9DQVRJT05fRVJST1I7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICByZXR1cm4gcmVzdWx0OyAKK30KKworCitzdGF0aWMgdm9pZCB3cml0ZU91dEludmVyc2VEYXRhKEludmVyc2VVQ0FUYWJsZUhlYWRlciAqZGF0YSwgCisgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpvdXRwdXREaXIsIAorICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqY29weXJpZ2h0LAorICAgICAgICAgICAgICAgICAgVUVycm9yQ29kZSAqc3RhdHVzKQoreworICAgIFVOZXdEYXRhTWVtb3J5ICpwRGF0YTsKKyAgICAKKyAgICBsb25nIGRhdGFMZW5ndGg7CisKKyAgICBVRGF0YUluZm8gaW52VWNhSW5mbzsKKyAgICB1cHJ2X21lbWNweSgmaW52VWNhSW5mbywgJmludlVjYURhdGFJbmZvLCBzaXplb2YoVURhdGFJbmZvKSk7CisgICAgdV9nZXRVbmljb2RlVmVyc2lvbihpbnZVY2FJbmZvLmRhdGFWZXJzaW9uKTsKKworICAgIHBEYXRhPXVkYXRhX2NyZWF0ZShvdXRwdXREaXIsIElOVkNfREFUQV9UWVBFLCBJTlZDX0RBVEFfTkFNRSwgJmludlVjYUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgIGNvcHlyaWdodCwgc3RhdHVzKTsKKworICAgIGlmKFVfRkFJTFVSRSgqc3RhdHVzKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiB1bmFibGUgdG8gY3JlYXRlICVzIklOVkNfREFUQV9OQU1FIiwgZXJyb3IgJXNcbiIsIG91dHB1dERpciwgdV9lcnJvck5hbWUoKnN0YXR1cykpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogd3JpdGUgdGhlIGRhdGEgdG8gdGhlIGZpbGUgKi8KKyAgICBpZiAoVkVSQk9TRSkgeworICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIldyaXRpbmcgb3V0IGludmVyc2UgVUNBIHRhYmxlOiAlcyVjJXMuJXNcbiIsIG91dHB1dERpciwgVV9GSUxFX1NFUF9DSEFSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVkNfREFUQV9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVkNfREFUQV9UWVBFKTsKKyAgICB9CisgICAgdWRhdGFfd3JpdGVCbG9jayhwRGF0YSwgZGF0YSwgZGF0YS0+Ynl0ZVNpemUpOworCisgICAgLyogZmluaXNoIHVwICovCisgICAgZGF0YUxlbmd0aD11ZGF0YV9maW5pc2gocERhdGEsIHN0YXR1cyk7CisgICAgaWYoVV9GQUlMVVJFKCpzdGF0dXMpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3I6IGVycm9yICVkIHdyaXRpbmcgdGhlIG91dHB1dCBmaWxlXG4iLCAqc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KK30KKworc3RhdGljIGludDMyX3QgaGV4Mm51bShjaGFyIGhleCkgeworICAgIGlmKGhleD49JzAnICYmIGhleCA8PSc5JykgeworICAgICAgICByZXR1cm4gaGV4LScwJzsKKyAgICB9IGVsc2UgaWYoaGV4Pj0nYScgJiYgaGV4PD0nZicpIHsKKyAgICAgICAgcmV0dXJuIGhleC0nYScrMTA7CisgICAgfSBlbHNlIGlmKGhleD49J0EnICYmIGhleDw9J0YnKSB7CisgICAgICAgIHJldHVybiBoZXgtJ0EnKzEwOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworLy8gc3RhdGljIGNoYXIqIENIQVJBQ1RFUl9DQVRFR09SWV9SRU9SREVSX0NPREVTW10gPSB7CisvLyAgICAgIlpzIiwgIk5kIiwgIlNjIgorLy8gfTsKKy8vIHN0YXRpYyBjb25zdCB1aW50MTZfdCBDSEFSQUNURVJfQ0FURUdPUllfUkVPUkRFUl9DT0RFX09GRlNFVCA9IDB4MTAwMDsKKy8vIHN0YXRpYyB1aW50MTZfdCBDSEFSQUNURVJfQ0FURUdPUllfUkVPUkRFUl9DT0RFU19WQUxVRVtdID0geworLy8gICAgIFVfU1BBQ0VfU0VQQVJBVE9SICsgQ0hBUkFDVEVSX0NBVEVHT1JZX1JFT1JERVJfQ09ERV9PRkZTRVQsCisvLyAgICAgVV9ERUNJTUFMX0RJR0lUX05VTUJFUiArIENIQVJBQ1RFUl9DQVRFR09SWV9SRU9SREVSX0NPREVfT0ZGU0VULCAKKy8vICAgICBVX0NVUlJFTkNZX1NZTUJPTCArIENIQVJBQ1RFUl9DQVRFR09SWV9SRU9SREVSX0NPREVfT0ZGU0VUCisvLyB9OworCitpbnQzMl90IGdldFJlb3JkZXJDb2RlKGNvbnN0IGNoYXIqIG5hbWUsIGludDMyX3QqIGZpbGxJbiwgaW50MzJfdCBjYXBhY2l0eSwgVUVycm9yQ29kZSAqZXJyKSB7CisgICAgaWYoVV9GQUlMVVJFKCplcnIpKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoY2FwYWNpdHkgPCAxKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpbnQzMl90IGNvZGUgPSB1Y29sX2ZpbmRSZW9yZGVyaW5nRW50cnkobmFtZSk7CisgICAgaWYgKGNvZGUgIT0gVVNDUklQVF9JTlZBTElEX0NPREUpIHsKKyAgICAgICAgKmZpbGxJbiA9IGNvZGU7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGludDMyX3QgbGVuZ3RoID0gdXNjcmlwdF9nZXRDb2RlKG5hbWUsIHJlaW50ZXJwcmV0X2Nhc3Q8VVNjcmlwdENvZGUqPihmaWxsSW4pLCBjYXBhY2l0eSwgZXJyKTsKKyAgICByZXR1cm4gbGVuZ3RoOworfQorCitVQ0FFbGVtZW50cyAqcmVhZEFuRWxlbWVudChGSUxFICpkYXRhLCB0ZW1wVUNBVGFibGUgKnQsIFVDQUNvbnN0YW50cyAqY29uc3RzLCBMZWFkQnl0ZUNvbnN0YW50cyAqbGVhZEJ5dGVDb25zdGFudHMsIFVFcnJvckNvZGUgKnN0YXR1cykgeworICAgIHN0YXRpYyBpbnQgaXRlbXNUb0RhdGFCbG9jayA9IDA7CisgICAgc3RhdGljIGludCBzY3JpcHREYXRhV3JpdHRlbiA9IDA7CisgICAgY2hhciBidWZmZXJbMjA0OF0sIHByaW1hcnlbMTAwXSwgc2Vjb25kYXJ5WzEwMF0sIHRlcnRpYXJ5WzEwMF07CisgICAgVUNoYXIgdUJ1ZmZlclsyMDQ4XTsKKyAgICBVQ2hhciB1QnVmZmVyMlsyMDQ4XTsKKyAgICBVQ2hhciBsZWFkQnl0ZVsxMDBdLCBzY3JpcHRDb2RlWzEwMF07CisgICAgaW50MzJfdCBpID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgdGhlVmFsdWU7CisgICAgY2hhciAqcG9pbnRlciA9IE5VTEw7CisgICAgY2hhciAqY29tbWVudFN0YXJ0ID0gTlVMTDsKKyAgICBjaGFyICpzdGFydENvZGVQb2ludCA9IE5VTEw7CisgICAgY2hhciAqZW5kQ29kZVBvaW50ID0gTlVMTDsKKyAgICBjaGFyICpyZXN1bHQgPSBmZ2V0cyhidWZmZXIsIDIwNDgsIGRhdGEpOworICAgIGludDMyX3QgYnVmbGVuID0gKGludDMyX3QpdXBydl9zdHJsZW4oYnVmZmVyKTsKKyAgICBpZihVX0ZBSUxVUkUoKnN0YXR1cykpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpwcmltYXJ5ID0gKnNlY29uZGFyeSA9ICp0ZXJ0aWFyeSA9ICdcMCc7CisgICAgKmxlYWRCeXRlID0gKnNjcmlwdENvZGUgPSAnXDAnOworICAgIGlmKHJlc3VsdCA9PSBOVUxMKSB7CisgICAgICAgIGlmKGZlb2YoZGF0YSkpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJlbXB0eSBsaW5lIGJ1dCBubyBFT0YhXG4iKTsKKyAgICAgICAgICAgICpzdGF0dXMgPSBVX0lOVkFMSURfRk9STUFUX0VSUk9SOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgd2hpbGUoYnVmbGVuPjAgJiYgKGJ1ZmZlcltidWZsZW4tMV0gPT0gJ1xyJyB8fCBidWZmZXJbYnVmbGVuLTFdID09ICdcbicpKSB7CisgICAgICBidWZmZXJbLS1idWZsZW5dID0gMDsKKyAgICB9CisKKyAgICBpZihidWZmZXJbMF0gPT0gMCB8fCBidWZmZXJbMF0gPT0gJyMnKSB7CisgICAgICAgIHJldHVybiBOVUxMOyAvLyBqdXN0IGEgY29tbWVudCwgc2tpcCB3aG9sZSBsaW5lCisgICAgfQorCisgICAgVUNBRWxlbWVudHMgKmVsZW1lbnQgPSAmbGU7CisgICAgbWVtc2V0KGVsZW1lbnQsIDAsIHNpemVvZigqZWxlbWVudCkpOworCisgICAgZW51bSBBY3Rpb25UeXBlIHsKKyAgICAgIFJFQURDRSwKKyAgICAgIFJFQURIRVgxLAorICAgICAgUkVBREhFWDIsCisgICAgICBSRUFEVUNBVkVSU0lPTiwKKyAgICAgIFJFQURMRUFEQllURVRPU0NSSVBUUywKKyAgICAgIFJFQURTQ1JJUFRUT0xFQURCWVRFUywKKyAgICAgIElHTk9SRSwKKyAgICB9OworCisgICAgLy8gRGlyZWN0aXZlcy4KKyAgICBpZihidWZmZXJbMF0gPT0gJ1snKSB7CisgICAgICB1aW50MzJfdCBjbnQgPSAwOworICAgICAgc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgICAgIGNoYXIgbmFtZVsxMjhdOworICAgICAgICB1aW50MzJfdCAqd2hhdDsKKyAgICAgICAgQWN0aW9uVHlwZSB3aGF0X3RvX2RvOworICAgICAgfSB2dFtdICA9IHsgeyJbZmlyc3QgdGVydGlhcnkgaWdub3JhYmxlIiwgIGNvbnN0cy0+VUNBX0ZJUlNUX1RFUlRJQVJZX0lHTk9SQUJMRSwgIFJFQURDRX0sCisgICAgICAgICAgICAgICAgICB7IltsYXN0IHRlcnRpYXJ5IGlnbm9yYWJsZSIsICAgY29uc3RzLT5VQ0FfTEFTVF9URVJUSUFSWV9JR05PUkFCTEUsICAgUkVBRENFfSwKKyAgICAgICAgICAgICAgICAgIHsiW2ZpcnN0IHNlY29uZGFyeSBpZ25vcmFibGUiLCBjb25zdHMtPlVDQV9GSVJTVF9TRUNPTkRBUllfSUdOT1JBQkxFLCBSRUFEQ0V9LAorICAgICAgICAgICAgICAgICAgeyJbbGFzdCBzZWNvbmRhcnkgaWdub3JhYmxlIiwgIGNvbnN0cy0+VUNBX0xBU1RfU0VDT05EQVJZX0lHTk9SQUJMRSwgIFJFQURDRX0sCisgICAgICAgICAgICAgICAgICB7IltmaXJzdCBwcmltYXJ5IGlnbm9yYWJsZSIsICAgY29uc3RzLT5VQ0FfRklSU1RfUFJJTUFSWV9JR05PUkFCTEUsICAgUkVBRENFfSwKKyAgICAgICAgICAgICAgICAgIHsiW2xhc3QgcHJpbWFyeSBpZ25vcmFibGUiLCAgICBjb25zdHMtPlVDQV9MQVNUX1BSSU1BUllfSUdOT1JBQkxFLCAgICBSRUFEQ0V9LAorICAgICAgICAgICAgICAgICAgeyJbZmlyc3QgdmFyaWFibGUiLCAgICAgICAgICAgIGNvbnN0cy0+VUNBX0ZJUlNUX1ZBUklBQkxFLCAgICAgICAgICAgIFJFQURDRX0sCisgICAgICAgICAgICAgICAgICB7IltsYXN0IHZhcmlhYmxlIiwgICAgICAgICAgICAgY29uc3RzLT5VQ0FfTEFTVF9WQVJJQUJMRSwgICAgICAgICAgICAgUkVBRENFfSwKKyAgICAgICAgICAgICAgICAgIHsiW2ZpcnN0IHJlZ3VsYXIiLCAgICAgICAgICAgICBjb25zdHMtPlVDQV9GSVJTVF9OT05fVkFSSUFCTEUsICAgICAgICBSRUFEQ0V9LAorICAgICAgICAgICAgICAgICAgeyJbbGFzdCByZWd1bGFyIiwgICAgICAgICAgICAgIGNvbnN0cy0+VUNBX0xBU1RfTk9OX1ZBUklBQkxFLCAgICAgICAgIFJFQURDRX0sCisgICAgICAgICAgICAgICAgICB7IltmaXJzdCBpbXBsaWNpdCIsICAgICAgICAgICAgY29uc3RzLT5VQ0FfRklSU1RfSU1QTElDSVQsICAgICAgICAgICAgUkVBRENFfSwKKyAgICAgICAgICAgICAgICAgIHsiW2xhc3QgaW1wbGljaXQiLCAgICAgICAgICAgICBjb25zdHMtPlVDQV9MQVNUX0lNUExJQ0lULCAgICAgICAgICAgICBSRUFEQ0V9LAorICAgICAgICAgICAgICAgICAgeyJbZmlyc3QgdHJhaWxpbmciLCAgICAgICAgICAgIGNvbnN0cy0+VUNBX0ZJUlNUX1RSQUlMSU5HLCAgICAgICAgICAgIFJFQURDRX0sCisgICAgICAgICAgICAgICAgICB7IltsYXN0IHRyYWlsaW5nIiwgICAgICAgICAgICAgY29uc3RzLT5VQ0FfTEFTVF9UUkFJTElORywgICAgICAgICAgICAgUkVBRENFfSwKKworICAgICAgICAgICAgICAgICAgeyJbZml4ZWQgdG9wIiwgICAgICAgICAgICAgICAgICAgICZjb25zdHMtPlVDQV9QUklNQVJZX1RPUF9NSU4sICAgICAgIFJFQURIRVgxfSwKKyAgICAgICAgICAgICAgICAgIHsiW2ZpeGVkIGZpcnN0IGltcGxpY2l0IGJ5dGUiLCAgICAmY29uc3RzLT5VQ0FfUFJJTUFSWV9JTVBMSUNJVF9NSU4sICBSRUFESEVYMX0sCisgICAgICAgICAgICAgICAgICB7IltmaXhlZCBsYXN0IGltcGxpY2l0IGJ5dGUiLCAgICAgJmNvbnN0cy0+VUNBX1BSSU1BUllfSU1QTElDSVRfTUFYLCAgUkVBREhFWDF9LAorICAgICAgICAgICAgICAgICAgeyJbZml4ZWQgZmlyc3QgdHJhaWwgYnl0ZSIsICAgICAgICZjb25zdHMtPlVDQV9QUklNQVJZX1RSQUlMSU5HX01JTiwgIFJFQURIRVgxfSwKKyAgICAgICAgICAgICAgICAgIHsiW2ZpeGVkIGxhc3QgdHJhaWwgYnl0ZSIsICAgICAgICAmY29uc3RzLT5VQ0FfUFJJTUFSWV9UUkFJTElOR19NQVgsICBSRUFESEVYMX0sCisgICAgICAgICAgICAgICAgICB7IltmaXhlZCBmaXJzdCBzcGVjaWFsIGJ5dGUiLCAgICAgJmNvbnN0cy0+VUNBX1BSSU1BUllfU1BFQ0lBTF9NSU4sICAgUkVBREhFWDF9LAorICAgICAgICAgICAgICAgICAgeyJbZml4ZWQgbGFzdCBzcGVjaWFsIGJ5dGUiLCAgICAgICZjb25zdHMtPlVDQV9QUklNQVJZX1NQRUNJQUxfTUFYLCAgIFJFQURIRVgxfSwKKyAgICAgICAgICAgICAgICAgIHsiW3ZhcmlhYmxlIHRvcCA9ICIsICAgICAgICAgICAgICAmdC0+b3B0aW9ucy0+dmFyaWFibGVUb3BWYWx1ZSwgICAgICBSRUFESEVYMn0sCisgICAgICAgICAgICAgICAgICB7IltVQ0EgdmVyc2lvbiA9ICIsICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVBRFVDQVZFUlNJT059LAorICAgICAgICAgICAgICAgICAgeyJbdG9wX2J5dGVcdCIsICAgICAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQURMRUFEQllURVRPU0NSSVBUU30sCisgICAgICAgICAgICAgICAgICB7IltyZW9yZGVyaW5nVG9rZW5zXHQiLCAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVBRFNDUklQVFRPTEVBREJZVEVTfSwKKyAgICAgICAgICAgICAgICAgIHsiW2NhdGVnb3JpZXNcdCIsICAgICAgICAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJR05PUkV9LAorICAgICAgICAgICAgICAgICAgeyJbZmlyc3QgdGVydGlhcnkgaW4gc2Vjb25kYXJ5IG5vbi1pZ25vcmFibGUiLCAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUdOT1JFfSwKKyAgICAgICAgICAgICAgICAgIHsiW2xhc3QgdGVydGlhcnkgaW4gc2Vjb25kYXJ5IG5vbi1pZ25vcmFibGUiLCAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUdOT1JFfSwKKyAgICAgICAgICAgICAgICAgIHsiW2ZpcnN0IHNlY29uZGFyeSBpbiBwcmltYXJ5IG5vbi1pZ25vcmFibGUiLCAgICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUdOT1JFfSwKKyAgICAgICAgICAgICAgICAgIHsiW2xhc3Qgc2Vjb25kYXJ5IGluIHByaW1hcnkgbm9uLWlnbm9yYWJsZSIsICAgICAgICAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJR05PUkV9LAorICAgICAgfTsKKyAgICAgIGZvciAoY250ID0gMDsgY250PHNpemVvZih2dCkvc2l6ZW9mKHZ0WzBdKTsgY250KyspIHsKKyAgICAgICAgdWludDMyX3QgdnRMZW4gPSAodWludDMyX3QpdXBydl9zdHJsZW4odnRbY250XS5uYW1lKTsKKyAgICAgICAgaWYodXBydl9zdHJuY21wKGJ1ZmZlciwgdnRbY250XS5uYW1lLCB2dExlbikgPT0gMCkgeworICAgICAgICAgICAgQWN0aW9uVHlwZSB3aGF0X3RvX2RvID0gdnRbY250XS53aGF0X3RvX2RvOworICAgICAgICAgICAgaWYgKHdoYXRfdG9fZG8gPT0gSUdOT1JFKSB7IC8vdnRbY250XS53aGF0X3RvX2RvID09IElHTk9SRQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfSBlbHNlIGlmKHdoYXRfdG9fZG8gPT0gUkVBREhFWDEgfHwgd2hhdF90b19kbyA9PSBSRUFESEVYMikgeworICAgICAgICAgICAgICBwb2ludGVyID0gYnVmZmVyK3Z0TGVuOworICAgICAgICAgICAgICBpbnQzMl90IG51bUJ5dGVzID0gcmVhZEVsZW1lbnQoJnBvaW50ZXIsIHByaW1hcnksICddJywgc3RhdHVzKSAvIDI7CisgICAgICAgICAgICAgIGlmKG51bUJ5dGVzICE9ICh3aGF0X3RvX2RvID09IFJFQURIRVgxID8gMSA6IDIpKSB7CisgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlZhbHVlIG9mIFwiJXNcIiBoYXMgdW5leHBlY3RlZCBudW1iZXIgb2YgJWQgYnl0ZXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgKGludCludW1CeXRlcyk7CisgICAgICAgICAgICAgICAgICAvLypzdGF0dXMgPSBVX0lOVkFMSURfRk9STUFUX0VSUk9SOworICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgKih2dFtjbnRdLndoYXQpID0gKHVpbnQzMl90KXVwcnZfc3RydG91bChwcmltYXJ5LCAmcG9pbnRlciwgMTYpOworICAgICAgICAgICAgICBpZigqcG9pbnRlciAhPSAwKSB7CisgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlZhbHVlIG9mIFwiJXNcIiBpcyBub3QgYSBoZXhhZGVjaW1hbCBudW1iZXJcbiIsIGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAvLypzdGF0dXMgPSBVX0lOVkFMSURfRk9STUFUX0VSUk9SOworICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdF90b19kbyA9PSBSRUFEQ0UpIHsKKyAgICAgICAgICAgICAgLy8gVE9ETzogY29tYmluZSAmIGNsZWFuIHVwIHRoZSB0d28gQ0UgcGFyc2VycworICAgICAgICAgICAgICBwb2ludGVyID0gc3RyY2hyKGJ1ZmZlcit2dExlbiwgJ1snKTsKKyAgICAgICAgICAgICAgaWYocG9pbnRlcikgeworICAgICAgICAgICAgICAgIHBvaW50ZXIrKzsKKyAgICAgICAgICAgICAgICBlbGVtZW50LT5zaXplUHJpbVswXT1yZWFkRWxlbWVudCgmcG9pbnRlciwgcHJpbWFyeSwgJywnLCBzdGF0dXMpIC8gMjsKKyAgICAgICAgICAgICAgICBlbGVtZW50LT5zaXplU2VjWzBdPXJlYWRFbGVtZW50KCZwb2ludGVyLCBzZWNvbmRhcnksICcsJywgc3RhdHVzKSAvIDI7CisgICAgICAgICAgICAgICAgZWxlbWVudC0+c2l6ZVRlclswXT1yZWFkRWxlbWVudCgmcG9pbnRlciwgdGVydGlhcnksICddJywgc3RhdHVzKSAvIDI7CisgICAgICAgICAgICAgICAgdnRbY250XS53aGF0WzBdID0gZ2V0U2luZ2xlQ0VWYWx1ZShwcmltYXJ5LCBzZWNvbmRhcnksIHRlcnRpYXJ5LCBzdGF0dXMpOworICAgICAgICAgICAgICAgIGlmKGVsZW1lbnQtPnNpemVQcmltWzBdID4gMiB8fCBlbGVtZW50LT5zaXplU2VjWzBdID4gMSB8fCBlbGVtZW50LT5zaXplVGVyWzBdID4gMSkgeworICAgICAgICAgICAgICAgICAgdWludDMyX3QgQ0VpID0gMTsKKyAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlID0gVUNPTF9DT05USU5VQVRJT05fTUFSS0VSOyAvKiBDb250aW51YXRpb24gbWFya2VyICovCisgICAgICAgICAgICAgICAgICAgIGlmKDIqQ0VpPGVsZW1lbnQtPnNpemVQcmltW2ldKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSB8PSAoKGhleDJudW0oKihwcmltYXJ5KzQqQ0VpKSkmMHhGKTw8MjgpOworICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgfD0gKChoZXgybnVtKCoocHJpbWFyeSs0KkNFaSsxKSkmMHhGKTw8MjQpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYoMipDRWkrMTxlbGVtZW50LT5zaXplUHJpbVtpXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgfD0gKChoZXgybnVtKCoocHJpbWFyeSs0KkNFaSsyKSkmMHhGKTw8MjApOworICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgfD0gKChoZXgybnVtKCoocHJpbWFyeSs0KkNFaSszKSkmMHhGKTw8MTYpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYoQ0VpPGVsZW1lbnQtPnNpemVTZWNbaV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIHw9ICgoaGV4Mm51bSgqKHNlY29uZGFyeSsyKkNFaSkpJjB4Rik8PDEyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIHw9ICgoaGV4Mm51bSgqKHNlY29uZGFyeSsyKkNFaSsxKSkmMHhGKTw8OCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZihDRWk8ZWxlbWVudC0+c2l6ZVRlcltpXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgfD0gKChoZXgybnVtKCoodGVydGlhcnkrMipDRWkpKSYweDMpPDw0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIHw9IChoZXgybnVtKCoodGVydGlhcnkrMipDRWkrMSkpJjB4Rik7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBDRWkrKzsKKworICAgICAgICAgICAgICAgICAgICB2dFtjbnRdLndoYXRbMV0gPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgLy9lbGVtZW50LT5DRXNbQ0VpbmRleCsrXSA9IHZhbHVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICB2dFtjbnRdLndoYXRbMV0gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byByZWFkIGEgQ0UgZnJvbSBsaW5lICVzXG4iLCBidWZmZXIpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXRfdG9fZG8gPT0gUkVBRFVDQVZFUlNJT04pIHsgLy92dFtjbnRdLndoYXRfdG9fZG8gPT0gUkVBRFVDQVZFUlNJT04KKyAgICAgICAgICAgICAgdV92ZXJzaW9uRnJvbVN0cmluZyhVQ0FWZXJzaW9uLCBidWZmZXIrdnRMZW4pOworICAgICAgICAgICAgICBpZihWRVJCT1NFKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRvdXQsICJVQ0EgdmVyc2lvbiBbJWh1LiVodS4laHUuJWh1XVxuIiwgVUNBVmVyc2lvblswXSwgVUNBVmVyc2lvblsxXSwgVUNBVmVyc2lvblsyXSwgVUNBVmVyc2lvblszXSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdF90b19kbyA9PSBSRUFETEVBREJZVEVUT1NDUklQVFMpIHsgLy92dFtjbnRdLndoYXRfdG9fZG8gPT0gUkVBRExFQURCWVRFVE9TQ1JJUFRTCisgICAgICAgICAgICAgICAgcG9pbnRlciA9IGJ1ZmZlciArIHZ0TGVuOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHVpbnQxNl90IGxlYWRCeXRlID0gKGhleDJudW0oKnBvaW50ZXIrKykgKiAxNikgKyBoZXgybnVtKCpwb2ludGVyKyspOworICAgICAgICAgICAgICAgIC8vZnByaW50ZihzdGRvdXQsICJ+fn5+IHByb2Nlc3NpbmcgbGVhZCBieXRlID0gJTAyeFxuIiwgbGVhZEJ5dGUpOworICAgICAgICAgICAgICAgIGlmIChsZWFkQnl0ZSA+PSBsZWFkQnl0ZUNvbnN0YW50cy0+TEVBRF9CWVRFX1RPX1NDUklQVFNfSU5ERVhfTEVOR1RIKSB7CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTGVhZCBieXRlIGxhcmdlciB0aGFuIGFsbG9jYXRlZCB0YWJsZSEiKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHN0YXR1cyBhbmQgcmV0dXJuCisgICAgICAgICAgICAgICAgICAgICpzdGF0dXMgPSBVX0lOVEVSTkFMX1BST0dSQU1fRVJST1I7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBza2lwV2hpdGVTcGFjZSgmcG9pbnRlciwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpbnQzMl90IHJlb3JkZXJDb2RlQXJyYXlbMTAwXTsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCByZW9yZGVyQ29kZUFycmF5Q291bnQgPSAwOworICAgICAgICAgICAgICAgIGNoYXIgc2NyaXB0TmFtZVsxMDBdOworICAgICAgICAgICAgICAgIGludDMyX3QgZWxlbWVudExlbmd0aCA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKChlbGVtZW50TGVuZ3RoID0gcmVhZEVsZW1lbnQoJnBvaW50ZXIsIHNjcmlwdE5hbWUsICcgJywgc3RhdHVzKSkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzY3JpcHROYW1lWzBdID09ICddJykgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBmaXggdGhlIEZyYWN0aW9uYWxVQ0EgZGF0YSBhbmQgdGhlbiB0aGUgcGFyc2luZyBjb2RlCisgICAgICAgICAgICAgICAgICAgIGlmIChzdHJjbXAoc2NyaXB0TmFtZSwgIklNUExJQ0lUIikgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RyY3B5KHNjcmlwdE5hbWUsICJIYW5pIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByZW9yZGVyQ29kZUNvdW50ID0gZ2V0UmVvcmRlckNvZGUoc2NyaXB0TmFtZSwgJnJlb3JkZXJDb2RlQXJyYXlbcmVvcmRlckNvZGVBcnJheUNvdW50XSwgc2l6ZW9mKHJlb3JkZXJDb2RlQXJyYXkpIC8gc2l6ZW9mKHJlb3JkZXJDb2RlQXJyYXlbMF0pIC0gcmVvcmRlckNvZGVBcnJheUNvdW50LCBzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICAvL2ZwcmludGYoc3Rkb3V0LCAiXHRyZW9yZGVyQ29kZUNvdW50ID0gJWQsIHN0YXR1cyA9ICV4XG4iLCByZW9yZGVyQ29kZUNvdW50LCBzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICByZW9yZGVyQ29kZUFycmF5Q291bnQgKz0gcmVvcmRlckNvZGVDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlb3JkZXJDb2RlQXJyYXlDb3VudCA+IHNpemVvZihyZW9yZGVyQ29kZUFycmF5KSAvIHNpemVvZihyZW9yZGVyQ29kZUFycmF5WzBdKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRvdXQsICJyZW9yZGVyIGNvZGUgYXJyYXkgY291bnQgaXMgZ3JlYXRlciB0aGFuIGFsbG9jYXRlZCBzaXplISIpOworICAgICAgICAgICAgICAgICAgICAgICAgKnN0YXR1cyA9IFVfSU5URVJOQUxfUFJPR1JBTV9FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vZnByaW50ZihzdGRvdXQsICJyZW9yZGVyQ29kZUFycmF5Q291bnQgPSAlZFxuIiwgcmVvcmRlckNvZGVBcnJheUNvdW50KTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHJlb3JkZXJDb2RlQXJyYXlDb3VudCkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICBsZWFkQnl0ZUNvbnN0YW50cy0+TEVBRF9CWVRFX1RPX1NDUklQVFNfSU5ERVhbbGVhZEJ5dGVdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPID0gbW92ZSAweDgwMDAgaW50byBkZWZpbmVkIGNvbnN0YW50CisgICAgICAgICAgICAgICAgICAgICAgICBsZWFkQnl0ZUNvbnN0YW50cy0+TEVBRF9CWVRFX1RPX1NDUklQVFNfSU5ERVhbbGVhZEJ5dGVdID0gMHg4MDAwIHwgcmVvcmRlckNvZGVBcnJheVswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlb3JkZXJDb2RlQXJyYXlDb3VudCArIGxlYWRCeXRlQ29uc3RhbnRzLT5MRUFEX0JZVEVfVE9fU0NSSVBUU19EQVRBX09GRlNFVCA+IGxlYWRCeXRlQ29uc3RhbnRzLT5MRUFEX0JZVEVfVE9fU0NSSVBUU19EQVRBX0xFTkdUSCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVycm9yIGNvbmRpdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbGVhZEJ5dGVDb25zdGFudHMtPkxFQURfQllURV9UT19TQ1JJUFRTX0lOREVYW2xlYWRCeXRlXSA9IGxlYWRCeXRlQ29uc3RhbnRzLT5MRUFEX0JZVEVfVE9fU0NSSVBUU19EQVRBX09GRlNFVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlYWRCeXRlQ29uc3RhbnRzLT5MRUFEX0JZVEVfVE9fU0NSSVBUU19EQVRBW2xlYWRCeXRlQ29uc3RhbnRzLT5MRUFEX0JZVEVfVE9fU0NSSVBUU19EQVRBX09GRlNFVCsrXSA9IHJlb3JkZXJDb2RlQXJyYXlDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IHJlb3JkZXJDb2RlSW5kZXggPSAwOyByZW9yZGVyQ29kZUluZGV4IDwgcmVvcmRlckNvZGVBcnJheUNvdW50OyByZW9yZGVyQ29kZUluZGV4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWFkQnl0ZUNvbnN0YW50cy0+TEVBRF9CWVRFX1RPX1NDUklQVFNfREFUQVtsZWFkQnl0ZUNvbnN0YW50cy0+TEVBRF9CWVRFX1RPX1NDUklQVFNfREFUQV9PRkZTRVQrK10gPSByZW9yZGVyQ29kZUFycmF5W3Jlb3JkZXJDb2RlSW5kZXhdOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdF90b19kbyA9PSBSRUFEU0NSSVBUVE9MRUFEQllURVMpIHsgLy92dFtjbnRdLndoYXRfdG9fZG8gPT0gUkVBRFNDUklQVFRPTEVBREJZVEVTCisgICAgICAgICAgICAgICAgdWludDE2X3QgbGVhZEJ5dGVBcnJheVsxMDBdOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGxlYWRCeXRlQXJyYXlDb3VudCA9IDA7CisgICAgICAgICAgICAgICAgaW50MzJfdCByZW9yZGVyQ29kZUFycmF5WzEwMF07CisgICAgICAgICAgICAgICAgdWludDMyX3QgcmVvcmRlckNvZGVBcnJheUNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBjaGFyIHNjcmlwdE5hbWVbMTAwXTsKKworICAgICAgICAgICAgICAgIHBvaW50ZXIgPSBidWZmZXIgKyB2dExlbjsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBzY3JpcHROYW1lTGVuZ3RoID0gcmVhZEVsZW1lbnQoJnBvaW50ZXIsIHNjcmlwdE5hbWUsICdcdCcsIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgaW50MzJfdCByZW9yZGVyQ29kZUNvdW50ID0gZ2V0UmVvcmRlckNvZGUoc2NyaXB0TmFtZSwgJnJlb3JkZXJDb2RlQXJyYXlbcmVvcmRlckNvZGVBcnJheUNvdW50XSwgc2l6ZW9mKHJlb3JkZXJDb2RlQXJyYXkpIC8gc2l6ZW9mKHJlb3JkZXJDb2RlQXJyYXlbMF0pLCBzdGF0dXMpOworICAgICAgICAgICAgICAgIGlmIChyZW9yZGVyQ29kZUNvdW50ID4gMCAmJiByZW9yZGVyQ29kZUFycmF5WzBdICE9IFVTQ1JJUFRfSU5WQUxJRF9DT0RFKSB7CisgICAgICAgICAgICAgICAgICAgIC8vZnByaW50ZihzdGRvdXQsICJeXl4gcHJvY2Vzc2luZyByZW9yZGVyIGNvZGUgPSAlMDR4ICglcylcbiIsIHJlb3JkZXJDb2RlQXJyYXlbMF0sIHNjcmlwdE5hbWUpOworICAgICAgICAgICAgICAgICAgICBza2lwV2hpdGVTcGFjZSgmcG9pbnRlciwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBlbGVtZW50TGVuZ3RoID0gMDsKKyAgICAgICAgICAgICAgICAgICAgY2hhciBsZWFkQnl0ZVN0cmluZ1sxMDBdOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKGVsZW1lbnRMZW5ndGggPSByZWFkRWxlbWVudCgmcG9pbnRlciwgbGVhZEJ5dGVTdHJpbmcsICc9Jywgc3RhdHVzKSkgPT0gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9mcHJpbnRmKHN0ZG91dCwgIlx0bGVhZEJ5dGVBcnJheUNvdW50ID0gJWQsIGVsZW1lbnRMZW5ndGggPSAlZCwgbGVhZEJ5dGVTdHJpbmcgPSAlc1xuIiwgbGVhZEJ5dGVBcnJheUNvdW50LCBlbGVtZW50TGVuZ3RoLCBsZWFkQnl0ZVN0cmluZyk7CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsZWFkQnl0ZSA9IChoZXgybnVtKGxlYWRCeXRlU3RyaW5nWzBdKSAqIDE2KSArIGhleDJudW0obGVhZEJ5dGVTdHJpbmdbMV0pOworICAgICAgICAgICAgICAgICAgICAgICAgbGVhZEJ5dGVBcnJheVtsZWFkQnl0ZUFycmF5Q291bnQrK10gPSAodWludDE2X3QpIGxlYWRCeXRlOworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcFVudGlsV2hpdGVTcGFjZSgmcG9pbnRlciwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxlYWRCeXRlQ29uc3RhbnRzLT5TQ1JJUFRfVE9fTEVBRF9CWVRFU19JTkRFWF9DT1VOVCA+PSBsZWFkQnl0ZUNvbnN0YW50cy0+U0NSSVBUX1RPX0xFQURfQllURVNfSU5ERVhfTEVOR1RIKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL2ZwcmludGYoc3Rkb3V0LCAiXHRFcnJvciBjb25kaXRpb25cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgLy9mcHJpbnRmKHN0ZG91dCwgIlx0aW5kZXggY291bnQgPSAlZCwgdG90YWwgaW5kZXggc2l6ZSA9ICVkXG4iLCBsZWFkQnl0ZUNvbnN0YW50cy0+U0NSSVBUX1RPX0xFQURfQllURVNfSU5ERVhfQ09VTlQsIHNpemVvZihsZWFkQnl0ZUNvbnN0YW50cy0+U0NSSVBUX1RPX0xFQURfQllURVNfSU5ERVgpIC8gc2l6ZW9mKGxlYWRCeXRlQ29uc3RhbnRzLT5TQ1JJUFRfVE9fTEVBRF9CWVRFU19JTkRFWFswXSkpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXJyb3IgY29uZGl0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAqc3RhdHVzID0gVV9JTlRFUk5BTF9QUk9HUkFNX0VSUk9SOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbGVhZEJ5dGVDb25zdGFudHMtPlNDUklQVF9UT19MRUFEX0JZVEVTX0lOREVYW2xlYWRCeXRlQ29uc3RhbnRzLT5TQ1JJUFRfVE9fTEVBRF9CWVRFU19JTkRFWF9DT1VOVF0ucmVvcmRlckNvZGUgPSByZW9yZGVyQ29kZUFycmF5WzBdOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgLy9mcHJpbnRmKHN0ZG91dCwgIlx0bGVhZCBieXRlIGNvdW50ID0gJWRcbiIsIGxlYWRCeXRlQXJyYXlDb3VudCk7CisgICAgICAgICAgICAgICAgICAgIC8vZnByaW50ZihzdGRvdXQsICJcdGxlYWQgYnl0ZSBhcnJheSA9ICIpOworICAgICAgICAgICAgICAgICAgICAvL2ZvciAoaW50IGkgPSAwOyBpIDwgbGVhZEJ5dGVBcnJheUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgZnByaW50ZihzdGRvdXQsICIlMDJ4LCAiLCBsZWFkQnl0ZUFycmF5W2ldKTsKKyAgICAgICAgICAgICAgICAgICAgLy99CisgICAgICAgICAgICAgICAgICAgIC8vZnByaW50ZihzdGRvdXQsICJcbiIpOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChsZWFkQnl0ZUFycmF5Q291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWFkQnl0ZUNvbnN0YW50cy0+U0NSSVBUX1RPX0xFQURfQllURVNfSU5ERVhbbGVhZEJ5dGVDb25zdGFudHMtPlNDUklQVF9UT19MRUFEX0JZVEVTX0lOREVYX0NPVU5UXS5vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gPSBtb3ZlIDB4ODAwMCBpbnRvIGRlZmluZWQgY29uc3RhbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZwcmludGYoc3Rkb3V0LCAiXHQrKysrKyBsZWFkIGJ5dGUgPSAmeFxuIiwgbGVhZEJ5dGVBcnJheVswXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVhZEJ5dGVDb25zdGFudHMtPlNDUklQVF9UT19MRUFEX0JZVEVTX0lOREVYW2xlYWRCeXRlQ29uc3RhbnRzLT5TQ1JJUFRfVE9fTEVBRF9CWVRFU19JTkRFWF9DT1VOVF0ub2Zmc2V0ID0gMHg4MDAwIHwgbGVhZEJ5dGVBcnJheVswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9mcHJpbnRmKHN0ZG91dCwgIlx0KysrKysgbGVhZCBieXRlcyB3cml0dGVuIHRvIGRhdGEgYmxvY2sgLSAlZFxuIiwgaXRlbXNUb0RhdGFCbG9jaysrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZwcmludGYoc3Rkb3V0LCAiXHRsZWFkIGJ5dGVzID0gIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9mb3IgKGludCBpID0gMDsgaSA8IGxlYWRCeXRlQXJyYXlDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgZnByaW50ZihzdGRvdXQsICIlMDJ4LCAiLCBsZWFkQnl0ZUFycmF5W2ldKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL30KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZwcmludGYoc3Rkb3V0LCAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZwcmludGYoc3Rkb3V0LCAiXHRCRUZPUkUgZGF0YSBieXRlcyA9ICIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZm9yIChpbnQgaSA9IDA7IGkgPCBsZWFkQnl0ZUNvbnN0YW50cy0+U0NSSVBUX1RPX0xFQURfQllURVNfREFUQV9PRkZTRVQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGZwcmludGYoc3Rkb3V0LCAiJTAyeCwgIiwgbGVhZEJ5dGVDb25zdGFudHMtPlNDUklQVF9UT19MRUFEX0JZVEVTX0RBVEFbaV0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZnByaW50ZihzdGRvdXQsICJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZnByaW50ZihzdGRvdXQsICJcdGRhdGEgb2Zmc2V0ID0gJWQsIGRhdGEgbGVuZ3RoID0gJWRcbiIsIGxlYWRCeXRlQ29uc3RhbnRzLT5TQ1JJUFRfVE9fTEVBRF9CWVRFU19EQVRBX09GRlNFVCwgbGVhZEJ5dGVDb25zdGFudHMtPlNDUklQVF9UT19MRUFEX0JZVEVTX0RBVEFfTEVOR1RIKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGxlYWRCeXRlQXJyYXlDb3VudCArIGxlYWRCeXRlQ29uc3RhbnRzLT5TQ1JJUFRfVE9fTEVBRF9CWVRFU19EQVRBX09GRlNFVCkgPiBsZWFkQnl0ZUNvbnN0YW50cy0+U0NSSVBUX1RPX0xFQURfQllURVNfREFUQV9MRU5HVEgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9mcHJpbnRmKHN0ZG91dCwgIlx0RXJyb3IgY29uZGl0aW9uXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXJyb3IgY29uZGl0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzdGF0dXMgPSBVX0lOVEVSTkFMX1BST0dSQU1fRVJST1I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWFkQnl0ZUNvbnN0YW50cy0+U0NSSVBUX1RPX0xFQURfQllURVNfSU5ERVhbbGVhZEJ5dGVDb25zdGFudHMtPlNDUklQVF9UT19MRUFEX0JZVEVTX0lOREVYX0NPVU5UXS5vZmZzZXQgPSBsZWFkQnl0ZUNvbnN0YW50cy0+U0NSSVBUX1RPX0xFQURfQllURVNfREFUQV9PRkZTRVQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVhZEJ5dGVDb25zdGFudHMtPlNDUklQVF9UT19MRUFEX0JZVEVTX0RBVEFbbGVhZEJ5dGVDb25zdGFudHMtPlNDUklQVF9UT19MRUFEX0JZVEVTX0RBVEFfT0ZGU0VUKytdID0gbGVhZEJ5dGVBcnJheUNvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdERhdGFXcml0dGVuKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCZsZWFkQnl0ZUNvbnN0YW50cy0+U0NSSVBUX1RPX0xFQURfQllURVNfREFUQVtsZWFkQnl0ZUNvbnN0YW50cy0+U0NSSVBUX1RPX0xFQURfQllURVNfREFUQV9PRkZTRVRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWFkQnl0ZUFycmF5LCBsZWFkQnl0ZUFycmF5Q291bnQgKiBzaXplb2YobGVhZEJ5dGVBcnJheVswXSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdERhdGFXcml0dGVuICs9IGxlYWRCeXRlQXJyYXlDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZwcmludGYoc3Rkb3V0LCAiXHRsZWFkIGJ5dGUgZGF0YSB3cml0dGVuID0gJWRcbiIsIHNjcmlwdERhdGFXcml0dGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZwcmludGYoc3Rkb3V0LCAiXHRjdXJyZW50SW5kZXgucmVvcmRlckNvZGUgPSAlMDR4LCBjdXJyZW50SW5kZXgub2Zmc2V0ID0gJTA0eFxuIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgbGVhZEJ5dGVDb25zdGFudHMtPlNDUklQVF9UT19MRUFEX0JZVEVTX0lOREVYX0NPVU5ULnJlb3JkZXJDb2RlLCBsZWFkQnl0ZUNvbnN0YW50cy0+U0NSSVBUX1RPX0xFQURfQllURVNfSU5ERVhfQ09VTlQub2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWFkQnl0ZUNvbnN0YW50cy0+U0NSSVBUX1RPX0xFQURfQllURVNfREFUQV9PRkZTRVQgKz0gbGVhZEJ5dGVBcnJheUNvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZnByaW50ZihzdGRvdXQsICJcdGRhdGEgb2Zmc2V0ID0gJWRcbiIsIGxlYWRCeXRlQ29uc3RhbnRzLT5TQ1JJUFRfVE9fTEVBRF9CWVRFU19EQVRBX09GRlNFVCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9mcHJpbnRmKHN0ZG91dCwgIlx0QUZURVIgZGF0YSBieXRlcyA9ICIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZm9yIChpbnQgaSA9IDA7IGkgPCBsZWFkQnl0ZUNvbnN0YW50cy0+U0NSSVBUX1RPX0xFQURfQllURVNfREFUQV9PRkZTRVQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGZwcmludGYoc3Rkb3V0LCAiJTAyeCwgIiwgbGVhZEJ5dGVDb25zdGFudHMtPlNDUklQVF9UT19MRUFEX0JZVEVTX0RBVEFbaV0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZnByaW50ZihzdGRvdXQsICJcbiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vaWYgKHJlb3JkZXJDb2RlQXJyYXlbMF0gPj0gMHgxMDAwKSB7CisgICAgICAgICAgICAgICAgICAgICAvLyAgIGZwcmludGYoc3Rkb3V0LCAiQEBAQCByZW9yZGVyQ29kZSA9ICV4LCBvZmZzZXQgPSAleFxuIiwgbGVhZEJ5dGVDb25zdGFudHMtPlNDUklQVF9UT19MRUFEX0JZVEVTX0lOREVYW2xlYWRCeXRlQ29uc3RhbnRzLT5TQ1JJUFRfVE9fTEVBRF9CWVRFU19JTkRFWF9DT1VOVF0ucmVvcmRlckNvZGUsIGxlYWRCeXRlQ29uc3RhbnRzLT5TQ1JJUFRfVE9fTEVBRF9CWVRFU19JTkRFWFtsZWFkQnl0ZUNvbnN0YW50cy0+U0NSSVBUX1RPX0xFQURfQllURVNfSU5ERVhfQ09VTlRdLm9mZnNldCk7CisgICAgICAgICAgICAgICAgICAgICAvLyAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVhZEJ5dGVDb25zdGFudHMtPlNDUklQVF9UT19MRUFEX0JZVEVTX0RBVEFfT0ZGU0VUOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgIGZwcmludGYoc3Rkb3V0LCAiJTAyeCwgIiwgbGVhZEJ5dGVDb25zdGFudHMtPlNDUklQVF9UT19MRUFEX0JZVEVTX0RBVEFbaV0pOworICAgICAgICAgICAgICAgICAgICAgLy8gICB9CisgICAgICAgICAgICAgICAgICAgIC8vICAgIGZwcmludGYoc3Rkb3V0LCAiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAvLyB9CisgICAgICAgICAgICAgICAgICAgIGxlYWRCeXRlQ29uc3RhbnRzLT5TQ1JJUFRfVE9fTEVBRF9CWVRFU19JTkRFWF9DT1VOVCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICB9CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmc6IHVucmVjb2duaXplZCBvcHRpb246ICVzXG4iLCBidWZmZXIpOworICAgICAgLy8qc3RhdHVzID0gVV9JTlZBTElEX0ZPUk1BVF9FUlJPUjsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHN0YXJ0Q29kZVBvaW50ID0gYnVmZmVyOworICAgIGVuZENvZGVQb2ludCA9IHN0cmNocihzdGFydENvZGVQb2ludCwgJzsnKTsKKworICAgIGlmKGVuZENvZGVQb2ludCA9PSAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZXJyb3IgLSBsaW5lIHdpdGggbm8gY29kZSBwb2ludCFcbiIpOworICAgICAgICAqc3RhdHVzID0gVV9JTlZBTElEX0ZPUk1BVF9FUlJPUjsgLyogTm8gY29kZSBwb2ludCAtIGNvdWxkIGJlIGFuIGVycm9yLCBidXQgcHJvYmFibHkgb25seSBhbiBlbXB0eSBsaW5lICovCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICAgICooZW5kQ29kZVBvaW50KSA9IDA7CisgICAgfQorCisgICAgY2hhciAqcGlwZVBvaW50ZXIgPSBzdHJjaHIoYnVmZmVyLCAnfCcpOworICAgIGlmIChwaXBlUG9pbnRlciAhPSBOVUxMKSB7CisgICAgICAgIC8vIFJlYWQgdGhlIHByZWZpeCBzdHJpbmcgd2hpY2ggcHJlY2VkZXMgdGhlIGFjdHVhbCBzdHJpbmcuCisgICAgICAgICpwaXBlUG9pbnRlciA9IDA7CisgICAgICAgIGVsZW1lbnQtPnByZWZpeFNpemUgPQorICAgICAgICAgICAgdV9wYXJzZVN0cmluZyhzdGFydENvZGVQb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC0+cHJlZml4Q2hhcnMsIExFTkdUSE9GKGVsZW1lbnQtPnByZWZpeENoYXJzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgc3RhdHVzKTsKKyAgICAgICAgaWYoVV9GQUlMVVJFKCpzdGF0dXMpKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImVycm9yIC0gcGFyc2luZyBvZiBwcmVmaXggXCIlc1wiIGZhaWxlZDogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0Q29kZVBvaW50LCB1X2Vycm9yTmFtZSgqc3RhdHVzKSk7CisgICAgICAgICAgICAqc3RhdHVzID0gVV9JTlZBTElEX0ZPUk1BVF9FUlJPUjsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGVsZW1lbnQtPnByZWZpeCA9IGVsZW1lbnQtPnByZWZpeENoYXJzOworICAgICAgICBzdGFydENvZGVQb2ludCA9IHBpcGVQb2ludGVyICsgMTsKKyAgICB9CisKKyAgICAvLyBSZWFkIHRoZSBzdHJpbmcgd2hpY2ggZ2V0cyB0aGUgQ0UocykgYXNzaWduZWQuCisgICAgZWxlbWVudC0+Y1NpemUgPQorICAgICAgICB1X3BhcnNlU3RyaW5nKHN0YXJ0Q29kZVBvaW50LAorICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQtPnVjaGFycywgTEVOR1RIT0YoZWxlbWVudC0+dWNoYXJzKSwKKyAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBzdGF0dXMpOworICAgIGlmKFVfRkFJTFVSRSgqc3RhdHVzKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImVycm9yIC0gcGFyc2luZyBvZiBjb2RlIHBvaW50KHMpIFwiJXNcIiBmYWlsZWQ6ICVzXG4iLAorICAgICAgICAgICAgICAgIHN0YXJ0Q29kZVBvaW50LCB1X2Vycm9yTmFtZSgqc3RhdHVzKSk7CisgICAgICAgICpzdGF0dXMgPSBVX0lOVkFMSURfRk9STUFUX0VSUk9SOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWxlbWVudC0+Y1BvaW50cyA9IGVsZW1lbnQtPnVjaGFyczsKKworICAgIHN0YXJ0Q29kZVBvaW50ID0gZW5kQ29kZVBvaW50KzE7CisKKyAgICBjb21tZW50U3RhcnQgPSBzdHJjaHIoc3RhcnRDb2RlUG9pbnQsICcjJyk7CisgICAgaWYoY29tbWVudFN0YXJ0ID09IE5VTEwpIHsKKyAgICAgICAgY29tbWVudFN0YXJ0ID0gc3RybGVuKHN0YXJ0Q29kZVBvaW50KSArIHN0YXJ0Q29kZVBvaW50OworICAgIH0KKworICAgIGkgPSAwOworICAgIHVpbnQzMl90IENFaW5kZXggPSAwOworICAgIGVsZW1lbnQtPm5vT2ZDRXMgPSAwOworICAgIGZvcig7OykgeworICAgICAgICBlbmRDb2RlUG9pbnQgPSBzdHJjaHIoc3RhcnRDb2RlUG9pbnQsICddJyk7CisgICAgICAgIGlmKGVuZENvZGVQb2ludCA9PSBOVUxMIHx8IGVuZENvZGVQb2ludCA+PSBjb21tZW50U3RhcnQpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHBvaW50ZXIgPSBzdHJjaHIoc3RhcnRDb2RlUG9pbnQsICdbJyk7CisgICAgICAgIHBvaW50ZXIrKzsKKworICAgICAgICBlbGVtZW50LT5zaXplUHJpbVtpXT1yZWFkRWxlbWVudCgmcG9pbnRlciwgcHJpbWFyeSwgJywnLCBzdGF0dXMpIC8gMjsKKyAgICAgICAgZWxlbWVudC0+c2l6ZVNlY1tpXT1yZWFkRWxlbWVudCgmcG9pbnRlciwgc2Vjb25kYXJ5LCAnLCcsIHN0YXR1cykgLyAyOworICAgICAgICBlbGVtZW50LT5zaXplVGVyW2ldPXJlYWRFbGVtZW50KCZwb2ludGVyLCB0ZXJ0aWFyeSwgJ10nLCBzdGF0dXMpIC8gMjsKKworCisgICAgICAgIC8qIEkgd2FudCB0byBnZXQgdGhlIENFcyBlbnRlcmVkIHJpZ2h0IGhlcmUsIGluY2x1ZGluZyBjb250aW51YXRpb24gKi8KKyAgICAgICAgZWxlbWVudC0+Q0VzW0NFaW5kZXgrK10gPSBnZXRTaW5nbGVDRVZhbHVlKHByaW1hcnksIHNlY29uZGFyeSwgdGVydGlhcnksIHN0YXR1cyk7CisKKyAgICAgICAgdWludDMyX3QgQ0VpID0gMTsKKyAgICAgICAgd2hpbGUoMipDRWk8ZWxlbWVudC0+c2l6ZVByaW1baV0gfHwgQ0VpPGVsZW1lbnQtPnNpemVTZWNbaV0gfHwgQ0VpPGVsZW1lbnQtPnNpemVUZXJbaV0pIHsKKyAgICAgICAgICB1aW50MzJfdCB2YWx1ZSA9IFVDT0xfQ09OVElOVUFUSU9OX01BUktFUjsgLyogQ29udGludWF0aW9uIG1hcmtlciAqLworICAgICAgICAgICAgaWYoMipDRWk8ZWxlbWVudC0+c2l6ZVByaW1baV0pIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSB8PSAoKGhleDJudW0oKihwcmltYXJ5KzQqQ0VpKSkmMHhGKTw8MjgpOworICAgICAgICAgICAgICAgIHZhbHVlIHw9ICgoaGV4Mm51bSgqKHByaW1hcnkrNCpDRWkrMSkpJjB4Rik8PDI0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoMipDRWkrMTxlbGVtZW50LT5zaXplUHJpbVtpXSkgeworICAgICAgICAgICAgICAgIHZhbHVlIHw9ICgoaGV4Mm51bSgqKHByaW1hcnkrNCpDRWkrMikpJjB4Rik8PDIwKTsKKyAgICAgICAgICAgICAgICB2YWx1ZSB8PSAoKGhleDJudW0oKihwcmltYXJ5KzQqQ0VpKzMpKSYweEYpPDwxNik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKENFaTxlbGVtZW50LT5zaXplU2VjW2ldKSB7CisgICAgICAgICAgICAgICAgdmFsdWUgfD0gKChoZXgybnVtKCooc2Vjb25kYXJ5KzIqQ0VpKSkmMHhGKTw8MTIpOworICAgICAgICAgICAgICAgIHZhbHVlIHw9ICgoaGV4Mm51bSgqKHNlY29uZGFyeSsyKkNFaSsxKSkmMHhGKTw8OCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKENFaTxlbGVtZW50LT5zaXplVGVyW2ldKSB7CisgICAgICAgICAgICAgICAgdmFsdWUgfD0gKChoZXgybnVtKCoodGVydGlhcnkrMipDRWkpKSYweDMpPDw0KTsKKyAgICAgICAgICAgICAgICB2YWx1ZSB8PSAoaGV4Mm51bSgqKHRlcnRpYXJ5KzIqQ0VpKzEpKSYweEYpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDRWkrKzsKKworICAgICAgICAgICAgZWxlbWVudC0+Q0VzW0NFaW5kZXgrK10gPSB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICBzdGFydENvZGVQb2ludCA9IGVuZENvZGVQb2ludCsxOworICAgICAgaSsrOworICAgIH0KKyAgICBlbGVtZW50LT5ub09mQ0VzID0gQ0VpbmRleDsKKyNpZiAwCisgICAgZWxlbWVudC0+aXNUaGFpID0gVUNPTF9JU1RIQUlQUkVWT1dFTChlbGVtZW50LT5jUG9pbnRzWzBdKTsKKyNlbmRpZgorICAgIC8vIHdlIGRvbid0IHdhbnQgYW55IHN0cmFuZ2Ugc3R1ZmYgYWZ0ZXIgdXNlZnVsIGRhdGEhCisgICAgaWYgKHBvaW50ZXIgPT0gTlVMTCkgeworICAgICAgICAvKiBodWg/IERpZCB3ZSBnZXQgJ10nIHdpdGhvdXQgdGhlICdbJz8gUGFpciB5b3VyIGJyYWNrZXRzISAqLworICAgICAgICAqc3RhdHVzPVVfSU5WQUxJRF9GT1JNQVRfRVJST1I7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICB3aGlsZShwb2ludGVyIDwgY29tbWVudFN0YXJ0KSAgeworICAgICAgICAgICAgaWYoKnBvaW50ZXIgIT0gJyAnICYmICpwb2ludGVyICE9ICdcdCcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKnN0YXR1cz1VX0lOVkFMSURfRk9STUFUX0VSUk9SOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcG9pbnRlcisrOworICAgICAgICB9CisgICAgfQorICAgIGlmKGVsZW1lbnQtPmNTaXplID09IDEgJiYgZWxlbWVudC0+Y1BvaW50c1swXSA9PSAweGZmZmUpIHsKKyAgICAgICAgLy8gVUNBIDYuMCBnaXZlcyBVK0ZGRkUgYSBzcGVjaWFsIG1pbmltdW0gd2VpZ2h0IHVzaW5nIHRoZQorICAgICAgICAvLyBieXRlIDAyIHdoaWNoIGlzIHRoZSBtZXJnZS1zb3J0LWtleSBzZXBhcmF0b3IgYW5kIGlsbGVnYWwgZm9yIGFueQorICAgICAgICAvLyBvdGhlciBjaGFyYWN0ZXJzLgorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFJ1ZGltZW50YXJ5IGNoZWNrIGZvciB2YWxpZCBieXRlcyBpbiBDRSB3ZWlnaHRzLgorICAgICAgICAvLyBGb3IgYSBtb3JlIGNvbXByZWhlbnNpdmUgY2hlY2sgc2VlIGNpbnRsdHN0IC90c2NvbGwvY2l0ZXJ0c3QvVGVzdENFVmFsaWRpdHkKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IChpbnQzMl90KUNFaW5kZXg7ICsraSkgeworICAgICAgICAgICAgdWludDMyX3QgdmFsdWUgPSBlbGVtZW50LT5DRXNbaV07CisgICAgICAgICAgICB1aW50OF90IGJ5dGVzWzRdID0geworICAgICAgICAgICAgICAgICh1aW50OF90KSh2YWx1ZSA+PiAyNCksCisgICAgICAgICAgICAgICAgKHVpbnQ4X3QpKHZhbHVlID4+IDE2KSwKKyAgICAgICAgICAgICAgICAodWludDhfdCkodmFsdWUgPj4gOCksCisgICAgICAgICAgICAgICAgKHVpbnQ4X3QpKHZhbHVlICYgVUNPTF9ORVdfVEVSVElBUllPUkRFUk1BU0spCisgICAgICAgICAgICB9OworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA0OyArK2opIHsKKyAgICAgICAgICAgICAgICBpZiAoMCAhPSBieXRlc1tqXSAmJiBieXRlc1tqXSA8IDMpIHsKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJXYXJuaW5nOiBpbnZhbGlkIFVDQSB3ZWlnaHQgYnl0ZSAlMDJYIGZvciAlc1xuIiwgYnl0ZXNbal0sIGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFByaW1hcnkgc2Vjb25kIGJ5dGVzIDAzIGFuZCBGRiBhcmUgY29tcHJlc3Npb24gdGVybWluYXRvcnMuCisgICAgICAgICAgICBpZiAoIWlzQ29udGludWF0aW9uKHZhbHVlKSAmJiAoYnl0ZXNbMV0gPT0gMyB8fCBieXRlc1sxXSA9PSAweEZGKSkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiV2FybmluZzogaW52YWxpZCBVQ0EgcHJpbWFyeSBzZWNvbmQgd2VpZ2h0IGJ5dGUgJTAyWCBmb3IgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1sxXSwgYnVmZmVyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKFVfRkFJTFVSRSgqc3RhdHVzKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInByb2JsZW0gcHV0dGluZyBzdHVmZiBpbiBoYXNoIHRhYmxlICVzXG4iLCB1X2Vycm9yTmFtZSgqc3RhdHVzKSk7CisgICAgICAgICpzdGF0dXMgPSBVX0lOVEVSTkFMX1BST0dSQU1fRVJST1I7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBlbGVtZW50OworfQorCisKK3ZvaWQgd3JpdGVPdXREYXRhKFVDQVRhYmxlSGVhZGVyICpkYXRhLAorICAgICAgICAgICAgICAgICAgVUNBQ29uc3RhbnRzICpjb25zdHMsCisgICAgICAgICAgICAgICAgICBMZWFkQnl0ZUNvbnN0YW50cyAqbGVhZEJ5dGVDb25zdGFudHMsCisgICAgICAgICAgICAgICAgICBVQ2hhciBjb250cmFjdGlvbnNbXVszXSwKKyAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5vT2Zjb250cmFjdGlvbnMsCisgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpvdXRwdXREaXIsCisgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpjb3B5cmlnaHQsCisgICAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICpzdGF0dXMpCit7CisgICAgaWYoVV9GQUlMVVJFKCpzdGF0dXMpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB1aW50MzJfdCBzaXplID0gZGF0YS0+c2l6ZTsKKworICAgIGRhdGEtPlVDQUNvbnN0cyA9IGRhdGEtPnNpemU7CisgICAgZGF0YS0+c2l6ZSArPSBwYWRkZWRzaXplKHNpemVvZihVQ0FDb25zdGFudHMpKTsKKworICAgIGlmKG5vT2Zjb250cmFjdGlvbnMgIT0gMCkgeworICAgICAgY29udHJhY3Rpb25zW25vT2Zjb250cmFjdGlvbnNdWzBdID0gMDsKKyAgICAgIGNvbnRyYWN0aW9uc1tub09mY29udHJhY3Rpb25zXVsxXSA9IDA7CisgICAgICBjb250cmFjdGlvbnNbbm9PZmNvbnRyYWN0aW9uc11bMl0gPSAwOworICAgICAgbm9PZmNvbnRyYWN0aW9ucysrOworCisKKyAgICAgIGRhdGEtPmNvbnRyYWN0aW9uVUNBQ29tYm9zID0gZGF0YS0+c2l6ZTsKKyAgICAgIGRhdGEtPmNvbnRyYWN0aW9uVUNBQ29tYm9zV2lkdGggPSAzOworICAgICAgZGF0YS0+Y29udHJhY3Rpb25VQ0FDb21ib3NTaXplID0gbm9PZmNvbnRyYWN0aW9uczsKKyAgICAgIGRhdGEtPnNpemUgKz0gcGFkZGVkc2l6ZSgobm9PZmNvbnRyYWN0aW9ucyozKnNpemVvZihVQ2hhcikpKTsKKyAgICB9CisgICAgZGF0YS0+c2NyaXB0VG9MZWFkQnl0ZSA9IGRhdGEtPnNpemU7CisgICAgLy9mcHJpbnRmKHN0ZG91dCwgIkBAQEAgc2NyaXB0IHRvIGxlYWQgYnl0ZSBvZmZzZXQgPSAweCV4ICglZClcbiIsIGRhdGEtPnNpemUsIGRhdGEtPnNpemUpOworICAgIGRhdGEtPnNpemUgKz0KKyAgICAgICAgc2l6ZW9mKGxlYWRCeXRlQ29uc3RhbnRzLT5TQ1JJUFRfVE9fTEVBRF9CWVRFU19JTkRFWF9DT1VOVCkgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmRleCB0YWJsZSBoZWFkZXIKKyAgICAgICAgbGVhZEJ5dGVDb25zdGFudHMtPlNDUklQVF9UT19MRUFEX0JZVEVTX0lOREVYX0NPVU5UICogc2l6ZW9mKGxlYWRCeXRlQ29uc3RhbnRzLT5TQ1JJUFRfVE9fTEVBRF9CWVRFU19JTkRFWFswXSkgKyAgICAvLyBpbmRleCB0YWJsZQorICAgICAgICBzaXplb2YobGVhZEJ5dGVDb25zdGFudHMtPlNDUklQVF9UT19MRUFEX0JZVEVTX0RBVEFfT0ZGU0VUKSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRhdGEgdGFibGUgaGVhZGVyCisgICAgICAgIGxlYWRCeXRlQ29uc3RhbnRzLT5TQ1JJUFRfVE9fTEVBRF9CWVRFU19EQVRBX09GRlNFVCAqIHNpemVvZihsZWFkQnl0ZUNvbnN0YW50cy0+U0NSSVBUX1RPX0xFQURfQllURVNfREFUQVswXSk7ICAgICAgICAvLyBkYXRhIHRhYmxlCisgICAgZGF0YS0+bGVhZEJ5dGVUb1NjcmlwdCA9IGRhdGEtPnNpemU7CisgICAgLy9mcHJpbnRmKHN0ZG91dCwgIkBAQEAgbGVhZCBieXRlIHRvIHNjcmlwdCBvZmZzZXQgPSAweCV4ICglZClcbiIsIGRhdGEtPnNpemUsIGRhdGEtPnNpemUpOworICAgIGRhdGEtPnNpemUgKz0KKyAgICAgICAgc2l6ZW9mKGxlYWRCeXRlQ29uc3RhbnRzLT5MRUFEX0JZVEVfVE9fU0NSSVBUU19JTkRFWF9MRU5HVEgpICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmRleCB0YWJsZSBoZWFkZXIKKyAgICAgICAgbGVhZEJ5dGVDb25zdGFudHMtPkxFQURfQllURV9UT19TQ1JJUFRTX0lOREVYX0xFTkdUSCAqIHNpemVvZihsZWFkQnl0ZUNvbnN0YW50cy0+TEVBRF9CWVRFX1RPX1NDUklQVFNfSU5ERVhbMF0pICsgICAvLyBpbmRleCB0YWJsZQorICAgICAgICBzaXplb2YobGVhZEJ5dGVDb25zdGFudHMtPkxFQURfQllURV9UT19TQ1JJUFRTX0RBVEFfT0ZGU0VUKSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRhdGEgdGFibGUgaGVhZGVyCisgICAgICAgIGxlYWRCeXRlQ29uc3RhbnRzLT5MRUFEX0JZVEVfVE9fU0NSSVBUU19EQVRBX09GRlNFVCAqIHNpemVvZihsZWFkQnl0ZUNvbnN0YW50cy0+TEVBRF9CWVRFX1RPX1NDUklQVFNfREFUQVswXSk7ICAgICAgICAvLyBkYXRhIHRhYmxlCisKKyAgICBVTmV3RGF0YU1lbW9yeSAqcERhdGE7CisgICAgCisgICAgbG9uZyBkYXRhTGVuZ3RoOworICAgIFVEYXRhSW5mbyB1Y2FJbmZvOworICAgIHVwcnZfbWVtY3B5KCZ1Y2FJbmZvLCAmdWNhRGF0YUluZm8sIHNpemVvZihVRGF0YUluZm8pKTsKKyAgICB1X2dldFVuaWNvZGVWZXJzaW9uKHVjYUluZm8uZGF0YVZlcnNpb24pOworCisgICAgcERhdGE9dWRhdGFfY3JlYXRlKG91dHB1dERpciwgVUNBX0RBVEFfVFlQRSwgVUNBX0RBVEFfTkFNRSwgJnVjYUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgIGNvcHlyaWdodCwgc3RhdHVzKTsKKworICAgIGlmKFVfRkFJTFVSRSgqc3RhdHVzKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiB1bmFibGUgdG8gY3JlYXRlICVzIlVDQV9EQVRBX05BTUUiLCBlcnJvciAlc1xuIiwgb3V0cHV0RGlyLCB1X2Vycm9yTmFtZSgqc3RhdHVzKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiB3cml0ZSB0aGUgZGF0YSB0byB0aGUgZmlsZSAqLworICAgIGlmIChWRVJCT1NFKSB7CisgICAgICAgIGZwcmludGYoc3Rkb3V0LCAiV3JpdGluZyBvdXQgVUNBIHRhYmxlOiAlcyVjJXMuJXNcbiIsIG91dHB1dERpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVV9GSUxFX1NFUF9DSEFSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVX0lDVURBVEFfTkFNRSAiXyIgVUNBX0RBVEFfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNBX0RBVEFfVFlQRSk7CisgICAgfQorICAgIHVkYXRhX3dyaXRlQmxvY2socERhdGEsIGRhdGEsIHNpemUpOworCisgICAgLy8gb3V0cHV0IHRoZSBjb25zdGFudHMgaGVyZQorICAgIHVkYXRhX3dyaXRlQmxvY2socERhdGEsIGNvbnN0cywgc2l6ZW9mKFVDQUNvbnN0YW50cykpOworCisgICAgaWYgKFZFUkJPU0UpIHsKKyAgICAgICAgZnByaW50ZihzdGRvdXQsICJmaXJzdCB0ZXJ0aWFyeSBpZ25vcmFibGUgPSAleCAleFxuIiwgY29uc3RzLT5VQ0FfRklSU1RfVEVSVElBUllfSUdOT1JBQkxFWzBdLCBjb25zdHMtPlVDQV9GSVJTVF9URVJUSUFSWV9JR05PUkFCTEVbMV0pOworICAgICAgICBmcHJpbnRmKHN0ZG91dCwgImxhc3QgdGVydGlhcnkgaWdub3JhYmxlID0gJXggJXhcbiIsIGNvbnN0cy0+VUNBX0xBU1RfVEVSVElBUllfSUdOT1JBQkxFWzBdLCBjb25zdHMtPlVDQV9MQVNUX1RFUlRJQVJZX0lHTk9SQUJMRVsxXSk7CisgICAgICAgIGZwcmludGYoc3Rkb3V0LCAiZmlyc3Qgc2Vjb25kYXJ5IGlnbm9yYWJsZSA9ICV4ICV4XG4iLCBjb25zdHMtPlVDQV9GSVJTVF9TRUNPTkRBUllfSUdOT1JBQkxFWzBdLCBjb25zdHMtPlVDQV9GSVJTVF9TRUNPTkRBUllfSUdOT1JBQkxFWzFdKTsKKyAgICAgICAgZnByaW50ZihzdGRvdXQsICJjb250cmFjdGlvblVDQUNvbWJvc1NpemUgPSAlZFxuIiwgZGF0YS0+Y29udHJhY3Rpb25VQ0FDb21ib3NTaXplKTsKKyAgICAgICAgZnByaW50ZihzdGRvdXQsICJjb250cmFjdGlvblNpemUgPSAlZFxuIiwgZGF0YS0+Y29udHJhY3Rpb25TaXplKTsKKyAgICAgICAgZnByaW50ZihzdGRvdXQsICJudW1iZXIgb2YgVUNBIGNvbnRyYWN0aW9ucyA9ICVkXG4iLCBub09mY29udHJhY3Rpb25zKTsKKyAgICB9CisgICAgCisgICAgaWYobm9PZmNvbnRyYWN0aW9ucyAhPSAwKSB7CisgICAgICB1ZGF0YV93cml0ZUJsb2NrKHBEYXRhLCBjb250cmFjdGlvbnMsIG5vT2Zjb250cmFjdGlvbnMqMypzaXplb2YoVUNoYXIpKTsKKyAgICAgIHVkYXRhX3dyaXRlUGFkZGluZyhwRGF0YSwgcGFkZGVkc2l6ZSgobm9PZmNvbnRyYWN0aW9ucyozKnNpemVvZihVQ2hhcikpKSAtIG5vT2Zjb250cmFjdGlvbnMqMypzaXplb2YodWludDE2X3QpKTsKKyAgICB9CisKKyAgICAvLyBvdXRwdXQgdGhlIHNjcmlwdCB0byBsZWFkIGJ5dGVzIHRhYmxlIGhlcmUKKyAgICBpZiAoVkVSQk9TRSkgeworICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIldyaXRpbmcgU2NyaXB0IHRvIExlYWQgQnl0ZSBEYXRhXG4iKTsKKyAgICAgICAgZnByaW50ZihzdGRvdXQsICJcdGluZGV4IHRhYmxlIHNpemUgPSAleFxuIiwgbGVhZEJ5dGVDb25zdGFudHMtPlNDUklQVF9UT19MRUFEX0JZVEVTX0lOREVYX0NPVU5UKTsKKyAgICAgICAgZnByaW50ZihzdGRvdXQsICJcdGRhdGEgYmxvY2sgc2l6ZSA9ICV4XG4iLCBsZWFkQnl0ZUNvbnN0YW50cy0+U0NSSVBUX1RPX0xFQURfQllURVNfREFUQV9PRkZTRVQpOworICAgIH0KKyAgICB1ZGF0YV93cml0ZTE2KHBEYXRhLCBsZWFkQnl0ZUNvbnN0YW50cy0+U0NSSVBUX1RPX0xFQURfQllURVNfSU5ERVhfQ09VTlQpOworICAgIHVkYXRhX3dyaXRlMTYocERhdGEsIGxlYWRCeXRlQ29uc3RhbnRzLT5TQ1JJUFRfVE9fTEVBRF9CWVRFU19EQVRBX09GRlNFVCk7CisvLyAgICAgZnByaW50ZihzdGRvdXQsICIjIyMjIFNjcmlwdCB0byBMZWFkIEJ5dGUgSW5kZXggQmVmb3JlIFNvcnRcbiIpOworLy8gICAgIGZvciAoaW50IHJlb3JkZXJDb2RlSW5kZXggPSAwOyByZW9yZGVyQ29kZUluZGV4IDwgbGVhZEJ5dGVDb25zdGFudHMtPlNDUklQVF9UT19MRUFEX0JZVEVTX0lOREVYX0NPVU5UOyByZW9yZGVyQ29kZUluZGV4KyspIHsKKy8vICAgICAgICAgZnByaW50ZihzdGRvdXQsICJcdCUwNHggPSAlMDR4XG4iLCBsZWFkQnl0ZUNvbnN0YW50cy0+U0NSSVBUX1RPX0xFQURfQllURVNfSU5ERVhbcmVvcmRlckNvZGVJbmRleF0ucmVvcmRlckNvZGUsIGxlYWRCeXRlQ29uc3RhbnRzLT5TQ1JJUFRfVE9fTEVBRF9CWVRFU19JTkRFWFtyZW9yZGVyQ29kZUluZGV4XS5vZmZzZXQpOworLy8gICAgIH0KKyAgICBxc29ydChsZWFkQnl0ZUNvbnN0YW50cy0+U0NSSVBUX1RPX0xFQURfQllURVNfSU5ERVgsIGxlYWRCeXRlQ29uc3RhbnRzLT5TQ1JJUFRfVE9fTEVBRF9CWVRFU19JTkRFWF9DT1VOVCwgc2l6ZW9mKGxlYWRCeXRlQ29uc3RhbnRzLT5TQ1JJUFRfVE9fTEVBRF9CWVRFU19JTkRFWFswXSksIFJlb3JkZXJJbmRleENvbXBhcmVyKTsKKyAgICB1ZGF0YV93cml0ZUJsb2NrKHBEYXRhLCBsZWFkQnl0ZUNvbnN0YW50cy0+U0NSSVBUX1RPX0xFQURfQllURVNfSU5ERVgsIGxlYWRCeXRlQ29uc3RhbnRzLT5TQ1JJUFRfVE9fTEVBRF9CWVRFU19JTkRFWF9DT1VOVCAqIHNpemVvZihsZWFkQnl0ZUNvbnN0YW50cy0+U0NSSVBUX1RPX0xFQURfQllURVNfSU5ERVhbMF0pKTsKKy8vICAgICBmcHJpbnRmKHN0ZG91dCwgIiMjIyMgU2NyaXB0IHRvIExlYWQgQnl0ZSBJbmRleCBBZnRlciBTb3J0XG4iKTsKKy8vICAgICBmb3IgKGludCByZW9yZGVyQ29kZUluZGV4ID0gMDsgcmVvcmRlckNvZGVJbmRleCA8IGxlYWRCeXRlQ29uc3RhbnRzLT5TQ1JJUFRfVE9fTEVBRF9CWVRFU19JTkRFWF9DT1VOVDsgcmVvcmRlckNvZGVJbmRleCsrKSB7CisvLyAgICAgICAgIGZwcmludGYoc3Rkb3V0LCAiXHQlMDR4ID0gJTA0eFxuIiwgbGVhZEJ5dGVDb25zdGFudHMtPlNDUklQVF9UT19MRUFEX0JZVEVTX0lOREVYW3Jlb3JkZXJDb2RlSW5kZXhdLnJlb3JkZXJDb2RlLCBsZWFkQnl0ZUNvbnN0YW50cy0+U0NSSVBUX1RPX0xFQURfQllURVNfSU5ERVhbcmVvcmRlckNvZGVJbmRleF0ub2Zmc2V0KTsKKy8vICAgICB9CisgICAgCisgICAgLy8gd3JpdGUgb3V0IHRoZSBzY3JpcHQgdG8gbGVhZCBieXRlcyBkYXRhIGJsb2NrCisgICAgdWRhdGFfd3JpdGVCbG9jayhwRGF0YSwgbGVhZEJ5dGVDb25zdGFudHMtPlNDUklQVF9UT19MRUFEX0JZVEVTX0RBVEEsIGxlYWRCeXRlQ29uc3RhbnRzLT5TQ1JJUFRfVE9fTEVBRF9CWVRFU19EQVRBX09GRlNFVCAqIHNpemVvZigqbGVhZEJ5dGVDb25zdGFudHMtPlNDUklQVF9UT19MRUFEX0JZVEVTX0RBVEEpKTsKKyAgICAKKyAgICBpZiAoVkVSQk9TRSkgeworICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIldyaXRpbmcgTGVhZCBCeXRlIFRvIFNjcmlwdCBEYXRhXG4iKTsKKyAgICAgICAgZnByaW50ZihzdGRvdXQsICJcdGluZGV4IHRhYmxlIHNpemUgPSAleFxuIiwgbGVhZEJ5dGVDb25zdGFudHMtPkxFQURfQllURV9UT19TQ1JJUFRTX0lOREVYX0xFTkdUSCk7CisgICAgICAgIGZwcmludGYoc3Rkb3V0LCAiXHRkYXRhIGJsb2NrIHNpemUgPSAleFxuIiwgbGVhZEJ5dGVDb25zdGFudHMtPkxFQURfQllURV9UT19TQ1JJUFRTX0RBVEFfT0ZGU0VUKTsKKyAgICB9CisgICAgLy8gb3V0cHV0IHRoZSBoZWFkZXIgaW5mbworICAgIHVkYXRhX3dyaXRlMTYocERhdGEsIGxlYWRCeXRlQ29uc3RhbnRzLT5MRUFEX0JZVEVfVE9fU0NSSVBUU19JTkRFWF9MRU5HVEgpOworICAgIHVkYXRhX3dyaXRlMTYocERhdGEsIGxlYWRCeXRlQ29uc3RhbnRzLT5MRUFEX0JZVEVfVE9fU0NSSVBUU19EQVRBX09GRlNFVCk7CisgICAgCisgICAgLy8gb3V0cHV0IHRoZSBpbmRleCB0YWJsZQorICAgIHVkYXRhX3dyaXRlQmxvY2socERhdGEsIGxlYWRCeXRlQ29uc3RhbnRzLT5MRUFEX0JZVEVfVE9fU0NSSVBUU19JTkRFWCwgCisgICAgICAgIGxlYWRCeXRlQ29uc3RhbnRzLT5MRUFEX0JZVEVfVE9fU0NSSVBUU19JTkRFWF9MRU5HVEggKiBzaXplb2YobGVhZEJ5dGVDb25zdGFudHMtPkxFQURfQllURV9UT19TQ1JJUFRTX0lOREVYKVswXSk7CisvLyAgICAgZm9yIChpbnQgbGVhZEJ5dGUgPSAwOyBsZWFkQnl0ZSA8IGxlYWRCeXRlQ29uc3RhbnRzLT5MRUFEX0JZVEVfVE9fU0NSSVBUU19JTkRFWF9MRU5HVEg7IGxlYWRCeXRlKyspIHsKKy8vICAgICAgICAgZnByaW50ZihzdGRvdXQsICJcdCUwMnggPSAlMDR4XG4iLCBsZWFkQnl0ZSwgbGVhZEJ5dGVDb25zdGFudHMtPkxFQURfQllURV9UT19TQ1JJUFRTX0lOREVYW2xlYWRCeXRlXSk7CisvLyAgICAgfQorCisgICAgLy8gb3V0cHV0IHRoZSBkYXRhCisgICAgdWRhdGFfd3JpdGVCbG9jayhwRGF0YSwgbGVhZEJ5dGVDb25zdGFudHMtPkxFQURfQllURV9UT19TQ1JJUFRTX0RBVEEsIAorICAgICAgICBsZWFkQnl0ZUNvbnN0YW50cy0+TEVBRF9CWVRFX1RPX1NDUklQVFNfREFUQV9PRkZTRVQgKiBzaXplb2YoKmxlYWRCeXRlQ29uc3RhbnRzLT5MRUFEX0JZVEVfVE9fU0NSSVBUU19EQVRBKSk7CisKKyAgICAKKyAgICAvKiBmaW5pc2ggdXAgKi8KKyAgICBkYXRhTGVuZ3RoPXVkYXRhX2ZpbmlzaChwRGF0YSwgc3RhdHVzKTsKKyAgICBpZihVX0ZBSUxVUkUoKnN0YXR1cykpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvcjogZXJyb3IgJWQgd3JpdGluZyB0aGUgb3V0cHV0IGZpbGVcbiIsICpzdGF0dXMpOworICAgICAgICByZXR1cm47CisgICAgfQorfQorCitlbnVtIHsKKyAgICAvKgorICAgICAqIE1heGltdW0gbnVtYmVyIG9mIFVDQSBjb250cmFjdGlvbnMgd2UgY2FuIHN0b3JlLgorICAgICAqIE1heSBuZWVkIHRvIGJlIGluY3JlYXNlZCBmb3IgYSBuZXcgVW5pY29kZSB2ZXJzaW9uLgorICAgICAqLworICAgIE1BWF9VQ0FfQ09OVFJBQ1RJT05fQ0VTPTIwNDgKK307CisKK3N0YXRpYyBpbnQzMl90Cit3cml0ZV91Y2FfdGFibGUoY29uc3QgY2hhciAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqb3V0cHV0RGlyLAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvcHlyaWdodCwKKyAgICAgICAgICAgICAgICBVRXJyb3JDb2RlICpzdGF0dXMpCit7CisgICAgRklMRSAqZGF0YSA9IGZvcGVuKGZpbGVuYW1lLCAiciIpOworICAgIGlmKGRhdGEgPT0gTlVMTCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkbid0IG9wZW4gZmlsZTogJXNcbiIsIGZpbGVuYW1lKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB1aW50MzJfdCBsaW5lID0gMDsKKyAgICBVQ0FFbGVtZW50cyAqZWxlbWVudCA9IE5VTEw7CisgICAgVUNBVGFibGVIZWFkZXIgKm15RCA9IChVQ0FUYWJsZUhlYWRlciAqKXVwcnZfbWFsbG9jKHNpemVvZihVQ0FUYWJsZUhlYWRlcikpOworICAgIC8qIHRlc3QgZm9yIE5VTEwgKi8KKyAgICBpZihteUQgPT0gTlVMTCkgeworICAgICAgICAqc3RhdHVzID0gVV9NRU1PUllfQUxMT0NBVElPTl9FUlJPUjsKKyAgICAgICAgZmNsb3NlKGRhdGEpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgdXBydl9tZW1zZXQobXlELCAwLCBzaXplb2YoVUNBVGFibGVIZWFkZXIpKTsKKyAgICBVQ29sT3B0aW9uU2V0ICpvcHRzID0gKFVDb2xPcHRpb25TZXQgKil1cHJ2X21hbGxvYyhzaXplb2YoVUNvbE9wdGlvblNldCkpOworICAgIC8qIHRlc3QgZm9yIE5VTEwgKi8KKyAgICBpZihvcHRzID09IE5VTEwpIHsKKyAgICAgICAgKnN0YXR1cyA9IFVfTUVNT1JZX0FMTE9DQVRJT05fRVJST1I7CisgICAgICAgIHVwcnZfZnJlZShteUQpOworICAgICAgICBmY2xvc2UoZGF0YSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICB1cHJ2X21lbXNldChvcHRzLCAwLCBzaXplb2YoVUNvbE9wdGlvblNldCkpOworICAgIFVDaGFyIGNvbnRyYWN0aW9uQ0VzW01BWF9VQ0FfQ09OVFJBQ1RJT05fQ0VTXVszXTsKKyAgICB1cHJ2X21lbXNldChjb250cmFjdGlvbkNFcywgMCwgc2l6ZW9mKGNvbnRyYWN0aW9uQ0VzKSk7CisgICAgdWludDMyX3Qgbm9PZkNvbnRyYWN0aW9ucyA9IDA7CisgICAgVUNBQ29uc3RhbnRzIGNvbnN0czsKKyAgICB1cHJ2X21lbXNldCgmY29uc3RzLCAwLCBzaXplb2YoY29uc3RzKSk7CisjaWYgMAorICAgIFVDQUNvbnN0YW50cyBjb25zdHMgPSB7CisgICAgICBVQ09MX1JFU0VUX1RPUF9WQUxVRSwKKyAgICAgIFVDT0xfRklSU1RfUFJJTUFSWV9JR05PUkFCTEUsCisgICAgICBVQ09MX0xBU1RfUFJJTUFSWV9JR05PUkFCTEUsCisgICAgICBVQ09MX0xBU1RfUFJJTUFSWV9JR05PUkFCTEVfQ09OVCwKKyAgICAgIFVDT0xfRklSU1RfU0VDT05EQVJZX0lHTk9SQUJMRSwKKyAgICAgIFVDT0xfTEFTVF9TRUNPTkRBUllfSUdOT1JBQkxFLAorICAgICAgVUNPTF9GSVJTVF9URVJUSUFSWV9JR05PUkFCTEUsCisgICAgICBVQ09MX0xBU1RfVEVSVElBUllfSUdOT1JBQkxFLAorICAgICAgVUNPTF9GSVJTVF9WQVJJQUJMRSwKKyAgICAgIFVDT0xfTEFTVF9WQVJJQUJMRSwKKyAgICAgIFVDT0xfRklSU1RfTk9OX1ZBUklBQkxFLAorICAgICAgVUNPTF9MQVNUX05PTl9WQVJJQUJMRSwKKworICAgICAgVUNPTF9ORVhUX1RPUF9WQUxVRSwKKy8qCisgICAgICBVQ09MX05FWFRfRklSU1RfUFJJTUFSWV9JR05PUkFCTEUsCisgICAgICBVQ09MX05FWFRfTEFTVF9QUklNQVJZX0lHTk9SQUJMRSwKKyAgICAgIFVDT0xfTkVYVF9GSVJTVF9TRUNPTkRBUllfSUdOT1JBQkxFLAorICAgICAgVUNPTF9ORVhUX0xBU1RfU0VDT05EQVJZX0lHTk9SQUJMRSwKKyAgICAgIFVDT0xfTkVYVF9GSVJTVF9URVJUSUFSWV9JR05PUkFCTEUsCisgICAgICBVQ09MX05FWFRfTEFTVF9URVJUSUFSWV9JR05PUkFCTEUsCisgICAgICBVQ09MX05FWFRfRklSU1RfVkFSSUFCTEUsCisgICAgICBVQ09MX05FWFRfTEFTVF9WQVJJQUJMRSwKKyovCisKKyAgICAgIFBSSU1BUllfSU1QTElDSVRfTUlOLAorICAgICAgUFJJTUFSWV9JTVBMSUNJVF9NQVgKKyAgICB9OworI2VuZGlmCisKKyAgICAvL2ZwcmludGYoc3Rkb3V0LCAiQWxsb2NhdGluZyBMZWFkQnl0ZUNvbnN0YW50c1xuIik7CisgICAgTGVhZEJ5dGVDb25zdGFudHMgbGVhZEJ5dGVDb25zdGFudHM7CisgICAgdXBydl9tZW1zZXQoJmxlYWRCeXRlQ29uc3RhbnRzLCAweDAwLCBzaXplb2YoTGVhZEJ5dGVDb25zdGFudHMpKTsKKyAgICAKKyAgICBsZWFkQnl0ZUNvbnN0YW50cy5TQ1JJUFRfVE9fTEVBRF9CWVRFU19JTkRFWF9MRU5HVEggPSAyNTY7CisgICAgbGVhZEJ5dGVDb25zdGFudHMuU0NSSVBUX1RPX0xFQURfQllURVNfSU5ERVggPSAoUmVvcmRlckluZGV4KikgdXBydl9tYWxsb2MobGVhZEJ5dGVDb25zdGFudHMuU0NSSVBUX1RPX0xFQURfQllURVNfSU5ERVhfTEVOR1RIICogc2l6ZW9mKFJlb3JkZXJJbmRleCkpOworICAgIHVwcnZfbWVtc2V0KGxlYWRCeXRlQ29uc3RhbnRzLlNDUklQVF9UT19MRUFEX0JZVEVTX0lOREVYLCAweDAwLCBsZWFkQnl0ZUNvbnN0YW50cy5TQ1JJUFRfVE9fTEVBRF9CWVRFU19JTkRFWF9MRU5HVEggKiBzaXplb2YoUmVvcmRlckluZGV4KSk7CisgICAgbGVhZEJ5dGVDb25zdGFudHMuU0NSSVBUX1RPX0xFQURfQllURVNfREFUQV9MRU5HVEggPSAxMDI0OworICAgIGxlYWRCeXRlQ29uc3RhbnRzLlNDUklQVF9UT19MRUFEX0JZVEVTX0RBVEEgPSAodWludDE2X3QqKSB1cHJ2X21hbGxvYyhsZWFkQnl0ZUNvbnN0YW50cy5TQ1JJUFRfVE9fTEVBRF9CWVRFU19EQVRBX0xFTkdUSCAqIHNpemVvZih1aW50MTZfdCkpOworICAgIHVwcnZfbWVtc2V0KGxlYWRCeXRlQ29uc3RhbnRzLlNDUklQVF9UT19MRUFEX0JZVEVTX0RBVEEsIDB4MDAsIGxlYWRCeXRlQ29uc3RhbnRzLlNDUklQVF9UT19MRUFEX0JZVEVTX0RBVEFfTEVOR1RIICogc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgLy9mcHJpbnRmKHN0ZG91dCwgIlx0RmluaXNoZWQgQWxsb2NhdGluZyBMZWFkQnl0ZUNvbnN0YW50c1xuIik7CisgICAgCisgICAgbGVhZEJ5dGVDb25zdGFudHMuTEVBRF9CWVRFX1RPX1NDUklQVFNfSU5ERVhfTEVOR1RIID0gMjU2OworICAgIGxlYWRCeXRlQ29uc3RhbnRzLkxFQURfQllURV9UT19TQ1JJUFRTX0lOREVYID0gKHVpbnQxNl90KikgdXBydl9tYWxsb2MobGVhZEJ5dGVDb25zdGFudHMuTEVBRF9CWVRFX1RPX1NDUklQVFNfSU5ERVhfTEVOR1RIICogc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgdXBydl9tZW1zZXQobGVhZEJ5dGVDb25zdGFudHMuTEVBRF9CWVRFX1RPX1NDUklQVFNfSU5ERVgsIDB4ODAwMCB8IFVTQ1JJUFRfSU5WQUxJRF9DT0RFLCBsZWFkQnl0ZUNvbnN0YW50cy5MRUFEX0JZVEVfVE9fU0NSSVBUU19JTkRFWF9MRU5HVEggKiBzaXplb2YodWludDE2X3QpKTsKKyAgICBsZWFkQnl0ZUNvbnN0YW50cy5MRUFEX0JZVEVfVE9fU0NSSVBUU19EQVRBX0xFTkdUSCA9IDEwMjQ7CisgICAgbGVhZEJ5dGVDb25zdGFudHMuTEVBRF9CWVRFX1RPX1NDUklQVFNfREFUQV9PRkZTRVQgPSAxOyAgICAgLy8gb2Zmc2V0IGJ5IDEgdG8gbGVhdmUgemVybyBsb2NhdGlvbiBmb3IgdGhvc2UgbGVhZCBieXRlcyB3aXRoIG5vIHJlb3JkZXIgY29kZXMKKyAgICBsZWFkQnl0ZUNvbnN0YW50cy5MRUFEX0JZVEVfVE9fU0NSSVBUU19EQVRBID0gKHVpbnQxNl90KikgdXBydl9tYWxsb2MobGVhZEJ5dGVDb25zdGFudHMuTEVBRF9CWVRFX1RPX1NDUklQVFNfREFUQV9MRU5HVEggKiBzaXplb2YodWludDE2X3QpKTsKKyAgICB1cHJ2X21lbXNldChsZWFkQnl0ZUNvbnN0YW50cy5MRUFEX0JZVEVfVE9fU0NSSVBUU19EQVRBLCAweDAwLCBsZWFkQnl0ZUNvbnN0YW50cy5MRUFEX0JZVEVfVE9fU0NSSVBUU19EQVRBX0xFTkdUSCAqIHNpemVvZih1aW50MTZfdCkpOworCisgICAgdXBydl9tZW1zZXQoaW52ZXJzZVRhYmxlLCAweERBLCBzaXplb2YoaW50MzJfdCkqMyoweEZGRkYpOworCisgICAgb3B0cy0+dmFyaWFibGVUb3BWYWx1ZSA9IDA7CisgICAgb3B0cy0+c3RyZW5ndGggPSBVQ09MX1RFUlRJQVJZOworICAgIG9wdHMtPmZyZW5jaENvbGxhdGlvbiA9IFVDT0xfT0ZGOworICAgIG9wdHMtPmFsdGVybmF0ZUhhbmRsaW5nID0gVUNPTF9OT05fSUdOT1JBQkxFOyAvKiBhdHRyaWJ1dGUgZm9yIGhhbmRsaW5nIHZhcmlhYmxlIGVsZW1lbnRzKi8KKyAgICBvcHRzLT5jYXNlRmlyc3QgPSBVQ09MX09GRjsgICAgICAgICAvKiB3aG8gZ29lcyBmaXJzdCwgbG93ZXIgY2FzZSBvciB1cHBlcmNhc2UgKi8KKyAgICBvcHRzLT5jYXNlTGV2ZWwgPSBVQ09MX09GRjsgICAgICAgICAvKiBkbyB3ZSBoYXZlIGFuIGV4dHJhIGNhc2UgbGV2ZWwgKi8KKyAgICBvcHRzLT5ub3JtYWxpemF0aW9uTW9kZSA9IFVDT0xfT0ZGOyAvKiBhdHRyaWJ1dGUgZm9yIG5vcm1hbGl6YXRpb24gKi8KKyAgICBvcHRzLT5oaXJhZ2FuYVEgPSBVQ09MX09GRjsgLyogYXR0cmlidXRlIGZvciBKSVMgWCA0MDYxLCB1c2VkIG9ubHkgaW4gSmFwYW5lc2UgKi8KKyAgICBvcHRzLT5udW1lcmljQ29sbGF0aW9uID0gVUNPTF9PRkY7CisgICAgbXlELT5qYW1vU3BlY2lhbCA9IEZBTFNFOworCisgICAgdGVtcFVDQVRhYmxlICp0ID0gdXBydl91Y2FfaW5pdFRlbXBUYWJsZShteUQsIG9wdHMsIE5VTEwsIElNUExJQ0lUX1RBRywgTEVBRF9TVVJST0dBVEVfVEFHLCBzdGF0dXMpOworICAgIGlmKFVfRkFJTFVSRSgqc3RhdHVzKSkKKyAgICB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGluaXQgVUNBIHRlbXAgdGFibGU6ICVzXG4iLCB1X2Vycm9yTmFtZSgqc3RhdHVzKSk7CisgICAgICAgIHVwcnZfZnJlZShvcHRzKTsKKyAgICAgICAgdXBydl9mcmVlKG15RCk7CisgICAgICAgIGZjbG9zZShkYXRhKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8vICogc2V0IHRvIHplcm8KKyAgICBzdHJ1Y3QgeworICAgICAgICBVQ2hhcjMyIHN0YXJ0OworICAgICAgICBVQ2hhcjMyIGVuZDsKKyAgICAgICAgaW50MzJfdCB2YWx1ZTsKKyAgICB9IHJhbmdlc1tdID0KKyAgICB7CisgICAgICAgIHsweEFDMDAsIDB4RDdCMCwgVUNPTF9TUEVDSUFMX0ZMQUcgfCAoSEFOR1VMX1NZTExBQkxFX1RBRyA8PCAyNCkgfSwgIC8vMCBIQU5HVUxfU1lMTEFCTEVfVEFHLC8qIEFDMDAtRDdBRiovCisgICAgICAgIC8vezB4RDgwMCwgMHhEQzAwLCBVQ09MX1NQRUNJQUxfRkxBRyB8IChMRUFEX1NVUlJPR0FURV9UQUcgPDwgMjQpICB9LCAgLy8xIExFQURfU1VSUk9HQVRFX1RBRywgYWxyZWFkeSBzZXQgaW4gdXRyaWVfb3BlbigpIC8qIEQ4MDAtREJGRiovCisgICAgICAgIHsweERDMDAsIDB4RTAwMCwgVUNPTF9TUEVDSUFMX0ZMQUcgfCAoVFJBSUxfU1VSUk9HQVRFX1RBRyA8PCAyNCkgfSwgIC8vMiBUUkFJTF9TVVJST0dBVEUgREMwMC1ERkZGCisgICAgICAgIC8vIE5vdyBkaXJlY3RseSBoYW5kbGVkIGluIHRoZSBjb2xsYXRpb24gY29kZSBieSB0aGUgc3dhcENKSyBmdW5jdGlvbi4KKyAgICAgICAgLy97MHgzNDAwLCAweDREQjYsIFVDT0xfU1BFQ0lBTF9GTEFHIHwgKENKS19JTVBMSUNJVF9UQUcgPDwgMjQpICAgIH0sICAvLzMgQ0pLX0lNUExJQ0lUX1RBRywgICAvKiAweDM0MDAtMHg0REI1Ki8KKyAgICAgICAgLy97MHg0RTAwLCAweDlGQTYsIFVDT0xfU1BFQ0lBTF9GTEFHIHwgKENKS19JTVBMSUNJVF9UQUcgPDwgMjQpICAgIH0sICAvLzQgQ0pLX0lNUExJQ0lUX1RBRywgICAvKiAweDRFMDAtMHg5RkE1Ki8KKyAgICAgICAgLy97MHhGOTAwLCAweEZBMkUsIFVDT0xfU1BFQ0lBTF9GTEFHIHwgKENKS19JTVBMSUNJVF9UQUcgPDwgMjQpICAgIH0sICAvLzUgQ0pLX0lNUExJQ0lUX1RBRywgICAvKiAweEY5MDAtMHhGQTJEKi8KKyAgICAgICAgLy97MHgyMDAwMCwgMHgyQTZENywgVUNPTF9TUEVDSUFMX0ZMQUcgfCAoQ0pLX0lNUExJQ0lUX1RBRyA8PCAyNCkgIH0sICAvLzYgQ0pLX0lNUExJQ0lUX1RBRywgICAvKiAweDIwMDAwLTB4MkE2RDYqLworICAgICAgICAvL3sweDJGODAwLCAweDJGQTFFLCBVQ09MX1NQRUNJQUxfRkxBRyB8IChDSktfSU1QTElDSVRfVEFHIDw8IDI0KSAgfSwgIC8vNyBDSktfSU1QTElDSVRfVEFHLCAgIC8qIDB4MkY4MDAtMHgyRkExRCovCisgICAgfTsKKyAgICB1aW50MzJfdCBpID0gMDsKKworICAgIGZvcihpID0gMDsgaTxzaXplb2YocmFuZ2VzKS9zaXplb2YocmFuZ2VzWzBdKTsgaSsrKSB7CisgICAgICAvKnVjbXBlMzJfc2V0UmFuZ2UzMih0LT5tYXBwaW5nLCByYW5nZXNbaV0uc3RhcnQsIHJhbmdlc1tpXS5lbmQsIHJhbmdlc1tpXS52YWx1ZSk7ICovCisgICAgICB1dHJpZV9zZXRSYW5nZTMyKHQtPm1hcHBpbmcsIHJhbmdlc1tpXS5zdGFydCwgcmFuZ2VzW2ldLmVuZCwgcmFuZ2VzW2ldLnZhbHVlLCBUUlVFKTsKKyAgICB9CisKKworICAgIGludDMyX3Qgc3Vycm9nYXRlQ291bnQgPSAwOworICAgIHdoaWxlKCFmZW9mKGRhdGEpKSB7CisgICAgICAgIGlmKFVfRkFJTFVSRSgqc3RhdHVzKSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJTb21ldGhpbmcgcmV0dXJuZWQgYW4gZXJyb3IgJWkgKCVzKSB3aGlsZSBwcm9jZXNzaW5nIGxpbmUgJXUgb2YgJXMuIEV4aXRpbmcuLi5cbiIsCisgICAgICAgICAgICAgICAgKnN0YXR1cywgdV9lcnJvck5hbWUoKnN0YXR1cyksIChpbnQpbGluZSwgZmlsZW5hbWUpOworICAgICAgICAgICAgZXhpdCgqc3RhdHVzKTsKKyAgICAgICAgfQorCisgICAgICAgIGxpbmUrKzsKKyAgICAgICAgaWYoVkVSQk9TRSkgeworICAgICAgICAgIGZwcmludGYoc3Rkb3V0LCAiJXUgIiwgKGludClsaW5lKTsKKyAgICAgICAgfQorICAgICAgICBlbGVtZW50ID0gcmVhZEFuRWxlbWVudChkYXRhLCB0LCAmY29uc3RzLCAmbGVhZEJ5dGVDb25zdGFudHMsIHN0YXR1cyk7CisgICAgICAgIGlmKGVsZW1lbnQgIT0gTlVMTCkgeworICAgICAgICAgICAgLy8gd2UgaGF2ZSByZWFkIHRoZSBsaW5lLCBub3cgZG8gc29tZXRoaW5nIHNlbnNpYmxlIHdpdGggdGhlIHJlYWQgZGF0YSEKKworICAgICAgICAgICAgLy8gaWYgZWxlbWVudCBpcyBhIGNvbnRyYWN0aW9uLCB3ZSB3YW50IHRvIGFkZCBpdCB0byBjb250cmFjdGlvbnMKKyAgICAgICAgICAgIGlmKGVsZW1lbnQtPmNTaXplID4gMSAmJiBlbGVtZW50LT5jUG9pbnRzWzBdICE9IDB4RkREMCkgeyAvLyB0aGlzIGlzIGEgY29udHJhY3Rpb24KKyAgICAgICAgICAgICAgaWYoVVRGX0lTX0xFQUQoZWxlbWVudC0+Y1BvaW50c1swXSkgJiYgVVRGX0lTX1RSQUlMKGVsZW1lbnQtPmNQb2ludHNbMV0pICYmIGVsZW1lbnQtPmNTaXplID09IDIpIHsKKyAgICAgICAgICAgICAgICBzdXJyb2dhdGVDb3VudCsrOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmKG5vT2ZDb250cmFjdGlvbnM+PU1BWF9VQ0FfQ09OVFJBQ1RJT05fQ0VTKSB7CisgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuTW9yZSB0aGFuICVkIGNvbnRyYWN0aW9ucy4gUGxlYXNlIGluY3JlYXNlIE1BWF9VQ0FfQ09OVFJBQ1RJT05fQ0VTIGluIGdlbnVjYS5jcHAuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4aXRpbmcuLi5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpTUFYX1VDQV9DT05UUkFDVElPTl9DRVMpOworICAgICAgICAgICAgICAgICAgZXhpdCgqc3RhdHVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29udHJhY3Rpb25DRXNbbm9PZkNvbnRyYWN0aW9uc11bMF0gPSBlbGVtZW50LT5jUG9pbnRzWzBdOworICAgICAgICAgICAgICAgIGNvbnRyYWN0aW9uQ0VzW25vT2ZDb250cmFjdGlvbnNdWzFdID0gZWxlbWVudC0+Y1BvaW50c1sxXTsKKyAgICAgICAgICAgICAgICBpZihlbGVtZW50LT5jU2l6ZSA+IDIpIHsgLy8gdGhlIHRoaXJkIG9uZQorICAgICAgICAgICAgICAgICAgY29udHJhY3Rpb25DRXNbbm9PZkNvbnRyYWN0aW9uc11bMl0gPSBlbGVtZW50LT5jUG9pbnRzWzJdOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICBjb250cmFjdGlvbkNFc1tub09mQ29udHJhY3Rpb25zXVsyXSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5vT2ZDb250cmFjdGlvbnMrKzsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETyAoY2xhaXJlaG8pOiBkb2VzIHRoaXMgd29yaz8gTmVlZCBtb3JlIHRlc3RzCisgICAgICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBjb2RlIGlzIHRvIGhhbmRsZSB0aGUgVUNBIHByZS1jb250ZXh0IHJ1bGVzCisgICAgICAgICAgICAgICAgLy8gZm9yIEwvbCB3aXRoIG1pZGRsZSBkb3QuIFdlIHNoYXJlIHRoZSBzdHJ1Y3R1cmVzIGZvciBjb250cmFjdGlvbkNvbWJvcy4KKyAgICAgICAgICAgICAgICAvLyBUaGUgZm9ybWF0IGZvciBwcmUtY29udGV4dCBjaGFyYWN0ZXIgaXMKKyAgICAgICAgICAgICAgICAvLyBjb250cmFjdGlvbkNFc1swXTogY29kZXBvaW50IGluIGVsZW1lbnQtPmNQb2ludHNbMF0KKyAgICAgICAgICAgICAgICAvLyBjb250cmFjdGlvbkNFc1sxXTogJ1wwJyB0byBkaWZmZXJlbnRpYXRlIHdpdGggY29udHJhY3Rpb25zLgorICAgICAgICAgICAgICAgIC8vIGNvbnRyYWN0aW9uQ0VzWzJdOiBwcmVmaXggY2hhcgorICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LT5wcmVmaXhTaXplPjApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoZWxlbWVudC0+Y1NpemUgPiAxIHx8IGVsZW1lbnQtPnByZWZpeFNpemUgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuQ2hhcmFjdGVyIHdpdGggcHJlZml4LCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlaXRoZXIgdG9vIG1hbnkgY2hhcmFjdGVycyBvciBwcmVmaXggdG9vIGxvbmcuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoKnN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYobm9PZkNvbnRyYWN0aW9ucz49TUFYX1VDQV9DT05UUkFDVElPTl9DRVMpIHsKKyAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbk1vcmUgdGhhbiAlZCBjb250cmFjdGlvbnMuIFBsZWFzZSBpbmNyZWFzZSBNQVhfVUNBX0NPTlRSQUNUSU9OX0NFUyBpbiBnZW51Y2EuY3BwLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhpdGluZy4uLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpTUFYX1VDQV9DT05UUkFDVElPTl9DRVMpOworICAgICAgICAgICAgICAgICAgICAgIGV4aXQoKnN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY29udHJhY3Rpb25DRXNbbm9PZkNvbnRyYWN0aW9uc11bMF09ZWxlbWVudC0+Y1BvaW50c1swXTsKKyAgICAgICAgICAgICAgICAgICAgY29udHJhY3Rpb25DRXNbbm9PZkNvbnRyYWN0aW9uc11bMV09J1wwJzsKKyAgICAgICAgICAgICAgICAgICAgY29udHJhY3Rpb25DRXNbbm9PZkNvbnRyYWN0aW9uc11bMl09ZWxlbWVudC0+cHJlZml4Q2hhcnNbMF07CisgICAgICAgICAgICAgICAgICAgIG5vT2ZDb250cmFjdGlvbnMrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIHdlJ3JlIGZpcnN0IGFkZGluZyB0byBpbnZlcnNlLCBiZWNhdXNlIGFkZEFuRWxlbWVudCB3aWxsIHJldmVyc2UgdGhlIG9yZGVyICovCisgICAgICAgICAgICAvKiBvZiBjb2RlIHBvaW50cyBhbmQgc3R1ZmYuLi4gd2UgZG9uJ3Qgd2FudCB0aGF0IHRvIGhhcHBlbiAqLworICAgICAgICAgICAgaWYoKGVsZW1lbnQtPkNFc1swXSA+PiAyNCkgIT0gMikgeworICAgICAgICAgICAgICAgIC8vIEFkZCBldmVyeSBlbGVtZW50IGV4Y2VwdCBmb3IgdGhlIHNwZWNpYWwgbWluaW11bS13ZWlnaHQgY2hhcmFjdGVyIFUrRkZGRQorICAgICAgICAgICAgICAgIC8vIHdoaWNoIGhhcyAwMiB3ZWlnaHRzLgorICAgICAgICAgICAgICAgIC8vIElmIHdlIGhhZCAwMiB3ZWlnaHRzIGluIHRoZSBpbnZ1Y2EgdGFibGUsIHRoZW4gdGFpbG9yaW5nIHByaW1hcnkKKyAgICAgICAgICAgICAgICAvLyBhZnRlciBhbiBpZ25vcmFibGUgd291bGQgdHJ5IHRvIHB1dCBhIHdlaWdodCBiZWZvcmUgMDIgd2hpY2ggaXMgbm90IHZhbGlkLgorICAgICAgICAgICAgICAgIC8vIFdlIGNvdWxkIGZpeCB0aGlzIGluIGEgY29tcGxpY2F0ZWQgd2F5IGluIHRoZSBmcm9tLXJ1bGUtc3RyaW5nIGJ1aWxkZXIsCisgICAgICAgICAgICAgICAgLy8gYnV0IG9taXR0aW5nIHRoaXMgc3BlY2lhbCBlbGVtZW50IGZyb20gaW52dWNhIGlzIHNpbXBsZSBhbmQgZWZmZWN0aXZlLgorICAgICAgICAgICAgICAgIGFkZFRvSW52ZXJzZShlbGVtZW50LCBzdGF0dXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoIShlbGVtZW50LT5jU2l6ZSA+IDEgJiYgZWxlbWVudC0+Y1BvaW50c1swXSA9PSAweEZERDApKSB7CisgICAgICAgICAgICAgIHVwcnZfdWNhX2FkZEFuRWxlbWVudCh0LCBlbGVtZW50LCBzdGF0dXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYoVUNBVmVyc2lvblswXSA9PSAwICYmIFVDQVZlcnNpb25bMV0gPT0gMCAmJiBVQ0FWZXJzaW9uWzJdID09IDAgJiYgVUNBVmVyc2lvblszXSA9PSAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVUNBIHZlcnNpb24gbm90IHNwZWNpZmllZC4gQ2Fubm90IGNyZWF0ZSBkYXRhIGZpbGUhXG4iKTsKKyAgICAgICAgdXBydl91Y2FfY2xvc2VUZW1wVGFibGUodCk7CisgICAgICAgIHVwcnZfZnJlZShvcHRzKTsKKyAgICAgICAgdXBydl9mcmVlKG15RCk7CisgICAgICAgIGZjbG9zZShkYXRhKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKy8qICAgIHsKKyAgICAgICAgdWludDMyX3QgdHJpZVdvcmQgPSB1dHJpZV9nZXQzMih0LT5tYXBwaW5nLCAweERDMDEsIE5VTEwpOworICAgIH0qLworCisgICAgaWYgKFZFUkJPU0UpIHsKKyAgICAgICAgZnByaW50ZihzdGRvdXQsICJcbkxpbmVzIHJlYWQ6ICV1XG4iLCAoaW50KWxpbmUpOworICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIlN1cnJvZ2F0ZSBjb3VudDogJWlcbiIsIChpbnQpc3Vycm9nYXRlQ291bnQpOworICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIlJhdyBkYXRhIGJyZWFrZG93bjpcbiIpOworICAgICAgICAvKmZwcmludGYoc3Rkb3V0LCAiQ29tcGFjdCBhcnJheSBzdGFnZTEgdG9wOiAlaSwgc3RhZ2UyIHRvcDogJWlcbiIsIHQtPm1hcHBpbmctPnN0YWdlMVRvcCwgdC0+bWFwcGluZy0+c3RhZ2UyVG9wKTsqLworICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIk51bWJlciBvZiBjb250cmFjdGlvbnM6ICV1XG4iLCAoaW50KW5vT2ZDb250cmFjdGlvbnMpOworICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIkNvbnRyYWN0aW9uIGltYWdlIHNpemU6ICV1XG4iLCAoaW50KXQtPmltYWdlLT5jb250cmFjdGlvblNpemUpOworICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIkV4cGFuc2lvbnMgc2l6ZTogJWlcbiIsIChpbnQpdC0+ZXhwYW5zaW9ucy0+cG9zaXRpb24pOworICAgIH0KKworCisgICAgLyogcHJvZHVjZSBjYW5vbmljYWwgY2xvc3VyZSBmb3IgdGFibGUgKi8KKyAgICAvKiBmaXJzdCBzZXQgdXAgY29uc3RhbnRzIGZvciBpbXBsaWNpdCBjYWxjdWxhdGlvbiAqLworICAgIHVwcnZfdWNhX2luaXRJbXBsaWNpdENvbnN0YW50cyhzdGF0dXMpOworICAgIC8qIGRvIHRoZSBjbG9zdXJlICovCisgICAgVW5pY29kZVNldCBjbG9zZWQ7CisgICAgaW50MzJfdCBub09mQ2xvc3VyZXMgPSB1cHJ2X3VjYV9jYW5vbmljYWxDbG9zdXJlKHQsIE5VTEwsICZjbG9zZWQsIHN0YXR1cyk7CisgICAgaWYobm9PZkNsb3N1cmVzICE9IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJXYXJuaW5nOiAlaSBjYW5vbmljYWwgY2xvc3VyZXMgb2NjdXJlZCFcbiIsIChpbnQpbm9PZkNsb3N1cmVzKTsKKyAgICAgICAgVW5pY29kZVN0cmluZyBwYXR0ZXJuOworICAgICAgICBzdGQ6OnN0cmluZyB1dGY4OworICAgICAgICBjbG9zZWQudG9QYXR0ZXJuKHBhdHRlcm4sIFRSVUUpLnRvVVRGOFN0cmluZyh1dGY4KTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJVVEYtOCBwYXR0ZXJuIHN0cmluZzogJXNcbiIsIHV0ZjguY19zdHIoKSk7CisgICAgfQorCisgICAgLyogdGVzdCAqLworICAgIFVDQVRhYmxlSGVhZGVyICpteURhdGEgPSB1cHJ2X3VjYV9hc3NlbWJsZVRhYmxlKHQsIHN0YXR1cyk7ICAKKworICAgIGlmIChWRVJCT1NFKSB7CisgICAgICAgIGZwcmludGYoc3Rkb3V0LCAiQ29tcGFjdGVkIGRhdGEgYnJlYWtkb3duOlxuIik7CisgICAgICAgIC8qZnByaW50ZihzdGRvdXQsICJDb21wYWN0IGFycmF5IHN0YWdlMSB0b3A6ICVpLCBzdGFnZTIgdG9wOiAlaVxuIiwgdC0+bWFwcGluZy0+c3RhZ2UxVG9wLCB0LT5tYXBwaW5nLT5zdGFnZTJUb3ApOyovCisgICAgICAgIGZwcmludGYoc3Rkb3V0LCAiTnVtYmVyIG9mIGNvbnRyYWN0aW9uczogJXVcbiIsIChpbnQpbm9PZkNvbnRyYWN0aW9ucyk7CisgICAgICAgIGZwcmludGYoc3Rkb3V0LCAiQ29udHJhY3Rpb24gaW1hZ2Ugc2l6ZTogJXVcbiIsIChpbnQpdC0+aW1hZ2UtPmNvbnRyYWN0aW9uU2l6ZSk7CisgICAgICAgIGZwcmludGYoc3Rkb3V0LCAiRXhwYW5zaW9ucyBzaXplOiAlaVxuIiwgKGludCl0LT5leHBhbnNpb25zLT5wb3NpdGlvbik7CisgICAgfQorCisgICAgaWYoVV9GQUlMVVJFKCpzdGF0dXMpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgY3JlYXRpbmcgdGFibGU6ICVzXG4iLCB1X2Vycm9yTmFtZSgqc3RhdHVzKSk7CisgICAgICAgIHVwcnZfdWNhX2Nsb3NlVGVtcFRhYmxlKHQpOworICAgICAgICB1cHJ2X2ZyZWUob3B0cyk7CisgICAgICAgIHVwcnZfZnJlZShteUQpOworICAgICAgICBmY2xvc2UoZGF0YSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBwb3B1bGF0ZSB0aGUgdmVyc2lvbiBpbmZvIHN0cnVjdCB3aXRoIHZlcnNpb24gaW5mbyovCisgICAgbXlEYXRhLT52ZXJzaW9uWzBdID0gVUNPTF9CVUlMREVSX1ZFUlNJT047CisgICAgbXlEYXRhLT52ZXJzaW9uWzFdID0gVUNBVmVyc2lvblswXTsKKyAgICBteURhdGEtPnZlcnNpb25bMl0gPSBVQ0FWZXJzaW9uWzFdOworICAgIG15RGF0YS0+dmVyc2lvblszXSA9IFVDQVZlcnNpb25bMl07CisgICAgLypUT0RPOlRoZSBmcmFjdGlvbmFsIHJ1bGVzIHZlcnNpb24gc2hvdWxkIGJlIHRha2VuIGZyb20gRnJhY3Rpb25hbFVDQS50eHQqLworICAgIC8vIFJlbW92ZWQgdGhpcyBtYWNyby4gSW5zdGVhZCwgd2UgdXNlIHRoZSBmaWVsZHMgYmVsb3cKKyAgICAvL215RC0+dmVyc2lvblsxXSA9IFVDT0xfRlJBQ1RJT05BTF9VQ0FfVkVSU0lPTjsKKyAgICAvL215RC0+VUNBVmVyc2lvbiA9IFVDQVZlcnNpb247IC8vIG91dCBvZiBGcmFjdGlvbmFsVUNBLnR4dAorICAgIHVwcnZfbWVtY3B5KG15RGF0YS0+VUNBVmVyc2lvbiwgVUNBVmVyc2lvbiwgc2l6ZW9mKFVWZXJzaW9uSW5mbykpOworICAgIHVfZ2V0VW5pY29kZVZlcnNpb24obXlEYXRhLT5VQ0RWZXJzaW9uKTsKKworICAgIHdyaXRlT3V0RGF0YShteURhdGEsICZjb25zdHMsICZsZWFkQnl0ZUNvbnN0YW50cywgY29udHJhY3Rpb25DRXMsIG5vT2ZDb250cmFjdGlvbnMsIG91dHB1dERpciwgY29weXJpZ2h0LCBzdGF0dXMpOworCisgICAgSW52ZXJzZVVDQVRhYmxlSGVhZGVyICppbnZlcnNlID0gYXNzZW1ibGVJbnZlcnNlVGFibGUoc3RhdHVzKTsKKyAgICB1cHJ2X21lbWNweShpbnZlcnNlLT5VQ0FWZXJzaW9uLCBVQ0FWZXJzaW9uLCBzaXplb2YoVVZlcnNpb25JbmZvKSk7CisgICAgd3JpdGVPdXRJbnZlcnNlRGF0YShpbnZlcnNlLCBvdXRwdXREaXIsIGNvcHlyaWdodCwgc3RhdHVzKTsKKworICAgIHVwcnZfdWNhX2Nsb3NlVGVtcFRhYmxlKHQpOworICAgIHVwcnZfZnJlZShteUQpOworICAgIHVwcnZfZnJlZShvcHRzKTsKKworICAgIHVwcnZfZnJlZShteURhdGEpOworICAgIHVwcnZfZnJlZShpbnZlcnNlKTsKKyAgICAKKyAgICB1cHJ2X2ZyZWUobGVhZEJ5dGVDb25zdGFudHMuTEVBRF9CWVRFX1RPX1NDUklQVFNfSU5ERVgpOworICAgIHVwcnZfZnJlZShsZWFkQnl0ZUNvbnN0YW50cy5MRUFEX0JZVEVfVE9fU0NSSVBUU19EQVRBKTsKKyAgICB1cHJ2X2ZyZWUobGVhZEJ5dGVDb25zdGFudHMuU0NSSVBUX1RPX0xFQURfQllURVNfSU5ERVgpOworICAgIHVwcnZfZnJlZShsZWFkQnl0ZUNvbnN0YW50cy5TQ1JJUFRfVE9fTEVBRF9CWVRFU19EQVRBKTsKKyAgICAKKyAgICBmY2xvc2UoZGF0YSk7CisKKyAgICByZXR1cm4gMDsKK30KKworI2VuZGlmIC8qICNpZiAhVUNPTkZJR19OT19DT0xMQVRJT04gKi8KKworc3RhdGljIFVPcHRpb24gb3B0aW9uc1tdPXsKKyAgICBVT1BUSU9OX0hFTFBfSCwgICAgICAgICAgICAgIC8qIDAgIE51bWJlcnMgZm9yIHRob3NlIHdobyovIAorICAgIFVPUFRJT05fSEVMUF9RVUVTVElPTl9NQVJLLCAgLyogMSAgIGNhbid0IGNvdW50LiAqLworICAgIFVPUFRJT05fQ09QWVJJR0hULCAgICAgICAgICAgLyogMiAqLworICAgIFVPUFRJT05fVkVSU0lPTiwgICAgICAgICAgICAgLyogMyAqLworICAgIFVPUFRJT05fREVTVERJUiwgICAgICAgICAgICAgLyogNCAqLworICAgIFVPUFRJT05fU09VUkNFRElSLCAgICAgICAgICAgLyogNSAqLworICAgIFVPUFRJT05fVkVSQk9TRSwgICAgICAgICAgICAgLyogNiAqLworICAgIFVPUFRJT05fSUNVREFUQURJUiAgICAgICAgICAgLyogNyAqLworICAgIC8qIHdlaXYgY2FuJ3QgY291bnQgOikpKSkpICovCit9OworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisgICAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisgICAgY29uc3QgY2hhciogZGVzdGRpciA9IE5VTEw7CisgICAgY29uc3QgY2hhciogc3JjRGlyID0gTlVMTDsKKyAgICBjaGFyIGZpbGVuYW1lWzMwMF07CisgICAgY2hhciAqYmFzZW5hbWUgPSBOVUxMOworICAgIGNvbnN0IGNoYXIgKmNvcHlyaWdodCA9IE5VTEw7CisgICAgdXBydl9tZW1zZXQoJlVDQVZlcnNpb24sIDAsIDQpOworCisgICAgVV9NQUlOX0lOSVRfQVJHUyhhcmdjLCBhcmd2KTsKKworICAgIC8qIHByZXNldCB0aGVuIHJlYWQgY29tbWFuZCBsaW5lIG9wdGlvbnMgKi8KKyAgICBvcHRpb25zWzRdLnZhbHVlPXVfZ2V0RGF0YURpcmVjdG9yeSgpOworICAgIG9wdGlvbnNbNV0udmFsdWU9IiI7CisgICAgYXJnYz11X3BhcnNlQXJncyhhcmdjLCBhcmd2LCBzaXplb2Yob3B0aW9ucykvc2l6ZW9mKG9wdGlvbnNbMF0pLCBvcHRpb25zKTsKKworICAgIC8qIGVycm9yIGhhbmRsaW5nLCBwcmludGluZyB1c2FnZSBtZXNzYWdlICovCisgICAgaWYoYXJnYzwwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgImVycm9yIGluIGNvbW1hbmQgbGluZSBhcmd1bWVudCBcIiVzXCJcbiIsCisgICAgICAgICAgICBhcmd2Wy1hcmdjXSk7CisgICAgfSBlbHNlIGlmKGFyZ2M8MikgeworICAgICAgICBhcmdjPS0xOworICAgIH0KKyAgICBpZihvcHRpb25zWzBdLmRvZXNPY2N1ciB8fCBvcHRpb25zWzFdLmRvZXNPY2N1cikgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICJ1c2FnZTogJXMgWy1vcHRpb25zXSBmaWxlXG4iCisgICAgICAgICAgICAiXHRSZWFkIGluIFVDQSBjb2xsYXRpb24gdGV4dCBkYXRhIGFuZCB3cml0ZSBvdXQgdGhlIGJpbmFyeSBjb2xsYXRpb24gZGF0YVxuIgorICAgICAgICAgICAgIm9wdGlvbnM6XG4iCisgICAgICAgICAgICAiXHQtaCBvciAtPyBvciAtLWhlbHAgIHRoaXMgdXNhZ2UgdGV4dFxuIgorICAgICAgICAgICAgIlx0LVYgb3IgLS12ZXJzaW9uICAgICBzaG93IGEgdmVyc2lvbiBtZXNzYWdlXG4iCisgICAgICAgICAgICAiXHQtYyBvciAtLWNvcHlyaWdodCAgIGluY2x1ZGUgYSBjb3B5cmlnaHQgbm90aWNlXG4iCisgICAgICAgICAgICAiXHQtZCBvciAtLWRlc3RkaXIgICAgIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSwgZm9sbG93ZWQgYnkgdGhlIHBhdGhcbiIKKyAgICAgICAgICAgICJcdC1zIG9yIC0tc291cmNlZGlyICAgc291cmNlIGRpcmVjdG9yeSwgZm9sbG93ZWQgYnkgdGhlIHBhdGhcbiIKKyAgICAgICAgICAgICJcdC12IG9yIC0tdmVyYm9zZSAgICAgdHVybiBvbiB2ZXJib3NlIG91dHB1dFxuIgorICAgICAgICAgICAgIlx0LWkgb3IgLS1pY3VkYXRhZGlyICBkaXJlY3RvcnkgZm9yIGxvY2F0aW5nIGFueSBuZWVkZWQgaW50ZXJtZWRpYXRlIGRhdGEgZmlsZXMsXG4iCisgICAgICAgICAgICAiXHQgICAgICAgICAgICAgICAgICAgIGZvbGxvd2VkIGJ5IHBhdGgsIGRlZmF1bHRzIHRvICVzXG4iLAorICAgICAgICAgICAgYXJndlswXSwgdV9nZXREYXRhRGlyZWN0b3J5KCkpOworICAgICAgICByZXR1cm4gYXJnYzwwID8gVV9JTExFR0FMX0FSR1VNRU5UX0VSUk9SIDogVV9aRVJPX0VSUk9SOworICAgIH0KKyAgICBpZihvcHRpb25zWzNdLmRvZXNPY2N1cikgeworICAgICAgICBmcHJpbnRmKHN0ZG91dCwgImdlbnVjYSB2ZXJzaW9uICVodS4laHUsIElDVSB0b29sIHRvIHJlYWQgVUNBIHRleHQgZGF0YSBhbmQgY3JlYXRlIFVDQSBkYXRhIHRhYmxlcyBmb3IgY29sbGF0aW9uLlxuIiwKKyNpZiBVQ09ORklHX05PX0NPTExBVElPTgorICAgICAgICAgICAgMCwgMAorI2Vsc2UKKyAgICAgICAgICAgIFVDQV9GT1JNQVRfVkVSU0lPTl8wLCBVQ0FfRk9STUFUX1ZFUlNJT05fMQorI2VuZGlmCisgICAgICAgICAgICApOworICAgICAgICBmcHJpbnRmKHN0ZG91dCwgVV9DT1BZUklHSFRfU1RSSU5HIlxuIik7CisgICAgICAgIGV4aXQoMCk7CisgICAgfQorCisgICAgLyogZ2V0IHRoZSBvcHRpb25zIHZhbHVlcyAqLworICAgIGRlc3RkaXIgPSBvcHRpb25zWzRdLnZhbHVlOworICAgIHNyY0RpciA9IG9wdGlvbnNbNV0udmFsdWU7CisgICAgVkVSQk9TRSA9IG9wdGlvbnNbNl0uZG9lc09jY3VyOworCisgICAgaWYgKG9wdGlvbnNbMl0uZG9lc09jY3VyKSB7CisgICAgICAgIGNvcHlyaWdodCA9IFVfQ09QWVJJR0hUX1NUUklORzsKKyAgICB9CisKKyAgICBpZiAob3B0aW9uc1s3XS5kb2VzT2NjdXIpIHsKKyAgICAgICAgdV9zZXREYXRhRGlyZWN0b3J5KG9wdGlvbnNbN10udmFsdWUpOworICAgIH0KKyAgICAvKiBJbml0aWFsaXplIElDVSAqLworICAgIHVfaW5pdCgmc3RhdHVzKTsKKyAgICBpZiAoVV9GQUlMVVJFKHN0YXR1cykgJiYgc3RhdHVzICE9IFVfRklMRV9BQ0NFU1NfRVJST1IpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogY2FuIG5vdCBpbml0aWFsaXplIElDVS4gIHN0YXR1cyA9ICVzXG4iLAorICAgICAgICAgICAgYXJndlswXSwgdV9lcnJvck5hbWUoc3RhdHVzKSk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorICAgIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKKworCisgICAgLyogcHJlcGFyZSB0aGUgZmlsZW5hbWUgYmVnaW5uaW5nIHdpdGggdGhlIHNvdXJjZSBkaXIgKi8KKyAgICB1cHJ2X3N0cmNweShmaWxlbmFtZSwgc3JjRGlyKTsKKyAgICBiYXNlbmFtZT1maWxlbmFtZSt1cHJ2X3N0cmxlbihmaWxlbmFtZSk7CisKKyAgICBpZihiYXNlbmFtZT5maWxlbmFtZSAmJiAqKGJhc2VuYW1lLTEpIT1VX0ZJTEVfU0VQX0NIQVIpIHsKKyAgICAgICAgKmJhc2VuYW1lKysgPSBVX0ZJTEVfU0VQX0NIQVI7CisgICAgfQorCisgICAgaWYoYXJnYyA8IDApIHsgCisgICAgICB1cHJ2X3N0cmNweShiYXNlbmFtZSwgIkZyYWN0aW9uYWxVQ0EudHh0Iik7CisgICAgfSBlbHNlIHsKKyAgICAgIGFyZ3YrKzsKKyAgICAgIHVwcnZfc3RyY3B5KGJhc2VuYW1lLCBnZXRMb25nUGF0aG5hbWUoKmFyZ3YpKTsKKyAgICB9CisKKyNpZiAwCisgICAgaWYodV9nZXRDb21iaW5pbmdDbGFzcygweDAwNTMpID09IDApCisgICAgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlNFVkVSRSBFUlJPUjogTm9ybWFsaXphdGlvbiBkYXRhIGlzIG5vdCBmdW5jdGlvbmluZyEgQmFpbGluZyBvdXQuICBXYXMgbm90IGFibGUgdG8gbG9hZCB1bm9ybS5kYXQuXG4iKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisjZW5kaWYgCisKKyNpZiBVQ09ORklHX05PX0NPTExBVElPTgorCisgICAgVU5ld0RhdGFNZW1vcnkgKnBEYXRhOworICAgIGNvbnN0IGNoYXIgKm1zZzsKKyAgICAKKyAgICBtc2cgPSAiZ2VudWNhIHdyaXRlcyBkdW1teSAiIFVDQV9EQVRBX05BTUUgIi4iIFVDQV9EQVRBX1RZUEUgIiBiZWNhdXNlIG9mIFVDT05GSUdfTk9fQ09MTEFUSU9OLCBzZWUgdWNvbmZpZy5oIjsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBtc2cpOworICAgIHBEYXRhID0gdWRhdGFfY3JlYXRlKGRlc3RkaXIsIFVDQV9EQVRBX1RZUEUsIFVDQV9EQVRBX05BTUUsICZkdW1teURhdGFJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICZzdGF0dXMpOworICAgIHVkYXRhX3dyaXRlQmxvY2socERhdGEsIG1zZywgc3RybGVuKG1zZykpOworICAgIHVkYXRhX2ZpbmlzaChwRGF0YSwgJnN0YXR1cyk7CisKKyAgICBtc2cgPSAiZ2VudWNhIHdyaXRlcyBkdW1teSAiIElOVkNfREFUQV9OQU1FICIuIiBJTlZDX0RBVEFfVFlQRSAiIGJlY2F1c2Ugb2YgVUNPTkZJR19OT19DT0xMQVRJT04sIHNlZSB1Y29uZmlnLmgiOworICAgIGZwcmludGYoc3RkZXJyLCAiJXNcbiIsIG1zZyk7CisgICAgcERhdGEgPSB1ZGF0YV9jcmVhdGUoZGVzdGRpciwgSU5WQ19EQVRBX1RZUEUsIElOVkNfREFUQV9OQU1FLCAmZHVtbXlEYXRhSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAmc3RhdHVzKTsKKyAgICB1ZGF0YV93cml0ZUJsb2NrKHBEYXRhLCBtc2csIHN0cmxlbihtc2cpKTsKKyAgICB1ZGF0YV9maW5pc2gocERhdGEsICZzdGF0dXMpOworCisgICAgcmV0dXJuIChpbnQpc3RhdHVzOworCisjZWxzZQorCisgICAgcmV0dXJuIHdyaXRlX3VjYV90YWJsZShmaWxlbmFtZSwgZGVzdGRpciwgY29weXJpZ2h0LCAmc3RhdHVzKTsKKworI2VuZGlmCit9CisKKy8qCisgKiBIZXksIEVtYWNzLCBwbGVhc2Ugc2V0IHRoZSBmb2xsb3dpbmc6CisgKgorICogTG9jYWwgVmFyaWFibGVzOgorICogaW5kZW50LXRhYnMtbW9kZTogbmlsCisgKiBFbmQ6CisgKgorICovCmRpZmYgLS1naXQgYS91bmljb2RlL2MvZ2VudWNhL2dlbnVjYS5oIGIvdW5pY29kZS9jL2dlbnVjYS9nZW51Y2EuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOThlNjY5Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZS9jL2dlbnVjYS9nZW51Y2EuaApAQCAtMCwwICsxLDQ3IEBACisvKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIENvcHlyaWdodCAoQykgMjAwMC0yMDA0LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzCisqICAgQ29ycG9yYXRpb24gYW5kIG90aGVycy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgZmlsZSBuYW1lOiAgZ2VudWNhLmgKKyogICBlbmNvZGluZzogICBVUy1BU0NJSQorKiAgIHRhYiBzaXplOiAgIDggKG5vdCB1c2VkKQorKiAgIGluZGVudGF0aW9uOjQKKyoKKyogICBjcmVhdGVkIGF0IHRoZSBlbmQgb2YgWFggY2VudHVyeQorKiAgIGNyZWF0ZWQgYnk6IFZsYWRpbWlyIFdlaW5zdGVpbgorKgorKiAgIFRoaXMgcHJvZ3JhbSByZWFkcyB0aGUgRnJhbmN0aW9uYWwgVUNBIHRhYmxlIGFuZCBnZW5lcmF0ZXMKKyogICBpbnRlcm5hbCBmb3JtYXQgZm9yIFVDQSB0YWJsZSBhcyB3ZWxsIGFzIGludmVyc2UgVUNBIHRhYmxlLgorKiAgIEl0IHRoZW4gd3JpdGVzIGJpbmFyeSBmaWxlcyBjb250YWluaW5nIHRoZSBkYXRhOiB1Y2FkYXRhLmRhdCAKKyogICAmIGludnVjYS5kYXQKKyovCisKKyNpZm5kZWYgVUNBREFUQV9ICisjZGVmaW5lIFVDQURBVEFfSAorCisjaW5jbHVkZSAidW5pY29kZS91dHlwZXMuaCIKKworI2lmICFVQ09ORklHX05PX0NPTExBVElPTgorCisjaW5jbHVkZSAidWNvbF9lbG0uaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgInVuaWNvZGUvdXR5cGVzLmgiCisjaW5jbHVkZSAidW5pY29kZS91Y2hhci5oIgorI2luY2x1ZGUgInVjb2xfaW1wLmgiCisjaW5jbHVkZSAidWhhc2guaCIKKyNpbmNsdWRlICJ1bmV3ZGF0YS5oIgorCisKK3ZvaWQgZGVsZXRlRWxlbWVudCh2b2lkICplbGVtZW50KTsKK2ludDMyX3QgcmVhZEVsZW1lbnQoY2hhciAqKmZyb20sIGNoYXIgKnRvLCBjaGFyIHNlcGFyYXRvciwgVUVycm9yQ29kZSAqc3RhdHVzKTsKK3VpbnQzMl90IGdldFNpbmdsZUNFVmFsdWUoY2hhciAqcHJpbWFyeSwgY2hhciAqc2Vjb25kYXJ5LCBjaGFyICp0ZXJ0aWFyeSwgVUJvb2wgY2FzZUJpdCwgVUVycm9yQ29kZSAqc3RhdHVzKTsKK3ZvaWQgcHJpbnRPdXRUYWJsZShVQ0FUYWJsZUhlYWRlciAqbXlEYXRhLCBVRXJyb3JDb2RlICpzdGF0dXMpOworVUNBRWxlbWVudHMgKnJlYWRBbkVsZW1lbnQoRklMRSAqZGF0YSwgdGVtcFVDQVRhYmxlICp0LCBVQ0FDb25zdGFudHMgKmNvbnN0cywgVUVycm9yQ29kZSAqc3RhdHVzKTsKKworI2VuZGlmIC8qICNpZiAhVUNPTkZJR19OT19DT0xMQVRJT04gKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS91bmljb2RlL2MvZ2VudWNhL2dlbnVjYS52Y3Byb2ogYi91bmljb2RlL2MvZ2VudWNhL2dlbnVjYS52Y3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA1NjMxNgotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGUvYy9nZW51Y2EvZ2VudWNhLnZjcHJvagpAQCAtMCwwICsxLDQxOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV2luZG93cy0xMjUyIj8+Cis8VmlzdWFsU3R1ZGlvUHJvamVjdAorCVByb2plY3RUeXBlPSJWaXN1YWwgQysrIgorCVZlcnNpb249IjkuMDAiCisJTmFtZT0iZ2VudWNhIgorCVByb2plY3RHVUlEPSJ7ODY4Mjk2OTQtQTM3NS00QzU4LUI0RUEtOTZFRjUxNEUzMjI1fSIKKwlUYXJnZXRGcmFtZXdvcmtWZXJzaW9uPSIxMzEwNzIiCisJPgorCTxQbGF0Zm9ybXM+CisJCTxQbGF0Zm9ybQorCQkJTmFtZT0iV2luMzIiCisJCS8+CisJCTxQbGF0Zm9ybQorCQkJTmFtZT0ieDY0IgorCQkvPgorCTwvUGxhdGZvcm1zPgorCTxUb29sRmlsZXM+CisJPC9Ub29sRmlsZXM+CisJPENvbmZpZ3VyYXRpb25zPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5ceDg2XERlYnVnIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXHg4NlxEZWJ1ZyIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIgorCQkJSW5oZXJpdGVkUHJvcGVydHlTaGVldHM9IiQoVkNJbnN0YWxsRGlyKVZDUHJvamVjdERlZmF1bHRzXFVwZ3JhZGVGcm9tVkM3MS52c3Byb3BzIgorCQkJVXNlT2ZNRkM9IjAiCisJCQlBVExNaW5pbWl6ZXNDUnVuVGltZUxpYnJhcnlVc2FnZT0iZmFsc2UiCisJCQlDaGFyYWN0ZXJTZXQ9IjIiCisJCQk+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCQlDb21tYW5kTGluZT0iY29weSAmcXVvdDskKFRhcmdldFBhdGgpJnF1b3Q7IC4uXC4uXC4uXGJpbiYjeDBEOyYjeDBBOyIKKwkJCQlPdXRwdXRzPSIuLlwuLlwuLlxiaW5cJChUYXJnZXRGaWxlTmFtZSkiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCQlUeXBlTGlicmFyeU5hbWU9Ii5ceDg2XERlYnVnL2dlbnVjYS50bGIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCU9wdGltaXphdGlvbj0iMCIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlxjb21tb247Li5cLi5caTE4bjsuLlx0b29sdXRpbCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lOMzI7X0RFQlVHO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSIKKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiCisJCQkJUnVudGltZUxpYnJhcnk9IjMiCisJCQkJQnVmZmVyU2VjdXJpdHlDaGVjaz0idHJ1ZSIKKwkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJ0cnVlIgorCQkJCVRyZWF0V0NoYXJfdEFzQnVpbHRJblR5cGU9InRydWUiCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXHg4NlxEZWJ1Zy9nZW51Y2EucGNoIgorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlx4ODZcRGVidWcvIgorCQkJCU9iamVjdEZpbGU9Ii5ceDg2XERlYnVnLyIKKwkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlx4ODZcRGVidWcvIgorCQkJCUJyb3dzZUluZm9ybWF0aW9uPSIxIgorCQkJCVdhcm5pbmdMZXZlbD0iMyIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iNCIKKwkJCQlDb21waWxlQXM9IjAiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyIKKwkJCQlDdWx0dXJlPSIxMDMzIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIgorCQkJCU91dHB1dEZpbGU9Ii5ceDg2XERlYnVnL2dlbnVjYS5leGUiCisJCQkJTGlua0luY3JlbWVudGFsPSIyIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlx4ODZcRGVidWcvZ2VudWNhLnBkYiIKKwkJCQlTdWJTeXN0ZW09IjEiCisJCQkJUmFuZG9taXplZEJhc2VBZGRyZXNzPSIxIgorCQkJCURhdGFFeGVjdXRpb25QcmV2ZW50aW9uPSIwIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBTGlua1Rvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmlmZXN0VG9vbCIKKwkJCQlVc2VGQVQzMldvcmthcm91bmQ9InRydWUiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDRnhDb3BUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCTwvQ29uZmlndXJhdGlvbj4KKwkJPENvbmZpZ3VyYXRpb24KKwkJCU5hbWU9IlJlbGVhc2V8V2luMzIiCisJCQlPdXRwdXREaXJlY3Rvcnk9Ii5ceDg2XFJlbGVhc2UiCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5ceDg2XFJlbGVhc2UiCisJCQlDb25maWd1cmF0aW9uVHlwZT0iMSIKKwkJCUluaGVyaXRlZFByb3BlcnR5U2hlZXRzPSIkKFZDSW5zdGFsbERpcilWQ1Byb2plY3REZWZhdWx0c1xVcGdyYWRlRnJvbVZDNzEudnNwcm9wcyIKKwkJCVVzZU9mTUZDPSIwIgorCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9ImZhbHNlIgorCQkJQ2hhcmFjdGVyU2V0PSIyIgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkJQ29tbWFuZExpbmU9ImNvcHkgJnF1b3Q7JChUYXJnZXRQYXRoKSZxdW90OyAuLlwuLlwuLlxiaW4mI3gwRDsmI3gwQTsiCisJCQkJT3V0cHV0cz0iLi5cLi5cLi5cYmluXCQoVGFyZ2V0RmlsZU5hbWUpIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYTUxEYXRhR2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViU2VydmljZVByb3h5R2VuZXJhdG9yVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTUlETFRvb2wiCisJCQkJVHlwZUxpYnJhcnlOYW1lPSIuXHg4NlxSZWxlYXNlL2dlbnVjYS50bGIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCUFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM9Ii4uXC4uXGNvbW1vbjsuLlwuLlxpMThuOy4uXHRvb2x1dGlsIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJXSU4zMjtOREVCVUc7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIgorCQkJCVN0cmluZ1Bvb2xpbmc9InRydWUiCisJCQkJUnVudGltZUxpYnJhcnk9IjIiCisJCQkJRW5hYmxlRnVuY3Rpb25MZXZlbExpbmtpbmc9InRydWUiCisJCQkJRGlzYWJsZUxhbmd1YWdlRXh0ZW5zaW9ucz0idHJ1ZSIKKwkJCQlUcmVhdFdDaGFyX3RBc0J1aWx0SW5UeXBlPSJ0cnVlIgorCQkJCVByZWNvbXBpbGVkSGVhZGVyRmlsZT0iLlx4ODZcUmVsZWFzZS9nZW51Y2EucGNoIgorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlx4ODZcUmVsZWFzZS8iCisJCQkJT2JqZWN0RmlsZT0iLlx4ODZcUmVsZWFzZS8iCisJCQkJUHJvZ3JhbURhdGFCYXNlRmlsZU5hbWU9Ii5ceDg2XFJlbGVhc2UvIgorCQkJCVdhcm5pbmdMZXZlbD0iMyIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJQ29tcGlsZUFzPSIwIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJOREVCVUciCisJCQkJQ3VsdHVyZT0iMTAzMyIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlTGlua0V2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKKwkJCQlPdXRwdXRGaWxlPSIuXHg4NlxSZWxlYXNlL2dlbnVjYS5leGUiCisJCQkJTGlua0luY3JlbWVudGFsPSIxIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXHg4NlxSZWxlYXNlL2dlbnVjYS5wZGIiCisJCQkJU3ViU3lzdGVtPSIxIgorCQkJCVJhbmRvbWl6ZWRCYXNlQWRkcmVzcz0iMSIKKwkJCQlEYXRhRXhlY3V0aW9uUHJldmVudGlvbj0iMCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQUxpbmtUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5pZmVzdFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hEQ01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNCc2NNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDRnhDb3BUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNBcHBWZXJpZmllclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCTwvQ29uZmlndXJhdGlvbj4KKwkJPENvbmZpZ3VyYXRpb24KKwkJCU5hbWU9IkRlYnVnfHg2NCIKKwkJCU91dHB1dERpcmVjdG9yeT0iLlx4NjRcRGVidWciCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9Ii5ceDY0XERlYnVnIgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiCisJCQlVc2VPZk1GQz0iMCIKKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIKKwkJCUNoYXJhY3RlclNldD0iMiIKKwkJCT4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJCUNvbW1hbmRMaW5lPSJjb3B5ICZxdW90OyQoVGFyZ2V0UGF0aCkmcXVvdDsgLi5cLi5cLi5cYmluNjQmI3gwRDsmI3gwQTsiCisJCQkJT3V0cHV0cz0iLi5cLi5cLi5cYmluNjRcJChUYXJnZXRGaWxlTmFtZSkiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMyIKKwkJCQlUeXBlTGlicmFyeU5hbWU9Ii5ceDY0XERlYnVnL2dlbnVjYS50bGIiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQkJCU9wdGltaXphdGlvbj0iMCIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlxjb21tb247Li5cLi5caTE4bjsuLlx0b29sdXRpbCIKKwkJCQlQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz0iV0lONjQ7V0lOMzI7X0RFQlVHO19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSIKKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiCisJCQkJUnVudGltZUxpYnJhcnk9IjMiCisJCQkJQnVmZmVyU2VjdXJpdHlDaGVjaz0idHJ1ZSIKKwkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJ0cnVlIgorCQkJCVRyZWF0V0NoYXJfdEFzQnVpbHRJblR5cGU9InRydWUiCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXHg2NFxEZWJ1Zy9nZW51Y2EucGNoIgorCQkJCUFzc2VtYmxlckxpc3RpbmdMb2NhdGlvbj0iLlx4NjRcRGVidWcvIgorCQkJCU9iamVjdEZpbGU9Ii5ceDY0XERlYnVnLyIKKwkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlx4NjRcRGVidWcvIgorCQkJCUJyb3dzZUluZm9ybWF0aW9uPSIxIgorCQkJCVdhcm5pbmdMZXZlbD0iMyIKKwkJCQlTdXBwcmVzc1N0YXJ0dXBCYW5uZXI9InRydWUiCisJCQkJRGVidWdJbmZvcm1hdGlvbkZvcm1hdD0iMyIKKwkJCQlDb21waWxlQXM9IjAiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Il9ERUJVRyIKKwkJCQlDdWx0dXJlPSIxMDMzIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIgorCQkJCU91dHB1dEZpbGU9Ii5ceDY0XERlYnVnL2dlbnVjYS5leGUiCisJCQkJTGlua0luY3JlbWVudGFsPSIyIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlx4NjRcRGVidWcvZ2VudWNhLnBkYiIKKwkJCQlTdWJTeXN0ZW09IjEiCisJCQkJVGFyZ2V0TWFjaGluZT0iMTciCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIgorCQkJCVVzZUZBVDMyV29ya2Fyb3VuZD0idHJ1ZSIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWERDTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0JzY01ha2VUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNGeENvcFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FwcFZlcmlmaWVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDV2ViRGVwbG95bWVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Bvc3RCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCTwvQ29uZmlndXJhdGlvbj4KKwkJPENvbmZpZ3VyYXRpb24KKwkJCU5hbWU9IlJlbGVhc2V8eDY0IgorCQkJT3V0cHV0RGlyZWN0b3J5PSIuXHg2NFxSZWxlYXNlIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIuXHg2NFxSZWxlYXNlIgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiCisJCQlJbmhlcml0ZWRQcm9wZXJ0eVNoZWV0cz0iJChWQ0luc3RhbGxEaXIpVkNQcm9qZWN0RGVmYXVsdHNcVXBncmFkZUZyb21WQzcxLnZzcHJvcHMiCisJCQlVc2VPZk1GQz0iMCIKKwkJCUFUTE1pbmltaXplc0NSdW5UaW1lTGlicmFyeVVzYWdlPSJmYWxzZSIKKwkJCUNoYXJhY3RlclNldD0iMiIKKwkJCT4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVCdWlsZEV2ZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ3VzdG9tQnVpbGRUb29sIgorCQkJCUNvbW1hbmRMaW5lPSJjb3B5ICZxdW90OyQoVGFyZ2V0UGF0aCkmcXVvdDsgLi5cLi5cLi5cYmluNjQmI3gwRDsmI3gwQTsiCisJCQkJT3V0cHV0cz0iLi5cLi5cLi5cYmluNjRcJChUYXJnZXRGaWxlTmFtZSkiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCQlUYXJnZXRFbnZpcm9ubWVudD0iMyIKKwkJCQlUeXBlTGlicmFyeU5hbWU9Ii5ceDY0XFJlbGVhc2UvZ2VudWNhLnRsYiIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cY29tbW9uOy4uXC4uXGkxOG47Li5cdG9vbHV0aWwiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IldJTjY0O1dJTjMyO05ERUJVRztfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUiCisJCQkJU3RyaW5nUG9vbGluZz0idHJ1ZSIKKwkJCQlSdW50aW1lTGlicmFyeT0iMiIKKwkJCQlFbmFibGVGdW5jdGlvbkxldmVsTGlua2luZz0idHJ1ZSIKKwkJCQlEaXNhYmxlTGFuZ3VhZ2VFeHRlbnNpb25zPSJ0cnVlIgorCQkJCVRyZWF0V0NoYXJfdEFzQnVpbHRJblR5cGU9InRydWUiCisJCQkJUHJlY29tcGlsZWRIZWFkZXJGaWxlPSIuXHg2NFxSZWxlYXNlL2dlbnVjYS5wY2giCisJCQkJQXNzZW1ibGVyTGlzdGluZ0xvY2F0aW9uPSIuXHg2NFxSZWxlYXNlLyIKKwkJCQlPYmplY3RGaWxlPSIuXHg2NFxSZWxlYXNlLyIKKwkJCQlQcm9ncmFtRGF0YUJhc2VGaWxlTmFtZT0iLlx4NjRcUmVsZWFzZS8iCisJCQkJV2FybmluZ0xldmVsPSIzIgorCQkJCVN1cHByZXNzU3RhcnR1cEJhbm5lcj0idHJ1ZSIKKwkJCQlDb21waWxlQXM9IjAiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9Ik5ERUJVRyIKKwkJCQlDdWx0dXJlPSIxMDMzIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIgorCQkJCU91dHB1dEZpbGU9Ii5ceDY0XFJlbGVhc2UvZ2VudWNhLmV4ZSIKKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiCisJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJ0cnVlIgorCQkJCVByb2dyYW1EYXRhYmFzZUZpbGU9Ii5ceDY0XFJlbGVhc2UvZ2VudWNhLnBkYiIKKwkJCQlTdWJTeXN0ZW09IjEiCisJCQkJVGFyZ2V0TWFjaGluZT0iMTciCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJEZXBsb3ltZW50VG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUG9zdEJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJPC9Db25maWd1cmF0aW9uPgorCTwvQ29uZmlndXJhdGlvbnM+CisJPFJlZmVyZW5jZXM+CisJPC9SZWZlcmVuY2VzPgorCTxGaWxlcz4KKwkJPEZpbHRlcgorCQkJTmFtZT0iU291cmNlIEZpbGVzIgorCQkJRmlsdGVyPSJjcHA7YztjeHg7cmM7ZGVmO3I7b2RsO2lkbDtocGo7YmF0IgorCQkJPgorCQkJPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii5cZ2VudWNhLmNwcCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCTwvRmlsdGVyPgorCQk8RmlsdGVyCisJCQlOYW1lPSJIZWFkZXIgRmlsZXMiCisJCQlGaWx0ZXI9Img7aHBwO2h4eDtobTtpbmwiCisJCQk+CisJCQk8RmlsZQorCQkJCVJlbGF0aXZlUGF0aD0iLlxnZW51Y2EuaCIKKwkJCQk+CisJCQk8L0ZpbGU+CisJCTwvRmlsdGVyPgorCQk8RmlsdGVyCisJCQlOYW1lPSJSZXNvdXJjZSBGaWxlcyIKKwkJCUZpbHRlcj0iaWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO3JncztnaWY7anBnO2pwZWc7anBlIgorCQkJPgorCQk8L0ZpbHRlcj4KKwk8L0ZpbGVzPgorCTxHbG9iYWxzPgorCTwvR2xvYmFscz4KKzwvVmlzdWFsU3R1ZGlvUHJvamVjdD4KZGlmZiAtLWdpdCBhL3VuaWNvZGUvYy9nZW51dHM0Ni9DTWFrZUxpc3RzLnR4dCBiL3VuaWNvZGUvYy9nZW51dHM0Ni9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDM3ODJlCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZS9jL2dlbnV0czQ2L0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsOSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTAsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMKKyMgQ29ycG9yYXRpb24gYW5kIG90aGVycy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIGNyZWF0ZWQgb246IDIwMTBqdW4wMworIyBjcmVhdGVkIGJ5OiBNYXJrdXMgVy4gU2NoZXJlcgorIyBlZGl0ZWQgb246IDIwMTBqdWwyMAorIyBlZGl0ZWQgYnk6IFN0dWFydCBHLiBHaWxsCithZGRfZXhlY3V0YWJsZShnZW51dHM0NiBnZW51dHM0Ni5jcHApCit0YXJnZXRfbGlua19saWJyYXJpZXMoZ2VudXRzNDYgaWN1dWMgaWN1dHUpCmRpZmYgLS1naXQgYS91bmljb2RlL2MvZ2VudXRzNDYvZ2VudXRzNDYuY3BwIGIvdW5pY29kZS9jL2dlbnV0czQ2L2dlbnV0czQ2LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yjg2NDdhCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZS9jL2dlbnV0czQ2L2dlbnV0czQ2LmNwcApAQCAtMCwwICsxLDM2NCBAQAorLyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICBDb3B5cmlnaHQgKEMpIDIwMTAsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMKKyogICBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICBmaWxlIG5hbWU6ICBnZW51dHM0Ni5jcHAKKyogICBlbmNvZGluZzogICBVUy1BU0NJSQorKiAgIHRhYiBzaXplOiAgIDggKG5vdCB1c2VkKQorKiAgIGluZGVudGF0aW9uOjQKKyoKKyogICBjcmVhdGVkIG9uOiAyMDEwbWFyMDIKKyogICBjcmVhdGVkIGJ5OiBNYXJrdXMgVy4gU2NoZXJlcgorKgorKiBxdWljayAmIGRpcnR5IHRvb2wgdG8gcmVjcmVhdGUgdGhlIFVUUyAjNDYgZGF0YSB0YWJsZSBhY2NvcmRpbmcgdG8gdGhlIHNwZWMKKyovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJ1bmljb2RlL3V0eXBlcy5oIgorI2luY2x1ZGUgInVuaWNvZGUvZXJyb3Jjb2RlLmgiCisjaW5jbHVkZSAidW5pY29kZS9ub3JtYWxpemVyMi5oIgorI2luY2x1ZGUgInVuaWNvZGUvdW5pc2V0LmgiCisjaW5jbHVkZSAidW5pY29kZS91bmlzdHIuaCIKKyNpbmNsdWRlICJ1bmljb2RlL3VzZXRpdGVyLmgiCisjaW5jbHVkZSAidW5pY29kZS91c3ByZXAuaCIKKyNpbmNsdWRlICJzcHJwaW1wbC5oIiAgLy8gSEFDSworCisvKioKKyAqIGljdTo6RXJyb3JDb2RlIHN1YmNsYXNzIGZvciBlYXN5IFVFcnJvckNvZGUgaGFuZGxpbmcuCisgKiBUaGUgZGVzdHJ1Y3RvciBjYWxscyBoYW5kbGVGYWlsdXJlKCkgd2hpY2ggY2FsbHMgZXhpdChlcnJvckNvZGUpIHdoZW4gaXNGYWlsdXJlKCkuCisgKi8KK2NsYXNzIEV4aXRpbmdFcnJvckNvZGUgOiBwdWJsaWMgaWN1OjpFcnJvckNvZGUgeworcHVibGljOgorICAgIC8qKgorICAgICAqIEBwYXJhbSBsb2MgQSBzaG9ydCBzdHJpbmcgZGVzY3JpYmluZyB3aGVyZSB0aGUgRXhpdGluZ0Vycm9yQ29kZSBpcyB1c2VkLgorICAgICAqLworICAgIEV4aXRpbmdFcnJvckNvZGUoY29uc3QgY2hhciAqbG9jKSA6IGxvY2F0aW9uKGxvYykge30KKyAgICB2aXJ0dWFsIH5FeGl0aW5nRXJyb3JDb2RlKCk7Citwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB2b2lkIGhhbmRsZUZhaWx1cmUoKSBjb25zdDsKK3ByaXZhdGU6CisgICAgY29uc3QgY2hhciAqbG9jYXRpb247Cit9OworCitFeGl0aW5nRXJyb3JDb2RlOjp+RXhpdGluZ0Vycm9yQ29kZSgpIHsKKyAgICAvLyBTYWZlIGJlY2F1c2Ugb3VyIGhhbmRsZUZhaWx1cmUoKSBkb2VzIG5vdCB0aHJvdyBleGNlcHRpb25zLgorICAgIGlmKGlzRmFpbHVyZSgpKSB7IGhhbmRsZUZhaWx1cmUoKTsgfQorfQorCit2b2lkIEV4aXRpbmdFcnJvckNvZGU6OmhhbmRsZUZhaWx1cmUoKSBjb25zdCB7CisgICAgZnByaW50ZihzdGRlcnIsICJlcnJvciBhdCAlczogJXNcbiIsIGxvY2F0aW9uLCBlcnJvck5hbWUoKSk7CisgICAgZXhpdChlcnJvckNvZGUpOworfQorCitzdGF0aWMgaW50Cit0b0lETkEyMDAzKGNvbnN0IFVTdHJpbmdQcmVwUHJvZmlsZSAqcHJlcCwgVUNoYXIzMiBjLCBpY3U6OlVuaWNvZGVTdHJpbmcgJmRlc3RTdHJpbmcpIHsKKyAgICBVQ2hhciBzcmNbMl07CisgICAgaW50MzJfdCBzcmNMZW5ndGg9MDsKKyAgICBVMTZfQVBQRU5EX1VOU0FGRShzcmMsIHNyY0xlbmd0aCwgYyk7CisgICAgVUNoYXIgKmRlc3Q7CisgICAgaW50MzJfdCBkZXN0TGVuZ3RoOworICAgIGRlc3Q9ZGVzdFN0cmluZy5nZXRCdWZmZXIoMzIpOworICAgIGlmKGRlc3Q9PU5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBVRXJyb3JDb2RlIGVycm9yQ29kZT1VX1pFUk9fRVJST1I7CisgICAgZGVzdExlbmd0aD11c3ByZXBfcHJlcGFyZShwcmVwLCBzcmMsIHNyY0xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QsIGRlc3RTdHJpbmcuZ2V0Q2FwYWNpdHkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTUFJFUF9ERUZBVUxULCBOVUxMLCAmZXJyb3JDb2RlKTsKKyAgICBkZXN0U3RyaW5nLnJlbGVhc2VCdWZmZXIoZGVzdExlbmd0aCk7CisgICAgaWYoZXJyb3JDb2RlPT1VX1NUUklOR1BSRVBfUFJPSElCSVRFRF9FUlJPUikgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gUmV0dXJucyBGQUxTRT0wIGZvciBVX1NUUklOR1BSRVBfVU5BU1NJR05FRF9FUlJPUiBhbmQgcHJvY2Vzc2luZyBlcnJvcnMsCisgICAgICAgIC8vIFRSVUU9MSBpZiBjIGlzIHZhbGlkIG9yIG1hcHBlZC4KKyAgICAgICAgcmV0dXJuIFVfU1VDQ0VTUyhlcnJvckNvZGUpOworICAgIH0KK30KKworZW51bSBTdGF0dXMgeworICAgIERJU0FMTE9XRUQsIElHTk9SRUQsIE1BUFBFRCwgREVWSUFUSU9OLCBWQUxJRCwKKyAgICBESVNBTExPV0VEX1NURDNfVkFMSUQsIERJU0FMTE9XRURfU1REM19NQVBQRUQKK307CitzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgc3RhdHVzTmFtZXNbXT17CisgICAgImRpc2FsbG93ZWQiLCAiaWdub3JlZCIsICJtYXBwZWQiLCAiZGV2aWF0aW9uIiwgInZhbGlkIiwKKyAgICAiZGlzYWxsb3dlZF9TVEQzX3ZhbGlkIiwgImRpc2FsbG93ZWRfU1REM19tYXBwZWQiCit9OworCitzdGF0aWMgdm9pZAorcHJpbnRMaW5lKFVDaGFyMzIgc3RhcnQsIFVDaGFyMzIgZW5kLCBTdGF0dXMgc3RhdHVzLCBjb25zdCBpY3U6OlVuaWNvZGVTdHJpbmcgJm1hcHBpbmcpIHsKKyAgICBpZihzdGFydD09ZW5kKSB7CisgICAgICAgIHByaW50ZigiJTA0bFggICAgICAgICAgIiwgKGxvbmcpc3RhcnQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiJTA0bFguLiUwNGxYICAgICIsIChsb25nKXN0YXJ0LCAobG9uZyllbmQpOworICAgIH0KKyAgICBwcmludGYoIjsgJXMiLCBzdGF0dXNOYW1lc1tzdGF0dXNdKTsKKyAgICBpZihzdGF0dXM9PU1BUFBFRCB8fCBzdGF0dXM9PURFVklBVElPTiB8fCAhbWFwcGluZy5pc0VtcHR5KCkpIHsKKyAgICAgICAgcHJpbnRmKCIgOyIpOworICAgICAgICBjb25zdCBVQ2hhciAqYnVmZmVyPW1hcHBpbmcuZ2V0QnVmZmVyKCk7CisgICAgICAgIGludDMyX3QgbGVuZ3RoPW1hcHBpbmcubGVuZ3RoKCk7CisgICAgICAgIGludDMyX3QgaT0wOworICAgICAgICBVQ2hhcjMyIGM7CisgICAgICAgIHdoaWxlKGk8bGVuZ3RoKSB7CisgICAgICAgICAgICBVMTZfTkVYVChidWZmZXIsIGksIGxlbmd0aCwgYyk7CisgICAgICAgICAgICBwcmludGYoIiAlMDRsWCIsIChsb25nKWMpOworICAgICAgICB9CisgICAgfQorICAgIHB1dHMoIiIpOworfQorCitzdGF0aWMgdm9pZAorZ2V0QWdlSWZBc3NpZ25lZChVQ2hhcjMyIGMsIFVWZXJzaW9uSW5mbyBhZ2UpIHsKKyAgICBpZih1X2lzZGVmaW5lZChjKSkgeworICAgICAgICB1X2NoYXJBZ2UoYywgYWdlKTsKKyAgICB9IGVsc2UgaWYoVV9JU19VTklDT0RFX05PTkNIQVIoYykpIHsKKyAgICAgICAgYWdlWzBdPTA7CisgICAgICAgIGFnZVsxXT0wOworICAgICAgICBhZ2VbMl09MDsKKyAgICAgICAgYWdlWzNdPTE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWVtc2V0KGFnZSwgMCwgNCk7CisgICAgfQorfQorCitleHRlcm4gaW50CittYWluKGludCBhcmdjLCBjb25zdCBjaGFyICphcmd2W10pIHsKKyAgICBFeGl0aW5nRXJyb3JDb2RlIGVycm9yQ29kZSgiZ2VudXRzNDYiKTsKKworICAgIC8vIHByZWRlZmluZWQgYmFzZSBzZXRzCisgICAgaWN1OjpVbmljb2RlU2V0IHVuYXNzaWduZWRTZXQoVU5JQ09ERV9TVFJJTkdfU0lNUExFKCJbOkNuOl0iKSwgZXJyb3JDb2RlKTsKKworICAgIGljdTo6VW5pY29kZVNldCBsYWJlbFNlcGFyYXRvcnMoCisgICAgICAgIFVOSUNPREVfU1RSSU5HX1NJTVBMRSgiW1xcdTAwMkVcXHUzMDAyXFx1RkYwRVxcdUZGNjFdIiksIGVycm9yQ29kZSk7CisKKyAgICBpY3U6OlVuaWNvZGVTZXQgbWFwcGVkU2V0KAorICAgICAgICBVTklDT0RFX1NUUklOR19TSU1QTEUoIls6Q2hhbmdlc19XaGVuX05GS0NfQ2FzZWZvbGRlZDpdIiksIGVycm9yQ29kZSk7CisgICAgbWFwcGVkU2V0LnJlbW92ZUFsbChsYWJlbFNlcGFyYXRvcnMpOyAgLy8gc2ltcGxpZmllcyBjaGVja2luZyBvZiBtYXBwZWQgY2hhcmFjdGVycworCisgICAgaWN1OjpVbmljb2RlU2V0IGJhc2VWYWxpZFNldChpY3U6OlVuaWNvZGVTdHJpbmcoCisgICAgICAgICJbW1tbOl5DaGFuZ2VzX1doZW5fTkZLQ19DYXNlZm9sZGVkOl0iCisgICAgICAgICItWzpDOl0tWzpaOl0iCisgICAgICAgICItWzpCbG9jaz1JZGVvZ3JhcGhpY19EZXNjcmlwdGlvbl9DaGFyYWN0ZXJzOl1dIgorICAgICAgICAiWzphc2NpaTpdXS1bLl1dIiwgLTEsIFVTX0lOViksIGVycm9yQ29kZSk7CisKKyAgICAvLyBDaGFyYWN0ZXJzIHRoYXQgYXJlIGRpc2FsbG93ZWQgd2hlbiBTVEQzIHJ1bGVzIGFyZSBhcHBsaWVkLAorICAgIC8vIGJ1dCB2YWxpZCB3aGVuIFNURDMgcnVsZXMgYXJlIG5vdCBhcHBsaWVkLgorICAgIGljdTo6VW5pY29kZVNldCBkaXNhbGxvd2VkU1REM1NldChpY3U6OlVuaWNvZGVTdHJpbmcoCisgICAgICAgICJbWzphc2NpaTpdLVtcXHUwMDJELmEtekEtWjAtOV1dIiwgLTEsIFVTX0lOViksIGVycm9yQ29kZSk7CisKKyAgICBpY3U6OlVuaWNvZGVTZXQgZGV2aWF0aW9uU2V0KAorICAgICAgICBVTklDT0RFX1NUUklOR19TSU1QTEUoIltcXHUwMERGXFx1MDNDMlxcdTIwMENcXHUyMDBEXSIpLCBlcnJvckNvZGUpOworICAgIGVycm9yQ29kZS5hc3NlcnRTdWNjZXNzKCk7CisKKyAgICAvLyBkZXJpdmVkIHNldHMKKyAgICBpY3U6OkxvY2FsVVN0cmluZ1ByZXBQcm9maWxlUG9pbnRlciBuYW1lUHJlcCh1c3ByZXBfb3BlbkJ5VHlwZShVU1BSRVBfUkZDMzQ5MV9OQU1FUFJFUCwgZXJyb3JDb2RlKSk7CisgICAgY29uc3QgaWN1OjpOb3JtYWxpemVyMiAqbmZrY19jZj0KKyAgICAgICAgaWN1OjpOb3JtYWxpemVyMjo6Z2V0SW5zdGFuY2UoTlVMTCwgIm5ma2NfY2YiLCBVTk9STTJfQ09NUE9TRSwgZXJyb3JDb2RlKTsKKyAgICBlcnJvckNvZGUuYXNzZXJ0U3VjY2VzcygpOworCisgICAgLy8gSEFDSzogVGhlIFN0cmluZ1ByZXAgQVBJIHBlcmZvcm1zIGEgQmlEaSBjaGVjayBhY2NvcmRpbmcgdG8gdGhlIGRhdGEuCisgICAgLy8gV2UgbmVlZCB0byBvdmVycmlkZSB0aGF0IGZvciB0aGlzIGRhdGEgZ2VuZXJhdGlvbiwgYnkgcmVzZXR0aW5nIGFuIGludGVybmFsIGZsYWcuCisgICAgbmFtZVByZXAtPmNoZWNrQmlEaT1GQUxTRTsKKworICAgIGljdTo6VW5pY29kZVNldCBiYXNlRXhjbHVzaW9uU2V0OworICAgIGljdTo6VW5pY29kZVN0cmluZyBjU3RyaW5nLCBtYXBwaW5nLCBuYW1lUHJlcFJlc3VsdDsKKyAgICBmb3IoVUNoYXIzMiBjPTA7IGM8PTB4MTBmZmZmOyArK2MpIHsKKyAgICAgICAgaWYoYz09MHhkODAwKSB7CisgICAgICAgICAgICBjPTB4ZTAwMDsKKyAgICAgICAgfQorICAgICAgICBpbnQgbmFtZVByZXBTdGF0dXM9dG9JRE5BMjAwMyhuYW1lUHJlcC5nZXRBbGlhcygpLCBjLCBuYW1lUHJlcFJlc3VsdCk7CisgICAgICAgIGlmKG5hbWVQcmVwU3RhdHVzIT0wKSB7CisgICAgICAgICAgICAvLyBnZXQgdGhlIFVUUyAjNDYgYmFzZSBtYXBwaW5nIHZhbHVlCisgICAgICAgICAgICBzd2l0Y2goYykgeworICAgICAgICAgICAgY2FzZSAweGZmMGU6CisgICAgICAgICAgICBjYXNlIDB4MzAwMjoKKyAgICAgICAgICAgIGNhc2UgMHhmZjYxOgorICAgICAgICAgICAgICAgIG1hcHBpbmcuc2V0VG8oMHgyZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGNTdHJpbmcuc2V0VG8oYyk7CisgICAgICAgICAgICAgICAgbmZrY19jZi0+bm9ybWFsaXplKGNTdHJpbmcsIG1hcHBpbmcsIGVycm9yQ29kZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZigKKyAgICAgICAgICAgICAgICBuYW1lUHJlcFN0YXR1cz4wID8KKyAgICAgICAgICAgICAgICAgICAgLy8gYyBpcyB2YWxpZCBvciBtYXBwZWQgaW4gSUROQTIwMDMKKyAgICAgICAgICAgICAgICAgICAgIWxhYmVsU2VwYXJhdG9ycy5jb250YWlucyhjKSAmJiBuYW1lUHJlcFJlc3VsdCE9bWFwcGluZyA6CisgICAgICAgICAgICAgICAgICAgIC8vIG5hbWVQcmVwU3RhdHVzPDA6IGMgaXMgcHJvaGliaXRlZCBpbiBJRE5BMjAwMworICAgICAgICAgICAgICAgICAgICBiYXNlVmFsaWRTZXQuY29udGFpbnMoYykgfHwgKGNTdHJpbmchPW1hcHBpbmcgJiYgYmFzZVZhbGlkU2V0LmNvbnRhaW5zQWxsKG1hcHBpbmcpKQorICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgYmFzZUV4Y2x1c2lvblNldC5hZGQoYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpY3U6OlVuaWNvZGVTZXQgZGlzYWxsb3dlZFNldCgwLCAweDEwZmZmZik7CisgICAgZGlzYWxsb3dlZFNldC4KKyAgICAgICAgcmVtb3ZlQWxsKGxhYmVsU2VwYXJhdG9ycykuCisgICAgICAgIHJlbW92ZUFsbChkZXZpYXRpb25TZXQpLgorICAgICAgICByZW1vdmVBbGwobWFwcGVkU2V0KS4KKyAgICAgICAgcmVtb3ZlQWxsKGJhc2VWYWxpZFNldCkuCisgICAgICAgIGFkZEFsbChiYXNlRXhjbHVzaW9uU2V0KS4KKyAgICAgICAgYWRkQWxsKHVuYXNzaWduZWRTZXQpOworCisgICAgY29uc3QgaWN1OjpOb3JtYWxpemVyMiAqbmZkPQorICAgICAgICBpY3U6Ok5vcm1hbGl6ZXIyOjpnZXRJbnN0YW5jZShOVUxMLCAibmZjIiwgVU5PUk0yX0RFQ09NUE9TRSwgZXJyb3JDb2RlKTsKKyAgICBlcnJvckNvZGUuYXNzZXJ0U3VjY2VzcygpOworCisgICAgaWN1OjpVbmljb2RlU2V0IGlnbm9yZWRTZXQ7ICAvLyB3aWxsIGJlIGEgc3Vic2V0IG9mIG1hcHBlZFNldAorICAgIGljdTo6VW5pY29kZVNldCByZW1vdmVTZXQ7CisgICAgaWN1OjpVbmljb2RlU3RyaW5nIG5mZFN0cmluZzsKKyAgICB7CisgICAgICAgIGljdTo6VW5pY29kZVNldEl0ZXJhdG9yIGl0ZXIobWFwcGVkU2V0KTsKKyAgICAgICAgd2hpbGUoaXRlci5uZXh0KCkpIHsKKyAgICAgICAgICAgIFVDaGFyMzIgYz1pdGVyLmdldENvZGVwb2ludCgpOworICAgICAgICAgICAgY1N0cmluZy5zZXRUbyhjKTsKKyAgICAgICAgICAgIG5ma2NfY2YtPm5vcm1hbGl6ZShjU3RyaW5nLCBtYXBwaW5nLCBlcnJvckNvZGUpOworICAgICAgICAgICAgaWYoIWJhc2VWYWxpZFNldC5jb250YWluc0FsbChtYXBwaW5nKSkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVSslMDRsWCBtYXBwZWQgLT4gZGlzYWxsb3dlZDogbWFwcGluZyBub3Qgd2hvbGx5IGluIGJhc2UgdmFsaWQgc2V0XG4iLCAobG9uZyljKTsKKyAgICAgICAgICAgICAgICBkaXNhbGxvd2VkU2V0LmFkZChjKTsKKyAgICAgICAgICAgICAgICByZW1vdmVTZXQuYWRkKGMpOworICAgICAgICAgICAgfSBlbHNlIGlmKG1hcHBpbmcuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgaWdub3JlZFNldC5hZGQoYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbWFwcGVkU2V0LnJlbW92ZUFsbChyZW1vdmVTZXQpOworICAgIH0KKyAgICBlcnJvckNvZGUuYXNzZXJ0U3VjY2VzcygpOworCisgICAgaWN1OjpVbmljb2RlU2V0IHZhbGlkU2V0KGJhc2VWYWxpZFNldCk7CisgICAgdmFsaWRTZXQuCisgICAgICAgIHJlbW92ZUFsbChsYWJlbFNlcGFyYXRvcnMpLiAgLy8gbm9uLUFTQ0lJIGxhYmVsIHNlcGFyYXRvcnMgd2lsbCBiZSBtYXBwZWQgaW4gdGhlIGVuZAorICAgICAgICByZW1vdmVBbGwoZGV2aWF0aW9uU2V0KS4KKyAgICAgICAgcmVtb3ZlQWxsKGRpc2FsbG93ZWRTZXQpLgorICAgICAgICByZW1vdmVBbGwobWFwcGVkU2V0KS4KKyAgICAgICAgYWRkKDB4MmUpOyAgLy8gbm90IG1hcHBlZCwgc2ltcGx5IHZhbGlkCisgICAgVUJvb2wgbWFkZUNoYW5nZTsKKyAgICBkbyB7CisgICAgICAgIG1hZGVDaGFuZ2U9RkFMU0U7CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlbW92ZVNldC5jbGVhcigpOworICAgICAgICAgICAgaWN1OjpVbmljb2RlU2V0SXRlcmF0b3IgaXRlcih2YWxpZFNldCk7CisgICAgICAgICAgICB3aGlsZShpdGVyLm5leHQoKSkgeworICAgICAgICAgICAgICAgIFVDaGFyMzIgYz1pdGVyLmdldENvZGVwb2ludCgpOworICAgICAgICAgICAgICAgIGlmKG5mZC0+Z2V0RGVjb21wb3NpdGlvbihjLCBuZmRTdHJpbmcpICYmICF2YWxpZFNldC5jb250YWluc0FsbChuZmRTdHJpbmcpKSB7CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVSslMDRsWCB2YWxpZCAtPiBkaXNhbGxvd2VkOiBORkQgbm90IHdob2xseSB2YWxpZFxuIiwgKGxvbmcpYyk7CisgICAgICAgICAgICAgICAgICAgIGRpc2FsbG93ZWRTZXQuYWRkKGMpOworICAgICAgICAgICAgICAgICAgICByZW1vdmVTZXQuYWRkKGMpOworICAgICAgICAgICAgICAgICAgICBtYWRlQ2hhbmdlPVRSVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFsaWRTZXQucmVtb3ZlQWxsKHJlbW92ZVNldCk7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgcmVtb3ZlU2V0LmNsZWFyKCk7CisgICAgICAgICAgICBpY3U6OlVuaWNvZGVTZXRJdGVyYXRvciBpdGVyKG1hcHBlZFNldCk7CisgICAgICAgICAgICB3aGlsZShpdGVyLm5leHQoKSkgeworICAgICAgICAgICAgICAgIFVDaGFyMzIgYz1pdGVyLmdldENvZGVwb2ludCgpOworICAgICAgICAgICAgICAgIGNTdHJpbmcuc2V0VG8oYyk7CisgICAgICAgICAgICAgICAgbmZrY19jZi0+bm9ybWFsaXplKGNTdHJpbmcsIG1hcHBpbmcsIGVycm9yQ29kZSk7CisgICAgICAgICAgICAgICAgbmZkLT5ub3JtYWxpemUobWFwcGluZywgbmZkU3RyaW5nLCBlcnJvckNvZGUpOworICAgICAgICAgICAgICAgIGlmKCF2YWxpZFNldC5jb250YWluc0FsbChuZmRTdHJpbmcpKSB7CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVSslMDRsWCBtYXBwZWQgLT4gZGlzYWxsb3dlZDogTkZEIG9mIG1hcHBpbmcgbm90IHdob2xseSB2YWxpZFxuIiwgKGxvbmcpYyk7CisgICAgICAgICAgICAgICAgICAgIGRpc2FsbG93ZWRTZXQuYWRkKGMpOworICAgICAgICAgICAgICAgICAgICByZW1vdmVTZXQuYWRkKGMpOworICAgICAgICAgICAgICAgICAgICBtYWRlQ2hhbmdlPVRSVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWFwcGVkU2V0LnJlbW92ZUFsbChyZW1vdmVTZXQpOworICAgICAgICB9CisgICAgfSB3aGlsZShtYWRlQ2hhbmdlKTsKKyAgICBlcnJvckNvZGUuYXNzZXJ0U3VjY2VzcygpOworCisgICAgLy8gZmluaXNoIHVwCisgICAgbGFiZWxTZXBhcmF0b3JzLnJlbW92ZSgweDJlKS5mcmVlemUoKTsgIC8vIFUrMDAyRSBpcyBzaW1wbHkgdmFsaWQKKyAgICBkZXZpYXRpb25TZXQuZnJlZXplKCk7CisgICAgaWdub3JlZFNldC5mcmVlemUoKTsKKyAgICB2YWxpZFNldC5mcmVlemUoKTsKKyAgICBtYXBwZWRTZXQuZnJlZXplKCk7CisgICAgZGlzYWxsb3dlZFNURDNTZXQuZnJlZXplKCk7CisKKyAgICAvLyBvdXRwdXQKKyAgICBVQ2hhcjMyIHByZXZTdGFydD0wLCBjPTA7CisgICAgU3RhdHVzIHByZXZTdGF0dXM9RElTQUxMT1dFRF9TVEQzX1ZBTElELCBzdGF0dXM7CisgICAgaWN1OjpVbmljb2RlU3RyaW5nIHByZXZNYXBwaW5nOworICAgIFVWZXJzaW9uSW5mbyBwcmV2QWdlPXsgMSwgMSwgMCwgMCB9LCBhZ2U7CisKKyAgICBpY3U6OlVuaWNvZGVTZXRJdGVyYXRvciBpdGVyKGRpc2FsbG93ZWRTZXQpOworICAgIHdoaWxlKGl0ZXIubmV4dFJhbmdlKCkpIHsKKyAgICAgICAgVUNoYXIzMiBzdGFydD1pdGVyLmdldENvZGVwb2ludCgpOworICAgICAgICB3aGlsZShjPHN0YXJ0KSB7CisgICAgICAgICAgICBtYXBwaW5nLnJlbW92ZSgpOworICAgICAgICAgICAgaWYobGFiZWxTZXBhcmF0b3JzLmNvbnRhaW5zKGMpKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzPU1BUFBFRDsKKyAgICAgICAgICAgICAgICBtYXBwaW5nLnNldFRvKDB4MmUpOworICAgICAgICAgICAgfSBlbHNlIGlmKGRldmlhdGlvblNldC5jb250YWlucyhjKSkgeworICAgICAgICAgICAgICAgIHN0YXR1cz1ERVZJQVRJT047CisgICAgICAgICAgICAgICAgY1N0cmluZy5zZXRUbyhjKTsKKyAgICAgICAgICAgICAgICBuZmtjX2NmLT5ub3JtYWxpemUoY1N0cmluZywgbWFwcGluZywgZXJyb3JDb2RlKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZihpZ25vcmVkU2V0LmNvbnRhaW5zKGMpKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzPUlHTk9SRUQ7CisgICAgICAgICAgICB9IGVsc2UgaWYodmFsaWRTZXQuY29udGFpbnMoYykpIHsKKyAgICAgICAgICAgICAgICBpZihkaXNhbGxvd2VkU1REM1NldC5jb250YWlucyhjKSkgeworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlUrJTA0bFggdmFsaWQgLT4gZGlzYWxsb3dlZF9TVEQzX3ZhbGlkOiBpdHNlbGYgbm90IFNURDNcbiIsIChsb25nKWMpOworICAgICAgICAgICAgICAgICAgICBzdGF0dXM9RElTQUxMT1dFRF9TVEQzX1ZBTElEOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiggbmZkLT5nZXREZWNvbXBvc2l0aW9uKGMsIG5mZFN0cmluZykgJiYKKyAgICAgICAgICAgICAgICAgICAgZGlzYWxsb3dlZFNURDNTZXQuY29udGFpbnNTb21lKG5mZFN0cmluZykKKyAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJVKyUwNGxYIHZhbGlkIC0+IGRpc2FsbG93ZWRfU1REM192YWxpZDogTkZEIG5vdCB3aG9sbHkgU1REM1xuIiwgKGxvbmcpYyk7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cz1ESVNBTExPV0VEX1NURDNfVkFMSUQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzPVZBTElEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZihtYXBwZWRTZXQuY29udGFpbnMoYykpIHsKKyAgICAgICAgICAgICAgICBjU3RyaW5nLnNldFRvKGMpOworICAgICAgICAgICAgICAgIG5ma2NfY2YtPm5vcm1hbGl6ZShjU3RyaW5nLCBtYXBwaW5nLCBlcnJvckNvZGUpOworICAgICAgICAgICAgICAgIGlmKGRpc2FsbG93ZWRTVEQzU2V0LmNvbnRhaW5zU29tZShtYXBwaW5nKSkgeworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlUrJTA0bFggbWFwcGVkIC0+IGRpc2FsbG93ZWRfU1REM19tYXBwZWRcbiIsIChsb25nKWMpOworICAgICAgICAgICAgICAgICAgICBzdGF0dXM9RElTQUxMT1dFRF9TVEQzX01BUFBFRDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXM9TUFQUEVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIqKiogdW5kZXRlcm1pbmVkIHN0YXR1cyBvZiBVKyUwNGxYXG4iLCAobG9uZyljKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFByaW50IGEgbmV3IGxpbmUgd2hlcmUgdGhlIHN0YXR1cywgdGhlIG1hcHBpbmcgb3IKKyAgICAgICAgICAgIC8vIHRoZSBjaGFyYWN0ZXIgYWdlIGNoYW5nZS4KKyAgICAgICAgICAgIGdldEFnZUlmQXNzaWduZWQoYywgYWdlKTsKKyAgICAgICAgICAgIGlmKCBwcmV2U3RhcnQ8YyAmJgorICAgICAgICAgICAgICAgIChzdGF0dXMhPXByZXZTdGF0dXMgfHwgbWFwcGluZyE9cHJldk1hcHBpbmcgfHwgMCE9bWVtY21wKHByZXZBZ2UsIGFnZSwgNCkpCisgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICBwcmludExpbmUocHJldlN0YXJ0LCBjLTEsIHByZXZTdGF0dXMsIHByZXZNYXBwaW5nKTsKKyAgICAgICAgICAgICAgICBwcmV2U3RhcnQ9YzsKKyAgICAgICAgICAgICAgICBwcmV2U3RhdHVzPXN0YXR1czsKKyAgICAgICAgICAgICAgICBwcmV2TWFwcGluZz1tYXBwaW5nOworICAgICAgICAgICAgICAgIG1lbWNweShwcmV2QWdlLCBhZ2UsIDQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKytjOworICAgICAgICB9CisgICAgICAgIC8vIGM9PXN0YXJ0IGlzIGRpc2FsbG93ZWQKKyAgICAgICAgaWYocHJldlN0YXJ0PGMpIHsKKyAgICAgICAgICAgIHByaW50TGluZShwcmV2U3RhcnQsIGMtMSwgcHJldlN0YXR1cywgcHJldk1hcHBpbmcpOworICAgICAgICB9CisgICAgICAgIHByZXZTdGFydD1jOworICAgICAgICBwcmV2U3RhdHVzPURJU0FMTE9XRUQ7CisgICAgICAgIHByZXZNYXBwaW5nLnJlbW92ZSgpOworICAgICAgICBnZXRBZ2VJZkFzc2lnbmVkKGMsIHByZXZBZ2UpOworICAgICAgICBVQ2hhcjMyIGVuZD1pdGVyLmdldENvZGVwb2ludEVuZCgpOworICAgICAgICB3aGlsZSgrK2M8PWVuZCkgeworICAgICAgICAgICAgZ2V0QWdlSWZBc3NpZ25lZChjLCBhZ2UpOworICAgICAgICAgICAgaWYocHJldlN0YXJ0PGMgJiYgMCE9bWVtY21wKHByZXZBZ2UsIGFnZSwgNCkpIHsKKyAgICAgICAgICAgICAgICBwcmludExpbmUocHJldlN0YXJ0LCBjLTEsIHByZXZTdGF0dXMsIHByZXZNYXBwaW5nKTsKKyAgICAgICAgICAgICAgICBwcmV2U3RhcnQ9YzsKKyAgICAgICAgICAgICAgICBtZW1jcHkocHJldkFnZSwgYWdlLCA0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZihwcmV2U3RhcnQ8YykgeworICAgICAgICBwcmludExpbmUocHJldlN0YXJ0LCBjLTEsIHByZXZTdGF0dXMsIHByZXZNYXBwaW5nKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91bmljb2RlL2MvZ2VudXRzNDYvZ2VudXRzNDYuc2xuIGIvdW5pY29kZS9jL2dlbnV0czQ2L2dlbnV0czQ2LnNsbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjBhMTMwCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZS9jL2dlbnV0czQ2L2dlbnV0czQ2LnNsbgpAQCAtMCwwICsxLDIwIEBACivvu78KK01pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFNvbHV0aW9uIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDEwLjAwCisjIFZpc3VhbCBDKysgRXhwcmVzcyAyMDA4CitQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gImdlbnV0czQ2IiwgImdlbnV0czQ2LnZjcHJvaiIsICJ7MjBGOUYxQjEtRTM2Mi00QTRELTg0QkEtNTQ4NTU3NzQ1Q0Q5fSIKK0VuZFByb2plY3QKK0dsb2JhbAorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHByZVNvbHV0aW9uCisJCURlYnVnfFdpbjMyID0gRGVidWd8V2luMzIKKwkJUmVsZWFzZXxXaW4zMiA9IFJlbGVhc2V8V2luMzIKKwlFbmRHbG9iYWxTZWN0aW9uCisJR2xvYmFsU2VjdGlvbihQcm9qZWN0Q29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwb3N0U29sdXRpb24KKwkJezIwRjlGMUIxLUUzNjItNEE0RC04NEJBLTU0ODU1Nzc0NUNEOX0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzIKKwkJezIwRjlGMUIxLUUzNjItNEE0RC04NEJBLTU0ODU1Nzc0NUNEOX0uRGVidWd8V2luMzIuQnVpbGQuMCA9IERlYnVnfFdpbjMyCisJCXsyMEY5RjFCMS1FMzYyLTRBNEQtODRCQS01NDg1NTc3NDVDRDl9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMgorCQl7MjBGOUYxQjEtRTM2Mi00QTRELTg0QkEtNTQ4NTU3NzQ1Q0Q5fS5SZWxlYXNlfFdpbjMyLkJ1aWxkLjAgPSBSZWxlYXNlfFdpbjMyCisJRW5kR2xvYmFsU2VjdGlvbgorCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uCisJCUhpZGVTb2x1dGlvbk5vZGUgPSBGQUxTRQorCUVuZEdsb2JhbFNlY3Rpb24KK0VuZEdsb2JhbApkaWZmIC0tZ2l0IGEvdW5pY29kZS9jL2dlbnV0czQ2L2dlbnV0czQ2LnZjcHJvaiBiL3VuaWNvZGUvYy9nZW51dHM0Ni9nZW51dHM0Ni52Y3Byb2oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU0Zjg0MwotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGUvYy9nZW51dHM0Ni9nZW51dHM0Ni52Y3Byb2oKQEAgLTAsMCArMSwxODEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IldpbmRvd3MtMTI1MiI/PgorPFZpc3VhbFN0dWRpb1Byb2plY3QKKwlQcm9qZWN0VHlwZT0iVmlzdWFsIEMrKyIKKwlWZXJzaW9uPSI5LjAwIgorCU5hbWU9ImdlbnV0czQ2IgorCVByb2plY3RHVUlEPSJ7MjBGOUYxQjEtRTM2Mi00QTRELTg0QkEtNTQ4NTU3NzQ1Q0Q5fSIKKwlSb290TmFtZXNwYWNlPSJnZW51dHM0NiIKKwlLZXl3b3JkPSJXaW4zMlByb2oiCisJVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj0iMTk2NjEzIgorCT4KKwk8UGxhdGZvcm1zPgorCQk8UGxhdGZvcm0KKwkJCU5hbWU9IldpbjMyIgorCQkvPgorCTwvUGxhdGZvcm1zPgorCTxUb29sRmlsZXM+CisJPC9Ub29sRmlsZXM+CisJPENvbmZpZ3VyYXRpb25zPgorCQk8Q29uZmlndXJhdGlvbgorCQkJTmFtZT0iRGVidWd8V2luMzIiCisJCQlPdXRwdXREaXJlY3Rvcnk9IiQoU29sdXRpb25EaXIpJChDb25maWd1cmF0aW9uTmFtZSkiCisJCQlJbnRlcm1lZGlhdGVEaXJlY3Rvcnk9IiQoQ29uZmlndXJhdGlvbk5hbWUpIgorCQkJQ29uZmlndXJhdGlvblR5cGU9IjEiCisJCQlDaGFyYWN0ZXJTZXQ9IjEiCisJCQk+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUHJlQnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0N1c3RvbUJ1aWxkVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDWE1MRGF0YUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1dlYlNlcnZpY2VQcm94eUdlbmVyYXRvclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01JRExUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCIKKwkJCQlPcHRpbWl6YXRpb249IjAiCisJCQkJQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz0iLi5cLi5cLi5cLi5cLi5caWN1XHRydW5rXGluY2x1ZGUsIC4uXC4uXC4uXC4uXC4uXGljdVx0cnVua1xzb3VyY2VcY29tbW9uIgorCQkJCVByZXByb2Nlc3NvckRlZmluaXRpb25zPSJVX1VTSU5HX0lDVV9OQU1FU1BBQ0U9MCIKKwkJCQlNaW5pbWFsUmVidWlsZD0idHJ1ZSIKKwkJCQlCYXNpY1J1bnRpbWVDaGVja3M9IjMiCisJCQkJUnVudGltZUxpYnJhcnk9IjMiCisJCQkJVXNlUHJlY29tcGlsZWRIZWFkZXI9IjAiCisJCQkJV2FybmluZ0xldmVsPSIzIgorCQkJCURlYnVnSW5mb3JtYXRpb25Gb3JtYXQ9IjQiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ01hbmFnZWRSZXNvdXJjZUNvbXBpbGVyVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUxpbmtFdmVudFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0xpbmtlclRvb2wiCisJCQkJQWRkaXRpb25hbERlcGVuZGVuY2llcz0iaWN1dWNkLmxpYiIKKwkJCQlMaW5rSW5jcmVtZW50YWw9IjIiCisJCQkJQWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz0iLi5cLi5cLi5cLi5cLi5caWN1XHRydW5rXGxpYiIKKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiCisJCQkJU3ViU3lzdGVtPSIxIgorCQkJCVRhcmdldE1hY2hpbmU9IjEiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJCTxDb25maWd1cmF0aW9uCisJCQlOYW1lPSJSZWxlYXNlfFdpbjMyIgorCQkJT3V0cHV0RGlyZWN0b3J5PSIkKFNvbHV0aW9uRGlyKSQoQ29uZmlndXJhdGlvbk5hbWUpIgorCQkJSW50ZXJtZWRpYXRlRGlyZWN0b3J5PSIkKENvbmZpZ3VyYXRpb25OYW1lKSIKKwkJCUNvbmZpZ3VyYXRpb25UeXBlPSIxIgorCQkJQ2hhcmFjdGVyU2V0PSIxIgorCQkJV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPSIxIgorCQkJPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1ByZUJ1aWxkRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNDdXN0b21CdWlsZFRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1hNTERhdGFHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNXZWJTZXJ2aWNlUHJveHlHZW5lcmF0b3JUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNSURMVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiCisJCQkJT3B0aW1pemF0aW9uPSIyIgorCQkJCUVuYWJsZUludHJpbnNpY0Z1bmN0aW9ucz0idHJ1ZSIKKwkJCQlBZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPSIuLlwuLlwuLlwuLlwuLlxpY3VcdHJ1bmtcaW5jbHVkZSwgLi5cLi5cLi5cLi5cLi5caWN1XHRydW5rXHNvdXJjZVxjb21tb24iCisJCQkJUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM9IlVfVVNJTkdfSUNVX05BTUVTUEFDRT0wIgorCQkJCVJ1bnRpbWVMaWJyYXJ5PSIyIgorCQkJCUVuYWJsZUZ1bmN0aW9uTGV2ZWxMaW5raW5nPSJ0cnVlIgorCQkJCVVzZVByZWNvbXBpbGVkSGVhZGVyPSIwIgorCQkJCVdhcm5pbmdMZXZlbD0iMyIKKwkJCQlEZWJ1Z0luZm9ybWF0aW9uRm9ybWF0PSIzIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNNYW5hZ2VkUmVzb3VyY2VDb21waWxlclRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ1Jlc291cmNlQ29tcGlsZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQcmVMaW5rRXZlbnRUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNMaW5rZXJUb29sIgorCQkJCUFkZGl0aW9uYWxEZXBlbmRlbmNpZXM9ImljdXVjLmxpYiIKKwkJCQlMaW5rSW5jcmVtZW50YWw9IjEiCisJCQkJQWRkaXRpb25hbExpYnJhcnlEaXJlY3Rvcmllcz0iLi5cLi5cLi5cLi5cLi5caWN1XHRydW5rXGxpYiIKKwkJCQlHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb249InRydWUiCisJCQkJU3ViU3lzdGVtPSIxIgorCQkJCU9wdGltaXplUmVmZXJlbmNlcz0iMiIKKwkJCQlFbmFibGVDT01EQVRGb2xkaW5nPSIyIgorCQkJCVRhcmdldE1hY2hpbmU9IjEiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0FMaW5rVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDTWFuaWZlc3RUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNYRENNYWtlVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQnNjTWFrZVRvb2wiCisJCQkvPgorCQkJPFRvb2wKKwkJCQlOYW1lPSJWQ0Z4Q29wVG9vbCIKKwkJCS8+CisJCQk8VG9vbAorCQkJCU5hbWU9IlZDQXBwVmVyaWZpZXJUb29sIgorCQkJLz4KKwkJCTxUb29sCisJCQkJTmFtZT0iVkNQb3N0QnVpbGRFdmVudFRvb2wiCisJCQkvPgorCQk8L0NvbmZpZ3VyYXRpb24+CisJPC9Db25maWd1cmF0aW9ucz4KKwk8UmVmZXJlbmNlcz4KKwk8L1JlZmVyZW5jZXM+CisJPEZpbGVzPgorCQk8RmlsZQorCQkJUmVsYXRpdmVQYXRoPSIuXGdlbnV0czQ2LmNwcCIKKwkJCT4KKwkJPC9GaWxlPgorCTwvRmlsZXM+CisJPEdsb2JhbHM+CisJPC9HbG9iYWxzPgorPC9WaXN1YWxTdHVkaW9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdW5pY29kZS9jL3JlYWRtZS50eHQgYi91bmljb2RlL2MvcmVhZG1lLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDlhMzAyCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZS9jL3JlYWRtZS50eHQKQEAgLTAsMCArMSwzMSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTAsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMKKyMgQ29ycG9yYXRpb24gYW5kIG90aGVycy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIGNyZWF0ZWQgb246IDIwMTBqdW4wNAorIyBjcmVhdGVkIGJ5OiBNYXJrdXMgVy4gU2NoZXJlcgorCitUaGVzZSB0b29scyBwYXJzZSBVbmljb2RlIENoYXJhY3RlciBEYXRhYmFzZSBmaWxlcyBhbmQgZ2VuZXJhdGUKK2RhdGEgZmlsZXMgKHRleHQsIHNvdXJjZSBjb2RlIGFuZCBiaW5hcnkpIGZvciB1c2UgaW4gSUNVLgorVGhleSBhcmUgdXNlZCBkdXJpbmcgdGhlIFVuaWNvZGUgYmV0YSBwZXJpb2QgYW5kIGFmdGVyIGEgVW5pY29kZSByZWxlYXNlLgorCitGb3IgYSBsb2cgb2YgYWN0aW9ucyBhbmQgY2hhbmdlcyBmb3IgcmVjZW50IFVuaWNvZGUgdmVyc2lvbiB1cGdyYWRlcyBvZiBJQ1UsIHNlZQoraHR0cDovL2J1Z3MuaWN1LXByb2plY3Qub3JnL3RyYWMvYnJvd3Nlci9pY3UvdHJ1bmsvc291cmNlL2RhdGEvdW5pZGF0YS9jaGFuZ2VzLnR4dAorCitTaW5jZSB0aGUgVW5pY29kZSA1LjIgdXBncmFkZSwgdGhlc2UgdG9vbHMgaGF2ZSBiZWVuIG1vdmVkIG91dCBvZiB0aGUgSUNVIHNvdXJjZQordHJlZSB0byBoZXJlLiBUaGV5IGhhdmUgbm90IGJlZW4gZnVsbHkgdGVzdGVkIGFuZCBwcm9iYWJseSBuZWVkIHNvbWUgbW9yZSB3b3JrCithbmQgc2V0dXAuIFRoZXkgbWlnaHQgYmVuZWZpdCBmcm9tIGFkZGl0aW9uYWwgc2hlbGwgb3IgUHl0aG9uIHNjcmlwdHMuCisKK1RoZXJlIGFyZSBhdXRvY29uZiBtYWtlZmlsZXMgKE1ha2VmaWxlLmluKSBhbmQgVmlzdWFsIEMrKyBwcm9qZWN0IGZpbGVzICgudmNwcm9qKQoraW4gdGhlIHN1YmZvbGRlcnMuIFRoZXkgYXJlIGNvcGllZCBvdmVyIGZyb20gdGhlIElDVSBzb3VyY2UgdHJlZSBhbmQgd2lsbCBub3QKK3dvcmsgd2l0aG91dCBtb2RpZmljYXRpb25zLiBIb3dldmVyLCBJIHN0YXJ0ZWQgdG8gdXNlIENNYWtlIChDTWFrZUxpc3RzLnR4dCkKK3doaWNoIGlzIG11Y2ggc2ltcGxlciwgYW5kIGlmIGl0IHdvcmtzIHdlbGwgZW5vdWdoIHRoZW4gSSBwbGFuIHRvIGp1c3QKK2RlbGV0ZSB0aGUgb2xkIG1ha2VmaWxlcyBhbmQgcHJvamVjdCBmaWxlcy4gVGhlIENNYWtlIGZpbGVzIHNob3VsZAord29yayBvbiBMaW51eCBhbmQgTWFjT1MgWC4KK0kgc2hvdWxkIHVzZSBtb3JlIHZhcmlhYmxlcyB0byBtYWtlIHRoZSBDTWFrZSBmaWxlcyBtb3JlIHBvcnRhYmxlLCBhbmQgc2hvdWxkCit1c2UgSUNVJ3MgaW5zdGFsbGVkIGljdS1jb25maWcgb3IgTWFrZWZpbGUuaW5jIHRvIGdldCB0aGUgdmFsdWVzIGZvciB0aGVzZQordmFyaWFibGVzLgorKElmIGFuZCB3aGVuIElDVSBpdHNlbGYgdXNlcyBDTWFrZSwgd2Ugc2hvdWxkIGJlIGFibGUgdG8gcG9pbnQgdG8gaXRzIG1vZHVsZXMuKQorCitUaGluZ3Mgd2lsbCBpbXByb3ZlIGFzIEkgd29yayBvbiBVbmljb2RlIDYuLi4KKworbWFya3VzCmRpZmYgLS1naXQgYS91bmljb2RlL21ha2VkZWZzLnNoIGIvdW5pY29kZS9tYWtlZGVmcy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45NDk2MTY0Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZS9tYWtlZGVmcy5zaApAQCAtMCwwICsxLDE2IEBACisjIENvcHlyaWdodCAoQykgMjAxMCwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcworIyBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgQmFzaWMgZGVmaW5pdGlvbnMgZm9yIGJ1aWxkaW5nIElDVSBVbmljb2RlIGRhdGEuCisjIFNvdXJjZWQgZnJvbSBtYWtlcHJvcHMuc2ggZm9yIGV4YW1wbGUuCitVTklDT0RFX1ZFUlNJT049Ni4wCisjIEFzc3VtZSB0aGF0IHRoZXJlIGFyZSBwYXJhbGxlbCBzcmMgJiBibGQgdHJlZXMgd2l0aCB0aGUgVW5pY29kZSB0b29scworIyBzb3VyY2UgZmlsZXMgYW5kIHRoZSBvdXQtb2Ytc291cmNlIGJ1aWxkIGZpbGVzLgorIyBBc3N1bWUgdGhhdCB0aGUgY3VycmVudCBmb2xkZXIgaXMgc29tZS9wYXRoL3NyYy91bmljb2RlCitVTklUT09MU19CTEQ9Li4vLi4vYmxkL3VuaWNvZGUKKyMgVGhlIHNvdXJjaW5nIHNjcmlwdCBtdXN0IGRlZmluZSBJQ1VfU1JDIGFuZCBJQ1VfQkxEIGZvciB0aGUgSUNVIGxpYnJhcnkKKyMgc291cmNlIGZpbGVzIGFuZCB0aGUgb3V0LW9mLXNvdXJjZSBidWlsZCBmaWxlcy4KK1VOSURBVEE9JElDVV9TUkMvc291cmNlL2RhdGEvdW5pZGF0YQorQ09NTU9OPSRJQ1VfU1JDL3NvdXJjZS9jb21tb24KK1NSQ19EQVRBX0lOPSRJQ1VfU1JDL3NvdXJjZS9kYXRhL2luCitCTERfREFUQV9GSUxFUz0kSUNVX0JMRC9kYXRhL291dC9idWlsZC9pY3VkdDQ1bApkaWZmIC0tZ2l0IGEvdW5pY29kZS9tYWtlcHJvcHMuc2ggYi91bmljb2RlL21ha2Vwcm9wcy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44M2M3NjUxCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZS9tYWtlcHJvcHMuc2gKQEAgLTAsMCArMSw1MCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTAsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMKKyMgQ29ycG9yYXRpb24gYW5kIG90aGVycy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIFBhcnNlcyBVbmljb2RlIENoYXJhY3RlciBEYXRhYmFzZSBmaWxlcyBhbmQgYnVpbGQgSUNVIGNvcmUgcHJvcGVydGllcyBmaWxlcy4KKyMKKyMgSW52b2tlIGFzCisjICAgLi9tYWtlcHJvcHMuc2ggcGF0aC90by9JQ1Uvc3JjL3RyZWUgcGF0aC90by9JQ1UvYnVpbGQvdHJlZQorIworIyBQcmVyZXF1aXNpdGU6CisjIEluIGEgVW5pY29kZSB2ZXJzaW9uIHVwZ3JhZGUsIHBuYW1lcy5pY3UgbXVzdCBiZSBnZW5lcmF0ZWQgZmlyc3Qgc28gdGhhdCB0aGUKKyMgdG9vbHMgaGVyZSBzZWUgbmV3IHByb3BlcnR5IG5hbWVzIGFuZCBwcm9wZXJ0eSB2YWx1ZSBuYW1lcy4KKyMgU2VlIChJQ1UpL3NvdXJjZS9kYXRhL3VuaWRhdGEvY2hhbmdlcy50eHQuCitJQ1VfU1JDPSQxCitJQ1VfQkxEPSQyCitzb3VyY2UgLi9tYWtlZGVmcy5zaAorCisjIHVwcm9wcy5pY3UKKyRVTklUT09MU19CTEQvYy9nZW5wcm9wcy9nZW5wcm9wcyAtZCAkU1JDX0RBVEFfSU4gICAgICAtcyAkVU5JREFUQSAtaSAkQkxEX0RBVEFfRklMRVMgLXUgJFVOSUNPREVfVkVSU0lPTgorJFVOSVRPT0xTX0JMRC9jL2dlbnByb3BzL2dlbnByb3BzIC1kICRDT01NT04gLS1jc291cmNlIC1zICRVTklEQVRBIC1pICRCTERfREFUQV9GSUxFUyAtdSAkVU5JQ09ERV9WRVJTSU9OCisKKyMgdWJpZGkuaWN1CiskVU5JVE9PTFNfQkxEL2MvZ2VuYmlkaS9nZW5iaWRpIC1kICRTUkNfREFUQV9JTiAgICAgIC1zICRVTklEQVRBIC1pICRCTERfREFUQV9GSUxFUyAtdSAkVU5JQ09ERV9WRVJTSU9OCiskVU5JVE9PTFNfQkxEL2MvZ2VuYmlkaS9nZW5iaWRpIC1kICRDT01NT04gLS1jc291cmNlIC1zICRVTklEQVRBIC1pICRCTERfREFUQV9GSUxFUyAtdSAkVU5JQ09ERV9WRVJTSU9OCisKKyMgdWNhc2UuaWN1CiskVU5JVE9PTFNfQkxEL2MvZ2VuY2FzZS9nZW5jYXNlIC1kICRTUkNfREFUQV9JTiAgICAgIC1zICRVTklEQVRBIC1pICRCTERfREFUQV9GSUxFUyAtdSAkVU5JQ09ERV9WRVJTSU9OCiskVU5JVE9PTFNfQkxEL2MvZ2VuY2FzZS9nZW5jYXNlIC1kICRDT01NT04gLS1jc291cmNlIC1zICRVTklEQVRBIC1pICRCTERfREFUQV9GSUxFUyAtdSAkVU5JQ09ERV9WRVJTSU9OCisKKyMgdW5hbWVzLmljdQorJFVOSVRPT0xTX0JMRC9jL2dlbm5hbWVzL2dlbm5hbWVzIC1kICRTUkNfREFUQV9JTiAtMSAtcSAkVU5JREFUQS9Vbmljb2RlRGF0YS50eHQgJFVOSURBVEEvTmFtZUFsaWFzZXMudHh0IC11ICRVTklDT0RFX1ZFUlNJT04KKworIyB1bmlkYXRhL25vcm0yLyoudHh0CiskVU5JVE9PTFNfQkxEL2MvZ2Vubm9ybS9nZW5ub3JtIC1kICRVTklEQVRBL25vcm0yIC1zICRVTklEQVRBIC1pICRCTERfREFUQV9GSUxFUworCisjICoubnJtCitleHBvcnQgTERfTElCUkFSWV9QQVRIPSRJQ1VfQkxEL2xpYgorJElDVV9CTEQvYmluL2dlbm5vcm0yIC1vICRTUkNfREFUQV9JTi9uZmMubnJtICAgICAtcyAkVU5JREFUQS9ub3JtMiBuZmMudHh0ICAgICAgICAgICAgICAtdSAkVU5JQ09ERV9WRVJTSU9OCiskSUNVX0JMRC9iaW4vZ2Vubm9ybTIgLW8gJFNSQ19EQVRBX0lOL25ma2MubnJtICAgIC1zICRVTklEQVRBL25vcm0yIG5ma2MudHh0ICAgICAgICAgICAgIC11ICRVTklDT0RFX1ZFUlNJT04KKyRJQ1VfQkxEL2Jpbi9nZW5ub3JtMiAtbyAkU1JDX0RBVEFfSU4vbmZrY19jZi5ucm0gLXMgJFVOSURBVEEvbm9ybTIgbmZrYy50eHQgbmZrY19jZi50eHQgLXUgJFVOSUNPREVfVkVSU0lPTgorJElDVV9CTEQvYmluL2dlbm5vcm0yIC1vICRTUkNfREFUQV9JTi91dHM0Ni5ucm0gICAtcyAkVU5JREFUQS9ub3JtMiBuZmMudHh0IHV0czQ2LnR4dCAgICAtdSAkVU5JQ09ERV9WRVJTSU9OCisKKyMgTGV0IGdlbnVjYSBzZWUgdGhlIGxhdGVzdCBub3JtYWxpemF0aW9uIGRhdGEuCitjcCAkU1JDX0RBVEFfSU4vbmZjLm5ybSAkQkxEX0RBVEFfRklMRVMKKworIyBVQ0EKKyRVTklUT09MU19CTEQvYy9nZW51Y2EvZ2VudWNhIC1kICRTUkNfREFUQV9JTi9jb2xsIC1zICRVTklEQVRBIC1pICRCTERfREFUQV9GSUxFUworIyBJZiB0aGlzIGlzIHRoZSBmaXJzdCBwYXNzIHRocm91Z2ggcmVidWlsZGluZyBJQ1UgZGF0YSBmaWxlcywKKyMgdGhlbiBnZW51Y2EgaGFzIG5vdCB5ZXQgc2VlbiB0aGUgbmV3IGNvcmUgcHJvcGVydGllcyAoZS5nLiwgY2FzZSBtYXBwaW5ncykKKyMgZnJvbSBnZW5wcm9wcyAtLWNzb3VyY2UuIFJlYnVpbGQgSUNVIGFuZCB0aGVuIHRoZSBVQ0EgZGF0YSAobWFrZXVjYS5zaCkuCisjIFNlZSAoSUNVKS9zb3VyY2UvZGF0YS91bmlkYXRhL2NoYW5nZXMudHh0LgpkaWZmIC0tZ2l0IGEvdW5pY29kZS9tYWtldWNhLnNoIGIvdW5pY29kZS9tYWtldWNhLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU3NTM2MWUKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RlL21ha2V1Y2Euc2gKQEAgLTAsMCArMSwxNSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTAsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMKKyMgQ29ycG9yYXRpb24gYW5kIG90aGVycy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIFBhcnNlcyBVbmljb2RlIENoYXJhY3RlciBEYXRhYmFzZSBmaWxlcyBhbmQgYnVpbGQgSUNVIFVDQSBkYXRhIGZpbGVzLgorIworIyBSZXF1aXJlczogMS4gcnVuIG1ha2Vwcm9wcy5zaCAgMi4gcmVidWlsZCBJQ1UgJiBVbmljb2RlIHRvb2xzCisjIFNlZSAoSUNVKS9zb3VyY2UvZGF0YS91bmlkYXRhL2NoYW5nZXMudHh0CisjCisjIEludm9rZSBhcworIyAgIC4vbWFrZXVjYS5zaCBwYXRoL3RvL0lDVS9zcmMvdHJlZSBwYXRoL3RvL0lDVS9idWlsZC90cmVlCitJQ1VfU1JDPSQxCitJQ1VfQkxEPSQyCitzb3VyY2UgLi9tYWtlZGVmcy5zaAorCiskVU5JVE9PTFNfQkxEL2MvZ2VudWNhL2dlbnVjYSAtZCAkU1JDX0RBVEFfSU4vY29sbCAtcyAkVU5JREFUQSAtaSAkQkxEX0RBVEFfRklMRVMKZGlmZiAtLWdpdCBhL3VuaWNvZGUvcHkvaWRuYTJucm0ucHkgYi91bmljb2RlL3B5L2lkbmEybnJtLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmVjOGE5ODMKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RlL3B5L2lkbmEybnJtLnB5CkBAIC0wLDAgKzEsODkgQEAKKyMhL3Vzci9iaW4vcHl0aG9uMi40CisjICAgQ29weXJpZ2h0IChDKSAyMDEwLCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzCisjICAgQ29ycG9yYXRpb24gYW5kIG90aGVycy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjICAgZmlsZSBuYW1lOiAgaWRuYTJucm0ucHkKKyMgICBlbmNvZGluZzogICBVUy1BU0NJSQorIyAgIHRhYiBzaXplOiAgIDggKG5vdCB1c2VkKQorIyAgIGluZGVudGF0aW9uOjQKKyMKKyMgICBjcmVhdGVkIG9uOiAyMDEwamFuMjgKKyMgICBjcmVhdGVkIGJ5OiBNYXJrdXMgVy4gU2NoZXJlcgorCisiIiJUdXJuIFVuaWNvZGUgSWRuYU1hcHBpbmdUYWJsZS50eHQgaW50byBJQ1UgZ2Vubm9ybTIgc291cmNlIGZpbGUgZm9ybWF0LiIiIgorCitfX2F1dGhvcl9fID0gIk1hcmt1cyBTY2hlcmVyIgorCitpbXBvcnQgcmUKKworcmVwbGFjZW1lbnRzID0gWworICAjIFNldmVyYWwgdmVyc2lvbnMgb2YgYXZvaWRpbmcgY2lyY3VsYXIgRkZGRD5GRkZEIG1hcHBpbmdzLAorICAjIGRlcGVuZGluZyBvbiB0aGUgdmVyc2lvbiBvZiB0aGUgaW5wdXQgZmlsZS4KKyAgKHJlLmNvbXBpbGUociJGRkZEICAgICAgICAgIDsgZGlzYWxsb3dlZCIpLCAiIyBGRkZEIChhdm9pZCBjaXJjdWxhciBtYXBwaW5nKSIpLAorICAocmUuY29tcGlsZShyIlwuXC5GRkZEIiksICIuLkZGRkMiKSwKKyAgKHJlLmNvbXBpbGUociIoRkZGW15FXSlcLlwuRkZGRiIpLCAiXDEuLkZGRkMiKSwKKyAgIyBTaW5jZSB3ZSBzd2l0Y2ggYmV0d2VlbiBjaGVja2luZyBhbmQgbm90IGNoZWNraW5nIGZvciBTVEQzIGNoYXJhY3RlcgorICAjIHJlc3RyaWN0aW9ucyBhdCBydW50aW1lLCBjaGVja2luZyB0aGUgbm9uLUxESCBBU0NJSSBjaGFyYWN0ZXJzIGluIGNvZGUsCisgICMgd2UgdHJlYXQgdGhlc2UgdmFsdWVzIGhlcmUgbGlrZSB0aGVpciByZWd1bGFyIHNpYmxpbmdzLgorICAocmUuY29tcGlsZShyIl4oW147XSspICA7IGRpc2FsbG93ZWRfU1REM192YWxpZCIpLCByIiMgXDFkaXNhbGxvd2VkX1NURDNfdmFsaWQiKSwKKyAgKHJlLmNvbXBpbGUociI7IGRpc2FsbG93ZWRfU1REM19tYXBwZWQgKzsgIiksICI+IiksCisgICMgTm9ybWFsIHRyYW5zZm9ybWF0aW9ucy4KKyAgKHJlLmNvbXBpbGUociI7IGRpc2FsbG93ZWQiKSwgIj5GRkZEIiksCisgIChyZS5jb21waWxlKHIiOyBpZ25vcmVkIiksICI+IiksCisgIChyZS5jb21waWxlKHIiXihbXjtdKykgIDsgdmFsaWQiKSwgciIjIFwxdmFsaWQiKSwKKyAgKHJlLmNvbXBpbGUociI7IG1hcHBlZCArOyAiKSwgIj4iKSwKKyAgKHJlLmNvbXBpbGUociJeKFteO10rKSAgOyBkZXZpYXRpb24gKzsgIiksIHIiIyBcMWRldmlhdGlvbiA+IikKK10KKworaW5fZmlsZSA9IG9wZW4oIklkbmFNYXBwaW5nVGFibGUudHh0IiwgInIiKQorb3V0X2ZpbGUgPSBvcGVuKCJ1dHM0Ni50eHQiLCAidyIpCisKK291dF9maWxlLndyaXRlKCIjIE9yaWdpbmFsIGZpbGU6XG4iKQorZm9yIGxpbmUgaW4gaW5fZmlsZToKKyAgb3JpZ19saW5lID0gbGluZQorICBpZiBsaW5lLnN0YXJ0c3dpdGgoIiMgRm9yIGRvY3VtZW50YXRpb24sIHNlZSIpOgorICAgIG91dF9maWxlLndyaXRlKGxpbmUpCisgICAgb3V0X2ZpbGUud3JpdGUociIiIgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgVGhpcyBmaWxlIGhhcyBiZWVuIHJlZm9ybWF0dGVkIGludG8gc3ludGF4IGZvciB0aGUKKyMgZ2Vubm9ybTIgTm9ybWFsaXplcjIgZGF0YSBnZW5lcmF0b3IgdG9vbC4KKyMKKyMgInZhbGlkIiwgImRpc2FsbG93ZWRfU1REM192YWxpZCIgYW5kICJkZXZpYXRpb24iIGxpbmVzIGFyZSBjb21tZW50ZWQgb3V0LgorIyAibWFwcGVkIiBhbmQgImRpc2FsbG93ZWRfU1REM19tYXBwZWQiIGFyZSBjaGFuZ2VkIHRvIHVzZSB0aGUgIj4iIG1hcHBpbmcgc3ludGF4LgorIyAiZGlzYWxsb3dlZCIgbGluZXMgbWFwIHRvIFUrRkZGRC4KKyMgImlnbm9yZWQiIGxpbmVzIG1hcCB0byBhbiBlbXB0eSBzdHJpbmcuCisjCisjIENoYXJhY3RlcnMgZGlzYWxsb3dlZCB1bmRlciBTVEQzIHJ1bGVzIGFyZSB0cmVhdGVkIGFzIHZhbGlkIG9yIG1hcHBlZDsKKyMgdGhleSBhcmUgaGFuZGxlZCBpbiBjb2RlLgorIyBEZXZpYXRpb24gY2hhcmFjdGVycyBhcmUgYWxzbyBoYW5kbGVkIGluIGNvZGUuCisjCisjIFVzZSB0aGlzIGZpbGUgYXMgdGhlIHNlY29uZCBnZW5ub3JtMiBpbnB1dCBmaWxlIGFmdGVyIG5mYy50eHQuCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIiIiKQorICAgIGNvbnRpbnVlCisgIGlmIGxpbmVbMF0gaW4gIiNcclxuIjoKKyAgICBvdXRfZmlsZS53cml0ZShsaW5lKQorICAgIGNvbnRpbnVlCisgIGZvciByZXAgaW4gcmVwbGFjZW1lbnRzOiBsaW5lID0gcmVwWzBdLnN1YihyZXBbMV0sIGxpbmUpCisgICMgQWxpZ24gaW5saW5lIGNvbW1lbnRzIGF0IGNvbHVtbiA0MC4KKyAgY29tbWVudF9wb3MgPSBsaW5lLmZpbmQoIiMiLCAxKQorICBpZiBjb21tZW50X3BvcyA8IDQwOgorICAgIGxpbmUgPSBsaW5lWzpjb21tZW50X3Bvc10gKyAoKDQwIC0gY29tbWVudF9wb3MpICogJyAnKSArIGxpbmVbY29tbWVudF9wb3M6XQorICBlbGlmIGNvbW1lbnRfcG9zID4gNDA6CisgICAgc3BhY2VfcG9zID0gY29tbWVudF9wb3MKKyAgICB3aGlsZSBzcGFjZV9wb3MgPiAwIGFuZCBsaW5lW3NwYWNlX3BvcyAtIDFdID09ICcgJzoKKyAgICAgIHNwYWNlX3BvcyA9IHNwYWNlX3BvcyAtIDEKKyAgICBpZiBzcGFjZV9wb3MgPCA0MDoKKyAgICAgICMgRmV3ZXIgdGhhbiA0MCBjaGFyYWN0ZXJzIGJlZm9yZSB0aGUgY29tbWVudDoKKyAgICAgICMgQWxpZ24gY29tbWVudHMgYXQgY29sdW1uIDQwLgorICAgICAgbGluZSA9IGxpbmVbOjQwXSArIGxpbmVbY29tbWVudF9wb3M6XQorICAgIGVsc2U6CisgICAgICAjIDQwIG9yIG1vcmUgY2hhcmFjdGVycyBiZWZvcmUgdGhlIGNvbW1lbnQ6CisgICAgICAjIEtlZXAgb25lIHNwYWNlIGJldHdlZW4gY29udGVudHMgYW5kIGNvbW1lbnQuCisgICAgICBsaW5lID0gbGluZVs6c3BhY2VfcG9zXSArICIgIiArIGxpbmVbY29tbWVudF9wb3M6XQorICAjIFdyaXRlIHRoZSBtb2RpZmllZCBsaW5lLgorICBvdXRfZmlsZS53cml0ZShsaW5lKQorICBpZiAiLi5GRkZGIiBpbiBvcmlnX2xpbmUgYW5kICIuLkZGRkMiIGluIGxpbmU6CisgICAgb3V0X2ZpbGUud3JpdGUoIkZGRkUuLkZGRkYgICAgPkZGRkRcbiIpOworaW5fZmlsZS5jbG9zZSgpCitvdXRfZmlsZS5jbG9zZSgpCmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vQnVuZGxlLmphdmEgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vQnVuZGxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ExZWVjZAotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9CdW5kbGUuamF2YQpAQCAtMCwwICsxLDQ3MCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDcsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kICAqCisgKiBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitwYWNrYWdlIGNvbS5pYm0ucmJtOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLio7CisKK2ltcG9ydCBjb20uaWJtLnJibS5ndWkuUkJNYW5hZ2VyR1VJOworCisvKioKKyAqIEEgY2xhc3MgcmVwcmVzZW50aW5nIHRoZSBlbnRpcmUgQnVuZGxlIG9mIFJlc291cmNlcyBmb3IgYSBwYXJ0aWN1bGFyIGxhbmd1YWdlLCBjb3VudHJ5LCB2YXJpYW50LgorICogCisgKiBAYXV0aG9yIEphcmVkIEphY2tzb24KKyAqIEBzZWUgY29tLmlibS5yYm0uUkJNYW5hZ2VyCisgKi8KK3B1YmxpYyBjbGFzcyBCdW5kbGUgeworICAgIAorICAgIC8qKgorICAgICAqIFRoZSBmb2xsb3dpbmcgcHVibGljIGNsYXNzIHZhcmlhYmxlcyByZWZsZWN0IHRoZSB2YXJpb3VzIHByb3BlcnRpZXMgdGhhdCBjYW4gYmUgaW5jbHVkZWQgYXMKKyAgICAgKiBtZXRhLWRhdGEgaW4gYSByZXNvdXJjZSBidW5kbGUgZm9ybWF0dGVkIGJ5IFJCTWFuYWdlcgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgbmFtZTsKKyAgICAvKioKKyAgICAgKiBUaGUgZW5jb2Rpbmcgb2YgdGhlIGJ1bmRsZSAoZS5nLiAnZW4nLCAnZW5fVVMnLCAnZGUnLCBldGMuKQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZW5jb2Rpbmc7CisgICAgLyoqCisgICAgICogQSBkZXNjcmlwdG9yIG9mIHRoZSBsYW5ndWFnZSBpbiB0aGUgZW5jb2RpbmcgKGUuZy4gRW5nbGlzaCwgR2VybWFuLCBldGMuKQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgbGFuZ3VhZ2U7CisgICAgLyoqCisgICAgICogQSBkZXNjcmlwdG9yIG9mIHRoZSBjb3VudHJ5IGluIHRoZSBlbmNvZGluZyAoZS5nLiBVUywgQ2FuYWRhLCBHcmVhdCBCcml0YWluKQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgY291bnRyeTsKKyAgICAvKioKKyAgICAgKiBUaGUgZGVzY3JpcHRvciBvZiB0aGUgdmFyaWFudCBpbiB0aGUgZW5jb2RpbmcgKGUuZy4gRXVybywgSXJpc2gsIGV0Yy4pCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB2YXJpYW50OworICAgIC8qKgorICAgICAqIEEgY29tbWVudCBjb25jZXJuaW5nIHRoZSBidW5kbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGNvbW1lbnQ7CisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIHBlcnNvbiByZXNwb25zaWJsZSBmb3IgdGhlIG1hbmFnZXJtZW50IG9mIHRoaXMgYnVuZGxlCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBtYW5hZ2VyOworICAgIAorICAgIHByaXZhdGUgVHJlZVNldCBncm91cHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSB2ZWN0b3Igb2YgZ3JvdXBzIG9mIE5MUyBpdGVtcywgdGhlIGtleSBpcyB0aGUgZ3JvdXAgbmFtZQorICAgIAorICAgIC8qKgorICAgICAqIEEgaGFzaHRhYmxlIG9mIGFsbCBvZiB0aGUgaXRlbXMgaW4gdGhlIGJ1bmRsZSwgaGFzaGVkIGFjY29yZGluZyB0byB0aGVpcgorICAgICAqIE5MUyBrZXkuCisgICAgICovCisgICAgCisgICAgcHVibGljIEhhc2h0YWJsZSBhbGxJdGVtczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIGhhc2h0YWJsZSBvZiBhbGwgaXRlbXMgaW4gdGhlIGZpbGUsIHRoZSBrZXkgaXMgdGhlIE5MUyBrZXkKKyAgICAKKyAgICBwcml2YXRlIFRyZWVTZXQgdW50cmFuc2xhdGVkSXRlbXM7ICAgICAgICAgICAgICAgICAgICAgIC8vIEEgdmVjdG9yIG9mIGFsbCBpdGVtcyB3aGljaCBhcmUgdW50cmFuc2xhdGVkCisgICAgCisgICAgLyoqCisgICAgICogQSB2ZWN0b3IgY29udGFpbmluZyBhbGwgb2YgdGhlIGl0ZW1zIHdoaWNoIGFyZSBkdXBsaWNhdGVzIChiYXNlZCBvbiB0aGUgTkxTIGtleXMpCisgICAgICogb2YgaXRlbXMgcHJldmlvdXNseSBkZWNsYXJlZCBpbiB0aGUgYnVuZGxlLgorICAgICAqLworICAgIAorICAgIHB1YmxpYyBWZWN0b3IgZHVwbGljYXRlczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSB2ZWN0b3Igb2YgaXRlbXMgd2hpY2ggYXJlIGR1cGxpY2F0ZXMgKE5MUyBLZXlzKSBvZiBwcmV2aW91cyBpdGVtcworCQkKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgY3JlYXRpbmcgYW4gZW1wdHkgYnVuZGxlIHdpdGggYSBnaXZlbiBlbmNvZGluZworICAgICAqLworICAgIAorICAgIHB1YmxpYyBCdW5kbGUoU3RyaW5nIGVuY29kaW5nKSB7CisgICAgICAgIHRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZzsKKyAgICAgICAgbGFuZ3VhZ2UgPSBudWxsOworICAgICAgICBjb3VudHJ5ICA9IG51bGw7CisgICAgICAgIHZhcmlhbnQgID0gbnVsbDsKKyAgICAgICAgY29tbWVudCAgPSBudWxsOworICAgICAgICBtYW5hZ2VyICA9IG51bGw7CisgICAgICAgIGdyb3VwcyA9IG5ldyBUcmVlU2V0KG5ldyBDb21wYXJhdG9yKCkgeworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7IHJldHVybiBmYWxzZTsgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKKyAgICAgICAgICAgICAgICBpZiAoIShvMSBpbnN0YW5jZW9mIEJ1bmRsZUdyb3VwKSB8fCAhKG8yIGluc3RhbmNlb2YgQnVuZGxlR3JvdXApKQorICAgICAgICAgICAgICAgIAlyZXR1cm4gMDsKKyAgICAgICAgICAgICAgICBCdW5kbGVHcm91cCBnMSA9IChCdW5kbGVHcm91cClvMTsKKyAgICAgICAgICAgICAgICBCdW5kbGVHcm91cCBnMiA9IChCdW5kbGVHcm91cClvMjsKKyAgICAgICAgICAgICAgICByZXR1cm4gZzEuZ2V0TmFtZSgpLmNvbXBhcmVUbyhnMi5nZXROYW1lKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgICAgIAorICAgICAgICB1bnRyYW5zbGF0ZWRJdGVtcyA9IG5ldyBUcmVlU2V0KG5ldyBDb21wYXJhdG9yKCkgeworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7IHJldHVybiBmYWxzZTsgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKKyAgICAgICAgICAgICAgICBpZiAoIShvMSBpbnN0YW5jZW9mIEJ1bmRsZUl0ZW0pIHx8ICEobzIgaW5zdGFuY2VvZiBCdW5kbGVJdGVtKSkgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgQnVuZGxlSXRlbSBpMSA9IChCdW5kbGVJdGVtKW8xOworICAgICAgICAgICAgICAgIEJ1bmRsZUl0ZW0gaTIgPSAoQnVuZGxlSXRlbSlvMjsKKyAgICAgICAgICAgICAgICByZXR1cm4gaTEuZ2V0S2V5KCkuY29tcGFyZVRvKGkyLmdldEtleSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIAorICAgICAgICBkdXBsaWNhdGVzID0gbmV3IFZlY3RvcigpOworICAgICAgICBhbGxJdGVtcyA9IG5ldyBIYXNodGFibGUoKTsKKyAgICB9CisJCQorICAgIC8qKgorICAgICAqIEVuY29kaW5ncyBhcmUgb2YgdGhlIGZvcm0gLT4gbGFuZ3VhZ2VfY291bnRyeV92YXJpYW50IDwtIChmb3IgZXhhbXBsZTogImVuX3VzX3NvdXRoZXJuIikuCisgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgbGFuZ3VhZ2UgZW5jb2Rpbmcgc3RyaW5nLCBvciBudWxsIGlmIGl0IGlzIG5vdCBzcGVjaWZpZWQKKyAgICAgKi8KKwkJCisgICAgcHVibGljIFN0cmluZyBnZXRMYW5ndWFnZUVuY29kaW5nKCkgeworICAgICAgICBpZiAoZW5jb2RpbmcgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBpZiAoZW5jb2RpbmcuaW5kZXhPZigiXyIpID49IDApCisgICAgICAgICAgICByZXR1cm4gZW5jb2Rpbmcuc3Vic3RyaW5nKDAsZW5jb2RpbmcuaW5kZXhPZigiXyIpKTsKKyAgICAgICAgcmV0dXJuIGVuY29kaW5nLnRyaW0oKTsKKyAgICB9CisJCQorICAgIC8qKgorICAgICAqIEVuY29kaW5ncyBhcmUgb2YgdGhlIGZvcm0gLT4gbGFuZ3VhZ2VfY291bnRyeV92YXJpYW50IDwtIChmb3IgZXhhbXBsZTogImVuX3VzX3NvdXRoZXJuIikuCisgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgY291bnRyeSBlbmNvZGluZyBzdHJpbmcsIG9yIG51bGwgaWYgaXQgaXMgbm90IHNwZWNpZmllZAorICAgICAqLworCQkKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvdW50cnlFbmNvZGluZygpIHsKKyAgICAgICAgaWYgKGVuY29kaW5nID09IG51bGwgfHwgZW5jb2RpbmcuaW5kZXhPZigiXyIpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAvLyBTdHJpcCBvZmYgdGhlIGxhbmd1YWdlCisgICAgICAgIFN0cmluZyB3b3JrU3RyID0gZW5jb2Rpbmcuc3Vic3RyaW5nKGVuY29kaW5nLmluZGV4T2YoIl8iKSsxLGVuY29kaW5nLmxlbmd0aCgpKTsKKyAgICAgICAgaWYgKHdvcmtTdHIuaW5kZXhPZigiXyIpID49IDApCisgICAgICAgICAgICByZXR1cm4gd29ya1N0ci5zdWJzdHJpbmcoMCxlbmNvZGluZy5pbmRleE9mKCJfIikpOworICAgICAgICByZXR1cm4gd29ya1N0ci50cmltKCk7CisgICAgfQorCQkKKyAgICAvKioKKyAgICAgKiBFbmNvZGluZ3MgYXJlIG9mIHRoZSBmb3JtIC0+IGxhbmd1YWdlX2NvdW50cnlfdmFyaWFudCA8LSAoZm9yIGV4YW1wbGU6ICJlbl91c19zb3V0aGVybiIpLgorICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHZhcmlhbnQgZW5jb2Rpbmcgc3RyaW5nLCBvciBudWxsIGlmIGl0IGlzIG5vdCBzcGVjaWZpZWQKKyAgICAgKi8KKwkJCisgICAgcHVibGljIFN0cmluZyBnZXRWYXJpYW50RW5jb2RpbmcoKSB7CisgICAgICAgIGlmIChlbmNvZGluZyA9PSBudWxsIHx8IGVuY29kaW5nLmluZGV4T2YoIl8iKSA8IDApCisgICAgICAgIAlyZXR1cm4gbnVsbDsKKyAgICAgICAgLy8gU3RyaXAgb2ZmIHRoZSBsYW5ndWFnZQorICAgICAgICBTdHJpbmcgd29ya1N0ciA9IGVuY29kaW5nLnN1YnN0cmluZyhlbmNvZGluZy5pbmRleE9mKCJfIikrMSxlbmNvZGluZy5sZW5ndGgoKSk7CisgICAgICAgIGlmICh3b3JrU3RyID09IG51bGwgfHwgd29ya1N0ci5sZW5ndGgoKSA8IDEgfHwgd29ya1N0ci5pbmRleE9mKCJfIikgPCAwKQorICAgICAgICAJcmV0dXJuIG51bGw7CisgICAgICAgIC8vIFN0cmlwIG9mZiB0aGUgY291bnRyeQorICAgICAgICB3b3JrU3RyID0gd29ya1N0ci5zdWJzdHJpbmcoZW5jb2RpbmcuaW5kZXhPZigiXyIpKzEsIHdvcmtTdHIubGVuZ3RoKCkpOworICAgICAgICByZXR1cm4gd29ya1N0ci50cmltKCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIFVudHJhbnNsYXRlZEl0ZW1zIGFzIGEgdmVjdG9yLiBJIHNob3VsZCBmaW5kIHdoZXJlIHRoaXMgaGFwcGVucyBhbmQgc3RvcCBpdC4KKyAgICAgKi8KKwkJCisgICAgcHVibGljIFZlY3RvciBnZXRVbnRyYW5zbGF0ZWRJdGVtc0FzVmVjdG9yKCkgeworICAgICAgICBJdGVyYXRvciBpdGVyID0gdW50cmFuc2xhdGVkSXRlbXMuaXRlcmF0b3IoKTsKKyAgICAgICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKKyAgICAgICAgCXYuYWRkRWxlbWVudChpdGVyLm5leHQoKSk7CisgICAgICAgIHJldHVybiB2OworICAgIH0KKwkJCisgICAgLyoqCisgICAgICogQ2hlY2tzIGFsbCBpdGVtcyBpbiB0aGUgdW50cmFuc2xhdGVkIGl0ZW1zIHNldC4gSWYgdGhleSBiZWxvbmcgdG8gYSBncm91cCB3aG9zZSBuYW1lCisgICAgICogbWF0Y2hlcyB0aGUgcGFzc2VkIGluIG5hbWUsIHRoZW4gdGhleSBhcmUgcmVtb3ZlZC4KKyAgICAgKi8KKwkJCisgICAgcHVibGljIHZvaWQgcmVtb3ZlVW50cmFuc2xhdGVkSXRlbXNCeUdyb3VwKFN0cmluZyBncm91cE5hbWUpIHsKKyAgICAgICAgSXRlcmF0b3IgaXRlciA9IHVudHJhbnNsYXRlZEl0ZW1zLml0ZXJhdG9yKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3aGlsZShpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIEJ1bmRsZUl0ZW0gaXRlbSA9IG51bGw7CisgICAgICAgICAgICAgICAgaXRlbSA9IChCdW5kbGVJdGVtKWl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIGlmIChpdGVtICE9IG51bGwgJiYgaXRlbS5nZXRQYXJlbnRHcm91cCgpLmdldE5hbWUoKS5lcXVhbHMoZ3JvdXBOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICByZW1vdmVVbnRyYW5zbGF0ZWRJdGVtKGl0ZW0uZ2V0S2V5KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFJCTWFuYWdlckdVSS5kZWJ1Z01zZyhlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisJCQorICAgIC8qKgorICAgICAqIENoZWNrcyB0byBzZWUgaWYgYW4gaXRlbSBvZiB0aGUgZ2l2ZW4ga2V5IG5hbWUgZXhpc3RzIGluIHRoZSBzZXQgb2YgdW50cmFuc2xhdGVkIGl0ZW1zLiBJZgorICAgICAqIGl0IGRvZXMgZXhpc3QsIHRoZW4gaXQgaXMgcmVtb3ZlZC4KKyAgICAgKi8KKwkJCisgICAgcHVibGljIHZvaWQgcmVtb3ZlVW50cmFuc2xhdGVkSXRlbShTdHJpbmcgbmFtZSkgeworICAgICAgICBJdGVyYXRvciBpdGVyID0gdW50cmFuc2xhdGVkSXRlbXMuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBCdW5kbGVJdGVtIGl0ZW0gPSAoQnVuZGxlSXRlbSlpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChpdGVtLmdldEtleSgpLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgIHVudHJhbnNsYXRlZEl0ZW1zLnJlbW92ZShpdGVtKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwkJCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYm9vbGVhbiBvZiB3ZXRoZXIgYSBncm91cCBvZiBhIGdpdmVuIG5hbWUgZXhpc3RzIGluIHRoZSBidW5kbGUKKyAgICAgKi8KKwkJCisgICAgcHVibGljIGJvb2xlYW4gaGFzR3JvdXAoU3RyaW5nIGdyb3VwTmFtZSkgeworICAgICAgICBJdGVyYXRvciBpdGVyID0gZ3JvdXBzLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgQnVuZGxlR3JvdXAgZ3JvdXAgPSAoQnVuZGxlR3JvdXApaXRlci5uZXh0KCk7CisgICAgICAgICAgICBpZiAoZ3JvdXAuZ2V0TmFtZSgpLmVxdWFscyhncm91cE5hbWUpKQorICAgICAgICAgICAgCXJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGdyb3VwIG9mIHRoZSBnaXZlbiBuYW1lIGFuZCBvcHRpb25hbGx5IGFzc29jaWF0ZXMgYSBjb21tZW50IHdpdGgKKyAgICAgKiB0aGF0IGdyb3VwLgorICAgICAqLworICAgIAorICAgIHB1YmxpYyB2b2lkIGFkZEJ1bmRsZUdyb3VwKFN0cmluZyBncm91cE5hbWUsIFN0cmluZyBncm91cENvbW1lbnQpIHsKKyAgICAgICAgQnVuZGxlR3JvdXAgYmcgPSBuZXcgQnVuZGxlR3JvdXAodGhpcywgZ3JvdXBOYW1lKTsKKyAgICAgICAgYmcuc2V0Q29tbWVudChncm91cENvbW1lbnQpOworICAgICAgICBhZGRCdW5kbGVHcm91cChiZyk7CisgICAgfQorCQkKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIHRoZSBncm91cCBvZiB0aGUgZ2l2ZW4gbmFtZSBpZiBpdCBleGlzdHMgaW4gdGhlIGJ1bmRsZQorICAgICAqLworCQkKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVHcm91cChTdHJpbmcgZ3JvdXBOYW1lKSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBncm91cHMuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBCdW5kbGVHcm91cCB0ZW1wR3JvdXAgPSAoQnVuZGxlR3JvdXApaXRlci5uZXh0KCk7CisgICAgICAgICAgICBpZiAodGVtcEdyb3VwLmdldE5hbWUoKS5lcXVhbHMoZ3JvdXBOYW1lKSkgeworICAgICAgICAgICAgICAgIGdyb3Vwcy5yZW1vdmUodGVtcEdyb3VwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBSZW1vdmUgdGhlIGl0ZW1zIGZyb20gdGhlIHVudGFuc2xhdGVkIGl0ZW1zCisgICAgICAgIHJlbW92ZVVudHJhbnNsYXRlZEl0ZW1zQnlHcm91cChncm91cE5hbWUpOworCQkJCisgICAgICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgSXRlbXMKKyAgICAgICAgRW51bWVyYXRpb24gZWxlbXMgPSBhbGxJdGVtcy5lbGVtZW50cygpOworICAgICAgICB3aGlsZShlbGVtcy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgQnVuZGxlSXRlbSBpdGVtID0gKEJ1bmRsZUl0ZW0pZWxlbXMubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIGlmIChpdGVtLmdldFBhcmVudEdyb3VwKCkuZ2V0TmFtZSgpLmVxdWFscyhncm91cE5hbWUpKSB7CisgICAgICAgICAgICAgICAgYWxsSXRlbXMucmVtb3ZlKGl0ZW0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCQkKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIGEgc2luZ2xlIHJlc291cmNlIGl0ZW0gZnJvbSB0aGUgYnVuZGxlCisgICAgICovCisJCQorICAgIHB1YmxpYyB2b2lkIHJlbW92ZUl0ZW0oU3RyaW5nIGtleSkgeworICAgICAgICBPYmplY3QgbyA9IGFsbEl0ZW1zLmdldChrZXkpOworICAgICAgICBpZiAobyAhPSBudWxsKSB7CisgICAgICAgICAgICBCdW5kbGVJdGVtIGl0ZW0gPSAoQnVuZGxlSXRlbSlvOworICAgICAgICAgICAgLy8gUmVtb3ZlIGZyb20gYWxsSXRlbXMgSGFzaHRhYmxlCisgICAgICAgICAgICBhbGxJdGVtcy5yZW1vdmUoa2V5KTsKKyAgICAgICAgICAgIC8vIFJlbW92ZSBmcm9tIGl0ZW0ncyBncm91cAorICAgICAgICAgICAgaWYgKGl0ZW0uZ2V0UGFyZW50R3JvdXAoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQnVuZGxlR3JvdXAgZ3JvdXAgPSBpdGVtLmdldFBhcmVudEdyb3VwKCk7CisgICAgICAgICAgICAgICAgZ3JvdXAucmVtb3ZlQnVuZGxlSXRlbShrZXkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gUmVtb3ZlIGZyb20gdW50cmFuc2xhdGVkSXRlbXMgSGFzaHRhYmxlCisgICAgICAgICAgICByZW1vdmVVbnRyYW5zbGF0ZWRJdGVtKGtleSk7CisgICAgICAgIH0KKyAgICB9CisJCQorICAgIC8qKgorICAgICAqIEF0dGVtcHRzIHRvIGFkZCBhIEJ1bmRsZUl0ZW0gdG8gdGhlIHVudHJhbnNsYXRlZEl0ZW1zLiBUaGUgYWRkaXRpb24gd2lsbCBmYWlsIGluIHR3byBjYXNlczogT25lLCBpZgorICAgICAqIHRoZSBpdGVtIGRvZXMgbm90IGFsbCByZWFkeSBiZWxvbmcgdG8gdGhpcyBCdW5kbGUsIGFuZCBUd28sIGlmIHRoZSBpdGVtIGlzIGFsbCByZWFkeSBpbiB0aGUgc2V0IG9mCisgICAgICogdW50cmFuc2xhdGVkIGl0ZW1zLgorICAgICAqLworCQkKKyAgICBwdWJsaWMgdm9pZCBhZGRVbnRyYW5zbGF0ZWRJdGVtKEJ1bmRsZUl0ZW0gaXRlbSkgeworICAgICAgICBpZiAoaXRlbS5nZXRQYXJlbnRHcm91cCgpLmdldFBhcmVudEJ1bmRsZSgpICE9IHRoaXMpCisgICAgICAgIAlyZXR1cm47CisgICAgICAgIC8vIFJlbW92ZSBpdCBpZiBpdCBleGlzdHMuCisgICAgICAgIGlmICh1bnRyYW5zbGF0ZWRJdGVtcy5jb250YWlucyhpdGVtKSkgeworICAgICAgICAJdW50cmFuc2xhdGVkSXRlbXMucmVtb3ZlKGl0ZW0pOworICAgICAgICB9CisgICAgCXVudHJhbnNsYXRlZEl0ZW1zLmFkZChpdGVtKTsKKyAgICB9CisJCQorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBpdGVtcyBjdXJyZW50bHkgbWFya2VkIGFzIHVudHJhbnNsYXRlZAorICAgICAqLworCQkKKyAgICBwdWJsaWMgaW50IGdldFVudHJhbnNsYXRlZEl0ZW1zU2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIHVudHJhbnNsYXRlZEl0ZW1zLnNpemUoKTsKKyAgICB9CisJCQorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGluZGV4dGggdW50cmFuc2xhdGVkIGl0ZW0KKyAgICAgKi8KKwkJCisgICAgcHVibGljIEJ1bmRsZUl0ZW0gZ2V0VW50cmFuc2xhdGVkSXRlbShpbnQgaW5kZXgpIHsKKyAgICAgICAgaWYgKGluZGV4ID49IHVudHJhbnNsYXRlZEl0ZW1zLnNpemUoKSkKKyAgICAgICAgCXJldHVybiBudWxsOworICAgICAgICBJdGVyYXRvciBpdGVyID0gdW50cmFuc2xhdGVkSXRlbXMuaXRlcmF0b3IoKTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgaW5kZXg7IGkrKykKKyAgICAgICAgCWl0ZXIubmV4dCgpOworICAgICAgICByZXR1cm4gKEJ1bmRsZUl0ZW0paXRlci5uZXh0KCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdmFyaW91cyByZXNvdXJjZSBidW5kbGUgZ3JvdXBzIHN0b3JlZCBpbiBhIFZlY3RvciBjb2xsZWN0aW9uLgorICAgICAqLworICAgIAorICAgIHB1YmxpYyBWZWN0b3IgZ2V0R3JvdXBzQXNWZWN0b3IoKSB7CisgICAgICAgIFZlY3RvciB2ID0gbmV3IFZlY3RvcigpOworICAgICAgICBJdGVyYXRvciBpdGVyID0gZ3JvdXBzLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgQnVuZGxlR3JvdXAgZ3JvdXAgPSAoQnVuZGxlR3JvdXApaXRlci5uZXh0KCk7CisgICAgICAgICAgICB2LmFkZEVsZW1lbnQoZ3JvdXApOworICAgICAgICB9CisgICAgICAgIHJldHVybiB2OworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZ3JvdXBzIGluIHRoZSBidW5kbGUuCisgICAgICovCisgICAgCisgICAgcHVibGljIGludCBnZXRHcm91cENvdW50KCkgeworICAgICAgICByZXR1cm4gZ3JvdXBzLnNpemUoKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGJ1bmRsZSBncm91cCBnaXZlbiBhIGNlcnRhaW4gaW5kZXguCisgICAgICovCisgICAgCisgICAgcHVibGljIEJ1bmRsZUdyb3VwIGdldEJ1bmRsZUdyb3VwKGludCBpbmRleCkgeworICAgICAgICBpZiAoaW5kZXggPj0gZ2V0R3JvdXBDb3VudCgpKQorICAgICAgICAJcmV0dXJuIG51bGw7CisgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBncm91cHMuaXRlcmF0b3IoKTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgaW5kZXg7IGkrKykKKyAgICAgICAgCWl0ZXIubmV4dCgpOworICAgICAgICByZXR1cm4gKEJ1bmRsZUdyb3VwKWl0ZXIubmV4dCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvb2tzIGZvciBhIGJ1bmRsZSBncm91cCBvZiBhIGdpdmVuIG5hbWUgd2l0aGluIGEgYnVuZGxlIGFuZAorICAgICAqIHJldHVybnMgaXQgaWYgZm91bmQuCisgICAgICovCisJCQorICAgIHB1YmxpYyBCdW5kbGVHcm91cCBnZXRCdW5kbGVHcm91cChTdHJpbmcgZ3JvdXBOYW1lKSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBncm91cHMuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIEJ1bmRsZUdyb3VwIGdyb3VwID0gKEJ1bmRsZUdyb3VwKWl0ZXIubmV4dCgpOworICAgICAgICAgICAgaWYgKGdyb3VwLmdldE5hbWUoKS5lcXVhbHMoZ3JvdXBOYW1lKSkKKyAgICAgICAgICAgIAlyZXR1cm4gZ3JvdXA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIExvb2tzIHVwIGFuZCByZXR1cm5zIGEgYnVuZGxlIGl0ZW0gc3RvcmVkIGluIHRoZSBidW5kbGUgYmFzZWQgb24gaXRzCisgICAgICogTkxTIGxvb2t1cCBrZXkuCisgICAgICovCisgICAgCisgICAgcHVibGljIEJ1bmRsZUl0ZW0gZ2V0QnVuZGxlSXRlbShTdHJpbmcga2V5KSB7CisgICAgICAgIHJldHVybiAoQnVuZGxlSXRlbSlhbGxJdGVtcy5nZXQoa2V5KTsKKyAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgIC8qKgorICAgICAqIE9uZSBncm91cCBpcyBjcmVhdGVkIGZvciBhbGwgYnVuZGxlcyBjYWxsZWQgJ1VuZ3JvdXBlZCBJdGVtcycuIFRoaXMgaXMgdGhlIGJ1bmRsZQorICAgICAqIGdyb3VwIGluIHdoaWNoIGJ1bmRsZSBpdGVtcyBhcmUgcGxhY2VkIHRoYXQgYXJlIG5vdCBzcGVjaWZpY2FsbHkgZ3JvdXBlZCBpbiB0aGUKKyAgICAgKiByZXNvdXJjZSBidW5kbGUgZmlsZS4gVGhpcyBtZXRob2QgcmV0dXJucyB0aGF0IGJ1bmRsZSBncm91cC4KKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgQnVuZGxlR3JvdXAgZ2V0VW5ncm91cGVkR3JvdXAoKSB7CisgICAgICAgIHJldHVybiBnZXRCdW5kbGVHcm91cCgiVW5ncm91cGVkIEl0ZW1zIik7CisgICAgfQorCQkKKyAgICAvKioKKyAgICAgKiBBZGQgYSBidW5kbGUgZ3JvdXAgdG8gdGhlIGJ1bmRsZQorICAgICAqLworICAgICAKKyAgICBwdWJsaWMgdm9pZCBhZGRCdW5kbGVHcm91cChCdW5kbGVHcm91cCBiZykgeworICAgICAgICBncm91cHMuYWRkKGJnKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBidW5kbGUgaXRlbSB0byB0aGUgYnVuZGxlLiBUaGlzIGJ1bmRsZSBpdGVtIHNob3VsZCBhbGwgcmVhZHkgaGF2ZSBpdHMKKyAgICAgKiBidW5kbGUgZ3JvdXAgYXNzaWduZWQuCisgICAgICovCisJCQorICAgIHB1YmxpYyB2b2lkIGFkZEJ1bmRsZUl0ZW0oQnVuZGxlSXRlbSBpdGVtKSB7CisgICAgICAgIGlmIChhbGxJdGVtcy5jb250YWluc0tleShpdGVtLmdldEtleSgpKSkgeworICAgICAgICAgICAgZHVwbGljYXRlcy5hZGRFbGVtZW50KGl0ZW0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCEoZ3JvdXBzLmNvbnRhaW5zKGl0ZW0uZ2V0UGFyZW50R3JvdXAoKSkpKQorICAgICAgICAgICAgCWFkZEJ1bmRsZUdyb3VwKGl0ZW0uZ2V0UGFyZW50R3JvdXAoKSk7CisgICAgICAgICAgICBpdGVtLmdldFBhcmVudEdyb3VwKCkuYWRkQnVuZGxlSXRlbShpdGVtKTsKKyAgICAgICAgICAgIGFsbEl0ZW1zLnB1dChpdGVtLmdldEtleSgpLCBpdGVtKTsKKyAgICAgICAgICAgIHJlbW92ZVVudHJhbnNsYXRlZEl0ZW0oaXRlbS5nZXRLZXkoKSk7CisgICAgICAgICAgICBpZiAoIWl0ZW0uaXNUcmFuc2xhdGVkKCkpCisgICAgICAgICAgICAJYWRkVW50cmFuc2xhdGVkSXRlbShpdGVtKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBBIG1ldGhvZCB1c2VmdWwgaW4gZGVidWdnaW5nLiBUaGUgc3RyaW5nIHJldHVybmVkIGRpc3BsYXlzIHRoZSBlbmNvZGluZworICAgICAqIGluZm9ybWF0aW9uIGFib3V0IHRoZSBidW5kbGUgYW5kIHdldGhlciBvciBub3QgaXQgaXMgdGhlIGJhc2UgY2xhc3Mgb2YKKyAgICAgKiBhIHJlc291cmNlIGJ1bmRsZS4KKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmcgcmV0U3RyID0gbmV3IFN0cmluZygpOworICAgICAgICBpZiAobGFuZ3VhZ2UgIT0gbnVsbCAmJiAhbGFuZ3VhZ2UuZXF1YWxzKCIiKSkgcmV0U3RyID0gbGFuZ3VhZ2U7CisgICAgICAgIGlmIChjb3VudHJ5ICE9IG51bGwgJiYgIWNvdW50cnkuZXF1YWxzKCIiKSkgcmV0U3RyICs9ICIsICIgKyBjb3VudHJ5OworICAgICAgICBpZiAodmFyaWFudCAhPSBudWxsICYmICF2YXJpYW50LmVxdWFscygiIikpIHJldFN0ciArPSAiLCAiICsgdmFyaWFudDsKKwkJCQorICAgICAgICByZXRTdHIgKz0gIiAoIiArIChlbmNvZGluZyA9PSBudWxsIHx8IGVuY29kaW5nLmVxdWFscygiIikgPyAiQmFzZSBDbGFzcyIgOiBlbmNvZGluZykgKyAiKSI7CisgICAgICAgIHJldHVybiByZXRTdHI7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIHByb2R1Y2VzIGEgU3RyaW5nIHdoaWNoIGlzIHN1aXRhYmxlIGZvciBpbmNsdXNpb24gaW4gYSAucHJvcGVydGllcworICAgICAqIHN0eWxlIHJlc291cmNlIGJ1bmRsZS4gSXQgYXR0YWNoZXMgKGluIGNvbW1lbnRzKSB0aGUgbWV0YSBkYXRhIHRoYXQgUkJNYW5hZ2VyCisgICAgICogcmVhZHMgdG8gbWFuYWdlIHRoZSByZXNvdXJjZSBidW5kbGUgZmlsZS4gVGhpcyBwb3J0aW9uIG9mIHRoZSBvdXRwdXQgc2hvdWxkCisgICAgICogYmUgaW5jbHVkZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcmVzb3VyY2UgYnVuZGxlIGZpbGUuCisgICAgICovCisgICAgCisgICAgcHVibGljIFN0cmluZyB0b091dHB1dFN0cmluZygpIHsKKyAgICAgICAgU3RyaW5nICAgICAgICAgICAgICAgIHJldFN0ciAgPSAiIyBAZmlsZSAgICAgICAgICAiICsgbmFtZSAgICAgKyAiXG4iOworICAgICAgICBpZiAoZW5jb2RpbmcgIT0gbnVsbCkgcmV0U3RyICs9ICIjIEBmaWxlRW5jb2RpbmcgICIgKyBlbmNvZGluZyArICJcbiI7CisgICAgICAgIGlmIChsYW5ndWFnZSAhPSBudWxsKSByZXRTdHIgKz0gIiMgQGZpbGVMYW5ndWFnZSAgIiArIGxhbmd1YWdlICsgIlxuIjsKKyAgICAgICAgaWYgKGNvdW50cnkgICE9IG51bGwpIHJldFN0ciArPSAiIyBAZmlsZUNvdW50cnkgICAiICsgY291bnRyeSAgKyAiXG4iOworICAgICAgICBpZiAodmFyaWFudCAgIT0gbnVsbCkgcmV0U3RyICs9ICIjIEBmaWxlVmFyaWFudCAgICIgKyB2YXJpYW50ICArICJcbiI7CisgICAgICAgIGlmIChtYW5hZ2VyICAhPSBudWxsKSByZXRTdHIgKz0gIiMgQGZpbGVNYW5hZ2VyICAgIiArIG1hbmFnZXIgICsgIlxuIjsKKyAgICAgICAgaWYgKGNvbW1lbnQgICE9IG51bGwpIHJldFN0ciArPSAiIyBAZmlsZUNvbW1lbnQgICAiICsgY29tbWVudCAgKyAiXG4iOworICAgICAgICByZXR1cm4gcmV0U3RyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgaGVscGluZyBtZXRob2QgZm9yIG91dHB1dHRpbmcgdGhlIGZvcm1hdHRlZCBjb250ZW50cyBvZiB0aGUgYnVuZGxlIHRvIGEKKyAgICAgKiBwcmludCBzdHJlYW0uIFRoZSBtZXRob2QgZmlyc3Qgb3V0cHV0cyB0aGUgaGVhZGVyIGluZm9ybWF0aW9uIGFuZCB0aGVuIG91dHB1dHMKKyAgICAgKiBlYWNoIGJ1bmRsZSBncm91cCdzIGZvcm1hdHRlZCBkYXRhIHdoaWNoIGluY2x1ZGVzIGVhY2ggYnVuZGxlIGl0ZW0uCisgICAgICovCisJCQorICAgIHB1YmxpYyB2b2lkIHdyaXRlQ29udGVudHMoUHJpbnRTdHJlYW0gcHMpIHsKKyAgICAgICAgcHMucHJpbnRsbih0aGlzLnRvT3V0cHV0U3RyaW5nKCkpOworICAgICAgICBJdGVyYXRvciBpdGVyID0gZ3JvdXBzLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgKChCdW5kbGVHcm91cClpdGVyLm5leHQoKSkud3JpdGVDb250ZW50cyhwcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGhlbHBpbmcgbWV0aG9kIGZvciBvdXRwdXR0aW5nIHRoZSBmb3JtYXR0ZWQgY29udGVudHMgb2YgdGhlIGJ1bmRsZSB0byBhCisgICAgICogb3VwdXQgV3JpdGVyIChzdWNoIGFzIGEgRmlsZVdyaXRlcikuIFRoZSBtZXRob2QgZmlyc3Qgb3V0cHV0cyB0aGUgaGVhZGVyCisgICAgICogaW5mb3JtYXRpb24gYW5kIHRoZW4gb3V0cHV0cyBlYWNoIGJ1bmRsZSBncm91cCdzIGZvcm1hdHRlZCBkYXRhIHdoaWNoIGluY2x1ZGVzCisgICAgICogZWFjaCBidW5kbGUgaXRlbS4KKyAgICAgKi8KKwkJCisgICAgcHVibGljIHZvaWQgd3JpdGVDb250ZW50cyhXcml0ZXIgdykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdy53cml0ZSh0aGlzLnRvT3V0cHV0U3RyaW5nKCkgKyAiXG4iKTsKKyAgICAgICAgSXRlcmF0b3IgaXRlciA9IGdyb3Vwcy5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICgoQnVuZGxlR3JvdXApaXRlci5uZXh0KCkpLndyaXRlQ29udGVudHModyk7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL0J1bmRsZUdyb3VwLmphdmEgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vQnVuZGxlR3JvdXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWNjZWRiCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL0J1bmRsZUdyb3VwLmphdmEKQEAgLTAsMCArMSwxODggQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoQykgMjAwMC0yMDA0LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCAgKgorICogb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworcGFja2FnZSBjb20uaWJtLnJibTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworLyoqCisgKiBBIGNsYXNzIHJlcHJlc2VudGluZyBhIGdyb3VwIG9mIEJ1bmRsZUl0ZW1zIGFuZCB0aGUgbWV0YSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGdyb3VwCisgKiAKKyAqIEBhdXRob3IgSmFyZWQgSmFja3NvbgorICogQHNlZSBjb20uaWJtLnJibS5SQk1hbmFnZXIKKyAqLworcHVibGljIGNsYXNzIEJ1bmRsZUdyb3VwIHsKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBuYW1lIG9mIHRoZSBncm91cAorICAgIHByaXZhdGUgU3RyaW5nIGNvbW1lbnQ7ICAgICAgICAgICAgICAgICAgICAgLy8gQSBjb21tZW50IGRlc2NyaWJpbmcgdGhpcyBncm91cAorICAgIHByaXZhdGUgVHJlZVNldCBpdGVtczsgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIE5MUyBpdGVtcyBjb250YWluZWQgaW4gdGhpcyBncm91cAorICAgIHByaXZhdGUgQnVuZGxlIGJ1bmRsZTsgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHBhcmVudCBCdW5kbGUgb2JqZWN0IG9mIHRoaXMgZ3JvdXAKKwkJCisgICAgLyoqCisgICAgICogQmFzaWMgZGF0YSBjb25zdHJ1Y3Rvci4KKyAgICAgKiBDcmVhdGVzIGEgQnVuZGxlR3JvdXAgd2l0aCBhIHBhcmVudCBidW5kbGUgYW5kIGEgZ2l2ZW4gbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQnVuZGxlR3JvdXAoQnVuZGxlIHBhcmVudCwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgYnVuZGxlID0gcGFyZW50OworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICBjb21tZW50ID0gbnVsbDsKKyAgICAgICAgaXRlbXMgPSBuZXcgVHJlZVNldChuZXcgQ29tcGFyYXRvcigpeworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7IHJldHVybiBmYWxzZTsgfQorICAgICAgICAgICAgcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7CisgICAgICAgICAgICAgICAgaWYgKCEobzEgaW5zdGFuY2VvZiBCdW5kbGVJdGVtKSB8fCAhKG8yIGluc3RhbmNlb2YgQnVuZGxlSXRlbSkpCisgICAgICAgICAgICAgICAgCXJldHVybiAwOworICAgICAgICAgICAgICAgIEJ1bmRsZUl0ZW0gaTEgPSAoQnVuZGxlSXRlbSlvMTsKKyAgICAgICAgICAgICAgICBCdW5kbGVJdGVtIGkyID0gKEJ1bmRsZUl0ZW0pbzI7CisgICAgICAgICAgICAgICAgcmV0dXJuIGkxLmdldEtleSgpLmNvbXBhcmVUbyhpMi5nZXRLZXkoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFR3byBidW5kbGUgZ3JvdXBzIGFyZSBjb25zaWRlcmVkIGVxdWFsIGlmZiB0aGVpciBuYW1lcyBhcmUgdGhlIHNhbWUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgIHJldHVybiAobyBpbnN0YW5jZW9mIEJ1bmRsZUdyb3VwICYmICgoQnVuZGxlR3JvdXApbykuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSk7CisgICAgfQorCQorICAgIC8vIFRoaXMgc2hvdWxkIGJlIGNoYW5nZWQgYW55d2hlcmUgaXQgaXMgdXNlZAorCQorICAgIHB1YmxpYyBWZWN0b3IgZ2V0SXRlbXNBc1ZlY3RvcigpIHsKKyAgICAgICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBpdGVtcy5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIHYuYWRkRWxlbWVudChpdGVyLm5leHQoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHY7CisgICAgfQorCQorICAgIC8qKgorICAgICAqIEFkZHMgYSBCdW5kbGVJdGVtIHRvIHRoZSBncm91cCBhcyBsb25nIGFzIHRoYXQgaXRlbSBpcyBub3QgY3VycmVudGx5IGluIHRoZSBncm91cC4KKyAgICAgKiBJZiB0aGUgaXRlbS5ncm91cCBpcyBub3QgZXF1YWwgdG8gdGhpcyBncm91cCwgdGhlbiBpdCBpcyBjaGFuZ2VkIHRvIGJlIHRoaXMgZ3JvdXAuCisgICAgICogVGhpcyBtZXRob2Qgc2hvdWxkLCBpbiBtb3N0IGNhc2VzLCBvbmx5IGJlIGNhbGxlZCBmcm9tIHRoZSBCdW5kbGUgY2xhc3MuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQnVuZGxlSXRlbShCdW5kbGVJdGVtIGl0ZW0pIHsKKyAgICAJaWYgKGl0ZW1zLmNvbnRhaW5zKGl0ZW0pKSB7CisgICAgCQlpdGVtcy5yZW1vdmUoaXRlbSk7CisgICAgCX0KKyAgICAgICAgaXRlbS5zZXRQYXJlbnRHcm91cCh0aGlzKTsKKyAgICAgICAgaXRlbXMuYWRkKGl0ZW0pOworICAgIH0KKwkKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYW4gaXRlbSBvZiB0aGUgZ2l2ZW4gbmFtZSBmcm9tIHRoZSBncm91cAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUJ1bmRsZUl0ZW0oU3RyaW5nIGl0ZW1OYW1lKSB7CisgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBpdGVtcy5pdGVyYXRvcigpOworICAgICAgICB3aGlsZShpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgQnVuZGxlSXRlbSBpdGVtID0gKEJ1bmRsZUl0ZW0paXRlci5uZXh0KCk7CisgICAgICAgICAgICBpZiAoaXRlbS5nZXRLZXkoKS5lcXVhbHMoaXRlbU5hbWUpKSB7CisgICAgICAgICAgICAgICAgaXRlbXMucmVtb3ZlKGl0ZW0pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCQorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBpdGVtcyBzdG9yZWQgaW4gdGhlIGdyb3VwCisgICAgICovCisgICAgcHVibGljIGludCBnZXRJdGVtQ291bnQoKSB7CisgICAgICAgIHJldHVybiBpdGVtcy5zaXplKCk7CisgICAgfQorCQorICAgIC8qKgorICAgICAqIFJldHVybnMgYSBCdW5kbGVJdGVtIGZyb20gdGhlIHNldCBvZiBpdGVtcyBhdCBhIHBhcnRpY3VsYXIgaW5kZXggcG9pbnQuCisgICAgICogSWYgdGhlIGluZGV4IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBzZXQsCisgICAgICogbnVsbCBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQnVuZGxlSXRlbSBnZXRCdW5kbGVJdGVtKGludCBpbmRleCkgeworICAgICAgICBpZiAoaW5kZXggPj0gaXRlbXMuc2l6ZSgpKQorICAgICAgICAJcmV0dXJuIG51bGw7CisgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBpdGVtcy5pdGVyYXRvcigpOworICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBpbmRleDsgaSsrKQorICAgICAgICAJaXRlci5uZXh0KCk7CisgICAgICAgIHJldHVybiAoQnVuZGxlSXRlbSlpdGVyLm5leHQoKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYnVuZGxlIHRvIHdoaWNoIHRoaXMgZ3JvdXAgYmVsb25ncworICAgICAqLworICAgIHB1YmxpYyBCdW5kbGUgZ2V0UGFyZW50QnVuZGxlKCkgeworICAgICAgICByZXR1cm4gYnVuZGxlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjb21tZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGJ1bmRsZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29tbWVudCgpIHsKKyAgICAgICAgcmV0dXJuIGNvbW1lbnQ7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGJ1bmRsZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCQorICAgIHByb3RlY3RlZCB2b2lkIHNldFBhcmVudEJ1bmRsZShCdW5kbGUgYnVuZGxlKSB7CisgICAgICAgIHRoaXMuYnVuZGxlID0gYnVuZGxlOworICAgIH0KKwkKKyAgICBwdWJsaWMgdm9pZCBzZXRDb21tZW50KFN0cmluZyBjb21tZW50KSB7CisgICAgICAgIHRoaXMuY29tbWVudCA9IGNvbW1lbnQ7CisgICAgfQorCQorICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisJCisgICAgLyoqCisgICAgICogVGhlIHRyYW5zbGF0aW9uIHRvIGEgc3RyaW5nIHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGdyb3VwCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCQorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG91dHB1dCBmb3IgYSBncm91cCBoZWFkaW5nLgorICAgICAqIFRoaXMgd2lsbCBiZSBmb3VuZCBpbiBjb21tZW50IGxpbmVzIGFib3ZlIHRoZSBncm91cCBpdGVtcworICAgICAqLworCXB1YmxpYyBTdHJpbmcgdG9PdXRwdXRTdHJpbmcoKSB7CisgICAgICAgIFN0cmluZyByZXRTdHIgPSAiXG4jXG4jIEBncm91cCAiICsgbmFtZSArICJcbiNcbiI7CisgICAgICAgIGlmIChjb21tZW50ICE9IG51bGwpCisgICAgICAgIAlyZXRTdHIgKz0gIiMgQGdyb3VwQ29tbWVudCAiICsgY29tbWVudCArICJcbiI7CisgICAgICAgIHJldHVybiByZXRTdHI7CisgICAgfQorCQorICAgIC8qKgorICAgICAqIFdyaXRlcyB0aGUgb3V0cHV0IGNvbnRlbnRzIHRvIGEgcGFydGljdWxhciBQcmludFN0cmVhbS4KKyAgICAgKiBUaGUgb3V0cHV0IHdpbGwgYmUgc3VpdGFibGUgZm9yIGEgcHJvcGVybHkgZm9ybWF0dGVkIC5wcm9wZXJ0aWVzIGZpbGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGVDb250ZW50cyhQcmludFN0cmVhbSBwcykgeworICAgICAgICBpZiAoIW5hbWUuZXF1YWxzKCJVbmdyb3VwZWQgSXRlbXMiKSkKKyAgICAgICAgCXBzLnByaW50bG4odGhpcy50b091dHB1dFN0cmluZygpKTsKKyAgICAgICAgSXRlcmF0b3IgaXRlciA9IGl0ZW1zLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgKChCdW5kbGVJdGVtKSBpdGVyLm5leHQoKSkud3JpdGVDb250ZW50cyhwcyk7CQorICAgICAgICB9CisgICAgfQorCQorICAgIC8qKgorICAgICAqIFdyaXRlcyB0aGUgb3V0cHV0IGNvbnRlbnRzIHRvIGEgcGFydGljdWxhciBXcml0ZXIuCisgICAgICogVGhlIG91dHB1dCB3aWxsIGJlIHN1aXRhYmxlIGZvciBhIHByb3Blcmx5IGZvcm1hdHRlZCAucHJvcGVydGllcyBmaWxlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdyaXRlQ29udGVudHMoV3JpdGVyIHcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICghbmFtZS5lcXVhbHMoIlVuZ3JvdXBlZCBJdGVtcyIpKQorICAgICAgICAJdy53cml0ZSh0aGlzLnRvT3V0cHV0U3RyaW5nKCkgKyAiXG4iKTsKKyAgICAgICAgSXRlcmF0b3IgaXRlciA9IGl0ZW1zLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgKChCdW5kbGVJdGVtKSBpdGVyLm5leHQoKSkud3JpdGVDb250ZW50cyh3KTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vQnVuZGxlSXRlbS5qYXZhIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL0J1bmRsZUl0ZW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWQwMzYwCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL0J1bmRsZUl0ZW0uamF2YQpAQCAtMCwwICsxLDM4NyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDcsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kICAqCisgKiBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitwYWNrYWdlIGNvbS5pYm0ucmJtOworCisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC4qOworCisvKioKKyAqIEEgY2xhc3MgcmVwcmVzZW50aW5nIGEgc2luZ2xlIHRyYW5zbGF0aW9uIGl0ZW0gYW5kIGFsbCBvZiB0aGUgbWV0YS1kYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGF0IHRyYW5zbGF0aW9uCisgKiAKKyAqIEBhdXRob3IgSmFyZWQgSmFja3NvbiAtIEVtYWlsOiA8YSBocmVmPSJtYWlsdG86amphcmVkQGFsbWFkZW4uaWJtLmNvbSI+amphcmVkQGFsbWFkZW4uaWJtLmNvbTwvYT4KKyAqIEBzZWUgY29tLmlibS5yYm0uUkJNYW5hZ2VyCisgKi8KK3B1YmxpYyBjbGFzcyBCdW5kbGVJdGVtIHsKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIG5hbWUgb2YgdGhlIE5MUyBpdGVtIGtleQorICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgdHJhbnNsYXRpb24gb2YgdGhlIGtleSBpdGVtCisgICAgcHJpdmF0ZSBTdHJpbmcgY29tbWVudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgY29tbWVudCBhYm91dCB0aGlzIGl0ZW0KKyAgICBwcml2YXRlIGJvb2xlYW4gdHJhbnNsYXRlZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSGFzIHRoaXMgaXRlbSBiZWVuIHRyYW5zbGF0ZWQ/CisgICAgcHJpdmF0ZSBEYXRlIGNyZWF0ZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBkYXRlIG9mIGNyZWF0aW9uIG9mIHRoZSBpdGVtCisgICAgcHJpdmF0ZSBEYXRlIG1vZGlmaWVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBsYXN0IG1vZGlmaWNhdGlvbiBkYXRlIG9mIHRoZSBpdGVtCisgICAgcHJpdmF0ZSBTdHJpbmcgY3JlYXRvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBuYW1lIG9mIHRoZSBwZXJzb24gd2hvIGNyZWF0ZWQgdGhlIGl0ZW0KKyAgICBwcml2YXRlIFN0cmluZyBtb2RpZmllcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIG5hbWUgb2YgdGhlIHBlcnNvbiB3aG8gbGFzdCBtb2RpZmllZCB0aGUgaXRlbQorICAgIHByaXZhdGUgSGFzaHRhYmxlIGxvb2t1cHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIGhhc3RhYmxlIG9mIGxvb2t1cHMgZm9yIHRoZSBpdGVtIChpLmUuICh7I30sIE1lYW5pbmcpIHBhaXJzKQorICAgIHByaXZhdGUgQnVuZGxlR3JvdXAgZ3JvdXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcGFyZW50IGdyb3VwIG9mIHRoZSBpdGVtCisJCQorICAgIC8qKgorICAgICAqIEJhc2ljIGRhdGEgY29uc3RydWN0b3IgZm9yIGEgcmVzb3VyY2UgYnVuZGxlIGl0ZW0uCisgICAgICogQHBhcmFtIHBhcmVudCBUaGUgQnVuZGxlR3JvdXAgdG8gd2hpY2ggdGhlIGl0ZW0gYmVsb25ncy4gVGhpcyBncm91cCB3aWxsIGhhdmUgaXRzIG93biBCdW5kbGUgcGFyZW50LgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBOTFMgbG9va3VwIGtleSBjb21tb24gYWNyb3NzIGFsbCBidW5kbGUgZmlsZXMgaW4gdGhlIHJlc291cmNlIGJ1bmRsZQorICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdHJhbnNsYXRlZCB2YWx1ZSBvZiB0aGUgaXRlbSBhcHByb3ByaWF0ZSBmb3IgdGhlIGVuY29kaW5nIG9mIHRoZSBidW5kbGUgZmlsZSB0byB3aGljaCB0aGUgaXRlbSBiZWxvbmdzCisgICAgICovCisgICAgIAorICAgIHB1YmxpYyBCdW5kbGVJdGVtKEJ1bmRsZUdyb3VwIHBhcmVudCwgU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgICAgIHRoaXMuZ3JvdXAgPSBwYXJlbnQ7CisgICAgICAgIGNvbW1lbnQgPSBudWxsOworICAgICAgICB0cmFuc2xhdGVkID0gZmFsc2U7CisgICAgICAgIGNyZWF0ZWQgPSBuZXcgRGF0ZSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEZWZhdWx0cyB0byB0aGUgc3lzdGVtJ3MgY3VycmVudCBkYXRlCisgICAgICAgIG1vZGlmaWVkID0gbmV3IERhdGUoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEZWZhdWx0cyB0byB0aGUgc3lzdGVtJ3MgY3VycmVudCBkYXRlCisgICAgICAgIGNyZWF0b3IgPSBudWxsOworICAgICAgICBtb2RpZmllciA9IG51bGw7CisgICAgICAgIGxvb2t1cHMgPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgQnVuZGxlR3JvdXAgdG8gd2hpY2ggdGhpcyBpdGVtIGJlbG9uZ3MKKyAgICAgKi8KKwkKKyAgICBwdWJsaWMgQnVuZGxlR3JvdXAgZ2V0UGFyZW50R3JvdXAoKSB7CisgICAgICAgIHJldHVybiBncm91cDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBkYXRlIHRoaXMgaXRlbSB3YXMgbGFzdCBtb2RpZmllZC4KKyAgICAgKi8KKwkKKyAgICBwdWJsaWMgRGF0ZSBnZXRNb2RpZmllZERhdGUoKSB7CisgICAgICAgIHJldHVybiBtb2RpZmllZDsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZGF0ZSB0aGUgaXRlbSB3YXMgZmlyc3QgY3JlYXRlZC4KKyAgICAgKi8KKwkKKyAgICBwdWJsaWMgRGF0ZSBnZXRDcmVhdGVkRGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZWQ7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGxvZ2luIG5hbWUgb2YgdGhlIHVzZXIgdGhhdCBjcmVhdGVkIHRoZSBpdGVtLgorICAgICAqLworCQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0b3I7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGxvZ2luIG5hbWUgb2YgdGhlIHVzZXIgdGhhdCBsYXN0IG1vZGlmaWVkIHRoZSBpdGVtLgorICAgICAqLworICAgIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TW9kaWZpZXIoKSB7CisgICAgICAgIHJldHVybiBtb2RpZmllcjsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgTkxTIGxvb2t1cCBrZXkgZm9yIHRoZSBpdGVtLgorICAgICAqLworCQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB0cmFuc2xhdGlvbiB2YWx1ZSBmb3IgdGhlIGl0ZW0uCisgICAgICovCisJCisgICAgcHVibGljIFN0cmluZyBnZXRUcmFuc2xhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgY29tbWVudCBhc3NvY2lhdGVkIHdpdGggdGhlIGl0ZW0uCisgICAgICovCisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXRDb21tZW50KCkgeworICAgICAgICByZXR1cm4gY29tbWVudDsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogSGFzIHRoZSBpdGVtIHlldCBiZWVuIHRyYW5zbGF0ZWQsIG9yIHdhcyBpdCBtZXJlbHkgZGVyaXZlZCBmcm9tIGEgcHJldmlvdXMKKyAgICAgKiBidW5kbGUgZmlsZT8KKyAgICAgKi8KKwkKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1RyYW5zbGF0ZWQoKSB7CisgICAgICAgIHJldHVybiB0cmFuc2xhdGVkOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgaGFzaHRhYmxlIG9mIHRoZSB2YXJpb3VzIGxvb2t1cHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBpdGVtLiBMb29rdXBzIGFyZQorICAgICAqIGNvbnRleHQgc2Vuc2l0aXZlIGluZm9ybWF0aW9uIHN0b3JlZCB3aXRoaW4gdGhlIHJlc291cmNlIGl0ZW0gYW5kIGhhdmUgdGhlaXIgb3duCisgICAgICogbWV0YS1kYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGVtc2VsdmVzLgorICAgICAqLworCQorICAgIHB1YmxpYyBIYXNodGFibGUgZ2V0TG9va3VwcygpIHsKKyAgICAgICAgcmV0dXJuIGxvb2t1cHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdHJhbnNsYXRlZCB2YWx1ZSBvZiB0aGUgaXRlbS4gQSB0cnVlIG1hcmsgaW5kaWNhdGVzIHRoYXQgdGhlIGl0ZW0gaGFzCisgICAgICogYmVlbiBleGFtaW5lZCBvciBtb2RpZmllZCBhbmQgaXMgcmVhZHkgZm9yIHVzZSBpbiB0aGUgZW5jb2Rpbmcgc3BlY2lmaWVkIGJ5IHRoZQorICAgICAqIHBhcmVudCBCdW5kbGUuCisgICAgICovCisJCisgICAgcHVibGljIHZvaWQgc2V0VHJhbnNsYXRlZChib29sZWFuIGlzVHJhbnNsYXRlZCkgeworICAgICAgICBpZiAodHJhbnNsYXRlZCA9PSBpc1RyYW5zbGF0ZWQpIHJldHVybjsKKyAgICAgICAgdHJhbnNsYXRlZCA9IGlzVHJhbnNsYXRlZDsKKyAgICAgICAgaWYgKHRoaXMuZ2V0UGFyZW50R3JvdXAoKSAhPSBudWxsICYmIHRoaXMuZ2V0UGFyZW50R3JvdXAoKS5nZXRQYXJlbnRCdW5kbGUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gdGhpcy5nZXRQYXJlbnRHcm91cCgpLmdldFBhcmVudEJ1bmRsZSgpOworICAgICAgICAgICAgaWYgKGlzVHJhbnNsYXRlZCkgYnVuZGxlLnJlbW92ZVVudHJhbnNsYXRlZEl0ZW0odGhpcy5uYW1lKTsKKyAgICAgICAgICAgIGVsc2UgYnVuZGxlLmFkZFVudHJhbnNsYXRlZEl0ZW0odGhpcyk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgY29tbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBpdGVtLgorICAgICAqLworICAgIAorICAgIHB1YmxpYyB2b2lkIHNldENvbW1lbnQoU3RyaW5nIGNvbW1lbnQpIHsKKyAgICAgICAgdGhpcy5jb21tZW50ID0gY29tbWVudDsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogR2l2ZW4gYSBoYXNodGFibGUgb2YgbG9va3VwcywgYXNzb2NpYXRlcyB0aG9zZSBsb29rdXBzIHdpdGggdGhpcyBpdGVtLgorICAgICAqLworCQorICAgIHB1YmxpYyB2b2lkIHNldExvb2t1cHMoSGFzaHRhYmxlIGxvb2t1cHMpIHsKKyAgICAgICAgdGhpcy5sb29rdXBzID0gbG9va3VwczsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgTkxTIGtleSBhc3NvY2lhdGVkIHdpdGggdGhpcyBpdGVtLiBCZSBjYXJlZnVsIHVzaW5nIHRoaXMgbWV0aG9kLCBhcworICAgICAqIGl0IGRvZXMgbm90IGNoYW5nZSB0aGUgbG9va3VwIHZhbHVlIG9mIGFueSBvdGhlciBpdGVtcyBpbiB0aGUgcmVzb3VyY2UgYnVuZGxlLgorICAgICAqIFRoaXMgbXVzdCBiZSBkb25lIGF0IGEgaGlnaGVyIGxldmVsLgorICAgICAqLworICAgIAorICAgIHB1YmxpYyB2b2lkIHNldEtleShTdHJpbmcga2V5TmFtZSkgeworICAgICAgICBuYW1lID0ga2V5TmFtZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdHJhbnNsYXRpb24gdmFsdWUgb2YgdGhlIGl0ZW0uCisgICAgICovCisgICAgCisgICAgcHVibGljIHZvaWQgc2V0VHJhbnNsYXRpb24oU3RyaW5nIHRyYW5zbGF0aW9uVmFsdWUpIHsKKyAgICAgICAgdmFsdWUgPSB0cmFuc2xhdGlvblZhbHVlOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBwYXJlbnQgQnVuZGxlR3JvdXAgb2YgdGhlIGl0ZW0uCisgICAgICovCisgICAgCisgICAgcHVibGljIHZvaWQgc2V0UGFyZW50R3JvdXAoQnVuZGxlR3JvdXAgZ3JvdXApIHsKKyAgICAgICAgdGhpcy5ncm91cCA9IGdyb3VwOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBBc3NvY2lhdGVzIGEgbG9naW4gbmFtZSBvZiB0aGUgY3JlYXRvciBvZiB0aGUgaXRlbSB3aXRoIHRoZSBpdGVtLgorICAgICAqLworCQorICAgIHB1YmxpYyB2b2lkIHNldENyZWF0b3IoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgY3JlYXRvciA9IG5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXNzb2NpYXRlcyBhIGxvZ2luIG5hbWUgb2YgdGhlIGxhc3QgbW9kaWZpZXIgb2YgdGhlIGl0ZW0gd2l0aCB0aGUgaXRlbS4KKyAgICAgKi8KKwkKKyAgICBwdWJsaWMgdm9pZCBzZXRNb2RpZmllcihTdHJpbmcgbmFtZSkgeworICAgICAgICBtb2RpZmllciA9IG5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgY3JlYXRlZCBkYXRlIG9mIHRoZSBpdGVtIGdpdmVuIGEgZGF0ZSBmb3JtYXR0ZWQgc3RyaW5nLgorICAgICAqIFRoZSBmb3JtYXQgY2FuIGJlIGVpdGhlciAnWVlZWS1NTS1ERCcgKGUuZy4gMjAwMDItMDItMDUpIG9yCisgICAgICogdGhlIGZvcm1hdCBjYW4gYmUgJ1lZWU1NRERUSEhNTVNTWicgKGUuZy4gMjAwMjAyMDVUMTAzMDAwWikKKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgdm9pZCBzZXRDcmVhdGVkRGF0ZShTdHJpbmcgZGF0ZVN0cikgeworICAgICAgICBpZiAoZGF0ZVN0ciAhPSBudWxsKSBjcmVhdGVkID0gcGFyc2VEYXRlRnJvbVN0cmluZyhkYXRlU3RyKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgY3JlYXRlZCBkYXRlIG9mIHRoZSBpdGVtLgorICAgICAqLworICAgIAorICAgIHB1YmxpYyB2b2lkIHNldENyZWF0ZWREYXRlKERhdGUgZGF0ZSkgeworICAgICAgICBjcmVhdGVkID0gZGF0ZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbGFzdCBtb2RpZmlmY2F0aW9uIGRhdGUgb2YgdGhlIGl0ZW0gZ2l2ZW4gYSBkYXRlIGZvcm1hdHRlZCBzdHJpbmcuCisgICAgICogVGhlIGZvcm1hdCBjYW4gYmUgZWl0aGVyICdZWVlZLU1NLUREJyAoZS5nLiAyMDAyLTAyLTA1KSBvcgorICAgICAqIHRoZSBmb3JtYXQgY2FuIGJlICdZWVlNTUREVEhITU1TU1onIChlLmcuIDIwMDIwMjA1VDEwMzAwMFopCisgICAgICovCisgICAgCisgICAgcHVibGljIHZvaWQgc2V0TW9kaWZpZWREYXRlKFN0cmluZyBkYXRlU3RyKSB7CisgICAgICAgIGlmIChkYXRlU3RyICE9IG51bGwpCisgICAgICAgIAltb2RpZmllZCA9IHBhcnNlRGF0ZUZyb21TdHJpbmcoZGF0ZVN0cik7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldHMgdGhlIGxhc3QgbW9kaWZpY2F0aW9uIGRhdGUgb2YgdGhlIGl0ZW0uCisgICAgICovCisgICAgCisgICAgcHVibGljIHZvaWQgc2V0TW9kaWZpZWREYXRlKERhdGUgZGF0ZSkgeworICAgICAgICBtb2RpZmllZCA9IGRhdGU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNpbXBseSByZXR1cm5zIHRoZSBsb29rdXAgbmFtZSBvZiB0aGUgaXRlbS4KKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZm9ybWF0dGVkIG91dHB1dCBvZiB0aGlzIGJ1bmRsZSBpdGVtIGFzIGl0IHdvdWxkIGJlIGluY2x1ZGVkIGluIGEgLnByb3BlcnRpZXMKKyAgICAgKiBmb3JtYXR0ZWQgcmVzb3VyY2UgYnVuZGxlIGZpbGUuIFRoaXMgZm9ybWF0IGFsc28gY29udGFpbnMgdGhlIG1ldGEtZGF0YSB1c2VkIGJ5IFJCTWFuYWdlciBpbgorICAgICAqIHRoZSBmb3JtIG9mIHBhcnNlYWJsZSBjb21tZW50cy4KKyAgICAgKi8KKworICAgIHB1YmxpYyBTdHJpbmcgdG9PdXRwdXRTdHJpbmcoKSB7CisgICAgICAgIFN0cmluZyByZXRTdHIgPSAodHJhbnNsYXRlZCA/ICIjIEB0cmFuc2xhdGVkIHRydWUiIDogIiMgQHRyYW5zbGF0ZWQgZmFsc2UiKTsKKyAgICAgICAgaWYgKGNyZWF0ZWQgIT0gbnVsbCkgeworICAgICAgICAgICAgR3JlZ29yaWFuQ2FsZW5kYXIgY3JlYXRlZENhbCA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigpOworICAgICAgICAgICAgY3JlYXRlZENhbC5zZXRUaW1lKGNyZWF0ZWQpOworICAgICAgICAgICAgaW50IHllYXIgPSBjcmVhdGVkQ2FsLmdldChDYWxlbmRhci5ZRUFSKTsKKyAgICAgICAgICAgIGludCBtb250aCA9IGNyZWF0ZWRDYWwuZ2V0KENhbGVuZGFyLk1PTlRIKSsxOworICAgICAgICAgICAgaW50IGRheSA9IGNyZWF0ZWRDYWwuZ2V0KENhbGVuZGFyLkRBWV9PRl9NT05USCk7CisgICAgICAgICAgICByZXRTdHIgKz0gIiBAY3JlYXRlZCAiICsgU3RyaW5nLnZhbHVlT2YoeWVhcikgKyAiLSIKKyAgICAgICAgICAgICAgICArIChtb250aCA+IDkgPyBTdHJpbmcudmFsdWVPZihtb250aCkgOiAiMCIgKyBTdHJpbmcudmFsdWVPZihtb250aCkpICsgIi0iCisgICAgICAgICAgICAgICAgKyAoZGF5ID4gOSA/IFN0cmluZy52YWx1ZU9mKGRheSkgOiAiMCIgKyBTdHJpbmcudmFsdWVPZihkYXkpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobW9kaWZpZWQgIT0gbnVsbCkgeworICAgICAgICAgICAgR3JlZ29yaWFuQ2FsZW5kYXIgbW9kaWZpZWRDYWwgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoKTsKKyAgICAgICAgICAgIG1vZGlmaWVkQ2FsLnNldFRpbWUobW9kaWZpZWQpOworICAgICAgICAgICAgaW50IHllYXIgPSBtb2RpZmllZENhbC5nZXQoQ2FsZW5kYXIuWUVBUik7CisgICAgICAgICAgICBpbnQgbW9udGggPSBtb2RpZmllZENhbC5nZXQoQ2FsZW5kYXIuTU9OVEgpKzE7CisgICAgICAgICAgICBpbnQgZGF5ID0gbW9kaWZpZWRDYWwuZ2V0KENhbGVuZGFyLkRBWV9PRl9NT05USCk7CisgICAgICAgICAgICByZXRTdHIgKz0gIiBAbW9kaWZpZWQgIiArIFN0cmluZy52YWx1ZU9mKHllYXIpICsgIi0iCisgICAgICAgICAgICAgICAgKyAobW9udGggPiA5ID8gU3RyaW5nLnZhbHVlT2YobW9udGgpIDogIjAiICsgU3RyaW5nLnZhbHVlT2YobW9udGgpKSArICItIgorICAgICAgICAgICAgICAgICsgKGRheSA+IDkgPyBTdHJpbmcudmFsdWVPZihkYXkpIDogIjAiICsgU3RyaW5nLnZhbHVlT2YoZGF5KSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNyZWF0b3IgIT0gbnVsbCkgcmV0U3RyICs9ICIgQGNyZWF0b3IgIiArIGNyZWF0b3I7CisgICAgICAgIGlmIChtb2RpZmllciAhPSBudWxsKSByZXRTdHIgKz0gIiBAbW9kaWZpZXIgIiArIG1vZGlmaWVyOworICAgICAgICBFbnVtZXJhdGlvbiBlbGVtcyA9IGxvb2t1cHMua2V5cygpOworICAgICAgICB3aGlsZSAoZWxlbXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBzdHIgPSAoU3RyaW5nKWVsZW1zLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICByZXRTdHIgKz0gIlxuIyBAeyIgKyBzdHIgKyAifSAiICsgKFN0cmluZylsb29rdXBzLmdldChzdHIpOworICAgICAgICB9CisgICAgICAgIGlmIChjb21tZW50ICE9IG51bGwpIHJldFN0ciArPSAiXG4jIEBjb21tZW50ICIgKyBjb21tZW50OworCQkKKyAgICAgICAgcmV0U3RyICs9ICJcbiIgKyBuYW1lICsgIj0iICsgc2F2ZUNvbnZlcnQodmFsdWUpOworICAgICAgICByZXR1cm4gcmV0U3RyOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgdGhlIGZvcm1hdHRlZCBjb250ZW50cyB0byBhIFByaW50U3RyZWFtLgorICAgICAqLworICAgIAorICAgIHB1YmxpYyB2b2lkIHdyaXRlQ29udGVudHMoUHJpbnRTdHJlYW0gcHMpIHsKKyAgICAgICAgcHMucHJpbnRsbih0aGlzLnRvT3V0cHV0U3RyaW5nKCkpOworICAgIH0KKwkKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgdGhlIGZvcm1hdHRlZCBjb250ZW50cyB0byBhIHdyaXRlciBzdWNoIGFzIGEgRmlsZVdyaXRlci4KKyAgICAgKi8KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlQ29udGVudHMoV3JpdGVyIHcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHcud3JpdGUodGhpcy50b091dHB1dFN0cmluZygpICsgIlxuIik7CisgICAgfQorCQkKKyAgICAvKgorICAgICAqIENvbnZlcnRzIHVuaWNvZGVzIHRvIGVuY29kZWQgXFx1eHh4eAorICAgICAqIGFuZCB3cml0ZXMgb3V0IGFueSBvZiB0aGUgY2hhcmFjdGVycyBpbiBzcGVjaWFsU2F2ZUNoYXJzCisgICAgICogd2l0aCBhIHByZWNlZGluZyBzbGFzaAorICAgICAqLworICAgIC8vIFRha2VuIGZyb20gamF2YS51dGlsLlByb3BlcnRpZXMKKyAgICBwcml2YXRlIFN0cmluZyBzYXZlQ29udmVydChTdHJpbmcgdGhlU3RyaW5nKSB7CisgICAgICAgIGNoYXIgYUNoYXI7CisgICAgICAgIGludCBsZW4gPSB0aGVTdHJpbmcubGVuZ3RoKCk7CisgICAgICAgIFN0cmluZ0J1ZmZlciBvdXRCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbioyKTsKKworICAgICAgICBmb3IoaW50IHg9MDsgeDxsZW47ICkgeworICAgICAgICAgICAgYUNoYXIgPSB0aGVTdHJpbmcuY2hhckF0KHgrKyk7CisgICAgICAgICAgICBzd2l0Y2goYUNoYXIpIHsKKyAgICAgICAgICAgICAgICBjYXNlICdcXCc6b3V0QnVmZmVyLmFwcGVuZCgnXFwnKTsgb3V0QnVmZmVyLmFwcGVuZCgnXFwnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgY2FzZSAnXHQnOm91dEJ1ZmZlci5hcHBlbmQoJ1xcJyk7IG91dEJ1ZmZlci5hcHBlbmQoJ3QnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgY2FzZSAnXG4nOm91dEJ1ZmZlci5hcHBlbmQoJ1xcJyk7IG91dEJ1ZmZlci5hcHBlbmQoJ24nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgY2FzZSAnXHInOm91dEJ1ZmZlci5hcHBlbmQoJ1xcJyk7IG91dEJ1ZmZlci5hcHBlbmQoJ3InKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgY2FzZSAnXGYnOm91dEJ1ZmZlci5hcHBlbmQoJ1xcJyk7IG91dEJ1ZmZlci5hcHBlbmQoJ2YnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKChhQ2hhciA8IDIwKSB8fCAoYUNoYXIgPiAxMjcpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRCdWZmZXIuYXBwZW5kKCdcXCcpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0QnVmZmVyLmFwcGVuZCgndScpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0QnVmZmVyLmFwcGVuZCh0b0hleCgoYUNoYXIgPj4gMTIpICYgMHhGKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRCdWZmZXIuYXBwZW5kKHRvSGV4KChhQ2hhciA+PiA4KSAmIDB4RikpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0QnVmZmVyLmFwcGVuZCh0b0hleCgoYUNoYXIgPj4gNCkgJiAweEYpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dEJ1ZmZlci5hcHBlbmQodG9IZXgoKGFDaGFyID4+IDApICYgMHhGKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3BlY2lhbFNhdmVDaGFycy5pbmRleE9mKGFDaGFyKSAhPSAtMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRCdWZmZXIuYXBwZW5kKCdcXCcpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0QnVmZmVyLmFwcGVuZChhQ2hhcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gb3V0QnVmZmVyLnRvU3RyaW5nKCk7CisgICAgfQorCQorICAgIC8qKgorICAgICAqIENvbnZlcnQgYSBuaWJibGUgdG8gYSBoZXggY2hhcmFjdGVyCisgICAgICogQHBhcmFtCW5pYmJsZQl0aGUgbmliYmxlIHRvIGNvbnZlcnQuCisgICAgICovCisJLy8gVGFrZW4gZnJvbSBqYXZhLnV0aWwuUHJvcGVydGllcworICAgIHByaXZhdGUgc3RhdGljIGNoYXIgdG9IZXgoaW50IG5pYmJsZSkgeworICAgICAgICByZXR1cm4gaGV4RGlnaXRbKG5pYmJsZSAmIDB4RildOworICAgIH0KKwkKKyAgICAvKiogQSB0YWJsZSBvZiBoZXggZGlnaXRzICovCisgICAgLy8gVGFrZW4gZnJvbSBqYXZhLnV0aWwuUHJvcGVydGllcworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBoZXhEaWdpdCA9IHsKKwknMCcsJzEnLCcyJywnMycsJzQnLCc1JywnNicsJzcnLCc4JywnOScsJ0EnLCdCJywnQycsJ0QnLCdFJywnRicKKyAgICB9OworCQorICAgIC8vIFRha2VuIGZyb20gamF2YS51dGlsLlByb3BlcnRpZXMKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc3BlY2lhbFNhdmVDaGFycyA9ICI9OiBcdFxyXG5cZiMhIjsKKwkKKyAgICBwcml2YXRlIERhdGUgcGFyc2VEYXRlRnJvbVN0cmluZyhTdHJpbmcgZGF0ZVN0cikgeworICAgICAgICBTaW1wbGVEYXRlRm9ybWF0IGZvcm1hdCA9IG51bGw7CisgICAgICAgIGlmIChkYXRlU3RyLmxlbmd0aCgpID09IDEwKQorICAgICAgICAJZm9ybWF0ID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoInl5eXktTU0tZGQiKTsgLy8gU2ltcGxlIGZvcm1hdAorICAgICAgICBlbHNlCisgICAgICAgIAlmb3JtYXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eU1NZGQnVCdISG1tc3MnWiciKTsgICAgICAgICAgICAgIC8vIFRNWCBJU08gZm9ybWF0CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gZm9ybWF0LnBhcnNlKGRhdGVTdHIpOworICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBwZSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKCk7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL09jY3VyYW5jZS5qYXZhIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL09jY3VyYW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5YmNiZGEKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vT2NjdXJhbmNlLmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDQsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kICAqCisgKiBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitwYWNrYWdlIGNvbS5pYm0ucmJtOworCisvKioKKyAqIFRoaXMgaXMgYSBjbGFzcyB1c2VkIGJ5IHRoZSBSQlJlcG9ydGVyIHRvIHRyYWNrIG9jY3VyYW5jZXMgb2YgYSByZXNvdXJjZQorICoga2V5IGZvdW5kIHdoaWxlIHNjYW5uaW5nIGEgdGV4dCBjb2RlIGZpbGUuIEl0IGlzIHVzZWQgbWFpbmx5IHRvIHByb2R1Y2UgZXJyb3IKKyAqIG1lc3NhZ2VzIHdpdGggaGVscGZ1bCBjb250ZXh0IGluZm9ybWF0aW9uLgorICogCisgKiBAYXV0aG9yIEphcmVkIEphY2tzb24KKyAqIEBzZWUgY29tLmlibS5yYm0uUkJSZXBvcnRlcgorICovCitwdWJsaWMgY2xhc3MgT2NjdXJhbmNlIHsKKyAgICBwcml2YXRlIFN0cmluZyBmaWxlX25hbWU7CisgICAgcHJpdmF0ZSBTdHJpbmcgZmlsZV9wYXRoOworICAgIHByaXZhdGUgaW50IGxpbmVfbnVtYmVyOworICAgIAorICAgIC8qKgorICAgICAqIEJhc2ljIGRhdGEgY29uc3RydWN0b3IuCisgICAgICovCisgICAgCisgICAgT2NjdXJhbmNlIChTdHJpbmcgZmlsZV9uYW1lLCBTdHJpbmcgZmlsZV9wYXRoLCBpbnQgbGluZV9udW1iZXIpIHsKKyAgICAgICAgdGhpcy5maWxlX25hbWUgPSBmaWxlX25hbWU7CisgICAgICAgIHRoaXMuZmlsZV9wYXRoID0gZmlsZV9wYXRoOworICAgICAgICB0aGlzLmxpbmVfbnVtYmVyID0gbGluZV9udW1iZXI7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGFzc29jaWF0ZWQgZmlsZSBuYW1lIG9mIHRoZSBvY2N1cmFuY2UKKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIGdldEZpbGVOYW1lKCkgeworICAgICAgICByZXR1cm4gZmlsZV9uYW1lOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBhc3NvY2lhdGVkIGZpbGUgcGF0aCBvZiB0aGUgb2NjdXJhbmNlCisgICAgICovCisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXRGaWxlUGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIGZpbGVfcGF0aDsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbGluZSBudW1iZXIgb2YgdGhlIG9jY3VyYW5jZS4KKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgaW50IGdldExpbmVOdW1iZXIoKSB7CisgICAgICAgIHJldHVybiBsaW5lX251bWJlcjsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgb2NjdXJhbmNlIG9mIHRoZSBmb3JtICdPY2N1cmFuY2U6IF9maWxlX3BhdGhfIChfbGluZV9udW1iZXJfKScKKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIk9jY3VyYW5jZTogIiArIGZpbGVfcGF0aCArICIgKCIgKyBsaW5lX251bWJlciArICIpIjsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL1ByZWZlcmVuY2VzLmphdmEgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vUHJlZmVyZW5jZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDk0YjhhCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL1ByZWZlcmVuY2VzLmphdmEKQEAgLTAsMCArMSwxODEgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoQykgMjAwMC0yMDA0LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCAgKgorICogb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworcGFja2FnZSBjb20uaWJtLnJibTsKKworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEuaW8uKjsKKworLyoqCisgKiBUaGlzIGNsYXNzIGRlZmluZXMgdGhlIG1ldGhvZHMgdXNlZCBieSBSQk1hbmFnZXIgdG8gYWNjZXNzLCBzZXQsIGFuZCBzdG9yZQorICogaW5kaXZpZHVhbCB1c2VyIHByZWZlcmVuY2VzIGZvciB0aGUgYXBwbGljYXRpb24uIEFsbCBvZiB0aGUgcHVibGljIG1ldGhvZHMgZGVmaW5lZAorICogaW4gdGhpcyBjbGFzcyBhcmUgc3RhdGljLCBhbmQgc28gdGhlIGNsYXNzIG5lZWQgbm90IGJlIGluc3RhbnRpYXRlZC4KKyAqIAorICogQGF1dGhvciBKYXJlZCBKYWNrc29uCisgKiBAc2VlIGNvbS5pYm0ucmJtLlJCTWFuYWdlcgorICovCitwdWJsaWMgY2xhc3MgUHJlZmVyZW5jZXMgeworICAgIC8vIERlZmF1bHQgdmFsdWVzCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5VTV9SRUNFTlRfRklMRVMgPSA0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWV9TVFJJTkcgPSAiIjsKKyAgICBwcml2YXRlIHN0YXRpYyBQcm9wZXJ0aWVzIHByb3A7CisJCisgICAgLyoqCisgICAgICogUmV0cmlldmUgYSBwcmVmZXJlbmNlIGJ5IGl0cyBrZXkgbmFtZQorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBrZXkgYXNzb2NpYXRlZCB3aXRoIG9uZSBwcmVmZXJlbmNlCisgICAgICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2Ugc291Z2h0CisgICAgICovCisJCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJlZmVyZW5jZShTdHJpbmcgbmFtZSkgeworICAgICAgICBpZiAocHJvcCA9PSBudWxsKSBpbml0KCk7CisgICAgICAgIE9iamVjdCBvID0gcHJvcC5nZXQobmFtZSk7CisgICAgICAgIGlmIChvID09IG51bGwgfHwgIShvIGluc3RhbmNlb2YgU3RyaW5nKSkgcmV0dXJuIEVNUFRZX1NUUklORzsKKyAgICAgICAgcmV0dXJuIChTdHJpbmcpbzsKKyAgICB9CisJCisgICAgLyoqCisgICAgICogU2V0cyBhIHByZWZlcmVuY2UgYnkga2V5IG5hbWUgYW5kIHZhbHVlLiBJZiB0aGUga2V5IG5hbWUgYWxsIHJlYWR5IGV4aXN0cywgdGhhdAorICAgICAqIHByZWZlcmVuY2UgaXMgb3ZlcndyaXR0ZW4gd2l0aG91dCB3YXJuaW5nLgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBrZXkgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmVmZXJlbmNlCisgICAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgcHJlZmVyZW5jZSB0byBiZSBzZXQgYW5kIGxhdGVyIHJldHJpZXZlZC4gSWYgdGhpcyB2YWx1ZSBpcyBudWxsLCB0aGUgcHJvcGVydHkgb2YgdGhpcyBuYW1lIGlzIGVyYXNlZC4KKyAgICAgKi8KKwkKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0UHJlZmVyZW5jZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIGlmIChwcm9wID09IG51bGwpIGluaXQoKTsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSwgd2Ugd2lsbCByZW1vdmUgdGhlIHByb3BlcnR5CisgICAgICAgICAgICBwcm9wLnJlbW92ZShuYW1lKTsKKyAgICAgICAgfQorICAgICAgICBwcm9wLnB1dChuYW1lLCB2YWx1ZSk7CisgICAgfQorCQorICAgIC8qKgorICAgICAqIFdyaXRlcyB0aGUgcmVzdWx0cyBvZiB0aGUgYnVmZmVyZWQgcHJlZmVyZW5jZXMgdG8gZmlsZS4gVGhlcmUgaXMgbm8gb3B0aW9uIGZvcgorICAgICAqIHdoZXJlIHRoaXMgZmlsZSBpcyBzYXZlZCBvbiB0aGUgZmlsZSBzeXN0ZW0uCisgICAgICovCisJCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNhdmVQcmVmZXJlbmNlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChwcm9wID09IG51bGwpIGluaXQoKTsKKyAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSgicHJlZmVyZW5jZXMucHJvcGVydGllcyIpOworICAgICAgICBwcm9wLnN0b3JlKGZvcywgIlJCTWFuYWdlciBQcmVmZXJlbmNlcyIpOworICAgICAgICBmb3MuZmx1c2goKTsKKyAgICAgICAgZm9zLmNsb3NlKCk7CisgICAgfQorCQorICAgIC8qKgorICAgICAqIEdpdmVuIHRoZSBuYW1lIG9mIGEgcmVzb3VyY2UgYnVuZGxlIGFuZCB0aGUgZmlsZSBwYXRoIGxvY2F0aW9uIG9mIHRoZSBiYXNlCisgICAgICogZG9jdW1lbnQgZm9yIHRoYXQgcmVzb3VyY2UgYnVuZGxlLCB0aGlzIG1ldGhvZCB3aWxsIGluc2VydCB0aGF0IGZpbGUgaW50bworICAgICAqIGEgbGlzdCBvZiByZWNlbnQgZmlsZXMuIEN1cnJlbnRseSB0aGUgcGFzdCA0IHJlc291cmNlIGJ1bmRsZXMgdmlzaXRlZCB3aWxsCisgICAgICogYmUgZGlzcGxheWVkLiBUaGlzIG1ldGhvZCBhbHNvIHNvcnRzIHRoZSBwcmVmZW5jZXMgc28gdGhhdCB0aGUgbW9zdCByZWNlbnRseQorICAgICAqIGFkZGVkIHdpbGwgYmUgdGhlIGZpcnN0IHJldHVybmVkLCBldmVuIGlmIHRoYXQgZmlsZSBoYWQgYWxsIHJlYWR5IGV4aXN0ZWQKKyAgICAgKiBpbiB0aGUgcHJlZmVyZW5jZXMgd2hlbiBpdCB3YXMgYWRkZWQuCisgICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhpcyBmaWxlIGFzIGl0IHdpbGwgYmUgZGlzcGxheWVkIHRvIHRoZSB1c2VyCisgICAgICogQHBhcmFtIGxvY2F0aW9uIFRoZSBmaWxlIHBhdGggdG8gdGhpcyBmaWxlIChzaG91bGQgYmUgYWJzb2x1dGUpLgorICAgICAqLworCQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRSZWNlbnRGaWxlUHJlZmVyZW5jZShTdHJpbmcgbmFtZSwgU3RyaW5nIGxvY2F0aW9uKSB7CisgICAgICAgIFZlY3RvciBleGlzdGluZ05hbWVzID0gbmV3IFZlY3RvcigpOworICAgICAgICBWZWN0b3IgZXhpc3RpbmdMb2NhdGlvbnMgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IE5VTV9SRUNFTlRfRklMRVM7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nIG9sZE5hbWUgPSBnZXRQcmVmZXJlbmNlKCJyZWNlbnRmaWxlaWQiICsgU3RyaW5nLnZhbHVlT2YoaSkpOworICAgICAgICAgICAgU3RyaW5nIG9sZExvY2F0aW9uID0gZ2V0UHJlZmVyZW5jZSgicmVjZW50ZmlsZWxvYyIgKyBTdHJpbmcudmFsdWVPZihpKSk7CisgICAgICAgICAgICBpZiAob2xkTmFtZS5lcXVhbHMoRU1QVFlfU1RSSU5HKSB8fCBvbGRMb2NhdGlvbi5lcXVhbHMoRU1QVFlfU1RSSU5HKSkgYnJlYWs7CisgICAgICAgICAgICBleGlzdGluZ05hbWVzLmFkZEVsZW1lbnQob2xkTmFtZSk7CisgICAgICAgICAgICBleGlzdGluZ0xvY2F0aW9ucy5hZGRFbGVtZW50KG9sZExvY2F0aW9uKTsKKyAgICAgICAgfQorICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIGZpbGUgaXMgYWxsIHJlYWR5IGluIHRoZXJlCisgICAgICAgIGludCBzd2FwX3N0YXJ0ID0gMDsKKyAgICAgICAgaW50IG9sZF9zaXplID0gZXhpc3RpbmdMb2NhdGlvbnMuc2l6ZSgpOworICAgICAgICBmb3IgKGludCBpPTA7IGkgPD0gb2xkX3NpemU7IGkrKykgeworICAgICAgICAgICAgaWYgKGkgPT0gZXhpc3RpbmdMb2NhdGlvbnMuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgLy8gTm8gbWF0Y2ggd2FzIGZvdW5kLCBwdWxsIGFsbCB0aGUgZWxlbWVudHMgZG93biBvbmUKKyAgICAgICAgICAgICAgICBzd2FwX3N0YXJ0ID0gaTsKKyAgICAgICAgICAgICAgICBpZiAoc3dhcF9zdGFydCA+PSBOVU1fUkVDRU5UX0ZJTEVTKSBzd2FwX3N0YXJ0ID0gTlVNX1JFQ0VOVF9GSUxFUy0xOworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBFeHRlbmQgdGhlIGxlbmd0aCBvZiB0aGUgdmVjdG9ycworICAgICAgICAgICAgICAgICAgICBleGlzdGluZ05hbWVzLmFkZEVsZW1lbnQoRU1QVFlfU1RSSU5HKTsKKyAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdMb2NhdGlvbnMuYWRkRWxlbWVudChFTVBUWV9TVFJJTkcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIG9sZExvY2F0aW9uID0gKFN0cmluZylleGlzdGluZ0xvY2F0aW9ucy5lbGVtZW50QXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKG9sZExvY2F0aW9uLmVxdWFscyhsb2NhdGlvbikpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2UgZm91bmQgYSBtYXRjaCwgcHVsbCB0aGlzIG9uZSB0byB0aGUgZnJvbnQKKyAgICAgICAgICAgICAgICAgICAgc3dhcF9zdGFydCA9IGk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCQkKKyAgICAgICAgLy8gTW92ZSB0aGUgZmlsZXMgZG93biB0aGUgbGluZSBhcyBhcHByb3ByaWF0ZQorICAgICAgICBmb3IgKGludCBpPXN3YXBfc3RhcnQ7IGkgPiAwOyBpLS0pIHsKKyAgICAgICAgICAgIGV4aXN0aW5nTG9jYXRpb25zLnNldEVsZW1lbnRBdChleGlzdGluZ0xvY2F0aW9ucy5lbGVtZW50QXQoaS0xKSxpKTsKKyAgICAgICAgICAgIGV4aXN0aW5nTmFtZXMuc2V0RWxlbWVudEF0KGV4aXN0aW5nTmFtZXMuZWxlbWVudEF0KGktMSksaSk7CisgICAgICAgIH0KKyAgICAgICAgZXhpc3RpbmdMb2NhdGlvbnMuc2V0RWxlbWVudEF0KGxvY2F0aW9uLCAwKTsKKyAgICAgICAgZXhpc3RpbmdOYW1lcy5zZXRFbGVtZW50QXQobmFtZSwgMCk7CisJCQorICAgICAgICAvLyBTZXQgdGhlIHByb3BlcnRpZXMKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgZXhpc3RpbmdMb2NhdGlvbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIHNldFByZWZlcmVuY2UoInJlY2VudGZpbGVpZCIgKyBTdHJpbmcudmFsdWVPZihpKSwgKFN0cmluZylleGlzdGluZ05hbWVzLmVsZW1lbnRBdChpKSk7CisgICAgICAgICAgICBzZXRQcmVmZXJlbmNlKCJyZWNlbnRmaWxlbG9jIiArIFN0cmluZy52YWx1ZU9mKGkpLCAoU3RyaW5nKWV4aXN0aW5nTG9jYXRpb25zLmVsZW1lbnRBdChpKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaT1leGlzdGluZ0xvY2F0aW9ucy5zaXplKCk7IGkgPCBOVU1fUkVDRU5UX0ZJTEVTOyBpKyspIHsKKyAgICAgICAgICAgIHNldFByZWZlcmVuY2UoInJlY2VudGZpbGVpZCIgKyBTdHJpbmcudmFsdWVPZihpKSwgRU1QVFlfU1RSSU5HKTsKKyAgICAgICAgICAgIHNldFByZWZlcmVuY2UoInJlY2VudGZpbGVsb2MiICsgU3RyaW5nLnZhbHVlT2YoaSksIEVNUFRZX1NUUklORyk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNhdmVQcmVmZXJlbmNlcygpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHt9IC8vIElnbm9yZSwgaXRzIG5vdCBjcml0aWNhbAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIGxvY2F0aW9ucyBvZiB0aGUgdmFyaW91cyByZWNlbnRseSB1c2VkIGZpbGVzLgorICAgICAqIEByZXR1cm4gQSBWZWN0b3Igb2YgU3RyaW5ncyB3aGljaCBpcyB0d2ljZSBpbiBsZW5ndGggdGhlIG51bWJlciBvZiBmaWxlcyBrbm93biBhYm91dC4gVGhlIHZlY3RvciBjb250YWlucyBuYW1lIDEgdGhlbiBsb2NhdGlvbiAxLCB0aGVuIG5hbWUgMiAuLi4KKyAgICAgKi8KKwkKKyAgICBwdWJsaWMgc3RhdGljIFZlY3RvciBnZXRSZWNlbnRGaWxlc1ByZWZlcmVuY2VzKCkgeworICAgICAgICBpZiAocHJvcCA9PSBudWxsKSBpbml0KCk7CisgICAgICAgIFZlY3RvciBleGlzdGluZyA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgTlVNX1JFQ0VOVF9GSUxFUzsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGdldFByZWZlcmVuY2UoInJlY2VudGZpbGVpZCIgKyBTdHJpbmcudmFsdWVPZihpKSk7CisgICAgICAgICAgICBTdHJpbmcgbG9jYXRpb24gPSBnZXRQcmVmZXJlbmNlKCJyZWNlbnRmaWxlbG9jIiArIFN0cmluZy52YWx1ZU9mKGkpKTsKKyAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscyhFTVBUWV9TVFJJTkcpIHx8IGxvY2F0aW9uLmVxdWFscyhFTVBUWV9TVFJJTkcpKSBicmVhazsKKyAgICAgICAgICAgIGV4aXN0aW5nLmFkZEVsZW1lbnQobmFtZSk7CisgICAgICAgICAgICBleGlzdGluZy5hZGRFbGVtZW50KGxvY2F0aW9uKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXhpc3Rpbmc7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbml0KCkgeworICAgICAgICBQcm9wZXJ0aWVzIGRlZmF1bHRzID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgLy8gVGhpcyB2YWx1ZXMgYXJlIG5lZWRlZCBhbmQgYXJlIHNwZWNpZmllZCBieSBkZWZhdWx0CisgICAgICAgIC8vIElmIHRoZXkgZXhpc3QgaW4gdGhlIGZpbGUsIHRoZXkgd2lsbCBiZSBvdmVyd3JpdHRlbgorICAgICAgICBkZWZhdWx0cy5wdXQoInVzZXJuYW1lIiwgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJ1bmtub3duX3VzZXIiKSk7CisgICAgICAgIGRlZmF1bHRzLnB1dCgibG9jYWxlIiwgImVuIik7CisgICAgICAgIGRlZmF1bHRzLnB1dCgibG9va2FuZGZlZWwiLCAiIik7CisJCQorICAgICAgICBwcm9wID0gbmV3IFByb3BlcnRpZXMoZGVmYXVsdHMpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oInByZWZlcmVuY2VzLnByb3BlcnRpZXMiKTsKKyAgICAgICAgICAgIHByb3AubG9hZChmaXMpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRXJyb3IgcmVhZGluZyBwcm9wZXJ0aWVzIik7CisgICAgICAgICAgICBpb2UucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzYXZlUHJlZmVyZW5jZXMoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkVycm9yIHNhdmluZyBwcmVmZXJlbmNlcyAiICsgaW9lLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisJCisgICAgLyoKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB7CisgICAgICAgIC8vIFRlc3QKKyAgICAgICAgaW5pdCgpOworICAgIH0KKyAgICAqLworfQpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL1JCRXhwb3J0ZXIuamF2YSBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9SQkV4cG9ydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RhNTgwNAotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9SQkV4cG9ydGVyLmphdmEKQEAgLTAsMCArMSwyNCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDQsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kICAqCisgKiBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitwYWNrYWdlIGNvbS5pYm0ucmJtOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LnN3aW5nLio7CisKKy8qKgorICogVGhpcyBpcyB0aGUgc3VwZXIgY2xhc3MgZm9yIGFsbCBleHBvcnRlciBwbHVnLWluIGNsYXNzZXMuIEFzIG9mIHlldCwgdGhlcmUKKyAqIGlzIGxpdHRsZSBjb250YWluZWQgaW4gdGhpcyBjbGFzcy4KKyAqIAorICogQGF1dGhvciBKYXJlZCBKYWNrc29uCisgKiBAc2VlIGNvbS5pYm0ucmJtLlJCTWFuYWdlcgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUkJFeHBvcnRlciB7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBKRmlsZUNob29zZXIgY2hvb3NlcjsKKwkKKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBleHBvcnQoUkJNYW5hZ2VyIHJibSkgdGhyb3dzIElPRXhjZXB0aW9uOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9SQklDVUV4cG9ydGVyLmphdmEgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vUkJJQ1VFeHBvcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhYmMxMWUKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vUkJJQ1VFeHBvcnRlci5qYXZhCkBAIC0wLDAgKzEsMTkxIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgICoKKyAqIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3BhY2thZ2UgY29tLmlibS5yYm07CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc3dpbmcuKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworLyoqCisgKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgcGx1Zy1pbiBleHBvcnRlciB1dGlsaXR5IGZvciBSQk1hbmFnZXIgdGhhdCBvdXRwdXRzIElDVQorICogcmVzb3VyY2UgYnVuZGxlIGZpbGVzIGluIHRoZSBhY2NvcmRpbmcgdG8gdGhlIGZpbGUgc3RydWN0dXJlIG9mIFJlc291cmNlCisgKiBCdW5kbGVzLiBNb3N0IG9mIHRoZSBtZXRhLWRhdGEgaXMgbG9zdCBpbiB0aGlzIGV4cG9ydC4KKyAqIAorICogQGF1dGhvciBHZW9yZ2UgUmhvdGVuCisgKiBAc2VlIGNvbS5pYm0ucmJtLlJCTWFuYWdlcgorICovCitwdWJsaWMgY2xhc3MgUkJJQ1VFeHBvcnRlciBleHRlbmRzIFJCRXhwb3J0ZXIgeworICAgIC8qKiBEbyBjaGFyYWN0ZXJzIGJleW9uZCBcXHUwMDdmIG5lZWQgXFx1IGVzY2FwZSBub3RhdGlvbj8gKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZXNjYXBlTm9uQXNjaWkgPSBmYWxzZTsKKworICAgIC8qKiBXcml0ZSB0aGUgbWV0YSBkYXRhIGZvciBlYWNoIHJlc291cmNlPyAqLworICAgIHByaXZhdGUgYm9vbGVhbiB3cml0ZU1ldGFEYXRhID0gdHJ1ZTsKKwkKKyAgICAvKiogV3JpdGUgdGhlIGdyb3VwcyBhcyBrZXlzPyAqLworICAgIHByaXZhdGUgYm9vbGVhbiB3cml0ZUdyb3Vwc0FzS2V5cyA9IGZhbHNlOworCisgICAgcHVibGljIFJCSUNVRXhwb3J0ZXIoKSB7CisgICAgICAgIHN1cGVyKCk7CisJCQorICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBmaWxlIGNob29zZXIgaWYgbmVjZXNzYXJ5CisgICAgICAgIGlmIChjaG9vc2VyID09IG51bGwpIHsKKyAgICAgICAgICAgIGNob29zZXIgPSBuZXcgSkZpbGVDaG9vc2VyKCk7CisgICAgICAgICAgICBjaG9vc2VyLnNldEZpbGVGaWx0ZXIobmV3IGphdmF4LnN3aW5nLmZpbGVjaG9vc2VyLkZpbGVGaWx0ZXIoKXsKKyAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gInJvb3QgSUNVIEZpbGUiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBmKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmLmlzRGlyZWN0b3J5KCkpIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGYuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoInJvb3QuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9IC8vIGVuZCBpZgorICAgIH0KKwkKKyAgICBwdWJsaWMgdm9pZCBleHBvcnQoUkJNYW5hZ2VyIHJibSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHJibSA9PSBudWxsKSByZXR1cm47CisgICAgICAgIC8vIE9wZW4gdGhlIFNhdmUgRGlhbG9nCisgICAgICAgIGludCByZXRfdmFsID0gY2hvb3Nlci5zaG93U2F2ZURpYWxvZyhudWxsKTsKKyAgICAgICAgaWYgKHJldF92YWwgIT0gSkZpbGVDaG9vc2VyLkFQUFJPVkVfT1BUSU9OKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLy8gUmV0cmlldmUgYmFzaWMgZmlsZSBpbmZvcm1hdGlvbgorICAgICAgICBGaWxlIGZpbGUgPSBjaG9vc2VyLmdldFNlbGVjdGVkRmlsZSgpOyAgICAgICAgICAgICAgICAgIC8vIFRoZSBmaWxlKHMpIHdlIHdpbGwgYmUgd29ya2luZyB3aXRoCisgICAgICAgIEZpbGUgZGlyZWN0b3J5ID0gbmV3IEZpbGUoZmlsZS5nZXRQYXJlbnQoKSk7ICAgICAgICAgICAgLy8gVGhlIGRpcmVjdG9yeSB3ZSB3aWxsIGJlIHdyaXRpbmcgdG8KKyAgICAgICAgU3RyaW5nIGJhc2VfbmFtZSA9IGZpbGUuZ2V0TmFtZSgpOyAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgYmFzZSBuYW1lIG9mIHRoZSBmaWxlcyB3ZSB3aWxsIHdyaXRlCisgICAgICAgIGlmIChiYXNlX25hbWUgPT0gbnVsbCB8fCBiYXNlX25hbWUuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgYmFzZV9uYW1lID0gcmJtLmdldEJhc2VDbGFzcygpOworICAgICAgICB9CisgICAgICAgIGlmIChiYXNlX25hbWUudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLnByb3BlcnRpZXMiKSkgeworICAgICAgICAgICAgYmFzZV9uYW1lID0gYmFzZV9uYW1lLnN1YnN0cmluZygwLGJhc2VfbmFtZS5sZW5ndGgoKS0xMSk7CisgICAgICAgIH0KKwkJCisgICAgICAgIFZlY3RvciBidW5kbGVfdiA9IHJibS5nZXRCdW5kbGVzKCk7CisgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IGJ1bmRsZV92LnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gKEJ1bmRsZSlidW5kbGVfdi5lbGVtZW50QXQoaSk7CisgICAgICAgICAgICBTdHJpbmcgYmFzZV9lbmMgPSBiYXNlX25hbWU7CisgICAgICAgICAgICBpZiAoYnVuZGxlLmVuY29kaW5nICE9IG51bGwgJiYgIWJ1bmRsZS5lbmNvZGluZy5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICAgICAgYmFzZV9lbmMgPSBiYXNlX2VuYyArICJfIiArIGJ1bmRsZS5lbmNvZGluZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZyBmaWxlX25hbWUgPSBiYXNlX2VuYyArICIudHh0IjsKKyAgICAgICAgICAgIFN0cmluZyBoZWFkZXIgPSAiXHVmZWZmLy8gUmVzb3VyY2UgQnVuZGxlOiAiICsgZmlsZV9uYW1lICsgIiAtIEZpbGUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgUkJNYW5hZ2VyIGF0ICIgKyAobmV3IERhdGUoKSk7CisKKyAgICAgICAgICAgIE91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShuZXcgRmlsZShkaXJlY3RvcnksIGZpbGVfbmFtZSkpOworICAgICAgICAgICAgUHJpbnRXcml0ZXIgcmVzT3V0ID0gbmV3IFByaW50V3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoZm9zLCAiVVRGLTgiKSk7CisKKyAgICAgICAgICAgIFZlY3RvciBncm91cF92ID0gYnVuZGxlLmdldEdyb3Vwc0FzVmVjdG9yKCk7CisgICAgICAgICAgICByZXNPdXQucHJpbnRsbihoZWFkZXIpOworICAgICAgICAgICAgcmVzT3V0LnByaW50bG4oYmFzZV9lbmMgKyAiIHsgIik7CisgICAgICAgICAgICBmb3IgKGludCBqPTA7IGogPCBncm91cF92LnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICAgICAgQnVuZGxlR3JvdXAgZ3JvdXAgPSAoQnVuZGxlR3JvdXApZ3JvdXBfdi5lbGVtZW50QXQoaik7CisKKyAgICAgICAgICAgICAgICBWZWN0b3IgaXRlbVZlY3QgPSBncm91cC5nZXRJdGVtc0FzVmVjdG9yKCk7CisgICAgICAgICAgICAgICAgaW50IGl0ZW1WZWN0U2l6ZSA9IGl0ZW1WZWN0LnNpemUoKTsKKyAgICAgICAgICAgICAgICBpZiAoaXRlbVZlY3RTaXplID4gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVNZXRhRGF0YSkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGdyb3VwQ29tbWVudCA9IGdyb3VwLmdldENvbW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChncm91cENvbW1lbnQgIT0gbnVsbCAmJiAhZ3JvdXBDb21tZW50LmVxdWFscygiIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNPdXQucHJpbnRsbigiICAgIC8vIEBncm91cENvbW1lbnQgIiArIGdyb3VwQ29tbWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBib29sZWFuIHdyaXRlR3JvdXBOYW1lID0gIWJ1bmRsZS5nZXRVbmdyb3VwZWRHcm91cCgpLmdldE5hbWUoKS5lcXVhbHMoZ3JvdXAuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlR3JvdXBOYW1lKSB7CisJICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGVHcm91cHNBc0tleXMpIHsKKwkJICAgICAgICAgICAgICAgICAgICByZXNPdXQucHJpbnRsbigiICAgICIgKyBlc2NhcGVTdHJpbmcoZ3JvdXAuZ2V0TmFtZSgpLCB0cnVlKSArICIgeyAiKTsKKwkgICAgICAgICAgICAgICAgICAgIH0KKwkgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHdyaXRlTWV0YURhdGEpIHsKKwkJICAgICAgICAgICAgICAgICAgICByZXNPdXQucHJpbnRsbigiICAgIC8vIEBncm91cCAiICsgZXNjYXBlU3RyaW5nKGdyb3VwLmdldE5hbWUoKSwgdHJ1ZSkpOworCSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGs9MDsgayA8IGl0ZW1WZWN0U2l6ZTsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBCdW5kbGVJdGVtIGl0ZW0gPSAoQnVuZGxlSXRlbSlpdGVtVmVjdC5lbGVtZW50QXQoayk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZU1ldGFEYXRhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzT3V0LnByaW50KCIgICAgICAgIC8vIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzT3V0LnByaW50KCIgQHRyYW5zbGF0ZWQgIiArIGl0ZW0uaXNUcmFuc2xhdGVkKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc091dC5wcmludCgiIEBjcmVhdGVkICIgKyBpdGVtLmdldENyZWF0ZWREYXRlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc091dC5wcmludCgiIEBtb2RpZmllZCAiICsgaXRlbS5nZXRNb2RpZmllZERhdGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzT3V0LnByaW50KCIgQGNyZWF0b3IgIiArIGl0ZW0uZ2V0Q3JlYXRvcigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNPdXQucHJpbnRsbigiIEBtb2RpZmllciAiICsgaXRlbS5nZXRNb2RpZmllcigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaXRlbUNvbW1lbnQgPSBpdGVtLmdldENvbW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbUNvbW1lbnQgIT0gbnVsbCAmJiAhaXRlbUNvbW1lbnQuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNPdXQucHJpbnRsbigiICAgICAgICAvLyBAY29tbWVudCAiICsgaXRlbUNvbW1lbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgcmVzT3V0LnByaW50bG4oIiAgICAgICAgIiArIGVzY2FwZVN0cmluZyhpdGVtLmdldEtleSgpLCB0cnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHsgIiArIGVzY2FwZVN0cmluZyhpdGVtLmdldFRyYW5zbGF0aW9uKCksIGZhbHNlKSArICIgfSIpOworICAgICAgICAgICAgICAgICAgICB9IC8vIGVuZCBmb3IgLSBrCisgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZUdyb3VwTmFtZSAmJiB3cml0ZUdyb3Vwc0FzS2V5cykgeworCSAgICAgICAgICAgICAgICAgICAgcmVzT3V0LnByaW50bG4oIiAgICB9Iik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IC8vIGVuZCBmb3IgLSBqCisgICAgICAgICAgICByZXNPdXQucHJpbnRsbigifSIpOworCQkJCisgICAgICAgICAgICAvLyBXcml0ZSBvdXQgdGhlIGZpbGUKKyAgICAgICAgICAgIHJlc091dC5jbG9zZSgpOworICAgICAgICAgICAgZm9zLmNsb3NlKCk7CisgICAgICAgIH0gLy8gZW5kIGZvciAtIGkKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFc2NhcGUgYSBzdHJpbmcgYWNjb3JkaW5nIHRvIGhvdyB0aGUgSUNVIHRvb2wgImdlbnJiIiBoYW5kbGVzIHN0cmluZ3MuCisgICAgICogQHBhcmFtIHN0ciBUaGUgc3RyaW5nIHRvIGVzY2FwZQorICAgICAqIEBwYXJhbSBpc0tleSBJZiB0aGlzIGlzIGEga2V5LCB0aGVuIHF1b3RlcyBhcmUgb3B0aW9uYWwuCisgICAgICogQHJldHVybiBBIHN0cmluZyB0aGF0IGNhbiBiZSB1c2VkIGluIGFuIElDVSByZXNvdXJjZSBidW5kbGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBlc2NhcGVTdHJpbmcoU3RyaW5nIHN0ciwgYm9vbGVhbiBpc0tleSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIHN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgaW50IGxlbiA9IHN0ci5sZW5ndGgoKTsKKyAgICAgICAgYm9vbGVhbiBxdW90ZVJlcXVpcmVkID0gIWlzS2V5OworICAgICAgICBmb3IgKGludCBpZHggPSAwOyBpZHggPCBsZW47IGlkeCsrKSB7CisgICAgICAgICAgICBpbnQgY2ggPSBzdHIuY2hhckF0KGlkeCk7CisgICAgICAgICAgICBpZiAoY2ggPD0gJyAnIHx8ICd+JyA8IGNoKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzS2V5ICYmIGNoICE9ICcgJykgeworICAgICAgICAgICAgICAgICAgICBJT0V4Y2VwdGlvbiBlID0gbmV3IElPRXhjZXB0aW9uKHN0ciArICIgbmVlZHMgdG8gdXNlIGludmFyaWFudCBjaGFyYWN0ZXJzIGZvciB0aGUga2V5LiIpOworICAgICAgICAgICAgICAgICAgICBlLmZpbGxJblN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVzY2FwZU5vbkFzY2lpICYmIGNoICE9ICcgJykgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgemVyb3M7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZXhOdW07CisgICAgICAgICAgICAgICAgICAgIGlmICgoY2ggJiAweGY4MDApID09IDB4ZDgwMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgYXNzdW1lIHRoYXQgd2UgZm91bmQgYSB2YWxpZCBVVEYtMTYgc3RyaW5nIHdpdGggYSBzdXJyb2dhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaDIgPSBzdHIuY2hhckF0KGlkeCsrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaFN1cnJvZ2F0ZSA9ICgoKGNoKTw8MTApKyhjaDIpLSgoMHhkODAwPDwxMCkrMHhkYzAwLTB4MTAwMDApKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgemVyb3MgPSAiMDAwMDAwMDAiOworICAgICAgICAgICAgICAgICAgICAgICAgaGV4TnVtID0gSW50ZWdlci50b0hleFN0cmluZyhjaFN1cnJvZ2F0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJCdWYuYXBwZW5kKCJcXFUiKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHplcm9zID0gIjAwMDAiOworICAgICAgICAgICAgICAgICAgICAgICAgaGV4TnVtID0gSW50ZWdlci50b0hleFN0cmluZyhjaCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJCdWYuYXBwZW5kKCJcXHUiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzdHJCdWYuYXBwZW5kKHplcm9zLnN1YnN0cmluZyhoZXhOdW0ubGVuZ3RoKCkpICsgaGV4TnVtLnRvVXBwZXJDYXNlKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHF1b3RlUmVxdWlyZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBzdHJCdWYuYXBwZW5kKGNoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdcIicpIHsKKyAgICAgICAgICAgICAgICBxdW90ZVJlcXVpcmVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBzdHJCdWYuYXBwZW5kKCJcXFwiIik7CisgICAgICAgICAgICB9IGVsc2UgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJ3snIHx8IGNoID09ICd9JykgeworICAgICAgICAgICAgICAgICAgICBxdW90ZVJlcXVpcmVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RyQnVmLmFwcGVuZChjaCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHF1b3RlUmVxdWlyZWQpIHsKKyAgICAgICAgICAgIHN0ckJ1Zi5pbnNlcnQoMCwgJ1wiJyk7CisgICAgICAgICAgICBzdHJCdWYuYXBwZW5kKCdcIicpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdHJCdWYudG9TdHJpbmcoKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL1JCSW1wb3J0ZXIuamF2YSBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9SQkltcG9ydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI0YTViOQotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9SQkltcG9ydGVyLmphdmEKQEAgLTAsMCArMSw0NTIgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoQykgMjAwMC0yMDA3LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCAgKgorICogb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworcGFja2FnZSBjb20uaWJtLnJibTsKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZheC5zd2luZy4qOworCitpbXBvcnQgY29tLmlibS5yYm0uZ3VpLlJCTWFuYWdlckdVSTsKKworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEuYXd0Lio7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuKjsKKworLyoqCisgKiA8UD5UaGlzIGlzIHRoZSBzdXBlciBjbGFzcyBmb3IgYWxsIGltcG9ydGVyIHBsdWctaW4gY2xhc3Nlcy48L1A+CisgKiA8UD4KKyAqIEluIHRlcm1zIG9mIGdlbmVyYWwgZnVuY3Rpb25hbGl0eSBvZiB0aGlzIGNsYXNzIG9yIGl0cyBjaGlsZHJlbiBjbGFzc2VzLCB0aGUgZm9sbG93aW5nIHN0ZXBzIHNob3VsZCBoYXBwZW4gaW4gb3JkZXI6CisgKiA8T0w+CisgKiA8TEk+QSBEaWFsb2cgaXMgc2hvd24gZnJvbSB3aGljaCB0aGUgdXNlciBtYXkgc2VsZWN0IG9wdGlvbnMgYWJvdXQgdGhlIGltcG9ydCwgaW5jbHVkaW5nIHRoZSBmaWxlIGZyb20gd2hpY2ggdG8gaW1wb3J0LjwvTEk+CisgKiA8TEk+VGhlICdJbXBvcnQnIGJ1dHRvbiBpcyBwcmVzc2VkLCBjbG9zaW5nIHRoZSBvcHRpb25zIGRpYWxvZyBhbmQgb3BlbmluZyBhIHByb2dyZXNzIGJhciBkaWFsb2cgYm94LjwvTEk+CisgKiA8TEk+VGhlIGNsYXNzIHNob3VsZCByZXNvbHZlIGFsbCBjb25mbGljdHMgd2l0aCBsb2NhbGUgZW5jb2RpbmdzIGV4aXN0aW5nIGluIHRoZSBpbXBvcnQgZmlsZXMsIGJ1dCBub3QgaW4gdGhlIGFjdGl2ZSByZXNvdXJjZSBidW5kbGUuPC9MST4KKyAqIDxMST5UaGUgY2xhc3Mgc2hvdWxkIHBhcnNlIHJlc291cmNlcyBvbmUgYXQgYSB0aW1lIGFuZCB1c2UgdGhlIGltcG9ydFJlc291cmNlKCkgbWV0aG9kIHRvIGluc2VydCB0aGVtIGludG8gdGhlIHJlc291cmNlIGJ1bmRsZS48L0xJPgorICogPExJPlRoZSBjbGFzcyBzaG91bGQgcmVwb3J0IHdoZW4gYWxsIHJlc291cmNlcyBoYXZlIGJlZW4gcmVhZCBhbmQgdGhlIGltcG9ydCBpcyBjb21wbGV0ZS48L0xJPgorICogPC9PTD4KKyAqIDwvUD4KKyAqIAorICogQGF1dGhvciBKYXJlZCBKYWNrc29uCisgKiBAc2VlIGNvbS5pYm0ucmJtLlJCTWFuYWdlcgorICovCitwdWJsaWMgY2xhc3MgUkJJbXBvcnRlciBleHRlbmRzIEpEaWFsb2cgeworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBGSUxFX09QVElPTl9QT1BVTEFURSAgICAgID0gMDsgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgbG9jYWxlIGZpbGUgcG9wdWxhdGVkIGZyb20gYmFzZSBmaWxlCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IEZJTEVfT1BUSU9OX0VNUFRZICAgICAgICAgPSAxOyAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBlbXB0eSBsb2NhbGUgZmlsZQorICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBGSUxFX09QVElPTl9JR05PUkUgICAgICAgID0gMjsgICAgICAgICAgICAvLyBJZ25vcmUgYWxsIHJlc291cmNlcyBmcm9tIHRoaXMgZW5jb2RpbmcKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgRklMRV9PUFRJT05fUFJPTVBUICAgICAgICA9IDM7ICAgICAgICAgICAgLy8gUHJvbXB0IGZvciBlYWNoIGNvbmZsaWN0CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFJFU09VUkNFX09QVElPTl9PVkVSV1JJVEUgPSAwOyAgICAgICAgICAgIC8vIFVzZSB0aGUgdmFsdWUgZnJvbSB0aGUgc291cmNlIGltcG9ydCBmaWxlCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFJFU09VUkNFX09QVElPTl9JR05PUkUgICAgPSAxOyAgICAgICAgICAgIC8vIElnbm9yZSB0aGUgaW1wb3J0IGFuZCB1c2UgZXhpc3RpbmcgdmFsdWUKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgUkVTT1VSQ0VfT1BUSU9OX1BST01QVCAgICA9IDI7ICAgICAgICAgICAgLy8gUHJvcG1wdCBmb3IgZWFjaCBjb25mbGljdAorCQorICAgIHByb3RlY3RlZCBzdGF0aWMgSkZpbGVDaG9vc2VyIGNob29zZXI7CisgICAgcHJvdGVjdGVkIGludCAgICBudW1fY29uZmxpY3RzOworICAgIHByb3RlY3RlZCBpbnQgICAgbnVtX2V4dHJhX2ZpbGVzOworICAgIHByb3RlY3RlZCBTdHJpbmcgdGl0bGU7CisgICAgcHJvdGVjdGVkIFJCTWFuYWdlciByYm07CisgICAgcHJvdGVjdGVkIFJCTWFuYWdlckdVSSBndWk7CisgICAgcHJvdGVjdGVkIGJvb2xlYW4gcGF0aFNldCA9IGZhbHNlOworCQorICAgIC8vIFZpc3VhbCBDb21wb25lbnRzCisgICAgSlJhZGlvQnV0dG9uIHJlc291cmNlT3ZlcndyaXRlUmFkaW8gICAgPSBuZXcgSlJhZGlvQnV0dG9uKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiaW1wb3J0X3Jlc291cmNlX2NvbmZsaWN0X292ZXJ3cml0ZSIpLCBmYWxzZSk7CisgICAgSlJhZGlvQnV0dG9uIHJlc291cmNlSWdub3JlUmFkaW8gICAgICAgPSBuZXcgSlJhZGlvQnV0dG9uKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiaW1wb3J0X3Jlc291cmNlX2NvbmZsaWN0X2lnbm9yZSIpLCBmYWxzZSk7CisgICAgSlJhZGlvQnV0dG9uIHJlc291cmNlUHJvbXB0UmFkaW8gICAgICAgPSBuZXcgSlJhZGlvQnV0dG9uKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiaW1wb3J0X2NvbmZsaWN0X3Byb21wdCIpLCB0cnVlKTsKKyAgICBKUmFkaW9CdXR0b24gZmlsZUdlbmVyYXRlUG9wdWxhdGVSYWRpbyA9IG5ldyBKUmFkaW9CdXR0b24oUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJpbXBvcnRfZmlsZV9jb25mbGljdF9nZW5lcmF0ZV9wb3B1bGF0ZSIpLCBmYWxzZSk7CisgICAgSlJhZGlvQnV0dG9uIGZpbGVHZW5lcmF0ZUVtcHR5UmFkaW8gICAgPSBuZXcgSlJhZGlvQnV0dG9uKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiaW1wb3J0X2ZpbGVfY29uZmxpY3RfZ2VuZXJhdGVfZW1wdHkiKSwgZmFsc2UpOworICAgIEpSYWRpb0J1dHRvbiBmaWxlSWdub3JlUmFkaW8gICAgICAgICAgID0gbmV3IEpSYWRpb0J1dHRvbihSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImltcG9ydF9maWxlX2NvbmZsaWN0X2lnbm9yZSIpLCBmYWxzZSk7CisgICAgSlJhZGlvQnV0dG9uIGZpbGVQcm9tcHRSYWRpbyAgICAgICAgICAgPSBuZXcgSlJhZGlvQnV0dG9uKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiaW1wb3J0X2NvbmZsaWN0X3Byb21wdCIpLCB0cnVlKTsKKwkKKyAgICBKQ2hlY2tCb3ggbWFya1RyYW5zbGF0ZWRDaGVjayA9IG5ldyBKQ2hlY2tCb3goUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJpbXBvcnRfZGVmYXVsdF90cmFuc2xhdGVkIiksIHRydWUpOworICAgIEpDaGVja0JveCBjcmVhdGVHcm91cHNDaGVjayA9IG5ldyBKQ2hlY2tCb3goUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJpbXBvcnRfZGVmYXVsdF9ncm91cF9jcmVhdGlvbiIpLCB0cnVlKTsKKyAgICBKQ29tYm9Cb3ggZ3JvdXBDb21ib0JveCA9IG5ldyBKQ29tYm9Cb3goKTsKKwkKKyAgICBKTGFiZWwgc291cmNlTGFiZWw7CisJCisgICAgSkRpYWxvZyBwcm9ncmVzc0JhckRpYWxvZzsKKyAgICBKUHJvZ3Jlc3NCYXIgcHJvZ3Jlc3NCYXI7CisgICAgCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IKKyAgICAgKiBAcGFyYW0gdGl0bGUgVGhlIHRpdGxlIHRoYXQgYXBwZWFycyBpbiB0aGUgRGlhbG9nIGJveAorICAgICAqIEBwYXJhbSByYm0gQW4gUkJNYW5hZ2VyIGluc3RhbmNlCisgICAgICogQHBhcmFtIGd1aSBUaGUgUkJNYW5hZ2VyIEdVSSBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggdGhlIFJCTWFuYWdlciBpbnN0YW5jZQorICAgICAqLworICAgIAorICAgIHB1YmxpYyBSQkltcG9ydGVyKFN0cmluZyB0aXRsZSwgUkJNYW5hZ2VyIHJibSwgUkJNYW5hZ2VyR1VJIGd1aSkgeworICAgICAgICBzdXBlcihuZXcgRnJhbWUoKSwgdGl0bGUsIHRydWUpOworICAgICAgICB0aGlzLnRpdGxlID0gdGl0bGU7CisgICAgICAgIHRoaXMucmJtID0gcmJtOworICAgICAgICB0aGlzLmd1aSA9IGd1aTsKKyAgICAgICAgaW5pdCgpOworICAgIH0KKwkKKyAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KCkgeworICAgICAgICBjaG9vc2VyID0gbmV3IEpGaWxlQ2hvb3NlcigpOworICAgICAgICBzZXR1cEZpbGVDaG9vc2VyKCk7CisgICAgICAgIG51bV9jb25mbGljdHMgPSAwOworICAgICAgICBudW1fZXh0cmFfZmlsZXMgPSAwOworICAgICAgICBpbml0Q29tcG9uZW50cygpOworICAgICAgICBzZXRWaXNpYmxlKHRydWUpOworICAgIH0KKwkKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXR1cEZpbGVDaG9vc2VyKCkgeworICAgICAgICAvLyBUbyBiZSBvdmVyd3JpdHRlbgorICAgIH0KKwkKKyAgICBwcm90ZWN0ZWQgdm9pZCBiZWdpbkltcG9ydCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIFRvIGJlIG92ZXJ3cml0dGVuCisgICAgICAgIGlmICghcGF0aFNldCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiUGF0aCBub3Qgc2V0IHlldCIpOworICAgIH0KKwkKKyAgICBwcm90ZWN0ZWQgdm9pZCBjaG9vc2VGaWxlKCkgeworICAgICAgICBpbnQgcmVzdWx0ID0gY2hvb3Nlci5zaG93T3BlbkRpYWxvZyh0aGlzKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBKRmlsZUNob29zZXIuQVBQUk9WRV9PUFRJT04pIHsKKyAgICAgICAgICAgIEZpbGUgZiA9IGNob29zZXIuZ2V0U2VsZWN0ZWRGaWxlKCk7CisgICAgICAgICAgICBzb3VyY2VMYWJlbC5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiaW1wb3J0X3NvdXJjZV9maWxlIixmLmdldEFic29sdXRlUGF0aCgpKSk7CisgICAgICAgICAgICBwYXRoU2V0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKwkKKyAgICBwcm90ZWN0ZWQgRmlsZSBnZXRDaG9zZW5GaWxlKCkgeworICAgICAgICByZXR1cm4gY2hvb3Nlci5nZXRTZWxlY3RlZEZpbGUoKTsKKyAgICB9CisJCisgICAgLyoqCisgICAgICogQSBzdXBlciBjbGFzcyBtZXRob2QgaW50ZW5kZWQgZm9yIHVzZSBvZiBuZWFybHkgYWxsIHN1YmNsYXNzIGltcG9ydGVycywgb25jZSBhIHJlc291cmNlCisgICAgICogaXMgZm91bmQgYnkgdGhvc2Ugc3ViY2xhc3Nlcy4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGluIG9yZGVyIHRvIGNyZWF0ZSB0aGUgbmV3IHJlc291cmNlCisgICAgICogYW5kIGhhbmRsZSB0aGUgdmFyaW91cyBjb25mbGljdCBlcnJvcnMgdGhhdCBtYXkgcmVzdWx0IGFzIGEgcGFydCBvZiB0aGF0IGltcG9ydC4KKyAgICAgKi8KKwkKKyAgICBwcm90ZWN0ZWQgdm9pZCBpbXBvcnRSZXNvdXJjZShCdW5kbGVJdGVtIGl0ZW0sIFN0cmluZyBlbmNvZGluZywgU3RyaW5nIGdyb3VwX25hbWUpIHsKKyAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IG51bGw7CisgICAgICAgIEJ1bmRsZUdyb3VwIGdyb3VwID0gbnVsbDsKKyAgICAgICAgQnVuZGxlR3JvdXAgYmFja3VwX2dyb3VwID0gbnVsbDsKKwkJCisgICAgICAgIGlmIChncm91cF9uYW1lID09IG51bGwpCisgICAgICAgIAlncm91cF9uYW1lID0gZ2V0RGVmYXVsdEdyb3VwKCk7CisgICAgICAgIGlmIChlbmNvZGluZyA9PSBudWxsKQorICAgICAgICAJcmV0dXJuOworICAgICAgICAvLyBHZXQgdGhlIGJ1bmRsZSB0byB3aGljaCB3ZSB3aWxsIGJlIGFkZGluZyB0aGlzIHJlc291cmNlCisgICAgICAgIGJ1bmRsZSA9IHJibS5nZXRCdW5kbGUoZW5jb2RpbmcpOworICAgICAgICAvLyBTa2lwIHRoaXMgaW1wb3J0IGlmIHRoZSBidW5kbGUgaXMgbm9uLWV4aXN0ZW50IChTaG91bGQgaGF2ZSBiZWVuIHJlc29sdmVkIGlmIHdhbnRlZCkKKyAgICAgICAgaWYgKGJ1bmRsZSA9PSBudWxsKQorICAgICAgICAJcmV0dXJuOworICAgICAgICAvLyBGaW5kIHRoZSBncm91cCBpbiB0aGUgYnVuZGxlLCBVbmdyb3VwZWQgaWYgbm9uLWV4aXN0ZW50CisgICAgICAgIFZlY3RvciBndiA9IGJ1bmRsZS5nZXRHcm91cHNBc1ZlY3RvcigpOworICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBndi5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgQnVuZGxlR3JvdXAgdGVtcGcgPSAoQnVuZGxlR3JvdXApZ3YuZWxlbWVudEF0KGkpOworICAgICAgICAgICAgaWYgKGk9PTApIGJhY2t1cF9ncm91cCA9IHRlbXBnOworICAgICAgICAgICAgaWYgKHRlbXBnLmdldE5hbWUoKS5lcXVhbHMoIlVuZ3JvdXBlZCBJdGVtcyIpKSBiYWNrdXBfZ3JvdXAgPSB0ZW1wZzsKKyAgICAgICAgICAgIGVsc2UgaWYgKHRlbXBnLmdldE5hbWUoKS5lcXVhbHMoZ3JvdXBfbmFtZSkpIHsKKyAgICAgICAgICAgICAgICBncm91cCA9IHRlbXBnOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChncm91cCA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAoZ2V0RGVmYXVsdEdyb3VwQ3JlYXRpb24oKSkgeworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBncm91cCBieSB0aGlzIG5hbWUKKyAgICAgICAgICAgICAgICBidW5kbGUuYWRkQnVuZGxlR3JvdXAoZ3JvdXBfbmFtZSwgIiIpOworICAgICAgICAgICAgICAgIGd2ID0gYnVuZGxlLmdldEdyb3Vwc0FzVmVjdG9yKCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgZ3Yuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgQnVuZGxlR3JvdXAgdGVtcGcgPSAoQnVuZGxlR3JvdXApZ3YuZWxlbWVudEF0KGkpOworICAgICAgICAgICAgICAgICAgICBpZiAodGVtcGcuZ2V0TmFtZSgpLmVxdWFscyhncm91cF9uYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSB0ZW1wZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIGJhY2t1cF9ncm91cAorICAgICAgICAgICAgICAgIGdyb3VwID0gYmFja3VwX2dyb3VwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIElmIGFsbCBncm91cCBpZGVudGlmaWNhdGlvbiBlZmZvcnRzIGZhaWwsIHdlIGZhaWwKKyAgICAgICAgaWYgKGdyb3VwID09IG51bGwpCisgICAgICAgIAlyZXR1cm47CisgICAgICAgIGl0ZW0uc2V0UGFyZW50R3JvdXAoZ3JvdXApOworICAgICAgICAvLyBDaGVjayBmb3IgYW5kIHJlc29sdmUgY29uZmxpY3RzCisgICAgICAgIGlmIChidW5kbGUuYWxsSXRlbXMuY29udGFpbnNLZXkoaXRlbS5nZXRLZXkoKSkpIHsKKyAgICAgICAgICAgIHJlc29sdmVSZXNvdXJjZShidW5kbGUsaXRlbSk7IAorICAgICAgICAgICAgUkJNYW5hZ2VyR1VJLmRlYnVnTXNnKCJSZXNvbHZlIGNvbmZsaWN0Iik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBJbnNlcnQgdGhlIHJlc291cmNlCisgICAgICAgICAgICBidW5kbGUuYWRkQnVuZGxlSXRlbShpdGVtKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIHdoZW4gdHJ5aW5nIHRvIGltcG9ydCBhbmQgaXRlbSB3aG9zZSBrZXkgYWxsIHJlYWR5IGV4aXN0cyB3aXRoaW4gdGhlIGJ1bmRsZS4KKyAgICAgKi8KKwkKKyAgICBwcm90ZWN0ZWQgdm9pZCByZXNvbHZlUmVzb3VyY2UoQnVuZGxlIGJ1bmRsZSwgQnVuZGxlSXRlbSBpdGVtKSB7CisgICAgICAgIGlmICh0aGlzLmdldFJlc291cmNlQ29uZmxpY3RPcHRpb24oKSA9PSBSRVNPVVJDRV9PUFRJT05fSUdOT1JFKQorICAgICAgICAJcmV0dXJuOworICAgICAgICBlbHNlIGlmICh0aGlzLmdldFJlc291cmNlQ29uZmxpY3RPcHRpb24oKSA9PSBSRVNPVVJDRV9PUFRJT05fT1ZFUldSSVRFKSB7CisgICAgICAgICAgICBidW5kbGUucmVtb3ZlSXRlbShpdGVtLmdldEtleSgpKTsKKyAgICAgICAgICAgIGJ1bmRsZS5hZGRCdW5kbGVJdGVtKGl0ZW0pOworICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZ2V0UmVzb3VyY2VDb25mbGljdE9wdGlvbigpID09IFJFU09VUkNFX09QVElPTl9QUk9NUFQpIHsKKyAgICAgICAgICAgIEJ1bmRsZUl0ZW0gb3JpZ2luYWwgPSAoQnVuZGxlSXRlbSlidW5kbGUuYWxsSXRlbXMuZ2V0KGl0ZW0uZ2V0S2V5KCkpOworICAgICAgICAgICAgaWYgKG9yaWdpbmFsID09IG51bGwpCisgICAgICAgICAgICAJcmV0dXJuOworICAgICAgICAgICAgU3RyaW5nIHRyYW5zID0gb3JpZ2luYWwuZ2V0VHJhbnNsYXRpb24oKTsKKyAgICAgICAgICAgIFN0cmluZyBvcHRpb25zW10gPSB7IFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiaW1wb3J0X3Jlc291cmNlX2NvbmZsaWN0X292ZXJ3cml0ZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJpbXBvcnRfcmVzb3VyY2VfY29uZmxpY3RfaWdub3JlIil9OworICAgICAgICAgICAgU3RyaW5nIGluc2VydFtdID0ge2l0ZW0uZ2V0S2V5KCksIChidW5kbGUuZW5jb2RpbmcuZXF1YWxzKCIiKSA/ICIoQmFzZSBDbGFzcykiIDogYnVuZGxlLmVuY29kaW5nKX07CisgICAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gKFN0cmluZylKT3B0aW9uUGFuZS5zaG93SW5wdXREaWFsb2codGhpcywgIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiaW1wb3J0X3Jlc291cmNlX2NvbmZsaWN0X2Nob29zZSIsIGluc2VydCkgKyAKKyAgICAgICAgICAgICAgICAiXG4iICsgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJpbXBvcnRfcmVzb3VyY2VfY29uZmxpY3RfY2hvb3NlX3NvdXJjZSIsIGl0ZW0uZ2V0VHJhbnNsYXRpb24oKSkgKworICAgICAgICAgICAgICAgICJcbiIgKyBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImltcG9ydF9yZXNvdXJjZV9jb25mbGljdF9jaG9vc2VfdGFyZ2V0IiwgdHJhbnMpLAorICAgICAgICAgICAgICAgIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiaW1wb3J0X2ZpbGVfY29uZmxpY3RzIiksIEpPcHRpb25QYW5lLlFVRVNUSU9OX01FU1NBR0UsCisgICAgICAgICAgICAgICAgbnVsbCwgb3B0aW9ucywgb3B0aW9uc1swXSk7CisgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCisgICAgICAgICAgICAJcmV0dXJuOworICAgICAgICAgICAgaWYgKHJlc3VsdC5lcXVhbHMoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJpbXBvcnRfcmVzb3VyY2VfY29uZmxpY3Rfb3ZlcndyaXRlIikpKSB7CisgICAgICAgICAgICAgICAgYnVuZGxlLnJlbW92ZUl0ZW0oaXRlbS5nZXRLZXkoKSk7CisgICAgICAgICAgICAgICAgYnVuZGxlLmFkZEJ1bmRsZUl0ZW0oaXRlbSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC5lcXVhbHMoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJpbXBvcnRfcmVzb3VyY2VfY29uZmxpY3RfaWdub3JlIikpKQorICAgICAgICAgICAgCXJldHVybjsKKyAgICAgICAgfQorICAgIH0KKwkKKyAgICAvKioKKyAgICAgKiBHaXZlbiBhIHZlY3RvciBvZiBzdHJpbmdzIGNvbnRhaW5pbmcgbG9jYWxlIGVuY29kaW5ncyAoZS5nLiB7ImVuIiwgImVuX3VzIiwgImRlIn0pLCBhdHRlbXB0cworICAgICAqIHRvIHJlc29sdmUgdGhvc2UgY29uZmxpY3RzIGFjY29yZGluZyB0byB0aGUgcHJlZmVyZW5jZXMgc2VsZWN0ZWQgYnkgdGhlIHVzZXIuCisgICAgICovCisJCisgICAgcHJvdGVjdGVkIHZvaWQgcmVzb2x2ZUVuY29kaW5ncyhWZWN0b3IgdikgeworICAgICAgICBmb3IgKGludCBpPTA7IGkgPCB2LnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcgZW5jb2RpbmcgPSAoU3RyaW5nKXYuZWxlbWVudEF0KGkpOworICAgICAgICAgICAgaWYgKGVuY29kaW5nID09IG51bGwgfHwgZW5jb2RpbmcuZXF1YWxzKCIiKSB8fCByYm0uaGFzUmVzb3VyY2UoZW5jb2RpbmcpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gcmVzb2x2ZSB0aGlzIGNvbmZsaWN0CisgICAgICAgICAgICBpZiAodGhpcy5nZXRGaWxlQ29uZmxpY3RPcHRpb24oKSA9PSBGSUxFX09QVElPTl9JR05PUkUpIGNvbnRpbnVlOworICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5nZXRGaWxlQ29uZmxpY3RPcHRpb24oKSA9PSBGSUxFX09QVElPTl9QT1BVTEFURSkgeworICAgICAgICAgICAgICAgIHJibS5jcmVhdGVSZXNvdXJjZShudWxsLCBudWxsLCBudWxsLCBlbmNvZGluZywgbnVsbCwgbnVsbCwgbnVsbCwgdHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZ2V0RmlsZUNvbmZsaWN0T3B0aW9uKCkgPT0gRklMRV9PUFRJT05fRU1QVFkpIHsKKyAgICAgICAgICAgICAgICByYm0uY3JlYXRlUmVzb3VyY2UobnVsbCwgbnVsbCwgbnVsbCwgZW5jb2RpbmcsIG51bGwsIG51bGwsIG51bGwsIHRydWUpOworICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmdldEZpbGVDb25mbGljdE9wdGlvbigpID09IEZJTEVfT1BUSU9OX1BST01QVCkgeworICAgICAgICAgICAgICAgIFN0cmluZyBvcHRpb25zW10gPSB7IFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiaW1wb3J0X2ZpbGVfY29uZmxpY3RfZ2VuZXJhdGVfcG9wdWxhdGUiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImltcG9ydF9maWxlX2NvbmZsaWN0X2dlbmVyYXRlX2VtcHR5IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJpbXBvcnRfZmlsZV9jb25mbGljdF9pZ25vcmUiKX07CisJCQkJCisgICAgICAgICAgICAgICAgU3RyaW5nIHJlc3VsdCA9IChTdHJpbmcpSk9wdGlvblBhbmUuc2hvd0lucHV0RGlhbG9nKHRoaXMsIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiaW1wb3J0X2ZpbGVfY29uZmxpY3RfY2hvb3NlIiwgZW5jb2RpbmcpLAorICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImltcG9ydF9maWxlX2NvbmZsaWN0cyIpLCBKT3B0aW9uUGFuZS5RVUVTVElPTl9NRVNTQUdFLAorICAgICAgICAgICAgICAgICAgICBudWxsLCBvcHRpb25zLCBvcHRpb25zWzBdKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuZXF1YWxzKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiaW1wb3J0X2ZpbGVfY29uZmxpY3RfaWdub3JlIikpKSBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQuZXF1YWxzKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiaW1wb3J0X2ZpbGVfY29uZmxpY3RfZ2VuZXJhdGVfcG9wdWxhdGUiKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmJtLmNyZWF0ZVJlc291cmNlKG51bGwsIG51bGwsIG51bGwsIGVuY29kaW5nLCBudWxsLCBudWxsLCBudWxsLCB0cnVlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC5lcXVhbHMoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJpbXBvcnRfZmlsZV9jb25mbGljdF9nZW5lcmF0ZV9lbXB0eSIpKSkgeworICAgICAgICAgICAgICAgICAgICByYm0uY3JlYXRlUmVzb3VyY2UobnVsbCwgbnVsbCwgbnVsbCwgZW5jb2RpbmcsIG51bGwsIG51bGwsIG51bGwsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZ3VpLnVwZGF0ZURpc3BsYXlUcmVlKCk7CisgICAgfQorCQorICAgIC8vIFJldHVybnMgYW4gaW50ZWdlciBtYXNrIGRlc2NyaWJpbmcgdGhlIHVzZXIncyBzZWxlY3Rpb24gZm9yIGZpbGUgcmVzb2x2aW5nIG1pc3NpbmcgZmlsZSBsb2NhbGUgY29uZmxpY3RzCisJCisgICAgcHJpdmF0ZSBpbnQgZ2V0RmlsZUNvbmZsaWN0T3B0aW9uKCkgeworICAgICAgICBpZiAoZmlsZUdlbmVyYXRlUG9wdWxhdGVSYWRpby5pc1NlbGVjdGVkKCkpIHJldHVybiBGSUxFX09QVElPTl9QT1BVTEFURTsKKyAgICAgICAgaWYgKGZpbGVHZW5lcmF0ZUVtcHR5UmFkaW8uaXNTZWxlY3RlZCgpKSByZXR1cm4gRklMRV9PUFRJT05fRU1QVFk7CisgICAgICAgIGlmIChmaWxlSWdub3JlUmFkaW8uaXNTZWxlY3RlZCgpKSByZXR1cm4gRklMRV9PUFRJT05fSUdOT1JFOworICAgICAgICBpZiAoZmlsZVByb21wdFJhZGlvLmlzU2VsZWN0ZWQoKSkgcmV0dXJuIEZJTEVfT1BUSU9OX1BST01QVDsKKyAgICAgICAgcmV0dXJuIEZJTEVfT1BUSU9OX1BST01QVDsKKyAgICB9CisJCisgICAgLy8gUmV0dXJucyBhbiBpbnRlZ2VyIG1hc2sgZGVzY3JpYmluZyB0aGUgdXNlcidzIHNlbGVjdGlvbiBmb3IgZHVwbGljYXRlIHJlc291cmNlIGtleSBjb25mbGljdHMKKwkKKyAgICBwcml2YXRlIGludCBnZXRSZXNvdXJjZUNvbmZsaWN0T3B0aW9uKCkgeworICAgICAgICBpZiAocmVzb3VyY2VPdmVyd3JpdGVSYWRpby5pc1NlbGVjdGVkKCkpIHJldHVybiBSRVNPVVJDRV9PUFRJT05fT1ZFUldSSVRFOworICAgICAgICBpZiAocmVzb3VyY2VJZ25vcmVSYWRpby5pc1NlbGVjdGVkKCkpIHJldHVybiBSRVNPVVJDRV9PUFRJT05fSUdOT1JFOworICAgICAgICBpZiAocmVzb3VyY2VQcm9tcHRSYWRpby5pc1NlbGVjdGVkKCkpIHJldHVybiBSRVNPVVJDRV9PUFRJT05fUFJPTVBUOworICAgICAgICByZXR1cm4gUkVTT1VSQ0VfT1BUSU9OX1BST01QVDsKKyAgICB9CisJCisgICAgLy8gUmV0dXJucyB0aGUgZ3JvdXAgbmFtZSBmb3IgdXNlIHdoZW4gbm8gZ3JvdXAgbmFtZSBpcyBzcGVjaWZpZWQKKwkKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRHcm91cCgpIHsKKyAgICAgICAgcmV0dXJuIGdyb3VwQ29tYm9Cb3guZ2V0U2VsZWN0ZWRJdGVtKCkudG9TdHJpbmcoKTsKKyAgICB9CisJCisgICAgLy8gUmV0dXJucyB0aGUgZGVmYXVsdCB0cmFuc2xhdGlvbiB2YWx1ZQorCQorICAgIHByb3RlY3RlZCBib29sZWFuIGdldERlZmF1bHRUcmFuc2xhdGVkKCkgeworICAgICAgICByZXR1cm4gbWFya1RyYW5zbGF0ZWRDaGVjay5pc1NlbGVjdGVkKCk7CisgICAgfQorCQorICAgIC8vIFJldHVybnMgd2hldGhlciBvciBub3QgYSBncm91cCBvZiBuYW1lIG5vbi1leGlzdGFudCBpbiB0aGUgYWN0aXZlIGJ1bmRsZSBpcyBjcmVhdGVkCisJCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZ2V0RGVmYXVsdEdyb3VwQ3JlYXRpb24oKSB7CisgICAgICAgIHJldHVybiBjcmVhdGVHcm91cHNDaGVjay5pc1NlbGVjdGVkKCk7CisgICAgfQorCQorICAgIHByb3RlY3RlZCB2b2lkIHNob3dQcm9ncmVzc0JhcihpbnQgc3RlcHMpIHsKKyAgICAgICAgdGhpc1dpbmRvd0Nsb3NpbmcoKTsKKyAgICAgICAgSkRpYWxvZyBwcm9ncmVzc0JhckRpYWxvZyA9IG5ldyBKRGlhbG9nKHRoaXMsIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX3RpdGxlX2ltcG9ydF9wcm9ncmVzcyIpLCBmYWxzZSk7CisgICAgICAgIEpQcm9ncmVzc0JhciBwcm9ncmVzc0JhciA9IG5ldyBKUHJvZ3Jlc3NCYXIoMCwgc3RlcHMpOworICAgICAgICBwcm9ncmVzc0Jhci5zZXRWYWx1ZSgwKTsKKyAgICAgICAgcHJvZ3Jlc3NCYXJEaWFsb2cuZ2V0Q29udGVudFBhbmUoKS5hZGQocHJvZ3Jlc3NCYXIpOworICAgICAgICBwcm9ncmVzc0JhckRpYWxvZy5wYWNrKCk7CisgICAgICAgIHByb2dyZXNzQmFyRGlhbG9nLnNldFZpc2libGUodHJ1ZSk7CisgICAgfQorCQorICAgIHByb3RlY3RlZCB2b2lkIGluY3JlbWVudFByb2dyZXNzQmFyKCkgeworICAgICAgICBpZiAocHJvZ3Jlc3NCYXIgPT0gbnVsbCkgcmV0dXJuOworICAgICAgICBwcm9ncmVzc0Jhci5zZXRWYWx1ZShwcm9ncmVzc0Jhci5nZXRWYWx1ZSgpKzEpOworICAgICAgICBpZiAocHJvZ3Jlc3NCYXIuZ2V0VmFsdWUoKSA9PSBwcm9ncmVzc0Jhci5nZXRNYXhpbXVtKCkpIGhpZGVQcm9ncmVzc0JhcigpOworICAgIH0KKwkKKyAgICBwcm90ZWN0ZWQgdm9pZCBoaWRlUHJvZ3Jlc3NCYXIoKSB7CisgICAgICAgIGlmIChwcm9ncmVzc0JhckRpYWxvZyAhPSBudWxsKSBwcm9ncmVzc0JhckRpYWxvZy5zZXRWaXNpYmxlKGZhbHNlKTsKKyAgICB9CisJCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSB0aGUgdmlzdWFsIGNvbXBvbmVudHMgZm9yIHNlbGVjdGluZyBhbiBpbXBvcnQgZmlsZSBhbmQgc2V0dGluZyB0aGUgYXBwcm9wcmlhdGUKKyAgICAgKiBvcHRpb25zCisgICAgICovCisJCisgICAgcHJvdGVjdGVkIHZvaWQgaW5pdENvbXBvbmVudHMoKSB7CisgICAgICAgIC8vIENyZWF0ZSBDb21wb25lbnRzCisgICAgICAgIEpMYWJlbCB0aXRsZUxhYmVsICAgICAgID0gbmV3IEpMYWJlbCh0aXRsZSk7CisgICAgICAgIHNvdXJjZUxhYmVsICAgICAgICAgICAgID0gbmV3IEpMYWJlbChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImltcG9ydF9zb3VyY2VfZmlsZSIsIi0tIikpOworICAgICAgICBKTGFiZWwgaW5zZXJ0R3JvdXBMYWJlbCA9IG5ldyBKTGFiZWwoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJpbXBvcnRfaW5zZXJ0X2dyb3VwIikpOworICAgICAgICAKKyAgICAgICAgSkJ1dHRvbiBmaWxlQ2hvb3NlQnV0dG9uID0gbmV3IEpCdXR0b24oUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJidXR0b25fY2hvb3NlIikpOworICAgICAgICBKQnV0dG9uIGNhbmNlbEJ1dHRvbiAgICAgPSBuZXcgSkJ1dHRvbihSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImJ1dHRvbl9jYW5jZWwiKSk7CisgICAgICAgIEpCdXR0b24gaW1wb3J0QnV0dG9uICAgICA9IG5ldyBKQnV0dG9uKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiYnV0dG9uX2ltcG9ydCIpKTsKKyAgICAgICAgCisgICAgICAgIEJ1dHRvbkdyb3VwIHJlc291cmNlR3JvdXAgPSBuZXcgQnV0dG9uR3JvdXAoKTsKKyAgICAgICAgQnV0dG9uR3JvdXAgZmlsZUdyb3VwID0gbmV3IEJ1dHRvbkdyb3VwKCk7CisJCQorICAgICAgICBKUGFuZWwgdG9wUGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBCb3JkZXJMYXlvdXQoKSk7CisgICAgICAgIEpQYW5lbCBtaWRQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEJvcmRlckxheW91dCgpKTsKKyAgICAgICAgSlBhbmVsIGJvdFBhbmVsID0gbmV3IEpQYW5lbChuZXcgRmxvd0xheW91dChGbG93TGF5b3V0LlJJR0hUKSk7CisgICAgICAgIAorICAgICAgICBKUGFuZWwgdG9wSW5uZXJQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEJvcmRlckxheW91dCgpKTsKKyAgICAgICAgCisgICAgICAgIEJveCBtaWRCb3ggPSBuZXcgQm94KEJveExheW91dC5ZX0FYSVMpOworCQkKKyAgICAgICAgSlBhbmVsIHJlc291cmNlUGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBGbG93TGF5b3V0KEZsb3dMYXlvdXQuTEVGVCkpOworICAgICAgICBKUGFuZWwgZmlsZVBhbmVsICAgICA9IG5ldyBKUGFuZWwobmV3IEZsb3dMYXlvdXQoRmxvd0xheW91dC5MRUZUKSk7CisgICAgICAgIEpQYW5lbCBkZWZhdWx0UGFuZWwgID0gbmV3IEpQYW5lbChuZXcgRmxvd0xheW91dChGbG93TGF5b3V0LkxFRlQpKTsKKyAgICAgICAgSlBhbmVsIGRlZmF1bHRQYW5lbDIgPSBuZXcgSlBhbmVsKG5ldyBCb3JkZXJMYXlvdXQoKSk7CisgICAgICAgIAorICAgICAgICBCb3ggcmVzb3VyY2VCb3ggPSBuZXcgQm94KEJveExheW91dC5ZX0FYSVMpOworICAgICAgICBCb3ggZmlsZUJveCAgICAgPSBuZXcgQm94KEJveExheW91dC5ZX0FYSVMpOworICAgICAgICBCb3ggZ3JvdXBCb3ggICAgPSBuZXcgQm94KEJveExheW91dC5YX0FYSVMpOworCQkKKyAgICAgICAgLy8gU2V0dXAgdGl0bGUKKyAgICAgICAgdGl0bGVMYWJlbC5zZXRGb250KG5ldyBGb250KCJTZXJpZiIsRm9udC5CT0xELDE2KSk7CisJCQorICAgICAgICAvLyBTZXR1cCBwYW5lbHMKKyAgICAgICAgbWlkUGFuZWwuc2V0Qm9yZGVyKEJvcmRlckZhY3RvcnkuY3JlYXRlVGl0bGVkQm9yZGVyKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiaW1wb3J0X29wdGlvbnMiKSkpOworICAgICAgICByZXNvdXJjZVBhbmVsLnNldEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZVRpdGxlZEJvcmRlcihSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImltcG9ydF9yZXNvdXJjZV9jb25mbGljdHMiKSkpOworICAgICAgICBmaWxlUGFuZWwuc2V0Qm9yZGVyKEJvcmRlckZhY3RvcnkuY3JlYXRlVGl0bGVkQm9yZGVyKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiaW1wb3J0X2ZpbGVfY29uZmxpY3RzIikpKTsKKyAgICAgICAgZGVmYXVsdFBhbmVsLnNldEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZVRpdGxlZEJvcmRlcihSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImltcG9ydF9kZWZhdWx0X3ZhbHVlcyIpKSk7CisJCQorICAgICAgICAvLyBBcnJhbmdlIGJ1dHRvbiBncm91cHMKKyAgICAgICAgZmlsZUdyb3VwLmFkZChmaWxlR2VuZXJhdGVQb3B1bGF0ZVJhZGlvKTsKKyAgICAgICAgZmlsZUdyb3VwLmFkZChmaWxlR2VuZXJhdGVFbXB0eVJhZGlvKTsKKyAgICAgICAgZmlsZUdyb3VwLmFkZChmaWxlSWdub3JlUmFkaW8pOworICAgICAgICBmaWxlR3JvdXAuYWRkKGZpbGVQcm9tcHRSYWRpbyk7CisgICAgICAgIHJlc291cmNlR3JvdXAuYWRkKHJlc291cmNlT3ZlcndyaXRlUmFkaW8pOworICAgICAgICByZXNvdXJjZUdyb3VwLmFkZChyZXNvdXJjZUlnbm9yZVJhZGlvKTsKKyAgICAgICAgcmVzb3VyY2VHcm91cC5hZGQocmVzb3VyY2VQcm9tcHRSYWRpbyk7CisJCQorICAgICAgICAvLyBBZGQgYWN0aW9uIGxpc3RlbmVycworICAgICAgICBjYW5jZWxCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCl7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXYpIHsKKyAgICAgICAgICAgICAgICB0aGlzV2luZG93Q2xvc2luZygpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKwkJCisgICAgICAgIGltcG9ydEJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKXsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldikgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGJlZ2luSW1wb3J0KCk7CisgICAgICAgICAgICAgICAgICAgIGd1aS51cGRhdGVQcm9qZWN0VHJlZSgpOworICAgICAgICAgICAgICAgICAgICBndWkudXBkYXRlRGlzcGxheVRyZWUoKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpc1dpbmRvd0Nsb3NpbmcoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgICAgICAJaW9lLnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2cobnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZXJyb3IiKSArICJcbiIgKyBpb2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJlcnJvciIpLCBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsJCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKwkJCisgICAgICAgIGZpbGVDaG9vc2VCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCl7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXYpIHsKKyAgICAgICAgICAgICAgICBjaG9vc2VGaWxlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCQkKKyAgICAgICAgLy8gU2V0dXAgY29tYm8gYm94CisgICAgICAgIEJ1bmRsZSBiYXNlQnVuZGxlID0gKChCdW5kbGUpcmJtLmdldEJ1bmRsZXMoKS5lbGVtZW50QXQoMCkpOworICAgICAgICBCdW5kbGVHcm91cCB1bmdyb3VwZWRHcm91cCA9IGJhc2VCdW5kbGUuZ2V0VW5ncm91cGVkR3JvdXAoKTsKKyAgICAgICAgZ3JvdXBDb21ib0JveCA9IG5ldyBKQ29tYm9Cb3goYmFzZUJ1bmRsZS5nZXRHcm91cHNBc1ZlY3RvcigpKTsKKyAgICAgICAgaW50IGdyb3VwQ29tYm9Cb3hDb3VudCA9IGdyb3VwQ29tYm9Cb3guZ2V0SXRlbUNvdW50KCk7CisgICAgICAgIGZvciAoaW50IHNlbGVjdGVkSW5kZXggPSAwOyBzZWxlY3RlZEluZGV4IDwgZ3JvdXBDb21ib0JveENvdW50OyBzZWxlY3RlZEluZGV4KyspIHsKKyAgICAgICAgCUJ1bmRsZUdyb3VwIGJ1bmRHcm91cCA9ICgoQnVuZGxlR3JvdXApZ3JvdXBDb21ib0JveC5nZXRJdGVtQXQoc2VsZWN0ZWRJbmRleCkpOworICAgICAgICAJaWYgKGJ1bmRHcm91cC5nZXROYW1lKCkuZXF1YWxzKHVuZ3JvdXBlZEdyb3VwLmdldE5hbWUoKSkpIHsKKyAgICAgICAgCQkvLyBCeSBkZWZhdWx0LCB1c2UgdGhlIHVuZ3JvdXBlZCBncm91cC4gUHJvYmFibHkgbmFtZWQgJ1VuZ3JvdXBlZCBJdGVtcycuCisgICAgICAgIAkJZ3JvdXBDb21ib0JveC5zZXRTZWxlY3RlZEluZGV4KHNlbGVjdGVkSW5kZXgpOworICAgICAgICAJCWJyZWFrOworICAgICAgICAJfQorICAgICAgICB9CisJCQorICAgICAgICAvLyBBcmFuZ2UgY29tcG9uZW50cworICAgICAgICBncm91cEJveC5hZGQoQm94LmNyZWF0ZUhvcml6b250YWxHbHVlKCkpOworICAgICAgICBncm91cEJveC5hZGQoaW5zZXJ0R3JvdXBMYWJlbCk7CisgICAgICAgIGdyb3VwQm94LmFkZChCb3guY3JlYXRlSG9yaXpvbnRhbFN0cnV0KDUpKTsKKyAgICAgICAgZ3JvdXBCb3guYWRkKGdyb3VwQ29tYm9Cb3gpOworCQkKKyAgICAgICAgZGVmYXVsdFBhbmVsMi5hZGQoZ3JvdXBCb3gsIEJvcmRlckxheW91dC5OT1JUSCk7CisgICAgICAgIGRlZmF1bHRQYW5lbDIuYWRkKG1hcmtUcmFuc2xhdGVkQ2hlY2ssIEJvcmRlckxheW91dC5DRU5URVIpOworICAgICAgICBkZWZhdWx0UGFuZWwyLmFkZChjcmVhdGVHcm91cHNDaGVjaywgQm9yZGVyTGF5b3V0LlNPVVRIKTsKKwkJCisgICAgICAgIGZpbGVCb3guYWRkKGZpbGVHZW5lcmF0ZVBvcHVsYXRlUmFkaW8pOworICAgICAgICBmaWxlQm94LmFkZChmaWxlR2VuZXJhdGVFbXB0eVJhZGlvKTsKKyAgICAgICAgZmlsZUJveC5hZGQoZmlsZUlnbm9yZVJhZGlvKTsKKyAgICAgICAgZmlsZUJveC5hZGQoZmlsZVByb21wdFJhZGlvKTsKKwkJCisgICAgICAgIHJlc291cmNlQm94LmFkZChyZXNvdXJjZU92ZXJ3cml0ZVJhZGlvKTsKKyAgICAgICAgcmVzb3VyY2VCb3guYWRkKHJlc291cmNlSWdub3JlUmFkaW8pOworICAgICAgICByZXNvdXJjZUJveC5hZGQocmVzb3VyY2VQcm9tcHRSYWRpbyk7CisJCQorICAgICAgICBkZWZhdWx0UGFuZWwuYWRkKGRlZmF1bHRQYW5lbDIpOworICAgICAgICBmaWxlUGFuZWwuYWRkKGZpbGVCb3gpOworICAgICAgICByZXNvdXJjZVBhbmVsLmFkZChyZXNvdXJjZUJveCk7CisJCQorICAgICAgICBtaWRCb3guYWRkKHJlc291cmNlUGFuZWwpOworICAgICAgICBtaWRCb3guYWRkKGZpbGVQYW5lbCk7CisgICAgICAgIG1pZEJveC5hZGQoZGVmYXVsdFBhbmVsKTsKKyAgICAgICAgICAgIAorICAgICAgICBtaWRQYW5lbC5hZGQobWlkQm94LCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKKwkJCisgICAgICAgIHRvcElubmVyUGFuZWwuYWRkKHNvdXJjZUxhYmVsLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKKyAgICAgICAgdG9wSW5uZXJQYW5lbC5hZGQoZmlsZUNob29zZUJ1dHRvbiwgQm9yZGVyTGF5b3V0LkVBU1QpOworCQkKKyAgICAgICAgdG9wUGFuZWwuYWRkKHRpdGxlTGFiZWwsIEJvcmRlckxheW91dC5OT1JUSCk7CisgICAgICAgIHRvcFBhbmVsLmFkZCh0b3BJbm5lclBhbmVsLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKKwkJCisgICAgICAgIGJvdFBhbmVsLmFkZChjYW5jZWxCdXR0b24pOworICAgICAgICBib3RQYW5lbC5hZGQoaW1wb3J0QnV0dG9uKTsKKwkJCisgICAgICAgIGdldENvbnRlbnRQYW5lKCkuc2V0TGF5b3V0KG5ldyBCb3JkZXJMYXlvdXQoKSk7CisgICAgICAgIGdldENvbnRlbnRQYW5lKCkuYWRkKHRvcFBhbmVsLCBCb3JkZXJMYXlvdXQuTk9SVEgpOworICAgICAgICBnZXRDb250ZW50UGFuZSgpLmFkZChtaWRQYW5lbCwgQm9yZGVyTGF5b3V0LkNFTlRFUik7CisgICAgICAgIGdldENvbnRlbnRQYW5lKCkuYWRkKGJvdFBhbmVsLCBCb3JkZXJMYXlvdXQuU09VVEgpOworCQkKKyAgICAgICAgcGFjaygpOworICAgIH0KKwkKKyAgICBwcm90ZWN0ZWQgdm9pZCB0aGlzV2luZG93Q2xvc2luZygpIHsKKyAgICAgICAgc2V0VmlzaWJsZShmYWxzZSk7CisgICAgICAgIGRpc3Bvc2UoKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL1JCSmF2YUV4cG9ydGVyLmphdmEgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vUkJKYXZhRXhwb3J0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTY0OGZjCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL1JCSmF2YUV4cG9ydGVyLmphdmEKQEAgLTAsMCArMSwyMDMgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoQykgMjAwMC0yMDA0LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCAgKgorICogb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworcGFja2FnZSBjb20uaWJtLnJibTsKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLmF3dC4qOworaW1wb3J0IGphdmEuYXd0LmV2ZW50Lio7CitpbXBvcnQgamF2YXguc3dpbmcuKjsKK2ltcG9ydCBqYXZheC5zd2luZy5ib3JkZXIuKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworLyoqCisgKiBBbiBleHBvcnRlciBwbHVnLWluIGNsYXNzIGZvciBSQk1hbmFnZXIuIFRoZSByZXNvdXJjZXMgZXhwb3J0ZWQgaGVyZSBjb25mb3JtIHRvCisgKiB0aGUgSmF2YSBzdGFuZGFyZCBmb3IgUmVzb3VyY2UgQnVuZGxlcyBhcyBzcGVjaWZpZWQgaW4gamF2YS51dGlsLkxpc3RSZXNvdXJjZUJ1bmRsZS4KKyAqIFRoZSBvdXRwdXQgZmlsZXMgYXJlIGNvbXBpbGFibGUgamF2YSBmaWxlcyB0aGF0IGFyZSBub3QgYXNzb2NpYXRlZCB3aXRoIGFueQorICogcGFja2FnZS4KKyAqIAorICogQGF1dGhvciBKYXJlZCBKYWNrc29uCisgKiBAc2VlIGNvbS5pYm0ucmJtLlJCTWFuYWdlcgorICovCitwdWJsaWMgY2xhc3MgUkJKYXZhRXhwb3J0ZXIgZXh0ZW5kcyBSQkV4cG9ydGVyIHsKKyAgICBwcml2YXRlIFN0cmluZyBwYWNrYWdlTmFtZSA9IG51bGw7CisgICAgcHJpdmF0ZSBib29sZWFuIHB1YmxpY0NsYXNzID0gdHJ1ZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gcHVibGljTWV0aG9kcyA9IHRydWU7CisJCisJCisgICAgcHVibGljIFJCSmF2YUV4cG9ydGVyKCkgeworICAgICAgICBzdXBlcigpOworCQkKKyAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgZmlsZSBjaG9vc2VyIGlmIG5lY2Vzc2FyeQorICAgICAgICBpZiAoY2hvb3NlciA9PSBudWxsKSB7CisgICAgICAgICAgICBjaG9vc2VyID0gbmV3IEpGaWxlQ2hvb3NlcigpOworICAgICAgICAgICAgY2hvb3Nlci5zZXRGaWxlRmlsdGVyKG5ldyBqYXZheC5zd2luZy5maWxlY2hvb3Nlci5GaWxlRmlsdGVyKCl7CisgICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJKYXZhIFNvdXJjZSBGaWxlcyI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGYpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGYuaXNEaXJlY3RvcnkoKSkgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIGlmIChmLmdldE5hbWUoKS5lbmRzV2l0aCgiLmphdmEiKSAmJiBmLmdldE5hbWUoKS5pbmRleE9mKCJfIikgPCAwKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgfQorCQorICAgIHB1YmxpYyB2b2lkIGV4cG9ydChSQk1hbmFnZXIgcmJtKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAocmJtID09IG51bGwpIHJldHVybjsKKyAgICAgICAgLy8gT3BlbiB0aGUgYWRkaXRpb25hbCBEaWFsb2cKKyAgICAgICAgUkJKYXZhRXhwb3J0ZXJEaWFsb2cgcGFyYW1ldGVyc0RpYWxvZyA9IG5ldyBSQkphdmFFeHBvcnRlckRpYWxvZygpOworICAgICAgICBwYWNrYWdlTmFtZSA9IHBhcmFtZXRlcnNEaWFsb2cuZ2V0UGFja2FnZU5hbWUoKTsKKyAgICAgICAgcHVibGljQ2xhc3MgPSBwYXJhbWV0ZXJzRGlhbG9nLmlzQ2xhc3NQdWJsaWMoKTsKKyAgICAgICAgcHVibGljTWV0aG9kcyA9IHBhcmFtZXRlcnNEaWFsb2cuaXNNZXRob2RzUHVibGljKCk7CisJCQorICAgICAgICAvLyBPcGVuIHRoZSBTYXZlIERpYWxvZworICAgICAgICBpbnQgcmV0X3ZhbCA9IGNob29zZXIuc2hvd1NhdmVEaWFsb2cobnVsbCk7CisgICAgICAgIGlmIChyZXRfdmFsICE9IEpGaWxlQ2hvb3Nlci5BUFBST1ZFX09QVElPTikgcmV0dXJuOworICAgICAgICAvLyBSZXRyaWV2ZSBiYXNpYyBmaWxlIGluZm9ybWF0aW9uCisgICAgICAgIEZpbGUgZmlsZSA9IGNob29zZXIuZ2V0U2VsZWN0ZWRGaWxlKCk7ICAgICAgICAgICAgICAgICAgLy8gVGhlIGZpbGUocykgd2Ugd2lsbCBiZSB3b3JraW5nIHdpdGgKKyAgICAgICAgRmlsZSBkaXJlY3RvcnkgPSBuZXcgRmlsZShmaWxlLmdldFBhcmVudCgpKTsgICAgICAgICAgICAvLyBUaGUgZGlyZWN0b3J5IHdlIHdpbGwgYmUgd3JpdGluZyB0bworICAgICAgICBTdHJpbmcgYmFzZV9uYW1lID0gZmlsZS5nZXROYW1lKCk7ICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBiYXNlIG5hbWUgb2YgdGhlIGZpbGVzIHdlIHdpbGwgd3JpdGUKKyAgICAgICAgaWYgKGJhc2VfbmFtZSA9PSBudWxsIHx8IGJhc2VfbmFtZS5lcXVhbHMoIiIpKSBiYXNlX25hbWUgPSByYm0uZ2V0QmFzZUNsYXNzKCk7CisgICAgICAgIGlmIChiYXNlX25hbWUuZW5kc1dpdGgoIi5qYXZhIikpIGJhc2VfbmFtZSA9IGJhc2VfbmFtZS5zdWJzdHJpbmcoMCxiYXNlX25hbWUubGVuZ3RoKCktNSk7CisJCQorICAgICAgICBWZWN0b3IgYnVuZGxlX3YgPSByYm0uZ2V0QnVuZGxlcygpOworICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBidW5kbGVfdi5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IChCdW5kbGUpYnVuZGxlX3YuZWxlbWVudEF0KGkpOworICAgICAgICAgICAgU3RyaW5nIGJhc2VfZW5jID0gYmFzZV9uYW1lOworICAgICAgICAgICAgaWYgKGJ1bmRsZS5lbmNvZGluZyAhPSBudWxsICYmICFidW5kbGUuZW5jb2RpbmcuZXF1YWxzKCIiKSkgYmFzZV9lbmMgPSBiYXNlX2VuYyArICJfIiArIGJ1bmRsZS5lbmNvZGluZzsKKyAgICAgICAgICAgIFN0cmluZyBmaWxlX25hbWUgPSBiYXNlX2VuYyArICIuamF2YSI7CisJCQkKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIvKiBGaWxlOiAgICAiICsgZmlsZV9uYW1lICsgIlxuIik7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIgKiBEYXRlOiAgICAiICsgKG5ldyBEYXRlKCkpICsgIlxuIik7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIgKiBDb21tZW50OiBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IFJCTWFuYWdlciIgKyAiXG4iKTsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIiAqL1xuXG4iKTsKKyAgICAgICAgICAgIGlmIChwYWNrYWdlTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgicGFja2FnZSAiICsgcGFja2FnZU5hbWUgKyAiO1xuXG4iKTsKKyAgICAgICAgICAgIH0JCisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCJpbXBvcnQgamF2YS51dGlsLkxpc3RSZXNvdXJjZUJ1bmRsZTtcblxuIik7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKChwdWJsaWNDbGFzcyA/ICJwdWJsaWMgIiA6ICJwcm90ZWN0ZWQgIikpOworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiY2xhc3MgIiArIGJhc2VfZW5jICsgIiBleHRlbmRzIExpc3RSZXNvdXJjZUJ1bmRsZSB7XG4iKTsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIlx0IiArIChwdWJsaWNNZXRob2RzID8gInB1YmxpYyIgOiAicHJvdGVjdGVkIikgKyAiIE9iamVjdFtdW10gZ2V0Q29udGVudHMoKSB7XG4iKTsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIlx0XHRyZXR1cm4gY29udGVudHM7XG4iKTsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIlx0fVxuIik7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCJcdHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdW10gY29udGVudHMgPSB7XG4iKTsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIlx0Ly8gTE9DQUxJWkUgVEhJU1xuIik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFZlY3RvciBncm91cF92ID0gYnVuZGxlLmdldEdyb3Vwc0FzVmVjdG9yKCk7CisgICAgICAgICAgICBmb3IgKGludCBqPTA7IGogPCBncm91cF92LnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICAgICAgQnVuZGxlR3JvdXAgZ3JvdXAgPSAoQnVuZGxlR3JvdXApZ3JvdXBfdi5lbGVtZW50QXQoaik7CisgICAgICAgICAgICAgICAgVmVjdG9yIGl0ZW1fdiA9IGdyb3VwLmdldEl0ZW1zQXNWZWN0b3IoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBrPTA7IGsgPCBpdGVtX3Yuc2l6ZSgpOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgQnVuZGxlSXRlbSBpdGVtID0gKEJ1bmRsZUl0ZW0paXRlbV92LmVsZW1lbnRBdChrKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiXHRcdHtcIiIgKyBpdGVtLmdldEtleSgpICsgIlwiLCBcIiIgKyBpdGVtLmdldFRyYW5zbGF0aW9uKCkgKyAiXCJ9LFx0Ly8gIiArIGl0ZW0uZ2V0Q29tbWVudCgpICsgIlxuIik7CisgICAgICAgICAgICAgICAgfSAvLyBlbmQgZm9yIC0gaworICAgICAgICAgICAgfSAvLyBlbmQgZm9yIC0gagorICAgICAgICAgICAgCisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCJcdC8vIEVORCBPRiBNQVRFUklBTCBUTyBMT0NBTElaRVxuIik7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCJcdH07XG4iKTsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIn0iKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gV3JpdGUgb3V0IHRoZSBmaWxlCisgICAgICAgICAgICBGaWxlIHdyaXRlX2ZpbGUgPSBuZXcgRmlsZShkaXJlY3RvcnksIGZpbGVfbmFtZSk7CisgICAgICAgICAgICBGaWxlV3JpdGVyIHdyaXRlciA9IG5ldyBGaWxlV3JpdGVyKHdyaXRlX2ZpbGUpOworICAgICAgICAgICAgd3JpdGVyLndyaXRlKGJ1ZmZlci50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHdyaXRlci5mbHVzaCgpOworICAgICAgICAgICAgd3JpdGVyLmNsb3NlKCk7CisgICAgICAgIH0gLy8gZW5kIGZvciAtIGkKKyAgICB9Cit9CisKK2NsYXNzIFJCSmF2YUV4cG9ydGVyRGlhbG9nIGV4dGVuZHMgSkRpYWxvZyB7CisgICAgSkNoZWNrQm94IHBhY2thZ2VDaGVjazsKKyAgICBKUmFkaW9CdXR0b24gY2xhc3NQdWJsaWNSYWRpbzsKKyAgICBKUmFkaW9CdXR0b24gY2xhc3NQcm90ZWN0ZWRSYWRpbzsKKyAgICBKUmFkaW9CdXR0b24gbWV0aG9kc1B1YmxpY1JhZGlvOworICAgIEpSYWRpb0J1dHRvbiBtZXRob2RzUHJvdGVjdGVkUmFkaW87CisgICAgSlRleHRGaWVsZCBwYWNrYWdlRmllbGQ7CisJCisgICAgcHVibGljIFJCSmF2YUV4cG9ydGVyRGlhbG9nKCkgeworICAgICAgICBzdXBlcihuZXcgSkZyYW1lKCksIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX3RpdGxlX2V4cG9ydF9qYXZhX29wdGlvbnMiKSwgdHJ1ZSk7CisgICAgICAgIGluaXRDb21wb25lbnRzKCk7CisgICAgfQorCQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7CisgICAgICAgIGlmICghKHBhY2thZ2VDaGVjay5pc1NlbGVjdGVkKCkpKSByZXR1cm4gbnVsbDsKKyAgICAgICAgU3RyaW5nIHJldFZhbCA9IHBhY2thZ2VGaWVsZC5nZXRUZXh0KCk7CisgICAgICAgIGlmIChyZXRWYWwgPT0gbnVsbCB8fCByZXRWYWwudHJpbSgpLmVxdWFscygiIikpIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gcmV0VmFsLnRyaW0oKTsKKyAgICB9CisJCisgICAgcHVibGljIGJvb2xlYW4gaXNDbGFzc1B1YmxpYygpIHsJCisgICAgICAgIHJldHVybiBjbGFzc1B1YmxpY1JhZGlvLmlzU2VsZWN0ZWQoKTsJCisgICAgfQorICAgIAorICAgIHB1YmxpYyBib29sZWFuIGlzTWV0aG9kc1B1YmxpYygpIHsKKyAgICAgICAgcmV0dXJuIG1ldGhvZHNQdWJsaWNSYWRpby5pc1NlbGVjdGVkKCk7CisgICAgfQorCQorICAgIHByaXZhdGUgdm9pZCBoYW5kbGVDbG9zZSgpIHsKKyAgICAgICAgc2V0VmlzaWJsZShmYWxzZSk7CisgICAgICAgIGRpc3Bvc2UoKTsKKyAgICB9CisJCisgICAgcHJpdmF0ZSB2b2lkIGluaXRDb21wb25lbnRzKCkgeworICAgICAgICBnZXRDb250ZW50UGFuZSgpLnNldExheW91dChuZXcgQm9yZGVyTGF5b3V0KCkpOworICAgICAgICBnZXRDb250ZW50UGFuZSgpLnJlbW92ZUFsbCgpOworCQkKKyAgICAgICAgcGFja2FnZUNoZWNrID0gbmV3IEpDaGVja0JveChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImV4cG9ydF9qYXZhX3BhY2thZ2UiKSwgZmFsc2UpOworICAgICAgICBjbGFzc1B1YmxpY1JhZGlvID0gbmV3IEpSYWRpb0J1dHRvbihSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImV4cG9ydF9qYXZhX2NsYXNzX3B1YmxpYyIpLCB0cnVlKTsKKyAgICAgICAgY2xhc3NQcm90ZWN0ZWRSYWRpbyA9IG5ldyBKUmFkaW9CdXR0b24oUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJleHBvcnRfamF2YV9jbGFzc19wcm90ZWN0ZWQiKSwgZmFsc2UpOworICAgICAgICBtZXRob2RzUHVibGljUmFkaW8gPSBuZXcgSlJhZGlvQnV0dG9uKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZXhwb3J0X2phdmFfY2xhc3NfcHVibGljIiksIHRydWUpOworICAgICAgICBtZXRob2RzUHJvdGVjdGVkUmFkaW8gPSBuZXcgSlJhZGlvQnV0dG9uKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZXhwb3J0X2phdmFfY2xhc3NfcHJvdGVjdGVkIiksIGZhbHNlKTsKKyAgICAgICAgcGFja2FnZUZpZWxkID0gbmV3IEpUZXh0RmllbGQoKTsKKyAgICAgICAgcGFja2FnZUZpZWxkLnNldENvbHVtbnMoMzApOworCQkKKyAgICAgICAgSkJ1dHRvbiBva0J1dHRvbiA9IG5ldyBKQnV0dG9uKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiT0siKSk7CisgICAgICAgIEpMYWJlbCB0aXRsZUxhYmVsID0gbmV3IEpMYWJlbChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImV4cG9ydF9qYXZhX3RpdGxlIiksIFN3aW5nQ29uc3RhbnRzLkxFRlQpOworCQkKKyAgICAgICAgSlBhbmVsIG9rUGFuZWwgPSBuZXcgSlBhbmVsKCk7CisgICAgICAgIG9rUGFuZWwuYWRkKG9rQnV0dG9uKTsKKyAgICAgICAgSlBhbmVsIGNlbnRlclBhbmVsID0gbmV3IEpQYW5lbChuZXcgR3JpZExheW91dCgxLDEpKTsKKyAgICAgICAgY2VudGVyUGFuZWwuc2V0Qm9yZGVyKEJvcmRlckZhY3RvcnkuY3JlYXRlQmV2ZWxCb3JkZXIoQmV2ZWxCb3JkZXIuUkFJU0VEKSk7CisgICAgICAgIEJveCBjZW50ZXJCb3ggPSBCb3guY3JlYXRlVmVydGljYWxCb3goKTsKKyAgICAgICAgQm94IHBhY2thZ2VCb3ggPSBCb3guY3JlYXRlSG9yaXpvbnRhbEJveCgpOworICAgICAgICBwYWNrYWdlQm94LmFkZChwYWNrYWdlQ2hlY2spOworICAgICAgICBwYWNrYWdlQm94LmFkZChwYWNrYWdlRmllbGQpOworICAgICAgICBjZW50ZXJCb3guYWRkKHBhY2thZ2VCb3gpOworICAgICAgICBjZW50ZXJCb3guYWRkKG5ldyBKU2VwYXJhdG9yKCkpOworICAgICAgICBjZW50ZXJCb3guYWRkKGNsYXNzUHVibGljUmFkaW8pOworICAgICAgICBjZW50ZXJCb3guYWRkKGNsYXNzUHJvdGVjdGVkUmFkaW8pOworICAgICAgICBjZW50ZXJCb3guYWRkKG5ldyBKU2VwYXJhdG9yKCkpOworICAgICAgICBjZW50ZXJCb3guYWRkKG1ldGhvZHNQdWJsaWNSYWRpbyk7CisgICAgICAgIGNlbnRlckJveC5hZGQobWV0aG9kc1Byb3RlY3RlZFJhZGlvKTsKKyAgICAgICAgY2VudGVyUGFuZWwuYWRkKGNlbnRlckJveCk7CisJCQorICAgICAgICBnZXRDb250ZW50UGFuZSgpLmFkZCh0aXRsZUxhYmVsLCBCb3JkZXJMYXlvdXQuTk9SVEgpOworICAgICAgICBnZXRDb250ZW50UGFuZSgpLmFkZChva1BhbmVsLCBCb3JkZXJMYXlvdXQuU09VVEgpOworICAgICAgICBnZXRDb250ZW50UGFuZSgpLmFkZChjZW50ZXJQYW5lbCwgQm9yZGVyTGF5b3V0LkNFTlRFUik7CisJCQorICAgICAgICBva0J1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKXsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldikgeworICAgICAgICAgICAgICAgIGhhbmRsZUNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCQkKKyAgICAgICAgQnV0dG9uR3JvdXAgY2xhc3NHcm91cCA9IG5ldyBCdXR0b25Hcm91cCgpOworICAgICAgICBCdXR0b25Hcm91cCBtZXRob2RzR3JvdXAgPSBuZXcgQnV0dG9uR3JvdXAoKTsKKyAgICAgICAgY2xhc3NHcm91cC5hZGQoY2xhc3NQdWJsaWNSYWRpbyk7CisgICAgICAgIGNsYXNzR3JvdXAuYWRkKGNsYXNzUHJvdGVjdGVkUmFkaW8pOworICAgICAgICBtZXRob2RzR3JvdXAuYWRkKG1ldGhvZHNQdWJsaWNSYWRpbyk7CisgICAgICAgIG1ldGhvZHNHcm91cC5hZGQobWV0aG9kc1Byb3RlY3RlZFJhZGlvKTsKKwkJCisgICAgICAgIC8vdmFsaWRhdGVUcmVlKCk7CisgICAgICAgIHBhY2soKTsKKyAgICAgICAgLy9zZXRMb2NhdGlvbihuZXcgUG9pbnQoMjUsMjUpKTsKKyAgICAgICAgc2V0VmlzaWJsZSh0cnVlKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL1JCSmF2YUltcG9ydGVyLmphdmEgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vUkJKYXZhSW1wb3J0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjJmZmU4Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL1JCSmF2YUltcG9ydGVyLmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDcsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kICAqCisgKiBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitwYWNrYWdlIGNvbS5pYm0ucmJtOworCisKK2ltcG9ydCBqYXZhLmlvLio7CisKK2ltcG9ydCBjb20uaWJtLnJibS5ndWkuUkJNYW5hZ2VyR1VJOworCitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS5uZXQuKjsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBzdXBlciBjbGFzcyBmb3IgYWxsIGltcG9ydGVyIHBsdWctaW4gY2xhc3Nlcy4gQXMgb2YgeWV0LCB0aGVyZQorICogaXMgbGl0dGxlIGNvbnRhaW5lZCBpbiB0aGlzIGNsYXNzLgorICogCisgKiBAYXV0aG9yIEphcmVkIEphY2tzb24KKyAqIEBzZWUgY29tLmlibS5yYm0uUkJNYW5hZ2VyCisgKi8KK3B1YmxpYyBjbGFzcyBSQkphdmFJbXBvcnRlciBleHRlbmRzIFJCSW1wb3J0ZXIgeworCQorICAgIHB1YmxpYyBSQkphdmFJbXBvcnRlcihTdHJpbmcgdGl0bGUsIFJCTWFuYWdlciByYm0sIFJCTWFuYWdlckdVSSBndWkpIHsKKyAgICAgICAgc3VwZXIodGl0bGUsIHJibSwgZ3VpKTsKKyAgICB9CisJCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0dXBGaWxlQ2hvb3NlcigpIHsKKyAgICAgICAgY2hvb3Nlci5zZXRGaWxlRmlsdGVyKG5ldyBqYXZheC5zd2luZy5maWxlY2hvb3Nlci5GaWxlRmlsdGVyKCl7CisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBmKSB7CisgICAgICAgICAgICAgICAgaWYgKGYuaXNEaXJlY3RvcnkoKSkgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgaWYgKGYuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuY2xhc3MiKSAmJiBmLmdldE5hbWUoKS5pbmRleE9mKCJfIikgPCAwKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisJCQkKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiaW1wb3J0X2phdmFfZmlsZV9kZXNjcmlwdGlvbiIpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisJCisgICAgcHJvdGVjdGVkIHZvaWQgYmVnaW5JbXBvcnQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBzdXBlci5iZWdpbkltcG9ydCgpOworICAgICAgICBMaXN0UmVzb3VyY2VCdW5kbGUgYmFzZV9scmIgPSBudWxsOworICAgICAgICBVUkxDbGFzc0xvYWRlciB1cmxMb2FkZXIgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgRmlsZSBiYXNlRmlsZSA9IGdldENob3NlbkZpbGUoKTsKKyAgICAgICAgICAgIFVSTCBiYXNlVVJMID0gYmFzZUZpbGUudG9VUkwoKTsKKyAgICAgICAgICAgIFVSTCB1cmxzW10gPSBuZXcgVVJMWzFdOworICAgICAgICAgICAgdXJsc1swXSA9IGJhc2VVUkw7CisgICAgICAgICAgICB1cmxMb2FkZXIgPSBuZXcgVVJMQ2xhc3NMb2FkZXIodXJscyk7CisgICAgICAgICAgICBTdHJpbmcgYmFzZU5hbWUgPSBiYXNlRmlsZS5nZXROYW1lKCk7CisgICAgICAgICAgICBiYXNlTmFtZSA9IGJhc2VOYW1lLnN1YnN0cmluZygwLCBiYXNlTmFtZS5pbmRleE9mKCIuY2xhc3MiKSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIENsYXNzIGJhc2VDbGFzcyA9IHVybExvYWRlci5sb2FkQ2xhc3MoYmFzZU5hbWUpOworICAgICAgICAgICAgYmFzZV9scmIgPSAoTGlzdFJlc291cmNlQnVuZGxlKWJhc2VDbGFzcy5uZXdJbnN0YW5jZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgUkJNYW5hZ2VyR1VJLmRlYnVnTXNnKGUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBSQk1hbmFnZXJHVUkuZGVidWdNc2coZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJhc2VfbHJiICE9IG51bGwpIHsKKyAgICAgICAgICAgIEVudW1lcmF0aW9uIGtleXMgPSBiYXNlX2xyYi5nZXRLZXlzKCk7CisgICAgICAgICAgICB3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBrZXlzLm5leHRFbGVtZW50KCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBSQk1hbmFnZXJHVUkuZGVidWdNc2coIlJlc291cmNlIC0+ICIgKyBrZXkgKyAiID0gIiArIGJhc2VfbHJiLmdldFN0cmluZyhrZXkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworLyoKK2NsYXNzIG15Q2xhc3NMb2FkZXIgZXh0ZW5kcyBDbGFzc0xvYWRlciB7CisgICAgcHVibGljIG15Q2xhc3NMb2FkZXIoKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgfQorCQorICAgIHB1YmxpYyBDbGFzcyBteURlZmluZUNsYXNzKFN0cmluZyBuYW1lLCBieXRlIGFycmF5W10sIGludCBvZmYsIGludCBsZW4pIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmRlZmluZUNsYXNzKG5hbWUsIGFycmF5LCBvZmYsIGxlbik7CisgICAgfQorfQorKi8KZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9SQk1hbmFnZXIuamF2YSBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9SQk1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTA3YTcwCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL1JCTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsOTQ2IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNywgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgICoKKyAqIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3BhY2thZ2UgY29tLmlibS5yYm07CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YXguc3dpbmcuVUlNYW5hZ2VyOworaW1wb3J0IGphdmF4LnN3aW5nLkpPcHRpb25QYW5lOworCitpbXBvcnQgY29tLmlibS5yYm0uZ3VpLlJCTWFuYWdlckdVSTsKKworLyoqCisgKiBBIHV0aWxpdHkgY2xhc3MgdG8gYWlkIGluIHRoZSBwcm9jZXNzIG9mIHVwZGF0aW5nIHRoZSBOYXR1cmFsIExhbmd1YWdlIFN1cHBvcnQgb2YgVGVtcHVzIEZ1Z2l0LgorICogVGhpcyBjbGFzcyBzY2FucyB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgTkxTIGZpbGVzIGFuZCBjaGVja3MgdGhlIHZhcmlvdXMgbGFuZ3VhZ2VzIGZvdW5kIHRoZXJlCisgKiBmb3IgY29tcGxldGVuZXNzLCBkdXBsaWNhdGlvbiBvZiBlbnRyeSwgYW5kIHN0YXR1cyBvZiB0cmFuc2xhdGlvbi4gVGhlIGNsYXNzIGNhbiBiZSBpbnN0YW50aWF0ZWQKKyAqIHRocm91Z2ggYSBjb25zdHJ1Y3Rvciwgb3IgaXQgY2FuIGJlIHJ1biBmcm9tIHRoZSBjb21tYW5kIGxpbmUuIEZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIHRoZQorICogY29tbWFuZCBsaW5lIHJlc3VsdHMsIHNlZSB0aGUgPENPREU+bWFpbjwvQ09ERT4gbWV0aG9kLgorICogCisgKiBAYXV0aG9yIEphcmVkIEphY2tzb24KKyAqIEBzZWUgY29tLmlibS5yYm0uUkJNYW5hZ2VyCisgKi8KK3B1YmxpYyBjbGFzcyBSQk1hbmFnZXIgeworCQorICAgIC8vICoqKiBEQVRBICoqKgorICAgIHByaXZhdGUgVmVjdG9yIGFsbEJ1bmRsZUtleXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgVmVjdG9yIG9mIFN0cmluZ3Mgd2l0aCBhbGwgZGVmaW5lZCBOTFMgcHJvcGVydGllcworICAgIHByaXZhdGUgVmVjdG9yIGJ1bmRsZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIFZlY3RvciBvZiBOTFNidW5kbGVzLCBvbmUgZm9yIGVhY2ggbGFuZ3VhZ2UKKyAgICBwcml2YXRlIFN0cmluZyBjdXJyZW50VXNlcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgbmFtZSBvZiB0aGUgcGVyc29uIGN1cnJlbnRseSB1c2luZyB0aGUgZWRpdG9yCisgICAgcHJpdmF0ZSBTdHJpbmcgYmFzZUNsYXNzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIG5hbWUgb2YgdGhlIGJhc2UgY2xhc3Mgb2YgdGhlIGFjdGl2ZSByZXNvdXJjZSBidW5kbGUKKyAgICBwcml2YXRlIEZpbGUgICBjdXJyZW50RGlyZWN0b3J5OworCQorICAgIC8vICoqKiBDT05TVFJVQ1RPUlMgKioqCisJCisgICAgLy8gVGhlIGRlZmF1bHQgY29uc3RydWN0b3IgaXMgbm90IHB1YmxpY2x5IGF2YWlsYWJsZQorICAgIHByaXZhdGUgUkJNYW5hZ2VyKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gTG9vayBhbmQgRmVlbCBjaGVjaworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbGFmID0gUHJlZmVyZW5jZXMuZ2V0UHJlZmVyZW5jZSgibG9va2FuZGZlZWwiKTsKKyAgICAgICAgICAgICAgICBpZiAoIWxhZi5lcXVhbHMoIiIpKSBVSU1hbmFnZXIuc2V0TG9va0FuZEZlZWwobGFmKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7IAorICAgICAgICAgICAgICAgIC8vIElnbm9yZWQKKyAgICAgICAgICAgIH0KKwkJCQorICAgICAgICAgICAgUmVzb3VyY2VzLmluaXRCdW5kbGUoKTsKKyAgICAgICAgICAgIFJCTWFuYWdlckdVSSBndWlGcmFtZSA9IG5ldyBSQk1hbmFnZXJHVUkoKTsKKyAgICAgICAgICAgIGlmICghUHJlZmVyZW5jZXMuZ2V0UHJlZmVyZW5jZSgidXNlcm5hbWUiKS5lcXVhbHMoIiIpKQorICAgICAgICAgICAgICAgIGd1aUZyYW1lLnNldFVzZXIoUHJlZmVyZW5jZXMuZ2V0UHJlZmVyZW5jZSgidXNlcm5hbWUiKSk7CisgICAgICAgICAgICBpZiAoIVByZWZlcmVuY2VzLmdldFByZWZlcmVuY2UoImxvY2FsZSIpLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWxlU3RyID0gUHJlZmVyZW5jZXMuZ2V0UHJlZmVyZW5jZSgibG9jYWxlIik7CisgICAgICAgICAgICAgICAgU3RyaW5nIGxhbmd1YWdlID0gUmVzb3VyY2VzLmdldExhbmd1YWdlKGxvY2FsZVN0cik7CisgICAgICAgICAgICAgICAgU3RyaW5nIGNvdW50cnkgPSBSZXNvdXJjZXMuZ2V0Q291bnRyeShsb2NhbGVTdHIpOworICAgICAgICAgICAgICAgIFN0cmluZyB2YXJpYW50ID0gUmVzb3VyY2VzLmdldFZhcmlhbnQobG9jYWxlU3RyKTsKKyAgICAgICAgICAgICAgICBpZiAobGFuZ3VhZ2UgPT0gbnVsbCB8fCBsYW5ndWFnZS5lcXVhbHMoIiIpIHx8IGxhbmd1YWdlLmxlbmd0aCgpID4gMykgbGFuZ3VhZ2UgPSAiZW4iOworICAgICAgICAgICAgICAgIGlmIChjb3VudHJ5ID09IG51bGwpIGNvdW50cnkgPSBuZXcgU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgaWYgKHZhcmlhbnQgPT0gbnVsbCkgUmVzb3VyY2VzLnNldExvY2FsZShuZXcgTG9jYWxlKGxhbmd1YWdlLCBjb3VudHJ5KSk7CisgICAgICAgICAgICAgICAgZWxzZSBSZXNvdXJjZXMuc2V0TG9jYWxlKG5ldyBMb2NhbGUobGFuZ3VhZ2UsIGNvdW50cnksIHZhcmlhbnQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFJlc291cmNlcy5pbml0QnVuZGxlKCk7CisgICAgICAgICAgICBndWlGcmFtZS5pbml0Q29tcG9uZW50cygpOworICAgICAgICAgICAgZ3VpRnJhbWUuc2V0VmlzaWJsZSh0cnVlKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICB9CisJCisgICAgLyoqCisgICAgICogVGhpcyBjb25zdHJ1Y3RvciBjcmVhdGVzIGFuIGVudGlyZWx5IGJsYW5rIFJCTWFuYWdlciBhbmQgYmFzZSBCdW5kbGUuIE9ubHkgdGhlIGJhc2UgY2xhc3MgbmFtZSBpcyBkZWZpbmVkLgorICAgICAqIEFsbCBvdGhlciBwcm9wZXJ0aWVzIG5lZWQgdG8gYmUgZGVmaW5lZC4KKyAgICAgKi8KKwkKKyAgICBwdWJsaWMgUkJNYW5hZ2VyKFN0cmluZyBiYXNlQ2xhc3NOYW1lKSB7CisgICAgICAgIGFsbEJ1bmRsZUtleXMgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIGJ1bmRsZXMgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIGN1cnJlbnRVc2VyID0gIlVua25vd24iOworICAgICAgICBiYXNlQ2xhc3MgPSBiYXNlQ2xhc3NOYW1lOworICAgICAgICBjdXJyZW50RGlyZWN0b3J5ID0gbmV3IEZpbGUoIiIpOworCQkKKyAgICAgICAgQnVuZGxlIG1haW5CdW5kbGUgPSBuZXcgQnVuZGxlKCIiKTsKKyAgICAgICAgLy8gQ3JlYXRlIGEgZGVmYXVsdCBncm91cAorICAgICAgICBtYWluQnVuZGxlLmFkZEJ1bmRsZUdyb3VwKCJVbmdyb3VwZWQgSXRlbXMiLCAiVGhlc2UgYXJlIHJlc291cmNlIGl0ZW1zIHRoYXQgaGF2ZSBub3QgYmVlbiBhc3NpZ25lZCBhIGdyb3VwIik7CisgICAgICAgIGJ1bmRsZXMuYWRkRWxlbWVudChtYWluQnVuZGxlKTsKKyAgICB9CisJCisgICAgLyoqCisgICAgICogVGhpcyBpcyB0aGUgc3RhbmRhcmQgY29uc3RydWN0b3IgZm9yIFJCTWFuYWdlci4gSXQgaXMgY29uc3RydWN0ZWQgZnJvbSB0aGUgcm9vdCBvZiBhIHJlc291cmNlIGJ1bmRsZS4KKyAgICAgKiBJbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiwgZWFjaCBmaWxlIGlzIHBhcnNlZCBzZXBhcmF0ZWx5IHN0YXJ0aW5nIHdpdGggdGhlIGJhc2UgY2xhc3MgZmlsZSAocm9vdCkuCisgICAgICogSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiwgdGhlIGxvb2t1cCBrZXlzIGFyZSByZXByZXNlbnRlZCB0byB0aGUgdXNlciBhcyB0aGV5IGFwcGVhciBpbiB0aGUgZmlsZXMuIFRoZQorICAgICAqIHRyYW5zbGF0aW9uIHZhbHVlcyBob3dldmVyIGFyZSB0cmFuc2xhdGVkIGFjY29yZGluZyB0byB0aGUgYmFzaWMgcnVsZXMgZGVmaW5lZCBpbiBqYXZhLnV0aWwuUHJvcGVydGllcy4KKyAgICAgKiBUaHVzIGluIHRoZSBrZXksIHRoZSB1c2VyIG1heSBzZWUgJ1wiJyB3aGVuIGluIHRoZSB2YWx1ZSBpdCB3b3VsZCBoYXZlIGJlZW4gY29udmVydGVkIHRvICciJy4gVGhpcworICAgICAqIHRyYW5zbGF0aW9uIGlzIHJldmVyc2VkIHdoZW4gc2F2aW5nIHRoZSByZXNvdXJjZSBidW5kbGUuCisgICAgICogQHBhcmFtIG1haW5GaWxlIFRoZSBiYXNlIGNsYXNzIGZpbGUgb2YgdGhlIHJlc291cmNlIGJ1bmRsZSB0byBiZSByZWFkCisgICAgICovCisJCisgICAgcHVibGljIFJCTWFuYWdlcihGaWxlIG1haW5GaWxlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGluaXQoKTsKKwkJCisgICAgICAgIGN1cnJlbnREaXJlY3RvcnkgPSBuZXcgRmlsZShtYWluRmlsZS5nZXRQYXJlbnQoKSk7CisJCQorICAgICAgICBTdHJpbmdbXSBlbmNvZGluZ3M7CisJCQorICAgICAgICAvLyBJbml0aWFpbGl6ZSB0aGUgcmVhZGVycyB0byB0aGUgbWFpbiBOTFMgZmlsZQorICAgICAgICBGaWxlUmVhZGVyIGZyID0gbmV3IEZpbGVSZWFkZXIobWFpbkZpbGUpOworICAgICAgICBCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihmcik7CisJCQorICAgICAgICAvLyBMb2FkIHRoZSBqYXZhIHJlYWRhYmxlIHZhbHVlcyBmcm9tIHRoZSBtYWluIE5MUyBmaWxlOworICAgICAgICBQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBwLmxvYWQobmV3IEZpbGVJbnB1dFN0cmVhbShtYWluRmlsZSkpOworCQkKKyAgICAgICAgLy8gQ291bnQgdGhlIG51bWJlciBvZiBsYW5ndWFnZSBmaWxlcyBhbmQgc2V0IHVwIHRoZSBlbmNvZGluZyBhbmQgZGljdGlvbmFyeSBkYXRhCisgICAgICAgIGludCBudW1MYW5ndWFnZXMgPSAxOworICAgICAgICBTdHJpbmcgTkxTYmFzZUNsYXNzID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIE5MU3Bvc3RmaXggICA9IG51bGw7CisJCQorICAgICAgICBpZiAobWFpbkZpbGUuZ2V0TmFtZSgpLmluZGV4T2YoIi4iKSA+PSAwKSB7CisgICAgICAgICAgICBOTFNiYXNlQ2xhc3MgPSBtYWluRmlsZS5nZXROYW1lKCkuc3Vic3RyaW5nKDAsbWFpbkZpbGUuZ2V0TmFtZSgpLmluZGV4T2YoIi4iKSk7CisgICAgICAgICAgICBOTFNwb3N0Zml4ID0gIi5wcm9wZXJ0aWVzIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE5MU2Jhc2VDbGFzcyA9IG1haW5GaWxlLmdldE5hbWUoKTsKKyAgICAgICAgICAgIE5MU3Bvc3RmaXggPSAiIjsKKyAgICAgICAgfQorCQkKKyAgICAgICAgYmFzZUNsYXNzID0gTkxTYmFzZUNsYXNzOworICAgICAgICAKKyAgICAgICAgU3RyaW5nIGZpbGVQcmVmaXggPSBtYWluRmlsZS5nZXROYW1lKCkuc3Vic3RyaW5nKDAsbWFpbkZpbGUuZ2V0TmFtZSgpLmxhc3RJbmRleE9mKCIuIikpOworICAgICAgICBTdHJpbmcgZmlsZVBvc3RmaXggPSBtYWluRmlsZS5nZXROYW1lKCkuc3Vic3RyaW5nKG1haW5GaWxlLmdldE5hbWUoKS5sYXN0SW5kZXhPZigiLiIpLG1haW5GaWxlLmdldE5hbWUoKS5sZW5ndGgoKSk7CisgICAgICAgIEZpbGUgcmVzRGlyID0gY3VycmVudERpcmVjdG9yeTsKKyAgICAgICAgaWYgKHJlc0RpciAhPSBudWxsICYmIHJlc0Rpci5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICBTdHJpbmdbXSB0ZW1wID0gcmVzRGlyLmxpc3QoKTsKKyAgICAgICAgICAgIG51bUxhbmd1YWdlcyA9IDA7CisgICAgICAgICAgICAvLyBDb3VudCB0aGUgbnVtYmVyIG9mIGxhbmd1YWdlIGZpbGVzCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRlbXAubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAodGVtcFtpXS5zdGFydHNXaXRoKE5MU2Jhc2VDbGFzcykgJiYgKHRlbXBbaV0uZW5kc1dpdGgoTkxTcG9zdGZpeCkgCisgICAgICAgICAgICAgICAgICAgIHx8IHRlbXBbaV0uZW5kc1dpdGgoTkxTcG9zdGZpeC50b1VwcGVyQ2FzZSgpKSB8fCBOTFNwb3N0Zml4LmVxdWFscygiIikpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFN0YXJ0cyB3aXRoIHRoZSBiYXNlIGNsYXNzIG5hbWUgYW5kIGVuZHMgaW4gcHJvcGVyIHN1ZmZpeCAoYWJvdmUpCisgICAgICAgICAgICAgICAgICAgIC8vIEJhc2UgbmFtZSBpcyBmb2xsb3dlZCBieSAuIG9yIF8gKGJlbG93KQorICAgICAgICAgICAgICAgICAgICBSQk1hbmFnZXJHVUkuZGVidWdNc2coIkNoYXJhY3RlciBpczogIiArIHRlbXBbaV0uY2hhckF0KE5MU2Jhc2VDbGFzcy5sZW5ndGgoKSkpOworICAgICAgICAgICAgICAgICAgICBpZiAodGVtcFtpXS5jaGFyQXQoTkxTYmFzZUNsYXNzLmxlbmd0aCgpKSA9PSAnLicgfHwgdGVtcFtpXS5jaGFyQXQoTkxTYmFzZUNsYXNzLmxlbmd0aCgpKSA9PSAnXycpCisgICAgICAgICAgICAgICAgICAgICAgICBudW1MYW5ndWFnZXMrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBidW5kbGVzIGFuZCBlbmNvZGluZ3MKKyAgICAgICAgICAgIGVuY29kaW5ncyA9IG5ldyBTdHJpbmdbbnVtTGFuZ3VhZ2VzXTsKKwkJCQorICAgICAgICAgICAgaW50IGNvdW50ID0gMTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGVtcC5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICh0ZW1wW2ldLmVxdWFscyhtYWluRmlsZS5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nc1swXSA9ICIiOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGVtcFtpXS5zdGFydHNXaXRoKE5MU2Jhc2VDbGFzcykgJiYgKHRlbXBbaV0uZW5kc1dpdGgoTkxTcG9zdGZpeCkgCisgICAgICAgICAgICAgICAgICAgIHx8IHRlbXBbaV0uZW5kc1dpdGgoTkxTcG9zdGZpeC50b1VwcGVyQ2FzZSgpKSB8fCBOTFNwb3N0Zml4LmVxdWFscygiIikpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wW2ldLmNoYXJBdChOTFNiYXNlQ2xhc3MubGVuZ3RoKCkpID09ICcuJyB8fCB0ZW1wW2ldLmNoYXJBdChOTFNiYXNlQ2xhc3MubGVuZ3RoKCkpID09ICdfJykgeworICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmdzW2NvdW50XSA9IG5ldyBTdHJpbmcodGVtcFtpXS5zdWJzdHJpbmcoZmlsZVByZWZpeC5sZW5ndGgoKSsxLHRlbXBbaV0uaW5kZXhPZihmaWxlUG9zdGZpeCkpKTsJCQkJCQkJY291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIGJ1bmRsZXMgYW5kIGVuY29kaW5ncyBpbiBjYXNlIHRoZSBkaXJlY3RvcnkgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZQorICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCBvbmx5IHRoZSBtYWluIE5MUyBmaWxlIHdpbGwgYmUgaGFuZGxlZAorICAgICAgICAgICAgZW5jb2RpbmdzID0gbmV3IFN0cmluZ1tudW1MYW5ndWFnZXNdOworICAgICAgICAgICAgZW5jb2RpbmdzWzBdID0gbmV3IFN0cmluZygiIik7CisgICAgICAgIH0gLy8gZW5kIHRoZSBjb3VudCBhbmQgaW5pdGlhbGl6YXRpb24KKwkJCisgICAgICAgIC8vIFJlYWQgaW4gdGhlIGVudHJpZXMgZnJvbSB0aGUgbWFpbiBmaWxlCisgICAgICAgIFN0cmluZyBsaW5lOworICAgICAgICAvLyBTZXQgdGhlIGRpY3Rpb25hcnkgZm9yIHRoZSBtYWluIGZpbGUKKyAgICAgICAgQnVuZGxlIGRpY3QgPSBuZXcgQnVuZGxlKGVuY29kaW5nc1swXSk7CisgICAgICAgIGJ1bmRsZXMuYWRkRWxlbWVudChkaWN0KTsKKyAgICAgICAgLy8gU2V0IHVwIHRoZSBmaXJzdCBncm91cCBpbiBjYXNlIHRoZXJlIGFyZSBOTFMgaXRlbXMgd2hpY2ggd2VyZSBub3QgYXNzaWduZWQgdG8gYSBncm91cAorICAgICAgICBCdW5kbGVHcm91cCBncm91cCA9IG5ldyBCdW5kbGVHcm91cChkaWN0LCAiVW5ncm91cGVkIEl0ZW1zIik7CisgICAgICAgIGdyb3VwLnNldENvbW1lbnQoIk5MUyBJdGVtcyB3aGljaCB3ZXJlIG5vdCBpbml0aWFsbHkgYXNzaWduZWQgdG8gYSBncm91cCIpOworICAgICAgICBkaWN0LmFkZEJ1bmRsZUdyb3VwKGdyb3VwKTsKKyAgICAgICAgQnVuZGxlSXRlbSBpdGVtID0gbmV3IEJ1bmRsZUl0ZW0oZ3JvdXAsbnVsbCxudWxsKTsKKyAgICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgICAgd2hpbGUgKChsaW5lID0gYnIucmVhZExpbmUoKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gVGVzdCB0byBtYWtlIHN1cmUgdGhpcyBpcyBhIGZpbGUgdGhhdCB3YXMgZ2VuZXJhdGVkIGJ5IFJCTWFuYWdlcgorICAgICAgICAgICAgaWYgKCFsaW5lLnRyaW0oKS5lcXVhbHMoIiIpKSBjb3VudCsrOworICAgICAgICAgICAgaWYgKGNvdW50ID09IDEgJiYgIWxpbmUuc3RhcnRzV2l0aCgiIyBAZmlsZSIpKSB7CisgICAgICAgICAgICAgICAgLy8gTm90IGdlbmVyYXRlZCBieSBSQk1hbmFnZXIKKyAgICAgICAgICAgICAgICBKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyhudWxsLAorICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImVycm9yX25vdF9yYm1hbmFnZXJfZm9ybWF0IikgKyAiXG4iICsgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJlcnJvcl9zdWdnZXN0X2ltcG9ydF9wcm9wZXJ0aWVzIiksCisgICAgICAgICAgICAgICAgICAgIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX3RpdGxlX2Vycm9yX25vdF9yYm1hbmFnZXJfZm9ybWF0IiksIEpPcHRpb25QYW5lLkVSUk9SX01FU1NBR0UpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oIkltcHJvcGVyIGZvcm1hdCBmb3IgZmlsZTogIiArIG1haW5GaWxlLmdldE5hbWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmcgY29tbWVudExpbmUgPSBudWxsOworICAgICAgICAgICAgLy8gR3JhYiB0ZXh0IGZvbGxvd2luZyB0aGUgIyBzaWduCisgICAgICAgICAgICBpZiAobGluZS5pbmRleE9mKCIjIikgPj0gMCkgeworICAgICAgICAgICAgICAgIGNvbW1lbnRMaW5lID0gbGluZS5zdWJzdHJpbmcobGluZS5pbmRleE9mKCIjIikrMSxsaW5lLmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5zdWJzdHJpbmcoMCxsaW5lLmluZGV4T2YoIiMiKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY29tbWVudExpbmUgIT0gbnVsbCAmJiBjb21tZW50TGluZS50cmltKCkubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgLy8gUHJvY2VzcyBhbnkgaW5mb3JtYXRpb24gbWFkZSBhdmFpbGFibGUgaW4gY29tbWVudCAnQCcgaW5mb3JtYXRpb24KKyAgICAgICAgICAgICAgICBIYXNodGFibGUgZGVzY3JpcHRvcnMgPSBnZXREZXNjcmlwdG9ycyhudWxsLGNvbW1lbnRMaW5lKTsKKyAgICAgICAgICAgICAgICBpZiAoZGVzY3JpcHRvcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBPYmplY3QgbzsKKyAgICAgICAgICAgICAgICAgICAgLy8gRmlsZSB0YWdzCisgICAgICAgICAgICAgICAgICAgIG8gPSBkZXNjcmlwdG9ycy5nZXQoImZpbGUiKTsgaWYgKG8gIT0gbnVsbCkgZGljdC5uYW1lID0gKChTdHJpbmcpIG8pOworICAgICAgICAgICAgICAgICAgICBvID0gZGVzY3JpcHRvcnMuZ2V0KCJmaWxlQ29tbWVudCIpOyAgaWYgKG8gIT0gbnVsbCkgZGljdC5jb21tZW50ICA9ICgoU3RyaW5nKSBvKTsKKyAgICAgICAgICAgICAgICAgICAgbyA9IGRlc2NyaXB0b3JzLmdldCgiZmlsZUxhbmd1YWdlIik7IGlmIChvICE9IG51bGwpIGRpY3QubGFuZ3VhZ2UgPSAoKFN0cmluZykgbyk7CisgICAgICAgICAgICAgICAgICAgIG8gPSBkZXNjcmlwdG9ycy5nZXQoImZpbGVDb3VudHJ5Iik7ICBpZiAobyAhPSBudWxsKSBkaWN0LmNvdW50cnkgID0gKChTdHJpbmcpIG8pOworICAgICAgICAgICAgICAgICAgICBvID0gZGVzY3JpcHRvcnMuZ2V0KCJmaWxlVmFyaWFudCIpOyAgaWYgKG8gIT0gbnVsbCkgZGljdC52YXJpYW50ICA9ICgoU3RyaW5nKSBvKTsKKyAgICAgICAgICAgICAgICAgICAgbyA9IGRlc2NyaXB0b3JzLmdldCgiZmlsZU1hbmFnZXIiKTsgIGlmIChvICE9IG51bGwpIGRpY3QubWFuYWdlciAgPSAoKFN0cmluZykgbyk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAvLyBHcm91cCB0YWdzCisgICAgICAgICAgICAgICAgICAgIG8gPSBkZXNjcmlwdG9ycy5nZXQoImdyb3VwIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwID0gbmV3IEJ1bmRsZUdyb3VwKGRpY3QsIChTdHJpbmcpbyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnNldFBhcmVudEdyb3VwKGdyb3VwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpY3QuYWRkQnVuZGxlR3JvdXAoZ3JvdXApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG8gPSBkZXNjcmlwdG9ycy5nZXQoImdyb3VwQ29tbWVudCIpOyBpZiAobyAhPSBudWxsKSBncm91cC5zZXRDb21tZW50KChTdHJpbmcpIG8pOworCQkJCQkKKyAgICAgICAgICAgICAgICAgICAgLy8gSXRlbSB0YWdzCisgICAgICAgICAgICAgICAgICAgIG8gPSBkZXNjcmlwdG9ycy5nZXQoImNvbW1lbnQiKTsgICAgaWYgKG8gIT0gbnVsbCkgaXRlbS5zZXRDb21tZW50KChTdHJpbmcpIG8pOworICAgICAgICAgICAgICAgICAgICBvID0gZGVzY3JpcHRvcnMuZ2V0KCJ0cmFuc2xhdGVkIik7IGlmIChvICE9IG51bGwpIGl0ZW0uc2V0VHJhbnNsYXRlZCgoKFN0cmluZykgbykuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpKTsKKyAgICAgICAgICAgICAgICAgICAgbyA9IGRlc2NyaXB0b3JzLmdldCgiY3JlYXRvciIpOyAgICBpZiAobyAhPSBudWxsKSBpdGVtLnNldENyZWF0b3IoKFN0cmluZykgbyk7CisgICAgICAgICAgICAgICAgICAgIG8gPSBkZXNjcmlwdG9ycy5nZXQoIm1vZGlmaWVyIik7ICAgaWYgKG8gIT0gbnVsbCkgaXRlbS5zZXRNb2RpZmllcigoU3RyaW5nKSBvKTsKKyAgICAgICAgICAgICAgICAgICAgbyA9IGRlc2NyaXB0b3JzLmdldCgiY3JlYXRlZCIpOyAgICBpZiAobyAhPSBudWxsKSBpdGVtLnNldENyZWF0ZWREYXRlKChTdHJpbmcpIG8pOworICAgICAgICAgICAgICAgICAgICBvID0gZGVzY3JpcHRvcnMuZ2V0KCJtb2RpZmllZCIpOyAgIGlmIChvICE9IG51bGwpIGl0ZW0uc2V0TW9kaWZpZWREYXRlKChTdHJpbmcpIG8pOworCQkJCQkKKyAgICAgICAgICAgICAgICAgICAgLy8gTG9va3VwIHRhZ3MgKGUuZy4ge18jX30gX2Rlc2NyaXB0aW9uXykKKyAgICAgICAgICAgICAgICAgICAgRW51bWVyYXRpb24ga2V5cyA9IGRlc2NyaXB0b3JzLmtleXMoKTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGtleXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0YWcgPSAoU3RyaW5nKWtleXMubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWcuc3RhcnRzV2l0aCgieyIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhZy5pbmRleE9mKCJ9IikgPCAwKSBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbG9va3VwID0gdGFnLnN1YnN0cmluZygxLHRhZy5pbmRleE9mKCJ9IikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uZ2V0TG9va3VwcygpLnB1dChsb29rdXAsIGRlc2NyaXB0b3JzLmdldCh0YWcpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gCisgICAgICAgICAgICB9IC8vIGVuZCBjaGVjayBvZiBjb21tZW50IGxpbmUKKyAgICAgICAgICAgIGlmIChsaW5lLnRyaW0oKS5sZW5ndGgoKSA8IDEpIGNvbnRpbnVlOworCQkJCisgICAgICAgICAgICAvLyBHcmFiIHRoZSBuYW1lIGFuZCB2YWx1ZSAodHJhbnNsYXRpb24pIGZyb20gdGhlIGxpbmUKKyAgICAgICAgICAgIGludCBicmVha3BvaW50ID0gMDsKKyAgICAgICAgICAgIGJvb2xlYW4gc3RhcnRlZCA9IGZhbHNlOworICAgICAgICAgICAgY2hhciBhcnJheVtdID0gbGluZS50b0NoYXJBcnJheSgpOworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoIXN0YXJ0ZWQgJiYgYXJyYXlbaV0gIT0gJyAnICYmIGFycmF5W2ldICE9ICdcdCcpIHN0YXJ0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGlmIChzdGFydGVkICYmIChhcnJheVtpXSA9PSAnPScgfHwgYXJyYXlbaV0gPT0gJzonIHx8IGFycmF5W2ldID09ICcgJyB8fCBhcnJheVtpXSA9PSAnXHQnKSkgeworICAgICAgICAgICAgICAgICAgICBicmVha3BvaW50ID0gaTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nIGtleSA9IFN0cmluZy52YWx1ZU9mKGFycmF5LDAsYnJlYWtwb2ludCk7CisJCQkKKyAgICAgICAgICAgIGl0ZW0uc2V0S2V5KGtleSk7CisgICAgICAgICAgICBTdHJpbmcgdHJhbnNsYXRpb24gPSBwLmdldFByb3BlcnR5KGtleSk7CisgICAgICAgICAgICBpZiAodHJhbnNsYXRpb24gPT0gbnVsbCB8fCB0cmFuc2xhdGlvbi5lcXVhbHMoIiIpKQorICAgICAgICAgICAgICAgIGl0ZW0uc2V0VHJhbnNsYXRpb24obGluZS5zdWJzdHJpbmcobGluZS5pbmRleE9mKCI9IikrMSxsaW5lLmxlbmd0aCgpKS50cmltKCkpOworICAgICAgICAgICAgZWxzZSBpdGVtLnNldFRyYW5zbGF0aW9uKHRyYW5zbGF0aW9uKTsKKwkJCQorICAgICAgICAgICAgZGljdC5hZGRCdW5kbGVJdGVtKGl0ZW0pOworICAgICAgICAgICAgaXRlbSA9IG5ldyBCdW5kbGVJdGVtKGdyb3VwLG51bGwsbnVsbCk7CisgICAgICAgIH0gLy8gZW5kIHdoaWxlIC0gbWFpbiBOTFMgZmlsZQorCQkKKyAgICAgICAgLy8gTm93IHRoYXQgd2UgaGF2ZSBwYXJzZWQgdGhlIGVudGlyZSBtYWluIGxhbmd1YWdlIGZpbGUsIHBvcHVsYXRlIHRoZSBhbGxOTFNLZXkgc2V0IHdpdGggdGhlIGRpY3Rpb25hcnkga2V5cworICAgICAgICBhbGxCdW5kbGVLZXlzID0gbmV3IFZlY3RvcigpOworICAgICAgICBFbnVtZXJhdGlvbiBrZXlzID0gKChCdW5kbGUpYnVuZGxlcy5lbGVtZW50QXQoMCkpLmFsbEl0ZW1zLmtleXMoKTsKKyAgICAgICAgd2hpbGUgKGtleXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIGFsbEJ1bmRsZUtleXMuYWRkRWxlbWVudChrZXlzLm5leHRFbGVtZW50KCkpOworICAgICAgICB9CisJCQorICAgICAgICAvLyBOb3cgZ28gdGhyb3VnaCBhbGwgb2YgdGhlIG90aGVyIGxhbmd1YWdlcworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGVuY29kaW5ncy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGVuY29kaW5nc1tpXS5lcXVhbHMoImtyIikpIGNvbnRpbnVlOyAvLyBJIGNhbid0IGhhbmRsZSBkb3VibGUgYnl0ZSBjaGFyYWN0ZXIgc2V0cyB5ZXQKKyAgICAgICAgICAgIC8vIFRyeSB0byBvYnRhaW4gdGhlIG5ldyBmaWxlCisgICAgICAgICAgICBGaWxlIHRlbXBGaWxlID0gbmV3IEZpbGUocmVzRGlyLCBOTFNiYXNlQ2xhc3MgKyAiXyIgKyBlbmNvZGluZ3NbaV0gKyBOTFNwb3N0Zml4KTsKKyAgICAgICAgICAgIGZyID0gbmV3IEZpbGVSZWFkZXIodGVtcEZpbGUpOworICAgICAgICAgICAgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoZnIpOworCQkJCisgICAgICAgICAgICAvLyBUcnkgdG8gb2J0YWluIHRoZSBqYXZhIHJlYWRhYmxlIHByb3BlcnRpZXMgZm9yIHRoZSBmaWxlCisgICAgICAgICAgICBwID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgICAgIHAubG9hZChuZXcgRmlsZUlucHV0U3RyZWFtKHRlbXBGaWxlKSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFNldCB0aGUgZGljdGlvbmFyeSBmb3IgdGhlIG1haW4gZmlsZQorICAgICAgICAgICAgZGljdCA9IG5ldyBCdW5kbGUoZW5jb2RpbmdzW2ldKTsKKyAgICAgICAgICAgIGJ1bmRsZXMuYWRkRWxlbWVudChkaWN0KTsKKyAgICAgICAgICAgIC8vIFNldCB1cCB0aGUgZmlyc3QgZ3JvdXAgaW4gY2FzZSB0aGVyZSBhcmUgTkxTIGl0ZW1zIHdoaWNoIHdlcmUgbm90IGFzc2lnbmVkIHRvIGEgZ3JvdXAKKyAgICAgICAgICAgIGdyb3VwID0gbmV3IEJ1bmRsZUdyb3VwKGRpY3QsICJVbmdyb3VwZWQgSXRlbXMiKTsKKyAgICAgICAgICAgIGRpY3QuYWRkQnVuZGxlR3JvdXAoZ3JvdXApOworICAgICAgICAgICAgZ3JvdXAuc2V0Q29tbWVudCgiTkxTIEl0ZW1zIHdoaWNoIHdlcmUgbm90IGluaXRpYWxseSBhc3NpZ25lZCB0byBhIGdyb3VwIik7CisgICAgICAgICAgICBpdGVtID0gbmV3IEJ1bmRsZUl0ZW0oZ3JvdXAsbnVsbCxudWxsKTsKKyAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgcmVzdCBvZiB0aGUgZ3JvdXBzCisgICAgICAgICAgICB3aGlsZSAoKGxpbmUgPSBici5yZWFkTGluZSgpKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGNvbW1lbnRMaW5lID0gbnVsbDsKKyAgICAgICAgICAgICAgICAvLyBHcmFiIHRoZSB0ZXh0IGZvbGxvd2luZyB0aGUgIyBzaWduCisgICAgICAgICAgICAgICAgaWYgKGxpbmUuaW5kZXhPZigiIyIpID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgY29tbWVudExpbmUgPSBsaW5lLnN1YnN0cmluZyhsaW5lLmluZGV4T2YoIiMiKSsxLGxpbmUubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5zdWJzdHJpbmcoMCxsaW5lLmluZGV4T2YoIiMiKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjb21tZW50TGluZSAhPSBudWxsICYmIGNvbW1lbnRMaW5lLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gUHJvY2VzcyBhbnkgaW5mb3JtYXRpb24gbWFkZSBhdmFpbGFibGUgaW4gY29tbWVudCAnQCcgaW5mb3JtYXRpb24KKyAgICAgICAgICAgICAgICAgICAgSGFzaHRhYmxlIGRlc2NyaXB0b3JzID0gZ2V0RGVzY3JpcHRvcnMobnVsbCxjb21tZW50TGluZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdG9ycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgbzsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpbGUgdGFncworICAgICAgICAgICAgICAgICAgICAgICAgbyA9IGRlc2NyaXB0b3JzLmdldCgiZmlsZSIpOyBpZiAobyAhPSBudWxsKSBkaWN0Lm5hbWUgPSAoKFN0cmluZykgbyk7CisgICAgICAgICAgICAgICAgICAgICAgICBvID0gZGVzY3JpcHRvcnMuZ2V0KCJmaWxlQ29tbWVudCIpOyAgaWYgKG8gIT0gbnVsbCkgZGljdC5jb21tZW50ICA9ICgoU3RyaW5nKSBvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG8gPSBkZXNjcmlwdG9ycy5nZXQoImZpbGVMYW5ndWFnZSIpOyBpZiAobyAhPSBudWxsKSBkaWN0Lmxhbmd1YWdlID0gKChTdHJpbmcpIG8pOworICAgICAgICAgICAgICAgICAgICAgICAgbyA9IGRlc2NyaXB0b3JzLmdldCgiZmlsZUNvdW50cnkiKTsgIGlmIChvICE9IG51bGwpIGRpY3QuY291bnRyeSAgPSAoKFN0cmluZykgbyk7CisgICAgICAgICAgICAgICAgICAgICAgICBvID0gZGVzY3JpcHRvcnMuZ2V0KCJmaWxlVmFyaWFudCIpOyAgaWYgKG8gIT0gbnVsbCkgZGljdC52YXJpYW50ICA9ICgoU3RyaW5nKSBvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG8gPSBkZXNjcmlwdG9ycy5nZXQoImZpbGVNYW5hZ2VyIik7ICBpZiAobyAhPSBudWxsKSBkaWN0Lm1hbmFnZXIgID0gKChTdHJpbmcpIG8pOworCQkJCQkJCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBHcm91cCB0YWdzCisgICAgICAgICAgICAgICAgICAgICAgICBvID0gZGVzY3JpcHRvcnMuZ2V0KCJncm91cCIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwID0gbmV3IEJ1bmRsZUdyb3VwKGRpY3QsIChTdHJpbmcpbyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zZXRQYXJlbnRHcm91cChncm91cCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGljdC5hZGRCdW5kbGVHcm91cChncm91cCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBvID0gZGVzY3JpcHRvcnMuZ2V0KCJncm91cENvbW1lbnQiKTsgaWYgKG8gIT0gbnVsbCkgZ3JvdXAuc2V0Q29tbWVudCgoU3RyaW5nKSBvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXRlbSB0YWdzCisgICAgICAgICAgICAgICAgICAgICAgICBvID0gZGVzY3JpcHRvcnMuZ2V0KCJjb21tZW50Iik7ICAgIGlmIChvICE9IG51bGwpIGl0ZW0uc2V0Q29tbWVudCgoU3RyaW5nKSBvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG8gPSBkZXNjcmlwdG9ycy5nZXQoInRyYW5zbGF0ZWQiKTsgaWYgKG8gIT0gbnVsbCkgaXRlbS5zZXRUcmFuc2xhdGVkKCgoU3RyaW5nKSBvKS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpOworICAgICAgICAgICAgICAgICAgICAgICAgbyA9IGRlc2NyaXB0b3JzLmdldCgiY3JlYXRvciIpOyAgICBpZiAobyAhPSBudWxsKSBpdGVtLnNldENyZWF0b3IoKFN0cmluZykgbyk7CisgICAgICAgICAgICAgICAgICAgICAgICBvID0gZGVzY3JpcHRvcnMuZ2V0KCJtb2RpZmllciIpOyAgIGlmIChvICE9IG51bGwpIGl0ZW0uc2V0TW9kaWZpZXIoKFN0cmluZykgbyk7CisgICAgICAgICAgICAgICAgICAgICAgICBvID0gZGVzY3JpcHRvcnMuZ2V0KCJjcmVhdGVkIik7ICAgIGlmIChvICE9IG51bGwpIGl0ZW0uc2V0Q3JlYXRlZERhdGUoKFN0cmluZykgbyk7CisgICAgICAgICAgICAgICAgICAgICAgICBvID0gZGVzY3JpcHRvcnMuZ2V0KCJtb2RpZmllZCIpOyAgIGlmIChvICE9IG51bGwpIGl0ZW0uc2V0TW9kaWZpZWREYXRlKChTdHJpbmcpIG8pOworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBMb29rdXAgdGFncyAoZS5nLiB7XyNffSBfZGVzY3JpcHRpb25fKQorICAgICAgICAgICAgICAgICAgICAgICAgRW51bWVyYXRpb24gZGVzY0tleXMgPSBkZXNjcmlwdG9ycy5rZXlzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZGVzY0tleXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGFnID0gKFN0cmluZylkZXNjS2V5cy5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWcuc3RhcnRzV2l0aCgieyIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWcuaW5kZXhPZigifSIpIDwgMCkgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsb29rdXAgPSB0YWcuc3Vic3RyaW5nKDEsdGFnLmluZGV4T2YoIn0iKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uZ2V0TG9va3VwcygpLnB1dChsb29rdXAsIGRlc2NyaXB0b3JzLmdldCh0YWcpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0JCisgICAgICAgICAgICAgICAgfSAvLyBlbmQgY2hlY2sgb2YgY29tbWVudCBsaW5lCisgICAgICAgICAgICAgICAgaWYgKGxpbmUudHJpbSgpLmxlbmd0aCgpIDwgMSkgY29udGludWU7CisJCQkKKyAgICAgICAgICAgICAgICAvLyBHcmFiIHRoZSBuYW1lIGFuZCB2YWx1ZSAodHJhbnNsYXRpb24pIGZyb20gdGhlIGxpbmUKKyAgICAgICAgICAgICAgICBpbnQgYnJlYWtwb2ludCA9IDA7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBzdGFydGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgY2hhciBhcnJheVtdID0gbGluZS50b0NoYXJBcnJheSgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGo9MDsgaiA8IGFycmF5Lmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghc3RhcnRlZCAmJiBhcnJheVtqXSAhPSAnICcgJiYgYXJyYXlbal0gIT0gJ1x0Jykgc3RhcnRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydGVkICYmIChhcnJheVtqXSA9PSAnPScgfHwgYXJyYXlbal0gPT0gJzonIHx8IGFycmF5W2pdID09ICcgJyB8fCBhcnJheVtqXSA9PSAnXHQnKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtwb2ludCA9IGo7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gU3RyaW5nLnZhbHVlT2YoYXJyYXksMCxicmVha3BvaW50KTsKKyAgICAgICAgICAgICAgICBpdGVtLnNldEtleShrZXkpOworICAgICAgICAgICAgICAgIFN0cmluZyB0cmFuc2xhdGlvbiA9IHAuZ2V0UHJvcGVydHkoa2V5KTsKKyAgICAgICAgICAgICAgICBpZiAodHJhbnNsYXRpb24gPT0gbnVsbCB8fCB0cmFuc2xhdGlvbi5lcXVhbHMoIiIpKQorICAgICAgICAgICAgICAgICAgICBpdGVtLnNldFRyYW5zbGF0aW9uKGxpbmUuc3Vic3RyaW5nKGxpbmUuaW5kZXhPZigiPSIpKzEsbGluZS5sZW5ndGgoKSkudHJpbSgpKTsKKyAgICAgICAgICAgICAgICBlbHNlIGl0ZW0uc2V0VHJhbnNsYXRpb24odHJhbnNsYXRpb24pOworCQkJCQorICAgICAgICAgICAgICAgIGRpY3QuYWRkQnVuZGxlSXRlbShpdGVtKTsKKyAgICAgICAgICAgICAgICBpdGVtID0gbmV3IEJ1bmRsZUl0ZW0oZ3JvdXAsbnVsbCxudWxsKTsKKyAgICAgICAgICAgIH0gLy8gZW5kIHdoaWxlIC0gbmV4dCBsaW5lCisgICAgICAgIH0gLy8gZW5kIGZvciBsb29vcCB0aHJvdWdoIGxhbmd1YWdlcworICAgICAgICAvLyBBZGQgdGhpcyBvcGVuZWQgZmlsZSB0byBvdXIgcmVjZW50IGZpbGVzCisgICAgICAgIFByZWZlcmVuY2VzLmFkZFJlY2VudEZpbGVQcmVmZXJlbmNlKG1haW5GaWxlLmdldE5hbWUoKSwgbWFpbkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgIH0gLy8gZW5kIFJCTWFuYWdlcigpCisJCisgICAgLy8gKioqIE1FVEhPRFMgKioqCisJCisgICAgLyoqCisgICAgICogTWFpbgorICAgICAqLworCQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHsKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSB1c2VyIHNwZWNpZmllZCBhIHBhdGgKKyAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgMSkgeyAKKyAgICAgICAgICAgIG5ldyBSQk1hbmFnZXIoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0gLy8gbWFpbgorCQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7IHJldHVybiBiYXNlQ2xhc3M7IH0KKwkKKyAgICAvKioKKyAgICAgKiBXcml0ZSB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUgdG8gdGhlIG91dHB1dCBzdHJlYW0KKyAgICAgKi8KKwkKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvRmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnVuZGxlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IChCdW5kbGUpYnVuZGxlcy5lbGVtZW50QXQoaSk7CisgICAgICAgICAgICBGaWxlIG91dHB1dEZpbGUgPSBuZXcgRmlsZShjdXJyZW50RGlyZWN0b3J5LCBiYXNlQ2xhc3MgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYnVuZGxlLmVuY29kaW5nID09IG51bGwgfHwgYnVuZGxlLmVuY29kaW5nLmVxdWFscygiIikpID8gIiIgOiAiXyIgKyBidW5kbGUuZW5jb2RpbmcpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLnByb3BlcnRpZXMiKTsKKyAgICAgICAgICAgIEZpbGVXcml0ZXIgZncgPSBuZXcgRmlsZVdyaXRlcihvdXRwdXRGaWxlKTsKKyAgICAgICAgICAgIGJ1bmRsZS53cml0ZUNvbnRlbnRzKGZ3KTsKKyAgICAgICAgICAgIGZ3LmZsdXNoKCk7CisgICAgICAgICAgICBmdy5jbG9zZSgpOworICAgICAgICB9CisgICAgICAgIC8vIEluIGNhc2UgdGhpcyBpcyBhIG5ld2x5IGNyZWF0ZWQgYnVuZGxlIG9yIHRoZSBsb2NhdGlvbiBoYXMgY2hhbmdlZCByZWNlbnRseSwgdXBkYXRlIHRoZSByZWNlbnQgZmlsZXMsIHByZWZlcmVuY2UKKyAgICAgICAgUHJlZmVyZW5jZXMuYWRkUmVjZW50RmlsZVByZWZlcmVuY2UoYmFzZUNsYXNzICsgIi5wcm9wZXJ0aWVzIiwgY3VycmVudERpcmVjdG9yeS5nZXRBYnNvbHV0ZVBhdGgoKSArIEZpbGUuc2VwYXJhdG9yICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZUNsYXNzICsgIi5wcm9wZXJ0aWVzIik7CisgICAgfQorCQorICAgIC8qKgorICAgICAqIENhbGxpbmcgdGhpcyBtZXRob2QgcmVtb3ZlcyBhIHJlc291cmNlIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZS4gVGhpcyBtZXRob2QgZG9lcyBub3QgcGVybWFuZW50bHkKKyAgICAgKiBlcmFzZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZSByZXNvdXJjZXMgYXQgdGhpcyBlbmNvZGluZywgaG93ZXZlciBhbnkgY2hhbmdlcyBvciBzYXZlcyB0aGF0IHRha2UKKyAgICAgKiBwbGFjZSBvbmNlIHRoaXMgZmlsZSBoYXMgYmVlbiByZW1vdmVkIHdpbGwgbm90IGJlIHJlZmxlY3RlZCBpbiB0aGlzIGhpZGRlbiBmaWxlLiBUbyByZXN0b3JlIHRoZSByZXNvdXJjZSwgCisgICAgICogdGhlIGJ1bmRsZSB3aWxsIGhhdmUgdG8gYmUgcmVjcmVhdGVkLiAoVGhpcyBsYXN0IHBvaW50IG1heSBjaGFuZ2UpCisgICAgICovCisJCisgICAgcHVibGljIHZvaWQgaGlkZVJlc291cmNlKFN0cmluZyBlbmNvZGluZykgeworICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBidW5kbGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gKEJ1bmRsZSlidW5kbGVzLmVsZW1lbnRBdChpKTsKKyAgICAgICAgICAgIGlmIChidW5kbGUuZW5jb2RpbmcuZXF1YWxzKGVuY29kaW5nKSkgeworICAgICAgICAgICAgICAgIGJ1bmRsZXMucmVtb3ZlRWxlbWVudChidW5kbGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCQorICAgIC8qKgorICAgICAqIEVyYXNlcyBwZXJtYW5lbnRseSBvbmUgb2YgdGhlIHJlc291cmNlIGZpbGVzLiBCZSBjYXJlZnVsIGFib3V0IGNhbGxpbmcgdGhpcyBtZXRob2QgdGhlcmUgaXMgbm90aGluZyB5b3UgY2FuIGRvCisgICAgICogb25jZSBhIGZpbGUgaXMgZXJhc2VkLgorICAgICAqLworCQorICAgIHB1YmxpYyB2b2lkIGVyYXNlRmlsZShTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnVuZGxlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IChCdW5kbGUpYnVuZGxlcy5lbGVtZW50QXQoaSk7CisgICAgICAgICAgICBpZiAoIShidW5kbGUuZW5jb2RpbmcuZXF1YWxzKGVuY29kaW5nKSkpIGNvbnRpbnVlOworICAgICAgICAgICAgRmlsZSBvdXRwdXRGaWxlID0gbmV3IEZpbGUoY3VycmVudERpcmVjdG9yeSwgYmFzZUNsYXNzICsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGJ1bmRsZS5lbmNvZGluZyA9PSBudWxsIHx8IGJ1bmRsZS5lbmNvZGluZy5lcXVhbHMoIiIpKSA/ICIiIDogIl8iICsgYnVuZGxlLmVuY29kaW5nKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi5wcm9wZXJ0aWVzIik7CisgICAgICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSBvdXRwdXRGaWxlLmRlbGV0ZSgpOworICAgICAgICAgICAgaWYgKCFzdWNjZXNzKSB0aHJvdyBuZXcgSU9FeGNlcHRpb24oUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJlcnJvcl9kZWxldGlvbl9ub3RfcG9zc2libGUiKSk7CisgICAgICAgICAgICBoaWRlUmVzb3VyY2UoZW5jb2RpbmcpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisJCisgICAgLyoqCisgICAgICogV3JpdGVzIG9ubHkgb25lIG9mIHRoZSByZXNvdXJjZSBmaWxlcyB0byB0aGUgZmlsZSBzeXN0ZW0uIFRoaXMgZmlsZSBpcyBzcGVjaWZpZWQgYnkgdGhlIGVuY29kaW5nIHBhcmFtZXRlcgorICAgICAqLworCQorICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9GaWxlKFN0cmluZyBlbmNvZGluZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBidW5kbGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gKEJ1bmRsZSlidW5kbGVzLmVsZW1lbnRBdChpKTsKKyAgICAgICAgICAgIGlmIChidW5kbGUuZW5jb2RpbmcuZXF1YWxzKGVuY29kaW5nKSB8fCAoaT09MCAmJiBlbmNvZGluZy5lcXVhbHMoIiIpKSkgeworICAgICAgICAgICAgICAgIEZpbGUgb3V0cHV0RmlsZSA9IG5ldyBGaWxlKGN1cnJlbnREaXJlY3RvcnksIGJhc2VDbGFzcyArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYnVuZGxlLmVuY29kaW5nID09IG51bGwgfHwgYnVuZGxlLmVuY29kaW5nLmVxdWFscygiIikpID8gIiIgOiAiXyIgKyBidW5kbGUuZW5jb2RpbmcpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi5wcm9wZXJ0aWVzIik7CisgICAgICAgICAgICAgICAgRmlsZVdyaXRlciBmdyA9IG5ldyBGaWxlV3JpdGVyKG91dHB1dEZpbGUpOworICAgICAgICAgICAgICAgIGJ1bmRsZS53cml0ZUNvbnRlbnRzKGZ3KTsKKyAgICAgICAgICAgICAgICBmdy5mbHVzaCgpOworICAgICAgICAgICAgICAgIGZ3LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gSW4gY2FzZSB0aGlzIGlzIGEgbmV3bHkgY3JlYXRlZCBidW5kbGUgb3IgdGhlIGxvY2F0aW9uIGhhcyBjaGFuZ2VkIHJlY2VudGx5LCB1cGRhdGUgdGhlIHJlY2VudCBmaWxlcywgcHJlZmVyZW5jZQorICAgICAgICBQcmVmZXJlbmNlcy5hZGRSZWNlbnRGaWxlUHJlZmVyZW5jZShiYXNlQ2xhc3MgKyAiLnByb3BlcnRpZXMiLCBjdXJyZW50RGlyZWN0b3J5LmdldEFic29sdXRlUGF0aCgpICsgRmlsZS5zZXBhcmF0b3IgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlQ2xhc3MgKyAiLnByb3BlcnRpZXMiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHaXZlbiBhIEJ1bmRsZUl0ZW0gYW5kIHNvbWUgcHJvcGVydGllcyB0byBjaGFuZ2UgZm9yIHRoYXQgaXRlbSwgdGhpcyBtZXRob2QgZmlyc3QgY2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGUgcGFzc2VkCisgICAgICogaXRlbSBpcyB2YWxpZCBhbmQgaWYgaXQgaXMsIHRoZSBwcm9wZXJ0aWVzIG9mIHRoYXQgaXRlbSBhcmUgY2hhbmdlZCB0byByZWZsZWN0IHRob3NlIHBhc3NlZCBpbiBhcyBwYXJhbWV0ZXJzIHRvIHRoaXMKKyAgICAgKiBtZXRob2QuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBCdW5kbGVJdGVtIHdhcyB2YWxpZCBhbmQgdXBkYXRlYWJsZSwgZmFsc2UgaWYgb3RoZXJ3aXNlIChpbiB0aGlzIGNhc2Ugbm8gY2hhbmdlcyB3ZXJlIG1hZGUpLgorICAgICAqLworICAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBlZGl0SXRlbShCdW5kbGVJdGVtIGl0ZW0sIFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUsIFN0cmluZyBncm91cE5hbWUsIFN0cmluZyBjb21tZW50LCBIYXNodGFibGUgbG9va3VwcykgeworICAgICAgICBpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUuZXF1YWxzKCIiKSB8fCBncm91cE5hbWUgPT0gbnVsbCB8fCBncm91cE5hbWUuZXF1YWxzKCIiKSB8fCBpdGVtID09IG51bGwpIHJldHVybiBmYWxzZTsKKyAgICAgICAgU3RyaW5nIG9sZE5hbWUgPSBpdGVtLmdldEtleSgpOworICAgICAgICBTdHJpbmcgb2xkQ29tbWVudCA9IGl0ZW0uZ2V0Q29tbWVudCgpOworICAgICAgICBTdHJpbmcgb2xkVmFsdWUgPSBpdGVtLmdldFRyYW5zbGF0aW9uKCk7CisgICAgICAgIC8vU3RyaW5nIG9sZEdyb3VwTmFtZSA9IGl0ZW0uZ2V0UGFyZW50R3JvdXAoKS5nZXROYW1lKCk7CisgICAgICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgYnVuZGxlcworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ1bmRsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSAoQnVuZGxlKWJ1bmRsZXMuZWxlbWVudEF0KGkpOworICAgICAgICAgICAgQnVuZGxlSXRlbSBvbGRJdGVtID0gKEJ1bmRsZUl0ZW0pYnVuZGxlLmFsbEl0ZW1zLmdldChvbGROYW1lKTsKKyAgICAgICAgICAgIGlmIChvbGRJdGVtID09IG51bGwpIGJyZWFrOworICAgICAgICAgICAgaWYgKCFvbGROYW1lLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgIC8vIEEgbmV3IGtleQorICAgICAgICAgICAgICAgIG9sZEl0ZW0uc2V0S2V5KG5hbWUpOworICAgICAgICAgICAgICAgIGJ1bmRsZS5hbGxJdGVtcy5yZW1vdmUob2xkSXRlbSk7CisgICAgICAgICAgICAgICAgYnVuZGxlLmFsbEl0ZW1zLnB1dChvbGRJdGVtLmdldEtleSgpLCBvbGRJdGVtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvbGRJdGVtLmdldENvbW1lbnQoKSA9PSBudWxsIHx8IG9sZEl0ZW0uZ2V0Q29tbWVudCgpLmVxdWFscyhvbGRDb21tZW50KSkgb2xkSXRlbS5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICAgICAgaWYgKG9sZEl0ZW0uZ2V0VHJhbnNsYXRpb24oKS5lcXVhbHMob2xkVmFsdWUpKSBvbGRJdGVtLnNldFRyYW5zbGF0aW9uKHZhbHVlKTsKKyAgICAgICAgICAgIG9sZEl0ZW0uc2V0TG9va3Vwcyhsb29rdXBzKTsKKyAgICAgICAgICAgIGlmICghb2xkSXRlbS5nZXRQYXJlbnRHcm91cCgpLmdldE5hbWUoKS5lcXVhbHMoZ3JvdXBOYW1lKSkgeworICAgICAgICAgICAgICAgIC8vIEEgbmV3IGdyb3VwCisgICAgICAgICAgICAgICAgb2xkSXRlbS5nZXRQYXJlbnRHcm91cCgpLnJlbW92ZUJ1bmRsZUl0ZW0ob2xkSXRlbS5nZXRLZXkoKSk7CisgICAgICAgICAgICAgICAgQnVuZGxlR3JvdXAgYmcgPSBidW5kbGUuZ2V0QnVuZGxlR3JvdXAoZ3JvdXBOYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoYmcgPT0gbnVsbCkgYmcgPSBidW5kbGUuZ2V0VW5ncm91cGVkR3JvdXAoKTsKKyAgICAgICAgICAgICAgICBvbGRJdGVtLnNldFBhcmVudEdyb3VwKGJnKTsKKyAgICAgICAgICAgICAgICBiZy5hZGRCdW5kbGVJdGVtKG9sZEl0ZW0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKwkKKyAgICAvKioKKyAgICAgKiBBdHRlbXB0cyB0byBjcmVhdGUgYSBuZXcgaXRlbSBpbiBlYWNoIG9mIHRoZSBsYW5ndWFnZSBmaWxlcy4gVGhlIG1ldGhvZCBmaXJzdCBjaGVja3MgdGhlIGJhc2UgUmVzb3VyY2UgQnVuZGxlCisgICAgICogdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGl0ZW0gbmFtZSBkb2VzIG5vdCBhbGwgcmVhZHkgZXhpc3QuIElmIGl0IGRvZXMgZXhpc3QgdGhlIGl0ZW0gaXMgbm90IGNyZWF0ZWQuCisgICAgICogQHBhcmFtIG5hbWUgVGhlIHVuaXF1ZSBrZXkgb2YgdGhlIGl0ZW0KKyAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHRyYW5zbGF0aW9uIG9mIHRoZSBpdGVtIGZvciB0aGUgYmFzZSBjbGFzcworICAgICAqIEBwYXJhbSBncm91cE5hbWUgVGhlIGdyb3VwIG5hbWUsIHNob3VsZCBhbGwgcmVhZHkgZXhpc3QgaW4gdGhlIGJhc2UgY2xhc3MKKyAgICAgKiBAcGFyYW0gY29tbWVudCBBbiBvcHRpb25hbCBjb21tZW50IHRvIGJlIGFkZGVkIHRvIHRoZSBpdGVtLCBjYW4gYmUgPENPREU+bnVsbDwvQ09ERT4KKyAgICAgKiBAcmV0dXJuIEFuIGVycm9yIHJlc3BvbnNlLiBJZiB0aGUgY3JlYXRpb24gd2FzIHN1Y2Nlc3NmdWwgPENPREU+dHJ1ZTwvQ09ERT4gaXMgcmV0dXJuZWQsIGlmIHRoZXJlIHdhcyBhbiBlcnJvciA8Q09ERT5mYWxzZTwvQ09ERT4gaXMgcmV0dXJuZWQuCisgICAgICovCisJCisgICAgcHVibGljIGJvb2xlYW4gY3JlYXRlSXRlbShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlLCBTdHJpbmcgZ3JvdXBOYW1lLCBTdHJpbmcgY29tbWVudCwgSGFzaHRhYmxlIGxvb2t1cHMpIHsKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLmVxdWFscygiIikgfHwgZ3JvdXBOYW1lID09IG51bGwgfHwgZ3JvdXBOYW1lLmVxdWFscygiIikpIHJldHVybiBmYWxzZTsKKyAgICAgICAgQnVuZGxlIG1haW5CdW5kbGUgPSAoQnVuZGxlKWJ1bmRsZXMuZmlyc3RFbGVtZW50KCk7CisgICAgICAgIEJ1bmRsZUdyb3VwIG1haW5Hcm91cCA9IG51bGw7CisgICAgICAgIGlmIChtYWluQnVuZGxlLmFsbEl0ZW1zLmNvbnRhaW5zS2V5KG5hbWUpKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IG1haW5CdW5kbGUuZ2V0R3JvdXBDb3VudCgpOyBpKyspIHsKKyAgICAgICAgICAgIEJ1bmRsZUdyb3VwIGJnID0gbWFpbkJ1bmRsZS5nZXRCdW5kbGVHcm91cChpKTsKKyAgICAgICAgICAgIGlmIChiZy5nZXROYW1lKCkuZXF1YWxzKGdyb3VwTmFtZSkpIHttYWluR3JvdXAgPSBiZzsgYnJlYWs7fQorICAgICAgICB9CisgICAgICAgIGlmIChtYWluR3JvdXAgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOworICAgICAgICAvLyBBZGQgdG8gdGhlIGJhc2UgY2xhc3MKKyAgICAgICAgQnVuZGxlSXRlbSBtYWluSXRlbSA9IG5ldyBCdW5kbGVJdGVtKG1haW5Hcm91cCwgbmFtZSwgdmFsdWUpOworICAgICAgICBtYWluSXRlbS5zZXRUcmFuc2xhdGVkKHRydWUpOworICAgICAgICBtYWluSXRlbS5zZXRDcmVhdG9yKGN1cnJlbnRVc2VyKTsKKyAgICAgICAgbWFpbkl0ZW0uc2V0TW9kaWZpZXIoY3VycmVudFVzZXIpOworICAgICAgICBtYWluSXRlbS5zZXRDb21tZW50KGNvbW1lbnQpOworICAgICAgICBtYWluQnVuZGxlLmFsbEl0ZW1zLnB1dChuYW1lLCBtYWluSXRlbSk7CisgICAgICAgIG1haW5Hcm91cC5hZGRCdW5kbGVJdGVtKG1haW5JdGVtKTsKKyAgICAgICAgaWYgKGxvb2t1cHMgIT0gbnVsbCkgbWFpbkl0ZW0uc2V0TG9va3Vwcyhsb29rdXBzKTsKKyAgICAgICAgLy8gQWRkIHRvIHRoZSByZXN0IG9mIHRoZSBidW5kbGVzCisgICAgICAgIGZvciAoaW50IGk9MTsgaSA8IGJ1bmRsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSAoQnVuZGxlKWJ1bmRsZXMuZWxlbWVudEF0KGkpOworICAgICAgICAgICAgLy8gRmluZCB0aGUgZ3JvdXAKKyAgICAgICAgICAgIEJ1bmRsZUdyb3VwIGdyb3VwID0gbnVsbDsKKyAgICAgICAgICAgIGZvciAoaW50IGo9MDsgaiA8IGJ1bmRsZS5nZXRHcm91cENvdW50KCk7IGorKykgeworICAgICAgICAgICAgICAgIEJ1bmRsZUdyb3VwIGJnID0gYnVuZGxlLmdldEJ1bmRsZUdyb3VwKGopOworICAgICAgICAgICAgICAgIGlmIChiZy5nZXROYW1lKCkuZXF1YWxzKGdyb3VwTmFtZSkpIHtncm91cCA9IGJnOyBicmVhazt9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZ3JvdXAgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGdyb3VwID0gbmV3IEJ1bmRsZUdyb3VwKGJ1bmRsZSwgZ3JvdXBOYW1lKTsKKyAgICAgICAgICAgICAgICBidW5kbGUuYWRkQnVuZGxlR3JvdXAoZ3JvdXApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQnVuZGxlSXRlbSBpdGVtID0gbmV3IEJ1bmRsZUl0ZW0oZ3JvdXAsIG5hbWUsIHZhbHVlKTsKKyAgICAgICAgICAgIGl0ZW0uc2V0Q3JlYXRvcihjdXJyZW50VXNlcik7CisgICAgICAgICAgICBpdGVtLnNldE1vZGlmaWVyKGN1cnJlbnRVc2VyKTsKKyAgICAgICAgICAgIGl0ZW0uc2V0Q29tbWVudChjb21tZW50KTsKKyAgICAgICAgICAgIGlmIChsb29rdXBzICE9IG51bGwpIGl0ZW0uc2V0TG9va3Vwcyhsb29rdXBzKTsKKyAgICAgICAgICAgIGJ1bmRsZS5hbGxJdGVtcy5wdXQobmFtZSwgaXRlbSk7CisgICAgICAgICAgICBidW5kbGUuYWRkVW50cmFuc2xhdGVkSXRlbShpdGVtKTsKKyAgICAgICAgICAgIGdyb3VwLmFkZEJ1bmRsZUl0ZW0oaXRlbSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEF0dGVtcHRzIHRvIGNyZWF0ZSBhIG5ldyBncm91cCBpbiBlYWNoIG9mIHRoZSBsYW5ndWFnZSBmaWxlcy4gVGhlIG1ldGhvZCBmaXJzdCBjaGVja3MgdGhlIGJhc2UgUmVzb3VyY2UgQnVuZGxlCisgICAgICogdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGdyb3VwIG5hbWUgZG9lcyBub3QgYWxsIHJlYWR5IGV4aXN0LiBJZiBpdCBkb2VzIGV4aXN0IHRoZSBncm91cCBpcyBub3QgY3JlYXRlZC4KKyAgICAgKiBAcGFyYW0gZ3JvdXBOYW1lIFRoZSB1bmlxdWUgZ3JvdXAgbmFtZSB0byBiZSBjcmVhdGVkCisgICAgICogQHBhcmFtIGdyb3VwQ29tbWVudCBBbiBvcHRpb25hbCBjb21tZW50IHRvIGJlIGFkZGVkIHRvIHRoZSBncm91cCwgY2FuIGJlIDxDT0RFPm51bGw8L0NPREU+CisgICAgICogQHJldHVybiBBbiBlcnJvciByZXNwb25zZS4gSWYgdGhlIGNyZWF0aW9uIHdhcyBzdWNjZXNzZnVsIDxDT0RFPnRydWU8L0NPREU+IGlzIHJldHVybmVkLCBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgPENPREU+ZmFsc2U8L0NPREU+IGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNyZWF0ZUdyb3VwKFN0cmluZyBncm91cE5hbWUsIFN0cmluZyBncm91cENvbW1lbnQpIHsKKyAgICAgICAgaWYgKGdyb3VwTmFtZSA9PSBudWxsIHx8IGdyb3VwTmFtZS5lcXVhbHMoIiIpKQorICAgICAgICAJcmV0dXJuIGZhbHNlOworICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIGdyb3VwIGV4aXN0cworICAgICAgICBCdW5kbGUgbWFpbkJ1bmRsZSA9IChCdW5kbGUpYnVuZGxlcy5maXJzdEVsZW1lbnQoKTsKKyAgICAgICAgaWYgKG1haW5CdW5kbGUuaGFzR3JvdXAoZ3JvdXBOYW1lKSkKKyAgICAgICAgCXJldHVybiBmYWxzZTsKKwkJCisgICAgICAgIC8vIENyZWF0ZSB0aGUgZ3JvdXAKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgYnVuZGxlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IChCdW5kbGUpYnVuZGxlcy5lbGVtZW50QXQoaSk7CisgICAgICAgICAgICBCdW5kbGVHcm91cCBiZyA9IG5ldyBCdW5kbGVHcm91cChidW5kbGUsIGdyb3VwTmFtZSk7CisgICAgICAgICAgICBpZiAoZ3JvdXBDb21tZW50ICE9IG51bGwpCisgICAgICAgICAgICAJYmcuc2V0Q29tbWVudChncm91cENvbW1lbnQpOworICAgICAgICAgICAgYnVuZGxlLmFkZEJ1bmRsZUdyb3VwKGJnKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisJCisgICAgLyoqCisgICAgICogUmVtb3ZlcyBhIGdyb3VwIGFuZCBhbGwgb2YgdGhlIGl0ZW1zIHdpdGhpbiB0aGF0IGdyb3VwIGZyb20gdGhlIHZhcmlvdXMKKyAgICAgKiBSZXNvdXJjZSBCdW5kbGVzIGtub3duIHRvIHRoZSBzeXN0ZW0uIFRoaXMgbWV0aG9kIHJlbW92ZXMgdGhlIGdyb3VwIGZyb20KKyAgICAgKiB0aGUgcHJvdGVjdGVkIHZlY3RvciBvZiBncm91cHMsIHRoZW4gcmVtb3ZlcyBhbGwgaXRlbXMgaW4gdGhhdCBncm91cCBmcm9tCisgICAgICogdGhlIHByb3RlY3RlZCB2ZWN0b3Igb2YgdW50cmFuc2xhdGVkIGl0ZW1zLCBhbmQgdGhlIHByb3RlY3RlZCBoYXNodGFibGUgb2YKKyAgICAgKiBhbGwgaXRlbXMuCisgICAgICovCisJCisgICAgcHVibGljIHZvaWQgZGVsZXRlR3JvdXAoU3RyaW5nIGdyb3VwTmFtZSkgeworICAgICAgICBpZiAoZ3JvdXBOYW1lID09IG51bGwpIHJldHVybjsKKyAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCBvZiB0aGUgYnVuZGxlczsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgYnVuZGxlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IChCdW5kbGUpYnVuZGxlcy5lbGVtZW50QXQoaSk7CisgICAgICAgICAgICBidW5kbGUucmVtb3ZlR3JvdXAoZ3JvdXBOYW1lKTsKKyAgICAgICAgfQorICAgIH0KKwkKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgcmVzb3VyY2UgaXRlbXMgb2YgdGhlIGdpdmVuIG5hbWUgZnJvbSBlYWNoIG9mIHRoZSByZXNvdXJjZSBidW5kbGVzIHRoYXQgdGhlIHN5c3RlbQorICAgICAqIGtub3dzIGFib3V0LiBUaGlzIHdvcmtzIGJ5IGZpcnN0IHJlbW92aW5nIHRoZSBpdGVtIGZyb20gdGhlIHByb3RlY3RlZCB2ZWN0b3Igb2YgdHJhbnNsYXRlZAorICAgICAqIGl0ZW1zLCBpZiBpdCBpcyB0aGVyZSwgYW5kIHRoZW4gcmVtb3ZpbmcgaXQgZnJvbSB0aGUgdGhlIGhhc2h0YWJsZSBvZiBhbGwgaXRlbXMsIGFuZCB0aGVuCisgICAgICogcmVtb3ZpbmcgaXQgZnJvbSBpdHMgcmVzcGVjdGl2ZSBncm91cC4gCisgICAgICovCisJCisgICAgcHVibGljIHZvaWQgZGVsZXRlSXRlbShTdHJpbmcgaXRlbU5hbWUpIHsKKyAgICAgICAgaWYgKGl0ZW1OYW1lID09IG51bGwpIHJldHVybjsKKyAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCBvZiB0aGUgYnVuZGxlczsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgYnVuZGxlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgLy8gTG9vcCB0aHJvdWdoIHVudHJhbnNsYXRlZCBpdGVtcworICAgICAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IChCdW5kbGUpYnVuZGxlcy5lbGVtZW50QXQoaSk7CisgICAgICAgICAgICBidW5kbGUucmVtb3ZlVW50cmFuc2xhdGVkSXRlbShpdGVtTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCBJdGVtcworICAgICAgICAgICAgRW51bWVyYXRpb24gaXRlbXMgPSBidW5kbGUuYWxsSXRlbXMuZWxlbWVudHMoKTsKKyAgICAgICAgICAgIHdoaWxlKGl0ZW1zLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgQnVuZGxlSXRlbSBpdGVtID0gKEJ1bmRsZUl0ZW0paXRlbXMubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBpZiAoaXRlbS5nZXRLZXkoKS5lcXVhbHMoaXRlbU5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1bmRsZS5hbGxJdGVtcy5yZW1vdmUoaXRlbSk7CisgICAgICAgICAgICAgICAgICAgIGl0ZW0uZ2V0UGFyZW50R3JvdXAoKS5yZW1vdmVCdW5kbGVJdGVtKGl0ZW0uZ2V0S2V5KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwkKKyAgICAvKioKKyAgICAgKiBMb29rcyB0aHJvdWdoIHRoZSByZXNvdXJjZXMgY29udGFpbmVkIGluIHRoZSBidW5kbGUgZm9yIGEgcmVzb3VyY2Ugb2YgdGhlIGdpdmVuIGVuY29kaW5nLiBOb3RlIHRoYXQgdGhpcworICAgICAqIHNlYXJjaCBpcyBjYXNlIHNlbnNpdGl2ZS4KKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGVuY29kaW5nIGV4aXN0cyBhcyBvbmUgb2YgdGhlIHJlc291cmNlIGZpbGVzLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKwkKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNSZXNvdXJjZShTdHJpbmcgZW5jb2RpbmcpIHsKKyAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBlbmNvZGluZyBleGlzdHMKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgYnVuZGxlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgQnVuZGxlIGIgPSAoQnVuZGxlKWJ1bmRsZXMuZWxlbWVudEF0KGkpOworICAgICAgICAgICAgaWYgKGIuZW5jb2RpbmcuZXF1YWxzKGVuY29kaW5nKSkgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwkKKyAgICAvKioKKyAgICAgKiBBdHRlbXB0cyB0byBjcmVhdGUgYSBuZXcgcmVzb3VyY2UgZmlsZSB3aXRoIHRoZSBnaXZlbiBlbmNvZGluZy4gVGhlIG1ldGhvZCBmaXJzdCBjaGVja3MgdGhlIGJhc2UgUmVzb3VyY2UgQnVuZGxlCisgICAgICogdG8gbWFrZSBzdXJlIHRoYXQgZW5jb2RpbmcgZG9lcyBub3QgYWxsIHJlYWR5IGV4aXN0LiBJZiBpdCBkb2VzIGV4aXN0IHRoZSByZXNvdXJjZSBmaWxlIGlzIG5vdCBjcmVhdGVkLgorICAgICAqIEBwYXJhbSB0aXRsZSBBbiBvcHRpb25hbCwgcXVpY2sgdGl0bGUgZm9yIHRoZSBmaWxlLCBjYW4gYmUgPENPREU+bnVsbDwvQ09ERT4KKyAgICAgKiBAcGFyYW0gY29tbWVudCBBbiBvcHRpb25hbCBjb21tZW50IHRvIGJlIGFkZGVkIHRvIHRoZSByZXNvdXJjZSwgY2FuIGJlIDxDT0RFPm51bGw8L0NPREU+CisgICAgICogQHBhcmFtIG1hbmFnZXIgVGhlIG5hbWUgb2YgdGhlIHBlcnNvbiByZXNwb25zaWJsZSBmb3IgdGhpcyByZXNvdXJjZSwgY2FuIGJlIDxDT0RFPm51bGw8L0NPREU+CisgICAgICogQHBhcmFtIGVuY29kaW5nIFRoZSBwcm9wZXIgZW5jb2RpbmcgZm9yIHRoZSByZXNvdXJjZS4gTXVzdCBiZSBvZiBmb3JtICdsYW5ndWFnZScsICdsYW5ndWFnZV9jb3VudHJ5Jywgb3IgJ2xhbmd1YWdlX2NvdW50cnlfdmFyaWFudCcKKyAgICAgKiBAcGFyYW0gbGFuZ3VhZ2UgQSBtb3JlIGZvcm1hbCBuYW1lIGZvciB0aGUgbGFuZ3VhZ2UgKGUuZy4gJ0VuZ2xpc2gnLCAnRGV1dHNjaCcsIGV0Yy4pLCBjYW4gYmUgPENPREU+bnVsbDwvQ09ERT4KKyAgICAgKiBAcGFyYW0gY291bnRyeSBBIG1vcmUgZm9ybWFsIG5hbWUgZm9yIHRoZSBjb3VudHJ5IGRlc2NyaWJlZCBieSB0aGUgcmVzb3VyY2UsIGNhbiBiZSA8Q09ERT5udWxsPC9DT0RFPgorICAgICAqIEBwYXJhbSB2YXJpYW50IEEgbW9yZSBmb3JtYWwgbmFtZSBmb3IgdGhlIHZhcmlhbnQgZGVzY3JpYmVkIGJ5IHRoZSByZXNvdXJjZSwgY2FuIGJlIDxDT0RFPm51bGw8L0NPREU+CisgICAgICogQHBhcmFtIGNvcHlWYWx1ZXMgQW4gaW5kaWNhdGlvbiBvZiB3ZXRoZXIgb3Igbm90IHRvIHBvcHVsYXRlIHRoZSByZXNvdXJjZSB3aXRoIHRoZSBpdGVtcyBpbiB0aGUgYmFzZSBjbGFzcworICAgICAqIEByZXR1cm4gQW4gZXJyb3IgcmVzcG9uc2UuIElmIHRoZSBjcmVhdGlvbiB3YXMgc3VjY2Vzc2Z1bCA8Q09ERT50cnVlPC9DT0RFPiBpcyByZXR1cm5lZCwgaWYgdGhlcmUgd2FzIGFuIGVycm9yIDxDT0RFPmZhbHNlPC9DT0RFPiBpcyByZXR1cm5lZC4KKyAgICAgKi8KKwkKKyAgICBwdWJsaWMgYm9vbGVhbiBjcmVhdGVSZXNvdXJjZShTdHJpbmcgdGl0bGUsIFN0cmluZyBjb21tZW50LCBTdHJpbmcgbWFuYWdlciwgU3RyaW5nIGVuY29kaW5nLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFuZ3VhZ2UsIFN0cmluZyBjb3VudHJ5LCBTdHJpbmcgdmFyaWFudCwgYm9vbGVhbiBjb3B5VmFsdWVzKSB7CisgICAgICAgIGlmIChlbmNvZGluZyA9PSBudWxsIHx8IGVuY29kaW5nLmVxdWFscygiIikgfHwgZW5jb2Rpbmcuc3RhcnRzV2l0aCgiXyIpKSByZXR1cm4gZmFsc2U7CisgICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgZW5jb2RpbmcgZXhpc3RzCisgICAgICAgIGlmIChoYXNSZXNvdXJjZShlbmNvZGluZykpIHJldHVybiBmYWxzZTsKKyAgICAgICAgLy8gQ3JlYXRlIHRoZSByZXNvdXJjZQorICAgICAgICBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZShlbmNvZGluZyk7CisgICAgICAgIGJ1bmRsZS5uYW1lID0gdGl0bGU7CisgICAgICAgIGJ1bmRsZS5jb21tZW50ID0gY29tbWVudDsKKyAgICAgICAgYnVuZGxlLm1hbmFnZXIgPSBtYW5hZ2VyOworICAgICAgICBidW5kbGUubGFuZ3VhZ2UgPSBsYW5ndWFnZTsKKyAgICAgICAgYnVuZGxlLmNvdW50cnkgPSBjb3VudHJ5OworICAgICAgICBidW5kbGUudmFyaWFudCA9IHZhcmlhbnQ7CisJCQorICAgICAgICAvLyBDcmVhdGUgYSBkZWZhdWx0IGdyb3VwCisgICAgICAgIGJ1bmRsZS5hZGRCdW5kbGVHcm91cCgiVW5ncm91cGVkIEl0ZW1zIiwgIlRoZXNlIGFyZSByZXNvdXJjZSBpdGVtcyB0aGF0IGhhdmUgbm90IGJlZW4gYXNzaWduZWQgYSBncm91cCIpOworICAgICAgICAKKyAgICAgICAgaWYgKGNvcHlWYWx1ZXMpIHsKKyAgICAgICAgICAgIEJ1bmRsZSBtYWluQnVuZGxlID0gKEJ1bmRsZSlidW5kbGVzLmZpcnN0RWxlbWVudCgpOworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgbWFpbkJ1bmRsZS5nZXRHcm91cENvdW50KCk7IGkrKykgeworICAgICAgICAgICAgICAgIEJ1bmRsZUdyb3VwIG1haW5Hcm91cCA9IG1haW5CdW5kbGUuZ2V0QnVuZGxlR3JvdXAoaSk7CisgICAgICAgICAgICAgICAgQnVuZGxlR3JvdXAgYmcgPSBuZXcgQnVuZGxlR3JvdXAoYnVuZGxlLG1haW5Hcm91cC5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIGJnLnNldENvbW1lbnQobWFpbkdyb3VwLmdldENvbW1lbnQoKSk7CisgICAgICAgICAgICAgICAgYnVuZGxlLmFkZEJ1bmRsZUdyb3VwKGJnKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqPTA7IGogPCBtYWluR3JvdXAuZ2V0SXRlbUNvdW50KCk7IGorKykgeworICAgICAgICAgICAgICAgICAgICBCdW5kbGVJdGVtIG1haW5JdGVtID0gbWFpbkdyb3VwLmdldEJ1bmRsZUl0ZW0oaik7CisgICAgICAgICAgICAgICAgICAgIEJ1bmRsZUl0ZW0gaXRlbSA9IG5ldyBCdW5kbGVJdGVtKGJnLCBtYWluSXRlbS5nZXRLZXkoKSwgbWFpbkl0ZW0uZ2V0VHJhbnNsYXRpb24oKSk7CisgICAgICAgICAgICAgICAgICAgIGl0ZW0uc2V0Q29tbWVudChtYWluSXRlbS5nZXRDb21tZW50KCkpOworICAgICAgICAgICAgICAgICAgICBpdGVtLnNldENyZWF0b3IobWFpbkl0ZW0uZ2V0Q3JlYXRvcigpKTsKKyAgICAgICAgICAgICAgICAgICAgaXRlbS5zZXRNb2RpZmllcihtYWluSXRlbS5nZXRNb2RpZmllcigpKTsKKyAgICAgICAgICAgICAgICAgICAgaXRlbS5zZXRMb29rdXBzKG5ldyBIYXNodGFibGUoKSk7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IFRoaXMgc2hvdWxkIGJlIGRvbmUgaW4gdGhlIEJ1bmRsZSBjbGFzcworICAgICAgICAgICAgICAgICAgICBFbnVtZXJhdGlvbiBrZXlzID0gbWFpbkl0ZW0uZ2V0TG9va3VwcygpLmtleXMoKTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGtleXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZylrZXlzLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKW1haW5JdGVtLmdldExvb2t1cHMoKS5nZXQobmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmdldExvb2t1cHMoKS5wdXQobmV3IFN0cmluZyhuYW1lKSwgbmV3IFN0cmluZyh2YWx1ZSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJnLmFkZEJ1bmRsZUl0ZW0oaXRlbSk7CisgICAgICAgICAgICAgICAgICAgIGJ1bmRsZS5hZGRVbnRyYW5zbGF0ZWRJdGVtKGl0ZW0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCQkKKyAgICAgICAgYnVuZGxlcy5hZGRFbGVtZW50KGJ1bmRsZSk7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZHVwbGljYXRlIE5MUyBlbnRyaWVzCisgICAgICovCisJCisgICAgcHVibGljIGludCBnZXROdW1iZXJEdXBsaWNhdGVzKCkgeworICAgICAgICByZXR1cm4gKChCdW5kbGUpYnVuZGxlcy5maXJzdEVsZW1lbnQoKSkuZHVwbGljYXRlcy5zaXplKCk7CisgICAgfQorCQorICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzaW5nbGUgc3RyaW5nIHdpdGggYSBjb21tYSBkZWxpbWl0ZWQgbGlzdGluZyBvZiBhbGwgZHVwbGljYXRlIGVudHJpZXMgZm91bmQgaW4gdGhlIE5MUyByZXNvdXJjZXMKKyAgICAgKi8KKwkKKyAgICBwdWJsaWMgU3RyaW5nIGdldER1cGxpY2F0ZXNMaXN0aW5nKCkgeworICAgICAgICByZXR1cm4gbGlzdFN0cmluZ3MoZ2V0RHVwbGljYXRlc0xpc3RpbmdWZWN0b3IoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIFZlY3RvciBjb2xsZWN0aW9uIG9mIGR1cGxpY2F0ZSBCdW5kbGVJdGVtcyBmb3VuZCBpbiB0aGUgYnVuZGxlCisgICAgICovCisJCisgICAgcHVibGljIFZlY3RvciBnZXREdXBsaWNhdGVzTGlzdGluZ1ZlY3RvcigpIHsKKyAgICAgICAgcmV0dXJuICgoQnVuZGxlKWJ1bmRsZXMuZmlyc3RFbGVtZW50KCkpLmR1cGxpY2F0ZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSB1c2VmdWwgZGVidWdnaW5nIG1ldGhvZCB0aGF0IGxpc3RzIHRoZSB2YXJpb3VzIEJ1bmRsZUdyb3VwIG5hbWVzIGluIGEgU3RyaW5nLgorICAgICAqLworCQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0R3JvdXBMaXN0aW5nKCkgeworICAgICAgICByZXR1cm4gbGlzdFN0cmluZ3MoZ2V0R3JvdXBMaXN0aW5nVmVjdG9yKCkpOworICAgIH0KKyAgICAgICAgICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgYSB2ZWN0b3IgY29sbGVjdGlvbiBvZiBhbGwgb2YgdGhlIEJ1bmRsZUdyb3VwIGl0ZW1zIGZvdW5kcyBpbnQgdGhlIGJ1bmRsZS4KKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgVmVjdG9yIGdldEdyb3VwTGlzdGluZ1ZlY3RvcigpIHsKKyAgICAgICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIEJ1bmRsZSBidW5kbGUgPSAoQnVuZGxlKWJ1bmRsZXMuZmlyc3RFbGVtZW50KCk7CisgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IGJ1bmRsZS5nZXRHcm91cENvdW50KCk7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBidW5kbGUuZ2V0QnVuZGxlR3JvdXAoaSkuZ2V0TmFtZSgpOworICAgICAgICAgICAgdi5hZGRFbGVtZW50KG5hbWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB2OworICAgIH0KKwkKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2YgbGFuZ3VhZ2VzIHRoYXQgdGhlIHN5c3RlbSBzZWVtcyB0byBzdXBwb3J0CisgICAgICovCisJCisgICAgcHVibGljIGludCBnZXROdW1iZXJMYW5ndWFnZXMoKSB7CisgICAgICAgIHJldHVybiBidW5kbGVzLnNpemUoKTsKKyAgICB9CisJCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHNpbmdsZSBzdHJpbmcgY29tcHJpc2VkIG9mIGEgY29tbWEgZGVsaW1pdGVkIGxpc3Rpbmcgb2YgYWxsIGxhbmd1YWdlcyB0aGUgc3lzdGVtIHNlZW1zIHRvIHN1cHBvcnQKKyAgICAgKi8KKwkKKyAgICBwdWJsaWMgU3RyaW5nIGdldExhbmd1YWdlTGlzdGluZygpIHsKKyAgICAgICAgcmV0dXJuIGxpc3RTdHJpbmdzKGdldExhbmd1YWdlTGlzdGluZ1ZlY3RvcigpKTsKKyAgICB9CisJCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHZlY3RvciBvZiBzdHJpbmdzIGNvbXByaXNpbmcgYSBsaXN0IG9mIGFsbCBsYW5ndWFnZXMgaW4gdGhlIHN5c3RlbQorICAgICAqLworCQorICAgIHB1YmxpYyBWZWN0b3IgZ2V0TGFuZ3VhZ2VMaXN0aW5nVmVjdG9yKCkgeworICAgICAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKKwkJCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnVuZGxlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgQnVuZGxlIGRpY3QgPSAoQnVuZGxlKWJ1bmRsZXMuZWxlbWVudEF0KGkpOworICAgICAgICAgICAgU3RyaW5nIGRpY3RTdHIgPSBuZXcgU3RyaW5nKCk7CisgICAgICAgICAgICBpZiAoZGljdC5sYW5ndWFnZSAhPSBudWxsKSBkaWN0U3RyICs9IGRpY3QubGFuZ3VhZ2U7CisgICAgICAgICAgICBpZiAoZGljdC5jb3VudHJ5ICE9IG51bGwpIGRpY3RTdHIgKz0gIiAiICsgZGljdC5jb3VudHJ5OworICAgICAgICAgICAgaWYgKGRpY3QudmFyaWFudCAhPSBudWxsKSBkaWN0U3RyICs9ICIgIiArIGRpY3QudmFyaWFudDsKKyAgICAgICAgICAgIGlmIChkaWN0U3RyLnRyaW0oKS5lcXVhbHMoIiIpKSBkaWN0U3RyID0gKGRpY3QuZW5jb2RpbmcudHJpbSgpLmVxdWFscygiIikgPyAiQmFzZSBSZXNvdXJjZSBCdW5kbGUiIDogZGljdC5lbmNvZGluZyk7CisgICAgICAgICAgICB2LmFkZEVsZW1lbnQoZGljdFN0cik7CisgICAgICAgIH0KKwkJCisgICAgICAgIHJldHVybiB2OworICAgIH0KKwkKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdHJhbnNsYXRpb25zIGNvbnRhaW5lZCBhY3Jvc3MgYWxsIGxhbmd1YWdlIGZpbGVzCisgICAgICovCisJCisgICAgcHVibGljIGludCBnZXROdW1iZXJUb3RhbFRyYW5zbGF0aW9ucygpIHsKKyAgICAgICAgcmV0dXJuIGFsbEJ1bmRsZUtleXMuc2l6ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBCdW5kbGVHcm91cHMgaW4gIHRoZSBidW5kbGUuCisgICAgICovCisJCisgICAgcHVibGljIGludCBnZXROdW1iZXJHcm91cHMoKSB7CisgICAgICAgIHJldHVybiAoKEJ1bmRsZSlidW5kbGVzLmZpcnN0RWxlbWVudCgpKS5nZXRHcm91cENvdW50KCk7CisgICAgfQorCQorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHVzZXIgY3VycmVudGx5IHVzaW5nIHRoZSBlZGl0b3IKKyAgICAgKi8KKwkKKyAgICBwdWJsaWMgU3RyaW5nIGdldFVzZXIoKSB7CisgICAgICAgIHJldHVybiBjdXJyZW50VXNlcjsJCisgICAgfQorCQorICAgIC8qKgorICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIHVzZXIgY3VycmVudGx5IHVzaW5nIHRoZSBlZGl0b3IKKyAgICAgKi8KKwkKKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VyKFN0cmluZyB1c2VyKSB7CisgICAgICAgIGN1cnJlbnRVc2VyID0gdXNlcjsJCisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIGJhc2UgY2xhc3MgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVzb3VyY2UgYnVuZGxlCisgICAgICovCisgICAgCisgICAgcHVibGljIHZvaWQgc2V0QmFzZUNsYXNzKFN0cmluZyBiYXNlQ2xhc3NOYW1lKSB7CisgICAgICAgIGJhc2VDbGFzcyA9IGJhc2VDbGFzc05hbWU7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNldHMgdGhlIGRpcmVjdG9yeSBpbiB0aGUgZmlsZSBzeXN0ZW0gaW4gd2hpY2ggdGhpcyByZXNvdXJjZSBidW5kbGUgaXMgdG8gYmUKKyAgICAgKiBzYXZlZCBhbmQgcmV0cmlldmVkLgorICAgICAqLworICAgIAorICAgIHB1YmxpYyB2b2lkIHNldEZpbGVEaXJlY3RvcnkoRmlsZSBkaXJlY3RvcnkpIHsKKyAgICAgICAgaWYgKGRpcmVjdG9yeS5pc0RpcmVjdG9yeSgpKSBjdXJyZW50RGlyZWN0b3J5ID0gZGlyZWN0b3J5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGJhc2UgY2xhc3MgbmFtZSBpZiBrbm93biwgb3IgIlVua25vd24gQmFzZSBDbGFzcyIgb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TcmluZygpIHsKKyAgICAgICAgcmV0dXJuIChiYXNlQ2xhc3MgPT0gbnVsbCA/ICJVbmtub3duIEJhc2UgQ2xhc3MiIDogYmFzZUNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBiYXNlIGNsYXNzIG5hbWUgb3IgbnVsbCBpZiBpdCBkb2VzIG5vdCBleGlzdC4KKyAgICAgKi8KKwkKKyAgICBwdWJsaWMgU3RyaW5nIGdldEJhc2VDbGFzcygpIHsKKyAgICAgICAgcmV0dXJuIGJhc2VDbGFzczsKKyAgICB9CisJCisgICAgLyoqCisgICAgICogQSBWZWN0b3Igb2YgTkxTYnVuZGxlcywgb25lIGZvciBlYWNoIGxhbmd1YWdlCisgICAgICovCisgICAgcHVibGljIFZlY3RvciBnZXRCdW5kbGVzKCkgeworICAgICAgICByZXR1cm4gYnVuZGxlczsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgYnVuZGxlIGZyb20gYSBsb2NhbGUKKyAgICAgKiBAcmV0dXJuIFRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UgYnVuZGxlCisgICAgICovCisgICAgcHVibGljIEJ1bmRsZSBnZXRCdW5kbGUoU3RyaW5nIGxvY2FsZSkgeworICAgIAlCdW5kbGUgYnVuZGxlID0gbnVsbDsKKyAgICAgICAgaWYgKGhhc1Jlc291cmNlKGxvY2FsZSkpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnVuZGxlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIEJ1bmRsZSB0ZW1wYiA9IChCdW5kbGUpYnVuZGxlcy5lbGVtZW50QXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKHRlbXBiLmVuY29kaW5nLmVxdWFscyhsb2NhbGUpKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1bmRsZSA9IHRlbXBiOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1bmRsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRoYXQgaXMgdGhlIGJhc2UgY2xhc3MgZmlsZSBmb3IgdGhlIHJlc291cmNlIGJ1bmRsZS4KKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgRmlsZSBnZXRCYXNlRmlsZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGaWxlKGN1cnJlbnREaXJlY3RvcnksYmFzZUNsYXNzICsgIi5wcm9wZXJ0aWVzIik7CisgICAgfQorCQorICAgIC8vIFJldHVybiBhIHNpbmdsZSBjb21tYSBkZWxpbWl0ZWQgc3RyaW5nIG1hZGUgZnJvbSBhIHZlY3RvciBvZiBzdHJpbmdzCisgICAgcHJpdmF0ZSBTdHJpbmcgbGlzdFN0cmluZ3MoVmVjdG9yIHYpIHsKKyAgICAgICAgU3RyaW5nIHJldFN0ciA9IG5ldyBTdHJpbmcoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2LnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBPYmplY3QgbyA9IHYuZWxlbWVudEF0KGkpOworICAgICAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIFN0cmluZykpIGNvbnRpbnVlOworICAgICAgICAgICAgU3RyaW5nIHMgPSAoU3RyaW5nKW87CisgICAgICAgICAgICBpZiAoaSA+IDApIHJldFN0ciArPSAiLCAiOworICAgICAgICAgICAgcmV0U3RyICs9IHM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldFN0cjsKKyAgICB9CisJCisgICAgLy8gSW5pdCAtIGNhbGxlZCBiZWZvcmUgYW50IGNvbnN0cnVjdGlvbgorICAgIHByaXZhdGUgdm9pZCBpbml0KCkgeworICAgICAgICBhbGxCdW5kbGVLZXlzID0gbmV3IFZlY3RvcigpOworICAgICAgICBidW5kbGVzID0gbmV3IFZlY3RvcigpOworICAgICAgICBjdXJyZW50VXNlciA9ICJVbmtub3duIjsKKyAgICB9CisJCisgICAgLy8gUmV0dXJuIGEgaGFzaHRhYmxlIG9mIHRoZSB0YWdzIGluIGEgY29tbWVudCBsaW5lIChpLmUuIHRoZSB0ZXh0IGFmdGVyIGVhY2ggJ0AnIGNoYXJhY3RlcikgYW5kIHRoZWlyIHZhbHVlcworICAgIHByaXZhdGUgSGFzaHRhYmxlIGdldERlc2NyaXB0b3JzKEhhc2h0YWJsZSByZXN1bHQsIFN0cmluZyBsaW5lKSB7CisgICAgICAgIC8vIFJlY3Vyc2lvbiB0ZXJtaW5hdGluZyBjb25kaXRpb24KKyAgICAgICAgaWYgKGxpbmUgPT0gbnVsbCB8fCBsaW5lLmxlbmd0aCgpIDw9IDAgfHwgbGluZS5pbmRleE9mKCJAIikgPCAwKSByZXR1cm4gcmVzdWx0OworICAgICAgICAvLyBPdGhlcndpc2UgZ2VuZXJhdGUgd2hhdCBpbmZvcm1hdGlvbiB3ZSBjYW4gYW5kIHJlY3Vyc2UKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgICAgIC8vIFN0cmlwIG9mZiBhbnkgaW5mb3JtYXRpb24gYmVmb3JlIGFuZCBpbmNsdWRpbmcgYSAnQCcKKyAgICAgICAgbGluZSA9IGxpbmUuc3Vic3RyaW5nKGxpbmUuaW5kZXhPZigiQCIpKzEsIGxpbmUubGVuZ3RoKCkpOworICAgICAgICAvLyBUaGVyZSBzaG91bGQgYmUgYSBzcGFjZSBhZnRlciB0aGUgJ0BfdGFnXycgYW5kIHRoZSB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5CisgICAgICAgIGlmIChsaW5lLmluZGV4T2YoIiAiKSA8IDApIHJldHVybiByZXN1bHQ7ICAgICAgICAvLyBUaGlzIHNob3VsZG4ndCBoYXBwZW4gaWYgdGhpbmdzIGFyZSBmb3JtYXR0ZWQgcmlnaHQKKyAgICAgICAgLy8gQWRkIHRoZSB0ZXh0IGFmdGVyIHRoZSAnQCcgY2hhcmFjdGVyIHVwIHRvIHRoZSBmaXJzdCB3aGl0ZXNwYWNlIChoYXMgdG8gYmUgYSBzcGFjZSwgbm90IHRhYiBvciBvdGhlciB3aGl0ZXNwYWNlKQorICAgICAgICBTdHJpbmcgbmFtZSA9IGxpbmUuc3Vic3RyaW5nKDAsbGluZS5pbmRleE9mKCIgIikpLnRyaW0oKTsKKyAgICAgICAgLy8gTm93IHN0cmlwIG9mZiB0aGUgdGFnIG5hbWUKKyAgICAgICAgbGluZSA9IGxpbmUuc3Vic3RyaW5nKGxpbmUuaW5kZXhPZigiICIpLCBsaW5lLmxlbmd0aCgpKTsKKyAgICAgICAgLy8gSWYgdGhlcmUgaXMgYW5vdGhlciAnQCcgY2hhcmFjdGVyIHdlIHRha2UgdGhlIHZhbHVlIHVwIHVudGlsIHRoYXQgY2hhcmFjdGVyCisgICAgICAgIGlmIChsaW5lLmluZGV4T2YoIkAiKSA+PSAwKSB7CisgICAgICAgICAgICByZXN1bHQucHV0KG5hbWUsbGluZS5zdWJzdHJpbmcoMCxsaW5lLmluZGV4T2YoIkAiKSkudHJpbSgpKTsKKyAgICAgICAgfQorICAgICAgICAvLyBPdGhlcndpc2Ugd2UgdGFrZSB0aGUgcmVzdCBvZiB0aGUgY2hhcmFjdGVycyBpbiB0aGUgbGluZQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJlc3VsdC5wdXQobmFtZSxsaW5lLnRyaW0oKSk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIC8vIFJlY3Vyc2UKKyAgICAgICAgcmV0dXJuIGdldERlc2NyaXB0b3JzKHJlc3VsdCwgbGluZS5zdWJzdHJpbmcobGluZS5pbmRleE9mKCJAIiksIGxpbmUubGVuZ3RoKCkpKTsKKyAgICB9CisKKyAgICAvLyBDaGVja3MgYW4gYXJyYXkgb2Ygc3RyaW5ncyB0byBzZWUgaWYgaXQgY29udGFpbnMgYSBwYXJ0aWN1bGFyIHN0cmluZworLyogICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBhcnJheUNvbnRhaW5zKFN0cmluZ1tdIGFycmF5LCBTdHJpbmcgbWF0Y2gpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGFycmF5W2ldLmVxdWFscyhtYXRjaCkpIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Ki8KKwkKKyAgICAvLyBQcmludHMgdGhlIHVzYWdlIG9mIHRoZSBwcm9ncmFtIHdoZW4gY2FsbGVkIGZyb20gbWFpbgorLyogICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludFVzYWdlKCkgeworICAgICAgICBTdHJpbmcgdXNhZ2UgPSBuZXcgU3RyaW5nKCk7CisgICAgICAgIHVzYWdlICs9ICJVc2FnZTpcblxuamF2YSBjb20uaWJtLmFsbWFkZW4uVGVtcHVzRnVnaXQuVG9vbHMuUkJNYW5hZ2VyIGZpbGVOYW1lICgoLXIgfCAtZCkgZW5jb2Rpbmc/KT8iOworICAgICAgICB1c2FnZSArPSAiXG5cbiAgZmlsZU5hbWUgLT4gVGhlIGZpbGUgKGFuZCBwYXRoPykgcmVwcmVzZW50aW5nIHRoZSBtYWluIE5MUyByZXNvdXJjZVxuXHRcdChpLmUuIFRlbXB1c0Z1Z2l0LnJlc291cmNlcylcbiI7CisgICAgICAgIHVzYWdlICs9ICIgIGVuY29kaW5nIC0+IFJldHVybnMgcmVzdWx0cyBmb3Igb25seSB0aGUgbGFuZ3VhZ2UgZW5jb2Rpbmcgc3BlY2lmaWVkXG4iOworICAgICAgICB1c2FnZSArPSAiICBmbGFnIC1yICAtPiBHaXZlcyBvbmx5IGEgc3RhdHVzIHJlcG9ydCBvbiB0aGUgc3RhdGUgb2YgdGhlIHRyYW5zbGF0aW9uc1xuIjsgCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih1c2FnZSk7CisgICAgfSovCisgICAgCit9CisKZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9SQlByb3BlcnRpZXNFeHBvcnRlci5qYXZhIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL1JCUHJvcGVydGllc0V4cG9ydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdkZjdjYgotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9SQlByb3BlcnRpZXNFeHBvcnRlci5qYXZhCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoQykgMjAwMC0yMDA0LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCAgKgorICogb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworcGFja2FnZSBjb20uaWJtLnJibTsKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZheC5zd2luZy4qOworaW1wb3J0IGphdmEudXRpbC4qOworCisvKioKKyAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBwbHVnLWluIGV4cG9ydGVyIHV0aWxpdHkgZm9yIFJCTWFuYWdlciB0aGF0IG91dHB1dHMgSmF2YQorICogc3RhbmRhcmQgLnByb3BlcnRpZXMgZmlsZXMgaW4gdGhlIGFjY29yZGluZyB0byB0aGUgZmlsZSBzdHJ1Y3R1cmUgb2YgUmVzb3VyY2UKKyAqIEJ1bmRsZXMuIE1vc3QgYWxsIG1ldGEtZGF0YSBpcyBsb3N0IGluIHRoaXMgZXhwb3J0LgorICogCisgKiBAYXV0aG9yIEphcmVkIEphY2tzb24KKyAqIEBzZWUgY29tLmlibS5yYm0uUkJNYW5hZ2VyCisgKi8KK3B1YmxpYyBjbGFzcyBSQlByb3BlcnRpZXNFeHBvcnRlciBleHRlbmRzIFJCRXhwb3J0ZXIgeworCQorICAgIHB1YmxpYyBSQlByb3BlcnRpZXNFeHBvcnRlcigpIHsKKyAgICAgICAgc3VwZXIoKTsKKwkJCisgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIGZpbGUgY2hvb3NlciBpZiBuZWNlc3NhcnkKKyAgICAgICAgaWYgKGNob29zZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgY2hvb3NlciA9IG5ldyBKRmlsZUNob29zZXIoKTsKKyAgICAgICAgICAgIGNob29zZXIuc2V0RmlsZUZpbHRlcihuZXcgamF2YXguc3dpbmcuZmlsZWNob29zZXIuRmlsZUZpbHRlcigpeworICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiQmFzZSBDbGFzcyBQcm9wZXJ0aWVzIEZpbGVzIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZikgeworICAgICAgICAgICAgICAgICAgICBpZiAoZi5pc0RpcmVjdG9yeSgpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBmLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLnByb3BlcnRpZXMiKSAmJiBmLmdldE5hbWUoKS5pbmRleE9mKCJfIikgPCAwKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9IC8vIGVuZCBpZgorICAgIH0KKwkKKyAgICBwdWJsaWMgdm9pZCBleHBvcnQoUkJNYW5hZ2VyIHJibSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHJibSA9PSBudWxsKSByZXR1cm47CisgICAgICAgIC8vIE9wZW4gdGhlIFNhdmUgRGlhbG9nCisgICAgICAgIGludCByZXRfdmFsID0gY2hvb3Nlci5zaG93U2F2ZURpYWxvZyhudWxsKTsKKyAgICAgICAgaWYgKHJldF92YWwgIT0gSkZpbGVDaG9vc2VyLkFQUFJPVkVfT1BUSU9OKSByZXR1cm47CisgICAgICAgIC8vIFJldHJpZXZlIGJhc2ljIGZpbGUgaW5mb3JtYXRpb24KKyAgICAgICAgRmlsZSBmaWxlID0gY2hvb3Nlci5nZXRTZWxlY3RlZEZpbGUoKTsgICAgICAgICAgICAgICAgICAvLyBUaGUgZmlsZShzKSB3ZSB3aWxsIGJlIHdvcmtpbmcgd2l0aAorICAgICAgICBGaWxlIGRpcmVjdG9yeSA9IG5ldyBGaWxlKGZpbGUuZ2V0UGFyZW50KCkpOyAgICAgICAgICAgIC8vIFRoZSBkaXJlY3Rvcnkgd2Ugd2lsbCBiZSB3cml0aW5nIHRvCisgICAgICAgIFN0cmluZyBiYXNlX25hbWUgPSBmaWxlLmdldE5hbWUoKTsgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGJhc2UgbmFtZSBvZiB0aGUgZmlsZXMgd2Ugd2lsbCB3cml0ZQorICAgICAgICBpZiAoYmFzZV9uYW1lID09IG51bGwgfHwgYmFzZV9uYW1lLmVxdWFscygiIikpIGJhc2VfbmFtZSA9IHJibS5nZXRCYXNlQ2xhc3MoKTsKKyAgICAgICAgaWYgKGJhc2VfbmFtZS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIucHJvcGVydGllcyIpKSAKKyAgICAgICAgICAgIGJhc2VfbmFtZSA9IGJhc2VfbmFtZS5zdWJzdHJpbmcoMCxiYXNlX25hbWUubGVuZ3RoKCktMTEpOworCQkKKyAgICAgICAgVmVjdG9yIGJ1bmRsZV92ID0gcmJtLmdldEJ1bmRsZXMoKTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgYnVuZGxlX3Yuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIFByb3BlcnRpZXMgcHJvcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gKEJ1bmRsZSlidW5kbGVfdi5lbGVtZW50QXQoaSk7CisgICAgICAgICAgICBTdHJpbmcgYmFzZV9lbmMgPSBiYXNlX25hbWU7CisgICAgICAgICAgICBpZiAoYnVuZGxlLmVuY29kaW5nICE9IG51bGwgJiYgIWJ1bmRsZS5lbmNvZGluZy5lcXVhbHMoIiIpKSBiYXNlX2VuYyA9IGJhc2VfZW5jICsgIl8iICsgYnVuZGxlLmVuY29kaW5nOworICAgICAgICAgICAgU3RyaW5nIGZpbGVfbmFtZSA9IGJhc2VfZW5jICsgIi5wcm9wZXJ0aWVzIjsKKyAgICAgICAgICAgIFN0cmluZyBoZWFkZXIgPSAiUmVzb3VyY2UgQnVuZGxlOiAiICsgZmlsZV9uYW1lICsgIiAtIEZpbGUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgUkJNYW5hZ2VyIGF0ICIgKyAobmV3IERhdGUoKSk7CisJCQkKKyAgICAgICAgICAgIFZlY3RvciBncm91cF92ID0gYnVuZGxlLmdldEdyb3Vwc0FzVmVjdG9yKCk7CisgICAgICAgICAgICBmb3IgKGludCBqPTA7IGogPCBncm91cF92LnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICAgICAgQnVuZGxlR3JvdXAgZ3JvdXAgPSAoQnVuZGxlR3JvdXApZ3JvdXBfdi5lbGVtZW50QXQoaik7CisgICAgICAgICAgICAgICAgVmVjdG9yIGl0ZW1fdiA9IGdyb3VwLmdldEl0ZW1zQXNWZWN0b3IoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBrPTA7IGsgPCBpdGVtX3Yuc2l6ZSgpOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgQnVuZGxlSXRlbSBpdGVtID0gKEJ1bmRsZUl0ZW0paXRlbV92LmVsZW1lbnRBdChrKTsKKyAgICAgICAgICAgICAgICAgICAgcHJvcC5zZXRQcm9wZXJ0eShpdGVtLmdldEtleSgpLCBpdGVtLmdldFRyYW5zbGF0aW9uKCkpOworICAgICAgICAgICAgICAgIH0gLy8gZW5kIGZvciAtIGsKKyAgICAgICAgICAgIH0gLy8gZW5kIGZvciAtIGoKKwkJCQorICAgICAgICAgICAgLy8gV3JpdGUgb3V0IHRoZSBmaWxlCisgICAgICAgICAgICBGaWxlIHdyaXRlX2ZpbGUgPSBuZXcgRmlsZShkaXJlY3RvcnksIGZpbGVfbmFtZSk7CisgICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHdyaXRlX2ZpbGUpOworICAgICAgICAgICAgcHJvcC5zdG9yZShmb3MsIGhlYWRlcik7CisgICAgICAgIH0gLy8gZW5kIGZvciAtIGkKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL1JCUHJvcGVydGllc0ltcG9ydGVyLmphdmEgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vUkJQcm9wZXJ0aWVzSW1wb3J0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzZjZDI5Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL1JCUHJvcGVydGllc0ltcG9ydGVyLmphdmEKQEAgLTAsMCArMSwxMjAgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoQykgMjAwMC0yMDA3LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCAgKgorICogb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworcGFja2FnZSBjb20uaWJtLnJibTsKKworaW1wb3J0IGphdmEuaW8uKjsKKworaW1wb3J0IGNvbS5pYm0ucmJtLmd1aS5SQk1hbmFnZXJHVUk7CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBzdXBlciBjbGFzcyBmb3IgYWxsIGltcG9ydGVyIHBsdWctaW4gY2xhc3Nlcy4gQXMgb2YgeWV0LCB0aGVyZQorICogaXMgbGl0dGxlIGNvbnRhaW5lZCBpbiB0aGlzIGNsYXNzLgorICogCisgKiBAYXV0aG9yIEphcmVkIEphY2tzb24KKyAqIEBzZWUgY29tLmlibS5yYm0uUkJNYW5hZ2VyCisgKi8KK3B1YmxpYyBjbGFzcyBSQlByb3BlcnRpZXNJbXBvcnRlciBleHRlbmRzIFJCSW1wb3J0ZXIgeworCQorICAgIGJvb2xlYW4gaXNSQk1GaWxlID0gdHJ1ZTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIHRoZSBpbXBvcnRlciBnaXZlbiB0aGUgcGFyZW50IGRhdGEgY2xhc3NlcyBhbmQgYSBEaWFsb2cgdGl0bGUuCisgICAgICovCisJCisgICAgcHVibGljIFJCUHJvcGVydGllc0ltcG9ydGVyKFN0cmluZyB0aXRsZSwgUkJNYW5hZ2VyIHJibSwgUkJNYW5hZ2VyR1VJIGd1aSkgeworICAgICAgICBzdXBlcih0aXRsZSwgcmJtLCBndWkpOworICAgIH0KKwkKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXR1cEZpbGVDaG9vc2VyKCkgeworICAgICAgICBjaG9vc2VyLnNldEZpbGVGaWx0ZXIobmV3IGphdmF4LnN3aW5nLmZpbGVjaG9vc2VyLkZpbGVGaWx0ZXIoKXsKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGYpIHsKKyAgICAgICAgICAgICAgICBpZiAoZi5pc0RpcmVjdG9yeSgpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpZiAoZi5nZXROYW1lKCkudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLnByb3BlcnRpZXMiKSAmJiBmLmdldE5hbWUoKS5pbmRleE9mKCJfIikgPCAwKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiaW1wb3J0X3Byb3BlcnRpZXNfZmlsZV9kZXNjcmlwdGlvbiIpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisJCisgICAgcHJvdGVjdGVkIHZvaWQgYmVnaW5JbXBvcnQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBzdXBlci5iZWdpbkltcG9ydCgpOworICAgICAgICBGaWxlIGJhc2VGaWxlID0gZ2V0Q2hvc2VuRmlsZSgpOworICAgICAgICBGaWxlUmVhZGVyIGZyID0gbmV3IEZpbGVSZWFkZXIoYmFzZUZpbGUpOworICAgICAgICBCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihmcik7CisJCQorICAgICAgICAvLyBUZXN0IGlmIHRoaXMgaXMgYW4gUkJNYW5hZ2VyIGdlbmVyYXRlZCBmaWxlIG9yIG5vdAorICAgICAgICBpbnQgY291bnQgPSAwOworICAgICAgICBTdHJpbmcgbGluZSA9IG51bGw7CisgICAgICAgIGlzUkJNRmlsZSA9IHRydWU7CisgICAgICAgIHdoaWxlICgobGluZSA9IGJyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICghbGluZS50cmltKCkuZXF1YWxzKCIiKSkgY291bnQrKzsKKyAgICAgICAgICAgIGlmIChjb3VudCA9PSAxICYmICFsaW5lLnN0YXJ0c1dpdGgoIiMgQGZpbGUiKSkgeworICAgICAgICAgICAgICAgIC8vIE5vdCBnZW5lcmF0ZWQgYnkgUkJNYW5hZ2VyCisgICAgICAgICAgICAgICAgaXNSQk1GaWxlID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0gLy8gZW5kIHdoaWxlCisgICAgICAgIGlmIChpc1JCTUZpbGUpIHsKKyAgICAgICAgICAgIC8vIFRyZWF0IHRoZSBmaWxlIGFzIGdlbmVyYXRlZCBieSBSQk1hbmFnZXIKKyAgICAgICAgICAgIC8vIFBhcnNlIHRoZSByZXNvdXJjZSBidW5kbGUgdGhyb3VnaCBSQk1hbmFnZXIKKyAgICAgICAgICAgIFJCTWFuYWdlciBpbXBvcnRfcmJtID0gbmV3IFJCTWFuYWdlcihiYXNlRmlsZSk7CisgICAgICAgICAgICAvLyBNZXJnZSB0aGUgdHdvIHJlc291cmNlIGJ1bmRsZXMKKyAgICAgICAgICAgIFZlY3RvciBidW5kbGVzID0gaW1wb3J0X3JibS5nZXRCdW5kbGVzKCk7CisgICAgICAgICAgICBWZWN0b3IgZW5jb2RpbmdzID0gbmV3IFZlY3RvcigpOworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgYnVuZGxlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIEJ1bmRsZSBiID0gKEJ1bmRsZSlidW5kbGVzLmVsZW1lbnRBdChpKTsKKyAgICAgICAgICAgICAgICBlbmNvZGluZ3MuYWRkRWxlbWVudChiLmVuY29kaW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc29sdmVFbmNvZGluZ3MoZW5jb2RpbmdzKTsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IGJ1bmRsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBCdW5kbGUgYiA9IChCdW5kbGUpYnVuZGxlcy5lbGVtZW50QXQoaSk7CisgICAgICAgICAgICAgICAgRW51bWVyYXRpb24ga2V5cyA9IGIuYWxsSXRlbXMua2V5cygpOworICAgICAgICAgICAgICAgIHdoaWxlIChrZXlzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKWtleXMubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgQnVuZGxlSXRlbSBpdGVtID0gKEJ1bmRsZUl0ZW0pYi5hbGxJdGVtcy5nZXQoa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgaW1wb3J0UmVzb3VyY2UoaXRlbSwgYi5lbmNvZGluZywgKGl0ZW0uZ2V0UGFyZW50R3JvdXAoKSA9PSBudWxsID8gZ2V0RGVmYXVsdEdyb3VwKCk6IGl0ZW0uZ2V0UGFyZW50R3JvdXAoKS5nZXROYW1lKCkpKTsgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gSnVzdCB0cmVhdCBpdCBhcyBhIHJlZ3VsYXIgcHJvcGVydGllcyBmaWxlCisgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSBhcmUgYW55IG1pc3NpbmcgdGFyZ2V0IGxvY2FsZSBmaWxlcworICAgICAgICAgICAgU3RyaW5nIGJhc2VOYW1lID0gYmFzZUZpbGUuZ2V0TmFtZSgpLnN1YnN0cmluZygwLGJhc2VGaWxlLmdldE5hbWUoKS5sZW5ndGgoKS0xMSk7IC8vIHwnLnByb3BlcnRpZXMnfCA9PSAxMQorICAgICAgICAgICAgRmlsZSBiYXNlRGlyID0gbmV3IEZpbGUoYmFzZUZpbGUuZ2V0UGFyZW50KCkpOworICAgICAgICAgICAgU3RyaW5nIGFsbENoaWxkcmVuW10gPSBiYXNlRGlyLmxpc3QoKTsKKyAgICAgICAgICAgIFZlY3RvciBjaGlsZHJlbl92ID0gbmV3IFZlY3RvcigpOworICAgICAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgYWxsQ2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoYWxsQ2hpbGRyZW5baV0uc3RhcnRzV2l0aChiYXNlTmFtZSkgJiYgYWxsQ2hpbGRyZW5baV0udG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLnByb3BlcnRpZXMiKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoYWxsQ2hpbGRyZW5baV0ubGVuZ3RoKCkgPT0gKGJhc2VOYW1lICsgIi5wcm9wZXJ0aWVzIikubGVuZ3RoKCkpIGNoaWxkcmVuX3YuYWRkRWxlbWVudCgiIik7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgY2hpbGRyZW5fdi5hZGRFbGVtZW50KGFsbENoaWxkcmVuW2ldLnN1YnN0cmluZyhiYXNlTmFtZS5sZW5ndGgoKSsxLCBhbGxDaGlsZHJlbltpXS5pbmRleE9mKCIucHJvcGVydGllcyIpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2hvd1Byb2dyZXNzQmFyKGNoaWxkcmVuX3Yuc2l6ZSgpKTsKKyAgICAgICAgICAgIHJlc29sdmVFbmNvZGluZ3MoY2hpbGRyZW5fdik7CisgICAgICAgICAgICAvLyBSdW4gdGhyb3VnaCBlYWNoIHNvdXJjZSBsb2NhbGUgZmlsZSBpbXBvcnRpbmcgYXMgbmVjZXNzYXJ5CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBjaGlsZHJlbl92LnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShuZXcgRmlsZShiYXNlRGlyLCBiYXNlTmFtZSArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGlsZHJlbl92LmVsZW1lbnRBdChpKS50b1N0cmluZygpLmVxdWFscygiIikgPyAiIiA6ICJfIiArIGNoaWxkcmVuX3YuZWxlbWVudEF0KGkpLnRvU3RyaW5nKCkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLnByb3BlcnRpZXMiKSk7CisgICAgICAgICAgICAgICAgcC5sb2FkKGZpcyk7CisgICAgICAgICAgICAgICAgRW51bWVyYXRpb24ga2V5cyA9IHAua2V5cygpOworICAgICAgICAgICAgICAgIHdoaWxlIChrZXlzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKWtleXMubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgQnVuZGxlSXRlbSBpdGVtID0gbmV3IEJ1bmRsZUl0ZW0obnVsbCwga2V5LCBwLmdldFByb3BlcnR5KGtleSkpOworICAgICAgICAgICAgICAgICAgICBpdGVtLnNldFRyYW5zbGF0ZWQodGhpcy5nZXREZWZhdWx0VHJhbnNsYXRlZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgaW1wb3J0UmVzb3VyY2UoaXRlbSwgY2hpbGRyZW5fdi5lbGVtZW50QXQoaSkudG9TdHJpbmcoKSwgZ2V0RGVmYXVsdEdyb3VwKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbmNyZW1lbnRQcm9ncmVzc0JhcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaGlkZVByb2dyZXNzQmFyKCk7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL1JCUmVwb3J0ZXIuYmF0IGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL1JCUmVwb3J0ZXIuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmViOGZiMzMKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vUkJSZXBvcnRlci5iYXQKQEAgLTAsMCArMSwyIEBACitAZWNobyBvZmYKK2phdmEgLWNsYXNzcGF0aCBSQk1hbmFnZXIuamFyO2xpYlx4ZXJjZXMuamFyOy4gY29tLmlibS5yYm0uUkJSZXBvcnRlciAlMQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9SQlJlcG9ydGVyLmphdmEgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vUkJSZXBvcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlN2FjOGQKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vUkJSZXBvcnRlci5qYXZhCkBAIC0wLDAgKzEsMTE5MSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDcsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kICAqCisgKiBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitwYWNrYWdlIGNvbS5pYm0ucmJtOworCitpbXBvcnQgamF2YXguc3dpbmcuKjsKK2ltcG9ydCBqYXZhLmF3dC4qOworaW1wb3J0IGphdmEuYXd0LmV2ZW50Lio7CitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC4qOworCitpbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMuZG9tLkRvY3VtZW50SW1wbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZXJpYWxpemUuKjsKK2ltcG9ydCBvcmcudzNjLmRvbS4qOworCitpbXBvcnQgY29tLmlibS5yYm0uZ3VpLlJCTWFuYWdlckdVSTsKKworLyoqCisgKiBSQlJlcG9ydGVyIGlzIGEgZnVsbHkgZnVuY3Rpb25hbCBhcHBsaWNhdGlvbiB0aGF0IHJ1bnMgc2VwYXJhdGUgZnJvbSBSQk1hbmFnZXIuCisgKiBUaGUgcmVwb3J0IHByb2R1Y2VzIHN0YXRpc3RpY2FsbHkgYmFzZWQgcmVwb3J0cyBvbiBzcGVjaWZpZWQgcmVzb3VyY2UgYnVuZGxlcywKKyAqIGFuZCBpdCBhbGxvd3MgdGhlIHVzZXIgdG8gc2V0IHRpbWUgaW50ZXJ2YWxzIGF0IHdoaWNoIHRob3NlIHJlcG9ydHMgd2lsbCBiZQorICogZ2VuZXJhdGVkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGFuZCB1c2FnZSBzZWUgdGhlCisgKiBjb21tZW50cyBmb3IgdGhlIG1haW4oKSBtZXRob2QuCisgKiAKKyAqIEBhdXRob3IgSmFyZWQgSmFja3NvbgorICogQHNlZSBjb20uaWJtLnJibS5SQk1hbmFnZXIKKyAqLworcHVibGljIGNsYXNzIFJCUmVwb3J0ZXIgZXh0ZW5kcyBKRnJhbWUgeworCQorCS8vICoqIENPTVBPTkVOVFMgKioKKwlKTGFiZWwgICAgICAgc3RhdHVzTGFiZWw7ICAgICAgICAgICAgICAgICAgICAgICAvLyBJbmRpY2F0ZXMgaWYgdGhlIHJlcG9ydGVkIGlzIHJ1bm5pbmcKKwlKQnV0dG9uICAgICAgc3RhdHVzQnV0dG9uOyAgICAgICAgICAgICAgICAgICAgICAvLyBCdXR0b24gZm9yIHRvZ2dsaW5nIHRoZSByZXBvcnRlciBvbi9vZmYKKwlKTGFiZWwgICAgICAgbmV4dFJlcG9ydExhYmVsOyAgICAgICAgICAgICAgICAgICAvLyBJbmRpY2F0ZXMgZGF0ZS90aW1lIG9mIG5leHQgcmVwb3J0CisJSkxhYmVsICAgICAgIGxhc3RSZXBvcnRMYWJlbDsgICAgICAgICAgICAgICAgICAgLy8gSW5kaWNhdGVzIGRhdGUvdGltZSBvZiBsYXN0IHJlcG9ydAorCUpUZXh0RmllbGQgICBidW5kbGVGaWVsZDsgICAgICAgICAgICAgICAgICAgICAgIC8vIEluZGljYXRlcyBpbnB1dCBiYXNlIGNsYXNzIGZpbGUKKwlKVGV4dEZpZWxkICAgZGlyZWN0b3J5RmllbGQ7ICAgICAgICAgICAgICAgICAgICAvLyBJbmRpY2F0ZXMgb3V0cHV0IGRpcmVjdG9yeQorCUpDaGVja0JveCAgICB0ZXh0Q2hlY2s7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElzIHRleHQgcmVwb3J0IGdlbmVyYXRlZD8KKwlKQ2hlY2tCb3ggICAgaHRtbENoZWNrOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJcyBIVE1MIHJlcG9ydCBnZW5lcmF0ZWQ/CisJSkNoZWNrQm94ICAgIHhtbENoZWNrOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXMgWE1MIHJlcG9ydCBnZW5lcmF0ZWQ/CisJSkNoZWNrQm94ICAgIHNjYW5DaGVjazsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXMgY29kZSBzY2FuIHBlcmZvcm1lZD8KKwlKVGV4dEZpZWxkICAgdGV4dEZpZWxkOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUZXh0IHJlcG9ydCBmaWxlIG5hbWUKKwlKVGV4dEZpZWxkICAgaHRtbEZpZWxkOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIVE1MIHJlcG9ydCBmaWxlIG5hbWUKKwlKVGV4dEZpZWxkICAgeG1sRmllbGQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBYTUwgcmVwb3J0IGZpbGUgbmFtZQorCUpUZXh0RmllbGQgICBzY2FuRmllbGQ7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFhNTCBzY2FubmVyIGZpbGUgbG9jYXRpb24KKwlKQ29tYm9Cb3ggICAgdGV4dENvbWJvOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUZXh0IHJlcG9ydCBkZXRhaWwgbGV2ZWwKKwlKQ29tYm9Cb3ggICAgaHRtbENvbWJvOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIVE1MIHJlcG9ydCBkZXRhaWwgbGV2ZWwKKwlKQ29tYm9Cb3ggICAgeG1sQ29tYm87ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBYTUwgcmVwb3J0IGRldGFpbCBsZXZlbAorCUpSYWRpb0J1dHRvbiBzZXF1ZW50aWFsUmFkaW87ICAgICAgICAgICAgICAgICAgIC8vIFJlcG9ydCBhdCBzZXF1ZW50aWFsIGludGVydmFsPworCUpSYWRpb0J1dHRvbiBkZWZpbmVkUmFkaW87ICAgICAgICAgICAgICAgICAgICAgIC8vIFJlcG9ydCBhdCBkZWZpbmVkIHRpbWU/CisJSkNvbWJvQm94ICAgIHZhbHVlQ29tYm87ICAgICAgICAgICAgICAgICAgICAgICAgLy8gTnVtYmVyIG9mIHVuaXRzIHRvIHdhaXQgYmV0d2VlbiByZXBvcnRzCisJSkNvbWJvQm94ICAgIHVuaXRDb21ibzsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVW5pdHMgb2YgdGltZQorCUpDb21ib0JveCAgICBob3VyQ29tYm87ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlZmluZWQgdGltZSB0byByZXBvcnQgLS0gaG91cnMKKwlKQ29tYm9Cb3ggICAgbWludXRlQ29tYm87ICAgICAgICAgICAgICAgICAgICAgICAvLyBEZWZpbmVkIHRpbWUgdG8gcmVwb3J0IC0tIG1pbnV0ZXMKKwlKQ29tYm9Cb3ggICAgZGF5Q29tYm87ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEZWZpbmVkIHRpbWUgdG8gcmVwb3J0IC0tIGRheQorCQorCS8vICoqIEZpbGUgQ2hvb3NlciAqKgorCUpGaWxlQ2hvb3NlciBidW5kbGVGaWxlQ2hvb3NlciA9IG5ldyBKRmlsZUNob29zZXIoKTsKKwlKRmlsZUNob29zZXIgZGlyZWN0b3J5RmlsZUNob29zZXIgPSBuZXcgSkZpbGVDaG9vc2VyKCk7CisJSkZpbGVDaG9vc2VyIHNjYW5GaWxlQ2hvb3NlciA9IG5ldyBKRmlsZUNob29zZXIoKTsKKwkKKwkvLyAqKiBEQVRBICoqCisJRGF0ZSBsYXN0UmVwb3J0ID0gbnVsbDsKKwlEYXRlIG5leHRSZXBvcnQgPSBudWxsOworCWJvb2xlYW4gcnVubmluZyA9IGZhbHNlOworICAgIC8qKiBGb3IgZ2VuZXJhdGluZyBhIHJlcG9ydCAqLworICAgIFJCTWFuYWdlciByYm07CisJCisJcHJpdmF0ZSBSQlJlcG9ydGVyKGJvb2xlYW4gbWFrZVZpc2libGUpIHsKKwkJdHJ5IHsKKwkJCS8vIEdldCB0aGUgbG9vayBhbmQgZmVlbCBmcm9tIHByZWZlcmVuY2VzCQorCQkJdHJ5IHsKKwkJCQlTdHJpbmcgbGFmID0gUHJlZmVyZW5jZXMuZ2V0UHJlZmVyZW5jZSgibG9va2FuZGZlZWwiKTsKKwkJCQlpZiAoIWxhZi5lcXVhbHMoIiIpKQorCQkJCQlVSU1hbmFnZXIuc2V0TG9va0FuZEZlZWwobGFmKTsKKwkJCX0gCisJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsgCisJCQl9CisJCQkvLyBHZXQgdGhlIGxvY2FsZSBmcm9tIHByZWZlcmVuY2VzCisJCQlpZiAoIVByZWZlcmVuY2VzLmdldFByZWZlcmVuY2UoImxvY2FsZSIpLmVxdWFscygiIikpIHsKKwkJCQlTdHJpbmcgbG9jYWxlU3RyID0gUHJlZmVyZW5jZXMuZ2V0UHJlZmVyZW5jZSgibG9jYWxlIik7CisJCQkJU3RyaW5nIGxhbmd1YWdlID0gUmVzb3VyY2VzLmdldExhbmd1YWdlKGxvY2FsZVN0cik7CisJCQkJU3RyaW5nIGNvdW50cnkgPSBSZXNvdXJjZXMuZ2V0Q291bnRyeShsb2NhbGVTdHIpOworCQkJCVN0cmluZyB2YXJpYW50ID0gUmVzb3VyY2VzLmdldFZhcmlhbnQobG9jYWxlU3RyKTsKKwkJCQlpZiAobGFuZ3VhZ2UgPT0gbnVsbCB8fCBsYW5ndWFnZS5lcXVhbHMoIiIpIHx8IGxhbmd1YWdlLmxlbmd0aCgpID4gMykgbGFuZ3VhZ2UgPSAiZW4iOworCQkJCWlmIChjb3VudHJ5ID09IG51bGwpIGNvdW50cnkgPSBuZXcgU3RyaW5nKCk7CisJCQkJaWYgKHZhcmlhbnQgPT0gbnVsbCkgUmVzb3VyY2VzLnNldExvY2FsZShuZXcgTG9jYWxlKGxhbmd1YWdlLCBjb3VudHJ5KSk7CisJCQkJZWxzZSBSZXNvdXJjZXMuc2V0TG9jYWxlKG5ldyBMb2NhbGUobGFuZ3VhZ2UsIGNvdW50cnksIHZhcmlhbnQpKTsKKwkJCX0KKwkJCVJlc291cmNlcy5pbml0QnVuZGxlKCk7CisJCX0KKwkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQl9CisJCWluaXRDb21wb25lbnRzKCk7CisJCXNldFZpc2libGUobWFrZVZpc2libGUpOworCQlUaHJlYWQgcmVwb3J0VGhyZWFkID0gbmV3IFRocmVhZCgpeworCQkJcHVibGljIHZvaWQgcnVuKCkgeworCQkJCWlmIChuZXh0UmVwb3J0ICE9IG51bGwgJiYgKG5leHRSZXBvcnQuY29tcGFyZVRvKG5ldyBEYXRlKCkpIDw9IDApKSB7CisJCQkJCXRyeSB7IGdlbmVyYXRlUmVwb3J0cygpOyB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHt9CisJCQkJfQorCQkJCWlmIChuZXh0UmVwb3J0ID09IG51bGwpCisJCQkJICAgIG5leHRSZXBvcnQgPSBnZW5lcmF0ZU5leHRSZXBvcnREYXRlKCk7CisJCQkJdXBkYXRlU3RhdHVzQ29tcG9uZW50cygpOworCQkJCXVwZGF0ZURhdGVGaWVsZHMoKTsKKwkJCQl3aGlsZSAodHJ1ZSkgeworCQkJCQlpZiAocnVubmluZyAmJiAobmV4dFJlcG9ydC5jb21wYXJlVG8obmV3IERhdGUoKSkgPCAwKSkgeworCQkJCQkJdHJ5IHtnZW5lcmF0ZVJlcG9ydHMoKTt9CisJCQkJCQljYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisJCQkJCQkJSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2cobnVsbCwgaW9lLmdldE1lc3NhZ2UoKSwKKwkJCQkJCQkJCQkJCQkJICBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImVycm9yIiksCisJCQkJCQkJCQkJCQkJCSAgSk9wdGlvblBhbmUuRVJST1JfTUVTU0FHRSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJdHJ5IHsKKwkJCQkJCXNsZWVwKDEwMDApOworCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX07CisJCXJlcG9ydFRocmVhZC5zdGFydCgpOworCX0KKwkKKwkvLyBDYWxsZWQgd2hlbiBhIHJlcG9ydCBzaG91bGQgYmUgZ2VuZXJhdGVkLiBEb2VzIG5vdCBjaGVjayBpZiBpdCBzaG91bGQgYmUgZ2VuZXJhdGVkCisJcHJpdmF0ZSB2b2lkIGdlbmVyYXRlUmVwb3J0cygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUZpbGUgYmFzZUZpbGUgPSBuZXcgRmlsZShidW5kbGVGaWVsZC5nZXRUZXh0KCkpOworCQlpZiAoYmFzZUZpbGUgPT0gbnVsbCB8fCAhYmFzZUZpbGUuaXNGaWxlKCkpCisJCSAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlNwZWNpZmllZCBpbnB1dCBmaWxlIGlzIHVudXNhYmxlIik7CisJCUZpbGUgZGlyZWN0b3J5ID0gbmV3IEZpbGUoZGlyZWN0b3J5RmllbGQuZ2V0VGV4dCgpKTsKKwkJcmJtID0gbmV3IFJCTWFuYWdlcihiYXNlRmlsZSk7CisJCQorCQlpZiAocmJtID09IG51bGwpCisJCSAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlVuYWJsZSB0byBsb2FkIHRoZSByZXNvdXJjZSBidW5kbGUgZmlsZSIpOworCQlpZiAoZGlyZWN0b3J5ID09IG51bGwgfHwgIWRpcmVjdG9yeS5pc0RpcmVjdG9yeSgpKQorCQkgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJTcGVjaWZpZWQgb3V0cHV0IGRpcmVjdG9yeSBpcyB1bnVzYWJsZSIpOworCQlSQlJlcG9ydGVyU2Nhbm5lciBzY2FubmVyID0gbnVsbDsKKwkJaWYgKHNjYW5DaGVjay5pc1NlbGVjdGVkKCkpIHsKKwkJCXNjYW5uZXIgPSBuZXcgUkJSZXBvcnRlclNjYW5uZXIoKEJ1bmRsZSlyYm0uZ2V0QnVuZGxlcygpLmVsZW1lbnRBdCgwKSwKKwkJCQkJCQkJCQkgICAgbmV3IEZpbGUoc2NhbkZpZWxkLmdldFRleHQoKSkpOworCQkJc2Nhbm5lci5wZXJmb3JtU2NhbigpOworCQl9CisJCWlmICh0ZXh0Q2hlY2suaXNTZWxlY3RlZCgpKSB7CisJCQlGaWxlIHRleHRGaWxlID0gbmV3IEZpbGUoZGlyZWN0b3J5LCB0ZXh0RmllbGQuZ2V0VGV4dCgpKTsKKwkJCVN0cmluZyB0ZXh0UmVwb3J0ID0gZ2V0QWxsTGFuZ3VhZ2VSZXBvcnRzKHRleHRDb21iby5nZXRTZWxlY3RlZEluZGV4KCkgPT0gMCk7CisJCQlpZiAoc2NhbkNoZWNrLmlzU2VsZWN0ZWQoKSkgeworCQkJCS8vIEFkZCBmaWxlIHNjYW4gaW5mb3JtYXRpb24KKwkJCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQkJCWJ1ZmZlci5hcHBlbmQoIlxuXG5Db2RlIFNjYW4gUmVzdWx0czpcblxuIik7CisJCQkJYnVmZmVyLmFwcGVuZCgiXG5cdE51bWJlciBvZiB1bmlxdWUgcmVzb3VyY2VzIGZvdW5kOiAiICsgc2Nhbm5lci5nZXROdW1iZXJSZXNvdXJjZXNGb3VuZCgpKTsKKwkJCQlidWZmZXIuYXBwZW5kKCJcblx0TnVtYmVyIG9mIHJlc291cmNlcyBtaXNzaW5nIGZyb20gYnVuZGxlOiAiICsgc2Nhbm5lci5nZXROdW1iZXJNaXNzaW5nUmVzb3VyY2VzKCkpOworCQkJCS8vIE1pc3NpbmcgcmVzb3VyY2VzIGZyb20gdGhlIGJ1bmRsZQorCQkJCWJ1ZmZlci5hcHBlbmQoIlxuXHRNaXNzaW5nIFJlc291cmNlczogIik7CisJCQkJVmVjdG9yIHYgPSBzY2FubmVyLmdldE1pc3NpbmdSZXNvdXJjZXMoKTsKKwkJCQlmb3IgKGludCBpPTA7IGkgPCB2LnNpemUoKTsgaSsrKSB7CisJCQkJCVNjYW5SZXN1bHQgcmVzdWx0ID0gKFNjYW5SZXN1bHQpdi5lbGVtZW50QXQoaSk7CisJCQkJCWlmICh0ZXh0Q29tYm8uZ2V0U2VsZWN0ZWRJbmRleCgpID09IDApIHsKKwkJCQkJCWJ1ZmZlci5hcHBlbmQoIlxuXHRcdCIgKyByZXN1bHQuZ2V0TmFtZSgpICsgIiAoIiArIHJlc3VsdC5nZXRPY2N1cmFuY2VzKCkuc2l6ZSgpICsgIiBPY2N1cmFuY2VzKSIpOworCQkJCQkJYnVmZmVyLmFwcGVuZCgiXG5cdFx0XHQiICsgcmVzdWx0LmdldE9jY3VyYW5jZXMoKSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlidWZmZXIuYXBwZW5kKChpPT0wID8gIiIgOiAiLCAiKSArIHJlc3VsdC5nZXROYW1lKCkgKyAiICgiICsgcmVzdWx0LmdldE9jY3VyYW5jZXMoKS5zaXplKCkgKyAiIE9jY3VyYW5jZXMpIik7CisJCQkJCX0KKwkJCQl9CisJCQkJLy8gQnVuZGxlIHJlc291cmNlcyBub3QgZm91bmQgaW4gdGhlIGNvZGUKKwkJCQlidWZmZXIuYXBwZW5kKCJcblx0TnVtYmVyIG9mIHBvdGVudGlhbGx5IHVudXNlZCByZXNvdXJjZXMgaW4gYnVuZGxlOiAiICsgc2Nhbm5lci5nZXROdW1iZXJVbnVzZWRSZXNvdXJjZXMoKSk7CisJCQkJdiA9IHNjYW5uZXIuZ2V0VW51c2VkUmVzb3VyY2VzKCk7CisJCQkJZm9yIChpbnQgaT0wOyBpIDwgdi5zaXplKCk7IGkrKykgeworCQkJCQlTY2FuUmVzdWx0IHJlc3VsdCA9IChTY2FuUmVzdWx0KXYuZWxlbWVudEF0KGkpOworCQkJCQlpZiAodGV4dENvbWJvLmdldFNlbGVjdGVkSW5kZXgoKSA9PSAwKSB7CisJCQkJCQlidWZmZXIuYXBwZW5kKCJcblx0XHQiICsgcmVzdWx0LmdldE5hbWUoKSArICIgKEdyb3VwOiAiICsgcmVzdWx0LmdldEdyb3VwTmFtZSgpICsgIikiKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWJ1ZmZlci5hcHBlbmQoKGk9PTAgPyAiIiA6ICIsICIpICsgcmVzdWx0LmdldE5hbWUoKSk7CisJCQkJCX0KKwkJCQl9CisJCQkJCisJCQkJdGV4dFJlcG9ydCA9IHRleHRSZXBvcnQgKyBidWZmZXIudG9TdHJpbmcoKTsKKwkJCX0KKwkJCUZpbGVXcml0ZXIgZncgPSBuZXcgRmlsZVdyaXRlcih0ZXh0RmlsZSk7CisJCQlmdy53cml0ZSh0ZXh0UmVwb3J0KTsKKwkJCWZ3LmZsdXNoKCk7CisJCQlmdy5jbG9zZSgpOworCQl9CisJCWlmIChodG1sQ2hlY2suaXNTZWxlY3RlZCgpKSB7CisJCQlGaWxlIGh0bWxGaWxlID0gbmV3IEZpbGUoZGlyZWN0b3J5LCBodG1sRmllbGQuZ2V0VGV4dCgpKTsKKwkJCURvY3VtZW50IGh0bWxSZXBvcnQgPSBnZXRIVE1MUmVwb3J0eihodG1sQ29tYm8uZ2V0U2VsZWN0ZWRJbmRleCgpID09IDApOworCQkJaWYgKHNjYW5DaGVjay5pc1NlbGVjdGVkKCkpIHsKKwkJCQkvLyBBZGQgZmlsZSBzY2FuIGluZm9ybWF0aW9uCisJCQkJRWxlbWVudCBodG1sX2VsZW0gPSBodG1sUmVwb3J0LmdldERvY3VtZW50RWxlbWVudCgpOworCQkJCU5vZGVMaXN0IG5sID0gaHRtbF9lbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJCT0RZIik7CisJCQkJRWxlbWVudCBib2R5X2VsZW0gPSAoRWxlbWVudClubC5pdGVtKDApOworCQkJCUVsZW1lbnQgaDJfZWxlbSA9IGh0bWxSZXBvcnQuY3JlYXRlRWxlbWVudCgiSDIiKTsKKwkJCQlUZXh0ICAgIGgyX3RleHQgPSBodG1sUmVwb3J0LmNyZWF0ZVRleHROb2RlKCJDb2RlIFNjYW4gUmVzdWx0cyIpOworCQkJCUVsZW1lbnQgYmxvY2tfZWxlbSA9IGh0bWxSZXBvcnQuY3JlYXRlRWxlbWVudCgiQkxPQ0tRVU9URSIpOworCQkJCUVsZW1lbnQgcDFfZWxlbSA9IGh0bWxSZXBvcnQuY3JlYXRlRWxlbWVudCgiUCIpOworCQkJCUVsZW1lbnQgcDJfZWxlbSA9IGh0bWxSZXBvcnQuY3JlYXRlRWxlbWVudCgiUCIpOworCQkJCUVsZW1lbnQgcDNfZWxlbSA9IGh0bWxSZXBvcnQuY3JlYXRlRWxlbWVudCgiUCIpOworCQkJCVRleHQgICAgcDFfdGV4dCA9IGh0bWxSZXBvcnQuY3JlYXRlVGV4dE5vZGUoIk51bWJlciBvZiB1bmlxdWUgcmVzb3VyY2VzIGZvdW5kOiAiICsKKwkJCQkJCQkJCQkJCQkJCXNjYW5uZXIuZ2V0TnVtYmVyTWlzc2luZ1Jlc291cmNlcygpKTsKKwkJCQlUZXh0ICAgIHAyX3RleHQgPSBodG1sUmVwb3J0LmNyZWF0ZVRleHROb2RlKCJOdW1iZXIgb2YgcmVzb3VyY2VzIG1pc3NpbmcgZnJvbSBidW5kbGU6ICIgKworCQkJCQkJCQkJCQkJCQkJc2Nhbm5lci5nZXROdW1iZXJNaXNzaW5nUmVzb3VyY2VzKCkpOworCQkJCVRleHQgICAgcDNfdGV4dCA9IGh0bWxSZXBvcnQuY3JlYXRlVGV4dE5vZGUoIk51bWJlciBvZiBwb3RlbnRpYWxseSB1bnVzZWQgcmVzb3VyY2VzIGluIGJ1bmRsZTogIiArCisJCQkJCQkJCQkJCQkJCQlzY2FubmVyLmdldE51bWJlclVudXNlZFJlc291cmNlcygpKTsKKwkJCQkKKwkJCQloMl9lbGVtLmFwcGVuZENoaWxkKGgyX3RleHQpOworCQkJCXAxX2VsZW0uYXBwZW5kQ2hpbGQocDFfdGV4dCk7CisJCQkJcDJfZWxlbS5hcHBlbmRDaGlsZChwMl90ZXh0KTsKKwkJCQlwM19lbGVtLmFwcGVuZENoaWxkKHAzX3RleHQpOworCQkJCWJsb2NrX2VsZW0uYXBwZW5kQ2hpbGQocDFfZWxlbSk7CisJCQkJYmxvY2tfZWxlbS5hcHBlbmRDaGlsZChwMl9lbGVtKTsKKwkJCQlibG9ja19lbGVtLmFwcGVuZENoaWxkKHAzX2VsZW0pOworCQkJCWJvZHlfZWxlbS5hcHBlbmRDaGlsZChoMl9lbGVtKTsKKwkJCQlib2R5X2VsZW0uYXBwZW5kQ2hpbGQoYmxvY2tfZWxlbSk7CisJCQkJCisJCQkJLy8gTWlzc2luZyByZXNvdXJjZXMgZnJvbSB0aGUgYnVuZGxlCisJCQkJVGV4dCAgIG1pc3NpbmdfdGV4dCA9IG51bGw7CisJCQkJVmVjdG9yIHYgPSBzY2FubmVyLmdldE1pc3NpbmdSZXNvdXJjZXMoKTsKKwkJCQlpZiAoaHRtbENvbWJvLmdldFNlbGVjdGVkSW5kZXgoKSA9PSAwKSB7CisJCQkJCUVsZW1lbnQgdWxfZWxlbSA9IGh0bWxSZXBvcnQuY3JlYXRlRWxlbWVudCgiVUwiKTsKKwkJCQkJbWlzc2luZ190ZXh0ID0gaHRtbFJlcG9ydC5jcmVhdGVUZXh0Tm9kZSgiTWlzc2luZyBSZXNvdXJjZXM6Iik7CisJCQkJCXVsX2VsZW0uYXBwZW5kQ2hpbGQobWlzc2luZ190ZXh0KTsKKwkJCQkJZm9yIChpbnQgaT0wOyBpIDwgdi5zaXplKCk7IGkrKykgeworCQkJCQkJU2NhblJlc3VsdCByZXN1bHQgPSAoU2NhblJlc3VsdCl2LmVsZW1lbnRBdChpKTsKKwkJCQkJCUVsZW1lbnQgbGlfZWxlbSA9IGh0bWxSZXBvcnQuY3JlYXRlRWxlbWVudCgiTEkiKTsKKwkJCQkJCUVsZW1lbnQgYnJfZWxlbSA9IGh0bWxSZXBvcnQuY3JlYXRlRWxlbWVudCgiQlIiKTsKKwkJCQkJCVRleHQgICAgdDFfdGV4dCA9IGh0bWxSZXBvcnQuY3JlYXRlVGV4dE5vZGUocmVzdWx0LmdldE5hbWUoKSArICIgKCIgKworCQkJCQkJCQkJCQkJCQkJCQkJCQkgIHJlc3VsdC5nZXRPY2N1cmFuY2VzKCkuc2l6ZSgpICsgIiBPY2N1cmFuY2VzKSIpOworCQkJCQkJVGV4dCAgICB0Ml90ZXh0ID0gaHRtbFJlcG9ydC5jcmVhdGVUZXh0Tm9kZShyZXN1bHQuZ2V0T2NjdXJhbmNlcygpLnRvU3RyaW5nKCkpOworCQkJCQkJbGlfZWxlbS5hcHBlbmRDaGlsZCh0MV90ZXh0KTsKKwkJCQkJCWxpX2VsZW0uYXBwZW5kQ2hpbGQoYnJfZWxlbSk7CisJCQkJCQlsaV9lbGVtLmFwcGVuZENoaWxkKHQyX3RleHQpOworCQkJCQkJdWxfZWxlbS5hcHBlbmRDaGlsZChsaV9lbGVtKTsKKwkJCQkJfQorCQkJCQlwMl9lbGVtLmFwcGVuZENoaWxkKHVsX2VsZW0pOworCQkJCX0gZWxzZSB7CisJCQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisJCQkJCWJ1ZmZlci5hcHBlbmQoIk1pc3NpbmcgUmVzb3VyY2VzOiAiKTsKKwkJCQkJZm9yIChpbnQgaT0wOyBpIDwgdi5zaXplKCk7IGkrKykgeworCQkJCQkJU2NhblJlc3VsdCByZXN1bHQgPSAoU2NhblJlc3VsdCl2LmVsZW1lbnRBdChpKTsKKwkJCQkJCWJ1ZmZlci5hcHBlbmQoKGk9PTAgPyAiIiA6ICIsICIpICsgcmVzdWx0LmdldE5hbWUoKSArICIgKCIgKyByZXN1bHQuZ2V0T2NjdXJhbmNlcygpLnNpemUoKSArICIgT2NjdXJhbmNlcykiKTsKKwkJCQkJfQorCQkJCQltaXNzaW5nX3RleHQgPSBodG1sUmVwb3J0LmNyZWF0ZVRleHROb2RlKGJ1ZmZlci50b1N0cmluZygpKTsKKwkJCQkJRWxlbWVudCBicl9lbGVtID0gaHRtbFJlcG9ydC5jcmVhdGVFbGVtZW50KCJCUiIpOworCQkJCQlwMl9lbGVtLmFwcGVuZENoaWxkKGJyX2VsZW0pOworCQkJCQlwMl9lbGVtLmFwcGVuZENoaWxkKG1pc3NpbmdfdGV4dCk7CisJCQkJfQorCQkJCS8vIEJ1bmRsZSByZXNvdXJjZXMgbm90IGZvdW5kIGluIHRoZSBjb2RlCisJCQkJVGV4dCAgIHVudXNlZF90ZXh0ID0gbnVsbDsKKwkJCQl2ID0gc2Nhbm5lci5nZXRVbnVzZWRSZXNvdXJjZXMoKTsKKwkJCQlpZiAoaHRtbENvbWJvLmdldFNlbGVjdGVkSW5kZXgoKSA9PSAwKSB7CisJCQkJCUVsZW1lbnQgdWxfZWxlbSA9IGh0bWxSZXBvcnQuY3JlYXRlRWxlbWVudCgiVUwiKTsKKwkJCQkJdW51c2VkX3RleHQgPSBodG1sUmVwb3J0LmNyZWF0ZVRleHROb2RlKCJVbnVzZWQgUmVzb3VyY2VzOiIpOworCQkJCQl1bF9lbGVtLmFwcGVuZENoaWxkKHVudXNlZF90ZXh0KTsKKwkJCQkJZm9yIChpbnQgaT0wOyBpIDwgdi5zaXplKCk7IGkrKykgeworCQkJCQkJU2NhblJlc3VsdCByZXN1bHQgPSAoU2NhblJlc3VsdCl2LmVsZW1lbnRBdChpKTsKKwkJCQkJCUVsZW1lbnQgbGlfZWxlbSA9IGh0bWxSZXBvcnQuY3JlYXRlRWxlbWVudCgiTEkiKTsKKwkJCQkJCVRleHQgICAgdDFfdGV4dCA9IGh0bWxSZXBvcnQuY3JlYXRlVGV4dE5vZGUocmVzdWx0LmdldE5hbWUoKSArICIgKEdyb3VwOiAiICsKKwkJCQkJCQkJCQkJCQkJCQkJCQkJICByZXN1bHQuZ2V0R3JvdXBOYW1lKCkgKyAiKSIpOworCQkJCQkJbGlfZWxlbS5hcHBlbmRDaGlsZCh0MV90ZXh0KTsKKwkJCQkJCXVsX2VsZW0uYXBwZW5kQ2hpbGQobGlfZWxlbSk7CisJCQkJCX0KKwkJCQkJcDNfZWxlbS5hcHBlbmRDaGlsZCh1bF9lbGVtKTsKKwkJCQl9IGVsc2UgeworCQkJCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworCQkJCQlidWZmZXIuYXBwZW5kKCJVbnVzZWQgUmVzb3VyY2VzOiAiKTsKKwkJCQkJZm9yIChpbnQgaT0wOyBpIDwgdi5zaXplKCk7IGkrKykgeworCQkJCQkJU2NhblJlc3VsdCByZXN1bHQgPSAoU2NhblJlc3VsdCl2LmVsZW1lbnRBdChpKTsKKwkJCQkJCWJ1ZmZlci5hcHBlbmQoKGk9PTAgPyAiIiA6ICIsICIpICsgcmVzdWx0LmdldE5hbWUoKSk7CisJCQkJCX0KKwkJCQkJdW51c2VkX3RleHQgPSBodG1sUmVwb3J0LmNyZWF0ZVRleHROb2RlKGJ1ZmZlci50b1N0cmluZygpKTsKKwkJCQkJRWxlbWVudCBicl9lbGVtID0gaHRtbFJlcG9ydC5jcmVhdGVFbGVtZW50KCJCUiIpOworCQkJCQlwM19lbGVtLmFwcGVuZENoaWxkKGJyX2VsZW0pOworCQkJCQlwM19lbGVtLmFwcGVuZENoaWxkKHVudXNlZF90ZXh0KTsKKwkJCQl9CisJCQl9CisJCQlGaWxlV3JpdGVyIGZ3ID0gbmV3IEZpbGVXcml0ZXIoaHRtbEZpbGUpOworCQkJT3V0cHV0Rm9ybWF0IG9mID0gbmV3IE91dHB1dEZvcm1hdChodG1sUmVwb3J0KTsKKwkJCW9mLnNldEluZGVudGluZyh0cnVlKTsKKwkJCW9mLnNldEVuY29kaW5nKCJJU08tODg1OS0xIik7CisJCQlIVE1MU2VyaWFsaXplciBzZXJpYWxpemVyID0gbmV3IEhUTUxTZXJpYWxpemVyKGZ3LCBvZik7CisJCQlzZXJpYWxpemVyLnNlcmlhbGl6ZShodG1sUmVwb3J0KTsKKwkJfQorCQlpZiAoeG1sQ2hlY2suaXNTZWxlY3RlZCgpKSB7CisJCQlGaWxlIHhtbEZpbGUgPSBuZXcgRmlsZShkaXJlY3RvcnksIHhtbEZpZWxkLmdldFRleHQoKSk7CisJCQlEb2N1bWVudCB4bWxSZXBvcnQgPSBnZXRYTUxSZXBvcnR6KHhtbENvbWJvLmdldFNlbGVjdGVkSW5kZXgoKSA9PSAwKTsKKwkJCWlmIChzY2FuQ2hlY2suaXNTZWxlY3RlZCgpKSB7CisJCQkJLy8gQWRkIGZpbGUgc2NhbiBpbmZvcm1hdGlvbgorCQkJCUVsZW1lbnQgcm9vdCA9IHhtbFJlcG9ydC5nZXREb2N1bWVudEVsZW1lbnQoKTsKKwkJCQlFbGVtZW50IGNvZGVfc2Nhbl9lbGVtID0geG1sUmVwb3J0LmNyZWF0ZUVsZW1lbnQoIkNPREVfU0NBTiIpOworCQkJCUVsZW1lbnQgdW5pcXVlX2VsZW0gPSB4bWxSZXBvcnQuY3JlYXRlRWxlbWVudCgiVU5JUVVFX1JFU09VUkNFUyIpOworCQkJCUVsZW1lbnQgbWlzc2luZ19lbGVtID0geG1sUmVwb3J0LmNyZWF0ZUVsZW1lbnQoIk1JU1NJTkdfUkVTT1VSQ0VTIik7CisJCQkJRWxlbWVudCB1bnVzZWRfZWxlbSA9IHhtbFJlcG9ydC5jcmVhdGVFbGVtZW50KCJVTlVTRURfUkVTT1VSQ0VTIik7CisJCQkJRWxlbWVudCB1bmlxdWVfdG90YWxfZWxlbSA9IHhtbFJlcG9ydC5jcmVhdGVFbGVtZW50KCJUT1RBTCIpOworCQkJCUVsZW1lbnQgbWlzc2luZ190b3RhbF9lbGVtID0geG1sUmVwb3J0LmNyZWF0ZUVsZW1lbnQoIlRPVEFMIik7CisJCQkJRWxlbWVudCB1bnVzZWRfdG90YWxfZWxlbSA9IHhtbFJlcG9ydC5jcmVhdGVFbGVtZW50KCJUT1RBTCIpOworCQkJCVRleHQgICAgdW5pcXVlX3RvdGFsX3RleHQgPSB4bWxSZXBvcnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLnZhbHVlT2Yoc2Nhbm5lci5nZXROdW1iZXJNaXNzaW5nUmVzb3VyY2VzKCkpKTsKKwkJCQlUZXh0ICAgIG1pc3NpbmdfdG90YWxfdGV4dCA9IHhtbFJlcG9ydC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcudmFsdWVPZihzY2FubmVyLmdldE51bWJlck1pc3NpbmdSZXNvdXJjZXMoKSkpOworCQkJCVRleHQgICAgdW51c2VkX3RvdGFsX3RleHQgPSB4bWxSZXBvcnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLnZhbHVlT2Yoc2Nhbm5lci5nZXROdW1iZXJVbnVzZWRSZXNvdXJjZXMoKSkpOworCQkJCQorCQkJCXVuaXF1ZV90b3RhbF9lbGVtLmFwcGVuZENoaWxkKHVuaXF1ZV90b3RhbF90ZXh0KTsKKwkJCQltaXNzaW5nX3RvdGFsX2VsZW0uYXBwZW5kQ2hpbGQobWlzc2luZ190b3RhbF90ZXh0KTsKKwkJCQl1bnVzZWRfdG90YWxfZWxlbS5hcHBlbmRDaGlsZCh1bnVzZWRfdG90YWxfdGV4dCk7CisJCQkJdW5pcXVlX2VsZW0uYXBwZW5kQ2hpbGQodW5pcXVlX3RvdGFsX2VsZW0pOworCQkJCW1pc3NpbmdfZWxlbS5hcHBlbmRDaGlsZChtaXNzaW5nX3RvdGFsX2VsZW0pOworCQkJCXVudXNlZF9lbGVtLmFwcGVuZENoaWxkKHVudXNlZF90b3RhbF9lbGVtKTsKKwkJCQljb2RlX3NjYW5fZWxlbS5hcHBlbmRDaGlsZCh1bmlxdWVfZWxlbSk7CisJCQkJY29kZV9zY2FuX2VsZW0uYXBwZW5kQ2hpbGQobWlzc2luZ19lbGVtKTsKKwkJCQljb2RlX3NjYW5fZWxlbS5hcHBlbmRDaGlsZCh1bnVzZWRfZWxlbSk7CisJCQkJcm9vdC5hcHBlbmRDaGlsZChjb2RlX3NjYW5fZWxlbSk7CisJCQkJLy8gTWlzc2luZyByZXNvdXJjZXMgZnJvbSB0aGUgYnVuZGxlCisJCQkJVmVjdG9yIHYgPSBzY2FubmVyLmdldE1pc3NpbmdSZXNvdXJjZXMoKTsKKwkJCQlmb3IgKGludCBpPTA7IGkgPCB2LnNpemUoKTsgaSsrKSB7CisJCQkJCVNjYW5SZXN1bHQgcmVzdWx0ID0gKFNjYW5SZXN1bHQpdi5lbGVtZW50QXQoaSk7CisJCQkJCUVsZW1lbnQgaXRlbV9lbGVtID0geG1sUmVwb3J0LmNyZWF0ZUVsZW1lbnQoIlJFU09VUkNFIik7CisJCQkJCWl0ZW1fZWxlbS5zZXRBdHRyaWJ1dGUoIk5BTUUiLHJlc3VsdC5nZXROYW1lKCkpOworCQkJCQlpZiAoeG1sQ29tYm8uZ2V0U2VsZWN0ZWRJbmRleCgpID09IDApIHsKKwkJCQkJCVZlY3RvciBvY2NfdiA9IHJlc3VsdC5nZXRPY2N1cmFuY2VzKCk7CisJCQkJCQlmb3IgKGludCBqPTA7IGogPCBvY2Nfdi5zaXplKCk7IGorKykgeworCQkJCQkJCU9jY3VyYW5jZSBvY2MgPSAoT2NjdXJhbmNlKW9jY192LmVsZW1lbnRBdChqKTsKKwkJCQkJCQlFbGVtZW50IG9jY19lbGVtID0geG1sUmVwb3J0LmNyZWF0ZUVsZW1lbnQoIk9DQ1VSQU5DRSIpOworCQkJCQkJCW9jY19lbGVtLnNldEF0dHJpYnV0ZSgiRklMRV9OQU1FIiwgb2NjLmdldEZpbGVOYW1lKCkpOworCQkJCQkJCW9jY19lbGVtLnNldEF0dHJpYnV0ZSgiRklMRV9QQVRIIiwgb2NjLmdldEZpbGVQYXRoKCkpOworCQkJCQkJCW9jY19lbGVtLnNldEF0dHJpYnV0ZSgiTElORV9OVU1CRVIiLCBTdHJpbmcudmFsdWVPZihvY2MuZ2V0TGluZU51bWJlcigpKSk7CisJCQkJCQkJaXRlbV9lbGVtLmFwcGVuZENoaWxkKG9jY19lbGVtKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQltaXNzaW5nX2VsZW0uYXBwZW5kQ2hpbGQoaXRlbV9lbGVtKTsKKwkJCQl9CisJCQkJLy8gQnVuZGxlIHJlc291cmNlcyBub3QgZm91bmQgaW4gdGhlIGNvZGUKKwkJCQl2ID0gc2Nhbm5lci5nZXRVbnVzZWRSZXNvdXJjZXMoKTsKKwkJCQlmb3IgKGludCBpPTA7IGkgPCB2LnNpemUoKTsgaSsrKSB7CisJCQkJCVNjYW5SZXN1bHQgcmVzdWx0ID0gKFNjYW5SZXN1bHQpdi5lbGVtZW50QXQoaSk7CisJCQkJCUVsZW1lbnQgaXRlbV9lbGVtID0geG1sUmVwb3J0LmNyZWF0ZUVsZW1lbnQoIlJFU09VUkNFIik7CisJCQkJCWl0ZW1fZWxlbS5zZXRBdHRyaWJ1dGUoIk5BTUUiLHJlc3VsdC5nZXROYW1lKCkpOworCQkJCQlpdGVtX2VsZW0uc2V0QXR0cmlidXRlKCJHUk9VUCIscmVzdWx0LmdldEdyb3VwTmFtZSgpKTsKKwkJCQkJdW51c2VkX2VsZW0uYXBwZW5kQ2hpbGQoaXRlbV9lbGVtKTsKKwkJCQl9CisJCQl9CisJCQlGaWxlV3JpdGVyIGZ3ID0gbmV3IEZpbGVXcml0ZXIoeG1sRmlsZSk7CisJCQlPdXRwdXRGb3JtYXQgb2YgPSBuZXcgT3V0cHV0Rm9ybWF0KHhtbFJlcG9ydCk7CisJCQlvZi5zZXRJbmRlbnRpbmcodHJ1ZSk7CisJCQlvZi5zZXRFbmNvZGluZygiSVNPLTg4NTktMSIpOworCQkJWE1MU2VyaWFsaXplciBzZXJpYWxpemVyID0gbmV3IFhNTFNlcmlhbGl6ZXIoZncsIG9mKTsKKwkJCXNlcmlhbGl6ZXIuc2VyaWFsaXplKHhtbFJlcG9ydCk7CisJCX0KKwkJCisJCWxhc3RSZXBvcnQgPSBuZXcgRGF0ZSgpOworCQluZXh0UmVwb3J0ID0gZ2VuZXJhdGVOZXh0UmVwb3J0RGF0ZSgpOworCQl1cGRhdGVEYXRlRmllbGRzKCk7CisJCWlmICghaXNWaXNpYmxlKCkpIHsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiUkJSZXBvcnRlcjogR2VuZXJhdGVkIHJlcG9ydCBhdCAiICsgbGFzdFJlcG9ydC50b1N0cmluZygpKTsKKwkJCVN5c3RlbS5vdXQucHJpbnRsbigiUkJSZXBvcnRlcjogTmV4dCByZXBvcnQgYXQgIiArIG5leHRSZXBvcnQudG9TdHJpbmcoKSk7CisJCX0KKwl9CisJCisJLy8gQXNzdW1lcyB0aGUgbGFzdCByZXBvcnQgd2FzIGp1c3QgZ2VuZXJhdGVkLCBhbmQgY29tcHV0ZXMgdGhlIG5leHQgcmVwb3J0IHRpbWUgYWNjb3JkaW5nbHkKKwlwcml2YXRlIERhdGUgZ2VuZXJhdGVOZXh0UmVwb3J0RGF0ZSgpIHsKKwkJRGF0ZSByZXREYXRlID0gbnVsbDsKKwkJR3JlZ29yaWFuQ2FsZW5kYXIgbm93ID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCk7CisJCWlmIChzZXF1ZW50aWFsUmFkaW8uaXNTZWxlY3RlZCgpKSB7CisJCQlpbnQgdmFsdWUgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlQ29tYm8uZ2V0U2VsZWN0ZWRJdGVtKCkudG9TdHJpbmcoKSk7CisJCQlpZiAodW5pdENvbWJvLmdldFNlbGVjdGVkSW5kZXgoKSA9PSAwKSBub3cuYWRkKENhbGVuZGFyLk1JTlVURSwgdmFsdWUpOworCQkJZWxzZSBpZiAodW5pdENvbWJvLmdldFNlbGVjdGVkSW5kZXgoKSA9PSAxKSBub3cuYWRkKENhbGVuZGFyLkhPVVIsIHZhbHVlKTsKKwkJCWVsc2UgaWYgKHVuaXRDb21iby5nZXRTZWxlY3RlZEluZGV4KCkgPT0gMikgbm93LmFkZChDYWxlbmRhci5EQVRFLCB2YWx1ZSk7CisJCQlyZXREYXRlID0gbm93LmdldFRpbWUoKTsKKwkJfSBlbHNlIGlmIChkZWZpbmVkUmFkaW8uaXNTZWxlY3RlZCgpKSB7CisJCQlpbnQgaG91ciA9IEludGVnZXIucGFyc2VJbnQoaG91ckNvbWJvLmdldFNlbGVjdGVkSXRlbSgpLnRvU3RyaW5nKCkpOworCQkJaW50IG1pbnV0ZSA9IEludGVnZXIucGFyc2VJbnQobWludXRlQ29tYm8uZ2V0U2VsZWN0ZWRJdGVtKCkudG9TdHJpbmcoKSk7CisJCQlpbnQgZGF5ID0gZGF5Q29tYm8uZ2V0U2VsZWN0ZWRJbmRleCgpOworCQkJCisJCQlHcmVnb3JpYW5DYWxlbmRhciB0aGVuID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCk7CisJCQl0aGVuLnNldChDYWxlbmRhci5IT1VSLCBob3VyKTsKKwkJCXRoZW4uc2V0KENhbGVuZGFyLk1JTlVURSwgbWludXRlKTsKKwkJCXRoZW4uc2V0KENhbGVuZGFyLlNFQ09ORCwgMCk7CisJCQkKKwkJCWlmICh0aGVuLmdldFRpbWUoKS5jb21wYXJlVG8obm93LmdldFRpbWUoKSkgPD0gMCkgdGhlbi5hZGQoQ2FsZW5kYXIuREFURSwgMSk7CisJCQlpZiAoZGF5ID4gMCAmJiBkYXkgPD0gNykgeworCQkJCS8vIE1ha2Ugc3VyZSB3ZSBhcmUgYXQgdGhlIHJpZ2h0IGRheQorCQkJCWJvb2xlYW4gcmlnaHREYXkgPSBmYWxzZTsKKwkJCQl3aGlsZSAoIXJpZ2h0RGF5KSB7CisJCQkJCWludCB3ZWVrRGF5ID0gdGhlbi5nZXQoQ2FsZW5kYXIuREFZX09GX1dFRUspOworCQkJCQlpZiAoKGRheSA9PSAxICYmIHdlZWtEYXkgPT0gQ2FsZW5kYXIuTU9OREFZKSB8fAorCQkJCQkJKGRheSA9PSAyICYmIHdlZWtEYXkgPT0gQ2FsZW5kYXIuVFVFU0RBWSkgfHwKKwkJCQkJCShkYXkgPT0gMyAmJiB3ZWVrRGF5ID09IENhbGVuZGFyLldFRE5FU0RBWSkgfHwKKwkJCQkJCShkYXkgPT0gNCAmJiB3ZWVrRGF5ID09IENhbGVuZGFyLlRIVVJTREFZKSB8fAorCQkJCQkJKGRheSA9PSA1ICYmIHdlZWtEYXkgPT0gQ2FsZW5kYXIuRlJJREFZKSB8fAorCQkJCQkJKGRheSA9PSA2ICYmIHdlZWtEYXkgPT0gQ2FsZW5kYXIuU0FUVVJEQVkpIHx8CisJCQkJCQkoZGF5ID09IDcgJiYgd2Vla0RheSA9PSBDYWxlbmRhci5TVU5EQVkpKSByaWdodERheSA9IHRydWU7CisJCQkJCWVsc2UgdGhlbi5hZGQoQ2FsZW5kYXIuREFURSwgMSk7CisJCQkJfQorCQkJfQorCQkJcmV0RGF0ZSA9IHRoZW4uZ2V0VGltZSgpOworCQl9CisJCVJCTWFuYWdlckdVSS5kZWJ1Z01zZygiTmV4dCBEYXRlOiAiICsgcmV0RGF0ZS50b1N0cmluZygpKTsKKwkJcmV0dXJuIHJldERhdGU7CisJfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHN0cmluZyBiYXNlZCB0ZXh0IHJlcG9ydCBhYm91dCBhbGwgb2YgdGhlIGxhbmd1YWdlIGZpbGVzIG9uIHJlY29yZAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWxsTGFuZ3VhZ2VSZXBvcnRzKGJvb2xlYW4gZGV0YWlsZWQpIHsKKyAgICAgICAgU3RyaW5nIHJldFN0ciA9IG5ldyBTdHJpbmcoKTsKKyAgICAgICAgcmV0U3RyID0gICAgIlJlc291cmNlIEJ1bmRsZSBSZXBvcnQ6ICIgKyByYm0uZ2V0QmFzZUNsYXNzKCk7CisgICAgICAgIHJldFN0ciArPSAiXG5SZXBvcnQgR2VuZXJhdGVkOiAgICAgICAiICsgKG5ldyBEYXRlKCkpLnRvU3RyaW5nKCkgKyAiXG5cbiI7CisgICAgICAgIFZlY3RvciBidW5kbGVzID0gcmJtLmdldEJ1bmRsZXMoKTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgYnVuZGxlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgcmV0U3RyICs9IGdldExhbmd1YWdlUmVwb3J0KGRldGFpbGVkLCAoQnVuZGxlKWJ1bmRsZXMuZWxlbWVudEF0KGkpKTsJCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldFN0cjsKKyAgICB9CisJCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0TGFuZ3VhZ2VSZXBvcnQoYm9vbGVhbiBkZXRhaWxlZCwgQnVuZGxlIGRpY3QpIHsKKyAgICAgICAgaWYgKGRpY3QgPT0gbnVsbCkgcmV0dXJuICIiOworICAgICAgICBTdHJpbmcgcmV0U3RyID0gbmV3IFN0cmluZygpOworICAgICAgICByZXRTdHIgKz0gIlxuTGFuZ3VhZ2U6ICIgKyAoZGljdC5sYW5ndWFnZSA9PSBudWxsID8gZGljdC5lbmNvZGluZyA6IGRpY3QubGFuZ3VhZ2UpOworICAgICAgICByZXRTdHIgKz0gKGRpY3QuY291bnRyeSA9PSBudWxsID8gIiIgOiAiIC0gQ291bnRyeTogIiArIGRpY3QuY291bnRyeSk7CisgICAgICAgIHJldFN0ciArPSAoZGljdC52YXJpYW50ID09IG51bGwgPyAiIiA6ICIgLSBWYXJpYW50OiAiICsgZGljdC52YXJpYW50KTsKKyAgICAgICAgcmV0U3RyICs9ICJcbiI7CisgICAgICAgIHJldFN0ciArPSAiICBOdW1iZXIgb2YgTkxTIGl0ZW1zIGluIHRoZSBmaWxlOiAiICsgZGljdC5hbGxJdGVtcy5zaXplKCkgKyAiXG4iOworCQkKKyAgICAgICAgaW50IHVudHJhbnNsYXRlZCA9IDA7CisgICAgICAgIFN0cmluZyB1bnRyYW5zU3RyID0gbmV3IFN0cmluZygpOworICAgICAgICBFbnVtZXJhdGlvbiBpdGVtcyA9IGRpY3QuYWxsSXRlbXMuZWxlbWVudHMoKTsKKyAgICAgICAgd2hpbGUgKGl0ZW1zLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICBCdW5kbGVJdGVtIHRlbXBJdGVtID0gKEJ1bmRsZUl0ZW0paXRlbXMubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIGlmICh0ZW1wSXRlbS5pc1RyYW5zbGF0ZWQoKSkgY29udGludWU7CisgICAgICAgICAgICB1bnRyYW5zbGF0ZWQrKzsKKyAgICAgICAgICAgIHVudHJhbnNTdHIgKz0gIiAiICsgdGVtcEl0ZW0uZ2V0S2V5KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0U3RyICs9ICIgIE51bWJlciBvZiBOTFMgaXRlbXMgbm90IHRyYW5zbGF0ZWQ6ICIgKyB1bnRyYW5zbGF0ZWQ7CisgICAgICAgIGlmIChkZXRhaWxlZCkgeworICAgICAgICAgICAgcmV0U3RyICs9ICJcbiAgVW50cmFuc2xhdGVkIE5MUyBrZXlzOiAiICsgdW50cmFuc1N0cjsJCisgICAgICAgIH0KKwkJCisgICAgICAgIHJldHVybiByZXRTdHI7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgYW4gWEhUTUwgZm9ybWF0dGVkIHJlcG9ydCBvbiB0aGUgc3RhdHVzIG9mIHRoZSBjdXJyZW50bHkgb3BlbmVkIHJlc291cmNlIGJ1bmRsZQorICAgICAqLworICAgIHB1YmxpYyBEb2N1bWVudCBnZXRIVE1MUmVwb3J0eihib29sZWFuIGRldGFpbGVkKSB7CisgICAgICAgIERvY3VtZW50IGh0bWwgPSBuZXcgRG9jdW1lbnRJbXBsKCk7CisgICAgICAgIEVsZW1lbnQgcm9vdCA9IGh0bWwuY3JlYXRlRWxlbWVudCgiSFRNTCIpOworICAgICAgICBodG1sLmFwcGVuZENoaWxkKHJvb3QpOworICAgICAgICBFbGVtZW50IGhlYWRfZWxlbSA9IGh0bWwuY3JlYXRlRWxlbWVudCgiSEVBRCIpOworICAgICAgICBFbGVtZW50IHRpdGxlX2VsZW0gPSBodG1sLmNyZWF0ZUVsZW1lbnQoIlRJVExFIik7CisgICAgICAgIFRleHQgICAgdGl0bGVfdGV4dCA9IGh0bWwuY3JlYXRlVGV4dE5vZGUoIlJlc291cmNlIEJ1bmRsZSBSZXBvcnQgLSAiICsgcmJtLmdldEJhc2VDbGFzcygpKTsKKyAgICAgICAgRWxlbWVudCBib2R5X2VsZW0gPSBodG1sLmNyZWF0ZUVsZW1lbnQoIkJPRFkiKTsKKyAgICAgICAgRWxlbWVudCBjZW50ZXIxX2VsZW0gPSBodG1sLmNyZWF0ZUVsZW1lbnQoIkNFTlRFUiIpOworICAgICAgICBFbGVtZW50IGgxX2VsZW0gPSBodG1sLmNyZWF0ZUVsZW1lbnQoIkgxIik7CisgICAgICAgIEVsZW1lbnQgY2VudGVyMl9lbGVtID0gaHRtbC5jcmVhdGVFbGVtZW50KCJDRU5URVIiKTsKKyAgICAgICAgRWxlbWVudCBoM19lbGVtID0gaHRtbC5jcmVhdGVFbGVtZW50KCJIMSIpOworICAgICAgICBUZXh0ICAgIHRpdGxlMV90ZXh0ID0gaHRtbC5jcmVhdGVUZXh0Tm9kZSgiUmVzb3VyY2UgQnVuZGxlIFJlcG9ydDogIiArIHJibS5nZXRCYXNlQ2xhc3MoKSk7CisgICAgICAgIFRleHQgICAgdGl0bGUyX3RleHQgPSBodG1sLmNyZWF0ZVRleHROb2RlKCJSZXBvcnQgR2VuZXJhdGVkOiAiICsgKG5ldyBEYXRlKCkpLnRvU3RyaW5nKCkpOworICAgICAgICBWZWN0b3IgYnVuZGxlcyA9IHJibS5nZXRCdW5kbGVzKCk7CisJCQorICAgICAgICB0aXRsZV9lbGVtLmFwcGVuZENoaWxkKHRpdGxlX3RleHQpOworICAgICAgICBoZWFkX2VsZW0uYXBwZW5kQ2hpbGQodGl0bGVfZWxlbSk7CisgICAgICAgIGgxX2VsZW0uYXBwZW5kQ2hpbGQodGl0bGUxX3RleHQpOworICAgICAgICBoM19lbGVtLmFwcGVuZENoaWxkKHRpdGxlMl90ZXh0KTsKKyAgICAgICAgY2VudGVyMV9lbGVtLmFwcGVuZENoaWxkKGgxX2VsZW0pOworICAgICAgICBjZW50ZXIyX2VsZW0uYXBwZW5kQ2hpbGQoaDNfZWxlbSk7CisgICAgICAgIGJvZHlfZWxlbS5hcHBlbmRDaGlsZChjZW50ZXIxX2VsZW0pOworICAgICAgICBib2R5X2VsZW0uYXBwZW5kQ2hpbGQoY2VudGVyMl9lbGVtKTsKKyAgICAgICAgcm9vdC5hcHBlbmRDaGlsZChoZWFkX2VsZW0pOworICAgICAgICByb290LmFwcGVuZENoaWxkKGJvZHlfZWxlbSk7CisgICAgICAgIAorICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBidW5kbGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBnZXRIVE1MTGFuZ3VhZ2VSZXBvcnR6KGh0bWwsIGJvZHlfZWxlbSwgZGV0YWlsZWQsIChCdW5kbGUpYnVuZGxlcy5lbGVtZW50QXQoaSkpOworICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgcmV0dXJuIGh0bWw7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFJldHVybnMgYSBIVE1MIHJlcG9ydCBhcyBhIFN0cmluZyBvYmplY3Qgb24gdGhlIHN0YXR1cyBvZiB0aGUgY3VycmVudGx5IG9wZW5lZCByZXNvdXJjZSBidW5kbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEhUTUxSZXBvcnQoYm9vbGVhbiBkZXRhaWxlZCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBidWZmZXIuYXBwZW5kKCI8SFRNTD5cbjxIRUFEPjxUSVRMRT5SZXNvdXJjZSBCdW5kbGUgUmVwb3J0IC0gIiArIHJibS5nZXRCYXNlQ2xhc3MoKSArICI8L1RJVExFPjwvSEVBRD5cbjxCT0RZPlxuIik7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIjxDRU5URVI+PEgxPlJlc291cmNlIEJ1bmRsZSBSZXBvcnQ6ICIgKyByYm0uZ2V0QmFzZUNsYXNzKCkgKyAiPC9IMT48L0NFTlRFUj5cbiIpOworICAgICAgICBidWZmZXIuYXBwZW5kKCI8Q0VOVEVSPjxIMz5SZXBvcnQgR2VuZXJhdGVkOiAiICsgKG5ldyBEYXRlKCkpLnRvU3RyaW5nKCkgKyAiPC9IMz48L0NFTlRFUj5cbiIpOworCQkKKyAgICAgICAgVmVjdG9yIGJ1bmRsZXMgPSByYm0uZ2V0QnVuZGxlcygpOworICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBidW5kbGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGdldEhUTUxMYW5ndWFnZVJlcG9ydChkZXRhaWxlZCwgKEJ1bmRsZSlidW5kbGVzLmVsZW1lbnRBdChpKSkpOwkKKyAgICAgICAgfQorCQkKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiPC9CT0RZPlxuPC9IVE1MPiIpOworICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisgICAgfQorCQorICAgIHByaXZhdGUgdm9pZCBnZXRIVE1MTGFuZ3VhZ2VSZXBvcnR6KERvY3VtZW50IGh0bWwsIEVsZW1lbnQgYm9keV9lbGVtLCBib29sZWFuIGRldGFpbGVkLCBCdW5kbGUgZGljdCkgeworICAgICAgICBFbGVtZW50IGgyX2VsZW0gPSBodG1sLmNyZWF0ZUVsZW1lbnQoIkgyIik7CisgICAgICAgIFRleHQgICAgaDJfdGV4dCA9IGh0bWwuY3JlYXRlVGV4dE5vZGUoIkxhbmd1YWdlOiAiICsgKGRpY3QubGFuZ3VhZ2UgPT0gbnVsbCA/IGRpY3QuZW5jb2RpbmcgOiBkaWN0Lmxhbmd1YWdlKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgIChkaWN0LmNvdW50cnkgPT0gbnVsbCA/ICIiIDogIiAtIENvdW50cnk6ICIgKyBkaWN0LmNvdW50cnkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGRpY3QudmFyaWFudCA9PSBudWxsID8gIiIgOiAiIC0gVmFyaWFudDogIiArIGRpY3QudmFyaWFudCkpOworICAgICAgICBFbGVtZW50IGJsb2NrX2VsZW0gPSBodG1sLmNyZWF0ZUVsZW1lbnQoIkJMT0NLUVVPVEUiKTsKKyAgICAgICAgRWxlbWVudCBwX2VsZW0gPSBodG1sLmNyZWF0ZUVsZW1lbnQoIlAiKTsKKyAgICAgICAgVGV4dCAgICBwX3RleHQgPSBodG1sLmNyZWF0ZVRleHROb2RlKCJOdW1iZXIgb2YgTkxTIGl0ZW1zIGluIHRoZSBmaWxlOiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcudmFsdWVPZihkaWN0LmFsbEl0ZW1zLnNpemUoKSkpOworICAgICAgICBFbGVtZW50IHVsX2VsZW0gPSBodG1sLmNyZWF0ZUVsZW1lbnQoIlVMIik7CisgICAgICAgIFRleHQgICAgdWxfdGV4dCA9IGh0bWwuY3JlYXRlVGV4dE5vZGUoIlVudHJhbnNsYXRlZCBOTFMga2V5czoiKTsKKwkJCisgICAgICAgIGgyX2VsZW0uYXBwZW5kQ2hpbGQoaDJfdGV4dCk7CisgICAgICAgIHBfZWxlbS5hcHBlbmRDaGlsZChwX3RleHQpOworICAgICAgICB1bF9lbGVtLmFwcGVuZENoaWxkKHVsX3RleHQpOworICAgICAgICBibG9ja19lbGVtLmFwcGVuZENoaWxkKHBfZWxlbSk7CisgICAgICAgIGJvZHlfZWxlbS5hcHBlbmRDaGlsZChoMl9lbGVtKTsKKyAgICAgICAgYm9keV9lbGVtLmFwcGVuZENoaWxkKGJsb2NrX2VsZW0pOworCQkKKyAgICAgICAgaW50IHVudHJhbnNsYXRlZCA9IDA7CisgICAgICAgIEVudW1lcmF0aW9uIGl0ZW1zID0gZGljdC5hbGxJdGVtcy5lbGVtZW50cygpOworICAgICAgICB3aGlsZSAoaXRlbXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIEJ1bmRsZUl0ZW0gdGVtcEl0ZW0gPSAoQnVuZGxlSXRlbSlpdGVtcy5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgaWYgKHRlbXBJdGVtLmlzVHJhbnNsYXRlZCgpKSBjb250aW51ZTsKKyAgICAgICAgICAgIHVudHJhbnNsYXRlZCsrOworICAgICAgICAgICAgaWYgKGRldGFpbGVkKSB7CisgICAgICAgICAgICAgICAgRWxlbWVudCBsaV9lbGVtID0gaHRtbC5jcmVhdGVFbGVtZW50KCJMSSIpOworICAgICAgICAgICAgICAgIFRleHQgICAgbGlfdGV4dCA9IGh0bWwuY3JlYXRlVGV4dE5vZGUodGVtcEl0ZW0uZ2V0S2V5KCkpOworICAgICAgICAgICAgICAgIGxpX2VsZW0uYXBwZW5kQ2hpbGQobGlfdGV4dCk7CisgICAgICAgICAgICAgICAgdWxfZWxlbS5hcHBlbmRDaGlsZChsaV9lbGVtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBFbGVtZW50IHAyX2VsZW0gPSBodG1sLmNyZWF0ZUVsZW1lbnQoIlAiKTsKKyAgICAgICAgVGV4dCAgICBwMl90ZXh0ID0gaHRtbC5jcmVhdGVUZXh0Tm9kZSgiTnVtYmVyIG9mIE5MUyBpdGVtcyBub3QgdHJhbnNsYXRlZDogIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKHVudHJhbnNsYXRlZCkpOworICAgICAgICBwMl9lbGVtLmFwcGVuZENoaWxkKHAyX3RleHQpOworICAgICAgICBibG9ja19lbGVtLmFwcGVuZENoaWxkKHAyX2VsZW0pOworICAgICAgICBpZiAoZGV0YWlsZWQpIGJsb2NrX2VsZW0uYXBwZW5kQ2hpbGQodWxfZWxlbSk7CisgICAgfQorCQorICAgIHByaXZhdGUgU3RyaW5nIGdldEhUTUxMYW5ndWFnZVJlcG9ydChib29sZWFuIGRldGFpbGVkLCBCdW5kbGUgZGljdCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBidWZmZXIuYXBwZW5kKCJcbjxIMj5MYW5ndWFnZTogIiArIChkaWN0Lmxhbmd1YWdlID09IG51bGwgPyBkaWN0LmVuY29kaW5nIDogZGljdC5sYW5ndWFnZSkpOworICAgICAgICBidWZmZXIuYXBwZW5kKGRpY3QuY291bnRyeSA9PSBudWxsID8gIiIgOiAiIC0gQ291bnRyeTogIiArIGRpY3QuY291bnRyeSk7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoZGljdC52YXJpYW50ID09IG51bGwgPyAiIiA6ICIgLSBWYXJpYW50OiAiICsgZGljdC52YXJpYW50KTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiPC9IMj5cbiIpOworICAgICAgICBidWZmZXIuYXBwZW5kKCI8QkxPQ0tRVU9URT5cbiIpOworICAgICAgICAKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiPFA+TnVtYmVyIG9mIE5MUyBpdGVtcyBpbiB0aGUgZmlsZTogIiArIFN0cmluZy52YWx1ZU9mKGRpY3QuYWxsSXRlbXMuc2l6ZSgpKSArICI8L1A+XG4iKTsKKyAgICAgICAgaW50IHVudHJhbnNsYXRlZCA9IDA7CisgICAgICAgIEVudW1lcmF0aW9uIGl0ZW1zID0gZGljdC5hbGxJdGVtcy5lbGVtZW50cygpOworICAgICAgICBTdHJpbmdCdWZmZXIgaW5uZXJCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIHdoaWxlIChpdGVtcy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgQnVuZGxlSXRlbSB0ZW1wSXRlbSA9IChCdW5kbGVJdGVtKWl0ZW1zLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBpZiAodGVtcEl0ZW0uaXNUcmFuc2xhdGVkKCkpIGNvbnRpbnVlOworICAgICAgICAgICAgdW50cmFuc2xhdGVkKys7CisgICAgICAgICAgICBpbm5lckJ1ZmZlci5hcHBlbmQoIjxMST4iICsgdGVtcEl0ZW0uZ2V0S2V5KCkgKyAiPC9MST5cbiIpOworICAgICAgICB9CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIjxQPk51bWJlciBvZiBOTFMgaXRlbXMgbm90IHRyYW5zbGF0ZWQ6ICIgKyBTdHJpbmcudmFsdWVPZih1bnRyYW5zbGF0ZWQpICsgIjwvUD5cbiIpOworICAgICAgICBpZiAoZGV0YWlsZWQpIHsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIjxVTD5VbnRyYW5zbGF0ZWQgTkxTIGtleXM6XG4iKTsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoaW5uZXJCdWZmZXIudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCI8L1VMPlxuIik7CisgICAgICAgIH0KKwkJCisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIjwvQkxPQ0tRVU9URT5cbiIpOworICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbiBYTUwgZm9ybWF0dGVkIHJlcG9ydCBvbiB0aGUgc3RhdHVzIG9mIHRoZSBjdXJyZW50bHkgb3BlbiByZXNvdXJjZSBidW5kbGUKKyAgICAgKi8gCisJCisgICAgcHVibGljIERvY3VtZW50IGdldFhNTFJlcG9ydHooYm9vbGVhbiBkZXRhaWxlZCkgeworICAgICAgICBEb2N1bWVudCB4bWwgPSBuZXcgRG9jdW1lbnRJbXBsKCk7CisgICAgICAgIEVsZW1lbnQgcm9vdCA9IHhtbC5jcmVhdGVFbGVtZW50KCJSRVBPUlQiKTsKKyAgICAgICAgcm9vdC5zZXRBdHRyaWJ1dGUoIkJBU0VDTEFTUyIsIHJibS5nZXRCYXNlQ2xhc3MoKSk7CisgICAgICAgIHJvb3Quc2V0QXR0cmlidXRlKCJEQVRFIiwgKG5ldyBEYXRlKCkpLnRvU3RyaW5nKCkpOworICAgICAgICB4bWwuYXBwZW5kQ2hpbGQocm9vdCk7CisKKyAgICAgICAgVmVjdG9yIGJ1bmRsZXMgPSByYm0uZ2V0QnVuZGxlcygpOworICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBidW5kbGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICByb290LmFwcGVuZENoaWxkKGdldFhNTExhbmd1YWdlUmVwb3J0eih4bWwsIGRldGFpbGVkLCAoQnVuZGxlKWJ1bmRsZXMuZWxlbWVudEF0KGkpKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHhtbDsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbiBYTUwgZm9ybWF0dGVkIHJlcG9ydCBhcyBhIFN0cmluZyBvYmplY3Qgb24gdGhlIHN0YXR1cyBvZiB0aGUgY3VycmVudGx5IG9wZW4gcmVzb3VyY2UgYnVuZGxlCisgICAgICovCisgICAgCisgICAgcHVibGljIFN0cmluZyBnZXRYTUxSZXBvcnQoYm9vbGVhbiBkZXRhaWxlZCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBidWZmZXIuYXBwZW5kKCI8P3htbCB2ZXJzaW9uPVwiMS4wXCI/PlxuIik7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIjxSRVBPUlQgQkFTRUNMQVNTPVwiIiArIHJibS5nZXRCYXNlQ2xhc3MoKSArICJcIiBEQVRFPVwiIiArIChuZXcgRGF0ZSgpKS50b1N0cmluZygpICsgIlwiPlxuIik7CisKKyAgICAgICAgVmVjdG9yIGJ1bmRsZXMgPSByYm0uZ2V0QnVuZGxlcygpOworICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBidW5kbGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGdldFhNTExhbmd1YWdlUmVwb3J0KGRldGFpbGVkLCAoQnVuZGxlKWJ1bmRsZXMuZWxlbWVudEF0KGkpKSk7CQorICAgICAgICB9CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIjwvUkVQT1JUPiIpOworICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisgICAgfQorCQorICAgIHByaXZhdGUgRWxlbWVudCBnZXRYTUxMYW5ndWFnZVJlcG9ydHooRG9jdW1lbnQgeG1sLCBib29sZWFuIGRldGFpbGVkLCBCdW5kbGUgZGljdCkgeworICAgICAgICBFbGVtZW50IGxhbmdfcmVwb3J0X2VsZW0gPSB4bWwuY3JlYXRlRWxlbWVudCgiTEFOR1VBR0VfUkVQT1JUIik7CisgICAgICAgIEVsZW1lbnQgbG9jYWxlX2VsZW0gPSB4bWwuY3JlYXRlRWxlbWVudCgiTE9DQUxFIik7CisgICAgICAgIGxvY2FsZV9lbGVtLnNldEF0dHJpYnV0ZSgiTEFOR1VBR0UiLCAoZGljdC5sYW5ndWFnZSA9PSBudWxsID8gZGljdC5lbmNvZGluZyA6IGRpY3QubGFuZ3VhZ2UpKTsKKyAgICAgICAgbG9jYWxlX2VsZW0uc2V0QXR0cmlidXRlKCJDT1VOVFJZIiwgKGRpY3QuY291bnRyeSA9PSBudWxsID8gIiIgOiBkaWN0LmNvdW50cnkpKTsKKyAgICAgICAgbG9jYWxlX2VsZW0uc2V0QXR0cmlidXRlKCJWQVJJQU5UIiwgKGRpY3QudmFyaWFudCA9PSBudWxsID8gIiIgOiBkaWN0LnZhcmlhbnQpKTsKKyAgICAgICAgRWxlbWVudCBubHNfdG90YWxfZWxlbSA9IHhtbC5jcmVhdGVFbGVtZW50KCJOTFNfVE9UQUwiKTsKKyAgICAgICAgVGV4dCAgICBubHNfdG90YWxfdGV4dCA9IHhtbC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcudmFsdWVPZihkaWN0LmFsbEl0ZW1zLnNpemUoKSkpOworICAgICAgICBFbGVtZW50IHVudHJhbnNsYXRlZF90b3RhbF9lbGVtID0geG1sLmNyZWF0ZUVsZW1lbnQoIlVOVFJBTlNMQVRFRF9UT1RBTCIpOworICAgICAgICBFbGVtZW50IHVudHJhbnNsYXRlZF9lbGVtID0geG1sLmNyZWF0ZUVsZW1lbnQoIlVOVFJBTlNMQVRFRCIpOworICAgICAgICAKKyAgICAgICAgbmxzX3RvdGFsX2VsZW0uYXBwZW5kQ2hpbGQobmxzX3RvdGFsX3RleHQpOworICAgICAgICBsYW5nX3JlcG9ydF9lbGVtLmFwcGVuZENoaWxkKGxvY2FsZV9lbGVtKTsKKyAgICAgICAgbGFuZ19yZXBvcnRfZWxlbS5hcHBlbmRDaGlsZChubHNfdG90YWxfZWxlbSk7CisgICAgICAgIGxhbmdfcmVwb3J0X2VsZW0uYXBwZW5kQ2hpbGQodW50cmFuc2xhdGVkX3RvdGFsX2VsZW0pOworICAgICAgICBpZiAoZGV0YWlsZWQpIGxhbmdfcmVwb3J0X2VsZW0uYXBwZW5kQ2hpbGQodW50cmFuc2xhdGVkX2VsZW0pOworCQkKKyAgICAgICAgaW50IHVudHJhbnNsYXRlZCA9IDA7CisgICAgICAgIEVudW1lcmF0aW9uIGl0ZW1zID0gZGljdC5hbGxJdGVtcy5lbGVtZW50cygpOworICAgICAgICB3aGlsZSAoaXRlbXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIEJ1bmRsZUl0ZW0gdGVtcEl0ZW0gPSAoQnVuZGxlSXRlbSlpdGVtcy5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgaWYgKHRlbXBJdGVtLmlzVHJhbnNsYXRlZCgpKSBjb250aW51ZTsKKyAgICAgICAgICAgIHVudHJhbnNsYXRlZCsrOworICAgICAgICAgICAgRWxlbWVudCByZXNvdXJjZV9lbGVtID0geG1sLmNyZWF0ZUVsZW1lbnQoIlJFU09VUkNFS0VZIik7CisgICAgICAgICAgICBUZXh0ICAgIHJlc291cmNlX3RleHQgPSB4bWwuY3JlYXRlVGV4dE5vZGUodGVtcEl0ZW0uZ2V0S2V5KCkpOworICAgICAgICAgICAgcmVzb3VyY2VfZWxlbS5hcHBlbmRDaGlsZChyZXNvdXJjZV90ZXh0KTsKKyAgICAgICAgICAgIHVudHJhbnNsYXRlZF9lbGVtLmFwcGVuZENoaWxkKHJlc291cmNlX2VsZW0pOworICAgICAgICB9CisgICAgICAgIFRleHQgdW50cmFuc2xhdGVkX3RvdGFsX3RleHQgPSB4bWwuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLnZhbHVlT2YodW50cmFuc2xhdGVkKSk7CisgICAgICAgIHVudHJhbnNsYXRlZF90b3RhbF9lbGVtLmFwcGVuZENoaWxkKHVudHJhbnNsYXRlZF90b3RhbF90ZXh0KTsKKwkJCisgICAgICAgIHJldHVybiBsYW5nX3JlcG9ydF9lbGVtOworICAgIH0KKwkKKyAgICBwcml2YXRlIFN0cmluZyBnZXRYTUxMYW5ndWFnZVJlcG9ydChib29sZWFuIGRldGFpbGVkLCBCdW5kbGUgZGljdCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBidWZmZXIuYXBwZW5kKCI8TEFOR1VBR0VfUkVQT1JUPlxuIik7CisgICAgICAgIAorICAgICAgICBidWZmZXIuYXBwZW5kKCJcblx0PExPQ0FMRSBMQU5HVUFHRT1cIiIgKyAoZGljdC5sYW5ndWFnZSA9PSBudWxsID8gZGljdC5lbmNvZGluZyA6IGRpY3QubGFuZ3VhZ2UpKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiXCIgQ09VTlRSWT1cIiIgKyAoZGljdC5jb3VudHJ5ID09IG51bGwgPyAiIiA6IGRpY3QuY291bnRyeSkpOworICAgICAgICBidWZmZXIuYXBwZW5kKCJcIiBWQVJJQU5UPVwiIiArIChkaWN0LnZhcmlhbnQgPT0gbnVsbCA/ICIiIDogZGljdC52YXJpYW50KSArICJcIi8+XG4iKTsKKwkJCisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIlx0PE5MU19UT1RBTD4iICsgU3RyaW5nLnZhbHVlT2YoZGljdC5hbGxJdGVtcy5zaXplKCkpICsgIjwvTkxTX1RPVEFMPlxuIik7CisgICAgICAgIGludCB1bnRyYW5zbGF0ZWQgPSAwOworICAgICAgICBFbnVtZXJhdGlvbiBpdGVtcyA9IGRpY3QuYWxsSXRlbXMuZWxlbWVudHMoKTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGlubmVyQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICB3aGlsZSAoaXRlbXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIEJ1bmRsZUl0ZW0gdGVtcEl0ZW0gPSAoQnVuZGxlSXRlbSlpdGVtcy5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgaWYgKHRlbXBJdGVtLmlzVHJhbnNsYXRlZCgpKSBjb250aW51ZTsKKyAgICAgICAgICAgIHVudHJhbnNsYXRlZCsrOworICAgICAgICAgICAgaW5uZXJCdWZmZXIuYXBwZW5kKCJcdFx0PFJFU09VUkNFS0VZPiIgKyB0ZW1wSXRlbS5nZXRLZXkoKSArICI8L1JFU09VUkNFS0VZPlxuIik7CisgICAgICAgIH0KKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiXHQ8VU5UUkFOU0xBVEVEX1RPVEFMPiIgKyBTdHJpbmcudmFsdWVPZih1bnRyYW5zbGF0ZWQpICsgIjwvVU5UUkFOU0xBVEVEX1RPVEFMPlxuIik7CisgICAgICAgIGlmIChkZXRhaWxlZCkgeworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiXHQ8VU5UUkFOU0xBVEVEPlxuIik7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGlubmVyQnVmZmVyLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiXHQ8L1VOVFJBTlNMQVRFRD5cbiIpOworICAgICAgICB9CisJCQorICAgICAgICBidWZmZXIuYXBwZW5kKCI8L0xBTkdVQUdFX1JFUE9SVD5cbiIpOworICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisgICAgfQorCQorCXByaXZhdGUgdm9pZCB1cGRhdGVEYXRlRmllbGRzKCkgeworCQlpZiAobmV4dFJlcG9ydCA9PSBudWxsKSBuZXh0UmVwb3J0TGFiZWwuc2V0VGV4dChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInJlcG9ydGVyX25leHRfcmVwb3J0IiwgIi0tIikpOworCQllbHNlIG5leHRSZXBvcnRMYWJlbC5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigicmVwb3J0ZXJfbmV4dF9yZXBvcnQiLCBuZXh0UmVwb3J0LnRvU3RyaW5nKCkpKTsKKwkJaWYgKGxhc3RSZXBvcnQgPT0gbnVsbCkgbGFzdFJlcG9ydExhYmVsLnNldFRleHQoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJyZXBvcnRlcl9sYXN0X3JlcG9ydCIsICItLSIpKTsKKwkJZWxzZSBsYXN0UmVwb3J0TGFiZWwuc2V0VGV4dChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInJlcG9ydGVyX2xhc3RfcmVwb3J0IiwgbGFzdFJlcG9ydC50b1N0cmluZygpKSk7CisJfQorCQorCXByaXZhdGUgdm9pZCB1cGRhdGVTdGF0dXNDb21wb25lbnRzKCkgeworCQlpZiAocnVubmluZykgeworCQkJc3RhdHVzTGFiZWwuc2V0VGV4dChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInJlcG9ydGVyX3N0YXR1c19ydW5uaW5nIikpOworCQkJc3RhdHVzTGFiZWwuc2V0Rm9yZWdyb3VuZChDb2xvci5ncmVlbik7CisJCQlzdGF0dXNCdXR0b24uc2V0VGV4dChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInJlcG9ydGVyX2J1dHRvbl9zdG9wIikpOworCQl9IGVsc2UgeworCQkJc3RhdHVzTGFiZWwuc2V0VGV4dChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInJlcG9ydGVyX3N0YXR1c19zdG9wcGVkIikpOworCQkJc3RhdHVzTGFiZWwuc2V0Rm9yZWdyb3VuZChDb2xvci5yZWQpOworCQkJc3RhdHVzQnV0dG9uLnNldFRleHQoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJyZXBvcnRlcl9idXR0b25fc3RhcnQiKSk7CisJCX0KKwl9CisJCisJcHJpdmF0ZSB2b2lkIHNldENvbXBvbmVudHNUb0RlZmF1bHRzKCkgeworCQlpZiAoKHJ1bm5pbmcgJiYgUHJlZmVyZW5jZXMuZ2V0UHJlZmVyZW5jZSgicmVwb3J0ZXJfZW5hYmxlZCIpLmVxdWFscygiTm8iKSkgfHwKKwkJCSghcnVubmluZyAmJiBQcmVmZXJlbmNlcy5nZXRQcmVmZXJlbmNlKCJyZXBvcnRlcl9lbmFibGVkIikuZXF1YWxzKCJZZXMiKSkpIHRvZ2dsZVN0YXR1cygpOworCQlpZiAoUHJlZmVyZW5jZXMuZ2V0UHJlZmVyZW5jZSgicmVwb3J0ZXJfZm9ybWF0X3RleHRfZW5hYmxlZCIpICE9IG51bGwpCisJCQl0ZXh0Q2hlY2suc2V0U2VsZWN0ZWQoUHJlZmVyZW5jZXMuZ2V0UHJlZmVyZW5jZSgicmVwb3J0ZXJfZm9ybWF0X3RleHRfZW5hYmxlZCIpLmVxdWFscygiWWVzIikpOworCQlpZiAoUHJlZmVyZW5jZXMuZ2V0UHJlZmVyZW5jZSgicmVwb3J0ZXJfZm9ybWF0X2h0bWxfZW5hYmxlZCIpICE9IG51bGwpCisJCQlodG1sQ2hlY2suc2V0U2VsZWN0ZWQoUHJlZmVyZW5jZXMuZ2V0UHJlZmVyZW5jZSgicmVwb3J0ZXJfZm9ybWF0X2h0bWxfZW5hYmxlZCIpLmVxdWFscygiWWVzIikpOworCQlpZiAoUHJlZmVyZW5jZXMuZ2V0UHJlZmVyZW5jZSgicmVwb3J0ZXJfZm9ybWF0X3htbF9lbmFibGVkIikgIT0gbnVsbCkKKwkJCQl4bWxDaGVjay5zZXRTZWxlY3RlZChQcmVmZXJlbmNlcy5nZXRQcmVmZXJlbmNlKCJyZXBvcnRlcl9mb3JtYXRfeG1sX2VuYWJsZWQiKS5lcXVhbHMoIlllcyIpKTsKKwkJaWYgKFByZWZlcmVuY2VzLmdldFByZWZlcmVuY2UoInJlcG9ydGVyX2Zvcm1hdF90ZXh0X2ZpbGUiKSAhPSBudWxsICYmCisJCQkhUHJlZmVyZW5jZXMuZ2V0UHJlZmVyZW5jZSgicmVwb3J0ZXJfZm9ybWF0X3RleHRfZmlsZSIpLmVxdWFscygiIikpCisJCQl0ZXh0RmllbGQuc2V0VGV4dChQcmVmZXJlbmNlcy5nZXRQcmVmZXJlbmNlKCJyZXBvcnRlcl9mb3JtYXRfdGV4dF9maWxlIikpOworCQlpZiAoUHJlZmVyZW5jZXMuZ2V0UHJlZmVyZW5jZSgicmVwb3J0ZXJfZm9ybWF0X2h0bWxfZmlsZSIpICE9IG51bGwgJiYKKwkJCSFQcmVmZXJlbmNlcy5nZXRQcmVmZXJlbmNlKCJyZXBvcnRlcl9mb3JtYXRfaHRtbF9maWxlIikuZXF1YWxzKCIiKSkKKwkJCWh0bWxGaWVsZC5zZXRUZXh0KFByZWZlcmVuY2VzLmdldFByZWZlcmVuY2UoInJlcG9ydGVyX2Zvcm1hdF9odG1sX2ZpbGUiKSk7CisJCWlmIChQcmVmZXJlbmNlcy5nZXRQcmVmZXJlbmNlKCJyZXBvcnRlcl9mb3JtYXRfeG1sX2ZpbGUiKSAhPSBudWxsICYmCisJCQkhUHJlZmVyZW5jZXMuZ2V0UHJlZmVyZW5jZSgicmVwb3J0ZXJfZm9ybWF0X3htbF9maWxlIikuZXF1YWxzKCIiKSkKKwkJCXhtbEZpZWxkLnNldFRleHQoUHJlZmVyZW5jZXMuZ2V0UHJlZmVyZW5jZSgicmVwb3J0ZXJfZm9ybWF0X3htbF9maWxlIikpOworCQlpZiAoUHJlZmVyZW5jZXMuZ2V0UHJlZmVyZW5jZSgicmVwb3J0ZXJfZm9ybWF0X3RleHRfZGV0YWlsIikgIT0gbnVsbCAmJgorCQkJIVByZWZlcmVuY2VzLmdldFByZWZlcmVuY2UoInJlcG9ydGVyX2Zvcm1hdF90ZXh0X2RldGFpbCIpLmVxdWFscygiIikpCisJCQlzZWxlY3RDb21ib1ZhbHVlKHRleHRDb21ibywgUHJlZmVyZW5jZXMuZ2V0UHJlZmVyZW5jZSgicmVwb3J0ZXJfZm9ybWF0X3RleHRfZGV0YWlsIikpOworCQlpZiAoUHJlZmVyZW5jZXMuZ2V0UHJlZmVyZW5jZSgicmVwb3J0ZXJfZm9ybWF0X2h0bWxfZGV0YWlsIikgIT0gbnVsbCAmJgorCQkJIVByZWZlcmVuY2VzLmdldFByZWZlcmVuY2UoInJlcG9ydGVyX2Zvcm1hdF9odG1sX2RldGFpbCIpLmVxdWFscygiIikpCisJCQlzZWxlY3RDb21ib1ZhbHVlKGh0bWxDb21ibywgUHJlZmVyZW5jZXMuZ2V0UHJlZmVyZW5jZSgicmVwb3J0ZXJfZm9ybWF0X2h0bWxfZGV0YWlsIikpOworCQlpZiAoUHJlZmVyZW5jZXMuZ2V0UHJlZmVyZW5jZSgicmVwb3J0ZXJfZm9ybWF0X3htbF9kZXRhaWwiKSAhPSBudWxsICYmCisJCQkhUHJlZmVyZW5jZXMuZ2V0UHJlZmVyZW5jZSgicmVwb3J0ZXJfZm9ybWF0X3htbF9kZXRhaWwiKS5lcXVhbHMoIiIpKQorCQkJc2VsZWN0Q29tYm9WYWx1ZSh4bWxDb21ibywgUHJlZmVyZW5jZXMuZ2V0UHJlZmVyZW5jZSgicmVwb3J0ZXJfZm9ybWF0X3htbF9kZXRhaWwiKSk7CisJCWlmIChQcmVmZXJlbmNlcy5nZXRQcmVmZXJlbmNlKCJyZXBvcnRlcl9pbnRlcnZhbCIpLmVxdWFscygiU2VxdWVudGlhbCIpKQorCQkJc2VxdWVudGlhbFJhZGlvLnNldFNlbGVjdGVkKHRydWUpOworCQllbHNlIGRlZmluZWRSYWRpby5zZXRTZWxlY3RlZCh0cnVlKTsKKwkJaWYgKFByZWZlcmVuY2VzLmdldFByZWZlcmVuY2UoInJlcG9ydGVyX2ludGVydmFsX3NlcXVlbnRpYWxfdmFsdWUiKSAhPSBudWxsICYmCisJCQkhUHJlZmVyZW5jZXMuZ2V0UHJlZmVyZW5jZSgicmVwb3J0ZXJfaW50ZXJ2YWxfc2VxdWVudGlhbF92YWx1ZSIpLmVxdWFscygiIikpCisJCQlzZWxlY3RDb21ib1ZhbHVlKHZhbHVlQ29tYm8sIFByZWZlcmVuY2VzLmdldFByZWZlcmVuY2UoInJlcG9ydGVyX2ludGVydmFsX3NlcXVlbnRpYWxfdmFsdWUiKSk7CisJCWlmIChQcmVmZXJlbmNlcy5nZXRQcmVmZXJlbmNlKCJyZXBvcnRlcl9pbnRlcnZhbF9zZXF1ZW50aWFsX3VuaXRzIikgIT0gbnVsbCAmJgorCQkJIVByZWZlcmVuY2VzLmdldFByZWZlcmVuY2UoInJlcG9ydGVyX2ludGVydmFsX3NlcXVlbnRpYWxfdW5pdHMiKS5lcXVhbHMoIiIpKQorCQkJc2VsZWN0Q29tYm9WYWx1ZSh2YWx1ZUNvbWJvLCBQcmVmZXJlbmNlcy5nZXRQcmVmZXJlbmNlKCJyZXBvcnRlcl9pbnRlcnZhbF9zZXF1ZW50aWFsX3VuaXRzIikpOworCQlpZiAoUHJlZmVyZW5jZXMuZ2V0UHJlZmVyZW5jZSgicmVwb3J0ZXJfaW50ZXJ2YWxfZGVmaW5lZF9ob3VyIikgIT0gbnVsbCAmJgorCQkJIVByZWZlcmVuY2VzLmdldFByZWZlcmVuY2UoInJlcG9ydGVyX2ludGVydmFsX2RlZmluZWRfaG91ciIpLmVxdWFscygiIikpCisJCQlzZWxlY3RDb21ib1ZhbHVlKGhvdXJDb21ibywgUHJlZmVyZW5jZXMuZ2V0UHJlZmVyZW5jZSgicmVwb3J0ZXJfaW50ZXJ2YWxfZGVmaW5lZF9ob3VyIikpOworCQlpZiAoUHJlZmVyZW5jZXMuZ2V0UHJlZmVyZW5jZSgicmVwb3J0ZXJfaW50ZXJ2YWxfZGVmaW5lZF9kYXkiKSAhPSBudWxsICYmCisJCQkhUHJlZmVyZW5jZXMuZ2V0UHJlZmVyZW5jZSgicmVwb3J0ZXJfaW50ZXJ2YWxfZGVmaW5lZF9kYXkiKS5lcXVhbHMoIiIpKQorCQkJc2VsZWN0Q29tYm9WYWx1ZShkYXlDb21ibywgUHJlZmVyZW5jZXMuZ2V0UHJlZmVyZW5jZSgicmVwb3J0ZXJfaW50ZXJ2YWxfZGVmaW5lZF9kYXkiKSk7CisJCWlmIChQcmVmZXJlbmNlcy5nZXRQcmVmZXJlbmNlKCJyZXBvcnRlcl9pbnRlcnZhbF9kZWZpbmVkX21pbnV0ZSIpICE9IG51bGwgJiYKKwkJCSFQcmVmZXJlbmNlcy5nZXRQcmVmZXJlbmNlKCJyZXBvcnRlcl9pbnRlcnZhbF9kZWZpbmVkX21pbnV0ZSIpLmVxdWFscygiIikpCisJCQlzZWxlY3RDb21ib1ZhbHVlKG1pbnV0ZUNvbWJvLCBQcmVmZXJlbmNlcy5nZXRQcmVmZXJlbmNlKCJyZXBvcnRlcl9pbnRlcnZhbF9kZWZpbmVkX21pbnV0ZSIpKTsKKwkJaWYgKFByZWZlcmVuY2VzLmdldFByZWZlcmVuY2UoInJlcG9ydGVyX3NjYW5fZmlsZSIpICE9IG51bGwgJiYKKwkJCSFQcmVmZXJlbmNlcy5nZXRQcmVmZXJlbmNlKCJyZXBvcnRlcl9zY2FuX2ZpbGUiKS5lcXVhbHMoIiIpKQorCQkJc2NhbkZpZWxkLnNldFRleHQoUHJlZmVyZW5jZXMuZ2V0UHJlZmVyZW5jZSgicmVwb3J0ZXJfc2Nhbl9maWxlIikpOworCQlpZiAoUHJlZmVyZW5jZXMuZ2V0UHJlZmVyZW5jZSgicmVwb3J0ZXJfcGVyZm9ybV9zY2FuIikgIT0gbnVsbCkKKwkJCXNjYW5DaGVjay5zZXRTZWxlY3RlZChQcmVmZXJlbmNlcy5nZXRQcmVmZXJlbmNlKCJyZXBvcnRlcl9wZXJmb3JtX3NjYW4iKS5lcXVhbHMoIlllcyIpKTsKKwl9CisJCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZWxlY3RDb21ib1ZhbHVlKEpDb21ib0JveCBib3gsIFN0cmluZyB2YWx1ZSkgeworCQlmb3IgKGludCBpPTA7IGkgPCBib3guZ2V0SXRlbUNvdW50KCk7IGkrKykgeworCQkJaWYgKGJveC5nZXRJdGVtQXQoaSkudG9TdHJpbmcoKS5lcXVhbHModmFsdWUpKSB7CisJCQkJYm94LnNldFNlbGVjdGVkSW5kZXgoaSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJCisJcHJpdmF0ZSB2b2lkIHNhdmVEZWZhdWx0cygpIHsKKwkJLy8gU2F2ZSBmb3JtYXQgb3B0aW9ucworCQlQcmVmZXJlbmNlcy5zZXRQcmVmZXJlbmNlKCJyZXBvcnRlcl9mb3JtYXRfdGV4dF9lbmFibGVkIiwgKHRleHRDaGVjay5pc1NlbGVjdGVkKCkgPyAiWWVzIiA6ICJObyIpKTsKKwkJUHJlZmVyZW5jZXMuc2V0UHJlZmVyZW5jZSgicmVwb3J0ZXJfZm9ybWF0X3RleHRfZmlsZSIsIHRleHRGaWVsZC5nZXRUZXh0KCkpOworCQlQcmVmZXJlbmNlcy5zZXRQcmVmZXJlbmNlKCJyZXBvcnRlcl9mb3JtYXRfdGV4dF9kZXRhaWwiLCB0ZXh0Q29tYm8uZ2V0U2VsZWN0ZWRJdGVtKCkudG9TdHJpbmcoKSk7CisJCVByZWZlcmVuY2VzLnNldFByZWZlcmVuY2UoInJlcG9ydGVyX2Zvcm1hdF9odG1sX2VuYWJsZWQiLCAoaHRtbENoZWNrLmlzU2VsZWN0ZWQoKSA/ICJZZXMiIDogIk5vIikpOworCQlQcmVmZXJlbmNlcy5zZXRQcmVmZXJlbmNlKCJyZXBvcnRlcl9mb3JtYXRfaHRtbF9maWxlIiwgaHRtbEZpZWxkLmdldFRleHQoKSk7CisJCVByZWZlcmVuY2VzLnNldFByZWZlcmVuY2UoInJlcG9ydGVyX2Zvcm1hdF9odG1sX2RldGFpbCIsIGh0bWxDb21iby5nZXRTZWxlY3RlZEl0ZW0oKS50b1N0cmluZygpKTsKKwkJUHJlZmVyZW5jZXMuc2V0UHJlZmVyZW5jZSgicmVwb3J0ZXJfZm9ybWF0X3htbF9lbmFibGVkIiwgKHhtbENoZWNrLmlzU2VsZWN0ZWQoKSA/ICJZZXMiIDogIk5vIikpOworCQlQcmVmZXJlbmNlcy5zZXRQcmVmZXJlbmNlKCJyZXBvcnRlcl9mb3JtYXRfeG1sX2ZpbGUiLCB4bWxGaWVsZC5nZXRUZXh0KCkpOworCQlQcmVmZXJlbmNlcy5zZXRQcmVmZXJlbmNlKCJyZXBvcnRlcl9mb3JtYXRfeG1sX2RldGFpbCIsIHhtbENvbWJvLmdldFNlbGVjdGVkSXRlbSgpLnRvU3RyaW5nKCkpOworCQlQcmVmZXJlbmNlcy5zZXRQcmVmZXJlbmNlKCJyZXBvcnRlcl9zY2FuX2ZpbGUiLCBzY2FuRmllbGQuZ2V0VGV4dCgpKTsKKwkJUHJlZmVyZW5jZXMuc2V0UHJlZmVyZW5jZSgicmVwb3J0ZXJfcGVyZm9ybV9zY2FuIiwgKHNjYW5DaGVjay5pc1NlbGVjdGVkKCkgPyAiWWVzIiA6ICJObyIpKTsKKwkJLy8gU2F2ZSBpbnRlcnZhbCBvcHRpb25zCisJCVByZWZlcmVuY2VzLnNldFByZWZlcmVuY2UoInJlcG9ydGVyX2ludGVydmFsIiwgKHNlcXVlbnRpYWxSYWRpby5pc1NlbGVjdGVkKCkgPyAiU2VxdWVudGlhbCIgOiAiRGVmaW5lZCIpKTsKKwkJUHJlZmVyZW5jZXMuc2V0UHJlZmVyZW5jZSgicmVwb3J0ZXJfaW50ZXJ2YWxfc2VxdWVudGlhbF92YWx1ZSIsIHZhbHVlQ29tYm8uZ2V0U2VsZWN0ZWRJdGVtKCkudG9TdHJpbmcoKSk7CisJCVByZWZlcmVuY2VzLnNldFByZWZlcmVuY2UoInJlcG9ydGVyX2ludGVydmFsX3NlcXVlbnRpYWxfdW5pdHMiLCB1bml0Q29tYm8uZ2V0U2VsZWN0ZWRJdGVtKCkudG9TdHJpbmcoKSk7CisJCVByZWZlcmVuY2VzLnNldFByZWZlcmVuY2UoInJlcG9ydGVyX2ludGVydmFsX2RlZmluZWRfaG91ciIsIGhvdXJDb21iby5nZXRTZWxlY3RlZEl0ZW0oKS50b1N0cmluZygpKTsKKwkJUHJlZmVyZW5jZXMuc2V0UHJlZmVyZW5jZSgicmVwb3J0ZXJfaW50ZXJ2YWxfZGVmaW5lZF9taW51dGUiLCBtaW51dGVDb21iby5nZXRTZWxlY3RlZEl0ZW0oKS50b1N0cmluZygpKTsKKwkJUHJlZmVyZW5jZXMuc2V0UHJlZmVyZW5jZSgicmVwb3J0ZXJfaW50ZXJ2YWxfZGVmaW5lZF9kYXkiLCBkYXlDb21iby5nZXRTZWxlY3RlZEl0ZW0oKS50b1N0cmluZygpKTsKKwkJLy8gU2F2ZSBzeXN0ZW0gb3B0aW9ucworCQlQcmVmZXJlbmNlcy5zZXRQcmVmZXJlbmNlKCJyZXBvcnRlcl9lbmFibGVkIiwgKHJ1bm5pbmcgPyAiWWVzIiA6ICJObyIpKTsKKwkJLy8gV3JpdGUgdGhlIHByZWZlcmVuY2VzCisJCXRyeSB7CisJCQlQcmVmZXJlbmNlcy5zYXZlUHJlZmVyZW5jZXMoKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisJCQkvLyBUT0RPOiBXYXJuIG9mIGVycm9yIHRocm91Z2ggSk9wdGlvblBhbmUKKwkJCWlvZS5wcmludFN0YWNrVHJhY2UoKTsKKwkJfQorCX0KKwkKKwlwcml2YXRlIHZvaWQgdG9nZ2xlU3RhdHVzKCkgeworCQlpZiAocnVubmluZykgeworCQkJcnVubmluZyA9IGZhbHNlOworCQl9IGVsc2UgeworCQkJcnVubmluZyA9IHRydWU7CisJCX0KKwkJdXBkYXRlU3RhdHVzQ29tcG9uZW50cygpOworCX0KKwkKKwlwcml2YXRlIHZvaWQgaW5pdENvbXBvbmVudHMoKSB7CisJCQorCQkvLyBGaWxlIGNob29zZXJzCisJCWJ1bmRsZUZpbGVDaG9vc2VyLnNldEZpbGVGaWx0ZXIobmV3IGphdmF4LnN3aW5nLmZpbGVjaG9vc2VyLkZpbGVGaWx0ZXIoKSB7CisJCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBmKSB7CisJCQkJaWYgKGYuaXNEaXJlY3RvcnkoKSkgcmV0dXJuIHRydWU7CisJCQkJCisJCQkJU3RyaW5nIG5hbWUgPSBmLmdldE5hbWUoKTsKKwkJCQlpZiAoIShuYW1lLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi5wcm9wZXJ0aWVzIikpKSByZXR1cm4gZmFsc2U7CisJCQkJaWYgKG5hbWUuaW5kZXhPZigiXyIpID4gMCkgcmV0dXJuIGZhbHNlOworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQorCQkJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKwkJCQlyZXR1cm4gUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJkaWFsb2dfZmlsZV9maWx0ZXJfZGVzY3JpcHRpb24iKTsKKwkJCX0KKwkJfSk7CisJCWJ1bmRsZUZpbGVDaG9vc2VyLnNldFNlbGVjdGVkRmlsZShuZXcgRmlsZShQcmVmZXJlbmNlcy5nZXRQcmVmZXJlbmNlKCJyZXBvcnRlcl9iYXNlX2NsYXNzX2ZpbGUiKSkpOworCQkKKwkJZGlyZWN0b3J5RmlsZUNob29zZXIuc2V0RmlsZUZpbHRlcihuZXcgamF2YXguc3dpbmcuZmlsZWNob29zZXIuRmlsZUZpbHRlcigpIHsKKwkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGYpIHsKKwkJCQlpZiAoZi5pc0RpcmVjdG9yeSgpKSByZXR1cm4gdHJ1ZTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCisJCQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworCQkJCXJldHVybiBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImRpcmVjdG9yeSIpOworCQkJfQorCQl9KTsKKwkJZGlyZWN0b3J5RmlsZUNob29zZXIuc2V0U2VsZWN0ZWRGaWxlKG5ldyBGaWxlKFByZWZlcmVuY2VzLmdldFByZWZlcmVuY2UoInJlcG9ydGVyX291dHB1dF9kaXJlY3RvcnkiKSkpOworCQkKKwkJc2NhbkZpbGVDaG9vc2VyLnNldEZpbGVGaWx0ZXIobmV3IGphdmF4LnN3aW5nLmZpbGVjaG9vc2VyLkZpbGVGaWx0ZXIoKSB7CisJCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBmKSB7CisJCQkJaWYgKGYuaXNEaXJlY3RvcnkoKSkgcmV0dXJuIHRydWU7CisJCQkJaWYgKGYuZ2V0TmFtZSgpLmVuZHNXaXRoKCIueG1sIikpIHJldHVybiB0cnVlOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkKKwkJCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisJCQkJcmV0dXJuIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX2ZpbGVfZmlsdGVyX2Rlc2NyaXB0aW9uX3NjYW4iKTsKKwkJCX0KKwkJfSk7CisJCXNjYW5GaWxlQ2hvb3Nlci5zZXRTZWxlY3RlZEZpbGUobmV3IEZpbGUoUHJlZmVyZW5jZXMuZ2V0UHJlZmVyZW5jZSgicmVwb3J0ZXJfc2Nhbl9maWxlIikpKTsKKwkJCisJCS8vIE5ldyB0b3AgbGV2ZWwgY29tcG9uZW50cworCQlKUGFuZWwgc3RhdHVzUGFuZWwgPSBuZXcgSlBhbmVsKCk7CisJCUpQYW5lbCBpbnRlcnZhbFBhbmVsID0gbmV3IEpQYW5lbCgpOworCQlKUGFuZWwgb3B0aW9uc1BhbmVsID0gbmV3IEpQYW5lbCgpOworCQlKUGFuZWwgZm9ybWF0UGFuZWwgPSBuZXcgSlBhbmVsKCk7CisJCUJveCBtYWluQm94ID0gbmV3IEJveChCb3hMYXlvdXQuWV9BWElTKTsKKwkJaW50IHdpZHRoID0gNjAwOworCQlpbnQgaGVpZ2h0ID0gNjAwOworCQlpbnQgY29tcEhlaWdodCA9IDIwOworCQlEaW1lbnNpb24gbWFpbkRpbSA9IG5ldyBEaW1lbnNpb24od2lkdGgsaGVpZ2h0KTsKKwkJCisJCXN0YXR1c1BhbmVsLnNldEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZVRpdGxlZEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZUV0Y2hlZEJvcmRlcigpLAorCQkJCQkJCQkJCQkJCQkJICAgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJyZXBvcnRlcl9wYW5lbF9zdGF0dXMiKSkpOworCQlpbnRlcnZhbFBhbmVsLnNldEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZVRpdGxlZEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZUV0Y2hlZEJvcmRlcigpLAorCQkJCQkJCQkJCQkJCQkJICAgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJyZXBvcnRlcl9wYW5lbF9pbnRlcnZhbCIpKSk7CisJCW9wdGlvbnNQYW5lbC5zZXRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVUaXRsZWRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVFdGNoZWRCb3JkZXIoKSwKKwkJCQkJCQkJCQkJCQkJCSAgIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigicmVwb3J0ZXJfcGFuZWxfb3B0aW9ucyIpKSk7CisJCWZvcm1hdFBhbmVsLnNldEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZVRpdGxlZEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZUV0Y2hlZEJvcmRlcigpLAorCQkJCQkJCQkJCQkJCQkJICAgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJyZXBvcnRlcl9wYW5lbF9vdXRwdXRfZm9ybWF0IikpKTsKKwkJCisJCS8vICoqIFNUQVRVUyBQQU5FTCBTRVRVUCAqKgorCQlKQnV0dG9uIG5vd0J1dHRvbiA9IG5ldyBKQnV0dG9uKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigicmVwb3J0ZXJfYnV0dG9uX25vdyIpKTsKKwkJQm94ICAgICBzdGF0dXNCb3ggPSBuZXcgQm94KEJveExheW91dC5ZX0FYSVMpOworCQlKUGFuZWwgIHN0YXR1c1BhbmVsMSA9IG5ldyBKUGFuZWwoKTsKKwkJSlBhbmVsICBzdGF0dXNQYW5lbDIgPSBuZXcgSlBhbmVsKCk7CisJCUpQYW5lbCAgc3RhdHVzUGFuZWwzID0gbmV3IEpQYW5lbCgpOworCQlKUGFuZWwgIHN0YXR1c1BhbmVsNCA9IG5ldyBKUGFuZWwoKTsKKwkJc3RhdHVzQnV0dG9uID0gbmV3IEpCdXR0b24oUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJyZXBvcnRlcl9idXR0b25fc3RhcnQiKSk7CisJCXN0YXR1c0xhYmVsID0gbmV3IEpMYWJlbChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInJlcG9ydGVyX3N0YXR1c19zdG9wcGVkIikpOworCQluZXh0UmVwb3J0TGFiZWwgPSBuZXcgSkxhYmVsKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigicmVwb3J0ZXJfbmV4dF9yZXBvcnQiLCAiLS0iKSk7CisJCWxhc3RSZXBvcnRMYWJlbCA9IG5ldyBKTGFiZWwoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJyZXBvcnRlcl9sYXN0X3JlcG9ydCIsICItLSIpKTsKKwkJc3RhdHVzTGFiZWwuc2V0Rm9udChuZXcgRm9udCgic2VyaWYiLEZvbnQuQk9MRCwxNCkpOworCQlzdGF0dXNMYWJlbC5zZXRGb3JlZ3JvdW5kKENvbG9yLnJlZCk7CisJCXN0YXR1c1BhbmVsMi5zZXRMYXlvdXQobmV3IEZsb3dMYXlvdXQoRmxvd0xheW91dC5MRUZUKSk7CisJCXN0YXR1c1BhbmVsMy5zZXRMYXlvdXQobmV3IEZsb3dMYXlvdXQoRmxvd0xheW91dC5MRUZUKSk7CisJCXN0YXR1c1BhbmVsLnNldExheW91dChuZXcgQm9yZGVyTGF5b3V0KCkpOworCQkKKwkJbm93QnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldikgeworCQkJCXRyeSB7CisJCQkJCWdlbmVyYXRlUmVwb3J0cygpOworCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkJCUpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKG51bGwsIGUuZ2V0TWVzc2FnZSgpLCBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImVycm9yIiksCisJCQkJCQkJCQkJCQkgIEpPcHRpb25QYW5lLkVSUk9SX01FU1NBR0UpOworCQkJCQlSQk1hbmFnZXJHVUkuZGVidWdNc2coZS50b1N0cmluZygpKTsKKwkJCQkJaWYgKFJCTWFuYWdlckdVSS5kZWJ1ZykgZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7CisJCQkJfQorCQkJfQorCQl9KTsKKwkJCisJCXN0YXR1c0J1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXYpIHsKKwkJCQl0b2dnbGVTdGF0dXMoKTsKKwkJCX0KKwkJfSk7CisJCQorCQlzdGF0dXNQYW5lbDEuYWRkKHN0YXR1c0xhYmVsKTsKKwkJc3RhdHVzUGFuZWwyLmFkZChuZXh0UmVwb3J0TGFiZWwpOworCQlzdGF0dXNQYW5lbDMuYWRkKGxhc3RSZXBvcnRMYWJlbCk7CisJCXN0YXR1c1BhbmVsNC5hZGQobm93QnV0dG9uKTsKKwkJc3RhdHVzUGFuZWw0LmFkZChCb3guY3JlYXRlSG9yaXpvbnRhbFN0cnV0KDcpKTsKKwkJc3RhdHVzUGFuZWw0LmFkZChzdGF0dXNCdXR0b24pOworCQlzdGF0dXNCb3guYWRkKHN0YXR1c1BhbmVsMSk7CisJCXN0YXR1c0JveC5hZGQoQm94LmNyZWF0ZVZlcnRpY2FsU3RydXQoNykpOworCQkvL3N0YXR1c0JveC5hZGQoQm94LmNyZWF0ZUhvcml6b250YWxHbHVlKCkpOworCQlzdGF0dXNCb3guYWRkKHN0YXR1c1BhbmVsMik7CisJCS8vc3RhdHVzQm94LmFkZChCb3guY3JlYXRlSG9yaXpvbnRhbEdsdWUoKSk7CisJCXN0YXR1c0JveC5hZGQoc3RhdHVzUGFuZWwzKTsKKwkJc3RhdHVzQm94LmFkZChCb3guY3JlYXRlVmVydGljYWxTdHJ1dCg3KSk7CisJCXN0YXR1c0JveC5hZGQoc3RhdHVzUGFuZWw0KTsKKwkJc3RhdHVzUGFuZWwuYWRkKHN0YXR1c0JveCwgQm9yZGVyTGF5b3V0LkNFTlRFUik7CisJCQorCQkvLyAqKiBPUFRJT05TIFBBTkVMIFNFVFVQICoqCisJCUpMYWJlbCAgaW5wdXRMYWJlbCAgICA9IG5ldyBKTGFiZWwoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJyZXBvcnRlcl9pbnB1dF9idW5kbGUiKSk7CisJCUpMYWJlbCAgb3V0cHV0TGFiZWwgICA9IG5ldyBKTGFiZWwoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJyZXBvcnRlcl9vdXRwdXRfZGlyZWN0b3J5IikpOworCQlKQnV0dG9uIGlucHV0QnV0dG9uICAgPSBuZXcgSkJ1dHRvbihSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInJlcG9ydGVyX2J1dHRvbl9jaG9vc2UiKSk7CisJCUpCdXR0b24gb3V0cHV0QnV0dG9uICA9IG5ldyBKQnV0dG9uKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigicmVwb3J0ZXJfYnV0dG9uX2Nob29zZSIpKTsKKwkJSkJ1dHRvbiBzY2FuQnV0dG9uICAgID0gbmV3IEpCdXR0b24oUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJyZXBvcnRlcl9idXR0b25fY2hvb3NlIikpOworCQlKQnV0dG9uIGRlZmF1bHRCdXR0b24gPSBuZXcgSkJ1dHRvbihSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInJlcG9ydGVyX2J1dHRvbl9zYXZlX2RlZmF1bHRzIikpOworCQlKTGFiZWwgIHRleHRMYWJlbCAgICAgPSBuZXcgSkxhYmVsKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigicmVwb3J0ZXJfb3V0cHV0X2ZpbGUiKSk7CisJCUpMYWJlbCAgaHRtbExhYmVsICAgICA9IG5ldyBKTGFiZWwoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJyZXBvcnRlcl9vdXRwdXRfZmlsZSIpKTsKKwkJSkxhYmVsICB4bWxMYWJlbCAgICAgID0gbmV3IEpMYWJlbChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInJlcG9ydGVyX291dHB1dF9maWxlIikpOworCQlKTGFiZWwgIHRleHRMYWJlbDIgICAgPSBuZXcgSkxhYmVsKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigicmVwb3J0ZXJfZGV0YWlsX2xldmVsIikpOworCQlKTGFiZWwgIGh0bWxMYWJlbDIgICAgPSBuZXcgSkxhYmVsKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigicmVwb3J0ZXJfZGV0YWlsX2xldmVsIikpOworCQlKTGFiZWwgIHhtbExhYmVsMiAgICAgPSBuZXcgSkxhYmVsKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigicmVwb3J0ZXJfZGV0YWlsX2xldmVsIikpOworCQlKUGFuZWwgIG9wdGlvbnNQYW5lbDEgPSBuZXcgSlBhbmVsKCk7CisJCUpQYW5lbCAgb3B0aW9uc1BhbmVsMiA9IG5ldyBKUGFuZWwoKTsKKwkJSlBhbmVsICBvcHRpb25zUGFuZWxBID0gbmV3IEpQYW5lbCgpOworCQlKUGFuZWwgIG9wdGlvbnNQYW5lbDMgPSBuZXcgSlBhbmVsKCk7CisJCUpQYW5lbCAgb3B0aW9uc1BhbmVsNCA9IG5ldyBKUGFuZWwoKTsKKwkJSlBhbmVsICBvcHRpb25zUGFuZWw1ID0gbmV3IEpQYW5lbCgpOworCQlKUGFuZWwgIG9wdGlvbnNQYW5lbDYgPSBuZXcgSlBhbmVsKCk7CisJCUJveCAgICAgb3B0aW9uc0JveCAgICA9IG5ldyBCb3goQm94TGF5b3V0LllfQVhJUyk7CisJCUJveCAgICAgb3V0cHV0Qm94ICAgICA9IG5ldyBCb3goQm94TGF5b3V0LllfQVhJUyk7CisJCQorCQlidW5kbGVGaWVsZCAgICA9IG5ldyBKVGV4dEZpZWxkKFByZWZlcmVuY2VzLmdldFByZWZlcmVuY2UoInJlcG9ydGVyX2Jhc2VfY2xhc3NfZmlsZSIpKTsKKwkJZGlyZWN0b3J5RmllbGQgPSBuZXcgSlRleHRGaWVsZChQcmVmZXJlbmNlcy5nZXRQcmVmZXJlbmNlKCJyZXBvcnRlcl9vdXRwdXRfZGlyZWN0b3J5IikpOworCQl0ZXh0Q2hlY2sgICAgICA9IG5ldyBKQ2hlY2tCb3goUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJyZXBvcnRlcl9mb3JtYXRfdGV4dCIpKTsKKwkJaHRtbENoZWNrICAgICAgPSBuZXcgSkNoZWNrQm94KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigicmVwb3J0ZXJfZm9ybWF0X2h0bWwiKSk7CisJCXhtbENoZWNrICAgICAgID0gbmV3IEpDaGVja0JveChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInJlcG9ydGVyX2Zvcm1hdF94bWwiKSk7CisJCXNjYW5DaGVjayAgICAgID0gbmV3IEpDaGVja0JveChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInJlcG9ydGVyX3BlcmZvcm1fc2NhbiIpLCBmYWxzZSk7CisJCXRleHRGaWVsZCAgICAgID0gbmV3IEpUZXh0RmllbGQoInJlcG9ydC50eHQiKTsKKwkJaHRtbEZpZWxkICAgICAgPSBuZXcgSlRleHRGaWVsZCgicmVwb3J0Lmh0bWwiKTsKKwkJeG1sRmllbGQgICAgICAgPSBuZXcgSlRleHRGaWVsZCgicmVwb3J0LnhtbCIpOworCQlzY2FuRmllbGQgICAgICA9IG5ldyBKVGV4dEZpZWxkKCk7CisJCVN0cmluZyBbXSBkZXRhaWxMZXZlbHMgPSB7UmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJyZXBvcnRlcl9kZXRhaWxfaGlnaCIpLAorCQkJCQkJCQkgIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigicmVwb3J0ZXJfZGV0YWlsX25vcm1hbCIpfTsKKwkJdGV4dENvbWJvICAgICAgPSBuZXcgSkNvbWJvQm94KGRldGFpbExldmVscyk7CisJCWh0bWxDb21ibyAgICAgID0gbmV3IEpDb21ib0JveChkZXRhaWxMZXZlbHMpOworCQl4bWxDb21ibyAgICAgICA9IG5ldyBKQ29tYm9Cb3goZGV0YWlsTGV2ZWxzKTsKKwkJCisJCWJ1bmRsZUZpZWxkLnNldENvbHVtbnMoMzApOworCQlkaXJlY3RvcnlGaWVsZC5zZXRDb2x1bW5zKDMwKTsKKwkJc2NhbkZpZWxkLnNldENvbHVtbnMoMzApOworCQl0ZXh0RmllbGQuc2V0Q29sdW1ucygxNSk7CisJCWh0bWxGaWVsZC5zZXRDb2x1bW5zKDE1KTsKKwkJeG1sRmllbGQuc2V0Q29sdW1ucygxNSk7CisJCURpbWVuc2lvbiBjaGVja0RpbSA9IG5ldyBEaW1lbnNpb24oNTUsY29tcEhlaWdodCk7CisJCXRleHRDaGVjay5zZXRQcmVmZXJyZWRTaXplKGNoZWNrRGltKTsKKwkJaHRtbENoZWNrLnNldFByZWZlcnJlZFNpemUoY2hlY2tEaW0pOworCQl4bWxDaGVjay5zZXRQcmVmZXJyZWRTaXplKGNoZWNrRGltKTsKKwkJb3B0aW9uc1BhbmVsMS5zZXRMYXlvdXQobmV3IEZsb3dMYXlvdXQoRmxvd0xheW91dC5SSUdIVCkpOworCQlvcHRpb25zUGFuZWwyLnNldExheW91dChuZXcgRmxvd0xheW91dChGbG93TGF5b3V0LlJJR0hUKSk7CisJCW9wdGlvbnNQYW5lbEEuc2V0TGF5b3V0KG5ldyBGbG93TGF5b3V0KEZsb3dMYXlvdXQuUklHSFQpKTsKKwkJCisJCWlucHV0QnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldikgeworCQkJCXNldElucHV0QnVuZGxlKCk7CisJCQl9CisJCX0pOworCQkKKwkJb3V0cHV0QnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldikgeworCQkJCXNldE91dHB1dEJ1bmRsZSgpOworCQkJfQorCQl9KTsKKwkJCisJCXNjYW5CdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCl7CisJCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXYpIHsKKwkJCQlzZXRTY2FuRmlsZSgpOworCQkJfQorCQl9KTsKKwkJCisJCWRlZmF1bHRCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2KSB7CisJCQkJc2F2ZURlZmF1bHRzKCk7CisJCQl9CisJCX0pOworCQkKKwkJb3B0aW9uc1BhbmVsNi5hZGQoZGVmYXVsdEJ1dHRvbik7CisJCW9wdGlvbnNQYW5lbDMuYWRkKHRleHRDaGVjayk7CisJCW9wdGlvbnNQYW5lbDMuYWRkKEJveC5jcmVhdGVIb3Jpem9udGFsU3RydXQoNSkpOworCQlvcHRpb25zUGFuZWwzLmFkZCh0ZXh0TGFiZWwpOworCQlvcHRpb25zUGFuZWwzLmFkZChCb3guY3JlYXRlSG9yaXpvbnRhbFN0cnV0KDUpKTsKKwkJb3B0aW9uc1BhbmVsMy5hZGQodGV4dEZpZWxkKTsKKwkJb3B0aW9uc1BhbmVsMy5hZGQoQm94LmNyZWF0ZUhvcml6b250YWxTdHJ1dCg1KSk7CisJCW9wdGlvbnNQYW5lbDMuYWRkKHRleHRMYWJlbDIpOworCQlvcHRpb25zUGFuZWwzLmFkZChCb3guY3JlYXRlSG9yaXpvbnRhbFN0cnV0KDUpKTsKKwkJb3B0aW9uc1BhbmVsMy5hZGQodGV4dENvbWJvKTsKKwkJb3B0aW9uc1BhbmVsNC5hZGQoaHRtbENoZWNrKTsKKwkJb3B0aW9uc1BhbmVsNC5hZGQoQm94LmNyZWF0ZUhvcml6b250YWxTdHJ1dCg1KSk7CisJCW9wdGlvbnNQYW5lbDQuYWRkKGh0bWxMYWJlbCk7CisJCW9wdGlvbnNQYW5lbDQuYWRkKEJveC5jcmVhdGVIb3Jpem9udGFsU3RydXQoNSkpOworCQlvcHRpb25zUGFuZWw0LmFkZChodG1sRmllbGQpOworCQlvcHRpb25zUGFuZWw0LmFkZChCb3guY3JlYXRlSG9yaXpvbnRhbFN0cnV0KDUpKTsKKwkJb3B0aW9uc1BhbmVsNC5hZGQoaHRtbExhYmVsMik7CisJCW9wdGlvbnNQYW5lbDQuYWRkKEJveC5jcmVhdGVIb3Jpem9udGFsU3RydXQoNSkpOworCQlvcHRpb25zUGFuZWw0LmFkZChodG1sQ29tYm8pOworCQlvcHRpb25zUGFuZWw1LmFkZCh4bWxDaGVjayk7CisJCW9wdGlvbnNQYW5lbDUuYWRkKEJveC5jcmVhdGVIb3Jpem9udGFsU3RydXQoNSkpOworCQlvcHRpb25zUGFuZWw1LmFkZCh4bWxMYWJlbCk7CisJCW9wdGlvbnNQYW5lbDUuYWRkKEJveC5jcmVhdGVIb3Jpem9udGFsU3RydXQoNSkpOworCQlvcHRpb25zUGFuZWw1LmFkZCh4bWxGaWVsZCk7CisJCW9wdGlvbnNQYW5lbDUuYWRkKEJveC5jcmVhdGVIb3Jpem9udGFsU3RydXQoNSkpOworCQlvcHRpb25zUGFuZWw1LmFkZCh4bWxMYWJlbDIpOworCQlvcHRpb25zUGFuZWw1LmFkZChCb3guY3JlYXRlSG9yaXpvbnRhbFN0cnV0KDUpKTsKKwkJb3B0aW9uc1BhbmVsNS5hZGQoeG1sQ29tYm8pOworCQlvdXRwdXRCb3guYWRkKG9wdGlvbnNQYW5lbDMpOworCQlvdXRwdXRCb3guYWRkKG9wdGlvbnNQYW5lbDQpOworCQlvdXRwdXRCb3guYWRkKG9wdGlvbnNQYW5lbDUpOworCQlmb3JtYXRQYW5lbC5hZGQob3V0cHV0Qm94KTsKKwkJb3B0aW9uc1BhbmVsMS5hZGQoaW5wdXRMYWJlbCk7CisJCW9wdGlvbnNQYW5lbDEuYWRkKEJveC5jcmVhdGVIb3Jpem9udGFsU3RydXQoNSkpOworCQlvcHRpb25zUGFuZWwxLmFkZChidW5kbGVGaWVsZCk7CisJCW9wdGlvbnNQYW5lbDEuYWRkKEJveC5jcmVhdGVIb3Jpem9udGFsU3RydXQoNSkpOworCQlvcHRpb25zUGFuZWwxLmFkZChpbnB1dEJ1dHRvbik7CisJCW9wdGlvbnNQYW5lbDIuYWRkKG91dHB1dExhYmVsKTsKKwkJb3B0aW9uc1BhbmVsMi5hZGQoQm94LmNyZWF0ZUhvcml6b250YWxTdHJ1dCg1KSk7CisJCW9wdGlvbnNQYW5lbDIuYWRkKGRpcmVjdG9yeUZpZWxkKTsKKwkJb3B0aW9uc1BhbmVsMi5hZGQoQm94LmNyZWF0ZUhvcml6b250YWxTdHJ1dCg1KSk7CisJCW9wdGlvbnNQYW5lbDIuYWRkKG91dHB1dEJ1dHRvbik7CisJCW9wdGlvbnNQYW5lbEEuYWRkKHNjYW5DaGVjayk7CisJCW9wdGlvbnNQYW5lbEEuYWRkKEJveC5jcmVhdGVIb3Jpem9udGFsU3RydXQoNSkpOworCQlvcHRpb25zUGFuZWxBLmFkZChzY2FuRmllbGQpOworCQlvcHRpb25zUGFuZWxBLmFkZChCb3guY3JlYXRlSG9yaXpvbnRhbFN0cnV0KDUpKTsKKwkJb3B0aW9uc1BhbmVsQS5hZGQoc2NhbkJ1dHRvbik7CisJCW9wdGlvbnNCb3guYWRkKG9wdGlvbnNQYW5lbDEpOworCQlvcHRpb25zQm94LmFkZChvcHRpb25zUGFuZWwyKTsKKwkJb3B0aW9uc0JveC5hZGQob3B0aW9uc1BhbmVsQSk7CisJCW9wdGlvbnNCb3guYWRkKGZvcm1hdFBhbmVsKTsKKwkJb3B0aW9uc0JveC5hZGQob3B0aW9uc1BhbmVsNik7CisJCW9wdGlvbnNQYW5lbC5hZGQob3B0aW9uc0JveCk7CisJCQorCQkvLyAqKiBJTlRFUlZBTCBQQU5FTCBTRVRVUCAqKgorCQlTdHJpbmcgYm94QXJyYXkxW10gPSB7IjEiLCIyIiwiMyIsIjQiLCI1IiwiNiIsIjciLCI4IiwiOSIsIjEwIiwiMTEiLCIxMiIsIjE1IiwiMjAiLCIyNCIsIjI1IiwiMzAifTsKKwkJU3RyaW5nIGJveEFycmF5MltdID0ge1Jlc291cmNlcy5nZXRUcmFuc2xhdGlvbigicmVwb3J0ZXJfdGltZV9taW51dGVzIiksCisJCQkJCQkJICBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInJlcG9ydGVyX3RpbWVfaG91cnMiKSwKKwkJCQkJCQkgIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigicmVwb3J0ZXJfdGltZV9kYXlzIil9OworCQlTdHJpbmcgYm94QXJyYXkzW10gPSB7IjEiLCIyIiwiMyIsIjQiLCI1IiwiNiIsIjciLCI4IiwiOSIsIjEwIiwiMTEiLCIxMiIsCisJCQkJCQkJICAiMTMiLCIxNCIsIjE1IiwiMTYiLCIxNyIsIjE4IiwiMTkiLCIyMCIsIjIxIiwiMjIiLCIyMyIsIjAifTsKKwkJU3RyaW5nIGJveEFycmF5NFtdID0geyIwMCIsIjE1IiwiMzAiLCI0NSJ9OworCQlTdHJpbmcgYm94QXJyYXk1W10gPSB7UmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJyZXBvcnRlcl90aW1lX2V2ZXJ5ZGF5IiksCisJCQkJCQkJICBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInJlcG9ydGVyX3RpbWVfbW9uZGF5IiksCisJCQkJCQkJICBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInJlcG9ydGVyX3RpbWVfdHVlc2RheSIpLAorCQkJCQkJCSAgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJyZXBvcnRlcl90aW1lX3dlZG5lc2RheSIpLAorCQkJCQkJCSAgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJyZXBvcnRlcl90aW1lX3RodXJzZGF5IiksCisJCQkJCQkJICBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInJlcG9ydGVyX3RpbWVfZnJpZGF5IiksCisJCQkJCQkJICBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInJlcG9ydGVyX3RpbWVfc2F0dXJkYXkiKSwKKwkJCQkJCQkgIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigicmVwb3J0ZXJfdGltZV9zdW5kYXkiKX07CisJCQorCQlKTGFiZWwgY29sb25MYWJlbCA9IG5ldyBKTGFiZWwoIjoiKTsKKwkJc2VxdWVudGlhbFJhZGlvID0gbmV3IEpSYWRpb0J1dHRvbihSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInJlcG9ydGVyX2ludGVydmFsX3NlcXVlbnRpYWwiKSk7CisJCWRlZmluZWRSYWRpbyA9IG5ldyBKUmFkaW9CdXR0b24oUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJyZXBvcnRlcl9pbnRlcnZhbF9kZWZpbmVkIiksIHRydWUpOworCQl2YWx1ZUNvbWJvID0gbmV3IEpDb21ib0JveChib3hBcnJheTEpOworCQl1bml0Q29tYm8gPSBuZXcgSkNvbWJvQm94KGJveEFycmF5Mik7CisJCWhvdXJDb21ibyA9IG5ldyBKQ29tYm9Cb3goYm94QXJyYXkzKTsKKwkJbWludXRlQ29tYm8gPSBuZXcgSkNvbWJvQm94KGJveEFycmF5NCk7CisJCWRheUNvbWJvID0gbmV3IEpDb21ib0JveChib3hBcnJheTUpOworCQlKUGFuZWwgaW50ZXJ2YWxQYW5lbDEgPSBuZXcgSlBhbmVsKCk7CisJCUpQYW5lbCBpbnRlcnZhbFBhbmVsMiA9IG5ldyBKUGFuZWwoKTsKKwkJaW50ZXJ2YWxQYW5lbDEuc2V0TGF5b3V0KG5ldyBGbG93TGF5b3V0KEZsb3dMYXlvdXQuTEVGVCkpOworCQlpbnRlcnZhbFBhbmVsMi5zZXRMYXlvdXQobmV3IEZsb3dMYXlvdXQoRmxvd0xheW91dC5MRUZUKSk7CisJCUJveCBpbnRlcnZhbEJveCA9IG5ldyBCb3goQm94TGF5b3V0LllfQVhJUyk7CisJCWludGVydmFsUGFuZWwuc2V0TGF5b3V0KG5ldyBCb3JkZXJMYXlvdXQoKSk7CisJCQorCQlCdXR0b25Hcm91cCBiZyA9IG5ldyBCdXR0b25Hcm91cCgpOworCQliZy5hZGQoc2VxdWVudGlhbFJhZGlvKTsKKwkJYmcuYWRkKGRlZmluZWRSYWRpbyk7CisJCQorCQlpbnRlcnZhbFBhbmVsMS5hZGQoc2VxdWVudGlhbFJhZGlvKTsKKwkJaW50ZXJ2YWxQYW5lbDEuYWRkKEJveC5jcmVhdGVIb3Jpem9udGFsU3RydXQoNSkpOworCQlpbnRlcnZhbFBhbmVsMS5hZGQodmFsdWVDb21ibyk7CisJCWludGVydmFsUGFuZWwxLmFkZChCb3guY3JlYXRlSG9yaXpvbnRhbFN0cnV0KDUpKTsKKwkJaW50ZXJ2YWxQYW5lbDEuYWRkKHVuaXRDb21ibyk7CisJCWludGVydmFsUGFuZWwyLmFkZChkZWZpbmVkUmFkaW8pOworCQlpbnRlcnZhbFBhbmVsMi5hZGQoQm94LmNyZWF0ZUhvcml6b250YWxTdHJ1dCg1KSk7CisJCWludGVydmFsUGFuZWwyLmFkZChob3VyQ29tYm8pOworCQlpbnRlcnZhbFBhbmVsMi5hZGQoY29sb25MYWJlbCk7CisJCWludGVydmFsUGFuZWwyLmFkZChtaW51dGVDb21ibyk7CisJCWludGVydmFsUGFuZWwyLmFkZChCb3guY3JlYXRlSG9yaXpvbnRhbFN0cnV0KDUpKTsKKwkJaW50ZXJ2YWxQYW5lbDIuYWRkKGRheUNvbWJvKTsKKwkJaW50ZXJ2YWxCb3guYWRkKGludGVydmFsUGFuZWwxKTsKKwkJaW50ZXJ2YWxCb3guYWRkKGludGVydmFsUGFuZWwyKTsKKwkJaW50ZXJ2YWxQYW5lbC5hZGQoaW50ZXJ2YWxCb3gsIEJvcmRlckxheW91dC5XRVNUKTsKKwkJCisJCS8vICoqIE1BSU5CT1ggU0VUVVAgKioKKwkJbWFpbkJveC5yZW1vdmVBbGwoKTsKKwkJbWFpbkJveC5hZGQoc3RhdHVzUGFuZWwpOworCQltYWluQm94LmFkZChpbnRlcnZhbFBhbmVsKTsKKwkJbWFpbkJveC5hZGQob3B0aW9uc1BhbmVsKTsKKwkJCisJCS8vICoqIE1BSU4gRlJBTUUgU0VUVVAgKioKKwkJc2V0TG9jYXRpb24obmV3IGphdmEuYXd0LlBvaW50KDI1LCAyNSkpOworCQlzZXRTaXplKG1haW5EaW0pOworCQkvLygoSkNvbXBvbmVudClnZXRDb250ZW50UGFuZSgpKS5zZXRNYXhpbXVtU2l6ZShkaW1NYWluTWF4KTsKKwkJLy8oKEpDb21wb25lbnQpZ2V0Q29udGVudFBhbmUoKSkuc2V0TWluaW11bVNpemUoZGltTWFpbk1pbik7CisJCS8vc2V0Sk1lbnVCYXIoak1lbnVCYXJNYWluKTsKKwkJZ2V0Q29udGVudFBhbmUoKS5zZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKKwkJZ2V0Q29udGVudFBhbmUoKS5yZW1vdmVBbGwoKTsKKwkJZ2V0Q29udGVudFBhbmUoKS5hZGQobWFpbkJveCwgQm9yZGVyTGF5b3V0LkNFTlRFUik7CisJCXNldFRpdGxlKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigicmVzb3VyY2VfYnVuZGxlX3JlcG9ydGVyIikpOworCQkvL3ZhbGlkYXRlVHJlZSgpOworCQlzZXRDb21wb25lbnRzVG9EZWZhdWx0cygpOworCQluZXh0UmVwb3J0ID0gZ2VuZXJhdGVOZXh0UmVwb3J0RGF0ZSgpOworCQl1cGRhdGVEYXRlRmllbGRzKCk7CisJCXJlcGFpbnQoKTsKKwkJCisJCWFkZFdpbmRvd0xpc3RlbmVyKG5ldyBqYXZhLmF3dC5ldmVudC5XaW5kb3dBZGFwdGVyKCkgeworCQkJcHVibGljIHZvaWQgd2luZG93Q2xvc2luZyhqYXZhLmF3dC5ldmVudC5XaW5kb3dFdmVudCBldikgeworCQkJCXRoaXNXaW5kb3dDbG9zaW5nKGV2KTsKKwkJCX0KKwkJfSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHRoaXNXaW5kb3dDbG9zaW5nKFdpbmRvd0V2ZW50IGV2KSB7CisJCXNldFZpc2libGUoZmFsc2UpOworCQlkaXNwb3NlKCk7CisJCVN5c3RlbS5leGl0KDApOworCX0KKwkKKwlwcml2YXRlIHZvaWQgc2V0SW5wdXRCdW5kbGUoKSB7CisJCWludCByZXN1bHQgPSBidW5kbGVGaWxlQ2hvb3Nlci5zaG93T3BlbkRpYWxvZyh0aGlzKTsKKwkJaWYgKHJlc3VsdCA9PSBKRmlsZUNob29zZXIuQVBQUk9WRV9PUFRJT04pIHsKKwkJCUZpbGUgZiA9IGJ1bmRsZUZpbGVDaG9vc2VyLmdldFNlbGVjdGVkRmlsZSgpOworCQkJaWYgKGYgIT0gbnVsbCkgeworCQkJCWJ1bmRsZUZpZWxkLnNldFRleHQoZi5nZXRBYnNvbHV0ZVBhdGgoKSk7CisJCQkJUHJlZmVyZW5jZXMuc2V0UHJlZmVyZW5jZSgicmVwb3J0ZXJfYmFzZV9jbGFzc19maWxlIixmLmdldEFic29sdXRlUGF0aCgpKTsKKwkJCQl0cnkge1ByZWZlcmVuY2VzLnNhdmVQcmVmZXJlbmNlcygpO30gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkge30KKwkJCX0KKwkJfQorCX0KKwkKKwlwcml2YXRlIHZvaWQgc2V0T3V0cHV0QnVuZGxlKCkgeworCQlpbnQgcmVzdWx0ID0gZGlyZWN0b3J5RmlsZUNob29zZXIuc2hvd09wZW5EaWFsb2codGhpcyk7CisJCWlmIChyZXN1bHQgPT0gSkZpbGVDaG9vc2VyLkFQUFJPVkVfT1BUSU9OKSB7CisJCQlGaWxlIGYgPSBkaXJlY3RvcnlGaWxlQ2hvb3Nlci5nZXRTZWxlY3RlZEZpbGUoKTsKKwkJCWlmICghZi5pc0RpcmVjdG9yeSgpKSBmID0gbmV3IEZpbGUoZi5nZXRQYXJlbnQoKSk7CisJCQlpZiAoZiAhPSBudWxsKSB7CisJCQkJZGlyZWN0b3J5RmllbGQuc2V0VGV4dChmLmdldEFic29sdXRlUGF0aCgpKTsKKwkJCQlQcmVmZXJlbmNlcy5zZXRQcmVmZXJlbmNlKCJyZXBvcnRlcl9vdXRwdXRfZGlyZWN0b3J5IixmLmdldEFic29sdXRlUGF0aCgpKTsKKwkJCQl0cnkge1ByZWZlcmVuY2VzLnNhdmVQcmVmZXJlbmNlcygpO30gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkge30KKwkJCX0KKwkJfQorCX0KKwkKKwlwcml2YXRlIHZvaWQgc2V0U2NhbkZpbGUoKSB7CisJCWludCByZXN1bHQgPSBzY2FuRmlsZUNob29zZXIuc2hvd09wZW5EaWFsb2codGhpcyk7CisJCWlmIChyZXN1bHQgPT0gSkZpbGVDaG9vc2VyLkFQUFJPVkVfT1BUSU9OKSB7CisJCQlGaWxlIGYgPSBzY2FuRmlsZUNob29zZXIuZ2V0U2VsZWN0ZWRGaWxlKCk7CisJCQlpZiAoZiAhPSBudWxsKSB7CisJCQkJc2NhbkZpZWxkLnNldFRleHQoZi5nZXRBYnNvbHV0ZVBhdGgoKSk7CisJCQkJUHJlZmVyZW5jZXMuc2V0UHJlZmVyZW5jZSgicmVwb3J0ZXJfc2Nhbl9maWxlIixmLmdldEFic29sdXRlUGF0aCgpKTsKKwkJCQl0cnkge1ByZWZlcmVuY2VzLnNhdmVQcmVmZXJlbmNlcygpO30gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkge30KKwkJCX0KKwkJfQorCX0KKwkKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VXNhZ2UoKSB7CisJCXJldHVybiAiXG5SQlJlcG9ydGVyIENvbW1hbmQgTGluZSBVc2FnZTpcblxuIiArCisJCQkgICAiRGVmYXVsdCBVc2FnZSAoR1VJKTogICBqYXZhIGNvbS5pYm0ucmJtLlJCUmVwb3J0ZXJcbiIgKworCQkJICAgIk9wdGlvbnMgVXNhZ2U6ICAgICAgICAgamF2YSBjb20uaWJtLnJibS5SQlJlcG9ydGVyIFstZ3VpIHwgLW5vdyB8IC1saW5lXVxuXG4iICsgCisJCQkgICAiT3B0aW9uczogICAgICAgICAgICAgICAtZ3VpICAgICBSdW4gdGhlIEdyYXBoaWNhbCBVc2VyIEludGVyZmFjZVxuIiArCisJCQkgICAiICAgICAgICAgICAgICAgICAgICAgICAtbm93ICAgICBFeGVjdXRlIHRoZSBSZXBvcnQgR2VuZXJhdGlvbiBJbW1lZGlhdGVseVxuIiArCisJCQkgICAiICAgICAgICAgICAgICAgICAgICAgICAtbGluZSAgICBSdW4gdGhlIFJlcG9ydGVyIHdpdGhvdXQgdGhlIEdVSSI7CisJfQorCQorCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHsKKwkgICAgUkJSZXBvcnRlciByZXBvcnRlcjsKKwkJaWYgKGFyZ3MubGVuZ3RoID09IDEpIHsKKwkJCWlmIChhcmdzWzBdLmVxdWFscygiLWd1aSIpKSB7CisJCQkgICAgcmVwb3J0ZXIgPSBuZXcgUkJSZXBvcnRlcih0cnVlKTsJCisJCQl9IGVsc2UgaWYgKGFyZ3NbMF0uZXF1YWxzKCItbm93IikpIHsKKwkJCQlyZXBvcnRlciA9IG5ldyBSQlJlcG9ydGVyKGZhbHNlKTsKKwkJCQl0cnkgeworCQkJCQlyZXBvcnRlci5nZW5lcmF0ZVJlcG9ydHMoKTsKKwkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJSQlJlcG9ydGVyOiBHZW5lcmF0aW9uIG9mIHJlcG9ydHMgc3VjY2Vzc2Z1bC4gIiArIG5ldyBEYXRlKCkpOworCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRoZXJlIHdhcyBhbiBlcnJvciBnZW5lcmF0aW5nIHRoZSByZXBvcnRzLi4uXG5cblx0IiArIGlvZS5nZXRNZXNzYWdlKCkpOworCQkJCX0KKwkJCQlyZXBvcnRlci50aGlzV2luZG93Q2xvc2luZyhudWxsKTsKKwkJCX0gZWxzZSBpZiAoYXJnc1swXS5lcXVhbHMoIi1saW5lIikpIHsKKwkJCQlyZXBvcnRlciA9IG5ldyBSQlJlcG9ydGVyKGZhbHNlKTsKKwkJCQlpZiAoIXJlcG9ydGVyLnJ1bm5pbmcpCisJCQkJICAgIHJlcG9ydGVyLnRvZ2dsZVN0YXR1cygpOworCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUkJSZXBvcnRlcjogTmV4dCBSZXBvcnQgYXQgIiArIHJlcG9ydGVyLm5leHRSZXBvcnQudG9TdHJpbmcoKSk7CisJCQl9IGVsc2UgeworCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRVc2FnZSgpKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChhcmdzLmxlbmd0aCA9PSAwKSB7CisJCQlyZXBvcnRlciA9IG5ldyBSQlJlcG9ydGVyKHRydWUpOworCQl9IGVsc2UgeworCQkJU3lzdGVtLm91dC5wcmludGxuKGdldFVzYWdlKCkpOworCQl9CisJfQorCQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9SQlJlcG9ydGVyU2Nhbm5lci5qYXZhIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL1JCUmVwb3J0ZXJTY2FubmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYxN2RlOQotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9SQlJlcG9ydGVyU2Nhbm5lci5qYXZhCkBAIC0wLDAgKzEsMzA1IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNywgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgICoKKyAqIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3BhY2thZ2UgY29tLmlibS5yYm07CisKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuRE9NUGFyc2VyOworaW1wb3J0IG9yZy53M2MuZG9tLio7CitpbXBvcnQgb3JnLnhtbC5zYXguKjsKKworLyoqCisgKiBSQlJlcG9ydGVyU2NhbmVyIGlzIGEgdXRpbGl0eSBjbGFzcyBmb3IgUkJSZXBvcnRlci4gSXQgY3JlYXRlcyBhIHJlcG9ydCBmcm9tIGFuIHhtbCBzZXR0aW5ncworICogZmlsZSB0aGF0IHNjYW5zIGNvZGUgZm9yIHJlc291cmNlcyBhbmQgY29tcGFyZXMgdGhlbSBhZ2FpbnN0IGEgcmVzb3VyY2UgYnVuZGxlLgorICogCisgKiBAYXV0aG9yIEphcmVkIEphY2tzb24KKyAqIEBzZWUgY29tLmlibS5yYm0uUkJSZXBvcnRlcgorICovCitwdWJsaWMgY2xhc3MgUkJSZXBvcnRlclNjYW5uZXIgeworCXByaXZhdGUgQnVuZGxlICAgICAgIGJ1bmRsZTsKKwlwcml2YXRlIERvY3VtZW50ICAgICBjb25maWc7CisJcHJpdmF0ZSBIYXNodGFibGUgICAgZmlsZVJ1bGVzOworCXByaXZhdGUgSGFzaHRhYmxlICAgIHBhcnNlUnVsZXM7CisJcHJpdmF0ZSBIYXNodGFibGUgICAgcmVzdWx0czsKKwlwcml2YXRlIEhhc2h0YWJsZSAgICBtaXNzaW5nOworCXByaXZhdGUgYm9vbGVhbiAgICAgIHJlc3VsdHNGb3VuZDsKKwkKKwlwcm90ZWN0ZWQgUkJSZXBvcnRlclNjYW5uZXIoQnVuZGxlIGJ1bmRsZSwgRmlsZSBjb25maWdGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlyZXN1bHRzRm91bmQgPSBmYWxzZTsKKwkJdGhpcy5idW5kbGUgPSBidW5kbGU7CisJCQorCQl0cnkgeworCQkJSW5wdXRTb3VyY2UgaXMgPSBuZXcgSW5wdXRTb3VyY2UobmV3IEZpbGVJbnB1dFN0cmVhbShjb25maWdGaWxlKSk7CisJCQlET01QYXJzZXIgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpOworCQkJcGFyc2VyLnBhcnNlKGlzKTsKKwkJCWNvbmZpZyA9IHBhcnNlci5nZXREb2N1bWVudCgpOworCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gc2F4ZSkgeworCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJJbGxlZ2FsIFhNTCBEb2N1bWVudDogIiArIHNheGUuZ2V0TWVzc2FnZSgpKTsKKwkJfQorCQkKKwkJRWxlbWVudCByb290ID0gY29uZmlnLmdldERvY3VtZW50RWxlbWVudCgpOworCQlmaWxlUnVsZXMgPSBnZXRGaWxlUnVsZXMocm9vdCk7CisJCXBhcnNlUnVsZXMgPSBnZXRQYXJzZVJ1bGVzKHJvb3QpOworCQkKKwkJcmVzdWx0cyA9IG5ldyBIYXNodGFibGUoKTsKKwkJRW51bWVyYXRpb24ga2V5cyA9IGJ1bmRsZS5hbGxJdGVtcy5rZXlzKCk7CisJCXdoaWxlIChrZXlzLmhhc01vcmVFbGVtZW50cygpKSB7CisJCQlTdHJpbmcga2V5ID0gKFN0cmluZylrZXlzLm5leHRFbGVtZW50KCk7CisJCQlCdW5kbGVJdGVtIGl0ZW0gPSAoQnVuZGxlSXRlbSlidW5kbGUuYWxsSXRlbXMuZ2V0KGtleSk7CisJCQlyZXN1bHRzLnB1dChrZXksIG5ldyBTY2FuUmVzdWx0KGl0ZW0pKTsKKwkJfQorCQkKKwkJbWlzc2luZyA9IG5ldyBIYXNodGFibGUoKTsKKwl9CisJCisJcHJvdGVjdGVkIGludCBnZXROdW1iZXJSZXNvdXJjZXNGb3VuZCgpIHsKKwkJcmV0dXJuIHJlc3VsdHMuc2l6ZSgpOworCX0KKwkKKwlwcm90ZWN0ZWQgaW50IGdldE51bWJlck1pc3NpbmdSZXNvdXJjZXMoKSB7CisJCXJldHVybiBtaXNzaW5nLnNpemUoKTsKKwl9CisJCisJcHJvdGVjdGVkIGludCBnZXROdW1iZXJVbnVzZWRSZXNvdXJjZXMoKSB7CisJCWludCBjb3VudCA9IDA7CisJCUVudW1lcmF0aW9uIGVsZW1zID0gcmVzdWx0cy5lbGVtZW50cygpOworCQl3aGlsZSAoZWxlbXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKwkJCVNjYW5SZXN1bHQgcmVzdWx0ID0gKFNjYW5SZXN1bHQpZWxlbXMubmV4dEVsZW1lbnQoKTsKKwkJCWlmIChyZXN1bHQuZ2V0T2NjdXJhbmNlcygpLnNpemUoKSA8IDEpIGNvdW50Kys7CisJCX0KKwkJcmV0dXJuIGNvdW50OworCX0KKwkKKwlwcm90ZWN0ZWQgVmVjdG9yIGdldE1pc3NpbmdSZXNvdXJjZXMoKSB7CisJCUVudW1lcmF0aW9uIGVsZW1zID0gbWlzc2luZy5lbGVtZW50cygpOworCQlWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKKwkJd2hpbGUgKGVsZW1zLmhhc01vcmVFbGVtZW50cygpKQorCQkJdi5hZGRFbGVtZW50KGVsZW1zLm5leHRFbGVtZW50KCkpOworCQlyZXR1cm4gdjsKKwl9CisJCisJcHJvdGVjdGVkIFZlY3RvciBnZXRVbnVzZWRSZXNvdXJjZXMoKSB7CisJCUVudW1lcmF0aW9uIGVsZW1zID0gcmVzdWx0cy5lbGVtZW50cygpOworCQlWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKKwkJd2hpbGUgKGVsZW1zLmhhc01vcmVFbGVtZW50cygpKSB7CisJCQlTY2FuUmVzdWx0IHJlc3VsdCA9IChTY2FuUmVzdWx0KWVsZW1zLm5leHRFbGVtZW50KCk7CisJCQlpZiAocmVzdWx0LmdldE9jY3VyYW5jZXMoKS5zaXplKCkgPCAxKSB7CisJCQkJdi5hZGRFbGVtZW50KHJlc3VsdCk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHY7CisJfQorCQorCXByb3RlY3RlZCBib29sZWFuIHBlcmZvcm1TY2FuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJcmVzdWx0c0ZvdW5kID0gZmFsc2U7CisJCQorCQlFbGVtZW50IHJvb3QgPSBjb25maWcuZ2V0RG9jdW1lbnRFbGVtZW50KCk7CisJCU5vZGVMaXN0IG5sID0gcm9vdC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiU2NhbiIpOworCQlpZiAobmwuZ2V0TGVuZ3RoKCkgPCAxKSByZXR1cm4gcmVzdWx0c0ZvdW5kOworCQlFbGVtZW50IHNjYW5fZWxlbSA9IChFbGVtZW50KW5sLml0ZW0oMCk7CisJCW5sID0gc2Nhbl9lbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEaXJlY3RvcnkiKTsKKwkJZm9yIChpbnQgaT0wOyBpIDwgbmwuZ2V0TGVuZ3RoKCk7IGkrKykgeworCQkJRWxlbWVudCBkaXJfZWxlbSA9IChFbGVtZW50KW5sLml0ZW0oaSk7CisJCQlGaWxlIGRpcmVjdG9yeSA9IG5ldyBGaWxlKGRpcl9lbGVtLmdldEF0dHJpYnV0ZSgibG9jYXRpb24iKSk7CisJCQlib29sZWFuIHJlY3Vyc2UgPSBkaXJfZWxlbS5nZXRBdHRyaWJ1dGUoInJlY3Vyc2VfZGlyZWN0b3JpZXMiKS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7CisJCQlOb2RlTGlzdCBydWxlc19saXN0ID0gZGlyX2VsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlJ1bGVzIik7CisJCQlpZiAocnVsZXNfbGlzdC5nZXRMZW5ndGgoKSA8IDEpIGNvbnRpbnVlOworCQkJRWxlbWVudCBydWxlc19lbGVtID0gKEVsZW1lbnQpcnVsZXNfbGlzdC5pdGVtKDApOworCQkJTm9kZUxpc3QgZnJ1bGVzX2xpc3QgPSBydWxlc19lbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBcHBseUZpbGVSdWxlIik7CisJCQkvLyBGb3IgZWFjaCBmaWxlIHJ1bGUKKwkJCWZvciAoaW50IGo9MDsgaiA8IGZydWxlc19saXN0LmdldExlbmd0aCgpOyBqKyspIHsKKwkJCQlFbGVtZW50IGZydWxlX2VsZW0gPSAoRWxlbWVudClmcnVsZXNfbGlzdC5pdGVtKGopOworCQkJCUZpbGVSdWxlIGZydWxlID0gKEZpbGVSdWxlKWZpbGVSdWxlcy5nZXQoZnJ1bGVfZWxlbS5nZXRBdHRyaWJ1dGUoIm5hbWUiKSk7CisJCQkJaWYgKGZydWxlID09IG51bGwpIGNvbnRpbnVlOworCQkJCU5vZGVMaXN0IHBydWxlc19saXN0ID0gZnJ1bGVfZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQXBwbHlQYXJzZVJ1bGUiKTsKKwkJCQlWZWN0b3IgcHJ1bGVzX3YgPSBuZXcgVmVjdG9yKCk7CisJCQkJLy8gRm9yIGVhY2ggcGFyc2UgcnVsZQorCQkJCWZvciAoaW50IGs9MDsgayA8IHBydWxlc19saXN0LmdldExlbmd0aCgpOyBrKyspIHsKKwkJCQkJRWxlbWVudCBwcnVsZV9lbGVtID0gKEVsZW1lbnQpcHJ1bGVzX2xpc3QuaXRlbShrKTsKKwkJCQkJUGFyc2VSdWxlIHBydWxlID0gKFBhcnNlUnVsZSlwYXJzZVJ1bGVzLmdldChwcnVsZV9lbGVtLmdldEF0dHJpYnV0ZSgibmFtZSIpKTsKKwkJCQkJaWYgKHBydWxlID09IG51bGwpIGNvbnRpbnVlOworCQkJCQlwcnVsZXNfdi5hZGRFbGVtZW50KHBydWxlKTsKKwkJCQl9CisJCQkJaWYgKHBydWxlc192LnNpemUoKSA8IDEpIGNvbnRpbnVlOworCQkJCXNjYW5EaXJlY3RvcnkoZGlyZWN0b3J5LCBmcnVsZSwgcHJ1bGVzX3YsIHJlY3Vyc2UpOworCQkJfQorCQl9CisJCQorCQlyZXR1cm4gcmVzdWx0c0ZvdW5kOworCX0KKwkKKwlwcml2YXRlIHZvaWQgc2NhbkRpcmVjdG9yeShGaWxlIGRpcmVjdG9yeSwgRmlsZVJ1bGUgZnJ1bGUsIFZlY3RvciBwcnVsZXMsIGJvb2xlYW4gcmVjdXJzZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCisJCS8vIFJlY3Vyc2lvbiBzdGVwCisJCWlmIChyZWN1cnNlKSB7CisJCQlGaWxlIGNoaWxkcmVuW10gPSBkaXJlY3RvcnkubGlzdEZpbGVzKG5ldyBqYXZhLmlvLkZpbGVGaWx0ZXIoKXsKKwkJCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBmKSB7CisJCQkJCXJldHVybiBmLmlzRGlyZWN0b3J5KCk7CisJCQkJfQorCQkJCQorCQkJCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisJCQkJCXJldHVybiAiIjsKKwkJCQl9CisJCQl9KTsKKwkJCWZvciAoaW50IGk9MDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CisJCQkJRmlsZSBuZXdfZGlyZWN0b3J5ID0gY2hpbGRyZW5baV07CisJCQkJc2NhbkRpcmVjdG9yeShuZXdfZGlyZWN0b3J5LCBmcnVsZSwgcHJ1bGVzLCByZWN1cnNlKTsKKwkJCX0KKwkJfQorCQkvLyBHbyB0aHJvdWdoIGVhY2ggYWNjZXB0YWJsZSBmaWxlCisJCUZpbGUgY2hpbGRyZW5bXSA9IGRpcmVjdG9yeS5saXN0RmlsZXMoKTsKKwkJZm9yIChpbnQgaT0wOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKKwkJCUZpbGUgZiA9IGNoaWxkcmVuW2ldOworCQkJaWYgKGYuaXNEaXJlY3RvcnkoKSB8fCAhKGZydWxlLmFwcGx5UnVsZShmLmdldE5hbWUoKSkpKSBjb250aW51ZTsKKwkJCUZpbGVSZWFkZXIgZnIgPSBuZXcgRmlsZVJlYWRlcihmKTsKKwkJCUJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGZyKTsKKwkJCVN0cmluZyBsaW5lID0gbnVsbDsKKwkJCWludCBsaW5lX2NvdW50ID0gMDsKKwkJCS8vIFJlYWQgdGhlIGZpbGUgbGluZSBieSBsaW5lCisJCQl3aGlsZSAoKGxpbmUgPSBici5yZWFkTGluZSgpKSAhPSBudWxsKSB7CisJCQkJbGluZV9jb3VudCsrOworCQkJCVZlY3RvciBmaW5kaW5ncyA9IG5ldyBWZWN0b3IoKTsKKwkJCQkvLyBBcHBseSBhbGwgcGFyc2UgcnVsZXMgdG8gZWFjaCBsaW5lCisJCQkJZm9yIChpbnQgaj0wOyBqIDwgcHJ1bGVzLnNpemUoKTsgaisrKSB7CisJCQkJCVBhcnNlUnVsZSBwcnVsZSA9IChQYXJzZVJ1bGUpcHJ1bGVzLmVsZW1lbnRBdChqKTsKKwkJCQkJVmVjdG9yIHRlbXBfcmVzdWx0cyA9IHBydWxlLmFwcGx5UnVsZShsaW5lKTsKKwkJCQkJZm9yIChpbnQgaz0wOyBrIDwgdGVtcF9yZXN1bHRzLnNpemUoKTsgaysrKSB7CisJCQkJCQlmaW5kaW5ncy5hZGRFbGVtZW50KHRlbXBfcmVzdWx0cy5lbGVtZW50QXQoaykpOworCQkJCQl9CisJCQkJfQorCQkJCWZvciAoaW50IGo9MDsgaiA8IGZpbmRpbmdzLnNpemUoKTsgaisrKSB7CisJCQkJCVN0cmluZyBuYW1lID0gKFN0cmluZylmaW5kaW5ncy5lbGVtZW50QXQoaik7CisJCQkJCU9jY3VyYW5jZSBvY2MgPSBuZXcgT2NjdXJhbmNlKGYuZ2V0TmFtZSgpLCBmLmdldEFic29sdXRlUGF0aCgpLCBsaW5lX2NvdW50KTsKKwkJCQkJLy8gSWYgdGhlIG5hbWUgaXMgZm91bmQgaW4gdGhlIHJlc291cmNlIGJ1bmRsZXMgZGVyaXZlZCBoYXNodGFibGUKKwkJCQkJaWYgKHJlc3VsdHMuY29udGFpbnNLZXkobmFtZSkpIHsKKwkJCQkJCVNjYW5SZXN1bHQgc2Nhbl9yZXMgPSAoU2NhblJlc3VsdClyZXN1bHRzLmdldChuYW1lKTsKKwkJCQkJCXNjYW5fcmVzLmFkZE9jY3VyYW5jZShvY2MpOworCQkJCQl9IGVsc2UgeworCQkJCQkJLy8gQWRkIGl0IHRvIHRoZSBtaXNzaW5nIHJlc3VsdHMKKwkJCQkJCVNjYW5SZXN1bHQgc2Nhbl9yZXMgPSBuZXcgU2NhblJlc3VsdChuZXcgQnVuZGxlSXRlbShudWxsLCBuYW1lLCAiKnVua25vd24qIikpOworCQkJCQkJc2Nhbl9yZXMuYWRkT2NjdXJhbmNlKG9jYyk7CisJCQkJCQltaXNzaW5nLnB1dChuYW1lLCBzY2FuX3Jlcyk7CisJCQkJCQlyZXN1bHRzLnB1dChuYW1lLCBzY2FuX3Jlcyk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisJCisJcHJpdmF0ZSBIYXNodGFibGUgZ2V0RmlsZVJ1bGVzKEVsZW1lbnQgcm9vdCkgeworCQlIYXNodGFibGUgcmVzdWx0ID0gbmV3IEhhc2h0YWJsZSgpOworCQlOb2RlTGlzdCBmcnVsZXNfbGlzdCA9IHJvb3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkZpbGVSdWxlcyIpOworCQlFbGVtZW50IGZydWxlc19lbGVtID0gbnVsbDsKKwkJaWYgKGZydWxlc19saXN0LmdldExlbmd0aCgpID4gMCkgZnJ1bGVzX2VsZW0gPSAoRWxlbWVudClmcnVsZXNfbGlzdC5pdGVtKDApOworCQlpZiAoZnJ1bGVzX2VsZW0gPT0gbnVsbCkgcmV0dXJuIHJlc3VsdDsKKwkJZnJ1bGVzX2xpc3QgPSBmcnVsZXNfZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRmlsZVJ1bGUiKTsKKwkJZm9yIChpbnQgaT0wOyBpIDwgZnJ1bGVzX2xpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgeworCQkJRWxlbWVudCBlbGVtID0gKEVsZW1lbnQpZnJ1bGVzX2xpc3QuaXRlbShpKTsKKwkJCUZpbGVSdWxlIGZydWxlID0gbmV3IEZpbGVSdWxlKGVsZW0uZ2V0QXR0cmlidXRlKCJuYW1lIiksIGVsZW0uZ2V0QXR0cmlidXRlKCJzdGFydHNfd2l0aCIpLAorCQkJCQkJCQkJCSAgZWxlbS5nZXRBdHRyaWJ1dGUoImVuZHNfd2l0aCIpLCBlbGVtLmdldEF0dHJpYnV0ZSgiY29udGFpbnMiKSk7CisJCQlyZXN1bHQucHV0KGVsZW0uZ2V0QXR0cmlidXRlKCJuYW1lIiksIGZydWxlKTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKwkKKwlwcml2YXRlIEhhc2h0YWJsZSBnZXRQYXJzZVJ1bGVzKEVsZW1lbnQgcm9vdCkgeworCQlIYXNodGFibGUgcmVzdWx0ID0gbmV3IEhhc2h0YWJsZSgpOworCQlOb2RlTGlzdCBwcnVsZXNfbGlzdCA9IHJvb3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlBhcnNlUnVsZXMiKTsKKwkJRWxlbWVudCBwcnVsZXNfZWxlbSA9IG51bGw7CisJCWlmIChwcnVsZXNfbGlzdC5nZXRMZW5ndGgoKSA+IDApCisJCQlwcnVsZXNfZWxlbSA9IChFbGVtZW50KXBydWxlc19saXN0Lml0ZW0oMCk7CisJCWlmIChwcnVsZXNfZWxlbSA9PSBudWxsKQorCQkJcmV0dXJuIHJlc3VsdDsKKwkJcHJ1bGVzX2xpc3QgPSBwcnVsZXNfZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiUGFyc2VSdWxlIik7CisJCWZvciAoaW50IGk9MDsgaSA8IHBydWxlc19saXN0LmdldExlbmd0aCgpOyBpKyspIHsKKwkJCUVsZW1lbnQgZWxlbSA9IChFbGVtZW50KXBydWxlc19saXN0Lml0ZW0oaSk7CisJCQlQYXJzZVJ1bGUgcHJ1bGUgPSBuZXcgUGFyc2VSdWxlKGVsZW0uZ2V0QXR0cmlidXRlKCJuYW1lIiksIGVsZW0uZ2V0QXR0cmlidXRlKCJmb2xsb3dzIiksCisJCQkJCQkJCQkJCWVsZW0uZ2V0QXR0cmlidXRlKCJwcmVjZWRlcyIpKTsKKwkJCXJlc3VsdC5wdXQoZWxlbS5nZXRBdHRyaWJ1dGUoIm5hbWUiKSwgcHJ1bGUpOworCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorfQorCitjbGFzcyBGaWxlUnVsZSB7CisJU3RyaW5nIG5hbWU7CisJU3RyaW5nIHN0YXJ0c193aXRoOworCVN0cmluZyBlbmRzX3dpdGg7CisJU3RyaW5nIGNvbnRhaW5zOworCQorCUZpbGVSdWxlKFN0cmluZyBuYW1lLCBTdHJpbmcgc3RhcnRzX3dpdGgsIFN0cmluZyBlbmRzX3dpdGgsIFN0cmluZyBjb250YWlucykgeworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLnN0YXJ0c193aXRoID0gc3RhcnRzX3dpdGg7CisJCXRoaXMuZW5kc193aXRoID0gZW5kc193aXRoOworCQl0aGlzLmNvbnRhaW5zID0gY29udGFpbnM7CisJfQorCQorCWJvb2xlYW4gYXBwbHlSdWxlKFN0cmluZyBzb3VyY2UpIHsKKwkJYm9vbGVhbiBhY2NlcHQgPSB0cnVlOworCQlpZiAoc3RhcnRzX3dpdGggIT0gbnVsbCAmJiBzdGFydHNfd2l0aC5sZW5ndGgoKSA+IDAgJiYgIShzb3VyY2Uuc3RhcnRzV2l0aChzdGFydHNfd2l0aCkpKSBhY2NlcHQgPSBmYWxzZTsKKwkJaWYgKGVuZHNfd2l0aCAhPSBudWxsICYmIGVuZHNfd2l0aC5sZW5ndGgoKSA+IDAgJiYgIShzb3VyY2UuZW5kc1dpdGgoZW5kc193aXRoKSkpIGFjY2VwdCA9IGZhbHNlOworCQlpZiAoY29udGFpbnMgIT0gbnVsbCAmJiBjb250YWlucy5sZW5ndGgoKSA+IDAgJiYgc291cmNlLmluZGV4T2YoY29udGFpbnMpIDwgMCkgYWNjZXB0ID0gZmFsc2U7CisJCXJldHVybiBhY2NlcHQ7CisJfQorfQorCitjbGFzcyBQYXJzZVJ1bGUgeworCVN0cmluZyBuYW1lOworCVN0cmluZyBiZWZvcmU7CisJU3RyaW5nIGFmdGVyOworCQorCVBhcnNlUnVsZShTdHJpbmcgbmFtZSwgU3RyaW5nIGJlZm9yZSwgU3RyaW5nIGFmdGVyKSB7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMuYmVmb3JlID0gYmVmb3JlOworCQl0aGlzLmFmdGVyID0gYWZ0ZXI7CisJfQorCQorCS8vIHJldHVybnMgdGhlIHZlY3RvciBvZiBzdHJpbmdzIGZvdW5kIGFmdGVyIGJlZm9yZSBhbmQgYmVmb3JlIGFmdGVyCisJCisJVmVjdG9yIGFwcGx5UnVsZShTdHJpbmcgc291cmNlKSB7CisJCVZlY3RvciB2ID0gbmV3IFZlY3RvcigpOworCQlpZiAoYmVmb3JlICE9IG51bGwgJiYgYmVmb3JlLmxlbmd0aCgpID4gMCkgeworCQkJaWYgKGFmdGVyICE9IG51bGwgJiYgYWZ0ZXIubGVuZ3RoKCkgPiAwKSB7CisJCQkJLy8gQm90aCBiZWZvcmUgYW5kIGFmdGVyIG5vbi1lbXB0eQorCQkJCWludCBiZWZvcmVfaW5kZXggPSAtMTsKKwkJCQlpbnQgYWZ0ZXJfaW5kZXggPSAtMTsKKwkJCQl3aGlsZSAoKGJlZm9yZV9pbmRleCA9IHNvdXJjZS5pbmRleE9mKGJlZm9yZSwgKytiZWZvcmVfaW5kZXgpKSA+PSAwKSB7CisJCQkJCS8vYmVmb3JlX2luZGV4ID0gc291cmNlLmluZGV4T2YoYmVmb3JlLCBiZWZvcmVfaW5kZXgpOworCQkJCQlhZnRlcl9pbmRleCA9IC0xOworCQkJCQlhZnRlcl9pbmRleCA9IHNvdXJjZS5pbmRleE9mKGFmdGVyLCBiZWZvcmVfaW5kZXggKyBiZWZvcmUubGVuZ3RoKCkrMSk7CisJCQkJCWlmIChhZnRlcl9pbmRleCA8IDAgfHwgYmVmb3JlX2luZGV4IDwgMCB8fCBiZWZvcmUubGVuZ3RoKCkgPCAwKSB7CisJCQkJCSAgICBicmVhazsKKwkJCQkJfQorCQkJCQl2LmFkZEVsZW1lbnQoc291cmNlLnN1YnN0cmluZyhiZWZvcmVfaW5kZXggKyBiZWZvcmUubGVuZ3RoKCksIGFmdGVyX2luZGV4KSk7CisJCQkJCWJlZm9yZV9pbmRleCA9IGFmdGVyX2luZGV4OworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLy8gQmVmb3JlIG5vbi1lbXB0eSwgYWZ0ZXIgZW1wdHkKKwkJCQlpbnQgaW5kZXggPSAtMTsKKwkJCQl3aGlsZSAoc291cmNlLmluZGV4T2YoYmVmb3JlLCArK2luZGV4KSA+PSAwKSB7CisJCQkJCWluZGV4ID0gc291cmNlLmluZGV4T2YoYmVmb3JlLCBpbmRleCk7CisJCQkJCVN0cmluZyByZXN1bHQgPSBzb3VyY2Uuc3Vic3RyaW5nKGluZGV4ICsgYmVmb3JlLmxlbmd0aCgpLCBzb3VyY2UubGVuZ3RoKCkpOworCQkJCQlpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0Lmxlbmd0aCgpID4gMCkgdi5hZGRFbGVtZW50KHJlc3VsdCk7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgaWYgKGFmdGVyICE9IG51bGwgJiYgYWZ0ZXIubGVuZ3RoKCkgPiAwKSB7CisJCQkvLyBCZWZvcmUgZW1wdHksIGFmdGVyIG5vdAorCQkJaW50IGluZGV4ID0gLTE7CisJCQl3aGlsZSAoc291cmNlLmluZGV4T2YoYWZ0ZXIsICsraW5kZXgpID49IDApIHsKKwkJCQlpbmRleCA9IHNvdXJjZS5pbmRleE9mKGJlZm9yZSwgaW5kZXgpOworCQkJCVN0cmluZyByZXN1bHQgPSBzb3VyY2Uuc3Vic3RyaW5nKDAsIGluZGV4KTsKKwkJCQlpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0Lmxlbmd0aCgpID4gMCkgdi5hZGRFbGVtZW50KHJlc3VsdCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvLyBCZWZvcmUgYW5kIGFmdGVyIGVtcHR5CisJCQl2LmFkZEVsZW1lbnQoc291cmNlKTsKKwkJfQorCQlyZXR1cm4gdjsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL1JCVE1YRXhwb3J0ZXIuamF2YSBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9SQlRNWEV4cG9ydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBhZWRhYQotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9SQlRNWEV4cG9ydGVyLmphdmEKQEAgLTAsMCArMSwyMjUgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoQykgMjAwMC0yMDA3LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCAgKgorICogb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworcGFja2FnZSBjb20uaWJtLnJibTsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmF4LnN3aW5nLio7CitpbXBvcnQgamF2YS51dGlsLio7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy5kb20uRG9jdW1lbnRJbXBsOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlcmlhbGl6ZS4qOworaW1wb3J0IG9yZy53M2MuZG9tLio7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhIHBsdWctaW4gdG8gUkJNYW5hZ2VyIHRoYXQgYWxsb3dzIHRoZSB1c2VyIHRvIGV4cG9ydCBSZXNvdXJjZSBCdW5kbGVzCisgKiBhbG9uZyB3aXRoIHNvbWUgb2YgdGhlIG1ldGEtZGF0YSBhc3NvY2lhdGVkIGJ5IFJCTWFuYWdlciB0byB0aGUgVE1YIHNwZWNpZmljYXRpb24uCisgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBUTVggdmlzaXQgdGhlIHdlYiBzaXRlIDxhIGhyZWY9Imh0dHA6Ly93d3cubGlzYS5vcmcvdG14LyI+aHR0cDovL3d3dy5saXNhLm9yZy90bXgvPC9hPgorICogCisgKiBAYXV0aG9yIEphcmVkIEphY2tzb24KKyAqIEBzZWUgY29tLmlibS5yYm0uUkJNYW5hZ2VyCisgKi8KK3B1YmxpYyBjbGFzcyBSQlRNWEV4cG9ydGVyIGV4dGVuZHMgUkJFeHBvcnRlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT04gPSAiMC41YSI7CisJCisgICAgLyoqCisgICAgICogRGVmYXVsdCBjb25zdHJ1Y3RvciBmb3IgdGhlIFRNWCBleHBvcnRlci4KKyAgICAgKi8KKyAgICAgICAgCisgICAgcHVibGljIFJCVE1YRXhwb3J0ZXIoKSB7CisgICAgICAgIHN1cGVyKCk7CisJCQorICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBmaWxlIGNob29zZXIgaWYgbmVjZXNzYXJ5CisgICAgICAgIGlmIChjaG9vc2VyID09IG51bGwpIHsKKyAgICAgICAgICAgIGNob29zZXIgPSBuZXcgSkZpbGVDaG9vc2VyKCk7CisgICAgICAgICAgICBjaG9vc2VyLnNldEZpbGVGaWx0ZXIobmV3IGphdmF4LnN3aW5nLmZpbGVjaG9vc2VyLkZpbGVGaWx0ZXIoKXsKKyAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlRNWCBGaWxlcyI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGYpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGYuaXNEaXJlY3RvcnkoKSkgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIGlmIChmLmdldE5hbWUoKS5lbmRzV2l0aCgiLnRteCIpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9IC8vIGVuZCBpZgorICAgIH0KKwkKKyAgICBwcml2YXRlIFN0cmluZyBjb252ZXJ0VG9JU08oRGF0ZSBkKSB7CisgICAgICAgIEdyZWdvcmlhbkNhbGVuZGFyIGdjID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCk7CisgICAgICAgIGdjLnNldFRpbWUoZCk7CisgICAgICAgIHJldHVybiBjb252ZXJ0VG9JU08oZ2MpOworICAgIH0KKwkKKyAgICBwcml2YXRlIFN0cmluZyBjb252ZXJ0VG9JU08oR3JlZ29yaWFuQ2FsZW5kYXIgZ2MpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZChTdHJpbmcudmFsdWVPZihnYy5nZXQoQ2FsZW5kYXIuWUVBUikpKTsKKyAgICAgICAgaW50IG1vbnRoID0gZ2MuZ2V0KENhbGVuZGFyLk1PTlRIKSsxOworICAgICAgICBidWZmZXIuYXBwZW5kKCgobW9udGggPCAxMCkgPyAiMCIgOiAiIikgKyBTdHJpbmcudmFsdWVPZihtb250aCkpOworICAgICAgICBpbnQgZGF5ID0gZ2MuZ2V0KENhbGVuZGFyLkRBWV9PRl9NT05USCk7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoKChkYXkgPCAxMCkgPyAiMCIgOiAiIikgKyBTdHJpbmcudmFsdWVPZihkYXkpKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZCgiVCIpOworICAgICAgICBpbnQgaG91ciA9IGdjLmdldChDYWxlbmRhci5IT1VSX09GX0RBWSk7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoKChob3VyIDwgMTApID8gIjAiIDogIiIpICsgU3RyaW5nLnZhbHVlT2YoaG91cikpOworICAgICAgICBpbnQgbWludXRlID0gZ2MuZ2V0KENhbGVuZGFyLk1JTlVURSk7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoKChtaW51dGUgPCAxMCkgPyAiMCIgOiAiIikgKyBTdHJpbmcudmFsdWVPZihtaW51dGUpKTsKKyAgICAgICAgaW50IHNlY29uZCA9IGdjLmdldChDYWxlbmRhci5TRUNPTkQpOworICAgICAgICBidWZmZXIuYXBwZW5kKCgoc2Vjb25kIDwgMTApID8gIjAiIDogIiIpICsgU3RyaW5nLnZhbHVlT2Yoc2Vjb25kKSk7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoIloiKTsKKyAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworICAgIH0KKwkKKyAgICBwcml2YXRlIFN0cmluZyBjb252ZXJ0RW5jb2RpbmcoQnVuZGxlSXRlbSBpdGVtKSB7CisgICAgICAgIGlmIChpdGVtICE9IG51bGwgJiYgaXRlbS5nZXRQYXJlbnRHcm91cCgpICE9IG51bGwgJiYgaXRlbS5nZXRQYXJlbnRHcm91cCgpLmdldFBhcmVudEJ1bmRsZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyBsYW5ndWFnZSA9IGl0ZW0uZ2V0UGFyZW50R3JvdXAoKS5nZXRQYXJlbnRCdW5kbGUoKS5nZXRMYW5ndWFnZUVuY29kaW5nKCk7CisgICAgICAgICAgICBTdHJpbmcgY291bnRyeSA9IGl0ZW0uZ2V0UGFyZW50R3JvdXAoKS5nZXRQYXJlbnRCdW5kbGUoKS5nZXRDb3VudHJ5RW5jb2RpbmcoKTsKKyAgICAgICAgICAgIFN0cmluZyB2YXJpYW50ID0gaXRlbS5nZXRQYXJlbnRHcm91cCgpLmdldFBhcmVudEJ1bmRsZSgpLmdldFZhcmlhbnRFbmNvZGluZygpOworICAgICAgICAgICAgaWYgKGxhbmd1YWdlICE9IG51bGwgJiYgIWxhbmd1YWdlLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgICAgICAvL2xhbmd1YWdlID0gbGFuZ3VhZ2UudG9VcHBlckNhc2UoKTsKKyAgICAgICAgICAgICAgICBpZiAoY291bnRyeSAhPSBudWxsICYmICFjb3VudHJ5LmVxdWFscygiIikpIHsKKyAgICAgICAgICAgICAgICAgICAgLy9jb3VudHJ5ID0gY291bnRyeS50b1VwcGVyQ2FzZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAodmFyaWFudCAhPSBudWxsICYmICF2YXJpYW50LmVxdWFscygiIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vdmFyaWFudCA9IHZhcmlhbnQudG9VcHBlckNhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsYW5ndWFnZSArICItIiArIGNvdW50cnkgKyAiLSIgKyB2YXJpYW50OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsYW5ndWFnZSArICItIiArIGNvdW50cnk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBsYW5ndWFnZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gIiI7CisgICAgfQorCQorICAgIHByaXZhdGUgdm9pZCBhcHBlbmRUVVYoRG9jdW1lbnQgeG1sLCBFbGVtZW50IHR1LCBCdW5kbGVJdGVtIGl0ZW0pIHsKKyAgICAgICAgRWxlbWVudCB0dXYgPSB4bWwuY3JlYXRlRWxlbWVudCgidHV2Iik7CisgICAgICAgIHR1di5zZXRBdHRyaWJ1dGUoImxhbmciLCBjb252ZXJ0RW5jb2RpbmcoaXRlbSkpOworICAgICAgICB0dXYuc2V0QXR0cmlidXRlKCJjcmVhdGlvbmRhdGUiLGNvbnZlcnRUb0lTTyhpdGVtLmdldENyZWF0ZWREYXRlKCkpKTsKKyAgICAgICAgdHV2LnNldEF0dHJpYnV0ZSgiY3JlYXRpb25pZCIsaXRlbS5nZXRDcmVhdG9yKCkpOworICAgICAgICB0dXYuc2V0QXR0cmlidXRlKCJjaGFuZ2VkYXRlIixjb252ZXJ0VG9JU08oaXRlbS5nZXRNb2RpZmllZERhdGUoKSkpOworICAgICAgICB0dXYuc2V0QXR0cmlidXRlKCJjaGFuZ2VpZCIsaXRlbS5nZXRNb2RpZmllcigpKTsKKyAgICAgICAgaXRlbS5nZXRDb21tZW50KCk7CisgICAgICAgIGl0ZW0uaXNUcmFuc2xhdGVkKCk7CisJCQorICAgICAgICBFbGVtZW50IGNvbW1lbnRfcHJvcCA9IHhtbC5jcmVhdGVFbGVtZW50KCJwcm9wIik7CisgICAgICAgIGNvbW1lbnRfcHJvcC5hcHBlbmRDaGlsZCh4bWwuY3JlYXRlVGV4dE5vZGUoaXRlbS5nZXRDb21tZW50KCkpKTsKKyAgICAgICAgY29tbWVudF9wcm9wLnNldEF0dHJpYnV0ZSgidHlwZSIsIngtQ29tbWVudCIpOworICAgICAgICB0dXYuYXBwZW5kQ2hpbGQoY29tbWVudF9wcm9wKTsKKyAgICAgICAgCisgICAgICAgIEVsZW1lbnQgdHJhbnNsYXRlZF9wcm9wID0geG1sLmNyZWF0ZUVsZW1lbnQoInByb3AiKTsKKyAgICAgICAgdHJhbnNsYXRlZF9wcm9wLmFwcGVuZENoaWxkKHhtbC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcudmFsdWVPZihpdGVtLmlzVHJhbnNsYXRlZCgpKSkpOworICAgICAgICB0cmFuc2xhdGVkX3Byb3Auc2V0QXR0cmlidXRlKCJ0eXBlIiwieC1UcmFuc2xhdGVkIik7CisgICAgICAgIHR1di5hcHBlbmRDaGlsZCh0cmFuc2xhdGVkX3Byb3ApOworCQkKKyAgICAgICAgSGFzaHRhYmxlIGxvb2t1cHMgPSBpdGVtLmdldExvb2t1cHMoKTsKKyAgICAgICAgRW51bWVyYXRpb24ga2V5cyA9IGxvb2t1cHMua2V5cygpOworICAgICAgICB3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpa2V5cy5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gKFN0cmluZylsb29rdXBzLmdldChrZXkpOworICAgICAgICAgICAgRWxlbWVudCBsb29rdXBfcHJvcCA9IHhtbC5jcmVhdGVFbGVtZW50KCJwcm9wIik7CisgICAgICAgICAgICBsb29rdXBfcHJvcC5hcHBlbmRDaGlsZCh4bWwuY3JlYXRlVGV4dE5vZGUoa2V5ICsgIj0iICsgdmFsdWUpKTsKKyAgICAgICAgICAgIGxvb2t1cF9wcm9wLnNldEF0dHJpYnV0ZSgidHlwZSIsIngtTG9va3VwIik7CisgICAgICAgICAgICB0dXYuYXBwZW5kQ2hpbGQobG9va3VwX3Byb3ApOworICAgICAgICB9CisJCQorICAgICAgICBFbGVtZW50IHNlZyA9IHhtbC5jcmVhdGVFbGVtZW50KCJzZWciKTsKKyAgICAgICAgc2VnLmFwcGVuZENoaWxkKHhtbC5jcmVhdGVUZXh0Tm9kZShpdGVtLmdldFRyYW5zbGF0aW9uKCkpKTsKKyAgICAgICAgdHV2LmFwcGVuZENoaWxkKHNlZyk7CisJCQorICAgICAgICB0dS5hcHBlbmRDaGlsZCh0dXYpOworICAgIH0KKwkKKyAgICBwdWJsaWMgdm9pZCBleHBvcnQoUkJNYW5hZ2VyIHJibSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHJibSA9PSBudWxsKSByZXR1cm47CisgICAgICAgIC8vIE9wZW4gdGhlIFNhdmUgRGlhbG9nCisgICAgICAgIGludCByZXRfdmFsID0gY2hvb3Nlci5zaG93U2F2ZURpYWxvZyhudWxsKTsKKyAgICAgICAgaWYgKHJldF92YWwgIT0gSkZpbGVDaG9vc2VyLkFQUFJPVkVfT1BUSU9OKSByZXR1cm47CisgICAgICAgIC8vIFJldHJpZXZlIGJhc2ljIGZpbGUgaW5mb3JtYXRpb24KKyAgICAgICAgRmlsZSBmaWxlID0gY2hvb3Nlci5nZXRTZWxlY3RlZEZpbGUoKTsgICAgICAgICAgICAgICAgICAvLyBUaGUgZmlsZShzKSB3ZSB3aWxsIGJlIHdvcmtpbmcgd2l0aAorICAgICAgICBGaWxlIGRpcmVjdG9yeSA9IG5ldyBGaWxlKGZpbGUuZ2V0UGFyZW50KCkpOyAgICAgICAgICAgIC8vIFRoZSBkaXJlY3Rvcnkgd2Ugd2lsbCBiZSB3cml0aW5nIHRvCisgICAgICAgIFN0cmluZyBiYXNlX25hbWUgPSBmaWxlLmdldE5hbWUoKTsgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGJhc2UgbmFtZSBvZiB0aGUgZmlsZXMgd2Ugd2lsbCB3cml0ZQorICAgICAgICBpZiAoYmFzZV9uYW1lID09IG51bGwgfHwgYmFzZV9uYW1lLmVxdWFscygiIikpIGJhc2VfbmFtZSA9IHJibS5nZXRCYXNlQ2xhc3MoKTsKKyAgICAgICAgaWYgKGJhc2VfbmFtZS5lbmRzV2l0aCgiLnRteCIpKSBiYXNlX25hbWUgPSBiYXNlX25hbWUuc3Vic3RyaW5nKDAsYmFzZV9uYW1lLmxlbmd0aCgpLTQpOworCQkKKyAgICAgICAgU3RyaW5nIGZpbGVfbmFtZSA9IGJhc2VfbmFtZSArICIudG14IjsKKyAgICAgICAgCisgICAgICAgIFZlY3RvciBidW5kbGVfdiA9IHJibS5nZXRCdW5kbGVzKCk7CisgICAgICAgIEJ1bmRsZSBtYWluX2J1bmRsZSA9IChCdW5kbGUpYnVuZGxlX3YuZWxlbWVudEF0KDApOworICAgICAgICAKKyAgICAgICAgRG9jdW1lbnQgeG1sID0gbmV3IERvY3VtZW50SW1wbCgpOworICAgICAgICBFbGVtZW50IHJvb3QgPSB4bWwuY3JlYXRlRWxlbWVudCgidG14Iik7CisgICAgICAgIHJvb3Quc2V0QXR0cmlidXRlKCJ2ZXJzaW9uIiwgIjEuMiIpOworICAgICAgICB4bWwuYXBwZW5kQ2hpbGQocm9vdCk7CisJCQorICAgICAgICBFbGVtZW50IGhlYWRlciA9IHhtbC5jcmVhdGVFbGVtZW50KCJoZWFkZXIiKTsKKyAgICAgICAgRWxlbWVudCBub3RlID0geG1sLmNyZWF0ZUVsZW1lbnQoIm5vdGUiKTsKKyAgICAgICAgbm90ZS5hcHBlbmRDaGlsZCh4bWwuY3JlYXRlVGV4dE5vZGUoIlRoaXMgZG9jdW1lbnQgd2FzIGNyZWF0ZWQgYXV0b21hdGljYWxseSBieSBSQk1hbmFnZXIiKSk7CisgICAgICAgIGhlYWRlci5hcHBlbmRDaGlsZChub3RlKTsKKyAgICAgICAgaGVhZGVyLnNldEF0dHJpYnV0ZSgiY3JlYXRpb250b29sIiwgIlJCTWFuYWdlciIpOworICAgICAgICBoZWFkZXIuc2V0QXR0cmlidXRlKCJjcmVhdGlvbnRvb2x2ZXJzaW9uIiwgVkVSU0lPTik7CisgICAgICAgIGhlYWRlci5zZXRBdHRyaWJ1dGUoImRhdGF0eXBlIiwgIlBsYWluVGV4dCIpOworICAgICAgICBoZWFkZXIuc2V0QXR0cmlidXRlKCJzZWd0eXBlIiwgInNlbnRhbmNlIik7CisgICAgICAgIGhlYWRlci5zZXRBdHRyaWJ1dGUoImFkbWlubGFuZyIsICJlbi11cyIpOworICAgICAgICBoZWFkZXIuc2V0QXR0cmlidXRlKCJzcmNsYW5nIiwgIkVOIik7CisgICAgICAgIGhlYWRlci5zZXRBdHRyaWJ1dGUoIm8tdG1mIiwgIm5vbmUiKTsKKyAgICAgICAgaGVhZGVyLnNldEF0dHJpYnV0ZSgiY3JlYXRpb25kYXRlIiwgY29udmVydFRvSVNPKG5ldyBEYXRlKCkpKTsKKyAgICAgICAgcm9vdC5hcHBlbmRDaGlsZChoZWFkZXIpOworCQkKKyAgICAgICAgRWxlbWVudCBib2R5ID0geG1sLmNyZWF0ZUVsZW1lbnQoImJvZHkiKTsKKyAgICAgICAgcm9vdC5hcHBlbmRDaGlsZChib2R5KTsKKwkJCisgICAgICAgIFZlY3RvciBncm91cF92ID0gbWFpbl9idW5kbGUuZ2V0R3JvdXBzQXNWZWN0b3IoKTsKKyAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGVhY2ggYnVuZGxlIGdyb3VwIGluIG1haW5fYnVuZGxlCisgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IGdyb3VwX3Yuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIEJ1bmRsZUdyb3VwIG1haW5fZ3JvdXAgPSAoQnVuZGxlR3JvdXApZ3JvdXBfdi5lbGVtZW50QXQoaSk7CisgICAgICAgICAgICAvLyBHYXRoZXIgYSBncm91cCBvZiBncm91cHMgb2YgdGhlIHNhbWUgbmFtZSBhcyBtYWluX2dyb3VwCisgICAgICAgICAgICBWZWN0b3IgYWxsX2dyb3Vwc192ID0gbmV3IFZlY3RvcigpOworICAgICAgICAgICAgZm9yIChpbnQgaj0xOyBqIDwgYnVuZGxlX3Yuc2l6ZSgpOyBqKyspIHsKKyAgICAgICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gKEJ1bmRsZSlidW5kbGVfdi5lbGVtZW50QXQoaik7CisgICAgICAgICAgICAgICAgaWYgKGJ1bmRsZS5oYXNHcm91cChtYWluX2dyb3VwLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgVmVjdG9yIGdyb3VwcyA9IGJ1bmRsZS5nZXRHcm91cHNBc1ZlY3RvcigpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBrPTA7IGsgPCBncm91cHMuc2l6ZSgpOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEJ1bmRsZUdyb3VwIGdyb3VwID0gKEJ1bmRsZUdyb3VwKWdyb3Vwcy5lbGVtZW50QXQoayk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ3JvdXAuZ2V0TmFtZSgpLmVxdWFscyhtYWluX2dyb3VwLmdldE5hbWUoKSkpIGFsbF9ncm91cHNfdi5hZGRFbGVtZW50KGdyb3VwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gLy8gZW5kIGZvciAtIGoKKyAgICAgICAgICAgIC8vIExvb3AgdGhyb3VnaCBlYWNoIGl0ZW0gaW4gbWFpbl9ncm91cAorICAgICAgICAgICAgZm9yIChpbnQgaj0wOyBqIDwgbWFpbl9ncm91cC5nZXRJdGVtQ291bnQoKTsgaisrKSB7CisgICAgICAgICAgICAgICAgQnVuZGxlSXRlbSBtYWluX2l0ZW0gPSBtYWluX2dyb3VwLmdldEJ1bmRsZUl0ZW0oaik7CisgICAgICAgICAgICAgICAgRWxlbWVudCB0dSA9IHhtbC5jcmVhdGVFbGVtZW50KCJ0dSIpOworICAgICAgICAgICAgICAgIHR1LnNldEF0dHJpYnV0ZSgidHVpZCIsbWFpbl9pdGVtLmdldEtleSgpKTsKKyAgICAgICAgICAgICAgICB0dS5zZXRBdHRyaWJ1dGUoImRhdGF0eXBlIiwiVGV4dCIpOworICAgICAgICAgICAgICAgIC8vIEluc2VydCB0aGUgZ3JvdXAgbmFtZSBmb3IgdGhlIGl0ZW0KKyAgICAgICAgICAgICAgICBFbGVtZW50IGdyb3VwX3Byb3AgPSB4bWwuY3JlYXRlRWxlbWVudCgicHJvcCIpOworICAgICAgICAgICAgICAgIGdyb3VwX3Byb3AuYXBwZW5kQ2hpbGQoeG1sLmNyZWF0ZVRleHROb2RlKG1haW5fZ3JvdXAuZ2V0TmFtZSgpKSk7CisgICAgICAgICAgICAgICAgZ3JvdXBfcHJvcC5zZXRBdHRyaWJ1dGUoInR5cGUiLCAieC1Hcm91cCIpOworICAgICAgICAgICAgICAgIHR1LmFwcGVuZENoaWxkKGdyb3VwX3Byb3ApOworICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgbWFpbl9pdGVtIHRvIHRoZSB4bWwKKyAgICAgICAgICAgICAgICBhcHBlbmRUVVYoeG1sLCB0dSwgbWFpbl9pdGVtKTsKKyAgICAgICAgICAgICAgICAvLyBMb29wIHRocm91Z2ggdGhlIHJlc3Qgb2YgdGhlIGdyb3VwcyBvZiB0aGUgc2FtZSBuYW1lIGFzIG1haW5fZ3JvdXAKKyAgICAgICAgICAgICAgICBmb3IgKGludCBrPTA7IGsgPCBhbGxfZ3JvdXBzX3Yuc2l6ZSgpOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgQnVuZGxlR3JvdXAgZ3JvdXAgPSAoQnVuZGxlR3JvdXApYWxsX2dyb3Vwc192LmVsZW1lbnRBdChrKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSBpdGVtcyBpbiBlYWNoIGdyb3VwCisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGw9MDsgbCA8IGdyb3VwLmdldEl0ZW1Db3VudCgpOyBsKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEJ1bmRsZUl0ZW0gaXRlbSA9IGdyb3VwLmdldEJ1bmRsZUl0ZW0obCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5nZXRLZXkoKS5lcXVhbHMobWFpbl9pdGVtLmdldEtleSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZFRVVih4bWwsIHR1LCBpdGVtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSAvLyBlbmQgZm9yIC0gbAorICAgICAgICAgICAgICAgIH0gLy8gZW5kIGZvciAtIGsKKyAgICAgICAgICAgICAgICBib2R5LmFwcGVuZENoaWxkKHR1KTsKKyAgICAgICAgICAgIH0gLy8gZW5kIGZvciAtIGoKKyAgICAgICAgfSAvLyBlbmQgZm9yIC0gaQorICAgICAgICBGaWxlV3JpdGVyIGZ3ID0gbmV3IEZpbGVXcml0ZXIobmV3IEZpbGUoZGlyZWN0b3J5LGZpbGVfbmFtZSkpOworICAgICAgICBPdXRwdXRGb3JtYXQgb2YgPSBuZXcgT3V0cHV0Rm9ybWF0KHhtbCk7CisgICAgICAgIG9mLnNldEluZGVudGluZyh0cnVlKTsKKyAgICAgICAgb2Yuc2V0RW5jb2RpbmcoIklTTy04ODU5LTEiKTsKKyAgICAgICAgWE1MU2VyaWFsaXplciBzZXJpYWxpemVyID0gbmV3IFhNTFNlcmlhbGl6ZXIoZncsIG9mKTsKKyAgICAgICAgc2VyaWFsaXplci5zZXJpYWxpemUoeG1sKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL1JCVE1YSW1wb3J0ZXIuamF2YSBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9SQlRNWEltcG9ydGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRjOGQ2MwotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9SQlRNWEltcG9ydGVyLmphdmEKQEAgLTAsMCArMSwyNDEgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoQykgMjAwMC0yMDA3LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCAgKgorICogb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworcGFja2FnZSBjb20uaWJtLnJibTsKKworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLio7CisKK2ltcG9ydCBvcmcudzNjLmRvbS4qOworaW1wb3J0IG9yZy54bWwuc2F4Lio7CisKK2ltcG9ydCBjb20uaWJtLnJibS5ndWkuUkJNYW5hZ2VyR1VJOworCisKKy8qKgorICogVGhpcyBpcyB0aGUgc3VwZXIgY2xhc3MgZm9yIGFsbCBpbXBvcnRlciBwbHVnLWluIGNsYXNzZXMuIFRoaXMgY2xhc3MgZGVmaW5lcyB0aGUgbWV0aG9kcworICogYW5kIGZ1bmN0aW9uYWxpdHkgY29tbW9uIHRvIGFsbCBpbXBvcnRlcnMuIFRoaXMgaW5jbHVkZXMgc2V0dGluZyB1cCB0aGUgb3B0aW9ucyBkaWFsb2cgYW5kCisgKiBkaXNwbGF5aW5nIGl0IHRvIHRoZSB1c2VyLCBwZXJmb3JtaW5nIHRoZSBhY3R1YWwgaW5zZXJ0aW9ucyBpbnRvIHRoZSByZXNvdXJjZSBidW5kbGUgbWFuYWdlciwKKyAqIGFuZCBtYW5hZ2luZyBhbnkgaW1wb3J0IGNvbmZsaWN0cy4KKyAqIAorICogQGF1dGhvciBKYXJlZCBKYWNrc29uCisgKiBAc2VlIGNvbS5pYm0ucmJtLlJCTWFuYWdlcgorICovCitwdWJsaWMgY2xhc3MgUkJUTVhJbXBvcnRlciBleHRlbmRzIFJCSW1wb3J0ZXIgeworCQorICAgIERvY3VtZW50IHRteF94bWwgPSBudWxsOworCisgICAgLyoqCisgICAgICogQmFzaWMgY29uc3RydWN0b3IgZm9yIHRoZSBUTVggaW1wb3J0ZXIgZnJvbSB0aGUgcGFyZW50IFJCTWFuYWdlciBkYXRhIGFuZCBhIERpYWxvZyB0aXRsZS4KKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgUkJUTVhJbXBvcnRlcihTdHJpbmcgdGl0bGUsIFJCTWFuYWdlciByYm0sIFJCTWFuYWdlckdVSSBndWkpIHsKKyAgICAgICAgc3VwZXIodGl0bGUsIHJibSwgZ3VpKTsKKyAgICB9CisJCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0dXBGaWxlQ2hvb3NlcigpIHsKKyAgICAgICAgY2hvb3Nlci5zZXRGaWxlRmlsdGVyKG5ldyBqYXZheC5zd2luZy5maWxlY2hvb3Nlci5GaWxlRmlsdGVyKCl7CisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBmKSB7CisgICAgICAgICAgICAgICAgaWYgKGYuaXNEaXJlY3RvcnkoKSkgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgaWYgKGYuZ2V0TmFtZSgpLmVuZHNXaXRoKCIudG14IikpIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImltcG9ydF9UTVhfZmlsZV9kZXNjcmlwdGlvbiIpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisJCisgICAgcHJvdGVjdGVkIHZvaWQgYmVnaW5JbXBvcnQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBzdXBlci5iZWdpbkltcG9ydCgpOworICAgICAgICBGaWxlIHRteF9maWxlID0gZ2V0Q2hvc2VuRmlsZSgpOworCQkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgCUZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHRteF9maWxlKTsKKyAgICAgICAgICAgIElucHV0U291cmNlIGlzID0gbmV3IElucHV0U291cmNlKGZpcyk7CisgICAgICAgICAgICBEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKKyAgICAgICAgCXRteF94bWwgPSBidWlsZGVyLnBhcnNlKGlzKTsKKyAgICAgICAgICAgIGZpcy5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7CisgICAgICAgIAl0aHJvdyBuZXcgSU9FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgICAgIGlmICh0bXhfeG1sID09IG51bGwpCisgICAgICAgIAlyZXR1cm47CisgICAgICAgIAorICAgICAgICBpbXBvcnREb2MoKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSB2b2lkIGltcG9ydERvYygpIHsKKyAgICAgICAgaWYgKHRteF94bWwgPT0gbnVsbCkKKyAgICAgICAgCXJldHVybjsKKyAgICAgICAgRWxlbWVudCByb290ID0gdG14X3htbC5nZXREb2N1bWVudEVsZW1lbnQoKTsKKyAgICAgICAgTm9kZSBub2RlID0gcm9vdC5nZXRGaXJzdENoaWxkKCk7CisgICAgICAgIHdoaWxlIChub2RlICE9IG51bGwgJiYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSB8fCAhKG5vZGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJoZWFkZXIiKSkpKSB7CisgICAgICAgICAgICBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpOworICAgICAgICB9CisgICAgICAgIC8vRWxlbWVudEltcGwgaGVhZGVyID0gKEVsZW1lbnRJbXBsKW5vZGU7CisgICAgICAgIG5vZGUgPSByb290LmdldEZpcnN0Q2hpbGQoKTsKKyAgICAgICAgd2hpbGUgKG5vZGUgIT0gbnVsbCAmJiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFIHx8ICEobm9kZS5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoImJvZHkiKSkpKSB7CisgICAgICAgICAgICBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpOworICAgICAgICB9CisgICAgICAgIEVsZW1lbnQgYm9keSA9IChFbGVtZW50KW5vZGU7CisgICAgICAgIHJlc29sdmVFbmNvZGluZ3MoZ2V0RW5jb2RpbmdzVmVjdG9yKGJvZHkpKTsKKwkJCisgICAgICAgIC8vIE5vdyBkbyB0aGUgYWN0dWFsIGltcG9ydCByZXNvdXJjZSBieSByZXNvdXJjZQorICAgICAgICBOb2RlTGlzdCB0dV9saXN0ID0gYm9keS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidHUiKTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgdHVfbGlzdC5nZXRMZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICBFbGVtZW50IHR1X2VsZW0gPSAoRWxlbWVudCl0dV9saXN0Lml0ZW0oaSk7CisgICAgICAgICAgICAvLyBHZXQgdGhlIGtleSB2YWx1ZQorICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSB0dV9lbGVtLmdldEF0dHJpYnV0ZSgidHVpZCIpOworICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLmxlbmd0aCgpIDwgMSkKKyAgICAgICAgICAgIAljb250aW51ZTsKKyAgICAgICAgICAgIC8vIEdldCB0aGUgZ3JvdXAgaWYgaXQgZXhpc3RzCisgICAgICAgICAgICBTdHJpbmcgZ3JvdXAgPSBudWxsOworICAgICAgICAgICAgTm9kZUxpc3QgcHJvcF9saXN0ID0gdHVfZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZSgicHJvcCIpOworICAgICAgICAgICAgZm9yIChpbnQgaj0wOyBqIDwgcHJvcF9saXN0LmdldExlbmd0aCgpOyBqKyspIHsKKyAgICAgICAgICAgICAgICBFbGVtZW50IHByb3BfZWxlbSA9IChFbGVtZW50KXByb3BfbGlzdC5pdGVtKGopOworICAgICAgICAgICAgICAgIFN0cmluZyB0eXBlID0gcHJvcF9lbGVtLmdldEF0dHJpYnV0ZSgidHlwZSIpOworICAgICAgICAgICAgICAgIGlmICh0eXBlICE9IG51bGwgJiYgdHlwZS5lcXVhbHMoIngtR3JvdXAiKSkgeworICAgICAgICAgICAgICAgICAgICBwcm9wX2VsZW0ubm9ybWFsaXplKCk7CisgICAgICAgICAgICAgICAgICAgIE5vZGVMaXN0IHRleHRfbGlzdCA9IHByb3BfZWxlbS5nZXRDaGlsZE5vZGVzKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0X2xpc3QuZ2V0TGVuZ3RoKCkgPCAxKQorICAgICAgICAgICAgICAgICAgICAJY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIFRleHQgdGV4dF9lbGVtID0gKFRleHQpdGV4dF9saXN0Lml0ZW0oMCk7CisgICAgICAgICAgICAgICAgICAgIGdyb3VwID0gdGV4dF9lbGVtLmdldE5vZGVWYWx1ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChncm91cCA9PSBudWxsIHx8IGdyb3VwLmxlbmd0aCgpIDwgMSkgZ3JvdXAgPSBnZXREZWZhdWx0R3JvdXAoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgTm9kZUxpc3QgdHV2X2xpc3QgPSB0dV9lbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0dXYiKTsKKyAgICAgICAgICAgIC8vIEZvciBlYWNoIHR1diBlbGVtZW50CisgICAgICAgICAgICBmb3IgKGludCBqPTA7IGogPCB0dXZfbGlzdC5nZXRMZW5ndGgoKTsgaisrKSB7CisgICAgICAgICAgICAgICAgRWxlbWVudCB0dXZfZWxlbSA9IChFbGVtZW50KXR1dl9saXN0Lml0ZW0oaik7CisgICAgICAgICAgICAgICAgU3RyaW5nIGVuY29kaW5nID0gdHV2X2VsZW0uZ2V0QXR0cmlidXRlKCJsYW5nIik7CisgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBjdXJyZW50IGVuY29kaW5nCisgICAgICAgICAgICAgICAgaWYgKGVuY29kaW5nID09IG51bGwpIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGNoYXIgYXJyYXlbXSA9IGVuY29kaW5nLnRvQ2hhckFycmF5KCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaz0wOyBrIDwgYXJyYXkubGVuZ3RoOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFycmF5W2tdID09ICctJykKKyAgICAgICAgICAgICAgICAgICAgCWFycmF5W2tdID0gJ18nOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbmNvZGluZyA9IFN0cmluZy52YWx1ZU9mKGFycmF5KTsKKyAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIHRyYW5zbGF0aW9uIHZhbHVlCisgICAgICAgICAgICAgICAgTm9kZUxpc3Qgc2VnX2xpc3QgPSB0dXZfZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2VnIik7CisgICAgICAgICAgICAgICAgaWYgKHNlZ19saXN0LmdldExlbmd0aCgpIDwgMSkKKyAgICAgICAgICAgICAgICAJY29udGludWU7CisgICAgICAgICAgICAgICAgRWxlbWVudCBzZWdfZWxlbSA9IChFbGVtZW50KXNlZ19saXN0Lml0ZW0oMCk7CisgICAgICAgICAgICAgICAgc2VnX2VsZW0ubm9ybWFsaXplKCk7CisgICAgICAgICAgICAgICAgTm9kZUxpc3QgdGV4dF9saXN0ID0gc2VnX2VsZW0uZ2V0Q2hpbGROb2RlcygpOworICAgICAgICAgICAgICAgIGlmICh0ZXh0X2xpc3QuZ2V0TGVuZ3RoKCkgPCAxKQorICAgICAgICAgICAgICAgIAljb250aW51ZTsKKyAgICAgICAgICAgICAgICBUZXh0IHRleHRfZWxlbSA9IChUZXh0KXRleHRfbGlzdC5pdGVtKDApOworICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHRleHRfZWxlbS5nZXROb2RlVmFsdWUoKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS5sZW5ndGgoKSA8IDEpCisgICAgICAgICAgICAgICAgCWNvbnRpbnVlOworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgYnVuZGxlIGl0ZW0KKyAgICAgICAgICAgICAgICBCdW5kbGVJdGVtIGl0ZW0gPSBuZXcgQnVuZGxlSXRlbShudWxsLCBuYW1lLCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgLy8gR2V0IGNyZWF0aW9uLCBtb2RpZmljYXRpb24gdmFsdWVzCisgICAgICAgICAgICAgICAgaXRlbS5zZXRDcmVhdGVkRGF0ZSh0dXZfZWxlbS5nZXRBdHRyaWJ1dGUoImNyZWF0aW9uZGF0ZSIpKTsKKyAgICAgICAgICAgICAgICBpdGVtLnNldE1vZGlmaWVkRGF0ZSh0dXZfZWxlbS5nZXRBdHRyaWJ1dGUoImNoYW5nZWRhdGUiKSk7CisgICAgICAgICAgICAgICAgaWYgKHR1dl9lbGVtLmdldEF0dHJpYnV0ZSgiY2hhbmdlaWQiKSAhPSBudWxsKQorICAgICAgICAgICAgICAgIAlpdGVtLnNldE1vZGlmaWVyKHR1dl9lbGVtLmdldEF0dHJpYnV0ZSgiY2hhbmdlaWQiKSk7CisgICAgICAgICAgICAgICAgaWYgKHR1dl9lbGVtLmdldEF0dHJpYnV0ZSgiY3JlYXRpb25pZCIpICE9IG51bGwpCisgICAgICAgICAgICAgICAgCWl0ZW0uc2V0Q3JlYXRvcih0dXZfZWxlbS5nZXRBdHRyaWJ1dGUoImNyZWF0aW9uaWQiKSk7CisgICAgICAgICAgICAgICAgLy8gR2V0IHByb3BlcnRpZXMgc3BlY2lmaWVkCisgICAgICAgICAgICAgICAgcHJvcF9saXN0ID0gdHV2X2VsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInByb3AiKTsKKyAgICAgICAgICAgICAgICBIYXNodGFibGUgbG9va3VwcyA9IG51bGw7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaz0wOyBrIDwgcHJvcF9saXN0LmdldExlbmd0aCgpOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgRWxlbWVudCBwcm9wX2VsZW0gPSAoRWxlbWVudClwcm9wX2xpc3QuaXRlbShrKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHR5cGUgPSBwcm9wX2VsZW0uZ2V0QXR0cmlidXRlKCJ0eXBlIik7CisgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9IG51bGwgJiYgdHlwZS5lcXVhbHMoIngtQ29tbWVudCIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIGNvbW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3BfZWxlbS5ub3JtYWxpemUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfbGlzdCA9IHByb3BfZWxlbS5nZXRDaGlsZE5vZGVzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGV4dF9saXN0LmdldExlbmd0aCgpIDwgMSkgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X2VsZW0gPSAoVGV4dCl0ZXh0X2xpc3QuaXRlbSgwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb21tZW50ID0gdGV4dF9lbGVtLmdldE5vZGVWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1lbnQgIT0gbnVsbCAmJiBjb21tZW50Lmxlbmd0aCgpID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIAlpdGVtLnNldENvbW1lbnQoY29tbWVudCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSAhPSBudWxsICYmIHR5cGUuZXF1YWxzKCJ4LVRyYW5zbGF0ZWQiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSB0cmFuc2xhdGVkIGZsYWcgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3BfZWxlbS5ub3JtYWxpemUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfbGlzdCA9IHByb3BfZWxlbS5nZXRDaGlsZE5vZGVzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGV4dF9saXN0LmdldExlbmd0aCgpIDwgMSkgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X2VsZW0gPSAoVGV4dCl0ZXh0X2xpc3QuaXRlbSgwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0X2VsZW0uZ2V0Tm9kZVZhbHVlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0X2VsZW0uZ2V0Tm9kZVZhbHVlKCkuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlpdGVtLnNldFRyYW5zbGF0ZWQodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGV4dF9lbGVtLmdldE5vZGVWYWx1ZSgpLmVxdWFsc0lnbm9yZUNhc2UoImZhbHNlIikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCWl0ZW0uc2V0VHJhbnNsYXRlZChmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlpdGVtLnNldFRyYW5zbGF0ZWQoZ2V0RGVmYXVsdFRyYW5zbGF0ZWQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAJaXRlbS5zZXRUcmFuc2xhdGVkKGdldERlZmF1bHRUcmFuc2xhdGVkKCkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgIT0gbnVsbCAmJiB0eXBlLmVxdWFscygieC1Mb29rdXAiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IGEgbG9va3VwIHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICBwcm9wX2VsZW0ubm9ybWFsaXplKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X2xpc3QgPSBwcm9wX2VsZW0uZ2V0Q2hpbGROb2RlcygpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRleHRfbGlzdC5nZXRMZW5ndGgoKSA8IDEpCisgICAgICAgICAgICAgICAgICAgICAgICAJY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X2VsZW0gPSAoVGV4dCl0ZXh0X2xpc3QuaXRlbSgwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0X2VsZW0uZ2V0Tm9kZVZhbHVlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0ID0gdGV4dF9lbGVtLmdldE5vZGVWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0LmluZGV4T2YoIj0iKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb29rdXBzID09IG51bGwpIGxvb2t1cHMgPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGtleSA9IHRleHQuc3Vic3RyaW5nKDAsdGV4dC5pbmRleE9mKCI9IikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGx2YWx1ZSA9IHRleHQuc3Vic3RyaW5nKHRleHQuaW5kZXhPZigiPSIpKzEsdGV4dC5sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBzLnB1dChsa2V5LCBsdmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsgLyogU3RyaW5nIG91dCBvZiBib3VuZHMgLSBJZ25vcmUgYW5kIGdvIG9uICovIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAJaXRlbS5zZXRUcmFuc2xhdGVkKGdldERlZmF1bHRUcmFuc2xhdGVkKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChsb29rdXBzICE9IG51bGwpIGl0ZW0uc2V0TG9va3Vwcyhsb29rdXBzKTsKKyAgICAgICAgICAgICAgICBpbXBvcnRSZXNvdXJjZShpdGVtLCBlbmNvZGluZywgZ3JvdXApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCQorICAgIHByaXZhdGUgVmVjdG9yIGdldEVuY29kaW5nc1ZlY3RvcihFbGVtZW50IGJvZHkpIHsKKyAgICAgICAgU3RyaW5nIGVtcHR5ID0gIiI7CisgICAgICAgIGlmIChib2R5ID09IG51bGwpCisgICAgICAgIAlyZXR1cm4gbnVsbDsKKyAgICAgICAgSGFzaHRhYmxlIGhhc2ggPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgICAgIE5vZGVMaXN0IHR1X2xpc3QgPSBib2R5LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0dSIpOworICAgICAgICBmb3IgKGludCBpPTA7IGkgPCB0dV9saXN0LmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgIEVsZW1lbnQgdHVfZWxlbSA9IChFbGVtZW50KXR1X2xpc3QuaXRlbShpKTsKKyAgICAgICAgICAgIE5vZGVMaXN0IHR1dl9saXN0ID0gdHVfZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidHV2Iik7CisgICAgICAgICAgICBmb3IgKGludCBqPTA7IGogPCB0dXZfbGlzdC5nZXRMZW5ndGgoKTsgaisrKSB7CisgICAgICAgICAgICAgICAgRWxlbWVudCB0dXZfZWxlbSA9IChFbGVtZW50KXR1dl9saXN0Lml0ZW0oaik7CisgICAgICAgICAgICAgICAgU3RyaW5nIGVuY29kaW5nID0gdHV2X2VsZW0uZ2V0QXR0cmlidXRlKCJsYW5nIik7CisgICAgICAgICAgICAgICAgaWYgKGVuY29kaW5nID09IG51bGwpCisgICAgICAgICAgICAgICAgCWNvbnRpbnVlOworICAgICAgICAgICAgICAgIGNoYXIgYXJyYXlbXSA9IGVuY29kaW5nLnRvQ2hhckFycmF5KCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaz0wOyBrIDwgYXJyYXkubGVuZ3RoOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFycmF5W2tdID09ICctJykKKyAgICAgICAgICAgICAgICAgICAgCWFycmF5W2tdID0gJ18nOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbmNvZGluZyA9IFN0cmluZy52YWx1ZU9mKGFycmF5KTsKKyAgICAgICAgICAgICAgICBpZiAoIShoYXNoLmNvbnRhaW5zS2V5KGVuY29kaW5nKSkpCisgICAgICAgICAgICAgICAgCWhhc2gucHV0KGVuY29kaW5nLGVtcHR5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgRW51bWVyYXRpb24ga2V5cyA9IGhhc2gua2V5cygpOworICAgICAgICB3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAJdi5hZGRFbGVtZW50KGtleXMubmV4dEVsZW1lbnQoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHY7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9SQnhsaWZmRXhwb3J0ZXIuamF2YSBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9SQnhsaWZmRXhwb3J0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2U3YjZiCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL1JCeGxpZmZFeHBvcnRlci5qYXZhCkBAIC0wLDAgKzEsMzg4IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgICoKKyAqIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3BhY2thZ2UgY29tLmlibS5yYm07CisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS50ZXh0Lio7CisKK2ltcG9ydCBqYXZheC5zd2luZy4qOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLio7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS4qOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLio7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uKjsKKworaW1wb3J0IG9yZy53M2MuZG9tLio7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhIHBsdWctaW4gdG8gUkJNYW5hZ2VyIHRoYXQgYWxsb3dzIHRoZSB1c2VyIHRvIGV4cG9ydCBSZXNvdXJjZSBCdW5kbGVzCisgKiBhbG9uZyB3aXRoIHNvbWUgb2YgdGhlIG1ldGEtZGF0YSBhc3NvY2lhdGVkIGJ5IFJCTWFuYWdlciB0byB0aGUgWExJRkYgc3BlY2lmaWNhdGlvbi4KKyAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIFhMSUZGIHZpc2l0IHRoZSB3ZWIgc2l0ZQorICogPGEgaHJlZj0iaHR0cDovL3d3dy5saXNhLm9yZy94bGlmZi8iPmh0dHA6Ly93d3cubGlzYS5vcmcveGxpZmYvPC9hPgorICogCisgKiBAYXV0aG9yIEdlb3JnZSBSaG90ZW4KKyAqIEBzZWUgY29tLmlibS5yYm0uUkJNYW5hZ2VyCisgKi8KK3B1YmxpYyBjbGFzcyBSQnhsaWZmRXhwb3J0ZXIgZXh0ZW5kcyBSQkV4cG9ydGVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTiA9ICIwLjciOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTElGRl9EVEQgPSAiaHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9jb21taXR0ZWVzL3hsaWZmL2RvY3VtZW50cy94bGlmZi5kdGQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTElGRl9QVUJMSUNfTkFNRSA9ICItLy9YTElGRi8vRFREIFhMSUZGLy9FTiI7CisgICAgcHJpdmF0ZSBTaW1wbGVEYXRlRm9ybWF0IGRhdGVGb3JtYXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZCIpOworCQorICAgIC8qKgorICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IgZm9yIHRoZSBYTElGRiBleHBvcnRlci4KKyAgICAgKi8KKyAgICAgICAgCisgICAgcHVibGljIFJCeGxpZmZFeHBvcnRlcigpIHsKKyAgICAgICAgc3VwZXIoKTsKKwkJCisgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIGZpbGUgY2hvb3NlciBpZiBuZWNlc3NhcnkKKyAgICAgICAgaWYgKGNob29zZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgY2hvb3NlciA9IG5ldyBKRmlsZUNob29zZXIoKTsKKyAgICAgICAgICAgIGNob29zZXIuc2V0RmlsZUZpbHRlcihuZXcgamF2YXguc3dpbmcuZmlsZWNob29zZXIuRmlsZUZpbHRlcigpeworICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiWExJRkYgRmlsZXMiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBmKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZi5pc0RpcmVjdG9yeSgpIHx8IGYuZ2V0TmFtZSgpLmVuZHNXaXRoKCIueGxmIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgfQorCQorICAgIHByaXZhdGUgU3RyaW5nIGNvbnZlcnRUb0lTTyhEYXRlIGQpIHsKKyAgICAgICAgR3JlZ29yaWFuQ2FsZW5kYXIgZ2MgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoKTsKKyAgICAgICAgZ2Muc2V0VGltZShkKTsKKyAgICAgICAgcmV0dXJuIGNvbnZlcnRUb0lTTyhnYyk7CisgICAgfQorCQorICAgIHByaXZhdGUgU3RyaW5nIGNvbnZlcnRUb0lTTyhHcmVnb3JpYW5DYWxlbmRhciBnYykgeworICAgIAlkYXRlRm9ybWF0LnNldENhbGVuZGFyKGdjKTsKKyAgICAgICAgcmV0dXJuIGRhdGVGb3JtYXQuZm9ybWF0KGdjLmdldFRpbWUoKSk7CisgICAgfQorCQorICAgIHByaXZhdGUgU3RyaW5nIGdldExvY2FsZShCdW5kbGUgaXRlbSkgeworICAgICAgICBTdHJpbmcgbGFuZ3VhZ2UgPSBpdGVtLmdldExhbmd1YWdlRW5jb2RpbmcoKTsKKyAgICAgICAgaWYgKGxhbmd1YWdlICE9IG51bGwgJiYgIWxhbmd1YWdlLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgIC8vbGFuZ3VhZ2UgPSBsYW5ndWFnZS50b1VwcGVyQ2FzZSgpOworICAgICAgICAgICAgU3RyaW5nIGNvdW50cnkgPSBpdGVtLmdldENvdW50cnlFbmNvZGluZygpOworICAgICAgICAgICAgaWYgKGNvdW50cnkgIT0gbnVsbCAmJiAhY291bnRyeS5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICAgICAgLy9jb3VudHJ5ID0gY291bnRyeS50b1VwcGVyQ2FzZSgpOworICAgICAgICAgICAgICAgIFN0cmluZyB2YXJpYW50ID0gaXRlbS5nZXRWYXJpYW50RW5jb2RpbmcoKTsKKyAgICAgICAgICAgICAgICBpZiAodmFyaWFudCAhPSBudWxsICYmICF2YXJpYW50LmVxdWFscygiIikpIHsKKyAgICAgICAgICAgICAgICAgICAgLy92YXJpYW50ID0gdmFyaWFudC50b1VwcGVyQ2FzZSgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGFuZ3VhZ2UgKyAiLSIgKyBjb3VudHJ5ICsgIi0iICsgdmFyaWFudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGxhbmd1YWdlICsgIi0iICsgY291bnRyeTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBsYW5ndWFnZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gIiI7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0UGFyZW50TG9jYWxlKFN0cmluZyBsb2NhbGUpIHsKKyAgICAJCisgICAgCWludCB0cnVuY0luZGV4ID0gbG9jYWxlLmxhc3RJbmRleE9mKCctJyk7CisgICAgCWlmICh0cnVuY0luZGV4ID4gMCkgeworICAgIAkJbG9jYWxlID0gbG9jYWxlLnN1YnN0cmluZygwLCB0cnVuY0luZGV4KTsKKyAgICAJfQorICAgIAllbHNlIHsKKyAgICAJCWxvY2FsZSA9ICIiOworICAgIAl9CisgICAgCXJldHVybiBsb2NhbGU7CisgICAgfQorCQorICAgIHByaXZhdGUgdm9pZCBhZGRUcmFuc1VuaXQoRG9jdW1lbnQgeG1sLCBFbGVtZW50IGdyb3VwRWxlbSwgQnVuZGxlSXRlbSBpdGVtLCBCdW5kbGVJdGVtIHBhcmVudF9pdGVtKSB7CisgICAgICAgIEVsZW1lbnQgdHJhbnNVbml0ID0geG1sLmNyZWF0ZUVsZW1lbnQoInRyYW5zLXVuaXQiKTsKKyAgICAgICAgdHJhbnNVbml0LnNldEF0dHJpYnV0ZSgiZGF0ZSIsY29udmVydFRvSVNPKGl0ZW0uZ2V0TW9kaWZpZWREYXRlKCkpKTsKKyAgICAgICAgdHJhbnNVbml0LnNldEF0dHJpYnV0ZSgiaWQiLGl0ZW0uZ2V0S2V5KCkpOworCQkKKyAgICAgICAgU3RyaW5nIHNvdXJjZU9yVGFyZ2V0ID0gInRhcmdldCI7CisgICAgICAgIGlmIChwYXJlbnRfaXRlbSA9PSBudWxsKSB7CisgICAgICAgIAlzb3VyY2VPclRhcmdldCA9ICJzb3VyY2UiOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgRWxlbWVudCBzb3VyY2UgPSB4bWwuY3JlYXRlRWxlbWVudCgic291cmNlIik7CisgICAgICAgICAgICBzb3VyY2Uuc2V0QXR0cmlidXRlKCJ4bWw6c3BhY2UiLCJwcmVzZXJ2ZSIpOworICAgICAgICAgICAgc291cmNlLmFwcGVuZENoaWxkKHhtbC5jcmVhdGVUZXh0Tm9kZShwYXJlbnRfaXRlbS5nZXRUcmFuc2xhdGlvbigpKSk7CisgICAgICAgICAgICB0cmFuc1VuaXQuYXBwZW5kQ2hpbGQoc291cmNlKTsKKyAgICAgICAgfQorICAgICAgICBFbGVtZW50IHRhcmdldCA9IHhtbC5jcmVhdGVFbGVtZW50KHNvdXJjZU9yVGFyZ2V0KTsKKyAgICAgICAgdGFyZ2V0LnNldEF0dHJpYnV0ZSgieG1sOnNwYWNlIiwicHJlc2VydmUiKTsKKyAgICAJLy8gVGhpcyBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgdHJhbnNsYXRlIGF0dHJpYnV0ZQorICAgICAgICBpZiAoaXRlbS5pc1RyYW5zbGF0ZWQoKSkgeworICAgICAgICAJLy8gVE9ETyBIYW5kbGUgdGhlIG90aGVyIHN0YXRlcyBpbiB0aGUgZnV0dXJlLgorICAgICAgICAJdHJhbnNVbml0LnNldEF0dHJpYnV0ZSgic3RhdGUiLCAidHJhbnNsYXRlZCIpOworICAgICAgICB9CisgICAgICAgIHRhcmdldC5hcHBlbmRDaGlsZCh4bWwuY3JlYXRlVGV4dE5vZGUoaXRlbS5nZXRUcmFuc2xhdGlvbigpKSk7CisgICAgICAgIHRyYW5zVW5pdC5hcHBlbmRDaGlsZCh0YXJnZXQpOworCQkKKyAgICAgICAgaWYgKGl0ZW0uZ2V0Q29tbWVudCgpICE9IG51bGwgJiYgaXRlbS5nZXRDb21tZW50KCkubGVuZ3RoKCkgPiAxKSB7CisJICAgICAgICBFbGVtZW50IGNvbW1lbnRfcHJvcCA9IHhtbC5jcmVhdGVFbGVtZW50KCJub3RlIik7CisJICAgICAgICBjb21tZW50X3Byb3Auc2V0QXR0cmlidXRlKCJ4bWw6c3BhY2UiLCJwcmVzZXJ2ZSIpOworCSAgICAgICAgY29tbWVudF9wcm9wLmFwcGVuZENoaWxkKHhtbC5jcmVhdGVUZXh0Tm9kZShpdGVtLmdldENvbW1lbnQoKSkpOworCSAgICAgICAgdHJhbnNVbml0LmFwcGVuZENoaWxkKGNvbW1lbnRfcHJvcCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmICgoaXRlbS5nZXRDcmVhdG9yKCkgIT0gbnVsbCAmJiBpdGVtLmdldENyZWF0b3IoKS5sZW5ndGgoKSA+IDEpCisgICAgICAgIAl8fCAoaXRlbS5nZXRNb2RpZmllcigpICE9IG51bGwgJiYgaXRlbS5nZXRNb2RpZmllcigpLmxlbmd0aCgpID4gMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEVsZW1lbnQgdHJhbnNVbml0X3Byb3BfZ3JvdXBfZWxlbSA9IHhtbC5jcmVhdGVFbGVtZW50KCJwcm9wLWdyb3VwIik7CisKKyAgICAgICAgICAgIGlmIChpdGVtLmdldENyZWF0b3IoKSAhPSBudWxsICYmIGl0ZW0uZ2V0Q3JlYXRvcigpLmxlbmd0aCgpID4gMSkgeworCSAgICAgICAgICAgIEVsZW1lbnQgY3JlYXRvcl9wcm9wID0geG1sLmNyZWF0ZUVsZW1lbnQoInByb3AiKTsKKwkgICAgICAgICAgICBjcmVhdG9yX3Byb3Auc2V0QXR0cmlidXRlKCJwcm9wLXR5cGUiLCJjcmVhdG9yIik7CisJICAgICAgICAgICAgY3JlYXRvcl9wcm9wLmFwcGVuZENoaWxkKHhtbC5jcmVhdGVUZXh0Tm9kZShpdGVtLmdldENyZWF0b3IoKSkpOworCQkgICAgICAgIHRyYW5zVW5pdF9wcm9wX2dyb3VwX2VsZW0uYXBwZW5kQ2hpbGQoY3JlYXRvcl9wcm9wKTsKKyAgICAgICAgICAgIH0KKwkgICAgICAgIAorICAgICAgICAgICAgaWYgKGl0ZW0uZ2V0Q3JlYXRvcigpICE9IG51bGwgJiYgaXRlbS5nZXRDcmVhdG9yKCkubGVuZ3RoKCkgPiAxKSB7CisJICAgICAgICAgICAgRWxlbWVudCBjcmVhdGVkX3Byb3AgPSB4bWwuY3JlYXRlRWxlbWVudCgicHJvcCIpOworCSAgICAgICAgICAgIGNyZWF0ZWRfcHJvcC5zZXRBdHRyaWJ1dGUoInByb3AtdHlwZSIsImNyZWF0ZWQiKTsKKwkgICAgICAgICAgICBjcmVhdGVkX3Byb3AuYXBwZW5kQ2hpbGQoeG1sLmNyZWF0ZVRleHROb2RlKGNvbnZlcnRUb0lTTyhpdGVtLmdldENyZWF0ZWREYXRlKCkpKSk7CisJCSAgICAgICAgdHJhbnNVbml0X3Byb3BfZ3JvdXBfZWxlbS5hcHBlbmRDaGlsZChjcmVhdGVkX3Byb3ApOworICAgICAgICAgICAgfQorCSAgICAgICAgCisgICAgICAgIAlpZiAoaXRlbS5nZXRNb2RpZmllcigpICE9IG51bGwgJiYgaXRlbS5nZXRNb2RpZmllcigpLmxlbmd0aCgpID4gMSkgeworCQkgICAgICAgIEVsZW1lbnQgbW9kaWZpZXJfcHJvcCA9IHhtbC5jcmVhdGVFbGVtZW50KCJwcm9wIik7CisJCSAgICAgICAgbW9kaWZpZXJfcHJvcC5zZXRBdHRyaWJ1dGUoInByb3AtdHlwZSIsIm1vZGlmaWVyIik7CisJCSAgICAgICAgbW9kaWZpZXJfcHJvcC5hcHBlbmRDaGlsZCh4bWwuY3JlYXRlVGV4dE5vZGUoaXRlbS5nZXRNb2RpZmllcigpKSk7CisJCSAgICAgICAgdHJhbnNVbml0X3Byb3BfZ3JvdXBfZWxlbS5hcHBlbmRDaGlsZChtb2RpZmllcl9wcm9wKTsKKyAgICAgICAgCX0KKwkgICAgICAgIAorCSAgICAgICAgdHJhbnNVbml0LmFwcGVuZENoaWxkKHRyYW5zVW5pdF9wcm9wX2dyb3VwX2VsZW0pOworICAgICAgICB9CisKKyAgICAgICAgZ3JvdXBFbGVtLmFwcGVuZENoaWxkKHRyYW5zVW5pdCk7CisgICAgfQorCQorICAgIHB1YmxpYyB2b2lkIGV4cG9ydChSQk1hbmFnZXIgcmJtKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAocmJtID09IG51bGwpCisgICAgICAgIAlyZXR1cm47CisgICAgICAgIC8vIE9wZW4gdGhlIFNhdmUgRGlhbG9nCisgICAgICAgIGludCByZXRfdmFsID0gY2hvb3Nlci5zaG93U2F2ZURpYWxvZyhudWxsKTsKKyAgICAgICAgaWYgKHJldF92YWwgIT0gSkZpbGVDaG9vc2VyLkFQUFJPVkVfT1BUSU9OKQorICAgICAgICAJcmV0dXJuOworICAgICAgICAvLyBSZXRyaWV2ZSBiYXNpYyBmaWxlIGluZm9ybWF0aW9uCisgICAgICAgIEZpbGUgZmlsZSA9IGNob29zZXIuZ2V0U2VsZWN0ZWRGaWxlKCk7ICAgICAgICAgICAgICAvLyBUaGUgZmlsZShzKSB3ZSB3aWxsIGJlIHdvcmtpbmcgd2l0aAorICAgICAgICBGaWxlIGRpcmVjdG9yeSA9IG5ldyBGaWxlKGZpbGUuZ2V0UGFyZW50KCkpOyAgICAgICAgLy8gVGhlIGRpcmVjdG9yeSB3ZSB3aWxsIGJlIHdyaXRpbmcgdG8KKyAgICAgICAgU3RyaW5nIGJhc2VfbmFtZSA9IGZpbGUuZ2V0TmFtZSgpOyAgICAgICAgICAgICAgICAgIC8vIFRoZSBiYXNlIG5hbWUgb2YgdGhlIGZpbGVzIHdlIHdpbGwgd3JpdGUKKyAgICAgICAgaWYgKGJhc2VfbmFtZSA9PSBudWxsIHx8IGJhc2VfbmFtZS5lcXVhbHMoIiIpKQorICAgICAgICAJYmFzZV9uYW1lID0gcmJtLmdldEJhc2VDbGFzcygpOworICAgICAgICBpZiAoYmFzZV9uYW1lLmVuZHNXaXRoKCIueGxmIikpCisgICAgICAgIAliYXNlX25hbWUgPSBiYXNlX25hbWUuc3Vic3RyaW5nKDAsYmFzZV9uYW1lLmxlbmd0aCgpLTQpOworCQkKKyAgICAgICAgU3RyaW5nIGZpbGVfbmFtZSA9IGJhc2VfbmFtZSArICIueGxmIjsKKyAgICAgICAgCisgICAgICAgIFZlY3RvciBidW5kbGVfdiA9IHJibS5nZXRCdW5kbGVzKCk7CisgICAgICAgIEVudW1lcmF0aW9uIGJ1bmRsZUl0ZXIgPSBidW5kbGVfdi5lbGVtZW50cygpOworICAgICAgICB3aGlsZSAoYnVuZGxlSXRlci5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAJZXhwb3J0RmlsZShyYm0sIGRpcmVjdG9yeSwgYmFzZV9uYW1lLCAoQnVuZGxlKWJ1bmRsZUl0ZXIubmV4dEVsZW1lbnQoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSB2b2lkIGFkZEhlYWRlclByb3BlcnRpZXMoRG9jdW1lbnQgeG1sLCBFbGVtZW50IGhlYWRlciwgQnVuZGxlIG1haW5fYnVuZGxlKSB7CisgICAgICAgIGlmIChtYWluX2J1bmRsZS5jb21tZW50ICE9IG51bGwgJiYgbWFpbl9idW5kbGUuY29tbWVudC5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIEVsZW1lbnQgbm90ZSA9IHhtbC5jcmVhdGVFbGVtZW50KCJub3RlIik7CisgICAgICAgIAloZWFkZXIuYXBwZW5kQ2hpbGQobm90ZSk7CisgICAgICAgICAgICBub3RlLmFwcGVuZENoaWxkKHhtbC5jcmVhdGVUZXh0Tm9kZShtYWluX2J1bmRsZS5jb21tZW50KSk7CisgICAgICAgICAgICBub3RlLnNldEF0dHJpYnV0ZSgieG1sOnNwYWNlIiwicHJlc2VydmUiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKG1haW5fYnVuZGxlLm5hbWUgIT0gbnVsbCAmJiBtYWluX2J1bmRsZS5uYW1lLmxlbmd0aCgpID4gMCkKKyAgICAJCXx8IChtYWluX2J1bmRsZS5tYW5hZ2VyICE9IG51bGwgJiYgbWFpbl9idW5kbGUubWFuYWdlci5sZW5ndGgoKSA+IDApCisgICAgICAgIAl8fCAobWFpbl9idW5kbGUubGFuZ3VhZ2UgIT0gbnVsbCAmJiBtYWluX2J1bmRsZS5sYW5ndWFnZS5sZW5ndGgoKSA+IDApCisJCQl8fCAobWFpbl9idW5kbGUuY291bnRyeSAhPSBudWxsICYmIG1haW5fYnVuZGxlLmNvdW50cnkubGVuZ3RoKCkgPiAwKQorCQkJfHwgKG1haW5fYnVuZGxlLnZhcmlhbnQgIT0gbnVsbCAmJiBtYWluX2J1bmRsZS52YXJpYW50Lmxlbmd0aCgpID4gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEVsZW1lbnQgcHJvcF9ncm91cCA9IHhtbC5jcmVhdGVFbGVtZW50KCJwcm9wLWdyb3VwIik7CisgICAgICAgIAloZWFkZXIuYXBwZW5kQ2hpbGQocHJvcF9ncm91cCk7CisgICAgICAgICAgICBpZiAobWFpbl9idW5kbGUubmFtZSAhPSBudWxsICYmIG1haW5fYnVuZGxlLm5hbWUubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgRWxlbWVudCBwcm9wID0geG1sLmNyZWF0ZUVsZW1lbnQoInByb3AiKTsKKyAgICAgICAgICAgIAloZWFkZXIuYXBwZW5kQ2hpbGQocHJvcCk7CisgICAgICAgICAgICAJcHJvcC5zZXRBdHRyaWJ1dGUoInhtbDpzcGFjZSIsInByZXNlcnZlIik7CisgICAgICAgICAgICAJcHJvcC5zZXRBdHRyaWJ1dGUoInByb3AtdHlwZSIsIm5hbWUiKTsKKyAgICAgICAgICAgIAlwcm9wLmFwcGVuZENoaWxkKHhtbC5jcmVhdGVUZXh0Tm9kZShtYWluX2J1bmRsZS5uYW1lKSk7CisgICAgICAgICAgICAJcHJvcF9ncm91cC5hcHBlbmRDaGlsZChwcm9wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtYWluX2J1bmRsZS5tYW5hZ2VyICE9IG51bGwgJiYgbWFpbl9idW5kbGUubWFuYWdlci5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBFbGVtZW50IHByb3AgPSB4bWwuY3JlYXRlRWxlbWVudCgicHJvcCIpOworICAgICAgICAgICAgCWhlYWRlci5hcHBlbmRDaGlsZChwcm9wKTsKKyAgICAgICAgICAgIAlwcm9wLnNldEF0dHJpYnV0ZSgieG1sOnNwYWNlIiwicHJlc2VydmUiKTsKKyAgICAgICAgICAgIAlwcm9wLnNldEF0dHJpYnV0ZSgicHJvcC10eXBlIiwibWFuYWdlciIpOworICAgICAgICAgICAgCXByb3AuYXBwZW5kQ2hpbGQoeG1sLmNyZWF0ZVRleHROb2RlKG1haW5fYnVuZGxlLm1hbmFnZXIpKTsKKyAgICAgICAgICAgIAlwcm9wX2dyb3VwLmFwcGVuZENoaWxkKHByb3ApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1haW5fYnVuZGxlLmxhbmd1YWdlICE9IG51bGwgJiYgbWFpbl9idW5kbGUubGFuZ3VhZ2UubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgRWxlbWVudCBwcm9wID0geG1sLmNyZWF0ZUVsZW1lbnQoInByb3AiKTsKKyAgICAgICAgICAgIAloZWFkZXIuYXBwZW5kQ2hpbGQocHJvcCk7CisgICAgICAgICAgICAJcHJvcC5zZXRBdHRyaWJ1dGUoInhtbDpzcGFjZSIsInByZXNlcnZlIik7CisgICAgICAgICAgICAJcHJvcC5zZXRBdHRyaWJ1dGUoInByb3AtdHlwZSIsImxhbmd1YWdlIik7CisgICAgICAgICAgICAJcHJvcC5hcHBlbmRDaGlsZCh4bWwuY3JlYXRlVGV4dE5vZGUobWFpbl9idW5kbGUubGFuZ3VhZ2UpKTsKKyAgICAgICAgICAgIAlwcm9wX2dyb3VwLmFwcGVuZENoaWxkKHByb3ApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1haW5fYnVuZGxlLmNvdW50cnkgIT0gbnVsbCAmJiBtYWluX2J1bmRsZS5jb3VudHJ5Lmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgIEVsZW1lbnQgcHJvcCA9IHhtbC5jcmVhdGVFbGVtZW50KCJwcm9wIik7CisgICAgICAgICAgICAJaGVhZGVyLmFwcGVuZENoaWxkKHByb3ApOworICAgICAgICAgICAgCXByb3Auc2V0QXR0cmlidXRlKCJ4bWw6c3BhY2UiLCJwcmVzZXJ2ZSIpOworICAgICAgICAgICAgCXByb3Auc2V0QXR0cmlidXRlKCJwcm9wLXR5cGUiLCJjb3VudHJ5Iik7CisgICAgICAgICAgICAJcHJvcC5hcHBlbmRDaGlsZCh4bWwuY3JlYXRlVGV4dE5vZGUobWFpbl9idW5kbGUuY291bnRyeSkpOworICAgICAgICAgICAgCXByb3BfZ3JvdXAuYXBwZW5kQ2hpbGQocHJvcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobWFpbl9idW5kbGUudmFyaWFudCAhPSBudWxsICYmIG1haW5fYnVuZGxlLnZhcmlhbnQubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgRWxlbWVudCBwcm9wID0geG1sLmNyZWF0ZUVsZW1lbnQoInByb3AiKTsKKyAgICAgICAgICAgIAloZWFkZXIuYXBwZW5kQ2hpbGQocHJvcCk7CisgICAgICAgICAgICAJcHJvcC5zZXRBdHRyaWJ1dGUoInhtbDpzcGFjZSIsInByZXNlcnZlIik7CisgICAgICAgICAgICAJcHJvcC5zZXRBdHRyaWJ1dGUoInByb3AtdHlwZSIsInZhcmlhbnQiKTsKKyAgICAgICAgICAgIAlwcm9wLmFwcGVuZENoaWxkKHhtbC5jcmVhdGVUZXh0Tm9kZShtYWluX2J1bmRsZS52YXJpYW50KSk7CisgICAgICAgICAgICAJcHJvcF9ncm91cC5hcHBlbmRDaGlsZChwcm9wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgZXhwb3J0RmlsZShSQk1hbmFnZXIgcmJtLCBGaWxlIGRpcmVjdG9yeSwgU3RyaW5nIGJhc2VfbmFtZSwgQnVuZGxlIG1haW5fYnVuZGxlKQorICAgIAl0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIEJ1bmRsZSBwYXJlbnRfYnVuZGxlID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIHBhcmVudF9idW5kbGVfbmFtZSA9IG51bGw7CisgICAgICAgIGlmICghZ2V0TG9jYWxlKG1haW5fYnVuZGxlKS5lcXVhbHMoIiIpKSB7CisgICAgICAgIAkvLyBJZiB0aGlzIGlzbid0IHRoZSByb290IGxvY2FsZSwgZmluZCB0aGUgcGFyZW50CisgICAgICAgICAgICBwYXJlbnRfYnVuZGxlX25hbWUgPSBnZXRQYXJlbnRMb2NhbGUoZ2V0TG9jYWxlKG1haW5fYnVuZGxlKSk7CisJICAgICAgICBkbyB7CisJICAgICAgICAJcGFyZW50X2J1bmRsZSA9IHJibS5nZXRCdW5kbGUocGFyZW50X2J1bmRsZV9uYW1lKTsKKwkgICAgICAgIAlpZiAocGFyZW50X2J1bmRsZSAhPSBudWxsKSB7CisJICAgICAgICAJCWJyZWFrOworCSAgICAgICAgCX0KKwkgICAgICAgICAgICBwYXJlbnRfYnVuZGxlX25hbWUgPSBnZXRQYXJlbnRMb2NhbGUocGFyZW50X2J1bmRsZV9uYW1lKTsKKwkgICAgICAgIH0gd2hpbGUgKCFwYXJlbnRfYnVuZGxlX25hbWUuZXF1YWxzKCIiKSk7CisgICAgICAgIH0KKworICAgICAgICAKKyAgICAgICAgLy8gRmluZCB0aGUgaW1wbGVtZW50YXRpb24KKyAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXI7CisgICAgICAgIHRyeSB7CisgICAgICAgIAlidWlsZGVyID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIHBjZSkgeworICAgICAgICAJdGhyb3cgbmV3IElPRXhjZXB0aW9uKHBjZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBDcmVhdGUgdGhlIGRvY3VtZW50CisgICAgICAgIERvY3VtZW50IHhtbCA9IGJ1aWxkZXIuZ2V0RE9NSW1wbGVtZW50YXRpb24oKS5jcmVhdGVEb2N1bWVudChudWxsLCAieGxpZmYiLCBudWxsKTsKKyAgICAgICAgIAorICAgICAgICAvLyBGaWxsIHRoZSBkb2N1bWVudAorICAgICAgICBFbGVtZW50IHJvb3QgPSB4bWwuZ2V0RG9jdW1lbnRFbGVtZW50KCk7CisgICAgICAgIHJvb3Quc2V0QXR0cmlidXRlKCJ2ZXJzaW9uIiwgIjEuMSIpOworICAgICAgICAvL3Jvb3QuYXBwZW5kQ2hpbGQocm9vdCk7CisgICAgICAgIAorICAgICAgICBFbGVtZW50IGZpbGVfZWxlbSA9IHhtbC5jcmVhdGVFbGVtZW50KCJmaWxlIik7CisgICAgICAgIFN0cmluZyBtYWluTG9jYWxlID0gZ2V0TG9jYWxlKG1haW5fYnVuZGxlKTsKKyAgICAgICAgQnVuZGxlIHBhcmVudEJ1bmRsZSA9IG51bGw7CisgICAgICAgIGlmIChtYWluTG9jYWxlLmVxdWFscygiIikpIHsKKyAgICAgICAgCWZpbGVfZWxlbS5zZXRBdHRyaWJ1dGUoInNvdXJjZS1sYW5ndWFnZSIsIGdldExvY2FsZShtYWluX2J1bmRsZSkpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAJZmlsZV9lbGVtLnNldEF0dHJpYnV0ZSgic291cmNlLWxhbmd1YWdlIiwgcGFyZW50X2J1bmRsZV9uYW1lKTsKKyAgICAgICAgCWZpbGVfZWxlbS5zZXRBdHRyaWJ1dGUoInRhcmdldC1sYW5ndWFnZSIsIGdldExvY2FsZShtYWluX2J1bmRsZSkpOworICAgICAgICB9CisgICAgICAgIGZpbGVfZWxlbS5zZXRBdHRyaWJ1dGUoImRhdGF0eXBlIiwgInBsYWludGV4dCIpOworICAgICAgICBmaWxlX2VsZW0uc2V0QXR0cmlidXRlKCJkYXRlIiwgY29udmVydFRvSVNPKG5ldyBEYXRlKCkpKTsKKyAgICAgICAgcm9vdC5hcHBlbmRDaGlsZChmaWxlX2VsZW0pOworCQkKKyAgICAgICAgRWxlbWVudCBoZWFkZXIgPSB4bWwuY3JlYXRlRWxlbWVudCgiaGVhZGVyIik7CisgICAgICAgIEVsZW1lbnQgdG9vbCA9IHhtbC5jcmVhdGVFbGVtZW50KCJ0b29sIik7CisgICAgICAgIHRvb2wuc2V0QXR0cmlidXRlKCJ0b29sLW5hbWUiLCAiUkJNYW5hZ2VyIik7CisgICAgICAgIHRvb2wuc2V0QXR0cmlidXRlKCJ0b29sLWlkIiwgIlJCTWFuYWdlciIpOworICAgICAgICB0b29sLnNldEF0dHJpYnV0ZSgidG9vbC12ZXJzaW9uIiwgVkVSU0lPTik7CisgICAgICAgIC8vIFRPRE8gQWRkIGZpbGUgYXR0cmlidXRlCisgICAgICAgIC8vaGVhZGVyLnNldEF0dHJpYnV0ZSgiZmlsZSIsICIiKTsKKyAgICAgICAgaGVhZGVyLmFwcGVuZENoaWxkKHRvb2wpOworICAgICAgICBhZGRIZWFkZXJQcm9wZXJ0aWVzKHhtbCwgaGVhZGVyLCBtYWluX2J1bmRsZSk7CisgICAgICAgIGZpbGVfZWxlbS5hcHBlbmRDaGlsZChoZWFkZXIpOworCQkKKyAgICAgICAgRWxlbWVudCBib2R5ID0geG1sLmNyZWF0ZUVsZW1lbnQoImJvZHkiKTsKKyAgICAgICAgZmlsZV9lbGVtLmFwcGVuZENoaWxkKGJvZHkpOworCQkKKyAgICAgICAgVmVjdG9yIGdyb3VwX3YgPSBtYWluX2J1bmRsZS5nZXRHcm91cHNBc1ZlY3RvcigpOworICAgICAgICBWZWN0b3IgcGFyZW50X2dyb3VwX3YgPSBudWxsOworICAgICAgICBpZiAocGFyZW50X2J1bmRsZSAhPSBudWxsKSB7CisgICAgICAgIAlwYXJlbnRfZ3JvdXBfdiA9IHBhcmVudF9idW5kbGUuZ2V0R3JvdXBzQXNWZWN0b3IoKTsKKyAgICAgICAgfQorICAgICAgICAvLyBMb29wIHRocm91Z2ggZWFjaCBidW5kbGUgZ3JvdXAgaW4gbWFpbl9idW5kbGUKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgZ3JvdXBfdi5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgQnVuZGxlR3JvdXAgY3Vycl9ncm91cCA9IChCdW5kbGVHcm91cClncm91cF92LmVsZW1lbnRBdChpKTsKKyAgICAgICAgICAgIEJ1bmRsZUdyb3VwIHBhcmVudF9ncm91cCA9IG51bGw7CisgICAgICAgICAgICBpZiAocGFyZW50X2dyb3VwX3YgIT0gbnVsbCkgeyAKKwkgICAgICAgICAgICBFbnVtZXJhdGlvbiBwYXJlbnRHcm91cEl0ZXIgPSBwYXJlbnRfZ3JvdXBfdi5lbGVtZW50cygpOworCSAgICAgICAgICAgIAorCSAgICAgICAgICAgIHdoaWxlIChwYXJlbnRHcm91cEl0ZXIuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKwkgICAgICAgICAgICAJQnVuZGxlR3JvdXAgZ3JvdXBUb0ZpbmQgPSAoQnVuZGxlR3JvdXApcGFyZW50R3JvdXBJdGVyLm5leHRFbGVtZW50KCk7CisJICAgICAgICAgICAgCWlmIChncm91cFRvRmluZC5nZXROYW1lKCkuZXF1YWxzKGN1cnJfZ3JvdXAuZ2V0TmFtZSgpKSkgeworCSAgICAgICAgICAgIAkJcGFyZW50X2dyb3VwID0gZ3JvdXBUb0ZpbmQ7CisJICAgICAgICAgICAgCQlicmVhazsKKwkgICAgICAgICAgICAJfQorCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEVsZW1lbnQgZ3JvdXBfZWxlbSA9IHhtbC5jcmVhdGVFbGVtZW50KCJncm91cCIpOworICAgICAgICAgICAgZ3JvdXBfZWxlbS5zZXRBdHRyaWJ1dGUoImlkIiwgY3Vycl9ncm91cC5nZXROYW1lKCkpOworICAgICAgICAgICAgaWYgKGN1cnJfZ3JvdXAuZ2V0Q29tbWVudCgpICE9IG51bGwgJiYgY3Vycl9ncm91cC5nZXRDb21tZW50KCkubGVuZ3RoKCkgPiAxKSB7CisgICAgCSAgICAgICAgRWxlbWVudCBjb21tZW50X3Byb3AgPSB4bWwuY3JlYXRlRWxlbWVudCgibm90ZSIpOworICAgIAkgICAgICAgIGNvbW1lbnRfcHJvcC5zZXRBdHRyaWJ1dGUoInhtbDpzcGFjZSIsInByZXNlcnZlIik7CisgICAgCSAgICAgICAgY29tbWVudF9wcm9wLmFwcGVuZENoaWxkKHhtbC5jcmVhdGVUZXh0Tm9kZShjdXJyX2dyb3VwLmdldENvbW1lbnQoKSkpOworICAgIAkgICAgICAgIGdyb3VwX2VsZW0uYXBwZW5kQ2hpbGQoY29tbWVudF9wcm9wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgVmVjdG9yIGdyb3VwX2l0ZW1zID0gY3Vycl9ncm91cC5nZXRJdGVtc0FzVmVjdG9yKCk7CisgICAgICAgICAgICBmb3IgKGludCBqPTA7IGogPCBncm91cF9pdGVtcy5zaXplKCk7IGorKykgeworICAgICAgICAgICAgCUJ1bmRsZUl0ZW0gbWFpbl9pdGVtID0gKEJ1bmRsZUl0ZW0pZ3JvdXBfaXRlbXMuZ2V0KGopOworICAgICAgICAgICAgCUJ1bmRsZUl0ZW0gcGFyZW50X2l0ZW0gPSBudWxsOworICAgICAgICAgICAgCWlmIChwYXJlbnRfZ3JvdXAgIT0gbnVsbCkgeworCSAgICAgICAgICAgIAlFbnVtZXJhdGlvbiBwYXJlbnRJdGVyID0gcGFyZW50X2dyb3VwLmdldEl0ZW1zQXNWZWN0b3IoKS5lbGVtZW50cygpOworCSAgICAgICAgICAgIAlCdW5kbGVJdGVtIGl0ZW1Ub0ZpbmQgPSBudWxsOworCSAgICAgICAgICAgICAgICB3aGlsZSAocGFyZW50SXRlci5oYXNNb3JlRWxlbWVudHMoKSkgeworCSAgICAgICAgICAgICAgICAJaXRlbVRvRmluZCA9IChCdW5kbGVJdGVtKXBhcmVudEl0ZXIubmV4dEVsZW1lbnQoKTsKKwkgICAgICAgICAgICAgICAgCWlmIChpdGVtVG9GaW5kLmdldEtleSgpLmVxdWFscyhtYWluX2l0ZW0uZ2V0S2V5KCkpKSB7CisJICAgICAgICAgICAgICAgIAkJcGFyZW50X2l0ZW0gPSBpdGVtVG9GaW5kOworCSAgICAgICAgICAgICAgICAJCWJyZWFrOworCSAgICAgICAgICAgICAgICAJfQorCSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAJfQorICAgICAgICAgICAgICAgIGFkZFRyYW5zVW5pdCh4bWwsIGdyb3VwX2VsZW0sIG1haW5faXRlbSwgcGFyZW50X2l0ZW0pOworICAgICAgICAgICAgICAgIC8vZ3JvdXBfZWxlbS5hcHBlbmRDaGlsZCh0dSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBib2R5LmFwcGVuZENoaWxkKGdyb3VwX2VsZW0pOworICAgICAgICB9IC8vIGVuZCBmb3IgLSBpCisgICAgICAgIFN0cmluZyBzdWZmaXggPSBtYWluTG9jYWxlOworICAgICAgICBpZiAoIXN1ZmZpeC5lcXVhbHMoIiIpKSB7CisgICAgICAgIAlzdWZmaXggPSAnXycgKyBzdWZmaXg7CisgICAgICAgIH0KKyAgICAgICAgY2hhciBhcnJheVtdID0gc3VmZml4LnRvQ2hhckFycmF5KCk7CisgICAgICAgIGZvciAoaW50IGs9MDsgayA8IGFycmF5Lmxlbmd0aDsgaysrKSB7CisgICAgICAgICAgICBpZiAoYXJyYXlba10gPT0gJy0nKQorICAgICAgICAgICAgICAgIGFycmF5W2tdID0gJ18nOworICAgICAgICB9CisgICAgICAgIHN1ZmZpeCA9IFN0cmluZy52YWx1ZU9mKGFycmF5KTsKKyAgICAgICAgCisgICAgICAgIC8vIHNlcmlhbGl6ZSBkb2N1bWVudAorICAgICAgICBPdXRwdXRTdHJlYW1Xcml0ZXIgb3N3ID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcigKKyAgICAgICAgCQluZXcgRmlsZU91dHB1dFN0cmVhbShuZXcgRmlsZShkaXJlY3RvcnksIGJhc2VfbmFtZSArIHN1ZmZpeCArICIueGxmIikpLCAiVVRGLTgiKTsKKyAgICAgICAgdHJ5IHsKKwkJCVRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3VHJhbnNmb3JtZXIoKTsKKwkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuTUVUSE9ELCAieG1sIik7CisJCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLklOREVOVCwgInllcyIpOworCQkJdHJhbnNmb3JtZXIuc2V0T3V0cHV0UHJvcGVydHkoIntodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdH1pbmRlbnQtYW1vdW50IiwgIjIiKTsKKwkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuRE9DVFlQRV9TWVNURU0sIFhMSUZGX0RURCk7CisJCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLkRPQ1RZUEVfUFVCTElDLCBYTElGRl9QVUJMSUNfTkFNRSk7CisJCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLkVOQ09ESU5HLCAiVVRGLTgiKTsKKwkJCXRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKHhtbCksIG5ldyBTdHJlYW1SZXN1bHQob3N3KSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIHRlKSB7CisgICAgICAgIAl0aHJvdyBuZXcgSU9FeGNlcHRpb24odGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgb3N3LmNsb3NlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL1JCeGxpZmZJbXBvcnRlci5qYXZhIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL1JCeGxpZmZJbXBvcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhZWM0MzAKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vUkJ4bGlmZkltcG9ydGVyLmphdmEKQEAgLTAsMCArMSwzMzUgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoQykgMjAwMC0yMDA0LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCAgKgorICogb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworcGFja2FnZSBjb20uaWJtLnJibTsKKworCitpbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEudXRpbC4qOworCitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuKjsKKworaW1wb3J0IGNvbS5pYm0ucmJtLmd1aS5SQk1hbmFnZXJHVUk7CitpbXBvcnQgb3JnLnhtbC5zYXguKjsKK2ltcG9ydCBvcmcudzNjLmRvbS4qOworCisvKioKKyAqIFRoaXMgaW1wb3J0cyBYTElGRiBmaWxlcyBpbnRvIFJCTWFuYWdlci4KKyAqIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZQorICogPGEgaHJlZj0iaHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9jb21taXR0ZWVzL3hsaWZmL2RvY3VtZW50cy94bGlmZi1zcGVjaWZpY2F0aW9uLmh0bSI+CisgKiBodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2NvbW1pdHRlZXMveGxpZmYvZG9jdW1lbnRzL3hsaWZmLXNwZWNpZmljYXRpb24uaHRtPC9hPgorICogCisgKiBAYXV0aG9yIEdlb3JnZSBSaG90ZW4KKyAqIEBzZWUgY29tLmlibS5yYm0uUkJNYW5hZ2VyCisgKi8KK3B1YmxpYyBjbGFzcyBSQnhsaWZmSW1wb3J0ZXIgZXh0ZW5kcyBSQkltcG9ydGVyIHsKKwkKKyAgICBEb2N1bWVudCB4bGZfeG1sID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIEJhc2ljIGNvbnN0cnVjdG9yIGZvciB0aGUgWExJRkYgaW1wb3J0ZXIgZnJvbSB0aGUgcGFyZW50IFJCTWFuYWdlciBkYXRhIGFuZCBhIERpYWxvZyB0aXRsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUkJ4bGlmZkltcG9ydGVyKFN0cmluZyB0aXRsZSwgUkJNYW5hZ2VyIHJibSwgUkJNYW5hZ2VyR1VJIGd1aSkgeworICAgICAgICBzdXBlcih0aXRsZSwgcmJtLCBndWkpOworICAgIH0KKwkKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXR1cEZpbGVDaG9vc2VyKCkgeworICAgICAgICBjaG9vc2VyLnNldEZpbGVGaWx0ZXIobmV3IGphdmF4LnN3aW5nLmZpbGVjaG9vc2VyLkZpbGVGaWx0ZXIoKXsKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGYpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGYuaXNEaXJlY3RvcnkoKSB8fCBmLmdldE5hbWUoKS5lbmRzV2l0aCgiLnhsZiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImltcG9ydF9YTEZfZmlsZV9kZXNjcmlwdGlvbiIpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisJCisgICAgcHJvdGVjdGVkIHZvaWQgYmVnaW5JbXBvcnQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBzdXBlci5iZWdpbkltcG9ydCgpOworICAgICAgICBGaWxlIHhsZl9maWxlID0gZ2V0Q2hvc2VuRmlsZSgpOworCQkKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgCUZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHhsZl9maWxlKTsKKyAgICAgICAgICAgIElucHV0U291cmNlIGlzID0gbmV3IElucHV0U291cmNlKGZpcyk7CisgICAgICAgICAgICBEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKKyAgICAgICAgICAgIHhsZl94bWwgPSBidWlsZGVyLnBhcnNlKGlzKTsKKyAgICAgICAgICAgIGZpcy5jbG9zZSgpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChTQVhFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7CisgICAgICAgIAl0aHJvdyBuZXcgSU9FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIHBjZSkgeworICAgICAgICAgICAgcGNlLnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKKyAgICAgICAgCXRocm93IG5ldyBJT0V4Y2VwdGlvbihwY2UuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoeGxmX3htbCA9PSBudWxsKQorICAgICAgICAJcmV0dXJuOworICAgICAgICAKKyAgICAgICAgaW1wb3J0RG9jKCk7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgaW1wb3J0RG9jKCkgeworICAgICAgICBpZiAoeGxmX3htbCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBTdHJpbmcgbGFuZ3VhZ2UgPSAiIjsKKyAgICAgICAgU3RyaW5nIGJ1bmRsZV9ub3RlID0gbnVsbDsKKyAgICAJU3RyaW5nIGJ1bmRsZV9uYW1lID0gbnVsbDsKKyAgICAJU3RyaW5nIG1hbmFnZXJfbmFtZSA9IG51bGw7CisgICAgCVN0cmluZyBsYW5ndWFnZV9uYW1lID0gbnVsbDsKKyAgICAJU3RyaW5nIGNvdW50cnlfbmFtZSA9IG51bGw7CisgICAgCVN0cmluZyB2YXJpYW50X25hbWUgPSBudWxsOworICAgICAgICAKKyAgICAgICAgRWxlbWVudCByb290ID0geGxmX3htbC5nZXREb2N1bWVudEVsZW1lbnQoKTsKKyAgICAgICAgTm9kZSBmaWxlTm9kZSA9IHJvb3QuZ2V0Rmlyc3RDaGlsZCgpOworICAgICAgICBOb2RlIGhlYWRlciA9IG51bGw7CisgICAgICAgIE5vZGUgbm9kZSA9IG51bGw7CisgICAgICAgIHdoaWxlIChmaWxlTm9kZSAhPSBudWxsICYmICEoZmlsZU5vZGUgaW5zdGFuY2VvZiBFbGVtZW50ICYmIGZpbGVOb2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiZmlsZSIpKSkgeworICAgICAgICAgICAgZmlsZU5vZGUgPSBmaWxlTm9kZS5nZXROZXh0U2libGluZygpOworICAgICAgICB9CisgICAgICAgIGhlYWRlciA9IGZpbGVOb2RlLmdldEZpcnN0Q2hpbGQoKTsKKyAgICAgICAgd2hpbGUgKGhlYWRlciAhPSBudWxsCisgICAgICAgIAkJJiYgIShoZWFkZXIuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERQorICAgICAgICAJCSYmIChoZWFkZXIuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJoZWFkZXIiKQorCQkJCXx8IGhlYWRlci5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoImJvZHkiKSkpKQorICAgICAgICB7CisgICAgICAgIAloZWFkZXIgPSBoZWFkZXIuZ2V0TmV4dFNpYmxpbmcoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaGVhZGVyLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiaGVhZGVyIikpIHsKKyAgICAgICAgCS8vIEdldCB0aGUgbm90ZXMgaWYgZnJvbSB0aGUgaGVhZGVyIGlmIHRoZXkgZXhpc3QuCisgICAgICAgICAgICBOb2RlTGlzdCBoZWFkZXJfbm90ZV9saXN0ID0gKChFbGVtZW50KWhlYWRlcikuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm5vdGUiKTsKKyAgICAgICAgICAgIGlmIChoZWFkZXJfbm90ZV9saXN0LmdldExlbmd0aCgpID4gMCkgeworCSAgICAgICAgICAgIFRleHQgdGV4dF9lbGVtID0gKFRleHQpaGVhZGVyX25vdGVfbGlzdC5pdGVtKDApLmdldENoaWxkTm9kZXMoKS5pdGVtKDApOworCSAgICAgICAgICAgIGlmICh0ZXh0X2VsZW0gIT0gbnVsbCkgeworCQkgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSB0ZXh0X2VsZW0uZ2V0Tm9kZVZhbHVlKCk7CisJCSAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmxlbmd0aCgpID4gMCkgeworCQkgICAgICAgICAgICAJYnVuZGxlX25vdGUgPSB2YWx1ZTsKKwkJICAgICAgICAgICAgfQorCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE5vZGUgcHJvcF9ncm91cF9saXN0ID0gKChFbGVtZW50KWhlYWRlcikuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInByb3AtZ3JvdXAiKS5pdGVtKDApOworICAgICAgICAgICAgTm9kZUxpc3QgcHJvcF9saXN0ID0gcHJvcF9ncm91cF9saXN0LmdldENoaWxkTm9kZXMoKTsKKyAgICAgICAgCWludCBwcm9wZXJ0eU51bSA9IHByb3BfbGlzdC5nZXRMZW5ndGgoKTsKKyAgICAgICAgICAgIGlmIChwcm9wZXJ0eU51bSA+IDApIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBwcm9wID0gMDsgcHJvcCA8IHByb3BlcnR5TnVtOyBwcm9wKyspIHsKKyAgICAgICAgICAgICAgICAJaWYgKHByb3BfbGlzdC5pdGVtKHByb3ApIGluc3RhbmNlb2YgRWxlbWVudCkgeworICAgIAkgICAgICAgICAgICAJRWxlbWVudCBwcm9wZXJ0eV9lbGVtID0gKEVsZW1lbnQpcHJvcF9saXN0Lml0ZW0ocHJvcCk7CisgICAgCSAgICAgICAgICAgIAlTdHJpbmcgcHJvcGVydHlUeXBlID0gcHJvcGVydHlfZWxlbS5nZXRBdHRyaWJ1dGUoInByb3AtdHlwZSIpOworICAgIAkgICAgICAgICAgICAJaWYgKHByb3BlcnR5VHlwZSAhPSBudWxsKSB7CisgICAgCQkJICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gcHJvcGVydHlfZWxlbS5nZXRDaGlsZE5vZGVzKCkuaXRlbSgwKS5nZXROb2RlVmFsdWUoKTsKKyAgICAJCQkgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5sZW5ndGgoKSA+IDApIHsKKyAgICAJCQkgICAgICAgICAgICAJaWYgKHByb3BlcnR5VHlwZS5lcXVhbHMoIm5hbWUiKSkgeworICAgIAkJCQkgICAgICAgICAgICAJYnVuZGxlX25hbWUgPSB2YWx1ZTsKKyAgICAJCQkgICAgICAgICAgICAJfQorICAgIAkJCSAgICAgICAgICAgIAllbHNlIGlmIChwcm9wZXJ0eVR5cGUuZXF1YWxzKCJtYW5hZ2VyIikpIHsKKyAgICAJCQkJICAgICAgICAgICAgCW1hbmFnZXJfbmFtZSA9IHZhbHVlOworICAgIAkJCSAgICAgICAgICAgIAl9CisgICAgCQkJICAgICAgICAgICAgCWVsc2UgaWYgKHByb3BlcnR5VHlwZS5lcXVhbHMoImxhbmd1YWdlIikpIHsKKyAgICAJCQkJICAgICAgICAgICAgCWxhbmd1YWdlX25hbWUgPSB2YWx1ZTsKKyAgICAJCQkgICAgICAgICAgICAJfQorICAgIAkJCSAgICAgICAgICAgIAllbHNlIGlmIChwcm9wZXJ0eVR5cGUuZXF1YWxzKCJjb3VudHJ5IikpIHsKKyAgICAJCQkgICAgICAgICAgICAJCWNvdW50cnlfbmFtZSA9IHZhbHVlOworICAgIAkJCSAgICAgICAgICAgIAl9CisgICAgCQkJICAgICAgICAgICAgCWVsc2UgaWYgKHByb3BlcnR5VHlwZS5lcXVhbHMoInZhcmlhbnQiKSkgeworICAgIAkJCSAgICAgICAgICAgIAkJdmFyaWFudF9uYW1lID0gdmFsdWU7CisgICAgCQkJICAgICAgICAgICAgCX0KKyAgICAJCQkgICAgICAgICAgICB9CisgICAgCSAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgCX0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbm9kZSA9IGhlYWRlci5nZXROZXh0U2libGluZygpOworICAgICAgICB3aGlsZSAobm9kZSAhPSBudWxsICYmICEobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgbm9kZS5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoImJvZHkiKSkpIHsKKyAgICAgICAgICAgIG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIEVsZW1lbnQgYm9keSA9IChFbGVtZW50KW5vZGU7CisgICAgICAgIC8vcmVzb2x2ZUVuY29kaW5ncyhnZXRFbmNvZGluZ3NWZWN0b3IoYm9keSkpOworICAgICAgICAKKyAgICAgICAgU3RyaW5nIHNvdXJjZUxvY2FsZSA9ICgoRWxlbWVudClmaWxlTm9kZSkuZ2V0QXR0cmlidXRlKCJzb3VyY2UtbGFuZ3VhZ2UiKTsKKyAgICAgICAgU3RyaW5nIHRhcmdldExvY2FsZSA9ICgoRWxlbWVudClmaWxlTm9kZSkuZ2V0QXR0cmlidXRlKCJ0YXJnZXQtbGFuZ3VhZ2UiKTsKKyAgICAgICAgaWYgKCFzb3VyY2VMb2NhbGUuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgbGFuZ3VhZ2UgPSBzb3VyY2VMb2NhbGU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF0YXJnZXRMb2NhbGUuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgLy8gVGhlIHRhcmdldCBsYW5ndWFnZSBpcyB0aGUgcmVhbCBkYXRhLiBUaGUgc291cmNlIGlzIG9ubHkgZm9yIHJlZmVyZW5jZS4KKyAgICAgICAgICAgIC8vIFdlIGNvdWxkIGRvIHZlcmlmaWNhdGlvbiB0aGF0IGFsbCB0aGUgZGF0YSBpcyB0cmFuc2xhdGVkIHRoZSBzYW1lIHRob3VnaC4KKyAgICAgICAgICAgIGxhbmd1YWdlID0gdGFyZ2V0TG9jYWxlOworICAgICAgICB9CisJCQorICAgICAgICAvLyBOb3cgZG8gdGhlIGFjdHVhbCBpbXBvcnQgcmVzb3VyY2UgYnkgcmVzb3VyY2UKKyAgICAgICAgTm9kZUxpc3QgdHVfbGlzdCA9IGJvZHkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImdyb3VwIik7CisgICAgICAgIGludCBib2R5X25vZGVzX2xlbmd0aCA9IGJvZHkuZ2V0Q2hpbGROb2RlcygpLmdldExlbmd0aCgpOworICAgICAgICBOb2RlTGlzdCBib2R5X2xpc3QgPSBib2R5LmdldENoaWxkTm9kZXMoKTsKKyAgICAgICAgaW50IGdyb3VwQ291bnQgPSAwLCBlbGVtZW50Q291bnQgPSAwOworICAgICAgICBOb2RlIGxhc3RfZ3JvdXBfbm9kZSA9IG51bGw7CisgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IGJvZHlfbm9kZXNfbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIE5vZGUgYm9keV9lbGVtID0gYm9keV9saXN0Lml0ZW0oaSk7CisJICAgICAgICBpZiAoYm9keV9lbGVtLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKKwkgICAgICAgICAgICBpZiAoYm9keV9lbGVtLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiZ3JvdXAiKSkgeworCQkgICAgICAgICAgICBncm91cENvdW50Kys7CisJCSAgICAgICAgICAgIGxhc3RfZ3JvdXBfbm9kZSA9IGJvZHlfZWxlbTsKKwkJICAgICAgICB9CisJICAgICAgICAgICAgZWxlbWVudENvdW50Kys7CisJICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVsZW1lbnRDb3VudCA9PSAxICYmIGdyb3VwQ291bnQgPT0gMSkgeworCSAgICAgICAgLy8gSUNVIHN0eWxlIGdyb3VwIHdoZXJlIHRoZSB0b3AgZ3JvdXAgaXMganVzdCB0aGUgbG9jYWxlLgorCSAgICAgICAgRWxlbWVudCBsb2NhbGVOb2RlID0gKEVsZW1lbnQpbGFzdF9ncm91cF9ub2RlOyAKKwkgICAgICAgIHR1X2xpc3QgPSBsYXN0X2dyb3VwX25vZGUuZ2V0Q2hpbGROb2RlcygpOworICAgICAgICAgICAgU3RyaW5nIHJvb3RHcm91cE5hbWUgPSBsb2NhbGVOb2RlLmdldEF0dHJpYnV0ZSgiaWQiKTsKKyAgICAgICAgICAgIGlmIChyb290R3JvdXBOYW1lICE9IG51bGwgJiYgcm9vdEdyb3VwTmFtZS5lcXVhbHMoInJvb3QiKSkgeworICAgICAgICAgICAgICAgIHJvb3RHcm91cE5hbWUgPSAiIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEl0J3MgZG9uZSB0aGlzIHdheSBiZWNhdXNlIElDVSBoYW5kbGVzIHJmYzMwNjZiaXMgKHRoZSBzdWNjZXNzb3Igb2YgcmZjMzA2NikKKyAgICAgICAgICAgIC8vIFhMSUZGIHJlcXVpcmVzIHJmYzMwNjYsIHdoaWNoIGRvZXNuJ3QgaGFuZGxlIHNjcmlwdHMuCisgICAgICAgICAgICBsYW5ndWFnZSA9IHJvb3RHcm91cE5hbWU7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIEFkZCB0aGUgbG9jYWxlIGlmIG5lZWRlZCwgYW5kIG5vcm1hbGl6ZSBpdCB0byB0aGUgY29ycmVjdCBmb3JtYXQuCisgICAgICAgIFZlY3RvciBsb2NhbGVOYW1lcyA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgY2hhciBhcnJheVtdID0gbGFuZ3VhZ2UudG9DaGFyQXJyYXkoKTsKKyAgICAgICAgZm9yIChpbnQgaz0wOyBrIDwgYXJyYXkubGVuZ3RoOyBrKyspIHsKKyAgICAgICAgICAgIGlmIChhcnJheVtrXSA9PSAnLScpCisgICAgICAgICAgICAgICAgYXJyYXlba10gPSAnXyc7CisgICAgICAgIH0KKyAgICAgICAgbGFuZ3VhZ2UgPSBTdHJpbmcudmFsdWVPZihhcnJheSk7CisgICAgICAgIGxvY2FsZU5hbWVzLmFkZChsYW5ndWFnZSk7CisgICAgICAgIHJlc29sdmVFbmNvZGluZ3MobG9jYWxlTmFtZXMpOworICAgICAgICBCdW5kbGUgbWFpbl9idW5kbGUgPSByYm0uZ2V0QnVuZGxlKGxhbmd1YWdlKTsKKwkJbWFpbl9idW5kbGUubmFtZSA9IGJ1bmRsZV9uYW1lOworCQltYWluX2J1bmRsZS5jb21tZW50ID0gYnVuZGxlX25vdGU7CisJCW1haW5fYnVuZGxlLm1hbmFnZXIgPSBtYW5hZ2VyX25hbWU7CisJCW1haW5fYnVuZGxlLmxhbmd1YWdlID0gbGFuZ3VhZ2VfbmFtZTsKKwkJbWFpbl9idW5kbGUuY291bnRyeSA9IGNvdW50cnlfbmFtZTsKKwkJbWFpbl9idW5kbGUudmFyaWFudCA9IHZhcmlhbnRfbmFtZTsKKworICAgICAgICBmb3IgKGludCBpPTA7IGkgPCB0dV9saXN0LmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmICghKHR1X2xpc3QuaXRlbShpKSBpbnN0YW5jZW9mIEVsZW1lbnQpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFbGVtZW50IHR1X2VsZW0gPSAoRWxlbWVudCl0dV9saXN0Lml0ZW0oaSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIEdldCB0aGUga2V5IHZhbHVlCisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHR1X2VsZW0uZ2V0QXR0cmlidXRlKCJpZCIpOworICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLmxlbmd0aCgpIDwgMSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIC8vIEdldCB0aGUgZ3JvdXAgaWYgaXQgZXhpc3RzCisgICAgICAgICAgICBTdHJpbmcgZ3JvdXAgPSBudWxsOworICAgICAgICAgICAgaWYgKHR1X2VsZW0uZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJncm91cCIpKSB7CisgICAgICAgICAgICAgICAgZ3JvdXAgPSBuYW1lOworICAgICAgICAgICAgICAgIFN0cmluZyBncm91cENvbW1lbnQgPSAiIjsKKyAgICAgICAgICAgICAgICBOb2RlTGlzdCBub3Rlc19saXN0ID0gdHVfZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZSgibm90ZSIpOworICAgICAgICAgICAgICAgIGlmIChub3Rlc19saXN0LmdldExlbmd0aCgpID4gMCkgeworICAgIAkgICAgICAgICAgICBUZXh0IHRleHRfZWxlbSA9IChUZXh0KW5vdGVzX2xpc3QuaXRlbSgwKS5nZXRDaGlsZE5vZGVzKCkuaXRlbSgwKTsKKyAgICAJICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gdGV4dF9lbGVtLmdldE5vZGVWYWx1ZSgpOworICAgIAkgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5sZW5ndGgoKSA+IDApIHsKKyAgICAJICAgICAgICAgICAgCWdyb3VwQ29tbWVudCA9IHZhbHVlOworICAgIAkgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJibS5jcmVhdGVHcm91cChncm91cCwgZ3JvdXBDb21tZW50KTsKKyAgICAgICAgICAgICAgICAvL05vZGVMaXN0IGdyb3VwX2xpc3QgPSB0dV9lbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJncm91cCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoZ3JvdXAgPT0gbnVsbCB8fCBncm91cC5sZW5ndGgoKSA8IDEpIHsKKyAgICAgICAgICAgICAgICBncm91cCA9IGdldERlZmF1bHRHcm91cCgpOworICAgICAgICAgICAgICAgIHBhcnNlVHJhbnNsYXRpb25Vbml0KGxhbmd1YWdlLCBncm91cCwgdHVfZWxlbSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIE5vZGVMaXN0IHRyYW5zX3VuaXRfbGlzdCA9IHR1X2VsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRyYW5zLXVuaXQiKTsKKyAgICAgICAgICAgIC8vIEZvciBlYWNoIHRyYW5zLXVuaXQgZWxlbWVudAorICAgICAgICAgICAgZm9yIChpbnQgaj0wOyBqIDwgdHJhbnNfdW5pdF9saXN0LmdldExlbmd0aCgpOyBqKyspIHsKKyAgICAgICAgICAgICAgICBwYXJzZVRyYW5zbGF0aW9uVW5pdChsYW5ndWFnZSwgZ3JvdXAsIChFbGVtZW50KXRyYW5zX3VuaXRfbGlzdC5pdGVtKGopKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwYXJzZVRyYW5zbGF0aW9uVW5pdChTdHJpbmcgbGFuZ3VhZ2UsIFN0cmluZyBncm91cCwgRWxlbWVudCB0cmFuc191bml0X2VsZW0pIHsKKyAgICAgICAgLy8gR2V0IHRoZSB0cmFuc2xhdGlvbiB2YWx1ZQorICAgIAlOb2RlIHRhcmdldF9lbGVtID0gdHJhbnNfdW5pdF9lbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0YXJnZXQiKS5pdGVtKDApOworICAgICAgICBpZiAodGFyZ2V0X2VsZW0gPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHRlbXBsYXRlLCBvciBhIHNrZWxldG9uCisgICAgICAgICAgICB0YXJnZXRfZWxlbSA9IHRyYW5zX3VuaXRfZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikuaXRlbSgwKTsKKyAgICAgICAgfQorICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIHNvdXJjZSBvciB0YXJnZXQsIGV2ZW4gaWYgZW1wdHksIGl0IG11c3QgYmUgcGFyc2VkLgorICAgICAgICBpZiAodGFyZ2V0X2VsZW0gPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgdGFyZ2V0X2VsZW0ubm9ybWFsaXplKCk7CisgICAgICAgIE5vZGVMaXN0IHRleHRfbGlzdCA9IHRhcmdldF9lbGVtLmdldENoaWxkTm9kZXMoKTsKKyAgICAgICAgaWYgKHRleHRfbGlzdC5nZXRMZW5ndGgoKSA8IDEpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIFRleHQgdGV4dF9lbGVtID0gKFRleHQpdGV4dF9saXN0Lml0ZW0oMCk7CisgICAgICAgIFN0cmluZyB0cmFuc1ZhbHVlID0gdGV4dF9lbGVtLmdldE5vZGVWYWx1ZSgpOworICAgICAgICBpZiAodHJhbnNWYWx1ZSA9PSBudWxsIHx8IHRyYW5zVmFsdWUubGVuZ3RoKCkgPCAxKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAvKk5hbWVkTm9kZU1hcCBhdHRyaWJNYXAgPSB0cmFuc191bml0X2VsZW0uZ2V0QXR0cmlidXRlcygpOworICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IGF0dHJpYk1hcC5nZXRMZW5ndGgoKTsgaysrKSB7CisgICAgICAgICAgICBTdHJpbmcgYXR0cmliTWFwTmFtZSA9IGF0dHJpYk1hcC5pdGVtKGspLmdldE5vZGVOYW1lKCk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oYXR0cmliTWFwTmFtZSk7CisgICAgICAgIH0qLworICAgICAgICBTdHJpbmcgbmFtZSA9IHRyYW5zX3VuaXRfZWxlbS5nZXRBdHRyaWJ1dGUoImlkIik7CisgICAgICAgIGlmIChuYW1lID09IG51bGwgfHwgbmFtZS5sZW5ndGgoKSA8IDEpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIC8vIENyZWF0ZSB0aGUgYnVuZGxlIGl0ZW0KKyAgICAgICAgQnVuZGxlSXRlbSBpdGVtID0gbmV3IEJ1bmRsZUl0ZW0obnVsbCwgbmFtZSwgdHJhbnNWYWx1ZSk7CisgICAgICAgIC8vIEdldCBjcmVhdGlvbiwgbW9kaWZpY2F0aW9uIHZhbHVlcworCisgICAgICAgIFN0cmluZyBzdGF0ZSA9IHRyYW5zX3VuaXRfZWxlbS5nZXRBdHRyaWJ1dGUoInN0YXRlIik7CisgICAgICAgIGlmIChzdGF0ZSAhPSBudWxsICYmIHN0YXRlLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgaXRlbS5zZXRUcmFuc2xhdGVkKHN0YXRlLmVxdWFsc0lnbm9yZUNhc2UoInRyYW5zbGF0ZWQiKSk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgZGF0ZSA9IHRyYW5zX3VuaXRfZWxlbS5nZXRBdHRyaWJ1dGUoImRhdGUiKTsKKyAgICAgICAgaWYgKGRhdGUgIT0gbnVsbCAmJiBkYXRlLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgaXRlbS5zZXRNb2RpZmllZERhdGUoZGF0ZSk7CisgICAgICAgIH0KKworICAgICAgICBFbGVtZW50IG5vdGVfZWxlbSA9IChFbGVtZW50KXRyYW5zX3VuaXRfZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZSgibm90ZSIpLml0ZW0oMCk7CisgICAgICAgIGlmIChub3RlX2VsZW0gIT0gbnVsbCkgeworICAgICAgICAgICAgTm9kZUxpc3Qgbm90ZV9saXN0ID0gbm90ZV9lbGVtLmdldENoaWxkTm9kZXMoKTsKKyAgICAgICAgICAgIGlmIChub3RlX2xpc3QuZ2V0TGVuZ3RoKCkgPiAwKSB7CisJICAgICAgICAgICAgVGV4dCBub3RlX3RleHRfZWxlbSA9IChUZXh0KW5vdGVfbGlzdC5pdGVtKDApOworCSAgICAgICAgICAgIFN0cmluZyBjb21tZW50ID0gbm90ZV90ZXh0X2VsZW0uZ2V0Tm9kZVZhbHVlKCk7CisJICAgICAgICAgICAgaWYgKGNvbW1lbnQgIT0gbnVsbCAmJiBjb21tZW50Lmxlbmd0aCgpID4gMCkgeworCSAgICAgICAgICAgIAlpdGVtLnNldENvbW1lbnQoY29tbWVudCk7CisJICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgRWxlbWVudCBwcm9wX2dyb3VwX2VsZW0gPSAoRWxlbWVudCl0cmFuc191bml0X2VsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInByb3AtZ3JvdXAiKS5pdGVtKDApOworICAgICAgICBpZiAocHJvcF9ncm91cF9lbGVtICE9IG51bGwpIHsKKyAgICAgICAgICAgIE5vZGVMaXN0IHByb3BfbGlzdCA9IHByb3BfZ3JvdXBfZWxlbS5nZXRDaGlsZE5vZGVzKCk7CisgICAgICAgIAlpbnQgcHJvcGVydHlMZW4gPSBwcm9wX2xpc3QuZ2V0TGVuZ3RoKCk7CisgICAgICAgICAgICBmb3IgKGludCBwcm9wID0gMDsgcHJvcCA8IHByb3BlcnR5TGVuOyBwcm9wKyspIHsKKyAgICAgICAgICAgIAlpZiAocHJvcF9saXN0Lml0ZW0ocHJvcCkgaW5zdGFuY2VvZiBFbGVtZW50KSB7CisJICAgICAgICAgICAgCUVsZW1lbnQgcHJvcGVydHlfZWxlbSA9IChFbGVtZW50KXByb3BfbGlzdC5pdGVtKHByb3ApOworCSAgICAgICAgICAgIAlTdHJpbmcgcHJvcGVydHlUeXBlID0gcHJvcGVydHlfZWxlbS5nZXRBdHRyaWJ1dGUoInByb3AtdHlwZSIpOworCSAgICAgICAgICAgIAlpZiAocHJvcGVydHlUeXBlICE9IG51bGwpIHsKKwkJCSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHByb3BlcnR5X2VsZW0uZ2V0Q2hpbGROb2RlcygpLml0ZW0oMCkuZ2V0Tm9kZVZhbHVlKCk7CisJCQkgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5sZW5ndGgoKSA+IDApIHsKKwkJCSAgICAgICAgICAgIAlpZiAocHJvcGVydHlUeXBlLmVxdWFscygiY3JlYXRvciIpKSB7CisJCQkJICAgICAgICAgICAgCWl0ZW0uc2V0Q3JlYXRvcih2YWx1ZSk7CisJCQkgICAgICAgICAgICAJfQorCQkJICAgICAgICAgICAgCWVsc2UgaWYgKHByb3BlcnR5VHlwZS5lcXVhbHMoImNyZWF0ZWQiKSkgeworCQkJCSAgICAgICAgICAgIAlpdGVtLnNldENyZWF0ZWREYXRlKHZhbHVlKTsKKwkJCSAgICAgICAgICAgIAl9CisJCQkgICAgICAgICAgICAJZWxzZSBpZiAocHJvcGVydHlUeXBlLmVxdWFscygibW9kaWZpZXIiKSkgeworCQkJCSAgICAgICAgICAgIAlpdGVtLnNldE1vZGlmaWVyKHZhbHVlKTsKKwkJCSAgICAgICAgICAgIAl9CisJCQkgICAgICAgICAgICB9CisJICAgICAgICAgICAgCX0KKyAgICAgICAgICAgIAl9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworLy8gICAgICAgIGlmIChsb29rdXBzICE9IG51bGwpCisvLyAgICAgICAgICAgIGl0ZW0uc2V0TG9va3Vwcyhsb29rdXBzKTsKKyAgICAgICAgaW1wb3J0UmVzb3VyY2UoaXRlbSwgbGFuZ3VhZ2UsIGdyb3VwKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vUmVzb3VyY2VzLmphdmEgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vUmVzb3VyY2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ0OTc2YQotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9SZXNvdXJjZXMuamF2YQpAQCAtMCwwICsxLDI0NiBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDQsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kICAqCisgKiBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitwYWNrYWdlIGNvbS5pYm0ucmJtOworCisKK2ltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0LkphclVSTENvbm5lY3Rpb247CitpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKKworaW1wb3J0IGNvbS5pYm0ucmJtLmd1aS5SQk1hbmFnZXJHVUk7CisKKy8qKgorICogQSBjbGFzcyBub3QgdG8gYmUgaW5zdGFudGlhdGVkLiBQcm92aWRlcyBtZXRob2RzIGZvciB0cmFuc2xhdGluZyBpdGVtcyBmcm9tIGEgcmVzb3VyY2UgYnVuZGxlLiBUbyB1c2UgdGhpcyBjbGFzcworICogbWFrZSBzdXJlIHlvdSBmaXJzdCBjYWxsIGluaXRCdW5kbGUoKS4gT25jZSB0aGlzIGlzIGRvbmUsIGNhbGxpbmcgYW55IG9mIHRoZSBnZXRUcmFuc2xhdGlvbigpIG1ldGhvZHMgd2lsbCByZXR1cm4KKyAqIHRoZSBhcHByb3ByaWF0ZSBTdHJpbmcuCisgKiAKKyAqIEBhdXRob3IgSmFyZWQgSmFja3NvbgorICogQHNlZSBjb20uaWJtLnJibS5SQk1hbmFnZXIKKyAqLworcHVibGljIGNsYXNzIFJlc291cmNlcyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VfYnVuZGxlOworICAgIHByaXZhdGUgc3RhdGljIExvY2FsZSBsb2NhbGU7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIHRoZSBwcm9wZXJ0aWVzIG9mIHRoaXMgcmVzb3VyY2UgYnVuZGxlLiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBvbmNlIGJlZm9yZSBhbnkKKyAgICAgKiBvdGhlciBtZXRob2QgY2FuIGJlIGNhbGxlZCAodW5sZXNzIHRoYXQgbWV0aG9kIHBlcmZvcm1zIGEgY2hlY2sgdGhhdCBjYWxscyB0aGlzIG1ldGhvZCkuIFRoaXMgaXMKKyAgICAgKiBhbHNvIHRoZSBtZXRob2QgdG8gdXNlIGluIGNhc2UgdGhlIHJlc291cmNlIGRhdGEgb24gdGhlIGRhdGEgc3RvcmUgaGFzIGNoYW5nZWQgYW5kIHRob3NlIGNoYW5nZXMKKyAgICAgKiBuZWVkIHRvIGJlIHJlZmxlY3RlZCBpbiBmdXR1cmUgdXNlIG9mIHRoaXMgY2xhc3MuCisgICAgICovCisJCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGluaXRCdW5kbGUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAobG9jYWxlID09IG51bGwpIGxvY2FsZSA9IExvY2FsZS5nZXREZWZhdWx0KCk7CisgICAgICAgICAgICByZXNvdXJjZV9idW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoImNvbS9pYm0vcmJtL3Jlc291cmNlcy9SQk1hbmFnZXIiLCBsb2NhbGUpOworICAgICAgICB9IGNhdGNoKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBtcmUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiTWlzc2luZyBSZXNvdXJjZSBmb3IgZGVmYXVsdCBsb2NhbGUsICIgKyBMb2NhbGUuZ2V0RGVmYXVsdCgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgbXJlLnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGxvY2FsZSB0byBiZSB1c2VkIHdoZW4gbWFraW5nIGEgcXVlcnkgb24gdGhlIHJlc291cmNlCisgICAgICovCisgICAgCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldExvY2FsZShMb2NhbGUgbG9jYWxlKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBSZXNvdXJjZXMubG9jYWxlID0gbG9jYWxlOworICAgICAgICAgICAgUmVzb3VyY2VzLnJlc291cmNlX2J1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgiY29tL2libS9yYm0vcmVzb3VyY2VzL1JCTWFuYWdlciIsIGxvY2FsZSk7CisgICAgICAgIH0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBtcmUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiTWlzc2luZyBSZXNvdXJjZSBmb3IgbG9jYWxlLCAiICsgbG9jYWxlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgbXJlLnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnRseSBzZXQgTG9jYWxlcyBvYmplY3QuCisgICAgICovCisJCisgICAgcHVibGljIHN0YXRpYyBMb2NhbGUgZ2V0TG9jYWxlKCkgeworICAgICAgICBpZiAoUmVzb3VyY2VzLmxvY2FsZSA9PSBudWxsKSBSZXNvdXJjZXMuaW5pdEJ1bmRsZSgpOworICAgICAgICByZXR1cm4gUmVzb3VyY2VzLmxvY2FsZTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBzdHJpbmdzIGNvbnRhaW5pbmcgdGhlIGxvY2FsZSBlbmNvZGluZyAoZS5nLiAnZW5fVVMnLCAnZGUnLCBldGMuKQorICAgICAqIG9mIHRoZSBsb2NhbGVzIGRlZmluZWQgaW4gdGhlIGN1cnJlbnQgcmVzb3VyY2UgYnVuZGxlLiBUaGVzZSBhcmUgYWxsIG9mIHRoZSBsb2NhbGVzIGZvcgorICAgICAqIHdoaWNoIHVuaXF1ZSB0cmFuc2xhdGlvbiBvZiByZXNvdXJjZSBidW5kbGUgaXRlbXMgYXJlIHBvc3NpYmxlLiBJZiBhIGxvY2FsZSBlbmNvZGluZyBpcworICAgICAqIHVzZWQgdG8gcXVlcnkgb24gdGhhdCBpcyBub3QgaW4gdGhpcyBhcnJheSwgdGhlIGJhc2UgY2xhc3MgdHJhbnNsYXRpb24gd2lsbCBiZSByZXR1cm5lZC4KKyAgICAgKi8KKwkKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldEF2YWlsYWJsZUxvY2FsZXMoKSB7CisgICAgICAgIC8vTG9jYWxlIGxvY1tdID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIGxpc3RbXSA9IG5ldyBTdHJpbmdbMF07CisgICAgICAgIFZlY3RvciBsb2NWZWN0ID0gbmV3IFZlY3RvcigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgVVJMIHJlc1VSTCA9IENsYXNzTG9hZGVyLmdldFN5c3RlbVJlc291cmNlKCJjb20vaWJtL3JibS9yZXNvdXJjZXMvUkJNYW5hZ2VyLnByb3BlcnRpZXMiKTsKKyAgICAgICAgICAgIEphclVSTENvbm5lY3Rpb24gcmVzQ29ubmVjdGlvbiA9IChKYXJVUkxDb25uZWN0aW9uKXJlc1VSTC5vcGVuQ29ubmVjdGlvbigpOworICAgICAgICAgICAgRW51bWVyYXRpb24gZW51bVJlcyA9IHJlc0Nvbm5lY3Rpb24uZ2V0SmFyRmlsZSgpLmVudHJpZXMoKTsKKyAgICAgICAgICAgIFN0cmluZyBiYXNlTmFtZSA9ICJjb20vaWJtL3JibS9yZXNvdXJjZXMvUkJNYW5hZ2VyIjsKKyAgICAgICAgICAgIHdoaWxlIChlbnVtUmVzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGVudHJ5TmFtZSA9ICgoWmlwRW50cnkpZW51bVJlcy5uZXh0RWxlbWVudCgpKS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgaWYgKGVudHJ5TmFtZS5zdGFydHNXaXRoKGJhc2VOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICBlbnRyeU5hbWUgPSBlbnRyeU5hbWUuc3Vic3RyaW5nKGJhc2VOYW1lLmxlbmd0aCgpLCBlbnRyeU5hbWUubGFzdEluZGV4T2YoJy4nKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeU5hbWUuc3RhcnRzV2l0aCgiXyIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeU5hbWUgPSBlbnRyeU5hbWUuc3Vic3RyaW5nKDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVudHJ5TmFtZS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBGb3Igb3VyIHJlc291cmNlcyB3ZSBjb25zaWRlciByb290IGFzIEVuZ2xpc2ggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5TmFtZSA9ICJlbiI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbG9jVmVjdC5hZGQoZW50cnlOYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKy8qICAgICAgICAgICAgRmlsZSBsb2NEaXIgPSBuZXcgRmlsZSgicmVzb3VyY2VzIik7CisgICAgICAgICAgICBsaXN0ID0gbG9jRGlyLmxpc3QobmV3IEZpbGVuYW1lRmlsdGVyKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGRpciwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhY2NlcHQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBpZiAoIW5hbWUudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLnByb3BlcnRpZXMiKSkgYWNjZXB0ID0gZmFsc2U7IC8vIE11c3QgYmUgcHJvcGVydHkgZmlsZQorICAgICAgICAgICAgICAgICAgICBpZiAoIW5hbWUuc3RhcnRzV2l0aCgiUkJNYW5hZ2VyIikpIGFjY2VwdCA9IGZhbHNlOyAgICAgICAgICAgICAgIC8vIE11c3QgYmUgYSBSQk1hbmFnZXIgZmlsZQorICAgICAgICAgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoIlJCTWFuYWdlci5wcm9wZXJ0aWVzIikpIGFjY2VwdCA9IGZhbHNlOyAgICAgICAgIC8vIEJhc2UgY2xhc3MgZG9lcyBub3QgY291bnQKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjY2VwdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyovCisgICAgICAgICAgICBpbnQgbGlzdFNpemUgPSBsb2NWZWN0LnNpemUoKTsKKyAgICAgICAgICAgIGxpc3QgPSBuZXcgU3RyaW5nW2xpc3RTaXplXTsKKyAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaSA8IGxpc3RTaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICBsaXN0W2ldID0gKFN0cmluZylsb2NWZWN0LmdldChpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkNhbid0IGdldCByZXNvdXJjZXMiKTsKKyAgICAgICAgICAgIGlvZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBjY2UpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiQ2FuJ3QgZ2V0IHJlc291cmNlcyIpOworICAgICAgICAgICAgY2NlLnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGlzdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb29rcyB1cCBhIHRyYW5zbGF0aW9uIGluIHRoZSBjdXJyZW50bHkgc2V0IExvY2FsZSBieSB0aGUgTkxTIGxvb2t1cCBrZXkgcHJvdmlkZWQuCisgICAgICogSWYgbm8gcmVzb3VyY2UgYnkgdGhhdCBrZXkgaXMgZm91bmQsIHRoZSBrZXkgaXRzZWxmIGlzIHJldHVybmVkLgorICAgICAqLworCQorICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRyYW5zbGF0aW9uKFN0cmluZyBrZXkpIHsKKyAgICAgICAgaWYgKGtleSA9PSBudWxsIHx8IHJlc291cmNlX2J1bmRsZSA9PSBudWxsKSByZXR1cm4gIiI7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmcgcmV0U3RyID0gcmVzb3VyY2VfYnVuZGxlLmdldFN0cmluZyhrZXkpOworICAgICAgICAgICAgcmV0dXJuIHJldFN0cjsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBrZXk7CisgICAgICAgIH0KKyAgICB9CisJCisgICAgLyoqCisgICAgICogR2l2ZW4gYSBsb2NhbGUgZW5jb2RpbmcsIHJldHVybnMgdGhlIGxhbmd1YWdlIHBvcnRpb24gb2YgdGhhdCBlbmNvZGluZy4KKyAgICAgKjxicj4KKyAgICAgKiBGb3IgaW5zdGFuY2UgJ2VuJywgJ2VuX1VTJywgJ2VuX0dCJywgYWxsIHJldHVybiAnZW4nCisgICAgICovCisgICAgICAgIAorICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExhbmd1YWdlKFN0cmluZyBlbmNvZGluZykgeworICAgICAgICBpZiAoZW5jb2RpbmcgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisgICAgICAgIGlmIChlbmNvZGluZy5pbmRleE9mKCJfIikgPCAwKSByZXR1cm4gZW5jb2RpbmcudHJpbSgpOworICAgICAgICByZXR1cm4gZW5jb2Rpbmcuc3Vic3RyaW5nKDAsIGVuY29kaW5nLmluZGV4T2YoIl8iKSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEdpdmVuIGEgbG9jYWxlIGVuY29kaW5nLCByZXR1cm5zIHRoZSBjb3VudHJ5IHBvcnRpb24gb2YgdGhhdCBlbmNvZGluZy4KKyAgICAgKiA8YnI+CisgICAgICogRm9yIGluc3RhbmNlICdlbl9VUycsICdzcF9VUycsIGJvdGggcmV0dXJuICdVUycKKyAgICAgKiA8YnI+CisgICAgICogUmV0dXJucyBudWxsIGlmIG5vIGNvdW50cnkgaXMgc3BlY2lmaWVkIChlLmcuICdlbicgb3IgJ2RlJykKKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb3VudHJ5KFN0cmluZyBlbmNvZGluZykgeworICAgICAgICBpZiAoZW5jb2RpbmcgPT0gbnVsbCkgcmV0dXJuIG51bGw7CisgICAgICAgIGlmIChlbmNvZGluZy5pbmRleE9mKCJfIikgPCAwKSByZXR1cm4gbnVsbDsKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IGVuY29kaW5nLnN1YnN0cmluZyhlbmNvZGluZy5pbmRleE9mKCJfIikrMSwgZW5jb2RpbmcubGVuZ3RoKCkpOworICAgICAgICBpZiAocmVzdWx0LmluZGV4T2YoIl8iKSA8IDApIHJldHVybiByZXN1bHQudHJpbSgpOworICAgICAgICByZXR1cm4gcmVzdWx0LnN1YnN0cmluZygwLCBlbmNvZGluZy5pbmRleE9mKCJfIikpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBHaXZlbiBhIGxvY2FsZSBlbmNvZGluZywgcmV0dXJucyB0aGUgdmFyaWFudCBwb3J0aW9uIG9mIHRoYXQgZW5jb2RpbmcuCisgICAgICogPGJyPgorICAgICAqIEZvciBpbnN0YW5jZSAnZW5fR0JfRVVSTycsICdkZV9ERV9FVVJPJywgYm90aCByZXR1cm4gJ0VVUk8nCisgICAgICogPGJyPgorICAgICAqIFJldHVybnMgbnVsbCBpZiBubyB2YXJpYW50IGlzIHNwZWNpZmllZCAoZS5nLiAnZW4nIG9yICdlbl9VUycpCisgICAgICovCisgICAgCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VmFyaWFudChTdHJpbmcgZW5jb2RpbmcpIHsKKyAgICAgICAgUkJNYW5hZ2VyR1VJLmRlYnVnTXNnKGVuY29kaW5nKTsKKyAgICAgICAgaWYgKGVuY29kaW5nID09IG51bGwpIHJldHVybiBudWxsOworICAgICAgICBpZiAoZW5jb2RpbmcuaW5kZXhPZigiXyIpIDwgMCkgcmV0dXJuIG51bGw7CisgICAgICAgIFN0cmluZyByZXN1bHQgPSBlbmNvZGluZy5zdWJzdHJpbmcoZW5jb2RpbmcuaW5kZXhPZigiXyIpKzEsIGVuY29kaW5nLmxlbmd0aCgpKTsKKyAgICAgICAgaWYgKHJlc3VsdC5pbmRleE9mKCJfIikgPCAwKSByZXR1cm4gbnVsbDsKKyAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnN1YnN0cmluZyhyZXN1bHQuaW5kZXhPZigiXyIpKzEsIHJlc3VsdC5sZW5ndGgoKSk7CisgICAgICAgIHJldHVybiByZXN1bHQudHJpbSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgYSB0cmFuc2xhdGlvbiBnaXZlbiB0aGUgY3VycmVudGx5IHNldCBsb2NhbGUsIGEgbG9va3VwIGtleSwgYW5kIGEgc2luZ2xlIGxvb2t1cCBpdGVtIHJlcGxhY2VtZW50LgorICAgICAqIEZvciBhbiB1bmRlcnN0YW5kaW5nIG9mIHRoZSBsb29rdXAgaXRlbSByZXBsYWNlbWVudCBzZWUgZ2V0VHJhbnNsYXRpb24oU3RyaW5nIGtleSwgU3RyaW5nW10gbG9va3VwKS4KKyAgICAgKi8KKwkKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUcmFuc2xhdGlvbihTdHJpbmcga2V5LCBTdHJpbmcgbG9va3VwKSB7CisgICAgICAgIGlmIChrZXkgPT0gbnVsbCB8fCByZXNvdXJjZV9idW5kbGUgPT0gbnVsbCkgcmV0dXJuICIiOworICAgICAgICB0cnkgeworICAgICAgICAgICAgT2JqZWN0IG9iamVjdHNbXSA9IHtsb29rdXB9OworICAgICAgICAgICAgU3RyaW5nIHJldFN0ciA9IHJlc291cmNlX2J1bmRsZS5nZXRTdHJpbmcoa2V5KTsKKyAgICAgICAgICAgIHJldFN0ciA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KHJldFN0ciwgb2JqZWN0cyk7CisgICAgICAgICAgICByZXR1cm4gcmV0U3RyOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIGtleTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBHZXRzIGEgdHJhbnNsYXRpb24gZ2l2ZW4gdGhlIGN1cnJlbnRseSBzZXQgbG9jYWxlLCBhIGxvb2t1cCBrZXksIGFuZCB6ZXJvIG9yIG1vcmUgbG9va3VwIGl0ZW0gcmVwbGFjZW1lbnRzLgorICAgICAqIExvb2t1cCBpdGVtcyBhcmUgY29udGV4dHVhbCB0cmFuc2xhdGlvbiBtYXRlcmlhbCBzdG9yZWQgaW4gdGhlIHJlc291cmNlIGFjY29yZGluZyB0byB0aGUgZm9ybWF0IGRpY3RhdGVkIGluCisgICAgICogdGhlIGphdmEudGV4dCBwYWNrYWdlLiBJbiBzaG9ydCwgbnVtYmVyZWQgbWFya2VycyBhcmUgcmVwbGFjZWQgYnkgc3RyaW5ncyBwYXNzZWQgaW4gYXMgcGFyYW1ldGVycy4KKyAgICAgKiA8cD4KKyAgICAgKiBGb3IgZXhhbXBsZSwgc3VwcG9zZSB5b3UgaGF2ZSB0aGUgZm9sbG93aW5nIHJlc291cmNlOgorICAgICAqIDxwPgorICAgICAqIG15UmVzb3VyY2UgPSBIZWxsbyB7MX0sIElzbid0IHRoaXMgYSBncmVhdCB7Mn0/CisgICAgICogPHA+CisgICAgICogWW91IHdhbnQgdG8gcmVwbGFjZSB0aGUgJ3sxfScgd2l0aHQgdGhlIGN1cnJlbnQgdXNlciBuYW1lIGFuZCB0aGUgJ3syfScgd2l0aCB0aGUgbmFtZSBvZiB0aGUgZGF5IHRvZGF5LgorICAgICAqIFlvdSBjYW4gZG8gdGhpcyBieSBjYWxsaW5nOgorICAgICAqIDxwPgorICAgICAqIFN0cmluZyBsb29rdXBzW10gPSB7ICJKb2UiLCAiRnJpZGF5IiB9OworICAgICAqIDxicj4KKyAgICAgKiBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm15UmVzb3VyY2UiLCBsb29rdXBzKTsKKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgcmVzdWx0IHdvdWxkIGJlOgorICAgICAqIDxwPgorICAgICAqICdIZWxsbyBKb2UsIElzbid0IHRoaXMgYSBncmVhdCBGcmlkYXk/JworICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIChhcyB3ZWxsIGFzIHRoZSBnZXRUcmFuc2xhdGlvbihTdHJpbmcga2V5LCBTdHJpbmcgbG9va3VwKSBtZXRob2QpIGlzIHVzZWZ1bCBmb3IgdXNpbmcgbmVzdGVkCisgICAgICogbG9va3VwcyBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUuIEZvciBpbnN0YW5jZSwgdGhlIGFib3ZlIGxpbmUgY291bGQgYmUgcmVwbGFjZWQgd2l0aDoKKyAgICAgKiA8cD4KKyAgICAgKiBTdHJpbmcgbG9va3Vwc1tdID0geyBnZXRVc2VyTmFtZSgpLCBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIkZyaWRheSIpIH07CisgICAgICovCisgICAgCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VHJhbnNsYXRpb24oU3RyaW5nIGtleSwgU3RyaW5nW10gbG9va3VwKSB7CisgICAgICAgIGlmIChrZXkgPT0gbnVsbCB8fCByZXNvdXJjZV9idW5kbGUgPT0gbnVsbCkgcmV0dXJuICIiOworICAgICAgICB0cnkgeworICAgICAgICAgICAgT2JqZWN0IG9iamVjdHNbXSA9IG5ldyBPYmplY3RbbG9va3VwLmxlbmd0aF07CisgICAgICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBsb29rdXAubGVuZ3RoOyBpKyspIG9iamVjdHNbaV0gPSBsb29rdXBbaV07CisgICAgICAgICAgICBTdHJpbmcgcmV0U3RyID0gcmVzb3VyY2VfYnVuZGxlLmdldFN0cmluZyhrZXkpOworICAgICAgICAgICAgcmV0U3RyID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQocmV0U3RyLCBsb29rdXApOworICAgICAgICAgICAgcmV0dXJuIHJldFN0cjsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBrZXk7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL1NjYW5SZXN1bHQuamF2YSBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9TY2FuUmVzdWx0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFhMmMwMQotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9TY2FuUmVzdWx0LmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDQsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kICAqCisgKiBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitwYWNrYWdlIGNvbS5pYm0ucmJtOworCisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworLyoqCisgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIHJlc3VsdHMgZm91bmQgZm9yIGVhY2ggcmVzb3VyY2Uga2V5IHdoaWxlCisgKiBwZXJmb3JtaW5nIHRoZSBjb2RlIHNjYW4gZG9uZSBieSBSQlJlcG9ydGVyLgorICogCisgKiBAYXV0aG9yIEphcmVkIEphY2tzb24KKyAqIEBzZWUgY29tLmlibS5yYm0uUkJSZXBvcnRlcgorICovCitwdWJsaWMgY2xhc3MgU2NhblJlc3VsdCB7CisgICAgQnVuZGxlSXRlbSBpdGVtOworICAgIFZlY3RvciBvY2N1cmFuY2VzOworICAgIAorICAgIFNjYW5SZXN1bHQoQnVuZGxlSXRlbSBpdGVtKSB7CisgICAgICAgIHRoaXMuaXRlbSA9IGl0ZW07CisgICAgICAgIG9jY3VyYW5jZXMgPSBuZXcgVmVjdG9yKCk7CisgICAgfQorCQorICAgIEJ1bmRsZUl0ZW0gZ2V0SXRlbSgpIHsKKyAgICAgICAgcmV0dXJuIGl0ZW07CisgICAgfQorCQorICAgIGludCBnZXROdW1iZXJPY2N1cmFuY2VzKCkgeworICAgICAgICByZXR1cm4gb2NjdXJhbmNlcy5zaXplKCk7CisgICAgfQorCQorICAgIFZlY3RvciBnZXRPY2N1cmFuY2VzKCkgeworICAgICAgICByZXR1cm4gb2NjdXJhbmNlczsKKyAgICB9CisJCisgICAgdm9pZCBhZGRPY2N1cmFuY2UoT2NjdXJhbmNlIG8pIHsKKyAgICAgICAgb2NjdXJhbmNlcy5hZGRFbGVtZW50KG8pOworICAgIH0KKwkKKyAgICBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGl0ZW0uZ2V0S2V5KCk7CisgICAgfQorCQorICAgIFN0cmluZyBnZXRHcm91cE5hbWUoKSB7CisgICAgICAgIGlmIChpdGVtLmdldFBhcmVudEdyb3VwKCkgIT0gbnVsbCkgcmV0dXJuIGl0ZW0uZ2V0UGFyZW50R3JvdXAoKS5nZXROYW1lKCk7CisgICAgICAgIHJldHVybiAiVW5rbm93biI7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9jb21waWxlLmJhdCBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9jb21waWxlLmJhdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44NTEyZDU2Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2NvbXBpbGUuYmF0CkBAIC0wLDAgKzEsMjYgQEAKK0BlY2hvIG9mZgorCityZW0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3JlbSAqIENvcHlyaWdodCAoQykgMjAwMC0yMDAyLCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCAgKgorcmVtICogb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCityZW0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworY2QgLi5cLi5cLi5cCitlY2hvIGNvbXBpbGluZyBzb3VyY2UgY29kZSAlMQoramF2YWMgLWQgLiAtY2xhc3NwYXRoIGNvbS9pYm0vcmJtL2xpYi94ZXJjZXMuamFyIC1kZXByZWNhdGlvbiAlMSBjb20vaWJtL3JibS8qLmphdmEgY29tL2libS9yYm0vZ3VpLyouamF2YQoraWYgZXJyb3JsZXZlbCAxIGdvdG8gZXJyb3IKKworZWNobyBjcmVhdGluZyBqYXIgZmlsZQorZXJhc2UgY29tXGlibVxyYm1cUkJNYW5hZ2VyLmphcgoramFyIGNmbSBjb20vaWJtL3JibS9SQk1hbmFnZXIuamFyIGNvbS9pYm0vcmJtL21hbmlmZXN0LnN0dWIgY29tL2libS9yYm0vKi5jbGFzcyBjb20vaWJtL3JibS9ndWkvKi5jbGFzcyBjb20vaWJtL3JibS9ndWkvaW1hZ2VzLyouZ2lmIGNvbS9pYm0vcmJtL3Jlc291cmNlcy9SQk1hbmFnZXIqLnByb3BlcnRpZXMKK2lmIGVycm9ybGV2ZWwgMSBnb3RvIGVycm9yCisKK2VjaG8gY2xlYW5pbmcgdXAgY2xhc3MgZmlsZXMKK2NkIGNvbVxpYm1ccmJtCitlcmFzZSAqLmNsYXNzIGd1aVwqLmNsYXNzCitnb3RvIGVuZAorCis6ZXJyb3IKK2NkIGNvbVxpYm1ccmJtCitwYXVzZQorOmVuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9jb21waWxlLnNoIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2NvbXBpbGUuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzZhODc5OQotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9jb21waWxlLnNoCkBAIC0wLDAgKzEsMTkgQEAKKyMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgICoKKyMgKiBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworY2QgLi4vLi4vLi4vCitlY2hvIGNvbXBpbGluZyBzb3VyY2UgY29kZSAkMQoramF2YWMgLWQgLiAtY2xhc3NwYXRoIGNvbS9pYm0vcmJtL2xpYi94ZXJjZXMuamFyIC1kZXByZWNhdGlvbiAkMSBjb20vaWJtL3JibS8qLmphdmEgY29tL2libS9yYm0vZ3VpLyouamF2YQorI2lmIGVycm9ybGV2ZWwgMSBnb3RvIGVycm9yCisKK2VjaG8gY3JlYXRpbmcgamFyIGZpbGUKK3JtIGNvbS9pYm0vcmJtL1JCTWFuYWdlci5qYXIKK2phciBjZm0gY29tL2libS9yYm0vUkJNYW5hZ2VyLmphciBjb20vaWJtL3JibS9tYW5pZmVzdC5zdHViIGNvbS9pYm0vcmJtLyouY2xhc3MgY29tL2libS9yYm0vZ3VpLyouY2xhc3MgY29tL2libS9yYm0vZ3VpL2ltYWdlcy8qLmdpZiBjb20vaWJtL3JibS9yZXNvdXJjZXMvUkJNYW5hZ2VyKi5wcm9wZXJ0aWVzCisjaWYgZXJyb3JsZXZlbCAxIGdvdG8gZXJyb3IKKworZWNobyBjbGVhbmluZyB1cCBjbGFzcyBmaWxlcworY2QgY29tL2libS9yYm0KK3JtIC1yZiAqLmNsYXNzIGd1aS8qLmNsYXNzCisKZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9jcmVhdGVkb2MuYmF0IGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2NyZWF0ZWRvYy5iYXQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODRhM2NkYgotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9jcmVhdGVkb2MuYmF0CkBAIC0wLDAgKzEsOCBAQAorQHJlbSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQHJlbSAqIENvcHlyaWdodCAoQykgMjAwMC0yMDA0LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCAgKgorQHJlbSAqIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorQHJlbSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorbWtkaXIgZG9jc1xhcGkKK0BzZXQgRE9DX1RZUEU9LXByaXZhdGUKK2phdmFkb2MgLWQgZG9jcy9hcGkgLWNsYXNzcGF0aCBsaWIveGVyY2VzLmphciAtc291cmNlcGF0aCAuLi8uLi8uLi8gLXdpbmRvd1RpdGxlICJSQk1hbmFnZXIiIC1ib3R0b20gIkNvcHlyaWdodCBJQk0gMjAwMC0yMDA0IiAlRE9DX1RZUEUlIGNvbS5pYm0ucmJtIGNvbS5pYm0ucmJtLmd1aQorQGlmIGVycm9ybGV2ZWwgMSBwYXVzZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL1JCUmVwb3J0ZXIuaHRtbCBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL1JCUmVwb3J0ZXIuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTE2MjQzCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvUkJSZXBvcnRlci5odG1sCkBAIC0wLDAgKzEsMjA1IEBACis8SFRNTD48IS0tICNCZWdpblRlbXBsYXRlICIvVGVtcGxhdGVzL01haW5UZW1wbGF0ZS5kd3QiIC0tPgorPEhFQUQ+Cis8IS0tICNCZWdpbkVkaXRhYmxlICJkb2N0aXRsZSIgLS0+IAorPFRJVExFPlJlc291cmNlIEJ1bmRsZSBSZXBvcnRlcjwvVElUTEU+Cis8IS0tICNFbmRFZGl0YWJsZSAtLT4gCis8TUVUQSBIVFRQLUVRVUlWPSJDb250ZW50LVR5cGUiIENPTlRFTlQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzxTVFlMRSBUWVBFPSJURVhUL0NTUyI+Cis8IS0tCisudG9waWNIZWFkIHsgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOyBmb250LXNpemU6IDE0cHQ7IGZvbnQtd2VpZ2h0OiBib2xkOyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiAjMzMzMzMzfQorLnRvcGljTGlzdCB7ICBmb250LWZhbWlseTogR2VvcmdpYSwgIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsgZm9udC1zaXplOiA5cHQ7IGNvbG9yOiAjRkYwMDk5OyBsaXN0LXN0eWxlLWltYWdlOiAgdXJsKGltYWdlcy9kaWFtb25kX2J1bGxldC5naWYpOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IGZvbnQtd2VpZ2h0OiBib2xkfQorLm1haW5CbG9jayB7ICBmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMnB0OyBtYXJnaW4tdG9wOiA1cHg7IG1hcmdpbi1yaWdodDogNXB4OyBtYXJnaW4tYm90dG9tOiA1cHg7IG1hcmdpbi1sZWZ0OiA1cHg7IHBhZGRpbmctdG9wOiA1cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7IHBhZGRpbmctYm90dG9tOiA1cHg7IHBhZGRpbmctbGVmdDogMTBweDsgdGV4dC1hbGlnbjoganVzdGlmeX0KKy0tPgorPC9TVFlMRT4KKzwvSEVBRD4KKworPEJPRFkgQkdDT0xPUj0iI0ZGRkZGRiIgTEVGVE1BUkdJTj0iMCIgVE9QTUFSR0lOPSIwIiBNQVJHSU5XSURUSD0iMCIgTUFSR0lOSEVJR0hUPSIwIj4KKzxUQUJMRSBXSURUSD0iMTAwJSIgQk9SREVSPSIwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjAiPgorICA8VFI+CisgICAgPFREIFJPV1NQQU49IjIiIENPTFNQQU49IjIiIEJBQ0tHUk9VTkQ9ImltYWdlcy90ZW1wbGF0ZV91bC5naWYiIEhFSUdIVD0iNzUiPjxJTUcgU1JDPSJpbWFnZXMvc3BhY2VyLmdpZiIgV0lEVEg9IjI4MCIgSEVJR0hUPSIxIiBIU1BBQ0U9IjAiPjwvVEQ+CisJCTxURCBIRUlHSFQ9IjE1IiAgV0lEVEg9IjEwMCUiIEJBQ0tHUk9VTkQ9ImltYWdlcy90ZW1wbGF0ZV91LmdpZiI+PC9URD4KKwk8L1RSPgorCTxUUj4KKwkJPFREIEhFSUdIVD0iNjAiID4KKwkJCTxDRU5URVI+PElNRyBTUkM9ImltYWdlcy9UaXRsZUxvZ29fdHJhbnNwYXJlbnQuZ2lmIiBWU1BBQ0U9IjAiPjwvQ0VOVEVSPgorCQk8L1REPgorCTwvVFI+CisJPFRSPgorCQkKKyAgICA8VEQgV0lEVEg9IjIwMCIgQkFDS0dST1VORD0iaW1hZ2VzL3RlbXBsYXRlX2wuZ2lmIiBWQUxJR049InRvcCI+CisJCTxUQUJMRSBXSURUSD0iMTgwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjEiPiAKKyAgICAgIAk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljSGVhZCI+R2VuZXJhbDwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBWQUxJR049ImNlbnRlciI+PElNRyBTUkM9ImltYWdlcy90ZW1wbGF0ZV9saW5lLmdpZiI+PC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0xpc3QiPgorCSAgICAgICAgPFVMPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0ic3lzdGVtX3JlcXVpcmVtZW50cy5odG1sIj5TeXN0ZW0gUmVxdWlyZW1lbnRzPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJmYXEuaHRtbCI+RkFRPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJmdXR1cmVfZmVhdHVyZXMuaHRtbCI+RnV0dXJlIFJlbGVhc2VzPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMSSBDTEFTUz0idG9waWNMaXN0Ij48QSBIUkVGPSJmdXR1cmVfZmVhdHVyZXMuaHRtbCI+VmVyc2lvbiAKKyAgICAgICAgICAgICAgICBIaXN0b3J5PC9BPjwvTEk+CisgICAgICAgICAgICA8L1VMPgorCQkJPC9URD4KKwkJPC9UUj4KKyAgICAgIAk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljSGVhZCI+UkIgTWFuYWdlcjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBWQUxJR049ImNlbnRlciI+PElNRyBTUkM9ImltYWdlcy90ZW1wbGF0ZV9saW5lLmdpZiI+PC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0xpc3QiPgorCSAgICAgICAgPFVMPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iaW5kZXguaHRtbCI+SG9tZTwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0idHV0b3JpYWwvaW5kZXguaHRtbCI+VHV0b3JpYWw8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9InZpZXdzL2luZGV4Lmh0bWwiPkZ1bmN0aW9uYWxpdHkgYW5kIFZpZXdzPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJsb29rYW5kZmVlbC5odG1sIj5Mb29rIGFuZCBGZWVsPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJtZW51Lmh0bWwiPk1lbnUgSXRlbXM8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJIENMQVNTPSJ0b3BpY0xpc3QiPjxBIEhSRUY9InR1dG9yaWFsL3N0ZXAxLmh0bWwiPlByZWZlcmVuY2VzPC9BPjwvTEk+CisgICAgICAgICAgICA8L1VMPgorCQkJPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0hlYWQiPlJCIFJlcG9ydGVyPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIFZBTElHTj0iY2VudGVyIj48SU1HIFNSQz0iaW1hZ2VzL3RlbXBsYXRlX2xpbmUuZ2lmIj48L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljTGlzdCI+CisJICA8VUw+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJSQlJlcG9ydGVyLmh0bWwiPkhvbWU8L0E+PC9MST4KKyAgICAgICAgPExJPlJlcG9ydCBUeXBlczwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJzY2FuZmlsZS5odG1sIj5Db2RlIFNjYW5uaW5nPC9BPjwvTEk+CisgICAgICAgICAgICA8L1VMPgorCQkJPC9URD4KKwkJPC9UUj4KKwk8L1RBQkxFPgorCisgICAgICA8UD4mbmJzcDsgPC9QPgorICAgICAgPC9URD4KKwkJCisgICAgPFREIENPTFNQQU49IjIiIFZBTElHTj0idG9wIiBDTEFTUz0ibWFpbkJsb2NrIj48IS0tICNCZWdpbkVkaXRhYmxlICJNYWluIiAtLT4gCisgICAgICA8SDEgQUxJR049IkNFTlRFUiI+UmVzb3VyY2UgQnVuZGxlIFJlcG9ydGVyPC9IMT4KKyAgICAgIDxIMSBBTElHTj0iQ0VOVEVSIj48SU1HIFNSQz0iaW1hZ2VzL3NjcmVlbnNob3RzL1JCUmVwb3J0ZXIuZ2lmIiBXSURUSD0iNjAwIiBIRUlHSFQ9IjYwMCI+PC9IMT4KKyAgICAgIDxINCBBTElHTj0iTEVGVCI+V2hhdCBpcyBSQlJlcG9ydGVyPzwvSDQ+CisgICAgICA8UCBBTElHTj0iTEVGVCI+RnJlcXVlbnRseSwgbWFuYWdlcnMgYW5kIGRldmVsb3BlcnMgd29ya2luZyBvbiBhbiBpbmVybmF0aW9uYWxpemVkIAorICAgICAgICBwcm9kdWN0IHJlcXVlc3QgdGhlIGFiaWxpdHkgdG8gcXVpY2tseSB2aWV3IHRoZSBzdGF0dXMgYW5kIHByb2dyZXNzIG9mIAorICAgICAgICB0aGUgdHJhbnNsYXRpb24gZWZmb3J0cyBpbiB0aGVpciBwcm9qZWN0LiBSQlJlcG9ydGVyIGdlbmVyYXRlcyBzdWNoIHJlcG9ydHMgCisgICAgICAgIG9uIGEgcGVyaW9kaWMgYmFzaXMgYW5kIHN0b3JlcyB0aGVtIHRvIGEgc3BlY2lmaWVkIGxvY2F0aW9uIGluIGEgdmFyaWV0eSAKKyAgICAgICAgb2YgZm9ybWF0cy4gVGhlIGluZm9ybWF0aW9uIGluY2x1ZGVkIGluIHRoZSByZXBvcnRzIGluY2x1ZGVzIHRoZSBuYW1lcyAKKyAgICAgICAgYW5kIG1ldGEgZGF0YSBhc3NvY2lhdGVkIHdpdGggZWFjaCBvZiB0aGUgcmVzb3VyY2UgZmlsZXMsIHRoZSBudW1iZXIgb3IgCisgICAgICAgIHJlc291cmNlcyBoZWxkIGluIGVhY2ggZmlsZSwgdGhlIG51bWJlciBvZiB1bnRyYW5zbGF0ZWQgcmVzb3VyY2VzIGluIGVhY2ggCisgICAgICAgIGZpbGUsIGFuZCwgaWYgdGhlIGRldGFpbCBsZXZlbCBpcyBzZXQgdG8gJ0hpZ2gsJyBhIGxpc3Qgb2YgYWxsIG9mIHRoZSAKKyAgICAgICAgdW50cmFuc2xhdGVkIHJlc291cmNlIGtleXMgZm9yIGVhY2ggZmlsZS48L1A+CisgICAgICA8SDQgQUxJR049IkxFRlQiPkhvdyBpcyBSQlJlcG9ydGVyIHN0YXJ0ZWQ/PC9IND4KKyAgICAgIDxQIEFMSUdOPSJMRUZUIj5Gcm9tIHRoZSBjb21tYW5kIGxpbmUsIFJCUmVwb3J0ZXIgaXMgcnVuIGJ5IHR5cGluZyBpbiB0aGUgCisgICAgICAgIGZvbGxvd2luZyBjb21tYW5kOjwvUD4KKyAgICAgIDxQIEFMSUdOPSJMRUZUIj48Q09ERT5qYXZhIGNvbS5pYm0ucmJtLlJCUmVwb3J0ZXI8L0NPREU+PC9QPgorICAgICAgPFAgQUxJR049IkxFRlQiPlRoaXMgd2lsbCBicmluZyB1cCB0aGUgd2luZG93IHNlZW4gYWJvdmUuIEFsdGVybmF0aXZlbHksIAorICAgICAgICBXaW5kb3dzIHVzZXJzIGNhbiBydW4gdGhlIGJhdGNoIGZpbGUgUkJSZXBvcnRlci5iYXQuIFJCUmVwb3J0ZXIgd2lsbCBhbHNvIAorICAgICAgICB0YWtlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgdGhhdCB3aWxsIHJ1biB0aGUgcHJvZ3JhbSBpbiBhIHZhcmlldHkgb2YgCisgICAgICAgIG1vZGVzLiBBbiBlcXVpdmFsZW50IGNvbW1hbmQgbGluZSBhcmd1bWVudCB0byB0aGUgb25lIGFib3ZlIGlzOjwvUD4KKyAgICAgIDxQIEFMSUdOPSJMRUZUIj48Q09ERT5qYXZhIGNvbS5pYm0ucmJtLlJCUmVwb3J0ZXIgLWd1aTwvQ09ERT48L1A+CisgICAgICA8UCBBTElHTj0iTEVGVCI+VGhpcyBhcmd1bWVudCB3b3JrcyB0aGUgc2FtZSBhcyB0aGUgZmlyc3QsIGJyaW5naW5nIHVwIHRoZSAKKyAgICAgICAgR3JhcGhpY2FsIFVzZXIgSW50ZXJmYWNlLiBUaGlzIGlzIHRoZSBvbmx5IHdheSB0byBzZXQgdGhlIHByb3BlcnRpZXMgb2YgCisgICAgICAgIHRoZSByZXBvcnRlciwgc3VjaCBhcyB0aGUgYnVuZGxlIHRvIHJlcG9ydCBvbiwgdGhlIHR5cGVzIG9mIHJlcG9ydHMgZ2VuZXJhdGVkLCAKKyAgICAgICAgYW5kIHRoZSBpbnRlcnZhbCBiZXR3ZWVuIHJlcG9ydCBnZW5lcmF0aW9uLjwvUD4KKyAgICAgIDxQIEFMSUdOPSJMRUZUIj5Bbm90aGVyIG9wdGlvbiBpcyB0byBydW4gdGhlIHJlcG9ydGVyIHdpdGggdGhlIGZvbGxvd2luZyAKKyAgICAgICAgYXJndW1lbnQ6PC9QPgorICAgICAgPFAgQUxJR049IkxFRlQiPjxDT0RFPmphdmEgY29tLmlibS5yYm0uUkJSZXBvcnRlciAtbm93PC9DT0RFPjwvUD4KKyAgICAgIDxQIEFMSUdOPSJMRUZUIj5XaGVuIHRoZSAtbm93IG9wdGlvbiBpcyB1c2VkLCB0aGUgaW50ZXJ2YWwgc2V0dGluZyBiZXR3ZWVuIAorICAgICAgICByZXBvcnRzIGlzIGlnbm9yZWQsIGFuZCB0aGUgcmVwb3J0cyBhcmUgZ2VuZXJhdGVkIGltbWVkaWF0ZWx5IGFjY29yZGluZyAKKyAgICAgICAgdG8gdGhlIG90aGVyIHNhdmVkIHNldHRpbmdzLiBUaGlzIG9wdGlvbiBkb2VzIG5vdCBicmluZyB1cCB0aGUgd2luZG93IAorICAgICAgICBmb3IgY2hhbmdpbmcgc2V0dGluZ3MuIFVzaW5nIHRoaXMgb3B0aW9uIGlzIGhlbHBmdWwgaWYgeW91IHdvdWxkIGxpa2UgCisgICAgICAgIHRvIHVzZSB5b3Ugb3BlcmF0aW5nIHN5c3RlbSBpbnN0ZWFkIG9mIFJCUmVwb3J0ZXIgdG8gc2NoZWR1bGUgdGhlIGdlbmVyYXRpb24gCisgICAgICAgIG9mIHJlcG9ydHMuPC9QPgorICAgICAgPFAgQUxJR049IkxFRlQiPlRoZSBsYXN0IG9wdGlvbiBpcyB0aGUgZm9sbG93aW5nOjwvUD4KKyAgICAgIDxQIEFMSUdOPSJMRUZUIj48Y29kZT5qYXZhIGNvbS5pYm0ucmJtLlJCUmVwb3J0ZXIgLWxpbmU8L0NPREU+PC9QPgorICAgICAgPFAgQUxJR049IkxFRlQiPldoZW4gdGhpcyBvcHRpb24gaXMgdXNlZCwgdGhlIHJlcG9ydGVyIGlzIHJ1biB0aHJvdWdoIHRoZSAKKyAgICAgICAgY29tbWFuZCBsaW5lIG9ubHkuIE5vbmUgb2YgdGhlIHNldHRpbmdzIHdpbGwgYmUgYWNjZXNzaWJsZSBmb3IgY2hhbmdpbmcuIAorICAgICAgICBXaGVuZXZlciBpdCBpcyB0aW1lIGZvciBhIHJlcG9ydCB0byBiZSBnZW5lcmF0ZWQsIGEgbWVzc2FnZSB3aWxsIGFwcGVhciAKKyAgICAgICAgb24gdGhlIGNvbW1hbmQgbGluZS4gQW5vdGhlciBtZXNzYWdlIHdpbGwgYXBwZWFyIHdoZW4gdGhlIHJlcG9ydHMgaGF2ZSAKKyAgICAgICAgYmVlbiBzdWNjZXNzZnVsbHkgd3JpdHRlbi4gVGhpcyBsYXN0IG1lc3NhZ2Ugd2lsbCBpbmNsdWRlIHRoZSBkYXRlIGFuZCAKKyAgICAgICAgdGltZSBvZiB0aGUgbmV4dCByZXBvcnQgZ2VuZXJhdGlvbi48L1A+CisgICAgICA8SDQgQUxJR049IkxFRlQiPldoYXQgZG8gdGhlIHNldHRpbmdzIG1lYW4/PC9IND4KKyAgICAgIDxQIEFMSUdOPSJMRUZUIj5XaGVuIHRoZSBncmFwaGljYWwgdXNlciBpbnRlcmZhY2UgaXMgaW5pdGlhbGx5IGJyb3VnaHQgdXAsIAorICAgICAgICB0aGUgcmVwb3J0ZXIgbWF5IG5vdCBiZSBhY3RpdmUuIEFuIGluZGljYXRpb24gYXQgdGhlIHRvcCBvZiB0aGUgd2luZG93IAorICAgICAgICBpbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIHJlcG9ydGVyIHdpbGwgcmVwb3J0IGF0IHRoZSB0aW1lIHRoYXQgaGFzIAorICAgICAgICBiZWVuIHNwZWNpZmllZC4gVGhlICdTdGFydGVkJyBtZXNzYWdlIGRvZXMgbm90IGluZGljYXRlIHRoYXQgcmVwb3J0IGdlbmVyYXRpb24gCisgICAgICAgIGhhcyBzdGFydGVkOyBpdCBtZXJlbHkgaW5kaWNhdGVzIHRoYXQgdGhlIHJlcG9ydGVyIGhhcyBzdGFydGVkIGFuZCB3aWxsIAorICAgICAgICBnZW5lcmF0ZSByZXBvcnRzIGFjY29yZGluZyB0byB0aGUgb3RoZXIgc2V0dGluZ3MuIFRvIHRvZ2dsZSB3aGV0aGVyIG9yIAorICAgICAgICBub3QgdGhlIHJlcG9ydGVyIGlzIHJ1bm5pbmcgcHJlc3MgdGhlICdTdGFydCcgb3IgJ1N0b3AnIGJ1dHRvbiBuZWFyIHRoZSAKKyAgICAgICAgdG9wIG9mIHRoZSB3aW5kb3cuIFRvIGdlbmVyYXRlIGEgcmVwb3J0IGltbWVkaWF0ZWx5LCBwcmVzcyB0aGUgJ1VwZGF0ZSAKKyAgICAgICAgTm93JyBidXR0b24uPC9QPgorICAgICAgPFAgQUxJR049IkxFRlQiPlRoZSByZXBvcnQgaW50ZXJ2YWwgZGV0ZXJtaW5lcyB3aGVuIGEgcmVwb3J0IGlzIGdlbmVyYXRlZC4gCisgICAgICAgIFRoZXJlIGFyZSB0d28gbWFpbiBvcHRpb25zIGZvciBkZXRlcm1pbmluZyB0aGUgaW50ZXJ2YWwuIEVpdGhlciBhbiBhbW91bnQgCisgICAgICAgIG9mIHRpbWUgaXMgc3BlY2lmaWVkIHRoYXQgbXVzdCBwYXNzIGluIGJldHdlZW4gcmVwb3J0cywgb3IgYSBzcGVjaWZpYyAKKyAgICAgICAgdGltZSBkdXJpbmcgdGhlIHdlZWsgb3IgZGF5IGlzIHNwZWNpZmllZCBhdCB3aGljaCB0aW1lIHRoZSByZXBvcnQgaXMgZ2VuZXJhdGVkIAorICAgICAgICBpcnJlZ2FyZGxlc3Mgb2Ygd2hlbiB0aGUgbGFzdCByZXBvcnQgd2FzIGdlbmVyYXRlZC48L1A+CisgICAgICA8UCBBTElHTj0iTEVGVCI+VGhlIFJlc291cmNlIEJ1bmRsZSBzZXR0aW5nIGlzIGFuIGluZGljYXRpb24gb2YgdGhlIGJhc2UgCisgICAgICAgIGZpbGUgZnJvbSBjb25jZXJuaW5nIHdoaWNoIHRoZSByZXBvcnQgaXMgZ2VuZXJhdGVkLiBUbyBjaGFuZ2UgdGhlIGJhc2UgCisgICAgICAgIGZpbGUsIGVpdGhlciB0eXBlIGluIHRoZSBuZXcgZmlsZSBwYXRoIHRvIGEgcmVzb3VyY2UgYnVuZGxlLCBvciBzZWxlY3QgCisgICAgICAgIHRoZSAnQ2hvb3NlJyBidXR0b24gaW1tZWRpYXRlbHkgdG8gdGhlIHJpZ2h0IHRvIGJyaW5nIHVwIHRoZSBncmFwaGljYWwgCisgICAgICAgIGZpbGUgY2hvb3Nlci4gVGhlIG91dHB1dCBkaXJlY3RvcnkgaXMgdGhlIGZpbGUgZGlyZWN0b3J5IGludG8gd2hpY2ggdGhlIAorICAgICAgICByZXBvcnRzIGFyZSBzYXZlZC4gTm90ZSB0aGF0IHRoZSByZXBvcnRzIGFyZSBvdmVyd3JpdHRlbiBlYWNoIHRpbWUgdGhleSAKKyAgICAgICAgYXJlIG5ld2x5IGdlbmVyYXRlZC48L1A+CisgICAgICA8UCBBTElHTj0iTEVGVCI+VGhlIG91dHB1dCBmb3JtYXQgaGFzIHRocmVlIG9wdGlvbnMuIEFueSBjb21iaW5hdGlvbiBvZiAKKyAgICAgICAgdGhlc2Ugb3B0aW9ucyBpcyBwZXJtaXNzaWJsZSwgdGhvdWdoIGl0IG1ha2VzIGxpdHRsZSBzZW5zZSB0byB0dXJuIHRoZW0gCisgICAgICAgIGFsbCBvZmYuIFRoZSAnVGV4dCcgZm9ybWF0IHByb2R1Y2VzIGEgc2ltcGxlIHRleHQgZmlsZSBpbiBFbmdsaXNoIHJlcG9ydGluZyAKKyAgICAgICAgb24gdGhlIHN0YXR1cyBvZiBlYWNoIG9mIHRoZSByZXNvdXJjZSBmaWxlcy4gVGhlICdIVE1MJyBmb3JtYXQgcHJvZHVjZXMgCisgICAgICAgIGEgcGFnZSB0aGF0IGlzIHZpZXdhYmxlIGluIGEgd2ViIGJyb3dzZXIuIFRoZSAnWE1MJyBmb3JtYXQgcHJvZHVjZXMgYSAKKyAgICAgICAgd2VsbCBmb3JtZWQgWE1MIHJlcG9ydCB0aGF0IGNhbiBiZSBpbXBvcnRlZCBpbnRvIGEgZGF0YWJhc2UsIHRyYW5zZm9ybWVkIAorICAgICAgICBpbnRvIGFub3RoZXIgZm9ybWF0LCBvciB1c2VkIGluIGEgdmFyaWV0eSBvZiBvdGhlciB3YXlzLjwvUD4KKyAgICAgIDxQIEFMSUdOPSJMRUZUIj5FYWNoIG91dHB1dCBmb3JtYXQgaGFzIGFzc29jaWF0ZWQgd2l0aCBpdCBhIGZpbGUgbmFtZS4gVGhpcyAKKyAgICAgICAgbmFtZSBjYW4gYmUgY2hvc2VuIGFzIGFwcHJvcHJpYXRlIGZvciB0aGUgcHJvamVjdCB0byB3aGljaCB0aGUgYnVuZGxlIAorICAgICAgICBiZWxvbmdzLiBBbHNvLCB0aGVzZSBmaWxlIG5hbWVzIGNhbiBiZSBtb2RpZmllZCBpbiBvcmRlciB0byBwbGFjZSB0aGUgCisgICAgICAgIGZpbGVzIGluIGEgZGlyZWN0b3J5IG90aGVyIHRoYW4gdGhlIG9uZSBzcGVjaWZpZWQgaW4gdGhlIG91dHB1dCBkaXJlY3RvcnkuIAorICAgICAgICBGb3IgaW5zdGFuY2UsIGEgVU5JWCB1c2VyIG1pZ2h0IGNoYW5nZSB0aGUgdGV4dCBmaWxlIG5hbWUgdG8gJy4uLy4uL2xvZy9yZXBvcnQudHh0Jy4gCisgICAgICAgIEEgZGV0YWlsIGxldmVsIGlzIGFsc28gYXNzb2NpYXRlZCB3aXRoIGVhY2ggcmVwb3J0LiBUaGUgJ0hpZ2gnIGRldGFpbCAKKyAgICAgICAgbGV2ZWwgbWVyZWx5IGluY2x1ZGVzIGVhY2ggb2YgdGhlIHJlc291cmNlIGtleXMgdGhhdCBhcmUgdW50cmFuc2xhdGVkIAorICAgICAgICBvciBkdXBsaWNhdGVkIGluc3RlYWQgb2YganVzdCByZXBvcnRpbmcgdGhlIG51bWJlciBvZiBzdWNoIHJlc291cmNlcy48L1A+CisgICAgICA8UCBBTElHTj0iTEVGVCI+VGhlIGxhc3QgYnV0dG9uIHNhdmVzIHRoZSBzZXR0aW5ncyBjdXJyZW50bHkgYmVpbmcgZGlzcGxheWVkIAorICAgICAgICB0byBhIHByZWZlcmVuY2VzIGZpbGUgc28gdGhhdCB0aGVzZSBzZXR0aW5ncyB3aWxsIGJlIGluIHBsYWNlIHRoZSBuZXh0IAorICAgICAgICB0aW1lIHRoZSBwcm9ncmFtIGlzIHJ1bi4gSWYgdGhlIHNldHRpbmdzIGFyZSBub3QgbWVhbnQgdG8gYmUgc2F2ZWQgYXMgCisgICAgICAgIHN1Y2gsIGRvIG5vdCBjbGljayB0aGlzIGJ1dHRvbi4gVGhlIHJlcG9ydGVyIHdpbGwgc3RpbGwgcnVuIGFjY29yZGluZyAKKyAgICAgICAgdG8gdGhlIGRpc3BsYXllZCBzZXR0aW5ncyBhcyBsb25nIGFzIHRoZSBSQlJlcG9ydGVyIHByb2dyYW0gaXMgcnVubmluZy48L1A+CisgICAgICA8SDQgQUxJR049IkxFRlQiPldoYXQgaXMgdGhlIGNvZGUgc2Nhbj88L0g0PgorICAgICAgPFAgQUxJR049IkxFRlQiPlN0YXJ0aW5nIHdpdGggdmVyc2lvbiAwLjNhLCB0aGUgcmVwb3J0ZXIgaW5jbHVkZWQgYSBmdW5jdGlvbiAKKyAgICAgICAgdGhhdCBjYW4gc2NhbiB0ZXh0IGZpbGVzIGxvb2tpbmcgZm9yIGluc3RhbmNlcyBvZiByZXNvdXJjZSBidW5kbGUgdXNhZ2UgCisgICAgICAgIGFuZCBjb21wYXJlIHRob3NlIGluc3RhbmNlcyB3aXRoIHRoZSBzZWxlY3RlZCByZXNvdXJjZSBidW5kbGUuIFRoaXMgc2NhbiAKKyAgICAgICAgY2FuIHRoZW4gcmVwb3J0IG9uIGFueSByZXNvdXJjZSBrZXlzIGNhbGxlZCBvbiBieSBhIHByb2dyYW0gYnV0IG5vdCBleGlzdGluZyAKKyAgICAgICAgaW4gYSByZXNvdXJjZSBidW5kbGUsIGFzIHdlbGwgYXMgcG9pbnQgb3V0IHJlc291cmNlcyBpbiB0aGUgYnVuZGxlIHRoYXQgCisgICAgICAgIGFyZSBwb3RlbnRpYWxseSBub3QgdXNlZCBhdCBhbGwgYnkgdGhlIGNvZGUuPC9QPgorICAgICAgPFAgQUxJR049IkxFRlQiPlRoZSByZXBvcnRlciBpcyB0dXJuZWQgb24gYnkgc2VsZWN0aW5nIHRoZSBjaGVjayBib3ggbmV4dCAKKyAgICAgICAgdG8gdGhlIHRleHQgJ1NjYW4gQ29kZSBGaWxlJyBhbmQgcG9pbnRpbmcgdGhlIHNjYW4gdG8gYSBwcm9wZXJseSBzcGVjaWZpZWQgCisgICAgICAgIHNjYW4gWE1MIGZpbGUuIFRoZSByZXBvcnQgZ2VuZXJhdGVkIGlzIGFwcGVuZGVkIHRvIHRoZSBub3JtYWwgcmVwb3J0cyAKKyAgICAgICAgZ2VuZXJhdGVkIGluIHRleHQsIEhUTUwsIG9yIFhNTC4gVGhlIHJlcG9ydCBpcyBhbHNvIHNlbnNpdGl2ZSB0byB0aGUgZGV0YWlsIAorICAgICAgICBsZXZlbCBzZWxlY3RlZCBmb3IgZWFjaCBvZiB0aGVzZSB0aHJlZSBvdXRwdXQgZm9ybWF0cy48L1A+CisgICAgICA8UCBBTElHTj0iTEVGVCI+VGhlIHNjYW4gWE1MIGZpbGUgcHJvdmlkZXMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gCisgICAgICAgIGZvciB0aGUgY29kZSBzY2FuLiBJbiBpdCBydWxlcyBmb3Igd2hhdCBkaXJlY3RvcmllcyBhbmQgZmlsZXMgdG8gc2NhbiAKKyAgICAgICAgYXJlIHNldCBhcyB3ZWxsIGFzIHdoYXQgdHlwZSBvZiB0ZXh0IGlzIGxvb2tlZCBmb3IgdG8gZmluZCBhIHJlc291cmNlIAorICAgICAgICBrZXkuIE1vcmUgPEEgSFJFRj0ic2NhbmZpbGUuaHRtbCI+ZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gc2V0dGluZyB1cCBhIAorICAgICAgICBzY2FuIFhNTCBmaWxlPC9BPiBjYW4gYmUgZm91bmQgYnkgZm9sbG93aW5nIHRoZSBsaW5rLjwvUD4KKyAgICAgIDxQIEFMSUdOPSJMRUZUIj4mbmJzcDs8L1A+CisgICAgICA8IS0tICNFbmRFZGl0YWJsZSAtLT48L1REPgorCTwvVFI+CisJPFRSPgorCQk8VEQgQkFDS0dST1VORD0iaW1hZ2VzL3RlbXBsYXRlX2xsLmdpZiIgSEVJR0hUPSI0MCIgV0lEVEg9IjIwMCI+CisJCQk8IS0tIENvbW1lbnQgLS0+CisJCTwvVEQ+CisJCTxURCBXSURUSD0iODAiPgorCQkJPCEtLSBDb21tZW50IC0tPgorCQk8L1REPgorCQk8VEQ+CisJCQk8Q0VOVEVSPjxTUEFOIENMQVNTPSJDb3B5cmlnaHQiPkNvcHlyaWdodCAyMDAwLTIwMDEgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcywgQWxsIFJpZ2h0cyBSZXNlcnZlZDwvU1BBTj48L0NFTlRFUj4KKwkJPC9URD4KKwk8L1RSPgorPC9UQUJMRT4KKworPC9CT0RZPgorPCEtLSAjRW5kVGVtcGxhdGUgLS0+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvZmFxLmh0bWwgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9mYXEuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmNiZjI5Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvZmFxLmh0bWwKQEAgLTAsMCArMSwxNTkgQEAKKzxIVE1MPjwhLS0gI0JlZ2luVGVtcGxhdGUgIi9UZW1wbGF0ZXMvTWFpblRlbXBsYXRlLmR3dCIgLS0+Cis8SEVBRD4KKzwhLS0gI0JlZ2luRWRpdGFibGUgImRvY3RpdGxlIiAtLT4gCis8VElUTEU+VGVtcGxhdGU8L1RJVExFPgorPCEtLSAjRW5kRWRpdGFibGUgLS0+IAorPE1FVEEgSFRUUC1FUVVJVj0iQ29udGVudC1UeXBlIiBDT05URU5UPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8U1RZTEUgVFlQRT0iVEVYVC9DU1MiPgorPCEtLQorLnRvcGljSGVhZCB7ICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsgZm9udC1zaXplOiAxNHB0OyBmb250LXdlaWdodDogYm9sZDsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogIzMzMzMzM30KKy50b3BpY0xpc3QgeyAgZm9udC1mYW1pbHk6IEdlb3JnaWEsICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7IGZvbnQtc2l6ZTogOXB0OyBjb2xvcjogI0ZGMDA5OTsgbGlzdC1zdHlsZS1pbWFnZTogIHVybChpbWFnZXMvZGlhbW9uZF9idWxsZXQuZ2lmKTsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyBmb250LXdlaWdodDogYm9sZH0KKy5tYWluQmxvY2sgeyAgZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTJwdDsgbWFyZ2luLXRvcDogNXB4OyBtYXJnaW4tcmlnaHQ6IDVweDsgbWFyZ2luLWJvdHRvbTogNXB4OyBtYXJnaW4tbGVmdDogNXB4OyBwYWRkaW5nLXRvcDogNXB4OyBwYWRkaW5nLXJpZ2h0OiAxMHB4OyBwYWRkaW5nLWJvdHRvbTogNXB4OyBwYWRkaW5nLWxlZnQ6IDEwcHg7IHRleHQtYWxpZ246IGp1c3RpZnl9CistLT4KKzwvU1RZTEU+Cis8L0hFQUQ+CisKKzxCT0RZIEJHQ09MT1I9IiNGRkZGRkYiIExFRlRNQVJHSU49IjAiIFRPUE1BUkdJTj0iMCIgTUFSR0lOV0lEVEg9IjAiIE1BUkdJTkhFSUdIVD0iMCI+Cis8VEFCTEUgV0lEVEg9IjEwMCUiIEJPUkRFUj0iMCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSIwIj4KKyAgPFRSPgorICAgIDxURCBST1dTUEFOPSIyIiBDT0xTUEFOPSIyIiBCQUNLR1JPVU5EPSJpbWFnZXMvdGVtcGxhdGVfdWwuZ2lmIiBIRUlHSFQ9Ijc1Ij48SU1HIFNSQz0iaW1hZ2VzL3NwYWNlci5naWYiIFdJRFRIPSIyODAiIEhFSUdIVD0iMSIgSFNQQUNFPSIwIj48L1REPgorCQk8VEQgSEVJR0hUPSIxNSIgIFdJRFRIPSIxMDAlIiBCQUNLR1JPVU5EPSJpbWFnZXMvdGVtcGxhdGVfdS5naWYiPjwvVEQ+CisJPC9UUj4KKwk8VFI+CisJCTxURCBIRUlHSFQ9IjYwIiA+CisJCQk8Q0VOVEVSPjxJTUcgU1JDPSJpbWFnZXMvVGl0bGVMb2dvX3RyYW5zcGFyZW50LmdpZiIgVlNQQUNFPSIwIj48L0NFTlRFUj4KKwkJPC9URD4KKwk8L1RSPgorCTxUUj4KKwkJCisgICAgPFREIFdJRFRIPSIyMDAiIEJBQ0tHUk9VTkQ9ImltYWdlcy90ZW1wbGF0ZV9sLmdpZiIgVkFMSUdOPSJ0b3AiPgorCQk8VEFCTEUgV0lEVEg9IjE4MCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSIxIj4gCisgICAgICAJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0hlYWQiPkdlbmVyYWw8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgVkFMSUdOPSJjZW50ZXIiPjxJTUcgU1JDPSJpbWFnZXMvdGVtcGxhdGVfbGluZS5naWYiPjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNMaXN0Ij4KKwkgICAgICAgIDxVTD4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9InN5c3RlbV9yZXF1aXJlbWVudHMuaHRtbCI+U3lzdGVtIFJlcXVpcmVtZW50czwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iZmFxLmh0bWwiPkZBUTwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iZnV0dXJlX2ZlYXR1cmVzLmh0bWwiPkZ1dHVyZSBSZWxlYXNlczwvQT48L0xJPgorICAgICAgICAgICAgICA8TEkgQ0xBU1M9InRvcGljTGlzdCI+PEEgSFJFRj0iZnV0dXJlX2ZlYXR1cmVzLmh0bWwiPlZlcnNpb24gCisgICAgICAgICAgICAgICAgSGlzdG9yeTwvQT48L0xJPgorICAgICAgICAgICAgPC9VTD4KKwkJCTwvVEQ+CisJCTwvVFI+CisgICAgICAJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0hlYWQiPlJCIE1hbmFnZXI8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgVkFMSUdOPSJjZW50ZXIiPjxJTUcgU1JDPSJpbWFnZXMvdGVtcGxhdGVfbGluZS5naWYiPjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNMaXN0Ij4KKwkgICAgICAgIDxVTD4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9ImluZGV4Lmh0bWwiPkhvbWU8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9InR1dG9yaWFsL2luZGV4Lmh0bWwiPlR1dG9yaWFsPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJ2aWV3cy9pbmRleC5odG1sIj5GdW5jdGlvbmFsaXR5IGFuZCBWaWV3czwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0ibG9va2FuZGZlZWwuaHRtbCI+TG9vayBhbmQgRmVlbDwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0ibWVudS5odG1sIj5NZW51IEl0ZW1zPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMSSBDTEFTUz0idG9waWNMaXN0Ij48QSBIUkVGPSJ0dXRvcmlhbC9zdGVwMS5odG1sIj5QcmVmZXJlbmNlczwvQT48L0xJPgorICAgICAgICAgICAgPC9VTD4KKwkJCTwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNIZWFkIj5SQiBSZXBvcnRlcjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBWQUxJR049ImNlbnRlciI+PElNRyBTUkM9ImltYWdlcy90ZW1wbGF0ZV9saW5lLmdpZiI+PC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0xpc3QiPgorCSAgPFVMPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iUkJSZXBvcnRlci5odG1sIj5Ib21lPC9BPjwvTEk+CisgICAgICAgIDxMST5SZXBvcnQgVHlwZXM8L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0ic2NhbmZpbGUuaHRtbCI+Q29kZSBTY2FubmluZzwvQT48L0xJPgorICAgICAgICAgICAgPC9VTD4KKwkJCTwvVEQ+CisJCTwvVFI+CisJPC9UQUJMRT4KKworICAgICAgPFA+Jm5ic3A7IDwvUD4KKyAgICAgIDwvVEQ+CisJCQorICAgIDxURCBDT0xTUEFOPSIyIiBWQUxJR049InRvcCIgQ0xBU1M9Im1haW5CbG9jayI+PCEtLSAjQmVnaW5FZGl0YWJsZSAiTWFpbiIgLS0+IAorICAgICAgPEgzIEFMSUdOPSJDRU5URVIiPkZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zPC9IMz4KKyAgICAgIDxQPjxCPiBXaGF0IGlzIHRoZSBhZHZhbnRhZ2Ugb2YgdXNpbmcgUkIgTWFuYWdlciB3aGVuIEkgY2FuIGVkaXQgcmVzb3VyY2UgCisgICAgICAgIGJ1bmRsZSBwcm9wZXJ0eSBmaWxlcyBpbiBhIHNpbXBsZSB0ZXh0IGVkaXRvcj88L0I+PC9QPgorICAgICAgPFA+VHJ5aW5nIHRvIG1hbmFnZSBpbnRlcm5hdGlvbmFsaXphdGlvbiBlZmZvcnRzIGluIGFueXRoaW5nIGJ1dCB0aGUgc21hbGxlc3QgCisgICAgICAgIG9mIHByb2plY3RzIGNhbiBiZSBhIGRpZmZpY3VsdCBhbmQgdGltZSBjb25zdW1pbmcgdGFzay4gSW4gZmFjdCwgUkIgTWFuYWdlciAKKyAgICAgICAgYXMgYSBwcm9qZWN0IGdyZXcgb3V0IG9mIHRoZSBmcnVzdHJhdGlvbnMgYW5kIGVycm9ycyB0aGF0IGRldmVsb3BlZCBhcyAKKyAgICAgICAgdGhlIHJlc3VsdCBvZiB0cnlpbmcgdG8gbWFpbnRhaW4gbXVsdGlwbGUgbGFuZ3VhZ2Ugc3VwcG9ydCBpbiBhIG1vZGVyYXRlbHkgCisgICAgICAgIGxhcmdlIHByb2plY3QuIFJlbHlpbmcgb24gdGV4dCBlZGl0b3JzIGFuZCB0aGUgbGlrZSBkZWNyZWFzZXMgdGhlIGNoYW5jZSAKKyAgICAgICAgdGhhdCBkZXZlbG9wZXJzIHdpbGwgcHJvcGVybHkgY29tbWVudCBlYWNoIGFzcGVjdCBvZiBlYWNoIHRyYW5zbGF0aW9uLCAKKyAgICAgICAgaW5jcmVhc2VzIHRoZSBjaGFuY2UgdGhhdCBlcnJvcnMgc3VjaCBhcyBkdXBsaWNhdGUga2V5IG5hbWVzIGFuZCBpbmNvbnNpc3RlbmNpZXMgCisgICAgICAgIGFjcm9zcyBsYW5ndWFnZSBmaWxlcywgYW5kIGluY3JlYXNlcyB0aGUgYW1vdW50IG9mIHRpbWUgZGV2ZWxvcGVycyBhbmQgCisgICAgICAgIHRyYW5zbGF0b3JzIGhhdmUgdG8gc3BlbmQgdHJhY2tpbmcgZG93biBpbmNvbnNpc3RlbmNpZXMgYW5kIHVudHJhbnNsYXRlZCAKKyAgICAgICAgcmVzb3VyY2VzLjwvUD4KKyAgICAgIDxQPlJCTWFuYWdlciBvZmZlcnMgdGhlIGZvbGxvd2luZyBmZWF0dXJlcyB0byBjb3JyZWN0IHRoZXNlIHByb2JsZW1zOjwvUD4KKyAgICAgIDxQPiAKKyAgICAgICAgPFVMPgorICAgICAgICAgIAorICAgICAgICA8TEk+IFJCIE1hbmFnZXIgY2FuIGVkaXQgbXVsdGlwbGUgbGFuZ3VhZ2UgZmlsZXMgd2hlbiBhcHByb3ByaWF0ZTwvTEk+CisgICAgICAgICAgPExJPkVudHJpZXMgYXJlIGNoZWNrZWQgZm9yIHByb3BlciBmb3JtYXQgYW5kIGFzc3VyZWQgbm90IHRvIGJlIGR1cGxpY2F0ZXM8L0xJPgorICAgICAgICAgIAorICAgICAgICA8TEk+UkIgTWFuYWdlciBwcm92aWRlcyBhIGJldHRlciBncm91cGluZyBvZiByZXNvdXJjZXMsIHNvIHRoYXQgaW5kaXZpZHVhbCAKKyAgICAgICAgICB0cmFuc2xhdGlvbnMgYXJlIGVhc3kgdG8gZmluZDwvTEk+CisgICAgICAgICAgPExJPkVhY2ggbGFuZ3VhZ2UgZmlsZSB3aWxsIGRpc3BsYXkgaW4gaXRzIG93biB2aWV3IGEgbGlzdCBvZiBvbmx5IHJlc291cmNlcyAKKyAgICAgICAgICAgIHRoYXQgYXJlIHVudHJhbnNsYXRlZDwvTEk+CisgICAgICAgICAgCisgICAgICAgIDxMST5SQiBNYW5hZ2VyIGtlZXBzIHRyYWNrIG9mIHN0YXRpc3RpY3Mgc3VjaCBhcyBudW1iZXIgb2YgcmVzb3VyY2VzLCAKKyAgICAgICAgICB1bnRyYW5zbGF0ZWQgaXRlbXMsIGV0Yy48L0xJPgorICAgICAgICAgIAorICAgICAgICA8TEk+UkIgTWFuYWdlciBhbGxvd3MgaW1wb3J0aW5nIGFuZCBleHBvcnRpbmcgb2YgdHJhbnNsYXRpb24gZGF0YSBpbnRvIAorICAgICAgICAgIG11bHRpcGxlIGZvcm1hdHM8L0xJPgorICAgICAgICAgIDxMST5Vc2Ugb2YgdGhlIGFwcGxpY2F0aW9uIGN1dHMgZG93biBvbiBkZXZlbG9wbWVudCwgdHJhbnNsYXRpb24sIGFuZCAKKyAgICAgICAgICAgIGRlYnVnZ2luZyB0aW1lIGluIGFueSBpbnRlcm5hdGlvbmFsaXplZCBzZXR0aW5nPC9MST4KKyAgICAgICAgPC9VTD4KKyAgICAgICAgCisgICAgICA8UD48Qj5XaWxsIFJCIE1hbmFnZXIgd29yayBvbiBteSBjb21wdXRlcj88L0I+PC9QPgorICAgICAgICAKKyAgICAgIDxQPlJCIE1hbmFnZXIgaXMgd3JpdHRlbiB1c2luZyBvbmx5IHRoZSBKYXZhIEFQSS4gSXQgaGFzIGJlZW4gdGVzdGVkIHVuZGVyIAorICAgICAgICB0aGUgSmF2YSAxLjIuMiBydW50aW1lIGVudmlyb25tZW50IGFuZCBoaWdoZXIuIElmIHlvdXIgY29tcHV0ZXIgaGFzIGEgCisgICAgICAgIEphdmEgVmlydHVhbCBNYWNoaW5lIChKVk0pIGluIHRoaXMgZW52aXJvbm1lbnQsIFJCTWFuYWdlciBzaG91bGQgd29yayAKKyAgICAgICAgZm9yIHlvdS4gSW5zdHJ1Y3Rpb25zIGZvciBzZXR0aW5nIHVwIGFuZCBydW5uaW5nIHRoZSBwcm9ncmFtIGFyZSBmb3VuZCAKKyAgICAgICAgaW4gPEEgSFJFRj0idHV0b3JpYWwvc3RlcDEuaHRtbCI+U3RlcCAxPC9BPiBvZiB0aGUgdHV0b3JpYWwuPC9QPgorICAgICAgICAKKyAgICAgIDxQPjxCPldoeSBkb2Vzbid0IFJCIE1hbmFnZXIgcnVuIGluIGxhbmd1YWdlIFg/PC9CPjwvUD4KKyAgICAgIDxQPjwvUD4KKyAgICAgIDxQPlJCIE1hbmFnZXIgd2lsbCBhbGxvdyB5b3UgdG8gZWRpdCBsYW5ndWFnZSBmaWxlcyBmb3IgYW55IGxhbmd1YWdlL2NvdW50cnkvdmFyaWFudCAKKyAgICAgICAgZW5jb2RpbmcuIFRvIGRlbW9uc3RyYXRlIHRoZSB1c2VmdWxuZXNzIG9mIGludGVybmF0aW9uYWxpemF0aW9uLCBSQiBNYW5hZ2VyIAorICAgICAgICBoYXMgaXRzIG93biByZXNvdXJjZSBidW5kbGUuIFRoZSBhcHBsaWNhdGlvbiBjYW4gY3VycmVudGx5IGJlIHJ1biBpbiBFbmdsaXNoLCAKKyAgICAgICAgR2VybWFuLCBTd2VkaXNoLCBhbmQgRmlubmlzaC4gWW91IGFyZSB3ZWxjb21lIHRvIHVzZSB0aGUgcHJvZ3JhbSB0byBlZGl0IAorICAgICAgICBpdHMgb3duIHJlc291cmNlIGJ1bmRsZSBhbmQgYWRkIGFueSBvdGhlciBsYW5ndWFnZS4gSWYgeW91IGRvIHNvLCB5b3UgCisgICAgICAgIG1heSBzdWJtaXQgdGhlIG5ldyBsYW5ndWFnZSBmaWxlIHRvIHRoZQorICAgICAgICA8QSBIUkVGPSJodHRwOi8vd3d3Lmp0Y3N2LmNvbS9jZ2liaW4vaWN1LWJ1Z3MvIj5JQ1UgYnVnIGRhdGFiYXNlPC9BPi4gCisgICAgICAgIEVhY2ggc3VibWlzc2lvbiB3aWxsIGJlIGNvbnNpZGVyZWQgZm9yIGZ1dHVyZSBzdWJtaXNzaW9ucywgYnV0IHRoZSBzdWJtaXR0b3IgCisgICAgICAgIG11c3QgZ2l2ZSB0aGUgcmlnaHRzIHRvIHRoZSB0cmFuc2xhdGlvbiB0byBJQk0gaWYgdGhlIGZpbGUgaXMgdG8gYmUgaW5jbHVkZWQuPC9QPgorICAgICAgPFA+PEI+SSBmb3VuZCBhIGJ1Zy4gV2hlcmUgZG8gSSByZXBvcnQgaXQ/PC9CPjwvUD4KKyAgICAgIDxQPlBsZWFzZSBzdWJtaXQgYSBidWcgdG8gdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuanRjc3YuY29tL2NnaWJpbi9pY3UtYnVncy8iPklDVSBidWcgZGF0YWJhc2U8L2E+LjwvUD4KKyAgICAgIDxQPjxCPldoYXQgY2FuIEkgZXhwZWN0IGZyb20gZnV0dXJlIHZlcnNpb25zIG9mIFJCIE1hbmFnZXI/PC9CPjwvUD4KKyAgICAgIDxQPjxBIEhSRUY9ImZ1dHVyZV9mZWF0dXJlcy5odG1sIj5BbnN3ZXI8L0E+PC9QPgorICAgICAgPCEtLSAjRW5kRWRpdGFibGUgLS0+PC9URD4KKwk8L1RSPgorCTxUUj4KKwkJPFREIEJBQ0tHUk9VTkQ9ImltYWdlcy90ZW1wbGF0ZV9sbC5naWYiIEhFSUdIVD0iNDAiIFdJRFRIPSIyMDAiPgorCQkJPCEtLSBDb21tZW50IC0tPgorCQk8L1REPgorCQk8VEQgV0lEVEg9IjgwIj4KKwkJCTwhLS0gQ29tbWVudCAtLT4KKwkJPC9URD4KKwkJPFREPgorCQkJPENFTlRFUj48U1BBTiBDTEFTUz0iQ29weXJpZ2h0Ij5Db3B5cmlnaHQgMjAwMC0yMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMsIEFsbCBSaWdodHMgUmVzZXJ2ZWQ8L1NQQU4+PC9DRU5URVI+CisJCTwvVEQ+CisJPC9UUj4KKzwvVEFCTEU+Cis8L0JPRFk+Cis8IS0tICNFbmRUZW1wbGF0ZSAtLT48L0hUTUw+CmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9mdXR1cmVfZmVhdHVyZXMuaHRtbCBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2Z1dHVyZV9mZWF0dXJlcy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3Y2U4ZjAKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9mdXR1cmVfZmVhdHVyZXMuaHRtbApAQCAtMCwwICsxLDE2MyBAQAorPEhUTUw+PCEtLSAjQmVnaW5UZW1wbGF0ZSAiL1RlbXBsYXRlcy9NYWluVGVtcGxhdGUuZHd0IiAtLT4KKzxIRUFEPgorPCEtLSAjQmVnaW5FZGl0YWJsZSAiZG9jdGl0bGUiIC0tPiAKKzxUSVRMRT5SQiBNYW5hZ2VyIC0gRmVhdHVyZXMgYW5kIFZlcnNpb24gSGlzdG9yeTwvVElUTEU+Cis8IS0tICNFbmRFZGl0YWJsZSAtLT4gCis8TUVUQSBIVFRQLUVRVUlWPSJDb250ZW50LVR5cGUiIENPTlRFTlQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzxTVFlMRSBUWVBFPSJURVhUL0NTUyI+Cis8IS0tCisudG9waWNIZWFkIHsgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOyBmb250LXNpemU6IDE0cHQ7IGZvbnQtd2VpZ2h0OiBib2xkOyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiAjMzMzMzMzfQorLnRvcGljTGlzdCB7ICBmb250LWZhbWlseTogR2VvcmdpYSwgIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsgZm9udC1zaXplOiA5cHQ7IGNvbG9yOiAjRkYwMDk5OyBsaXN0LXN0eWxlLWltYWdlOiAgdXJsKGltYWdlcy9kaWFtb25kX2J1bGxldC5naWYpOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IGZvbnQtd2VpZ2h0OiBib2xkfQorLm1haW5CbG9jayB7ICBmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMnB0OyBtYXJnaW4tdG9wOiA1cHg7IG1hcmdpbi1yaWdodDogNXB4OyBtYXJnaW4tYm90dG9tOiA1cHg7IG1hcmdpbi1sZWZ0OiA1cHg7IHBhZGRpbmctdG9wOiA1cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7IHBhZGRpbmctYm90dG9tOiA1cHg7IHBhZGRpbmctbGVmdDogMTBweDsgdGV4dC1hbGlnbjoganVzdGlmeX0KKy0tPgorPC9TVFlMRT4KKzwvSEVBRD4KKworPEJPRFkgQkdDT0xPUj0iI0ZGRkZGRiIgTEVGVE1BUkdJTj0iMCIgVE9QTUFSR0lOPSIwIiBNQVJHSU5XSURUSD0iMCIgTUFSR0lOSEVJR0hUPSIwIj4KKzxUQUJMRSBXSURUSD0iMTAwJSIgQk9SREVSPSIwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjAiPgorICA8VFI+CisgICAgPFREIFJPV1NQQU49IjIiIENPTFNQQU49IjIiIEJBQ0tHUk9VTkQ9ImltYWdlcy90ZW1wbGF0ZV91bC5naWYiIEhFSUdIVD0iNzUiPjxJTUcgU1JDPSJpbWFnZXMvc3BhY2VyLmdpZiIgV0lEVEg9IjI4MCIgSEVJR0hUPSIxIiBIU1BBQ0U9IjAiPjwvVEQ+CisJCTxURCBIRUlHSFQ9IjE1IiAgV0lEVEg9IjEwMCUiIEJBQ0tHUk9VTkQ9ImltYWdlcy90ZW1wbGF0ZV91LmdpZiI+PC9URD4KKwk8L1RSPgorCTxUUj4KKwkJPFREIEhFSUdIVD0iNjAiID4KKwkJCTxDRU5URVI+PElNRyBTUkM9ImltYWdlcy9UaXRsZUxvZ29fdHJhbnNwYXJlbnQuZ2lmIiBWU1BBQ0U9IjAiPjwvQ0VOVEVSPgorCQk8L1REPgorCTwvVFI+CisJPFRSPgorCQkKKyAgICA8VEQgV0lEVEg9IjIwMCIgQkFDS0dST1VORD0iaW1hZ2VzL3RlbXBsYXRlX2wuZ2lmIiBWQUxJR049InRvcCI+CisJCTxUQUJMRSBXSURUSD0iMTgwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjEiPiAKKyAgICAgIAk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljSGVhZCI+R2VuZXJhbDwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBWQUxJR049ImNlbnRlciI+PElNRyBTUkM9ImltYWdlcy90ZW1wbGF0ZV9saW5lLmdpZiI+PC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0xpc3QiPgorCSAgICAgICAgPFVMPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0ic3lzdGVtX3JlcXVpcmVtZW50cy5odG1sIj5TeXN0ZW0gUmVxdWlyZW1lbnRzPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJmYXEuaHRtbCI+RkFRPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJmdXR1cmVfZmVhdHVyZXMuaHRtbCI+RnV0dXJlIFJlbGVhc2VzPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMSSBDTEFTUz0idG9waWNMaXN0Ij48QSBIUkVGPSJmdXR1cmVfZmVhdHVyZXMuaHRtbCI+VmVyc2lvbiAKKyAgICAgICAgICAgICAgICBIaXN0b3J5PC9BPjwvTEk+CisgICAgICAgICAgICA8L1VMPgorCQkJPC9URD4KKwkJPC9UUj4KKyAgICAgIAk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljSGVhZCI+UkIgTWFuYWdlcjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBWQUxJR049ImNlbnRlciI+PElNRyBTUkM9ImltYWdlcy90ZW1wbGF0ZV9saW5lLmdpZiI+PC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0xpc3QiPgorCSAgICAgICAgPFVMPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iaW5kZXguaHRtbCI+SG9tZTwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0idHV0b3JpYWwvaW5kZXguaHRtbCI+VHV0b3JpYWw8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9InZpZXdzL2luZGV4Lmh0bWwiPkZ1bmN0aW9uYWxpdHkgYW5kIFZpZXdzPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJsb29rYW5kZmVlbC5odG1sIj5Mb29rIGFuZCBGZWVsPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJtZW51Lmh0bWwiPk1lbnUgSXRlbXM8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJIENMQVNTPSJ0b3BpY0xpc3QiPjxBIEhSRUY9InR1dG9yaWFsL3N0ZXAxLmh0bWwiPlByZWZlcmVuY2VzPC9BPjwvTEk+CisgICAgICAgICAgICA8L1VMPgorCQkJPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0hlYWQiPlJCIFJlcG9ydGVyPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIFZBTElHTj0iY2VudGVyIj48SU1HIFNSQz0iaW1hZ2VzL3RlbXBsYXRlX2xpbmUuZ2lmIj48L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljTGlzdCI+CisJICAgIDxVTD4KKyAgICAgICAgICAgIDxMST48QSBIUkVGPSJSQlJlcG9ydGVyLmh0bWwiPkhvbWU8L0E+PC9MST4KKyAgICAgICAgICAgIDxMST5SZXBvcnQgVHlwZXM8L0xJPgorICAgICAgICAgICAgPExJPjxBIEhSRUY9InNjYW5maWxlLmh0bWwiPkNvZGUgU2Nhbm5pbmc8L0E+PC9MST4KKyAgICAgICAgPC9VTD4KKwkJCTwvVEQ+CisJCTwvVFI+CisJPC9UQUJMRT4KKworICAgICAgPFA+Jm5ic3A7IDwvUD4KKyAgICAgIDwvVEQ+CisJCQorICAgIDxURCBDT0xTUEFOPSIyIiBWQUxJR049InRvcCIgQ0xBU1M9Im1haW5CbG9jayI+PCEtLSAjQmVnaW5FZGl0YWJsZSAiTWFpbiIgLS0+IAorICAgICAgPEgzIEFMSUdOPSJDRU5URVIiPkZ1dHVyZSBGZWF0dXJlcyBhbmQgVmVyc2lvbiBIaXN0b3J5PC9IMz4KKyAgICAgIDxQPlNvbWUgb2YgdGhlIGZlYXR1cmVzIGFsbCByZWFkeSBpbiB0aGUgd29ya3MgZm9yIGZ1dHVyZSB2ZXJzaW9ucyBvZiBSQiAKKyAgICAgICAgTWFuYWdlcjo8L1A+CisgICAgICA8VUw+CisgICAgICAgIDxMST5UaGUgYWJpbGl0eSB0byBsb29rdXAgc3VnZ2VzdGVkIHRyYW5zbGF0aW9ucyB1c2luZyBpbXBvcnRlZCBkaWN0aW9uYXJpZXM8L0xJPgorICAgICAgICA8TEk+TXVsdGlwbGUgc2VsZWN0aW9ucyBhY3Jvc3MgcmVzb3VyY2UgdGFibGVzPC9MST4KKyAgICAgICAgPExJPkVkaXRpbmcgc3VidHJlZXMgd2l0aGluIHRoZSByZXNvdXJjZSBidW5kbGUgdHJlZTwvTEk+CisgICAgICAgIDxMST5UaGUgYWJpbGl0eSB0byBwcmludCB2YXJpb3VzIHZpZXdzIG9mIHJlc291cmNlczwvTEk+CisgICAgICAgIDxMST5BIGNoYXJhY3RlciB0YWJsZSBmb3Igc2VsZWN0aW5nIGNoYXJhY3RlcnMgbm90IGNvbW1vbiB0byBrZXlib2FyZHM8L0xJPgorICAgICAgICA8TEk+Li4uYW5kIG9mIGNvdXJzZSBhbGwgb2YgdGhlIGJ1ZyBmaXhlczwvTEk+CisgICAgICA8L1VMPgorICAgICAgCisgICAgICA8cD5GZWF0dXJlcyBhZGRlZCBpbiB0aGUgbGF0ZXN0IHZlcnNpb24gKDAuNykgb2YgUkIgTWFuYWdlcjo8L3A+CisgICAgICAgIAorICAgICAgPHVsPgorICAgICAgICA8bGk+QWRkIGluaXRpYWwgc3VwcG9ydCBmb3IgaW1wb3J0aW5nIGFuZCBleHBvcnRpbmcgWExJRkYgZmlsZXM8L2xpPgorICAgICAgICA8bGk+Rml4IHNvbWUgcGFuZWwgdXBkYXRpbmcgaXNzdWVzPC9saT4KKyAgICAgICAgPGxpPi4uLiBhbmQgc29tZSBvdGhlciBidWcgZml4ZXM8L2xpPgorICAgICAgPC91bD4KKworICAgICAgPFA+RmVhdHVyZXMgYWRkZWQgaW4gdGhlIGxhdGVzdCB2ZXJzaW9uICgwLjYpIG9mIFJCIE1hbmFnZXI6PC9QPgorICAgICAgICAKKyAgICAgIDxVTD4KKyAgICAgICAgPExJPlRoZSBwcm9ncmFtIHdpbmRvdyBub3cgaGFzIGFuIGljb248L0xJPgorICAgICAgICA8TEk+SW50ZWdyYXRlIHRoZSBpbWFnZXMgYW5kIHJlc291cmNlcyBpbnRvIHRoZSBqYXIgZmlsZXM8L0xJPgorICAgICAgICA8TEk+U291cmNlIGNvZGUgbWFkZSBwdWJsaWNseSBhdmFpbGFibGU8L0xJPgorICAgICAgICA8TEk+QWxsb3cgZXhwb3J0aW5nIG9mIElDVTRDIHJlc291cmNlIGJ1bmRsZXM8L0xJPgorICAgICAgICA8TEk+Li4uIGFuZCBzb21lIGJ1ZyBmaXhlczwvTEk+CisgICAgICA8L1VMPgorICAgICAgCisgICAgICA8UD5GZWF0dXJlcyBhZGRlZCBpbiB2ZXJzaW9uIDAuNGEgb2YgUkIgTWFuYWdlcjo8L1A+CisgICAgICAKKyAgICAgIDxVTD4KKyAgICAgICAgPExJPlJlY2VudGx5IGFjY2Vzc2VkIHJlc291cmNlIGJ1bmRsZXMgYXBwZWFyIGluIHRoZSBGaWxlIG1lbnUgZm9yIGVhc3kgCisgICAgICAgICAgb3BlbmluZzwvTEk+CisgICAgICAgIDxMST5OZXcgaWNvbnMgZm9yIHRoZSB0cmVlIHZpZXc8L0xJPgorICAgICAgICA8TEk+QWJpbGl0eSB0byBzYXZlLCBoaWRlLCBvciBkZWxldGUgc3BlY2lmaWMgcmVzb3VyY2UgZmlsZXMgd2l0aG91dCBhZmZlY3RpbmcgCisgICAgICAgICAgdGhlIHJlc291cmNlIGJ1bmRsZSBhcyBhIHdob2xlPC9MST4KKyAgICAgICAgPExJPkV4cG9ydGluZyB0byBKYXZhIGNsYXNzIGZpbGVzIGFsbG93cyBmb3Igc3BlY2lmaWNhdGlvbiBvZiB0aGUgcGFja2FnZSAKKyAgICAgICAgICBuYW1lIGFzIHdlbGwgYXMgdGhlIGFiaWxpdHkgdG8gc3BlY2lmeSBwdWJsaWMgb3IgcHJvdGVjdGVkIG9iamVjdHM8L0xJPgorICAgICAgICA8TEk+VHJhbnNsYXRpb25zIGNhbiBub3cgZWFzaWx5IGFjY29taWRhdGUgbXVsdGlwbGUgbGluZSB0ZXh0PC9MST4KKyAgICAgICAgPExJPlJCIE1hbmFnZXIgaXMgbm8gbG9uZ2VyIHJlc3RyaWNlZCB0byByZXNvdXJjZSBidW5kbGVzIHRoYXQgZW5kIGluIAorICAgICAgICAgICcucHJvcGVydGllcycgaW4gbG93ZXItY2FzZTwvTEk+CisgICAgICAgIDxMST4uLi4gYW5kIHNvbWUgYnVnIGZpeGVzPC9MST4KKyAgICAgIDwvVUw+CisKKyAgICAgIDxQPkZlYXR1cmVzIGFkZGVkIGluIHZlcnNpb24gMC4zYSBvZiBSQiBNYW5hZ2VyOjwvUD4KKyAgICAgIDxVTD4KKyAgICAgICAgPExJPlRoZSBhYmlsaXR5IHRvIG1lcmdlIHByb3BlcnR5IGZpbGVzIGFuZCBvdGhlciByZXNvdXJjZSBidW5kbGVzIHdpdGggCisgICAgICAgICAgdGhlIG9wZW4gcmVzb3VyY2UgYnVuZGxlPC9MST4KKyAgICAgICAgPExJPkV4cG9ydGluZyBKYXZhIGNvbXBpbGFibGUgZmlsZXMgKExpc3RSZXNvdXJjZUJ1bmRsZSBleHRlbnNpb24gZmlsZXMpPC9MST4KKyAgICAgICAgPExJPkltcG9ydCBhbmQgZXhwb3J0IHN1cHBvcnQgZm9yIFRNWCBmb3JtYXR0ZWQgWE1MIHRyYW5zbGF0aW9uIGZpbGVzPC9MST4KKyAgICAgICAgPExJPlRoZSBhYmlsaXR5IHRvIHNlYXJjaCByZXNvdXJjZSBidW5kbGVzIGFuZCBsYW5ndWFnZSBmaWxlcyBmb3IgcGFydGljdWxhciAKKyAgICAgICAgICB0cmFuc2xhdGlvbnM8L0xJPgorICAgICAgICA8TEk+S2V5Ym9hcmQgc2hvcnRjdXRzIGZvciB0aGUgbW9zdCBjb21tb24gZnVuY3Rpb25zPC9MST4KKyAgICAgICAgPExJPkEgZmlsZSBzY2FubmluZyBleHRlbnNpb24gdG8gdGhlIHJlcG9ydGluZyB0b29sPC9MST4KKyAgICAgICAgPExJPi4uLiBhbmQgc29tZSBidWcgZml4ZXM8L0xJPgorICAgICAgPC9VTD4KKyAgICAgIDxQPkhhdmUgYW5vdGhlciBpZGVhPyBTZW5kIGFueSB0aG91Z2h0cyBvciBjb21tZW50cyB0bworICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5qdGNzdi5jb20vY2dpYmluL2ljdS1idWdzLyI+SUNVJ3MgSml0dGVyYnVnIGRhdGFiYXNlPC9hPi48L1A+CisgICAgICA8YnI+CisgICAgICA8IS0tICNFbmRFZGl0YWJsZSAtLT48L1REPgorCTwvVFI+CisJPFRSPgorCQk8VEQgQkFDS0dST1VORD0iaW1hZ2VzL3RlbXBsYXRlX2xsLmdpZiIgSEVJR0hUPSI0MCIgV0lEVEg9IjIwMCI+CisJCQk8IS0tIENvbW1lbnQgLS0+CisJCTwvVEQ+CisJCTxURCBXSURUSD0iODAiPgorCQkJPCEtLSBDb21tZW50IC0tPgorCQk8L1REPgorCQk8VEQ+CisJCQk8Q0VOVEVSPjxTUEFOIENMQVNTPSJDb3B5cmlnaHQiPkNvcHlyaWdodCAyMDAwLTIwMDQgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcywgQWxsIFJpZ2h0cyBSZXNlcnZlZDwvU1BBTj48L0NFTlRFUj4KKwkJPC9URD4KKwk8L1RSPgorPC9UQUJMRT4KKzwvQk9EWT4KKzwhLS0gI0VuZFRlbXBsYXRlIC0tPjwvSFRNTD4KZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9UaXRsZUxvZ29fdHJhbnNwYXJlbnQuZ2lmIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL1RpdGxlTG9nb190cmFuc3BhcmVudC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNlODQ5NAotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9UaXRsZUxvZ29fdHJhbnNwYXJlbnQuZ2lmCkBAIC0wLDAgKzEsMyBAQAordmVyc2lvbiBodHRwczovL2dpdC1sZnMuZ2l0aHViLmNvbS9zcGVjL3YxCitvaWQgc2hhMjU2OjIxNGQ2YzI1YzRhMjIyZmVlYjVlY2QxZDdlNzAxYzZiZjE4MDFmMTU0OWI4NzUwMGYwNmRiYjUwNjUyZTU5YTcKK3NpemUgMTY3NApkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL2Fycm93X2J1bGxldC5naWYgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvYXJyb3dfYnVsbGV0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDAxODI1Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL2Fycm93X2J1bGxldC5naWYKQEAgLTAsMCArMSwzIEBACit2ZXJzaW9uIGh0dHBzOi8vZ2l0LWxmcy5naXRodWIuY29tL3NwZWMvdjEKK29pZCBzaGEyNTY6Mjg1NGYzNTg2NDhkY2MyZWEyMWI0YTNjOWNhNjVhODI3NjJiM2QwMmIxOGI1MzM0ZTQ0ZWU5YTg4YzJiYTQ5MAorc2l6ZSA3MApkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL2RpYW1vbmRfYnVsbGV0LmdpZiBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9kaWFtb25kX2J1bGxldC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQxZjI4OAotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9kaWFtb25kX2J1bGxldC5naWYKQEAgLTAsMCArMSwzIEBACit2ZXJzaW9uIGh0dHBzOi8vZ2l0LWxmcy5naXRodWIuY29tL3NwZWMvdjEKK29pZCBzaGEyNTY6MmIyOWI3NTAxYzdiMDYyZDg3NDM2Mzg0OTE2MTgyYTU3NTRjY2IzYzMzZmFmOTJkZjUyZjk2ZmNkNzlhZDI5Mgorc2l6ZSA5NApkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL2libV9sb2dvX3NtYWxsX3doaXRlLmdpZiBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9pYm1fbG9nb19zbWFsbF93aGl0ZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZlNWJiNwotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9pYm1fbG9nb19zbWFsbF93aGl0ZS5naWYKQEAgLTAsMCArMSwzIEBACit2ZXJzaW9uIGh0dHBzOi8vZ2l0LWxmcy5naXRodWIuY29tL3NwZWMvdjEKK29pZCBzaGEyNTY6OTM2Yjg0ZDdjMzdjNGRmZTRjMjAwN2ExYjM2YTdjNGI5ZTdmOTlhNzZhOTkyZDZmZTUyYTg0NzgyNjhlODM4ZAorc2l6ZSAxMzgKZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9SQlJlcG9ydGVyLmdpZiBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9SQlJlcG9ydGVyLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmEzZmY4Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL1JCUmVwb3J0ZXIuZ2lmCkBAIC0wLDAgKzEsMyBAQAordmVyc2lvbiBodHRwczovL2dpdC1sZnMuZ2l0aHViLmNvbS9zcGVjL3YxCitvaWQgc2hhMjU2OjJjNTMzZWM0ODU5ODMzYjY1NDVjM2VjZTdiMDRmMjA1YzcwNmE1NTlkMWI5Y2MxM2IyMzU4ZThhNmMxZjdmYmIKK3NpemUgMTM5ODQKZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9iYXNpY19maWxlLmdpZiBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9iYXNpY19maWxlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDdlMmQyCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL2Jhc2ljX2ZpbGUuZ2lmCkBAIC0wLDAgKzEsMyBAQAordmVyc2lvbiBodHRwczovL2dpdC1sZnMuZ2l0aHViLmNvbS9zcGVjL3YxCitvaWQgc2hhMjU2OjUwMDA0NDZmMGRlM2NkNmJiNTgwNjhmMGExODEyMTQzYzYxYmZhZjhmMTIzNzdkODU5NDRmMTk1NWZmNDM4MDIKK3NpemUgOTc0MQpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL2Jhc2ljX2dyb3VwLmdpZiBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9iYXNpY19ncm91cC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjEwZDVhMgotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9iYXNpY19ncm91cC5naWYKQEAgLTAsMCArMSwzIEBACit2ZXJzaW9uIGh0dHBzOi8vZ2l0LWxmcy5naXRodWIuY29tL3NwZWMvdjEKK29pZCBzaGEyNTY6OGEwNjc3YmNhY2QzODFlNDA5ODEyZWMwODM3NjFhMzViZjAxYWFhNDZmYmU3NTRlZmYwY2UxMWEwOGU3OWQ5Mworc2l6ZSAxNTA0MgpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL2Jhc2ljX3Jlc291cmNlLmdpZiBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9iYXNpY19yZXNvdXJjZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ3MDY5NQotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9iYXNpY19yZXNvdXJjZS5naWYKQEAgLTAsMCArMSwzIEBACit2ZXJzaW9uIGh0dHBzOi8vZ2l0LWxmcy5naXRodWIuY29tL3NwZWMvdjEKK29pZCBzaGEyNTY6NWQ5YjAyZmQxN2U3ODc4MWFiMDA4Nzg0MWU1N2RiNWY0ZjAxODI5YWMyZDBlNDcwNWJlNzdjZTBmOWUwNzc3Mworc2l6ZSA2MjY2CmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvYmFzaWNfdHJhbnNsYXRpb24uZ2lmIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL2Jhc2ljX3RyYW5zbGF0aW9uLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWM4ZTBhCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL2Jhc2ljX3RyYW5zbGF0aW9uLmdpZgpAQCAtMCwwICsxLDMgQEAKK3ZlcnNpb24gaHR0cHM6Ly9naXQtbGZzLmdpdGh1Yi5jb20vc3BlYy92MQorb2lkIHNoYTI1Njo2OWVkZTdhOGQzZDU2MTFiZmY2N2I4MTY3Njk5NzBiMDBiYmIyNjM3NWRkN2JjYjVkYzEyYmZmNmU2MzViYWI5CitzaXplIDc4NzUKZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9iYXNpY191bnRyYW5zbGF0ZWQuZ2lmIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL2Jhc2ljX3VudHJhbnNsYXRlZC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNkMzg2MAotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9iYXNpY191bnRyYW5zbGF0ZWQuZ2lmCkBAIC0wLDAgKzEsMyBAQAordmVyc2lvbiBodHRwczovL2dpdC1sZnMuZ2l0aHViLmNvbS9zcGVjL3YxCitvaWQgc2hhMjU2OmU5Yzk1OTQ1YThhZWZiNmNjMGIzYWI0MGM0N2UzZGI5YmNjNDc3MjUzZGVlYmY4YzFkOTA2OGE1MWRiOTAxMmIKK3NpemUgMTMxODIKZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9jcmVhdGVfZ3JvdXAuZ2lmIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL2NyZWF0ZV9ncm91cC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdlYmVhNwotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9jcmVhdGVfZ3JvdXAuZ2lmCkBAIC0wLDAgKzEsMyBAQAordmVyc2lvbiBodHRwczovL2dpdC1sZnMuZ2l0aHViLmNvbS9zcGVjL3YxCitvaWQgc2hhMjU2Ojk2YjdiZGNkOTM1ZGEyMGI0ZThkY2MyZjdhM2MwYjc5NGRiM2FiNmViYjk2NzFmN2ExMjRiOTA2YjhjNWJkOWUKK3NpemUgMzkwNwpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL2VtcHR5X2dyb3VwLmdpZiBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9lbXB0eV9ncm91cC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg5MDI2MgotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9lbXB0eV9ncm91cC5naWYKQEAgLTAsMCArMSwzIEBACit2ZXJzaW9uIGh0dHBzOi8vZ2l0LWxmcy5naXRodWIuY29tL3NwZWMvdjEKK29pZCBzaGEyNTY6N2Y3OWJhZmNiZDgzYzBiNDhkMDVlYTFlOTJlMzg3NzEzODBjN2YwMjM3ZTNkMTlhMTQ1NWI2NzllMWIxY2NlYgorc2l6ZSAxNDU2OQpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL2VtcHR5X3Jlc291cmNlLmdpZiBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9lbXB0eV9yZXNvdXJjZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM3NWJhYQotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9lbXB0eV9yZXNvdXJjZS5naWYKQEAgLTAsMCArMSwzIEBACit2ZXJzaW9uIGh0dHBzOi8vZ2l0LWxmcy5naXRodWIuY29tL3NwZWMvdjEKK29pZCBzaGEyNTY6YjEyNmVkYjJmNjhkMzQ5YmU3MWEzMThmYWE4NTdhZWE0NjczM2UyYjFmMDY5NzdjMzg3MmE2Yjg5MjNlMjY1Zgorc2l6ZSA1MTAzCmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvZW1wdHlfc2NyZWVuLmdpZiBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9lbXB0eV9zY3JlZW4uZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZThjZGQKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvZW1wdHlfc2NyZWVuLmdpZgpAQCAtMCwwICsxLDMgQEAKK3ZlcnNpb24gaHR0cHM6Ly9naXQtbGZzLmdpdGh1Yi5jb20vc3BlYy92MQorb2lkIHNoYTI1Njo0YmU5Y2MwMWFmNjYyMmIzMmI4OTkwYjAzMDI4ZjM1ZWIyYmYzNWEzOGY4MTc2NWUyMjAxN2IyNzViYjg5MzJkCitzaXplIDk5OTMKZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9lbXB0eV93aXRoX3ByZWZlcmVuY2VzLmdpZiBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9lbXB0eV93aXRoX3ByZWZlcmVuY2VzLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTUxMGI4Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL2VtcHR5X3dpdGhfcHJlZmVyZW5jZXMuZ2lmCkBAIC0wLDAgKzEsMyBAQAordmVyc2lvbiBodHRwczovL2dpdC1sZnMuZ2l0aHViLmNvbS9zcGVjL3YxCitvaWQgc2hhMjU2OmNlZjQ0MTlhNDgxYWFiODBiNmMyYjRlYmQzZDgyNWY0MWZmOWEzZTFkM2FkMzE2YjIzZDM4ZDZiNzMwNmJkMjUKK3NpemUgOTkwNwpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL2xhZl9tZXRhbC5naWYgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvbGFmX21ldGFsLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTg4MDIwCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL2xhZl9tZXRhbC5naWYKQEAgLTAsMCArMSwzIEBACit2ZXJzaW9uIGh0dHBzOi8vZ2l0LWxmcy5naXRodWIuY29tL3NwZWMvdjEKK29pZCBzaGEyNTY6NzViNjJkZmNlMzQ3OTUyYWIxODFhMDU4MDY4YTA3NzAzODZhZGRlN2I5ZTM2OWQ4MTRjNjUzMGMxNmRkNzJmZgorc2l6ZSA0NDQzMwpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL2xhZl9tb3RpZi5naWYgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvbGFmX21vdGlmLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDk1YTk5Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL2xhZl9tb3RpZi5naWYKQEAgLTAsMCArMSwzIEBACit2ZXJzaW9uIGh0dHBzOi8vZ2l0LWxmcy5naXRodWIuY29tL3NwZWMvdjEKK29pZCBzaGEyNTY6ZTUzMjU5MGZjNmEyOTA5NDM4NWMyMmFhODM1MDVhM2QxNTgxZTljNTYzOWFiZTg1ZDRlODFlMmEyYWY0NzQ0Mworc2l6ZSA1MzMyMgpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL2xhZl93aW5kb3dzLmdpZiBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9sYWZfd2luZG93cy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFmNzY3MwotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9sYWZfd2luZG93cy5naWYKQEAgLTAsMCArMSwzIEBACit2ZXJzaW9uIGh0dHBzOi8vZ2l0LWxmcy5naXRodWIuY29tL3NwZWMvdjEKK29pZCBzaGEyNTY6ZWE0ZDg1ZTIwNTVkOGY1YjgwZjM1NzkxNDU5NGJlMTM2M2IwZGE4MWNjZDBkNThmNGUyY2I0NGRkYjQwMjBjMworc2l6ZSA0NjA3NwpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL2xvb2t1cF9yZXNvdXJjZS5naWYgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvbG9va3VwX3Jlc291cmNlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGQ0ZDdiCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL2xvb2t1cF9yZXNvdXJjZS5naWYKQEAgLTAsMCArMSwzIEBACit2ZXJzaW9uIGh0dHBzOi8vZ2l0LWxmcy5naXRodWIuY29tL3NwZWMvdjEKK29pZCBzaGEyNTY6YTk3MWE0OTY4OTNmY2Q0NzMxNjg1NGM3OTRlYmE4NDE5NDdiZTM5OWI3MzRkYmM0MWE0OWI3YzRlNDc2NmNmZQorc2l6ZSA2NDQ1CmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvbWFpbl9wYWdlLmdpZiBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9tYWluX3BhZ2UuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMDRiM2IKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvbWFpbl9wYWdlLmdpZgpAQCAtMCwwICsxLDMgQEAKK3ZlcnNpb24gaHR0cHM6Ly9naXQtbGZzLmdpdGh1Yi5jb20vc3BlYy92MQorb2lkIHNoYTI1Njo4Yzc5NTg5ZTdhNWIyNzc3Yzk1NWJmZjAwMTUzYWNiMTJjMDU3OGZhNjU0NGVjOGQ1ZDI5YzY2MzBkZTdhOWYxCitzaXplIDE5MDg1CmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvbWVudV9maWxlLmdpZiBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9tZW51X2ZpbGUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmYzUxZTEKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvbWVudV9maWxlLmdpZgpAQCAtMCwwICsxLDMgQEAKK3ZlcnNpb24gaHR0cHM6Ly9naXQtbGZzLmdpdGh1Yi5jb20vc3BlYy92MQorb2lkIHNoYTI1Njo5ODY5ZDRiN2Q1YWJlZTRmMDhjNDFkNDcwNDBkZWNjNWFkN2I1YTEyYTU5NTZlNjlkNDQ5Mjg1ZjA5ZTIyNDIzCitzaXplIDI3NDEKZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9tZW51X2ZpbGVfZXhwb3J0LmdpZiBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9tZW51X2ZpbGVfZXhwb3J0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmI1ZDhhCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL21lbnVfZmlsZV9leHBvcnQuZ2lmCkBAIC0wLDAgKzEsMyBAQAordmVyc2lvbiBodHRwczovL2dpdC1sZnMuZ2l0aHViLmNvbS9zcGVjL3YxCitvaWQgc2hhMjU2OjhiZjMwMTVhYzFhZWUwMzFhNzI3N2E1NjkyZTU0ZmY3NWRiNGRhODBhZWQxZmRkZjRmMDhmYjgyMDMxMGYwZDQKK3NpemUgMzk4NQpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL21lbnVfZmlsZV9pbXBvcnQuZ2lmIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL21lbnVfZmlsZV9pbXBvcnQuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMzY1NDYKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvbWVudV9maWxlX2ltcG9ydC5naWYKQEAgLTAsMCArMSwzIEBACit2ZXJzaW9uIGh0dHBzOi8vZ2l0LWxmcy5naXRodWIuY29tL3NwZWMvdjEKK29pZCBzaGEyNTY6NjBlMGYwOTVjZTBjZWJjZDdiOWFiNGYwMjg4NTY1MWU0NDkxOWQ4ZDAxNzY0NWY3MTFjNzY1NjI4OGQ4MDQ3OAorc2l6ZSA0MDg2CmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvbWVudV9oZWxwLmdpZiBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9tZW51X2hlbHAuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNzUwNzcKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvbWVudV9oZWxwLmdpZgpAQCAtMCwwICsxLDMgQEAKK3ZlcnNpb24gaHR0cHM6Ly9naXQtbGZzLmdpdGh1Yi5jb20vc3BlYy92MQorb2lkIHNoYTI1Njo1MDY2MDMxZjE0NjhhNGE2N2Y5NDc2YTliMmJlODk2NzQ2ZTk0MDhiYmM1NWI0YzEyYzBmOGE0YmY5NjBhYmVhCitzaXplIDk3NApkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL21lbnVfb3B0aW9ucy5naWYgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvbWVudV9vcHRpb25zLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTAzNGQwCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL21lbnVfb3B0aW9ucy5naWYKQEAgLTAsMCArMSwzIEBACit2ZXJzaW9uIGh0dHBzOi8vZ2l0LWxmcy5naXRodWIuY29tL3NwZWMvdjEKK29pZCBzaGEyNTY6Mjc5ZDU1YTJhZTJjNmEzOWFkNWY5NWU1ZjM2MzdiOWRmNThiM2FlMGJjNjEzNTVhODhmNDA4YWE2NWNmMTQ5Ngorc2l6ZSAxMzYzCmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvbWVudV9wb3B1cF90cmVlLmdpZiBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9tZW51X3BvcHVwX3RyZWUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4OWNmYWQKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvbWVudV9wb3B1cF90cmVlLmdpZgpAQCAtMCwwICsxLDMgQEAKK3ZlcnNpb24gaHR0cHM6Ly9naXQtbGZzLmdpdGh1Yi5jb20vc3BlYy92MQorb2lkIHNoYTI1NjpiNWQ1YmFlZDlhYzU2ZmI0ODk0MTlmMTM0ZDAxY2ZlMDhkZGQyNjhhOGI1ZThlOTcyYWY5NTJjYmFlMGEyZjhkCitzaXplIDI0NDEzCmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvbmV3X2Jhc2VjbGFzcy5naWYgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvbmV3X2Jhc2VjbGFzcy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY2MDk3ZAotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9uZXdfYmFzZWNsYXNzLmdpZgpAQCAtMCwwICsxLDMgQEAKK3ZlcnNpb24gaHR0cHM6Ly9naXQtbGZzLmdpdGh1Yi5jb20vc3BlYy92MQorb2lkIHNoYTI1Njo5MGQ1ZDFmYWU4Y2FlZDY5MDZmMTQwYWZiNDk2MTAxYzkzMDIwMDQxODM3Yjc3MDk4ZmZjNjFiMWQzMmZmYjM2CitzaXplIDEzNDE5CmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvbmV3X2J1bmRsZS5naWYgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvbmV3X2J1bmRsZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA2ODFiNAotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9uZXdfYnVuZGxlLmdpZgpAQCAtMCwwICsxLDMgQEAKK3ZlcnNpb24gaHR0cHM6Ly9naXQtbGZzLmdpdGh1Yi5jb20vc3BlYy92MQorb2lkIHNoYTI1Njo2Y2RhZDcyMDU2Mjk4MjZlZTUwZDM1YzU2NDU5MWVhMDFjMWUyMjJjZDM0N2Y3ZjE3NTBkNjRmZWVlOGM2NjBkCitzaXplIDExNjk2CmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvcHJlZmVyZW5jZXNfZGlhbG9nLmdpZiBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy9wcmVmZXJlbmNlc19kaWFsb2cuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ZGExZTAKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvcHJlZmVyZW5jZXNfZGlhbG9nLmdpZgpAQCAtMCwwICsxLDMgQEAKK3ZlcnNpb24gaHR0cHM6Ly9naXQtbGZzLmdpdGh1Yi5jb20vc3BlYy92MQorb2lkIHNoYTI1NjoyMzIwYTUxNWYwNzIzZmJhZGE4MGVkZjIwYzQzYzJmZGU3ODVkMmE4NTFlN2YwY2FmMTM0ZTk0M2Q4NjE4ZmYyCitzaXplIDcxODcKZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy92aWV3X2dyb3Vwc19idW5kbGUuZ2lmIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL3ZpZXdfZ3JvdXBzX2J1bmRsZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2EzMDhiNgotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy92aWV3X2dyb3Vwc19idW5kbGUuZ2lmCkBAIC0wLDAgKzEsMyBAQAordmVyc2lvbiBodHRwczovL2dpdC1sZnMuZ2l0aHViLmNvbS9zcGVjL3YxCitvaWQgc2hhMjU2OjMwNDJiYmE2OTExMTNjYjBkZDYwMjJkYzg0MWQ2ZGM1ZDZmMzhkMmUxYTllOTJiMzdjYjYzMTI2MWY2MGQ0ZjQKK3NpemUgMTgwODcKZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy92aWV3X2dyb3Vwc19maWxlLmdpZiBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy92aWV3X2dyb3Vwc19maWxlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmIzOWE1Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL3ZpZXdfZ3JvdXBzX2ZpbGUuZ2lmCkBAIC0wLDAgKzEsMyBAQAordmVyc2lvbiBodHRwczovL2dpdC1sZnMuZ2l0aHViLmNvbS9zcGVjL3YxCitvaWQgc2hhMjU2OmRjNmNiYTQyYzg5NDE3MTZlNTIyM2U4OTc2ZDZhZjQ4ZmY3MWQ3YTEwYmQ2Mjk5YjVjOTBmM2U5MzEwZTg2YWMKK3NpemUgMTkzNDMKZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy92aWV3X3NlYXJjaC5naWYgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvdmlld19zZWFyY2guZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNjY2ZmMKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvdmlld19zZWFyY2guZ2lmCkBAIC0wLDAgKzEsMyBAQAordmVyc2lvbiBodHRwczovL2dpdC1sZnMuZ2l0aHViLmNvbS9zcGVjL3YxCitvaWQgc2hhMjU2OjBmYzc2OGQwMjY0MGUzMzEzNTJjZDVlNDdhMjcwZjczMDI5OTBkZGU2ZDYzM2U0OWQ0ZmM1NDVjZDk2ZTJkM2IKK3NpemUgMjE2ODEKZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy92aWV3X3N0YXRzX2J1bmRsZS5naWYgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvdmlld19zdGF0c19idW5kbGUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZmZlYjUKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvdmlld19zdGF0c19idW5kbGUuZ2lmCkBAIC0wLDAgKzEsMyBAQAordmVyc2lvbiBodHRwczovL2dpdC1sZnMuZ2l0aHViLmNvbS9zcGVjL3YxCitvaWQgc2hhMjU2OmM1OWJiZTE5NWVhZTk1N2YwN2MzMWQzMzRhZDgwMDZhMWViYjFjMjRkNzMzMzk2Mzc5NzU1ODU0MTc3N2RkNjQKK3NpemUgMTcwOTAKZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy92aWV3X3N0YXRzX2ZpbGUuZ2lmIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL3ZpZXdfc3RhdHNfZmlsZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEyYjJhNgotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy92aWV3X3N0YXRzX2ZpbGUuZ2lmCkBAIC0wLDAgKzEsMyBAQAordmVyc2lvbiBodHRwczovL2dpdC1sZnMuZ2l0aHViLmNvbS9zcGVjL3YxCitvaWQgc2hhMjU2OjgwZTM4NTEwNjZjZTNjYWQ1ZGNhMzJlMjI0NjUzMWNmYzMwYTQwYTk4Yzg1MTMyMDgzNTQzMjJjNTIwOGY5NmQKK3NpemUgMTY1MjUKZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy92aWV3X3RyZWVfYmFzaWMuZ2lmIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL3ZpZXdfdHJlZV9iYXNpYy5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg5ZDk3NAotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy92aWV3X3RyZWVfYmFzaWMuZ2lmCkBAIC0wLDAgKzEsMyBAQAordmVyc2lvbiBodHRwczovL2dpdC1sZnMuZ2l0aHViLmNvbS9zcGVjL3YxCitvaWQgc2hhMjU2OjY1NjBjMjVkY2JhNjc5NzcwOTE1NmVmYmViNDc3MzI2YzRiNmQ3NjU2YWY2Nzg3ZjU4MDZhZDdlNzIxZWFlZGMKK3NpemUgMTYzMTMKZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy92aWV3X3VudHJhbnNfYnVuZGxlLmdpZiBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy92aWV3X3VudHJhbnNfYnVuZGxlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2Q3MjM4Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL3ZpZXdfdW50cmFuc19idW5kbGUuZ2lmCkBAIC0wLDAgKzEsMyBAQAordmVyc2lvbiBodHRwczovL2dpdC1sZnMuZ2l0aHViLmNvbS9zcGVjL3YxCitvaWQgc2hhMjU2OjBhODdkMzEyMzZhZTk1NTI0MjdlNmY2Y2EyYjYyZjMxZDA4MmVjMmUzMzczNjNkY2Q5NDAzMGE3MzUyODAxMzUKK3NpemUgMTk1NTgKZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy92aWV3X3VudHJhbnNfZGlhbG9nMC5naWYgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvdmlld191bnRyYW5zX2RpYWxvZzAuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NmJjNTAKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc2NyZWVuc2hvdHMvdmlld191bnRyYW5zX2RpYWxvZzAuZ2lmCkBAIC0wLDAgKzEsMyBAQAordmVyc2lvbiBodHRwczovL2dpdC1sZnMuZ2l0aHViLmNvbS9zcGVjL3YxCitvaWQgc2hhMjU2OjRhMjM2ZTA2NWE4OTBmYWI0OWUwY2RhZGRlN2M1YjBmZjBhNGUzYzM4NTY2MmZlMGZiNTc1MjNkYWE3NTIwMjcKK3NpemUgNzM2NwpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NjcmVlbnNob3RzL3ZpZXdfdW50cmFuc19maWxlLmdpZiBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy92aWV3X3VudHJhbnNfZmlsZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg4NzY4MAotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy9zY3JlZW5zaG90cy92aWV3X3VudHJhbnNfZmlsZS5naWYKQEAgLTAsMCArMSwzIEBACit2ZXJzaW9uIGh0dHBzOi8vZ2l0LWxmcy5naXRodWIuY29tL3NwZWMvdjEKK29pZCBzaGEyNTY6MTVkMzM5NTYxYTIyOTNjMDE0MDUxNTQwYjIwOGM0NDYzYjQwYjFiZTMyMjFjYTVhMDk5MjJmNmRmOTdhOTczYworc2l6ZSAyNDIzMApkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NwYWNlci5naWYgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvc3BhY2VyLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGM1ZTNjCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3NwYWNlci5naWYKQEAgLTAsMCArMSwzIEBACit2ZXJzaW9uIGh0dHBzOi8vZ2l0LWxmcy5naXRodWIuY29tL3NwZWMvdjEKK29pZCBzaGEyNTY6M2I0YzYzY2U1ZThiYjM2N2NjNDg2MzA3MmQ5ZDAxY2RiZmUxMWI2NTc4ZmEyZjYxZjEyMGY2NjY1YWJhNTBkMworc2l6ZSA4NzAKZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy90ZW1wbGF0ZV9sLmdpZiBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy90ZW1wbGF0ZV9sLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzI5NTcyCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3RlbXBsYXRlX2wuZ2lmCkBAIC0wLDAgKzEsMyBAQAordmVyc2lvbiBodHRwczovL2dpdC1sZnMuZ2l0aHViLmNvbS9zcGVjL3YxCitvaWQgc2hhMjU2OjNjZGY4YzM4MjEzNzdiMzI5MDY1YjdlM2IzMjNmMWQ4YTQ2ZTlmNDc3OTNkMjJiNmY4YjE2MzRlMzJjZjVmNDMKK3NpemUgMTI4CmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvdGVtcGxhdGVfbGluZS5naWYgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvdGVtcGxhdGVfbGluZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRlOTBjNgotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy90ZW1wbGF0ZV9saW5lLmdpZgpAQCAtMCwwICsxLDMgQEAKK3ZlcnNpb24gaHR0cHM6Ly9naXQtbGZzLmdpdGh1Yi5jb20vc3BlYy92MQorb2lkIHNoYTI1NjpjYzNjNzI0YjFkNTQwYmJlYWVmYzI4NDlmNWI1NTUzOTQ4YzI4MWNlOWY4N2UzM2MxZWY4MDA5NTdkN2NlZWI5CitzaXplIDg3CmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvdGVtcGxhdGVfbGwuZ2lmIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3RlbXBsYXRlX2xsLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWZkN2FmCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3RlbXBsYXRlX2xsLmdpZgpAQCAtMCwwICsxLDMgQEAKK3ZlcnNpb24gaHR0cHM6Ly9naXQtbGZzLmdpdGh1Yi5jb20vc3BlYy92MQorb2lkIHNoYTI1Njo4ODgxMWRjZWZkMTQzMjBkYTllYWZjYjAwOTFkMmIxMTQyMDNkMDAzNmQ1N2FkOTczZTYxZTQ4NGFhNmU2NjFlCitzaXplIDc0OApkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3RlbXBsYXRlX3UuZ2lmIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3RlbXBsYXRlX3UuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZjhjNDUKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbWFnZXMvdGVtcGxhdGVfdS5naWYKQEAgLTAsMCArMSwzIEBACit2ZXJzaW9uIGh0dHBzOi8vZ2l0LWxmcy5naXRodWIuY29tL3NwZWMvdjEKK29pZCBzaGEyNTY6NWRiNzc2OTIwOGZmY2I5NTYzMWQ5NzI3ZTZmYzkzZDgyMDczZWVlNWU3YzI2ZGE3ODk0OWVjYzJhMzdhM2FiOAorc2l6ZSA5MwpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW1hZ2VzL3RlbXBsYXRlX3VsLmdpZiBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy90ZW1wbGF0ZV91bC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UwY2JjNQotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL2ltYWdlcy90ZW1wbGF0ZV91bC5naWYKQEAgLTAsMCArMSwzIEBACit2ZXJzaW9uIGh0dHBzOi8vZ2l0LWxmcy5naXRodWIuY29tL3NwZWMvdjEKK29pZCBzaGEyNTY6MDA4OWJhOWQ0MWYwZDYyMzRkNjIzYWVmOTY1ZmFiNDRjMTkwMDk3Yzk0Yzk0NzJmY2RjOTlhYmRkNTEyNGJkZgorc2l6ZSAxMDY5CmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9pbmRleC5odG1sIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW5kZXguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTIzNTI3Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvaW5kZXguaHRtbApAQCAtMCwwICsxLDE0NSBAQAorPEhUTUw+PCEtLSAjQmVnaW5UZW1wbGF0ZSAiL1RlbXBsYXRlcy9NYWluVGVtcGxhdGUuZHd0IiAtLT4KKzxIRUFEPgorPCEtLSAjQmVnaW5FZGl0YWJsZSAiZG9jdGl0bGUiIC0tPiAKKzxUSVRMRT5SZXNvdXJjZSBCdW5kbGUgTWFuYWdlcjwvVElUTEU+Cis8IS0tICNFbmRFZGl0YWJsZSAtLT4gCis8TUVUQSBIVFRQLUVRVUlWPSJDb250ZW50LVR5cGUiIENPTlRFTlQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzxTVFlMRSBUWVBFPSJURVhUL0NTUyI+Cis8IS0tCisudG9waWNIZWFkIHsgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOyBmb250LXNpemU6IDE0cHQ7IGZvbnQtd2VpZ2h0OiBib2xkOyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiAjMzMzMzMzfQorLnRvcGljTGlzdCB7ICBmb250LWZhbWlseTogR2VvcmdpYSwgIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsgZm9udC1zaXplOiA5cHQ7IGNvbG9yOiAjRkYwMDk5OyBsaXN0LXN0eWxlLWltYWdlOiAgdXJsKGltYWdlcy9kaWFtb25kX2J1bGxldC5naWYpOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IGZvbnQtd2VpZ2h0OiBib2xkfQorLm1haW5CbG9jayB7ICBmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMnB0OyBtYXJnaW4tdG9wOiA1cHg7IG1hcmdpbi1yaWdodDogNXB4OyBtYXJnaW4tYm90dG9tOiA1cHg7IG1hcmdpbi1sZWZ0OiA1cHg7IHBhZGRpbmctdG9wOiA1cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7IHBhZGRpbmctYm90dG9tOiA1cHg7IHBhZGRpbmctbGVmdDogMTBweDsgdGV4dC1hbGlnbjoganVzdGlmeX0KKy0tPgorPC9TVFlMRT4KKzwvSEVBRD4KKworPEJPRFkgQkdDT0xPUj0iI0ZGRkZGRiIgTEVGVE1BUkdJTj0iMCIgVE9QTUFSR0lOPSIwIiBNQVJHSU5XSURUSD0iMCIgTUFSR0lOSEVJR0hUPSIwIj4KKzxUQUJMRSBXSURUSD0iMTAwJSIgQk9SREVSPSIwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjAiPgorICA8VFI+CisgICAgPFREIFJPV1NQQU49IjIiIENPTFNQQU49IjIiIEJBQ0tHUk9VTkQ9ImltYWdlcy90ZW1wbGF0ZV91bC5naWYiIEhFSUdIVD0iNzUiPjxJTUcgU1JDPSJpbWFnZXMvc3BhY2VyLmdpZiIgV0lEVEg9IjI4MCIgSEVJR0hUPSIxIiBIU1BBQ0U9IjAiPjwvVEQ+CisJCTxURCBIRUlHSFQ9IjE1IiAgV0lEVEg9IjEwMCUiIEJBQ0tHUk9VTkQ9ImltYWdlcy90ZW1wbGF0ZV91LmdpZiI+PC9URD4KKwk8L1RSPgorCTxUUj4KKwkJPFREIEhFSUdIVD0iNjAiID4KKwkJCTxDRU5URVI+PElNRyBTUkM9ImltYWdlcy9UaXRsZUxvZ29fdHJhbnNwYXJlbnQuZ2lmIiBWU1BBQ0U9IjAiPjwvQ0VOVEVSPgorCQk8L1REPgorCTwvVFI+CisJPFRSPgorCQkKKyAgICA8VEQgV0lEVEg9IjIwMCIgQkFDS0dST1VORD0iaW1hZ2VzL3RlbXBsYXRlX2wuZ2lmIiBWQUxJR049InRvcCI+CisJCTxUQUJMRSBXSURUSD0iMTgwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjEiPiAKKyAgICAgIAk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljSGVhZCI+R2VuZXJhbDwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBWQUxJR049ImNlbnRlciI+PElNRyBTUkM9ImltYWdlcy90ZW1wbGF0ZV9saW5lLmdpZiI+PC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0xpc3QiPgorCSAgICAgICAgPFVMPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0ic3lzdGVtX3JlcXVpcmVtZW50cy5odG1sIj5TeXN0ZW0gUmVxdWlyZW1lbnRzPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJmYXEuaHRtbCI+RkFRPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJmdXR1cmVfZmVhdHVyZXMuaHRtbCI+RnV0dXJlIFJlbGVhc2VzPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMSSBDTEFTUz0idG9waWNMaXN0Ij48QSBIUkVGPSJmdXR1cmVfZmVhdHVyZXMuaHRtbCI+VmVyc2lvbiAKKyAgICAgICAgICAgICAgICBIaXN0b3J5PC9BPjwvTEk+CisgICAgICAgICAgICA8L1VMPgorCQkJPC9URD4KKwkJPC9UUj4KKyAgICAgIAk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljSGVhZCI+UkIgTWFuYWdlcjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBWQUxJR049ImNlbnRlciI+PElNRyBTUkM9ImltYWdlcy90ZW1wbGF0ZV9saW5lLmdpZiI+PC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0xpc3QiPgorCSAgICAgICAgPFVMPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iaW5kZXguaHRtbCI+SG9tZTwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0idHV0b3JpYWwvaW5kZXguaHRtbCI+VHV0b3JpYWw8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9InZpZXdzL2luZGV4Lmh0bWwiPkZ1bmN0aW9uYWxpdHkgYW5kIFZpZXdzPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJsb29rYW5kZmVlbC5odG1sIj5Mb29rIGFuZCBGZWVsPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJtZW51Lmh0bWwiPk1lbnUgSXRlbXM8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJIENMQVNTPSJ0b3BpY0xpc3QiPjxBIEhSRUY9InR1dG9yaWFsL3N0ZXAxLmh0bWwiPlByZWZlcmVuY2VzPC9BPjwvTEk+CisgICAgICAgICAgICA8L1VMPgorCQkJPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0hlYWQiPlJCIFJlcG9ydGVyPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIFZBTElHTj0iY2VudGVyIj48SU1HIFNSQz0iaW1hZ2VzL3RlbXBsYXRlX2xpbmUuZ2lmIj48L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljTGlzdCI+CisJICA8VUw+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJSQlJlcG9ydGVyLmh0bWwiPkhvbWU8L0E+PC9MST4KKyAgICAgICAgPExJPlJlcG9ydCBUeXBlczwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJzY2FuZmlsZS5odG1sIj5Db2RlIFNjYW5uaW5nPC9BPjwvTEk+CisgICAgICAgICAgICA8L1VMPgorCQkJPC9URD4KKwkJPC9UUj4KKwk8L1RBQkxFPgorCisgICAgICA8UD4mbmJzcDsgPC9QPgorICAgICAgPC9URD4KKwkJCisgICAgPFREIENPTFNQQU49IjIiIFZBTElHTj0idG9wIiBDTEFTUz0ibWFpbkJsb2NrIj48IS0tICNCZWdpbkVkaXRhYmxlICJNYWluIiAtLT4KKyAgICAgIDxESVYgQUxJR049IkNFTlRFUiI+CisgICAgICAgIDxIMj5XZWxjb21lIHRvIFJlc291cmNlIEJ1bmRsZSBNYW5hZ2VyICh2MC42KTwvSDI+CisgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPjxJTUcgU1JDPSJpbWFnZXMvc2NyZWVuc2hvdHMvbWFpbl9wYWdlLmdpZiI+PC9QPgorICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5UaGVzZSBwYWdlcyBhcmUgbWVhbnQgdG8gaGVscCB5b3UgYW5kIHlvdXIgZGV2ZWxvcG1lbnQgCisgICAgICAgICAgdGVhbSBnZXQgc3RhcnRlZCB3aXRoIHRoaXMgdHJhbnNsYXRpb24gbWFuYWdlbWVudCB0b29sLjwvUD4KKyAgICAgICAgPFAgQUxJR049IkNFTlRFUiI+VGhlIHRvb2wgd2FzIGRldmVsb3BlZCB0byBiZSBlYXN5IHRvIHVzZSBhbmQgaW50dXRpdGl2ZS4gCisgICAgICAgICAgSWYgeW91IGFsbCByZWFkeSB1bmRlcnN0YW5kIHRoZSBwcm9jZXNzIG9mIGludGVybmF0aW9uYWxpemF0aW9uIGFuZCAKKyAgICAgICAgICBqdXN0IHdhbnQgdG8gbGVhcm4gaG93IHRoaXMgdG9vbCBjYW4gYmUgdXNlZCB0byBtYWtlIHlvdXIgZWZmb3J0cyBtb3JlIAorICAgICAgICAgIGVmZmljaWVudCBhbmQgbGVzcyBlcnJvciBwcm9uZSBnbyBzdHJhaWdodCB0byB0aGUgPEEgSFJFRj0idHV0b3JpYWwvaW5kZXguaHRtbCI+c3RlcC1ieS1zdGVwIAorICAgICAgICAgIHR1dG9yaWFsPC9BPiwgPEEgSFJFRj0idmlld3MvaW5kZXguaHRtbCI+ZnVuY3Rpb25zIGFuZCB2aWV3czwvQT4sIG9yIAorICAgICAgICAgIDxBIEhSRUY9ImZhcS5odG1sIj5mcmVxdWVudGx5IGFza2VkIHF1ZXN0aW9uczwvQT4uIElmIHlvdSBhcmUgbmV3IHRvIAorICAgICAgICAgIGludGVybmF0aW9uYWxpemF0aW9uIGluIGRldmVsb3BtZW50LCB5b3UgbWF5IHdhbnQgdG8gZmlyc3QgY2hlY2sgb3V0IAorICAgICAgICAgIHRoaXM8QSBIUkVGPSJodHRwOi8vd3d3LTEwNi5pYm0uY29tL2RldmVsb3BlcndvcmtzL2xpYnJhcnkvai1yYm1nci9pbmRleC5odG1sIj4gCisgICAgICAgICAgaW50cm9kdWN0aW9uIHRvIGludGVybmF0aW9uYWxpemF0aW9uPC9BPi48L1A+CisgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPklmIHlvdSB3b3VsZCBsaWtlIHRvIHJlcG9ydCBhIGJ1ZywgZmVlbCBmcmVlIHRvCisgICAgICAgICAgPEEgSFJFRj0iaHR0cDovL3d3dy5qdGNzdi5jb20vY2dpYmluL2ljdS1idWdzLyI+c3VibWl0IGEgYnVnIHRvIG91cgorICAgICAgICAgIGJ1ZyBkYXRhYmFzZTwvQT4uPC9QPgorICAgICAgPC9ESVY+CisgICAgICA8IS0tICNFbmRFZGl0YWJsZSAtLT48L1REPgorCTwvVFI+CisJPFRSPgorCQk8VEQgQkFDS0dST1VORD0iaW1hZ2VzL3RlbXBsYXRlX2xsLmdpZiIgSEVJR0hUPSI0MCIgV0lEVEg9IjIwMCI+CisJCQk8IS0tIENvbW1lbnQgLS0+CisJCTwvVEQ+CisJCTxURCBXSURUSD0iODAiPgorCQkJPCEtLSBDb21tZW50IC0tPgorCQk8L1REPgorCQk8VEQ+CisJCQk8Q0VOVEVSPjxTUEFOIENMQVNTPSJDb3B5cmlnaHQiPkNvcHlyaWdodCAyMDAwLTIwMDEgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcywgQWxsIFJpZ2h0cyBSZXNlcnZlZDwvU1BBTj48L0NFTlRFUj4KKwkJPC9URD4KKwk8L1RSPgorPC9UQUJMRT4KKzwhLS0KKzxUQUJMRSBXSURUSD0iMTAwJSIgQk9SREVSPSIwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjIiPgorICA8VFI+CisgICAgPFREIFdJRFRIPSIyMDAiIEJHQ09MT1I9IiNDQ0NDRkYiPiZuYnNwOzwvVEQ+CisgICAgPFREPgorICAgICAgPERJViBBTElHTj0iQ0VOVEVSIj48SU1HIFNSQz0iLi4vaW1hZ2VzL1RpdGxlTG9nb190cmFuc3BhcmVudC5naWYiIFdJRFRIPSIxNzUiIEhFSUdIVD0iNTAiPjwvRElWPgorICAgIDwvVEQ+CisgIDwvVFI+CisgIDxUUiBWQUxJR049IlRPUCI+IAorICAgIDxURCBXSURUSD0iMjAwIiBCR0NPTE9SPSIjQ0NDQ0ZGIj4gCisgICAgICA8UD48QSBIUkVGPSJpbmRleC5odG1sIj5SQk1hbmFnZXI8L0E+PC9QPgorICAgICAgPFA+PEEgSFJFRj0iUkJSZXBvcnRlci5odG1sIj5SQlJlcG9ydGVyPC9BPjwvUD4KKyAgICAgIDxQPjxBIEhSRUY9Ii4uL3R1dG9yaWFsL3N0ZXAxLmh0bWwiPlN5c3RlbSBSZXF1aXJlbWVudHM8L0E+PC9QPgorICAgICAgPFA+PEEgSFJFRj0iZmFxLmh0bWwiPkZBUTwvQT48L1A+CisgICAgICA8UD5Ub3BpY3M8L1A+CisgICAgICA8VUw+CisgICAgICAgIDxMST48QSBIUkVGPSIuLi90dXRvcmlhbC9pbmRleC5odG1sIj5TdGVwLWJ5LXN0ZXAgVHV0b3JpYWw8L0E+PC9MST4KKyAgICAgICAgPExJPjxBIEhSRUY9InN0ZXAxLmh0bWwiPkNoYW5naW5nIFByZWZlbmNlczwvQT48L0xJPgorICAgICAgICA8TEk+PEEgSFJFRj0iZnV0dXJlX2ZlYXR1cmVzLmh0bWwiPkZ1dHVyZSBSZWxlYXNlIEZlYXR1cmVzPC9BPjwvTEk+CisgICAgICA8L1VMPgorICAgIDwvVEQ+CisgICAgPFREPjwvVEQ+CisgIDwvVFI+Cis8L1RBQkxFPgorLS0+Cis8L0JPRFk+Cis8IS0tICNFbmRUZW1wbGF0ZSAtLT48L0hUTUw+CmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9sb29rYW5kZmVlbC5odG1sIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvbG9va2FuZGZlZWwuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWE2MDE2Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvbG9va2FuZGZlZWwuaHRtbApAQCAtMCwwICsxLDExOSBAQAorPEhUTUw+PCEtLSAjQmVnaW5UZW1wbGF0ZSAiL1RlbXBsYXRlcy9NYWluVGVtcGxhdGUuZHd0IiAtLT4KKzxIRUFEPgorPCEtLSAjQmVnaW5FZGl0YWJsZSAiZG9jdGl0bGUiIC0tPiAKKzxUSVRMRT5SQk1hbmFnZXIgLSBMb29rIGFuZCBGZWVsPC9USVRMRT4KKzwhLS0gI0VuZEVkaXRhYmxlIC0tPiAKKzxNRVRBIEhUVFAtRVFVSVY9IkNvbnRlbnQtVHlwZSIgQ09OVEVOVD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPFNUWUxFIFRZUEU9IlRFWFQvQ1NTIj4KKzwhLS0KKy50b3BpY0hlYWQgeyAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7IGZvbnQtc2l6ZTogMTRwdDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6ICMzMzMzMzN9CisudG9waWNMaXN0IHsgIGZvbnQtZmFtaWx5OiBHZW9yZ2lhLCAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOyBmb250LXNpemU6IDlwdDsgY29sb3I6ICNGRjAwOTk7IGxpc3Qtc3R5bGUtaW1hZ2U6ICB1cmwoaW1hZ2VzL2RpYW1vbmRfYnVsbGV0LmdpZik7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgZm9udC13ZWlnaHQ6IGJvbGR9CisubWFpbkJsb2NrIHsgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBmb250LXNpemU6IDEycHQ7IG1hcmdpbi10b3A6IDVweDsgbWFyZ2luLXJpZ2h0OiA1cHg7IG1hcmdpbi1ib3R0b206IDVweDsgbWFyZ2luLWxlZnQ6IDVweDsgcGFkZGluZy10b3A6IDVweDsgcGFkZGluZy1yaWdodDogMTBweDsgcGFkZGluZy1ib3R0b206IDVweDsgcGFkZGluZy1sZWZ0OiAxMHB4OyB0ZXh0LWFsaWduOiBqdXN0aWZ5fQorLS0+Cis8L1NUWUxFPgorPC9IRUFEPgorCis8Qk9EWSBCR0NPTE9SPSIjRkZGRkZGIiBMRUZUTUFSR0lOPSIwIiBUT1BNQVJHSU49IjAiIE1BUkdJTldJRFRIPSIwIiBNQVJHSU5IRUlHSFQ9IjAiPgorPFRBQkxFIFdJRFRIPSIxMDAlIiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iMCI+CisgIDxUUj4KKyAgICA8VEQgUk9XU1BBTj0iMiIgQ09MU1BBTj0iMiIgQkFDS0dST1VORD0iaW1hZ2VzL3RlbXBsYXRlX3VsLmdpZiIgSEVJR0hUPSI3NSI+PElNRyBTUkM9ImltYWdlcy9zcGFjZXIuZ2lmIiBXSURUSD0iMjgwIiBIRUlHSFQ9IjEiIEhTUEFDRT0iMCI+PC9URD4KKwkJPFREIEhFSUdIVD0iMTUiICBXSURUSD0iMTAwJSIgQkFDS0dST1VORD0iaW1hZ2VzL3RlbXBsYXRlX3UuZ2lmIj48L1REPgorCTwvVFI+CisJPFRSPgorCQk8VEQgSEVJR0hUPSI2MCIgPgorCQkJPENFTlRFUj48SU1HIFNSQz0iaW1hZ2VzL1RpdGxlTG9nb190cmFuc3BhcmVudC5naWYiIFZTUEFDRT0iMCI+PC9DRU5URVI+CisJCTwvVEQ+CisJPC9UUj4KKwk8VFI+CisJCQorICAgIDxURCBXSURUSD0iMjAwIiBCQUNLR1JPVU5EPSJpbWFnZXMvdGVtcGxhdGVfbC5naWYiIFZBTElHTj0idG9wIj4KKwkJPFRBQkxFIFdJRFRIPSIxODAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iMSI+IAorICAgICAgCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNIZWFkIj5HZW5lcmFsPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIFZBTElHTj0iY2VudGVyIj48SU1HIFNSQz0iaW1hZ2VzL3RlbXBsYXRlX2xpbmUuZ2lmIj48L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljTGlzdCI+CisJICAgICAgICA8VUw+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJzeXN0ZW1fcmVxdWlyZW1lbnRzLmh0bWwiPlN5c3RlbSBSZXF1aXJlbWVudHM8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9ImZhcS5odG1sIj5GQVE8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9ImZ1dHVyZV9mZWF0dXJlcy5odG1sIj5GdXR1cmUgUmVsZWFzZXM8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJIENMQVNTPSJ0b3BpY0xpc3QiPjxBIEhSRUY9ImZ1dHVyZV9mZWF0dXJlcy5odG1sIj5WZXJzaW9uIAorICAgICAgICAgICAgICAgIEhpc3Rvcnk8L0E+PC9MST4KKyAgICAgICAgICAgIDwvVUw+CisJCQk8L1REPgorCQk8L1RSPgorICAgICAgCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNIZWFkIj5SQiBNYW5hZ2VyPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIFZBTElHTj0iY2VudGVyIj48SU1HIFNSQz0iaW1hZ2VzL3RlbXBsYXRlX2xpbmUuZ2lmIj48L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljTGlzdCI+CisJICAgICAgICA8VUw+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJpbmRleC5odG1sIj5Ib21lPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJ0dXRvcmlhbC9pbmRleC5odG1sIj5UdXRvcmlhbDwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0idmlld3MvaW5kZXguaHRtbCI+RnVuY3Rpb25hbGl0eSBhbmQgVmlld3M8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Imxvb2thbmRmZWVsLmh0bWwiPkxvb2sgYW5kIEZlZWw8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Im1lbnUuaHRtbCI+TWVudSBJdGVtczwvQT48L0xJPgorICAgICAgICAgICAgICA8TEkgQ0xBU1M9InRvcGljTGlzdCI+PEEgSFJFRj0idHV0b3JpYWwvc3RlcDEuaHRtbCI+UHJlZmVyZW5jZXM8L0E+PC9MST4KKyAgICAgICAgICAgIDwvVUw+CisJCQk8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljSGVhZCI+UkIgUmVwb3J0ZXI8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgVkFMSUdOPSJjZW50ZXIiPjxJTUcgU1JDPSJpbWFnZXMvdGVtcGxhdGVfbGluZS5naWYiPjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNMaXN0Ij4KKwkgIDxVTD4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9IlJCUmVwb3J0ZXIuaHRtbCI+SG9tZTwvQT48L0xJPgorICAgICAgICA8TEk+UmVwb3J0IFR5cGVzPC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9InNjYW5maWxlLmh0bWwiPkNvZGUgU2Nhbm5pbmc8L0E+PC9MST4KKyAgICAgICAgICAgIDwvVUw+CisJCQk8L1REPgorCQk8L1RSPgorCTwvVEFCTEU+CisKKyAgICAgIDxQPiZuYnNwOyA8L1A+CisgICAgICA8L1REPgorCQkKKyAgICA8VEQgQ09MU1BBTj0iMiIgVkFMSUdOPSJ0b3AiIENMQVNTPSJtYWluQmxvY2siPjwhLS0gI0JlZ2luRWRpdGFibGUgIk1haW4iIC0tPiAKKyAgICAgIDxIMyBBTElHTj0iQ0VOVEVSIj5Mb29rIGFuZCBGZWVsPC9IMz4KKyAgICAgIDxQPlJCIE1hbmFnZXIgaXMgd3JpdHRlbiBwdXJlbHkgaW4gSmF2YSwgYW5kIHRoZXJlZm9yZSBpcyBhIGNyb3NzLXBsYXRmb3JtIAorICAgICAgICBhcHBsaWNhdGlvbi4gVXNpbmcgdGhlIFByZWZlcmVuY2VzIG1lbnUgaXRlbSwgdGhlIGxvb2sgYW5kIGZlZWwgb2YgdGhlIAorICAgICAgICBhcHBsaWNhdGlvbiBjYW4gYmUgY2hhbmdlZCB0byBhbnkgb25lIG9mIHRoZSBsb29rIGFuZCBmZWVscyBzdXBwb3J0ZWQgCisgICAgICAgIGJ5IHRoZSB2aXJ0dWFsIG1hY2hpbmUgcnVubmluZyBvbiB0aGUgc3lzdGVtLjwvUD4KKyAgICAgIDxQPlRoaXMgcGFnZSBzaG93cyBzb21lIGV4YW1wbGVzIG9mIGhvdyB0aGUgc3lzdGVtIGxvb2tzIHVuZGVyIGZvdXIgY29tbW9uIAorICAgICAgICBsb29rIGFuZCBmZWVsczogPEEgSFJFRj0iI1dpbmRvd3MiPldpbmRvd3M8L0E+LCA8QSBIUkVGPSIjTWV0YWwiPk1ldGFsPC9BPiwgCisgICAgICAgIDxBIEhSRUY9IiNNYWMiPk1hYyBPU1ggKGFxdWEpPC9BPiwgYW5kIDxBIEhSRUY9IiNNb3RpZiI+TW90aWY8L0E+LjwvUD4KKyAgICAgIDxQPjxCPjxhIG5hbWU9IldpbmRvd3MiPldpbmRvd3M8L0E+PC9CPjwvUD4KKyAgICAgIDxQPjxJTUcgU1JDPSJpbWFnZXMvc2NyZWVuc2hvdHMvbGFmX3dpbmRvd3MuZ2lmIiBXSURUSD0iNjAwIiBIRUlHSFQ9IjQ0NCI+PC9QPgorICAgICAgPFA+PEI+PGEgbmFtZT0iTWV0YWwiPk1ldGFsPC9BPjwvQj48L1A+CisgICAgICA8UD48SU1HIFNSQz0iaW1hZ2VzL3NjcmVlbnNob3RzL2xhZl9tZXRhbC5naWYiIFdJRFRIPSI2MDAiIEhFSUdIVD0iNDQ0Ij48L1A+CisgICAgICA8UD48Qj48YSBuYW1lPSJNYWMiPk1hYyBPU1ggKGFxdWEpPC9BPjwvQj48L1A+CisgICAgICA8UD4mbmJzcDs8L1A+CisgICAgICA8UD48Qj48YSBuYW1lPSJNb3RpZiI+TW90aWY8L0E+PC9CPjwvUD4KKyAgICAgIDxQPjxJTUcgU1JDPSJpbWFnZXMvc2NyZWVuc2hvdHMvbGFmX21vdGlmLmdpZiIgV0lEVEg9IjYwMCIgSEVJR0hUPSI0NDQiPjwvUD4KKyAgICAgIDwhLS0gI0VuZEVkaXRhYmxlIC0tPjwvVEQ+CisJPC9UUj4KKwk8VFI+CisJCTxURCBCQUNLR1JPVU5EPSJpbWFnZXMvdGVtcGxhdGVfbGwuZ2lmIiBIRUlHSFQ9IjQwIiBXSURUSD0iMjAwIj4KKwkJCTwhLS0gQ29tbWVudCAtLT4KKwkJPC9URD4KKwkJPFREIFdJRFRIPSI4MCI+CisJCQk8IS0tIENvbW1lbnQgLS0+CisJCTwvVEQ+CisJCTxURD4KKwkJCTxDRU5URVI+PFNQQU4gQ0xBU1M9IkNvcHlyaWdodCI+Q29weXJpZ2h0IDIwMDAtMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzLCBBbGwgUmlnaHRzIFJlc2VydmVkPC9TUEFOPjwvQ0VOVEVSPgorCQk8L1REPgorCTwvVFI+Cis8L1RBQkxFPgorCis8L0JPRFk+Cis8IS0tICNFbmRUZW1wbGF0ZSAtLT48L0hUTUw+CmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9tZW51Lmh0bWwgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy9tZW51Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBhYzRjNAotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL21lbnUuaHRtbApAQCAtMCwwICsxLDI1NyBAQAorPEhUTUw+PCEtLSAjQmVnaW5UZW1wbGF0ZSAiL1RlbXBsYXRlcy9NYWluVGVtcGxhdGUuZHd0IiAtLT4KKzxIRUFEPgorPCEtLSAjQmVnaW5FZGl0YWJsZSAiZG9jdGl0bGUiIC0tPiAKKzxUSVRMRT5SQiBNYW5hZ2VyIC0gTWVudSBJdGVtczwvVElUTEU+Cis8IS0tICNFbmRFZGl0YWJsZSAtLT4gCis8TUVUQSBIVFRQLUVRVUlWPSJDb250ZW50LVR5cGUiIENPTlRFTlQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzxTVFlMRSBUWVBFPSJURVhUL0NTUyI+Cis8IS0tCisudG9waWNIZWFkIHsgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOyBmb250LXNpemU6IDE0cHQ7IGZvbnQtd2VpZ2h0OiBib2xkOyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiAjMzMzMzMzfQorLnRvcGljTGlzdCB7ICBmb250LWZhbWlseTogR2VvcmdpYSwgIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsgZm9udC1zaXplOiA5cHQ7IGNvbG9yOiAjRkYwMDk5OyBsaXN0LXN0eWxlLWltYWdlOiAgdXJsKGltYWdlcy9kaWFtb25kX2J1bGxldC5naWYpOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IGZvbnQtd2VpZ2h0OiBib2xkfQorLm1haW5CbG9jayB7ICBmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMnB0OyBtYXJnaW4tdG9wOiA1cHg7IG1hcmdpbi1yaWdodDogNXB4OyBtYXJnaW4tYm90dG9tOiA1cHg7IG1hcmdpbi1sZWZ0OiA1cHg7IHBhZGRpbmctdG9wOiA1cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7IHBhZGRpbmctYm90dG9tOiA1cHg7IHBhZGRpbmctbGVmdDogMTBweDsgdGV4dC1hbGlnbjoganVzdGlmeX0KKy0tPgorPC9TVFlMRT4KKzwvSEVBRD4KKworPEJPRFkgQkdDT0xPUj0iI0ZGRkZGRiIgTEVGVE1BUkdJTj0iMCIgVE9QTUFSR0lOPSIwIiBNQVJHSU5XSURUSD0iMCIgTUFSR0lOSEVJR0hUPSIwIj4KKzxUQUJMRSBXSURUSD0iMTAwJSIgQk9SREVSPSIwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjAiPgorICA8VFI+CisgICAgPFREIFJPV1NQQU49IjIiIENPTFNQQU49IjIiIEJBQ0tHUk9VTkQ9ImltYWdlcy90ZW1wbGF0ZV91bC5naWYiIEhFSUdIVD0iNzUiPjxJTUcgU1JDPSJpbWFnZXMvc3BhY2VyLmdpZiIgV0lEVEg9IjI4MCIgSEVJR0hUPSIxIiBIU1BBQ0U9IjAiPjwvVEQ+CisJCTxURCBIRUlHSFQ9IjE1IiAgV0lEVEg9IjEwMCUiIEJBQ0tHUk9VTkQ9ImltYWdlcy90ZW1wbGF0ZV91LmdpZiI+PC9URD4KKwk8L1RSPgorCTxUUj4KKwkJPFREIEhFSUdIVD0iNjAiID4KKwkJCTxDRU5URVI+PElNRyBTUkM9ImltYWdlcy9UaXRsZUxvZ29fdHJhbnNwYXJlbnQuZ2lmIiBWU1BBQ0U9IjAiPjwvQ0VOVEVSPgorCQk8L1REPgorCTwvVFI+CisJPFRSPgorCQkKKyAgICA8VEQgV0lEVEg9IjIwMCIgQkFDS0dST1VORD0iaW1hZ2VzL3RlbXBsYXRlX2wuZ2lmIiBWQUxJR049InRvcCI+CisJCTxUQUJMRSBXSURUSD0iMTgwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjEiPiAKKyAgICAgIAk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljSGVhZCI+R2VuZXJhbDwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBWQUxJR049ImNlbnRlciI+PElNRyBTUkM9ImltYWdlcy90ZW1wbGF0ZV9saW5lLmdpZiI+PC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0xpc3QiPgorCSAgICAgICAgPFVMPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0ic3lzdGVtX3JlcXVpcmVtZW50cy5odG1sIj5TeXN0ZW0gUmVxdWlyZW1lbnRzPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJmYXEuaHRtbCI+RkFRPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJmdXR1cmVfZmVhdHVyZXMuaHRtbCI+RnV0dXJlIFJlbGVhc2VzPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMSSBDTEFTUz0idG9waWNMaXN0Ij48QSBIUkVGPSJmdXR1cmVfZmVhdHVyZXMuaHRtbCI+VmVyc2lvbiAKKyAgICAgICAgICAgICAgICBIaXN0b3J5PC9BPjwvTEk+CisgICAgICAgICAgICA8L1VMPgorCQkJPC9URD4KKwkJPC9UUj4KKyAgICAgIAk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljSGVhZCI+UkIgTWFuYWdlcjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBWQUxJR049ImNlbnRlciI+PElNRyBTUkM9ImltYWdlcy90ZW1wbGF0ZV9saW5lLmdpZiI+PC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0xpc3QiPgorCSAgICAgICAgPFVMPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iaW5kZXguaHRtbCI+SG9tZTwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0idHV0b3JpYWwvaW5kZXguaHRtbCI+VHV0b3JpYWw8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9InZpZXdzL2luZGV4Lmh0bWwiPkZ1bmN0aW9uYWxpdHkgYW5kIFZpZXdzPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJsb29rYW5kZmVlbC5odG1sIj5Mb29rIGFuZCBGZWVsPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJtZW51Lmh0bWwiPk1lbnUgSXRlbXM8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJIENMQVNTPSJ0b3BpY0xpc3QiPjxBIEhSRUY9InR1dG9yaWFsL3N0ZXAxLmh0bWwiPlByZWZlcmVuY2VzPC9BPjwvTEk+CisgICAgICAgICAgICA8L1VMPgorCQkJPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0hlYWQiPlJCIFJlcG9ydGVyPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIFZBTElHTj0iY2VudGVyIj48SU1HIFNSQz0iaW1hZ2VzL3RlbXBsYXRlX2xpbmUuZ2lmIj48L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljTGlzdCI+CisJICA8VUw+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJSQlJlcG9ydGVyLmh0bWwiPkhvbWU8L0E+PC9MST4KKyAgICAgICAgPExJPlJlcG9ydCBUeXBlczwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJzY2FuZmlsZS5odG1sIj5Db2RlIFNjYW5uaW5nPC9BPjwvTEk+CisgICAgICAgICAgICA8L1VMPgorCQkJPC9URD4KKwkJPC9UUj4KKwk8L1RBQkxFPgorCisgICAgICA8UD4mbmJzcDsgPC9QPgorICAgICAgPC9URD4KKwkJCisgICAgPFREIENPTFNQQU49IjIiIFZBTElHTj0idG9wIiBDTEFTUz0ibWFpbkJsb2NrIj48IS0tICNCZWdpbkVkaXRhYmxlICJNYWluIiAtLT4gCisgICAgICA8SDIgQUxJR049IkNFTlRFUiI+UkIgTWFuYWdlciAtIE1lbnUgSXRlbXM8L0gyPgorICAgICAgPFRBQkxFIEJPUkRFUj0iMCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSIyIj4KKyAgICAgICAgPFRSIFZBTElHTj0iVE9QIj4gCisgICAgICAgICAgPFREIENPTFNQQU49IjIiPiAKKyAgICAgICAgICAgIDxQPjxCPlRoZSBGaWxlIE1lbnU8L0I+PC9QPgorICAgICAgICAgIDwvVEQ+CisgICAgICAgIDwvVFI+CisgICAgICAgIDxUUiBWQUxJR049IlRPUCI+IAorICAgICAgICAgIDxURCBDT0xTUEFOPSIyIj48SU1HIFNSQz0iaW1hZ2VzL3NjcmVlbnNob3RzL21lbnVfZmlsZS5naWYiIFdJRFRIPSIyNTgiIEhFSUdIVD0iMjE5IiBWU1BBQ0U9IjUiIEhTUEFDRT0iNSI+PC9URD4KKyAgICAgICAgPC9UUj4KKyAgICAgICAgPFRSIFZBTElHTj0iVE9QIj4gCisgICAgICAgICAgPFREPjxJPk5ldyBSZXNvdXJjZSBCdW5kbGUuLi48L0k+PC9URD4KKyAgICAgICAgICA8VEQ+Q3JlYXRlIGEgbmV3IHJlc291cmNlIGJ1bmRsZS4gWW91IHdpbGwgbmVlZCB0byBzZWxlY3QgdGhlIGJhc2UgY2xhc3MgCisgICAgICAgICAgICBuYW1lIGZvciB0aGlzIGJ1bmRsZS48L1REPgorICAgICAgICA8L1RSPgorICAgICAgICA8VFIgVkFMSUdOPSJUT1AiPiAKKyAgICAgICAgICA8VEQ+PEk+T3BlbiBSZXNvdXJjZSBCdW5kbGUuLi48L0k+PC9URD4KKyAgICAgICAgICA8VEQ+U2VsZWN0IGEgcmVzb3VyY2UgYnVuZGxlIGZyb20gdGhlIGZpbGUgc3lzZXRlbS4gVGhlIGJ1bmRsZSBzaG91bGQgCisgICAgICAgICAgICBoYXZlIGJlZW4gb25lIGNyZWF0ZWQgYnkgUkIgTWFuYWdlciwgb3RoZXJ3aXNlIHVzZSB0aGUgTWVyZ2Ugb3B0aW9uLjwvVEQ+CisgICAgICAgIDwvVFI+CisgICAgICAgIDxUUiBWQUxJR049IlRPUCI+IAorICAgICAgICAgIDxURD48ST5TYXZlIFJlc291cmNlIEJ1bmRsZTwvST48L1REPgorICAgICAgICAgIDxURD5TYXZlIHRoZSBidW5kbGUgdG8gdGhlIGZpbGUgc3lzdGVtLjwvVEQ+CisgICAgICAgIDwvVFI+CisgICAgICAgIDxUUiBWQUxJR049IlRPUCI+IAorICAgICAgICAgIDxURD48ST5TYXZlIFJlc291cmNlIEJ1bmRsZSBBcy4uLjwvST48L1REPgorICAgICAgICAgIDxURD5TYXZlIHRoZSByZXNvdXJjZSBidW5kbGUgaW4gYSBzZWxlY3RlZCBsb2NhdGlvbiB3aXRoaW4gdGhlIGZpbGUgCisgICAgICAgICAgICBzeXN0ZW0uPC9URD4KKyAgICAgICAgPC9UUj4KKyAgICAgICAgPFRSIFZBTElHTj0iVE9QIj4gCisgICAgICAgICAgPFREIENPTFNQQU49IjIiPjxJTUcgU1JDPSJpbWFnZXMvc2NyZWVuc2hvdHMvbWVudV9maWxlX2ltcG9ydC5naWYiIFdJRFRIPSI0NTQiIEhFSUdIVD0iMjE5IiBWU1BBQ0U9IjUiIEhTUEFDRT0iNSI+PC9URD4KKyAgICAgICAgPC9UUj4KKyAgICAgICAgPFRSIFZBTElHTj0iVE9QIj4gCisgICAgICAgICAgPFREPjxJPjxCPk1lcmdlIFRvIFJlc291cmNlIEJ1bmRsZTwvQj48L0k+PC9URD4KKyAgICAgICAgICA8VEQ+SW1wb3J0IHJlc291cmNlIGJ1bmRsZXMgZnJvbSBkaWZmZXJlbnQgZm9ybWF0cyBhbmQgbWVyZ2UgdGhlbSB3aXRoIAorICAgICAgICAgICAgdGhlIGN1cnJlbnRseSBvcGVuIHJlc291cmNlIGJ1bmRsZS48L1REPgorICAgICAgICA8L1RSPgorICAgICAgICA8VFIgVkFMSUdOPSJUT1AiPiAKKyAgICAgICAgICA8VEQ+PEk+PElNRyBTUkM9ImltYWdlcy9hcnJvd19idWxsZXQuZ2lmIiBXSURUSD0iMTIiIEhFSUdIVD0iMTAiPlNpbXBsZSAKKyAgICAgICAgICAgIFJlc291cmNlIEJ1bmRsZXMuLi48L0k+PC9URD4KKyAgICAgICAgICA8VEQ+SW1wb3J0IGZyb20gb3RoZXIgcmVzb3VyY2UgYnVuZGxlcyBtYWRlIHVwIG9mIC5wcm9wZXJ0aWVzIHRleHQgZmlsZXMgCisgICAgICAgICAgICBjcmVhdGVkIGJ5IFJCIE1hbmFnZXIgb3Igbm90LjwvVEQ+CisgICAgICAgIDwvVFI+CisgICAgICAgIDxUUiBWQUxJR049IlRPUCI+IAorICAgICAgICAgIDxURD48ST48SU1HIFNSQz0iaW1hZ2VzL2Fycm93X2J1bGxldC5naWYiIFdJRFRIPSIxMiIgSEVJR0hUPSIxMCI+VE1YIAorICAgICAgICAgICAgRG9jdW1lbnRzLi4uPC9JPjwvVEQ+CisgICAgICAgICAgPFREPkltcG9ydCBmcm9tIFhNTCBkb2N1bWVudHMgdGhhdCBjb25mb3JtIHRvIHRoZSBUTVggc3BlY2lmaWNhdGlvbiAKKyAgICAgICAgICAgIGNyZWF0ZWQgYnkgdGhlIExJU0EgZ3JvdXAuPC9URD4KKyAgICAgICAgPC9UUj4KKyAgICAgICAgPFRSIFZBTElHTj0iVE9QIj4gCisgICAgICAgICAgPFREIENPTFNQQU49IjIiPjxJTUcgU1JDPSJpbWFnZXMvc2NyZWVuc2hvdHMvbWVudV9maWxlX2V4cG9ydC5naWYiIFdJRFRIPSI0MzkiIEhFSUdIVD0iMjE5IiBWU1BBQ0U9IjUiIEhTUEFDRT0iNSI+PC9URD4KKyAgICAgICAgPC9UUj4KKyAgICAgICAgPFRSIFZBTElHTj0iVE9QIj4gCisgICAgICAgICAgPFREPjxJPjxCPkV4cG9ydCBSZXNvdXJjZSBCdW5kbGVzPC9CPjwvST48L1REPgorICAgICAgICAgIDxURD5TYXZlIHRoZSB0cmFuc2xhdGlvbnMgaW4gb3RoZXIgZm9ybWF0cy48L1REPgorICAgICAgICA8L1RSPgorICAgICAgICA8VFIgVkFMSUdOPSJUT1AiPiAKKyAgICAgICAgICA8VEQ+PEk+PElNRyBTUkM9ImltYWdlcy9hcnJvd19idWxsZXQuZ2lmIiBXSURUSD0iMTIiIEhFSUdIVD0iMTAiPkNvbXBpbGFibGUgCisgICAgICAgICAgICBKYXZhIEZpbGVzLi4uPC9JPjwvVEQ+CisgICAgICAgICAgPFREPkV4cG9ydCB0byBjb21waWxhYmxlIGphdmEgY2xhc3MgZmlsZXMgdGhhdCBleHRlbmQgdGhlIExpc3RSZXNvdXJjZUJ1bmRsZSAKKyAgICAgICAgICAgIGNsYXNzLiA8L1REPgorICAgICAgICA8L1RSPgorICAgICAgICA8VFIgVkFMSUdOPSJUT1AiPiAKKyAgICAgICAgICA8VEQ+PEk+PElNRyBTUkM9ImltYWdlcy9hcnJvd19idWxsZXQuZ2lmIiBXSURUSD0iMTIiIEhFSUdIVD0iMTAiPk1pbmltYWwgCisgICAgICAgICAgICBQcm9wZXJ0aWVzIEZpbGVzLi4uPC9JPjwvVEQ+CisgICAgICAgICAgPFREPkV4cG9ydCB0byAucHJvcGVydGllcyB0ZXh0IGZpbGVzIGp1c3QgYXMgaW4gdGhlIFNhdmUgb3B0aW9uLCBleGNlcHQgCisgICAgICAgICAgICB0aGF0IHRoZXNlIGZpbGVzIHdpbGwgYmUgc3RyaXBwZWQgb2YgYWxsIHVubmVjZXNzYXJ5IG1ldGEgZGF0YS48L1REPgorICAgICAgICA8L1RSPgorICAgICAgICA8VFIgVkFMSUdOPSJUT1AiPiAKKyAgICAgICAgICA8VEQ+PEk+PElNRyBTUkM9ImltYWdlcy9hcnJvd19idWxsZXQuZ2lmIiBXSURUSD0iMTIiIEhFSUdIVD0iMTAiPlRNWCAKKyAgICAgICAgICAgIERvY3VtZW50cy4uLjwvST48L1REPgorICAgICAgICAgIDxURD5FeHBvcnQgdG8gWE1MIGRvY3VtZW50cyB0aGF0IGNvbmZvcm0gdG8gdGhlIFRNWCBzcGVjaWZpY2F0aW9uIGNyZWF0ZWQgCisgICAgICAgICAgICBieSB0aGUgTElTQSBncm91cC48L1REPgorICAgICAgICA8L1RSPgorICAgICAgICA8VFIgVkFMSUdOPSJUT1AiPiAKKyAgICAgICAgICA8VEQgQ09MU1BBTj0iMiI+PElNRyBTUkM9ImltYWdlcy9zcGFjZXIuZ2lmIiBXSURUSD0iMTUiIEhFSUdIVD0iMTUiPjwvVEQ+CisgICAgICAgIDwvVFI+CisgICAgICAgIDxUUiBWQUxJR049IlRPUCI+IAorICAgICAgICAgIDxURCBDT0xTUEFOPSIyIj48Qj5UaGUgT3B0aW9ucyBNZW51PC9CPjwvVEQ+CisgICAgICAgIDwvVFI+CisgICAgICAgIDxUUiBWQUxJR049IlRPUCI+IAorICAgICAgICAgIDxURCBDT0xTUEFOPSIyIj48SU1HIFNSQz0iaW1hZ2VzL3NjcmVlbnNob3RzL21lbnVfb3B0aW9ucy5naWYiIFdJRFRIPSIyMTEiIEhFSUdIVD0iMTExIiBWU1BBQ0U9IjUiIEhTUEFDRT0iNSI+PC9URD4KKyAgICAgICAgPC9UUj4KKyAgICAgICAgPFRSIFZBTElHTj0iVE9QIj4gCisgICAgICAgICAgPFREPjxJPkFkZCBOZXcgRW50cnkuLi48L0k+PC9URD4KKyAgICAgICAgICA8VEQ+Q3JlYXRlIGEgbmV3IHJlc291cmNlIGZvciB0aGUgZW50aXJlIHJlc291cmNlIGJ1bmRsZS48L1REPgorICAgICAgICA8L1RSPgorICAgICAgICA8VFIgVkFMSUdOPSJUT1AiPiAKKyAgICAgICAgICA8VEQ+PEk+QWRkIE5ldyBHcm91cC4uLjwvST48L1REPgorICAgICAgICAgIDxURD5DcmVhdGUgYSBuZXcgcmVzb3VyY2UgZ3JvdXAgZm9yIHRoZSBlbnRpcmUgcmVzb3VyY2UgYnVuZGxlLjwvVEQ+CisgICAgICAgIDwvVFI+CisgICAgICAgIDxUUiBWQUxJR049IlRPUCI+IAorICAgICAgICAgIDxURD48ST5BZGQgTmV3IFJlc291cmNlIEZpbGUuLi48L0k+PC9URD4KKyAgICAgICAgICA8VEQ+Q3JlYXRlIGEgbmV3IHJlc291cmNlIGZpbGUgZm9yIHRoZSByZXNvdXJjZSBidW5kbGUuIE9wdGlvbmFsbHkgc2VsZWN0IAorICAgICAgICAgICAgd2hldGhlciBvciBub3QgdG8gcG9wdWxhdGUgdGhpcyBmaWxlIHdpdGggY3VycmVudGx5IGRlZmluZWQgcmVzb3VyY2VzLjwvVEQ+CisgICAgICAgIDwvVFI+CisgICAgICAgIDxUUiBWQUxJR049IlRPUCI+IAorICAgICAgICAgIDxURD48ST5QcmVmZXJlbmNlcy4uLjwvST48L1REPgorICAgICAgICAgIDxURD5CcmluZyB1cCB0aGUgcHJlZmVyZW5jZXMgZGlhbG9nIGJveC48L1REPgorICAgICAgICA8L1RSPgorICAgICAgICA8VFIgVkFMSUdOPSJUT1AiPiAKKyAgICAgICAgICA8VEQgQ09MU1BBTj0iMiI+PElNRyBTUkM9ImltYWdlcy9zcGFjZXIuZ2lmIiBXSURUSD0iMTUiIEhFSUdIVD0iMTUiPjwvVEQ+CisgICAgICAgIDwvVFI+CisgICAgICAgIDxUUiBWQUxJR049IlRPUCI+IAorICAgICAgICAgIDxURCBDT0xTUEFOPSIyIj48Qj5UaGUgSGVscCBNZW51PC9CPjwvVEQ+CisgICAgICAgIDwvVFI+CisgICAgICAgIDxUUiBWQUxJR049IlRPUCI+IAorICAgICAgICAgIDxURCBDT0xTUEFOPSIyIj48SU1HIFNSQz0iaW1hZ2VzL3NjcmVlbnNob3RzL21lbnVfaGVscC5naWYiIFdJRFRIPSIzNTMiIEhFSUdIVD0iNDYiIFZTUEFDRT0iNSIgSFNQQUNFPSI1Ij48L1REPgorICAgICAgICA8L1RSPgorICAgICAgICA8VFIgVkFMSUdOPSJUT1AiPiAKKyAgICAgICAgICA8VEQ+PEk+QWJvdXQgUmVzb3VyY2UgQnVuZGxlIE1hbmFnZXIuLi48L0k+PC9URD4KKyAgICAgICAgICA8VEQ+QnJpbmdzIHVwIGEgZGlhbG9nIGJveCBkaXNwbGF5aW5nIHRoZSB2ZXJzaW9uIG9mIFJCIE1hbmFnZXIgYW5kIAorICAgICAgICAgICAgb3RoZXIgaW5mb3JtYXRpb24uPC9URD4KKyAgICAgICAgPC9UUj4KKyAgICAgICAgPFRSIFZBTElHTj0iVE9QIj4gCisgICAgICAgICAgPFREIENPTFNQQU49IjIiPjxJTUcgU1JDPSJpbWFnZXMvc3BhY2VyLmdpZiIgV0lEVEg9IjE1IiBIRUlHSFQ9IjE1Ij48L1REPgorICAgICAgICA8L1RSPgorICAgICAgICA8VFIgVkFMSUdOPSJUT1AiPiAKKyAgICAgICAgICA8VEQgQ09MU1BBTj0iMiI+PEI+VGhlIFJlc291cmNlIEZpbGUgUG9wdXAgTWVudTwvQj48L1REPgorICAgICAgICA8L1RSPgorICAgICAgICA8VFIgVkFMSUdOPSJUT1AiPiAKKyAgICAgICAgICA8VEQgQ09MU1BBTj0iMiI+PElNRyBTUkM9ImltYWdlcy9zY3JlZW5zaG90cy9tZW51X3BvcHVwX3RyZWUuZ2lmIiBXSURUSD0iNjcxIiBIRUlHSFQ9IjU0MyIgVlNQQUNFPSI1IiBIU1BBQ0U9IjUiPjwvVEQ+CisgICAgICAgIDwvVFI+CisgICAgICAgIDxUUiBWQUxJR049IlRPUCI+IAorICAgICAgICAgIDxURD48ST48Qj5SZXNvdXJjZSBGaWxlIFBvcHVwIE1lbnU8L0I+PC9JPjwvVEQ+CisgICAgICAgICAgPFREPlBvcHMgdXAgZnJvbSBhbiBpbmRpdmlkdWFsIHJlc291cmNlIGZpbGUuPC9URD4KKyAgICAgICAgPC9UUj4KKyAgICAgICAgPFRSIFZBTElHTj0iVE9QIj4gCisgICAgICAgICAgPFREPjxJPlNhdmUgUmVzb3VyY2UgRmlsZTwvST48L1REPgorICAgICAgICAgIDxURD5TYXZlIG9ubHkgdGhlIHNlbGVjdGVkIHJlc291cmNlIGZpbGUgdG8gdGhlIGZpbGUgc3lzdGVtLjwvVEQ+CisgICAgICAgIDwvVFI+CisgICAgICAgIDxUUiBWQUxJR049IlRPUCI+IAorICAgICAgICAgIDxURD48ST5IaWRlIFJlc291cmNlIEZpbGU8L0k+PC9URD4KKyAgICAgICAgICA8VEQ+UmVtb3ZlIHRoZSBzZWxlY3RlZCByZXNvdXJjZSBmaWxlIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZSB0cmVlLiAKKyAgICAgICAgICAgIEFsbCBmdXR1cmUgY2hhbmdlcyB0byB0aGUgYnVuZGxlIHdpbGwgbm90IGFmZmVjdCB0aGlzIGZpbGUuIFRoaXMgd2lsbCAKKyAgICAgICAgICAgIGFsc28gcmVtb3ZlIGFueSBjaGFuZ2VzIG1hZGUgdG8gdGhlIGZpbGUgc2luY2UgbGFzdCBzYXZpbmcgaXQuPC9URD4KKyAgICAgICAgPC9UUj4KKyAgICAgICAgPFRSIFZBTElHTj0iVE9QIj4gCisgICAgICAgICAgPFREPjxJPkRlbGV0ZSBSZXNvdXJjZSBGaWxlPC9JPjwvVEQ+CisgICAgICAgICAgPFREPklmIHRoZSBvcGVyYXRpbmcgc3lzdGVtIGFsbG93cywgZGVsZXRlcyB0aGUgcmVzb3VyY2UgZmlsZSBmcm9tIHRoZSAKKyAgICAgICAgICAgIGZpbGUgc3lzdGVtLiBUaGlzIGlzIGEgcGVybWFuZW50IGNoYW5nZSBhbmQgY2FuIG5vdCBiZSB1bmRvbmUuPC9URD4KKyAgICAgICAgPC9UUj4KKyAgICAgIDwvVEFCTEU+CisgICAgICA8UD4mbmJzcDs8L1A+CisgICAgICA8UD4mbmJzcDs8L1A+CisgICAgICA8UD4mbmJzcDs8L1A+CisgICAgICA8UD4mbmJzcDs8L1A+CisgICAgICA8UD4mbmJzcDs8L1A+CisgICAgICA8UD4mbmJzcDs8L1A+CisgICAgICA8UD4mbmJzcDs8L1A+CisgICAgICA8UD4mbmJzcDs8L1A+CisgICAgICA8UD4mbmJzcDs8L1A+CisgICAgICA8UD4mbmJzcDs8L1A+CisgICAgICA8UD4mbmJzcDs8L1A+CisgICAgICA8IS0tICNFbmRFZGl0YWJsZSAtLT48L1REPgorCTwvVFI+CisJPFRSPgorCQk8VEQgQkFDS0dST1VORD0iaW1hZ2VzL3RlbXBsYXRlX2xsLmdpZiIgSEVJR0hUPSI0MCIgV0lEVEg9IjIwMCI+CisJCQk8IS0tIENvbW1lbnQgLS0+CisJCTwvVEQ+CisJCTxURCBXSURUSD0iODAiPgorCQkJPCEtLSBDb21tZW50IC0tPgorCQk8L1REPgorCQk8VEQ+CisJCQk8Q0VOVEVSPjxTUEFOIENMQVNTPSJDb3B5cmlnaHQiPkNvcHlyaWdodCAyMDAwLTIwMDEgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcywgQWxsIFJpZ2h0cyBSZXNlcnZlZDwvU1BBTj48L0NFTlRFUj4KKwkJPC9URD4KKwk8L1RSPgorPC9UQUJMRT4KKworPC9CT0RZPgorPCEtLSAjRW5kVGVtcGxhdGUgLS0+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3Mvc2NhbmZpbGUuaHRtbCBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL3NjYW5maWxlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUxYjMxNQotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL3NjYW5maWxlLmh0bWwKQEAgLTAsMCArMSwxOTUgQEAKKzxIVE1MPjwhLS0gI0JlZ2luVGVtcGxhdGUgIi9UZW1wbGF0ZXMvTWFpblRlbXBsYXRlLmR3dCIgLS0+Cis8SEVBRD4KKzwhLS0gI0JlZ2luRWRpdGFibGUgImRvY3RpdGxlIiAtLT4gCis8VElUTEU+UkJSZXBvcnRlciBTY2FuIEZpbGU8L1RJVExFPgorPCEtLSAjRW5kRWRpdGFibGUgLS0+IAorPE1FVEEgSFRUUC1FUVVJVj0iQ29udGVudC1UeXBlIiBDT05URU5UPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8U1RZTEUgVFlQRT0iVEVYVC9DU1MiPgorPCEtLQorLnRvcGljSGVhZCB7ICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsgZm9udC1zaXplOiAxNHB0OyBmb250LXdlaWdodDogYm9sZDsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogIzMzMzMzM30KKy50b3BpY0xpc3QgeyAgZm9udC1mYW1pbHk6IEdlb3JnaWEsICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7IGZvbnQtc2l6ZTogOXB0OyBjb2xvcjogI0ZGMDA5OTsgbGlzdC1zdHlsZS1pbWFnZTogIHVybChpbWFnZXMvZGlhbW9uZF9idWxsZXQuZ2lmKTsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyBmb250LXdlaWdodDogYm9sZH0KKy5tYWluQmxvY2sgeyAgZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTJwdDsgbWFyZ2luLXRvcDogNXB4OyBtYXJnaW4tcmlnaHQ6IDVweDsgbWFyZ2luLWJvdHRvbTogNXB4OyBtYXJnaW4tbGVmdDogNXB4OyBwYWRkaW5nLXRvcDogNXB4OyBwYWRkaW5nLXJpZ2h0OiAxMHB4OyBwYWRkaW5nLWJvdHRvbTogNXB4OyBwYWRkaW5nLWxlZnQ6IDEwcHg7IHRleHQtYWxpZ246IGp1c3RpZnl9CistLT4KKzwvU1RZTEU+Cis8L0hFQUQ+CisKKzxCT0RZIEJHQ09MT1I9IiNGRkZGRkYiIExFRlRNQVJHSU49IjAiIFRPUE1BUkdJTj0iMCIgTUFSR0lOV0lEVEg9IjAiIE1BUkdJTkhFSUdIVD0iMCI+Cis8VEFCTEUgV0lEVEg9IjEwMCUiIEJPUkRFUj0iMCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSIwIj4KKyAgPFRSPgorICAgIDxURCBST1dTUEFOPSIyIiBDT0xTUEFOPSIyIiBCQUNLR1JPVU5EPSJpbWFnZXMvdGVtcGxhdGVfdWwuZ2lmIiBIRUlHSFQ9Ijc1Ij48SU1HIFNSQz0iaW1hZ2VzL3NwYWNlci5naWYiIFdJRFRIPSIyODAiIEhFSUdIVD0iMSIgSFNQQUNFPSIwIj48L1REPgorCQk8VEQgSEVJR0hUPSIxNSIgIFdJRFRIPSIxMDAlIiBCQUNLR1JPVU5EPSJpbWFnZXMvdGVtcGxhdGVfdS5naWYiPjwvVEQ+CisJPC9UUj4KKwk8VFI+CisJCTxURCBIRUlHSFQ9IjYwIiA+CisJCQk8Q0VOVEVSPjxJTUcgU1JDPSJpbWFnZXMvVGl0bGVMb2dvX3RyYW5zcGFyZW50LmdpZiIgVlNQQUNFPSIwIj48L0NFTlRFUj4KKwkJPC9URD4KKwk8L1RSPgorCTxUUj4KKwkJCisgICAgPFREIFdJRFRIPSIyMDAiIEJBQ0tHUk9VTkQ9ImltYWdlcy90ZW1wbGF0ZV9sLmdpZiIgVkFMSUdOPSJ0b3AiPgorCQk8VEFCTEUgV0lEVEg9IjE4MCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSIxIj4gCisgICAgICAJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0hlYWQiPkdlbmVyYWw8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgVkFMSUdOPSJjZW50ZXIiPjxJTUcgU1JDPSJpbWFnZXMvdGVtcGxhdGVfbGluZS5naWYiPjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNMaXN0Ij4KKwkgICAgICAgIDxVTD4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9InN5c3RlbV9yZXF1aXJlbWVudHMuaHRtbCI+U3lzdGVtIFJlcXVpcmVtZW50czwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iZmFxLmh0bWwiPkZBUTwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iZnV0dXJlX2ZlYXR1cmVzLmh0bWwiPkZ1dHVyZSBSZWxlYXNlczwvQT48L0xJPgorICAgICAgICAgICAgICA8TEkgQ0xBU1M9InRvcGljTGlzdCI+PEEgSFJFRj0iZnV0dXJlX2ZlYXR1cmVzLmh0bWwiPlZlcnNpb24gCisgICAgICAgICAgICAgICAgSGlzdG9yeTwvQT48L0xJPgorICAgICAgICAgICAgPC9VTD4KKwkJCTwvVEQ+CisJCTwvVFI+CisgICAgICAJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0hlYWQiPlJCIE1hbmFnZXI8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgVkFMSUdOPSJjZW50ZXIiPjxJTUcgU1JDPSJpbWFnZXMvdGVtcGxhdGVfbGluZS5naWYiPjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNMaXN0Ij4KKwkgICAgICAgIDxVTD4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9ImluZGV4Lmh0bWwiPkhvbWU8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9InR1dG9yaWFsL2luZGV4Lmh0bWwiPlR1dG9yaWFsPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJ2aWV3cy9pbmRleC5odG1sIj5GdW5jdGlvbmFsaXR5IGFuZCBWaWV3czwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0ibG9va2FuZGZlZWwuaHRtbCI+TG9vayBhbmQgRmVlbDwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0ibWVudS5odG1sIj5NZW51IEl0ZW1zPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMSSBDTEFTUz0idG9waWNMaXN0Ij48QSBIUkVGPSJ0dXRvcmlhbC9zdGVwMS5odG1sIj5QcmVmZXJlbmNlczwvQT48L0xJPgorICAgICAgICAgICAgPC9VTD4KKwkJCTwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNIZWFkIj5SQiBSZXBvcnRlcjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBWQUxJR049ImNlbnRlciI+PElNRyBTUkM9ImltYWdlcy90ZW1wbGF0ZV9saW5lLmdpZiI+PC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0xpc3QiPgorCSAgPFVMPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iUkJSZXBvcnRlci5odG1sIj5Ib21lPC9BPjwvTEk+CisgICAgICAgIDxMST5SZXBvcnQgVHlwZXM8L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0ic2NhbmZpbGUuaHRtbCI+Q29kZSBTY2FubmluZzwvQT48L0xJPgorICAgICAgICAgICAgPC9VTD4KKwkJCTwvVEQ+CisJCTwvVFI+CisJPC9UQUJMRT4KKworICAgICAgPFA+Jm5ic3A7IDwvUD4KKyAgICAgIDwvVEQ+CisJCQorICAgIDxURCBDT0xTUEFOPSIyIiBWQUxJR049InRvcCIgQ0xBU1M9Im1haW5CbG9jayI+PCEtLSAjQmVnaW5FZGl0YWJsZSAiTWFpbiIgLS0+IAorICAgICAgPEgxIEFMSUdOPSJDRU5URVIiPlJCUmVwb3J0ZXIgU2NhbiBYTUwgQ29uZmlndXJhdGlvbiBGaWxlPC9IMT4KKyAgICAgIDxQPjxCPkludHJvZHVjdGlvbjwvQj48L1A+CisgICAgICA8UD5UaGUgY29uZmlndXJhdGlvbiBmaWxlIGZvciBSQlJlcG9ydGVyIHNjYW5zIGlzIGEgdGV4dCBmaWxlIHN0b3JlZCBpbiAKKyAgICAgICAgWE1MLiBUaGUgZGVzaWduIG9uIHRoZSBmb3JtYXQgZm9yIHRoaXMgY29uZmlndXJhdGlvbiBmaWxlIHdhcyBrZXB0IHNpbXBsZSAKKyAgICAgICAgYW5kIHNvIHRoZSBnZW5lcmFsIGFwcGxpY2F0aW9uIG9mIHRoZSBzY2FubmVyIGlzIG5vdCBtZWFudCBmb3IgY29tcGxpY2F0ZWQgCisgICAgICAgIGFuYWx5c2lzLiBUaGUgZGVzaWduIHdvcmtzIGFyb3VuZCB0aHJlZSB0eXBlcyBvZiBydWxlczogRGlyZWN0b3J5IFJ1bGVzLCAKKyAgICAgICAgRmlsZSBSdWxlcywgYW5kIFBhcnNlIFJ1bGVzLiBFYWNoIG9mIHRoZXNlIHdpbGwgYmUgZXhwbGFpbmVkIGJlbG93LiBGaXJzdCwgCisgICAgICAgIGhlcmUgaXMgYW4gZXhhbXBsZSBmaWxlIGZvciByZWZlcmVuY2UuIFRoaXMgZmlsZSBpcyB0aGUgY29uZmlndXJhdGlvbiAKKyAgICAgICAgZmlsZSB1c2VkIHRvIHNjYW4gdGhlIHJlc291cmNlIGJ1bmRsZSBhc3NvY2lhdGVkIHdpdGggUkJNYW5hZ2VyLjwvUD4KKyAgICAgIDxQPjxCPlNhbXBsZSBTY2FuIEZpbGUgPC9CPihyYm1hbmFnZXJfc2Nhbi54bWw8Qj4pPC9CPjwvUD4KKyAgICAgIDxCTE9DS1FVT1RFPjxDT0RFPgorICAgICAgICA8UFJFPgorJmx0Oz94bWwgdmVyc2lvbj0iMS4wIiA/PgorJmx0O1JCRklMRVNDQU5ORVIgTkFNRT0iUkJNYW5hZ2VyIFNjYW5uZXIiIEZJTEVOQU1FPSJyYm1hbmFnZXJfc2Nhbm5lci54bWwiPgorCSZsdDtGSUxFUlVMRVM+CisJCSZsdDshLS0gIEZpbGVSdWxlcyBjYW4gaGF2ZSBhdHRyaWJ1dGVzIHN0YXJ0c193aXRoLCBlbmRzX3dpdGgsIGFuZCBjb250YWlucyAtLT4KKwkJJmx0O0ZJTEVSVUxFIE5BTUU9IkphdmEgRmlsZSIgRU5EU19XSVRIPSIuamF2YSIgLz4KKwkJJmx0O0ZJTEVSVUxFIE5BTUU9IlhTTCBGaWxlIiBFTkRTX1dJVEg9Ii54c2wiIC8+CisJJmx0Oy9GSUxFUlVMRVM+CisJJmx0O1BBUlNFUlVMRVM+CisJCSZsdDshLS0gIFBhcnNlUnVsZXMgY2FuIGhhdmUgYXR0cmlidXRlcyBmb2xsb3dzIGFuZCBwcmVjZWRlcyAtLT4gCisJCSZsdDtQQVJTRVJVTEUgTkFNRT0iSmF2YSBzdGF0aWMgcmVzb3VyY2UiIEZPTExPV1M9IlJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigmYW1wO3F1b3Q7IiBQUkVDRURFUz0iJmFtcDtxdW90OyIgLz4gCisJJmx0Oy9QQVJTRVJVTEVTPgorCSZsdDtTQ0FOPgorCQkmbHQ7RElSRUNUT1JZIExPQ0FUSU9OPSJcQzpcRGV2ZWxvcG1lbnRcUkJNYW5hZ2VyXFNvdXJjZSIgUkVDVVJTRV9ESVJFQ1RPUklFUz0idHJ1ZSI+IAorCQkJJmx0O1JVTEVTPgorCQkJCSZsdDtBUFBMWUZJTEVSVUxFIE5BTUU9IkphdmEgRmlsZSI+CisJCQkJCSZsdDtBUFBMWVBBUlNFUlVMRSBOQU1FPSJKYXZhIHN0YXRpYyByZXNvdXJjZSIgLz4KKwkJCQkmbHQ7L0FQUExZRklMRVJVTEU+CisJCQkmbHQ7L1JVTEVTPgorCQkmbHQ7L0RJUkVDVE9SWT4KKwkmbHQ7L1NDQU4+CismbHQ7L1JCRklMRVNDQU5ORVI+CisgICAgICAgIDwvUFJFPgorICAgICAgICA8L0NPREU+PC9CTE9DS1FVT1RFPgorPFA+PEI+RGV0YWlsczwvQj48L1A+CisgICAgICA8UD5UaGUgcm9vdCBlbGVtZW50IG9mIHRoZSBYTUwgZmlsZSBpcyBuYW1lZCAnUkJGSUxFU0NBTk5FUicuIFRoaXMgcm9vdCAKKyAgICAgICAgZWxlbWVudCBoYXMgdHdvIG9wdGlvbmFsIGF0dHJpYnV0ZXMgZm9yIG5hbWluZyB0aGUgc2NhbiBmaWxlIGluIGEgaHVtYW4gCisgICAgICAgIHJlYWRhYmxlIG1hbm5lciBhbmQgc3BlY2lmeWluZyB0aGUgZmlsZSBuYW1lLiBUaGVzZSBhdHRyaWJ1dGVzIGFyZSBmb3IgCisgICAgICAgIHRoZSBkZXZlbG9wZXJzIHJlZmVyZW5jZTsgdGhleSBtZWFuIG5vdGhpbmcgdG8gUkJSZXBvcnRlci4gQmVuZWF0aCB0aGUgCisgICAgICAgIHJvb3QgZWxlbWVudCBhcmUgdGhyZWUgcmVxdWlyZWQgZWxlbWVudHMgJ0ZJTEVSVUxFUycsICdQQVJTRVJVTEVTJyBhbmQgCisgICAgICAgICdTQ0FOJy4gPC9QPgorICAgICAgPFA+QmVuZWF0aCB0aGUgRklMRVJVTEVTIGVsZW1lbnQgYXJlIGZvdW5kIEZJTEVSVUxFIGVsZW1lbnRzLiBBbnkgbnVtYmVyIAorICAgICAgICBvZiB0aGVzZSBydWxlcyBjYW4gYmUgc3BlY2lmaWVkLCB0aG91Z2ggZWFjaCBtdXN0IGhhdmUgYSB1bmlxdWUgbmFtZSBhcyAKKyAgICAgICAgc3BlY2lmaWVkIGluIHRoZSBlbGVtZW50J3MgTkFNRSBhdHRyaWJ1dGUuIEFsb25nIHdpdGggdGhpcyBuYW1lIGF0dHJpYnV0ZSwgCisgICAgICAgIHRoZSBhdHRyaWJ1dGVzIFNUQVJUU19XSVRILCBFTkRTX1dJVEgsIGFuZCBDT05UQUlOUyBtYXkgYmUgb3B0aW9uYWxseSAKKyAgICAgICAgc3BlY2lmaWVkLiBUaGVzZSBhcmUgdGhlIHJ1bGVzIGFwcGxpZWQgdG8gZWFjaCBmaWxlIGluIGEgZGlyZWN0b3J5IHRvIAorICAgICAgICBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgdGhleSB3aWxsIGJlIHNjYW5uZWQuIFRoZSBhdHRyaWJ1dGUgcnVsZXMgYXJlIAorICAgICAgICBhcHBsaWVkIHRvIHRoZSBmaWxlIG5hbWVzIG9mIGVhY2ggZmlsZSBpbiB0aGUgZGlyZWN0b3J5IGFuZCBpZiBlYWNoIGlzIAorICAgICAgICBmb3VuZCB0byBiZSB0cnVlLCB0aGF0IGZpbGUgaXMgZXZhbHVhdGVkIGFnYWluc3QgdGhlIHBhcnNlIHJ1bGVzLjwvUD4KKyAgICAgIDxQPkJlbmVhdGggdGhlIFBBUlNFUlVMRVMgZWxlbWVudCBhcmUgZm91bmQgUEFSU0VSVUxFIGVsZW1lbnRzLiBBbnkgbnVtYmVyIAorICAgICAgICBvZiB0aGVzZSBydWxlcyBjYW4gYmUgc3BlY2lmaWVkLCB0aG91Z2ggZWFjaCBtdXN0IGhhdmUgYSB1bmlxdWVzIG5hbWUgCisgICAgICAgIGFzIHNwZWNpZmllZG4gaW4gdGhlIGVsZW1lbnQncyBOQU1FIGF0dHJpbnV0ZS4gQWxvbmcgd2l0aCB0aGlzIG5hbWUgYXR0cmlidXRlLCAKKyAgICAgICAgdGhlIGF0dHJpYnV0ZXMgRk9MTE9XUyBhbmQgUFJFQ0VERVMgbWF5IG9wdGlvbmFsbHkgYmUgc3BlY2lmaWVkLiBUaGVzZSAKKyAgICAgICAgYXJlIHRoZSBydWxlcyBhcHBsaWVkIHRvIGVhY2ggbGluZSBvZiB0ZXh0IGluIGEgc2VsZWN0ZWQgZmlsZSB0byBkZXRlcm1pbmUgCisgICAgICAgIGlmIHRoYXQgbGluZSBvZiB0ZXh0IGNvbnRhaW5zIG9uZSBvciBtb3JlIHJlc291cmNlIGtleXMuPC9QPgorICAgICAgPFA+QmVuZWF0aCB0aGUgU0NBTiBlbGVtZW50IGFyZSBmb3VuZCBESVJFQ1RPUlkgZWxlbWVudHMuIEFueSBudW1iZXIgb2YgCisgICAgICAgIHRoZXNlIGVsZW1lbnRzIGNhbiBiZSBzcGVjaWZpZWQuIFRoZSByZXF1aXJlZCBMT0NBVElPTiBhdHRyaWJ1dGUgc3BlY2lmaWVzIAorICAgICAgICBpbiBhIG1hY2hpbmUgZGVwZW5kZW50IG1hbm5lciB0aGUgbG9jYXRpb24gb2YgYSBkaXJlY3RvcnkgZm9yIHdoaWNoIHRoZSAKKyAgICAgICAgZmlsZXMgYXJlIHRvIGJlIHNjYW5uZWQgZm9yIHJlc291cmNlIGJ1bmRsZXMuIEFuIG9wdGlvbmFsIFJFQ1VSU0VfRElSRUNUT1JJRVMgCisgICAgICAgIGF0dHJpYnV0ZSBtYXkgYmUgc3BlY2lmaWVkLiBJZiB0aGUgdmFsdWUgb2YgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvICd0cnVlJywgCisgICAgICAgIHRoZW4gYWxsIGRpcmVjdG9yaWVzIGJlbmVhdGggdGhlIGRpcmVjdG9yeSBzcGVjaWZpZWQgYXJlIGFsc28gc2Nhbm5lZC48L1A+CisgICAgICA8UD5CZW5lYXRoIGVhY2ggRElSRUNUT1JZIGVsZW1lbnQsIGV4YWN0bHkgb25lIFJVTEVTIGVsZW1lbnRzIGNhbiBiZSBzcGVjaWZpZWQuQmVuZWF0aCAKKyAgICAgICAgdGhpcyBlbGVtZW50LCBhbnkgbnVtYmVyIG9mIEFQUExZIEZJTEUgUlVMRSBlbGVtZW50cyBtYXkgYmUgc3BlY2lmaWVkLiAKKyAgICAgICAgVGhlIHJlcXVpcmVkIE5BTUUgYXR0cmlidXRlIHNwZWNpZmllcyB3aGljaCBvZiB0aGUgZmlsZSBydWxlcyBkZWZpbmVkIAorICAgICAgICBwcmV2aW91c2x5IGFyZSB0byBiZSBhcHBsaWVkLiBCZW5lYXRoIHRoZXNlIGVsZW1lbnQgYW55IG51bWJlciBvZiBBUFBMWVBBUlNFUlVMRSAKKyAgICAgICAgZWxlbWVudHMgbWF5IGJlIHNwZWNpZmllZC4gVGhlIHJlcXVpcmVkIE5BTUUgYXR0cmlidXRlIHNwZWNpZmllcyB3aGljaCAKKyAgICAgICAgb2YgdGhlIHBhcnNlIHJ1bGVzIGRlZmluZWQgcHJldmlvdXNseSBhcmUgdG8gYmUgYXBwbGllZCB0byB0aGUgZmlsZXMgYWNjZXB0ZWQgCisgICAgICAgIGJ5IHRoZSBwYXJlbnQgZmlsZSBydWxlLjwvUD4KKyAgICAgIDxQPjxCPlRoZSBFeGFtcGxlIEZpbGUgRXhwbGFpbmVkPC9CPjwvUD4KKyAgICAgIDxQPkdpdmVuIHRoZSBkZXRhaWxzIG9mIHRoZSBmaWxlIHN0cnVjdHVyZSwgd2UgY2FuIG5vdyBleGFtaW5lIGhvdyB0aGUgZXhhbXBsZSAKKyAgICAgICAgZmlsZSBzcGVjaWZpZXMgd2hpY2ggZmlsZXMgdG8gc2NhbiwgYW5kIHRoZW4gaG93IGl0IHNwZWNpZmllcyBob3cgdG8gZmluZCAKKyAgICAgICAgdGhlIHJlc291cmNlIGtleXMgY29udGFpbmVkIGluIHRob3NlIGZpbGVzLjwvUD4KKyAgICAgIDxQPlJCUmVwb3J0ZXIgZmlyc3QgYmVnaW5zIGJ5IGdvaW5nIHRocm91Z2ggZWFjaCBvZiB0aGUgZGlyZWN0b3JpZXMgc3BlY2lmaWVkLiAKKyAgICAgICAgSW4gdGhlIGV4YW1wbGUgZmlsZSBjYXNlLCB0aGVyZSBpcyBvbmx5IG9uZSBkaXJlY3RvcnkuIEl0IHRoZW4gZ29lcyB0aHJvdWdoIAorICAgICAgICBlYWNoIG9mIHRoZSBmaWxlcyBjb250YWluZWQgaW4gdGhhdCBkaXJlY3RvcnkgYW5kIGl0cyBzdWJkaXJlY3RvcmllcyBsb29raW5nIAorICAgICAgICBmb3IgZmlsZXMgdGhhdCBwYXNzIHRoZSAnSmF2YSBGaWxlJyBmaWxlIHRlc3QuIFRoZSAnSmF2YSBGaWxlJyB0ZXN0IHNpbXBseSAKKyAgICAgICAgY2hlY2tzIHRoZSBmaWxlIG5hbWUgdG8gc2VlIGlmIGl0IGVuZHMgaW4gdGhlIGV4dGVuc2lvbiAnLmphdmEnLiBJZiB0aGUgCisgICAgICAgIGZpbGUgaGFzIHN1Y2ggYW4gZXh0ZW5zaW9uIHRoZSBwYXJzZSBydWxlICdKYXZhIHN0YXRpYyByZXNvdXJjZScgaXMgYXBwbGllZCAKKyAgICAgICAgdG8gZXZlcnkgbGluZSBvZiB0ZXh0IHdpdGhpbiB0aGF0IGZpbGUuPC9QPgorICAgICAgPFA+VGh1cyBpZiB0aGUgZm9sbG93aW5nIGZpbGUsIG5hbWVkIFNhbXBsZS5qYXZhLCB3ZXJlIHRvIGJlIGZvdW5kIGluIHRoZSAKKyAgICAgICAgZGlyZWN0b3J5LiBUaGUgdHdvIHJlc291cmNlIGtleXMgJ0hlbGxvJyBhbmQgJ1dvcmxkJyB3b3VsZCBiZSBmb3VuZC48L1A+CisgICAgICAgIDxibG9ja3F1b3RlPjxjb2RlPgorICAgICAgICAgIDxwcmU+CitwdWJsaWMgY2xhc3MgU2FtcGxlIHsKKwlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB7CisJCVN5c3RlbS5vdXQucHJpbnRsbihSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oJnF1b3Q7SGVsbG8mcXVvdDspICsgJnF1b3Q7ICZxdW90OyArIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigmcXVvdFdvcmxkJnF1b3Q7KSk7CisJfQorfQorPC9wcmU+CisgICAgICAgICAgPC9jb2RlPjwvYmxvY2txdW90ZT4KKworICAgICAgPCEtLSAjRW5kRWRpdGFibGUgLS0+PC9URD4KKwk8L1RSPgorCTxUUj4KKwkJPFREIEJBQ0tHUk9VTkQ9ImltYWdlcy90ZW1wbGF0ZV9sbC5naWYiIEhFSUdIVD0iNDAiIFdJRFRIPSIyMDAiPgorCQkJPCEtLSBDb21tZW50IC0tPgorCQk8L1REPgorCQk8VEQgV0lEVEg9IjgwIj4KKwkJCTwhLS0gQ29tbWVudCAtLT4KKwkJPC9URD4KKwkJPFREPgorCQkJPENFTlRFUj48U1BBTiBDTEFTUz0iQ29weXJpZ2h0Ij5Db3B5cmlnaHQgMjAwMC0yMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMsIEFsbCBSaWdodHMgUmVzZXJ2ZWQ8L1NQQU4+PC9DRU5URVI+CisJCTwvVEQ+CisJPC9UUj4KKzwvVEFCTEU+CisKKzwvQk9EWT4KKzwhLS0gI0VuZFRlbXBsYXRlIC0tPjwvSFRNTD4KZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL3N5c3RlbV9yZXF1aXJlbWVudHMuaHRtbCBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL3N5c3RlbV9yZXF1aXJlbWVudHMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTFjMGY5Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3Mvc3lzdGVtX3JlcXVpcmVtZW50cy5odG1sCkBAIC0wLDAgKzEsMTA4IEBACis8SFRNTD48IS0tICNCZWdpblRlbXBsYXRlICIvVGVtcGxhdGVzL01haW5UZW1wbGF0ZS5kd3QiIC0tPgorPEhFQUQ+Cis8IS0tICNCZWdpbkVkaXRhYmxlICJkb2N0aXRsZSIgLS0+IAorPFRJVExFPlRlbXBsYXRlPC9USVRMRT4KKzwhLS0gI0VuZEVkaXRhYmxlIC0tPiAKKzxNRVRBIEhUVFAtRVFVSVY9IkNvbnRlbnQtVHlwZSIgQ09OVEVOVD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPFNUWUxFIFRZUEU9IlRFWFQvQ1NTIj4KKzwhLS0KKy50b3BpY0hlYWQgeyAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7IGZvbnQtc2l6ZTogMTRwdDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6ICMzMzMzMzN9CisudG9waWNMaXN0IHsgIGZvbnQtZmFtaWx5OiBHZW9yZ2lhLCAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOyBmb250LXNpemU6IDlwdDsgY29sb3I6ICNGRjAwOTk7IGxpc3Qtc3R5bGUtaW1hZ2U6ICB1cmwoaW1hZ2VzL2RpYW1vbmRfYnVsbGV0LmdpZik7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgZm9udC13ZWlnaHQ6IGJvbGR9CisubWFpbkJsb2NrIHsgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBmb250LXNpemU6IDEycHQ7IG1hcmdpbi10b3A6IDVweDsgbWFyZ2luLXJpZ2h0OiA1cHg7IG1hcmdpbi1ib3R0b206IDVweDsgbWFyZ2luLWxlZnQ6IDVweDsgcGFkZGluZy10b3A6IDVweDsgcGFkZGluZy1yaWdodDogMTBweDsgcGFkZGluZy1ib3R0b206IDVweDsgcGFkZGluZy1sZWZ0OiAxMHB4OyB0ZXh0LWFsaWduOiBqdXN0aWZ5fQorLS0+Cis8L1NUWUxFPgorPC9IRUFEPgorCis8Qk9EWSBCR0NPTE9SPSIjRkZGRkZGIiBMRUZUTUFSR0lOPSIwIiBUT1BNQVJHSU49IjAiIE1BUkdJTldJRFRIPSIwIiBNQVJHSU5IRUlHSFQ9IjAiPgorPFRBQkxFIFdJRFRIPSIxMDAlIiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iMCI+CisgIDxUUj4KKyAgICA8VEQgUk9XU1BBTj0iMiIgQ09MU1BBTj0iMiIgQkFDS0dST1VORD0iaW1hZ2VzL3RlbXBsYXRlX3VsLmdpZiIgSEVJR0hUPSI3NSI+PElNRyBTUkM9ImltYWdlcy9zcGFjZXIuZ2lmIiBXSURUSD0iMjgwIiBIRUlHSFQ9IjEiIEhTUEFDRT0iMCI+PC9URD4KKwkJPFREIEhFSUdIVD0iMTUiICBXSURUSD0iMTAwJSIgQkFDS0dST1VORD0iaW1hZ2VzL3RlbXBsYXRlX3UuZ2lmIj48L1REPgorCTwvVFI+CisJPFRSPgorCQk8VEQgSEVJR0hUPSI2MCIgPgorCQkJPENFTlRFUj48SU1HIFNSQz0iaW1hZ2VzL1RpdGxlTG9nb190cmFuc3BhcmVudC5naWYiIFZTUEFDRT0iMCI+PC9DRU5URVI+CisJCTwvVEQ+CisJPC9UUj4KKwk8VFI+CisJCQorICAgIDxURCBXSURUSD0iMjAwIiBCQUNLR1JPVU5EPSJpbWFnZXMvdGVtcGxhdGVfbC5naWYiIFZBTElHTj0idG9wIj4KKwkJPFRBQkxFIFdJRFRIPSIxODAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iMSI+IAorICAgICAgCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNIZWFkIj5HZW5lcmFsPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIFZBTElHTj0iY2VudGVyIj48SU1HIFNSQz0iaW1hZ2VzL3RlbXBsYXRlX2xpbmUuZ2lmIj48L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljTGlzdCI+CisJICAgICAgICA8VUw+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJzeXN0ZW1fcmVxdWlyZW1lbnRzLmh0bWwiPlN5c3RlbSBSZXF1aXJlbWVudHM8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9ImZhcS5odG1sIj5GQVE8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9ImZ1dHVyZV9mZWF0dXJlcy5odG1sIj5GdXR1cmUgUmVsZWFzZXM8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJIENMQVNTPSJ0b3BpY0xpc3QiPjxBIEhSRUY9ImZ1dHVyZV9mZWF0dXJlcy5odG1sIj5WZXJzaW9uIAorICAgICAgICAgICAgICAgIEhpc3Rvcnk8L0E+PC9MST4KKyAgICAgICAgICAgIDwvVUw+CisJCQk8L1REPgorCQk8L1RSPgorICAgICAgCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNIZWFkIj5SQiBNYW5hZ2VyPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIFZBTElHTj0iY2VudGVyIj48SU1HIFNSQz0iaW1hZ2VzL3RlbXBsYXRlX2xpbmUuZ2lmIj48L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljTGlzdCI+CisJICAgICAgICA8VUw+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJpbmRleC5odG1sIj5Ib21lPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJ0dXRvcmlhbC9pbmRleC5odG1sIj5UdXRvcmlhbDwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0idmlld3MvaW5kZXguaHRtbCI+RnVuY3Rpb25hbGl0eSBhbmQgVmlld3M8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Imxvb2thbmRmZWVsLmh0bWwiPkxvb2sgYW5kIEZlZWw8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Im1lbnUuaHRtbCI+TWVudSBJdGVtczwvQT48L0xJPgorICAgICAgICAgICAgICA8TEkgQ0xBU1M9InRvcGljTGlzdCI+PEEgSFJFRj0idHV0b3JpYWwvc3RlcDEuaHRtbCI+UHJlZmVyZW5jZXM8L0E+PC9MST4KKyAgICAgICAgICAgIDwvVUw+CisJCQk8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljSGVhZCI+UkIgUmVwb3J0ZXI8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgVkFMSUdOPSJjZW50ZXIiPjxJTUcgU1JDPSJpbWFnZXMvdGVtcGxhdGVfbGluZS5naWYiPjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNMaXN0Ij4KKwkgIDxVTD4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9IlJCUmVwb3J0ZXIuaHRtbCI+SG9tZTwvQT48L0xJPgorICAgICAgICA8TEk+UmVwb3J0IFR5cGVzPC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9InNjYW5maWxlLmh0bWwiPkNvZGUgU2Nhbm5pbmc8L0E+PC9MST4KKyAgICAgICAgICAgIDwvVUw+CisJCQk8L1REPgorCQk8L1RSPgorCTwvVEFCTEU+CisKKyAgICAgIDxQPiZuYnNwOyA8L1A+CisgICAgICA8L1REPgorCQkKKyAgICA8VEQgQ09MU1BBTj0iMiIgVkFMSUdOPSJ0b3AiIENMQVNTPSJtYWluQmxvY2siPjwhLS0gI0JlZ2luRWRpdGFibGUgIk1haW4iIC0tPgorICAgICAgPEgzIEFMSUdOPSJDRU5URVIiPlN5c3RlbSBSZXF1aXJlbWVudHM8L0gzPgorICAgICAgPFA+UkIgTWFuYWdlciB3aWxsIHJ1biBvbiBhbnkgcGxhdGZvcm0gc3VwcG9ydGluZyBKYXZhIDEuNCBvciBoaWdoZXIuIEl0IAorICAgICAgICBoYXMgYmVlbiB0ZXN0ZWQgb24gV2luZG93cyBOVCwgV2luZG93cyAyMDAwLCBMaW51eCwgYW5kIE1hYyBPUyBYLiBJdCBpcyAKKyAgICAgICAgcmVjb21tZW5kZWQgdGhhdCB0aGUgbWFjaGluZSBydW5uaW5nIFJCIE1hbmFnZXIgaGF2ZSBhdCBsZWFzdCA2NCBNQiBvZiAKKyAgICAgICAgbWVtb3J5LjwvUD4KKyAgICAgIDwhLS0gI0VuZEVkaXRhYmxlIC0tPjwvVEQ+CisJPC9UUj4KKwk8VFI+CisJCTxURCBCQUNLR1JPVU5EPSJpbWFnZXMvdGVtcGxhdGVfbGwuZ2lmIiBIRUlHSFQ9IjQwIiBXSURUSD0iMjAwIj4KKwkJCTwhLS0gQ29tbWVudCAtLT4KKwkJPC9URD4KKwkJPFREIFdJRFRIPSI4MCI+CisJCQk8IS0tIENvbW1lbnQgLS0+CisJCTwvVEQ+CisJCTxURD4KKwkJCTxDRU5URVI+PFNQQU4gQ0xBU1M9IkNvcHlyaWdodCI+Q29weXJpZ2h0IDIwMDAtMjAwNCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzLCBBbGwgUmlnaHRzIFJlc2VydmVkPC9TUEFOPjwvQ0VOVEVSPgorCQk8L1REPgorCTwvVFI+Cis8L1RBQkxFPgorCis8L0JPRFk+Cis8IS0tICNFbmRUZW1wbGF0ZSAtLT48L0hUTUw+CmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy90dXRvcmlhbC9pbmRleC5odG1sIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvdHV0b3JpYWwvaW5kZXguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzgxZTY0Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvdHV0b3JpYWwvaW5kZXguaHRtbApAQCAtMCwwICsxLDE1OSBAQAorPEhUTUw+PCEtLSAjQmVnaW5UZW1wbGF0ZSAiL1RlbXBsYXRlcy9NYWluVGVtcGxhdGUuZHd0IiAtLT4KKzxIRUFEPgorPCEtLSAjQmVnaW5FZGl0YWJsZSAiZG9jdGl0bGUiIC0tPiAKKzxUSVRMRT5SQiBNYW5hZ2VyIFR1dG9yaWFsPC9USVRMRT4KKzwhLS0gI0VuZEVkaXRhYmxlIC0tPiAKKzxNRVRBIEhUVFAtRVFVSVY9IkNvbnRlbnQtVHlwZSIgQ09OVEVOVD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPFNUWUxFIFRZUEU9IlRFWFQvQ1NTIj4KKzwhLS0KKy50b3BpY0hlYWQgeyAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7IGZvbnQtc2l6ZTogMTRwdDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6ICMzMzMzMzN9CisudG9waWNMaXN0IHsgIGZvbnQtZmFtaWx5OiBHZW9yZ2lhLCAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOyBmb250LXNpemU6IDlwdDsgY29sb3I6ICNGRjAwOTk7IGxpc3Qtc3R5bGUtaW1hZ2U6IHVybCguLi9pbWFnZXMvZGlhbW9uZF9idWxsZXQuZ2lmKTsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyBmb250LXdlaWdodDogYm9sZH0KKy5tYWluQmxvY2sgeyAgZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTJwdDsgbWFyZ2luLXRvcDogNXB4OyBtYXJnaW4tcmlnaHQ6IDVweDsgbWFyZ2luLWJvdHRvbTogNXB4OyBtYXJnaW4tbGVmdDogNXB4OyBwYWRkaW5nLXRvcDogNXB4OyBwYWRkaW5nLXJpZ2h0OiAxMHB4OyBwYWRkaW5nLWJvdHRvbTogNXB4OyBwYWRkaW5nLWxlZnQ6IDEwcHg7IHRleHQtYWxpZ246IGp1c3RpZnl9CistLT4KKzwvU1RZTEU+Cis8L0hFQUQ+CisKKzxCT0RZIEJHQ09MT1I9IiNGRkZGRkYiIExFRlRNQVJHSU49IjAiIFRPUE1BUkdJTj0iMCIgTUFSR0lOV0lEVEg9IjAiIE1BUkdJTkhFSUdIVD0iMCI+Cis8VEFCTEUgV0lEVEg9IjEwMCUiIEJPUkRFUj0iMCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSIwIj4KKyAgPFRSPgorICAgIDxURCBST1dTUEFOPSIyIiBDT0xTUEFOPSIyIiBCQUNLR1JPVU5EPSIuLi9pbWFnZXMvdGVtcGxhdGVfdWwuZ2lmIiBIRUlHSFQ9Ijc1Ij48SU1HIFNSQz0iLi4vaW1hZ2VzL3NwYWNlci5naWYiIFdJRFRIPSIyODAiIEhFSUdIVD0iMSIgSFNQQUNFPSIwIj48L1REPgorCQk8VEQgSEVJR0hUPSIxNSIgIFdJRFRIPSIxMDAlIiBCQUNLR1JPVU5EPSIuLi9pbWFnZXMvdGVtcGxhdGVfdS5naWYiPjwvVEQ+CisJPC9UUj4KKwk8VFI+CisJCTxURCBIRUlHSFQ9IjYwIiA+CisJCQk8Q0VOVEVSPjxJTUcgU1JDPSIuLi9pbWFnZXMvVGl0bGVMb2dvX3RyYW5zcGFyZW50LmdpZiIgVlNQQUNFPSIwIj48L0NFTlRFUj4KKwkJPC9URD4KKwk8L1RSPgorCTxUUj4KKwkJCisgICAgPFREIFdJRFRIPSIyMDAiIEJBQ0tHUk9VTkQ9Ii4uL2ltYWdlcy90ZW1wbGF0ZV9sLmdpZiIgVkFMSUdOPSJ0b3AiPgorCQk8VEFCTEUgV0lEVEg9IjE4MCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSIxIj4gCisgICAgICAJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0hlYWQiPkdlbmVyYWw8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgVkFMSUdOPSJjZW50ZXIiPjxJTUcgU1JDPSIuLi9pbWFnZXMvdGVtcGxhdGVfbGluZS5naWYiPjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNMaXN0Ij4KKwkgICAgICAgIDxVTD4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL3N5c3RlbV9yZXF1aXJlbWVudHMuaHRtbCI+U3lzdGVtIFJlcXVpcmVtZW50czwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vZmFxLmh0bWwiPkZBUTwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vZnV0dXJlX2ZlYXR1cmVzLmh0bWwiPkZ1dHVyZSBSZWxlYXNlczwvQT48L0xJPgorICAgICAgICAgICAgICA8TEkgQ0xBU1M9InRvcGljTGlzdCI+PEEgSFJFRj0iLi4vZnV0dXJlX2ZlYXR1cmVzLmh0bWwiPlZlcnNpb24gCisgICAgICAgICAgICAgICAgSGlzdG9yeTwvQT48L0xJPgorICAgICAgICAgICAgPC9VTD4KKwkJCTwvVEQ+CisJCTwvVFI+CisgICAgICAJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0hlYWQiPlJCIE1hbmFnZXI8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgVkFMSUdOPSJjZW50ZXIiPjxJTUcgU1JDPSIuLi9pbWFnZXMvdGVtcGxhdGVfbGluZS5naWYiPjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNMaXN0Ij4KKwkgICAgICAgIDxVTD4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL2luZGV4Lmh0bWwiPkhvbWU8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9ImluZGV4Lmh0bWwiPlR1dG9yaWFsPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi92aWV3cy9pbmRleC5odG1sIj5GdW5jdGlvbmFsaXR5IGFuZCBWaWV3czwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vbG9va2FuZGZlZWwuaHRtbCI+TG9vayBhbmQgRmVlbDwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vbWVudS5odG1sIj5NZW51IEl0ZW1zPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMSSBDTEFTUz0idG9waWNMaXN0Ij48QSBIUkVGPSJzdGVwMS5odG1sIj5QcmVmZXJlbmNlczwvQT48L0xJPgorICAgICAgICAgICAgPC9VTD4KKwkJCTwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNIZWFkIj5SQiBSZXBvcnRlcjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBWQUxJR049ImNlbnRlciI+PElNRyBTUkM9Ii4uL2ltYWdlcy90ZW1wbGF0ZV9saW5lLmdpZiI+PC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0xpc3QiPgorCSAgPFVMPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vUkJSZXBvcnRlci5odG1sIj5Ib21lPC9BPjwvTEk+CisgICAgICAgIDxMST5SZXBvcnQgVHlwZXM8L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vc2NhbmZpbGUuaHRtbCI+Q29kZSBTY2FubmluZzwvQT48L0xJPgorICAgICAgICAgICAgPC9VTD4KKwkJCTwvVEQ+CisJCTwvVFI+CisJPC9UQUJMRT4KKworICAgICAgPFA+Jm5ic3A7IDwvUD4KKyAgICAgIDwvVEQ+CisJCQorICAgIDxURCBDT0xTUEFOPSIyIiBWQUxJR049InRvcCIgQ0xBU1M9Im1haW5CbG9jayI+PCEtLSAjQmVnaW5FZGl0YWJsZSAiTWFpbiIgLS0+IAorICAgICAgPERJViBBTElHTj0iQ0VOVEVSIj4gCisgICAgICAgIDxIMj5TdGVwLWJ5LXN0ZXAgVHV0b3JpYWw8L0gyPgorICAgICAgICA8UCBBTElHTj0iQ0VOVEVSIj5UaGlzIHR1dG9yaWFsIHRha2VzIHlvdSBzdGVwIGJ5IHN0ZXAgdGhyb3VnaCB0aGUgcHJvY2VzcyAKKyAgICAgICAgICBvZiBjcmVhdGluZyBhIHJlc291cmNlIGJ1bmRsZSBhbmQgbWFuYWdpbmcgdGhlIHRyYW5zbGF0aW9ucyB5b3UgbmVlZCAKKyAgICAgICAgICBmb3IgeW91ciBhcHBsaWNhdGlvbiBvciB3ZWIgYmFzZWQgaW50ZXJmYWNlcy4gWW91IG1heSBiZWdpbiB3aXRoIHRoZSAKKyAgICAgICAgICBmaXJzdCBzdGVwLCBvciBzZWxlY3QgZnJvbSBhbnkgb2YgdGhlIHN0ZXBzIGxpc3RlZCBiZWxvdy4gVGhlIHR1dG9yaWFsIAorICAgICAgICAgIGlzIG5vdCBtZWFudCB0byBnaXZlIGEgY29tcHJlaGVuc2l2ZSB2aWV3IG9mIHRoZSBmZWF0dXJlcyBvZiBSQiBNYW5hZ2VyLCAKKyAgICAgICAgICBidXQgaXQgd2lsbCBoZWxwIHlvdSBmYW1pbGlhcml6ZSB3aXRoIGFsbCBvZiB0aGUgYmFzaWMgZmVhdHVyZXMuPC9QPgorICAgICAgICA8SDMgQUxJR049IkxFRlQiPiAKKyAgICAgICAgICA8VUw+CisgICAgICAgICAgICA8TEk+CisgICAgICAgICAgICAgIDxIND5TdGVwIDEuIDxBIEhSRUY9InN0ZXAxLmh0bWwiPlNldHRpbmcgWW91ciBQZXJzb25hbCBQcmVmZW5jZXM8L0E+PC9IND4KKyAgICAgICAgICAgIDwvTEk+CisgICAgICAgICAgICA8TEk+CisgICAgICAgICAgICAgIDxIND5TdGVwIDIuIDxBIEhSRUY9InN0ZXAyLmh0bWwiPkNyZWF0aW5nIGEgTmV3IFJlc291cmNlIEJ1bmRsZTwvQT48L0g0PgorICAgICAgICAgICAgPC9MST4KKyAgICAgICAgICAgIDxMST4KKyAgICAgICAgICAgICAgPEg0PlN0ZXAgMy4gPEEgSFJFRj0ic3RlcDMuaHRtbCI+Q3JlYXRpbmcgR3JvdXBzIHdpdGhpbiB0aGUgQnVuZGxlPC9BPjwvSDQ+CisgICAgICAgICAgICA8L0xJPgorICAgICAgICAgICAgPExJPgorICAgICAgICAgICAgICA8SDQ+U3RlcCA0LiA8QSBIUkVGPSJzdGVwNC5odG1sIj5Qb3B1bGF0aW5nIHRoZSBCdW5kbGUgd2l0aCBSZXNvdXJjZXM8L0E+PC9IND4KKyAgICAgICAgICAgIDwvTEk+CisgICAgICAgICAgICA8TEk+CisgICAgICAgICAgICAgIDxIND5TdGVwIDUuIDxBIEhSRUY9InN0ZXA1Lmh0bWwiPkFkZGluZyBSZXNvdXJjZSBGaWxlcyBmb3IgTmV3IExhbmd1YWdlczwvQT48L0g0PgorICAgICAgICAgICAgPC9MST4KKyAgICAgICAgICAgIDxMST4KKyAgICAgICAgICAgICAgPEg0PlN0ZXAgNi4gPEEgSFJFRj0ic3RlcDYuaHRtbCI+U2F2aW5nIHRoZSBSZXN1bHRzPC9BPiA8L0g0PgorICAgICAgICAgICAgPC9MST4KKyAgICAgICAgICA8L1VMPgorICAgICAgICA8L0gzPgorICAgICAgICA8SDQ+PEEgSFJFRj0ic3RlcDEuaHRtbCI+R28gdG8gU3RlcCAxPC9BPjwvSDQ+CisgICAgICA8L0RJVj4KKyAgICAgIDwhLS0gI0VuZEVkaXRhYmxlIC0tPjwvVEQ+CisJPC9UUj4KKwk8VFI+CisJCTxURCBCQUNLR1JPVU5EPSIuLi9pbWFnZXMvdGVtcGxhdGVfbGwuZ2lmIiBIRUlHSFQ9IjQwIiBXSURUSD0iMjAwIj4KKwkJCTwhLS0gQ29tbWVudCAtLT4KKwkJPC9URD4KKwkJPFREIFdJRFRIPSI4MCI+CisJCQk8IS0tIENvbW1lbnQgLS0+CisJCTwvVEQ+CisJCTxURD4KKwkJCTxDRU5URVI+PFNQQU4gQ0xBU1M9IkNvcHlyaWdodCI+Q29weXJpZ2h0IDIwMDAtMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzLCBBbGwgUmlnaHRzIFJlc2VydmVkPC9TUEFOPjwvQ0VOVEVSPgorCQk8L1REPgorCTwvVFI+Cis8L1RBQkxFPgorPCEtLQorPFRBQkxFIFdJRFRIPSIxMDAlIiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iMiI+CisgIDxUUj4KKyAgICA8VEQgV0lEVEg9IjIwMCIgQkdDT0xPUj0iI0NDQ0NGRiI+Jm5ic3A7PC9URD4KKyAgICA8VEQ+CisgICAgICA8RElWIEFMSUdOPSJDRU5URVIiPjxJTUcgU1JDPSIuLi9pbWFnZXMvVGl0bGVMb2dvX3RyYW5zcGFyZW50LmdpZiIgV0lEVEg9IjE3NSIgSEVJR0hUPSI1MCI+PC9ESVY+CisgICAgPC9URD4KKyAgPC9UUj4KKyAgPFRSIFZBTElHTj0iVE9QIj4gCisgICAgPFREIFdJRFRIPSIyMDAiIEJHQ09MT1I9IiNDQ0NDRkYiPiAKKyAgICAgIDxQPjxBIEhSRUY9ImluZGV4Lmh0bWwiPlJCTWFuYWdlcjwvQT48L1A+CisgICAgICA8UD48QSBIUkVGPSJSQlJlcG9ydGVyLmh0bWwiPlJCUmVwb3J0ZXI8L0E+PC9QPgorICAgICAgPFA+PEEgSFJFRj0iLi4vdHV0b3JpYWwvc3RlcDEuaHRtbCI+U3lzdGVtIFJlcXVpcmVtZW50czwvQT48L1A+CisgICAgICA8UD48QSBIUkVGPSJmYXEuaHRtbCI+RkFRPC9BPjwvUD4KKyAgICAgIDxQPlRvcGljczwvUD4KKyAgICAgIDxVTD4KKyAgICAgICAgPExJPjxBIEhSRUY9Ii4uL3R1dG9yaWFsL2luZGV4Lmh0bWwiPlN0ZXAtYnktc3RlcCBUdXRvcmlhbDwvQT48L0xJPgorICAgICAgICA8TEk+PEEgSFJFRj0ic3RlcDEuaHRtbCI+Q2hhbmdpbmcgUHJlZmVuY2VzPC9BPjwvTEk+CisgICAgICAgIDxMST48QSBIUkVGPSJmdXR1cmVfZmVhdHVyZXMuaHRtbCI+RnV0dXJlIFJlbGVhc2UgRmVhdHVyZXM8L0E+PC9MST4KKyAgICAgIDwvVUw+CisgICAgPC9URD4KKyAgICA8VEQ+PC9URD4KKyAgPC9UUj4KKzwvVEFCTEU+CistLT4KKzwvQk9EWT4KKzwhLS0gI0VuZFRlbXBsYXRlIC0tPjwvSFRNTD4KZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL3R1dG9yaWFsL3N0ZXAxLmh0bWwgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy90dXRvcmlhbC9zdGVwMS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExNzgzZTkKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy90dXRvcmlhbC9zdGVwMS5odG1sCkBAIC0wLDAgKzEsMTY4IEBACis8SFRNTD48IS0tICNCZWdpblRlbXBsYXRlICIvVGVtcGxhdGVzL01haW5UZW1wbGF0ZS5kd3QiIC0tPgorPEhFQUQ+Cis8IS0tICNCZWdpbkVkaXRhYmxlICJkb2N0aXRsZSIgLS0+IAorPFRJVExFPlJCIE1hbmFnZXIgVHV0b3JpYWwgLSBQcmVmZXJlbmNlczwvVElUTEU+Cis8IS0tICNFbmRFZGl0YWJsZSAtLT4gCis8TUVUQSBIVFRQLUVRVUlWPSJDb250ZW50LVR5cGUiIENPTlRFTlQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzxTVFlMRSBUWVBFPSJURVhUL0NTUyI+Cis8IS0tCisudG9waWNIZWFkIHsgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOyBmb250LXNpemU6IDE0cHQ7IGZvbnQtd2VpZ2h0OiBib2xkOyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiAjMzMzMzMzfQorLnRvcGljTGlzdCB7ICBmb250LWZhbWlseTogR2VvcmdpYSwgIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsgZm9udC1zaXplOiA5cHQ7IGNvbG9yOiAjRkYwMDk5OyBsaXN0LXN0eWxlLWltYWdlOiB1cmwoLi4vaW1hZ2VzL2RpYW1vbmRfYnVsbGV0LmdpZik7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgZm9udC13ZWlnaHQ6IGJvbGR9CisubWFpbkJsb2NrIHsgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBmb250LXNpemU6IDEycHQ7IG1hcmdpbi10b3A6IDVweDsgbWFyZ2luLXJpZ2h0OiA1cHg7IG1hcmdpbi1ib3R0b206IDVweDsgbWFyZ2luLWxlZnQ6IDVweDsgcGFkZGluZy10b3A6IDVweDsgcGFkZGluZy1yaWdodDogMTBweDsgcGFkZGluZy1ib3R0b206IDVweDsgcGFkZGluZy1sZWZ0OiAxMHB4OyB0ZXh0LWFsaWduOiBqdXN0aWZ5fQorLS0+Cis8L1NUWUxFPgorPC9IRUFEPgorCis8Qk9EWSBCR0NPTE9SPSIjRkZGRkZGIiBMRUZUTUFSR0lOPSIwIiBUT1BNQVJHSU49IjAiIE1BUkdJTldJRFRIPSIwIiBNQVJHSU5IRUlHSFQ9IjAiPgorPFRBQkxFIFdJRFRIPSIxMDAlIiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iMCI+CisgIDxUUj4KKyAgICA8VEQgUk9XU1BBTj0iMiIgQ09MU1BBTj0iMiIgQkFDS0dST1VORD0iLi4vaW1hZ2VzL3RlbXBsYXRlX3VsLmdpZiIgSEVJR0hUPSI3NSI+PElNRyBTUkM9Ii4uL2ltYWdlcy9zcGFjZXIuZ2lmIiBXSURUSD0iMjgwIiBIRUlHSFQ9IjEiIEhTUEFDRT0iMCI+PC9URD4KKwkJPFREIEhFSUdIVD0iMTUiICBXSURUSD0iMTAwJSIgQkFDS0dST1VORD0iLi4vaW1hZ2VzL3RlbXBsYXRlX3UuZ2lmIj48L1REPgorCTwvVFI+CisJPFRSPgorCQk8VEQgSEVJR0hUPSI2MCIgPgorCQkJPENFTlRFUj48SU1HIFNSQz0iLi4vaW1hZ2VzL1RpdGxlTG9nb190cmFuc3BhcmVudC5naWYiIFZTUEFDRT0iMCI+PC9DRU5URVI+CisJCTwvVEQ+CisJPC9UUj4KKwk8VFI+CisJCQorICAgIDxURCBXSURUSD0iMjAwIiBCQUNLR1JPVU5EPSIuLi9pbWFnZXMvdGVtcGxhdGVfbC5naWYiIFZBTElHTj0idG9wIj4KKwkJPFRBQkxFIFdJRFRIPSIxODAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iMSI+IAorICAgICAgCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNIZWFkIj5HZW5lcmFsPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIFZBTElHTj0iY2VudGVyIj48SU1HIFNSQz0iLi4vaW1hZ2VzL3RlbXBsYXRlX2xpbmUuZ2lmIj48L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljTGlzdCI+CisJICAgICAgICA8VUw+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9zeXN0ZW1fcmVxdWlyZW1lbnRzLmh0bWwiPlN5c3RlbSBSZXF1aXJlbWVudHM8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL2ZhcS5odG1sIj5GQVE8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL2Z1dHVyZV9mZWF0dXJlcy5odG1sIj5GdXR1cmUgUmVsZWFzZXM8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJIENMQVNTPSJ0b3BpY0xpc3QiPjxBIEhSRUY9Ii4uL2Z1dHVyZV9mZWF0dXJlcy5odG1sIj5WZXJzaW9uIAorICAgICAgICAgICAgICAgIEhpc3Rvcnk8L0E+PC9MST4KKyAgICAgICAgICAgIDwvVUw+CisJCQk8L1REPgorCQk8L1RSPgorICAgICAgCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNIZWFkIj5SQiBNYW5hZ2VyPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIFZBTElHTj0iY2VudGVyIj48SU1HIFNSQz0iLi4vaW1hZ2VzL3RlbXBsYXRlX2xpbmUuZ2lmIj48L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljTGlzdCI+CisJICAgICAgICA8VUw+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9pbmRleC5odG1sIj5Ib21lPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJpbmRleC5odG1sIj5UdXRvcmlhbDwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vdmlld3MvaW5kZXguaHRtbCI+RnVuY3Rpb25hbGl0eSBhbmQgVmlld3M8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL2xvb2thbmRmZWVsLmh0bWwiPkxvb2sgYW5kIEZlZWw8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL21lbnUuaHRtbCI+TWVudSBJdGVtczwvQT48L0xJPgorICAgICAgICAgICAgICA8TEkgQ0xBU1M9InRvcGljTGlzdCI+PEEgSFJFRj0ic3RlcDEuaHRtbCI+UHJlZmVyZW5jZXM8L0E+PC9MST4KKyAgICAgICAgICAgIDwvVUw+CisJCQk8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljSGVhZCI+UkIgUmVwb3J0ZXI8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgVkFMSUdOPSJjZW50ZXIiPjxJTUcgU1JDPSIuLi9pbWFnZXMvdGVtcGxhdGVfbGluZS5naWYiPjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNMaXN0Ij4KKwkgIDxVTD4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL1JCUmVwb3J0ZXIuaHRtbCI+SG9tZTwvQT48L0xJPgorICAgICAgICA8TEk+UmVwb3J0IFR5cGVzPC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL3NjYW5maWxlLmh0bWwiPkNvZGUgU2Nhbm5pbmc8L0E+PC9MST4KKyAgICAgICAgICAgIDwvVUw+CisJCQk8L1REPgorCQk8L1RSPgorCTwvVEFCTEU+CisKKyAgICAgIDxQPiZuYnNwOyA8L1A+CisgICAgICA8L1REPgorCQkKKyAgICA8VEQgQ09MU1BBTj0iMiIgVkFMSUdOPSJ0b3AiIENMQVNTPSJtYWluQmxvY2siPjwhLS0gI0JlZ2luRWRpdGFibGUgIk1haW4iIC0tPiAKKyAgICAgIDxIMyBBTElHTj0iQ0VOVEVSIj5TZXR0aW5nIFlvdXIgUGVyc29uYWwgUHJlZmVyZW5jZXM8L0gzPgorICAgICAgPFA+PEI+R2V0dGluZyBTdGFydGVkPC9CPjwvUD4KKyAgICAgIDxQPkJlZm9yZSB5b3UgY2FuIGRvIGFueXRoaW5nIHdpdGggdGhlIHByb2dyYW0sIG9mIGNvdXJzZSwgeW91IGhhdmUgdG8gZ2V0IAorICAgICAgICBpdCBydW5uaW5nLiBSQiBNYW5hZ2VyIGlzIHB1cmVseSBhIEphdmEgYXBwbGljYXRpb24uIFRoZSBkb3dubG9hZCBkb2VzIAorICAgICAgICBub3QgY29tZSB3aXRoIGEgSmF2YSBydW50aW1lIGVudmlyb25tZW50LiBJbiBvcmRlciB0byB1c2UgUkJNYW5hZ2VyLCB5b3UgCisgICAgICAgIHdpbGwgbmVlZCB0byBoYXZhIGEgSmF2YSBydW50aW1lIGVudmlyb25tZW50IGluc3RhbGxlZCBvbiB5b3VyIG1hY2hpbmUuIAorICAgICAgICBUaGUgZW52aXJvbm1lbnQgaXMgYXZhaWxhYmxlIHRvIG1vc3QgY29tcHV0aW5nIHBsYXRmb3JtcyBhdCA8QSBIUkVGPSJodHRwOi8vamF2YS5zdW4uY29tIj5TdW4ncyAKKyAgICAgICAgaW50ZXJuZXQgc2l0ZTwvQT4uIFJCIE1hbmFnZXIgaGFzIGJlZW4gdGVzdGVkIGZvciBKYXZhIHZlcnNpb25zIDEuMi4yIAorICAgICAgICBhbmQgaGlnaGVyLiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IHlvdSB1c2UgSmF2YSB2ZXJzaW9uIDEuMyBpZiBpdCBpcyBhdmFpbGFibGUgCisgICAgICAgIGZvciB5b3VyIHN5c3RlbS48L1A+CisgICAgICA8UD5UbyBydW4gdGhlIHByb2dyYW0gZnJvbSB0aGUgY29tbWFuZCBsaW5lLCBmaXJzdCBnbyB0byB0aGUgUkJNYW5hZ2VyIGRpcmVjdG9yeSAKKyAgICAgICAgb24geW91ciBzeXN0ZW0sIHRoZW4gZW50ZXI6PC9QPgorICAgICAgPFA+PENPREU+amF2YSAtY2xhc3NwYXRoIC4vbGliL1JCTWFuYWdlci5qYXI7Li9saWIveGVyY2VzLmphciBjb20uaWJtLnJibS5SQk1hbmFnZXI8L0NPREU+PC9QPgorICAgICAgPFA+QWx0ZXJuYXRpdmVseSwgV2luZG93cyB1c2VycyBjYW4gdXNlIHRoZSBiYXRjaCBmaWxlLCBSQk1hbmFnZXIuYmF0IHRvIAorICAgICAgICBhY2NvbXBsaXNoIHRoZSBzYW1lIHRoaW5nLiBMaW51eCBhbmQgVW5peCB1c2VycyB0ZW5kIG5vdCB0byBuZWVkIHRoZWlyIAorICAgICAgICBoYW5kcyBoZWxkLCBhbmQgY2FuIHByb2JhYmx5IGZpZ3VyZSBvdXQgaG93IHRvIHdyaXRlIGEgc2ltcGxlIHNjcmlwdCBvciAKKyAgICAgICAgYWxpYXMgdG8gcnVuIHRoZSBhcHBsaWNhdGlvbiB3aXRob3V0IGhlbHAuIE1hYyBPUyBYIHVzZXJzIGNhbiBydW4gdGhlIAorICAgICAgICBwcm9ncmFtIGZyb20gdGhlIFRlcm1pbmFsIGFwcGxpY2F0aW9uIHdpdGggdGhlIGFib3ZlIGNvbW1hbmQgbGluZSwgc3Vic3RpdHV0aW5nIAorICAgICAgICBhIGNvbG9uIGZvciB0aGUgc2VtaS1jb2xvbiBpbiB0aGUgY2xhc3NwYXRoIGFyZ3VtZW50LjwvUD4KKyAgICAgIDxQPjxCPlRoZSBEaXNwbGF5PC9CPjwvUD4KKyAgICAgIDxQPk9uY2UgeW91IGdldCB0aGUgYXBwbGljYXRpb24gcnVubmluZywgeW91IHdpbGwgaG9wZWZ1bGx5IHNlZSBzb21ldGhpbmcgCisgICAgICAgIGxpa2UgdGhpczo8L1A+CisgICAgICA8UD48SU1HIFNSQz0iLi4vaW1hZ2VzL3NjcmVlbnNob3RzL2VtcHR5X3NjcmVlbi5naWYiPjwvUD4KKyAgICAgIDxQPlRoZSBkaXNwbGF5IG1heSBkaWZmZXIgYmVjYXVzZSBvZiBkaWZmZXJlbmNlcyBpbiB0aGUgdmFyaW91cyBKYXZhIFZpcnR1YWwgCisgICAgICAgIE1hY2hpbmVzIGFuZCBkaWZmZXJlbmNlcyBpbiBMb29rIGFuZCBGZWVscy4gQXQgdGhlIHRvcCBpcyBhIG1lbnUgYmFyIGFuZCAKKyAgICAgICAgYSBsb2dvLiBCZWxvdyB0aGUgbG9nbyBhbmQgdG8gdGhlIGxlZnQgaXMgYSBwYW5lIGluIHdoaWNoIGFsbCBvZiB0aGUgdmFyaW91cyAKKyAgICAgICAgbGFuZ3VhZ2UgZmlsZXMgd2lsbCBiZSBsaXN0ZWQgaW4gYSB0cmVlIHZpZXcuIFNpbmNlIG5vIHJlc291cmNlIGJ1bmRsZSAKKyAgICAgICAgaGFzIGJlZW4gc2VsZWN0ZWQsIHRoaXMgdHJlZSBpcyBjdXJyZW50bHkgZW1wdHkuIFRvIHRoZSByaWdodCBpcyBhIHRhYmJlZCAKKyAgICAgICAgcGFuZSBpbiB3aGljaCB0aHJlZSB2aWV3cyB3aWxsIGJlIHNob3duLiBUaGUgdmlld3Mgd2lsbCBlaXRoZXIgcHJlc2VudCAKKyAgICAgICAgaW5mb3JtYXRpb24gb3IgcHJvdmlkZSBhbiBpbnRlcmZhY2UgZm9yIGVkaXRpbmcgdGhlIHZhcmlvdXMgZGF0YSBjb250YWluZWQgCisgICAgICAgIGFjcm9zcyB5b3VyIHJlc291cmNlIGJ1bmRsZS48L1A+CisgICAgICA8UD48Qj5DdXN0b21pemluZyB0aGUgQXBwbGljYXRpb24gZm9yIFlvdTwvQj48L1A+CisgICAgICA8UD5HbyB0byB0aGUgT3B0aW9ucyBtZW51IGFuZCBzZWxlY3QgUHJlZmVyZW5jZXMuIFRoZSBmaXJzdCB0aW1lIGFmdGVyIG9wZW5pbmcgCisgICAgICAgIHRoZSBhcHBsaWNhdGlvbiwgaXQgbWF5IHRha2UgYSBmZXcgc2Vjb25kcyB0byBnZXQgdG8gdGhlIHByZWZlcmVuY2VzIGFzIAorICAgICAgICB0aGUgYXBwbGljYXRpb24gdHJpZXMgdG8gZ2V0IGluZm9ybWF0aW9uIGZyb20geW91ciB2aXJ0dWFsIG1hY2hpbmUuQSBkaWFsb2cgCisgICAgICAgIGJveCBzaG91bGQgYXBwZWFyIHRoYXQgbG9va3Mgc2ltaWxhciB0byB0aGlzOjwvUD4KKyAgICAgIDxQPjxJTUcgU1JDPSIuLi9pbWFnZXMvc2NyZWVuc2hvdHMvcHJlZmVyZW5jZXNfZGlhbG9nLmdpZiIgV0lEVEg9IjQyOSIgSEVJR0hUPSIyNjkiPjwvUD4KKyAgICAgIDxQPlRoZSBmaXJzdCB0aGluZyB0byBkbyBpcyB0byBjaGFuZ2UgdGhlIHVzZXIgbmFtZSB0byB5b3VyIG93biBuYW1lLiBZb3UgCisgICAgICAgIHdpbGwgb25seSBoYXZlIHRvIGRvIHRoaXMgb25jZSB1bmxlc3Mgc29tZW9uZSBlbHNlIHVzZXMgdGhpcyBhcHBsaWNhdGlvbiAKKyAgICAgICAgYW5kIGNoYW5nZXMgdGhlIG5hbWUuIFNlY29uZCwgeW91IHNob3VsZCBjaGFuZ2UgdGhlIGxvb2sgYW5kIGZlZWwgb2YgdGhlIAorICAgICAgICBhcHBsaWNhdGlvbiB0byB5b3VyIHByZWZlcmVuY2UuIEFsbCBvZiB0aGUgbG9vayBhbmQgZmVlbHMgdGhhdCB5b3VyIEpWTSAKKyAgICAgICAgc3VwcG9ydHMgc2hvdWxkIGJlIGxpc3RlZCBpbiB0aGUgZHJvcCBkb3duIGJveC4gKE5vdGUgdGhhdCBjaGFuZ2VzIHdpbGwgCisgICAgICAgIG5vdCB0YWtlIGFmZmVjdCB1bnRpbCBhZnRlciB5b3UgYXJlIGRvbmUgYW5kIGhhdmUgcHJlc3NlZCB0aGUgVXBkYXRlIGJ1dHRvbikuPC9QPgorICAgICAgPFA+VGhlIGxhc3QgdGhpbmcgdG8gY2hhbmdlIGlzIHRoZSBsb2NhbGUgeW91IHdvdWxkIGxpa2UgdG8gdXNlIHRvIHdvcmsgCisgICAgICAgIHdpdGggdGhpcyBhcHBsaWNhdGlvbi4gV2hlbiB5b3UgZG93bmxvYWQgUkJNYW5hZ2VyLCBpdCBpcyBzZXQgYnkgZGVmYXVsdCAKKyAgICAgICAgdG8gZGlzcGxheSBpbiBVLlMuIEVuZ2xpc2guIEFzIG9mIHRoaXMgd3JpdGluZywgeW91IGNhbiB1c2UgdGhlIHByb2dyYW0gCisgICAgICAgIGluIEZpbm5pc2gsIFN3ZWRpc2gsIGFuZCBHZXJtYW4gYXMgd2VsbC4gVGhyZWUgbGlzdHMgY2hvaWNlcyBhcmUgcG9zc2libGUgCisgICAgICAgIGZvciBzZWxlY3RpbmcgYSBsb2NhbGUuIFRoZSBmaXJzdCwgY2FsbGVkICdNYWNoaW5lIFN1cHBvcnRlZCcsIGxpc3RzIGFsbCAKKyAgICAgICAgb2YgdGhlIGxvY2FscyBzdXBwb3J0ZWQgYnkgeW91ciBKVk0uIFRoZSBzZWNvbmQsIGNhbGxlZCAnRGVmaW5lZCBmb3IgUkJNYW5hZ2VyJywgCisgICAgICAgIGFuYWx5emVzIHRoZSBSZXNvdXJjZSBCdW5kbGUgZm9yIFJCTWFuYWdlciBhbmQgbGV0cyB5b3Ugc2VsZWN0IGZyb20gdGhlIAorICAgICAgICBhdmFpbGFibGUgdHJhbnNsYXRpb24gZmlsZXMuIFRoZSB0aGlyZCBvcHRpb24sIGNhbGxlZCAnSVNPIFN0YW5kYXJkcycsIAorICAgICAgICBsaXN0cyBhbGwgb2YgdGhlIGxhbmd1YWdlIGFuZCBjb3VudHJ5IDItbGV0dGVyIGNvZGVzIGRlZmluZWQgYnkgdGhlIElTTy4gCisgICAgICAgIFlvdSBtYXkgc2VsZWN0IGFueSBvZiB0aGUgdGhyZWUgb3B0aW9ucyBieSB1c2Ugb2YgdGhlIHJhZGlvIGJ1dHRvbiBvbiAKKyAgICAgICAgdGhlIGxlZnQgYW5kIHRoZW4gc2VsZWN0IHRoZSBlbmNvZGluZyB5b3Ugd291bGQgbGlrZSB0byB1c2UuIE9mIGNvdXJzZSAKKyAgICAgICAgaWYgdGhlIGVuY29kaW5nIHlvdSBzZWxlY3QgaXMgbm90IHN1cHBvcnRlZCBieSBSQk1hbmFnZXIsIHRoZSB0cmFuc2xhdGlvbnMgCisgICAgICAgIGluIHRoZSBiYXNlIGNsYXNzIG9mIHRoZSBidW5kbGUgd2lsbCBiZSB1c2VkLCB3aGljaCBhcmUgaW4gRW5nbGlzaC4gQWxzbyAKKyAgICAgICAgbm90ZSwgdGhhdCB0aGUgYmFzZSBjbGFzcyBsYW5ndWFnZSBtYXkgbm90IGFwcGVhciBpbiB0aGUgJ0RlZmluZWQgZm9yIAorICAgICAgICBSQk1hbmFnZXInIHNlY3Rpb24gYmVjYXVzZSB0aGUgZW5jb2RpbmcgaXMgbm90IGFsd2F5cyBzcGVjaWZpZWQgZm9yIHRoYXQgCisgICAgICAgIGZpbGUuIDwvUD4KKyAgICAgIDxQPldoZW4geW91IGFyZSBkb25lIG1ha2luZyB5b3VyIHBlcnNvbmFsaXplZCBzZWxlY3Rpb25zLCBjbGljayBvbiB0aGUgVXBkYXRlIAorICAgICAgICBidXR0b24uIFRoZSBwcmVmZXJlbmNlcyB3aWxsIGJlIHNhdmVkIGluIGEgZmlsZSBjYWxsZWQgcHJlZmVyZW5jZXMucHJvcGVydGllcyAKKyAgICAgICAgc3RvcmVkIGluIHlvdXIgUkJNYW5hZ2VyIGRpcmVjdG9yeS4gWW91IHdpbGwgbm90IG5lZWQgdG8gbWFrZSB0aGVzZSBzZWxlY3Rpb25zIAorICAgICAgICBpbiB0aGUgZnV0dXJlLCB1bmxlc3MgeW91IHdhbnQgdG8gY2hhbmdlIHlvdXIgZGVmYXVsIG9wdGlvbnMuPC9QPgorICAgICAgPFA+PEEgSFJFRj0iaW5kZXguaHRtbCI+QmFjayB0byB0aGUgVHV0b3JpYWwgTWVudTwvQT4gLW9yLSA8QSBIUkVGPSJzdGVwMi5odG1sIj5Gb3J3YXJkIAorICAgICAgICB0byBTdGVwIDI8L0E+PC9QPgorICAgICAgPCEtLSAjRW5kRWRpdGFibGUgLS0+PC9URD4KKwk8L1RSPgorCTxUUj4KKwkJPFREIEJBQ0tHUk9VTkQ9Ii4uL2ltYWdlcy90ZW1wbGF0ZV9sbC5naWYiIEhFSUdIVD0iNDAiIFdJRFRIPSIyMDAiPgorCQkJPCEtLSBDb21tZW50IC0tPgorCQk8L1REPgorCQk8VEQgV0lEVEg9IjgwIj4KKwkJCTwhLS0gQ29tbWVudCAtLT4KKwkJPC9URD4KKwkJPFREPgorCQkJPENFTlRFUj48U1BBTiBDTEFTUz0iQ29weXJpZ2h0Ij5Db3B5cmlnaHQgMjAwMC0yMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMsIEFsbCBSaWdodHMgUmVzZXJ2ZWQ8L1NQQU4+PC9DRU5URVI+CisJCTwvVEQ+CisJPC9UUj4KKzwvVEFCTEU+CisKKzwvQk9EWT4KKzwhLS0gI0VuZFRlbXBsYXRlIC0tPjwvSFRNTD4KZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL3R1dG9yaWFsL3N0ZXAyLmh0bWwgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy90dXRvcmlhbC9zdGVwMi5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0YmViNDcKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy90dXRvcmlhbC9zdGVwMi5odG1sCkBAIC0wLDAgKzEsMTQ4IEBACis8SFRNTD48IS0tICNCZWdpblRlbXBsYXRlICIvVGVtcGxhdGVzL01haW5UZW1wbGF0ZS5kd3QiIC0tPgorPEhFQUQ+Cis8IS0tICNCZWdpbkVkaXRhYmxlICJkb2N0aXRsZSIgLS0+IAorPFRJVExFPlJCIE1hbmFnZXIgVHV0b3JpYWwgLSBDcmVhdGluZyBSZXNvdXJjZXM8L1RJVExFPgorPCEtLSAjRW5kRWRpdGFibGUgLS0+IAorPE1FVEEgSFRUUC1FUVVJVj0iQ29udGVudC1UeXBlIiBDT05URU5UPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8U1RZTEUgVFlQRT0iVEVYVC9DU1MiPgorPCEtLQorLnRvcGljSGVhZCB7ICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsgZm9udC1zaXplOiAxNHB0OyBmb250LXdlaWdodDogYm9sZDsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogIzMzMzMzM30KKy50b3BpY0xpc3QgeyAgZm9udC1mYW1pbHk6IEdlb3JnaWEsICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7IGZvbnQtc2l6ZTogOXB0OyBjb2xvcjogI0ZGMDA5OTsgbGlzdC1zdHlsZS1pbWFnZTogdXJsKC4uL2ltYWdlcy9kaWFtb25kX2J1bGxldC5naWYpOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IGZvbnQtd2VpZ2h0OiBib2xkfQorLm1haW5CbG9jayB7ICBmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMnB0OyBtYXJnaW4tdG9wOiA1cHg7IG1hcmdpbi1yaWdodDogNXB4OyBtYXJnaW4tYm90dG9tOiA1cHg7IG1hcmdpbi1sZWZ0OiA1cHg7IHBhZGRpbmctdG9wOiA1cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7IHBhZGRpbmctYm90dG9tOiA1cHg7IHBhZGRpbmctbGVmdDogMTBweDsgdGV4dC1hbGlnbjoganVzdGlmeX0KKy0tPgorPC9TVFlMRT4KKzwvSEVBRD4KKworPEJPRFkgQkdDT0xPUj0iI0ZGRkZGRiIgTEVGVE1BUkdJTj0iMCIgVE9QTUFSR0lOPSIwIiBNQVJHSU5XSURUSD0iMCIgTUFSR0lOSEVJR0hUPSIwIj4KKzxUQUJMRSBXSURUSD0iMTAwJSIgQk9SREVSPSIwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjAiPgorICA8VFI+CisgICAgPFREIFJPV1NQQU49IjIiIENPTFNQQU49IjIiIEJBQ0tHUk9VTkQ9Ii4uL2ltYWdlcy90ZW1wbGF0ZV91bC5naWYiIEhFSUdIVD0iNzUiPjxJTUcgU1JDPSIuLi9pbWFnZXMvc3BhY2VyLmdpZiIgV0lEVEg9IjI4MCIgSEVJR0hUPSIxIiBIU1BBQ0U9IjAiPjwvVEQ+CisJCTxURCBIRUlHSFQ9IjE1IiAgV0lEVEg9IjEwMCUiIEJBQ0tHUk9VTkQ9Ii4uL2ltYWdlcy90ZW1wbGF0ZV91LmdpZiI+PC9URD4KKwk8L1RSPgorCTxUUj4KKwkJPFREIEhFSUdIVD0iNjAiID4KKwkJCTxDRU5URVI+PElNRyBTUkM9Ii4uL2ltYWdlcy9UaXRsZUxvZ29fdHJhbnNwYXJlbnQuZ2lmIiBWU1BBQ0U9IjAiPjwvQ0VOVEVSPgorCQk8L1REPgorCTwvVFI+CisJPFRSPgorCQkKKyAgICA8VEQgV0lEVEg9IjIwMCIgQkFDS0dST1VORD0iLi4vaW1hZ2VzL3RlbXBsYXRlX2wuZ2lmIiBWQUxJR049InRvcCI+CisJCTxUQUJMRSBXSURUSD0iMTgwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjEiPiAKKyAgICAgIAk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljSGVhZCI+R2VuZXJhbDwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBWQUxJR049ImNlbnRlciI+PElNRyBTUkM9Ii4uL2ltYWdlcy90ZW1wbGF0ZV9saW5lLmdpZiI+PC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0xpc3QiPgorCSAgICAgICAgPFVMPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vc3lzdGVtX3JlcXVpcmVtZW50cy5odG1sIj5TeXN0ZW0gUmVxdWlyZW1lbnRzPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9mYXEuaHRtbCI+RkFRPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9mdXR1cmVfZmVhdHVyZXMuaHRtbCI+RnV0dXJlIFJlbGVhc2VzPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMSSBDTEFTUz0idG9waWNMaXN0Ij48QSBIUkVGPSIuLi9mdXR1cmVfZmVhdHVyZXMuaHRtbCI+VmVyc2lvbiAKKyAgICAgICAgICAgICAgICBIaXN0b3J5PC9BPjwvTEk+CisgICAgICAgICAgICA8L1VMPgorCQkJPC9URD4KKwkJPC9UUj4KKyAgICAgIAk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljSGVhZCI+UkIgTWFuYWdlcjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBWQUxJR049ImNlbnRlciI+PElNRyBTUkM9Ii4uL2ltYWdlcy90ZW1wbGF0ZV9saW5lLmdpZiI+PC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0xpc3QiPgorCSAgICAgICAgPFVMPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vaW5kZXguaHRtbCI+SG9tZTwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iaW5kZXguaHRtbCI+VHV0b3JpYWw8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL3ZpZXdzL2luZGV4Lmh0bWwiPkZ1bmN0aW9uYWxpdHkgYW5kIFZpZXdzPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9sb29rYW5kZmVlbC5odG1sIj5Mb29rIGFuZCBGZWVsPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9tZW51Lmh0bWwiPk1lbnUgSXRlbXM8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJIENMQVNTPSJ0b3BpY0xpc3QiPjxBIEhSRUY9InN0ZXAxLmh0bWwiPlByZWZlcmVuY2VzPC9BPjwvTEk+CisgICAgICAgICAgICA8L1VMPgorCQkJPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0hlYWQiPlJCIFJlcG9ydGVyPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIFZBTElHTj0iY2VudGVyIj48SU1HIFNSQz0iLi4vaW1hZ2VzL3RlbXBsYXRlX2xpbmUuZ2lmIj48L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljTGlzdCI+CisJICA8VUw+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9SQlJlcG9ydGVyLmh0bWwiPkhvbWU8L0E+PC9MST4KKyAgICAgICAgPExJPlJlcG9ydCBUeXBlczwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9zY2FuZmlsZS5odG1sIj5Db2RlIFNjYW5uaW5nPC9BPjwvTEk+CisgICAgICAgICAgICA8L1VMPgorCQkJPC9URD4KKwkJPC9UUj4KKwk8L1RBQkxFPgorCisgICAgICA8UD4mbmJzcDsgPC9QPgorICAgICAgPC9URD4KKwkJCisgICAgPFREIENPTFNQQU49IjIiIFZBTElHTj0idG9wIiBDTEFTUz0ibWFpbkJsb2NrIj48IS0tICNCZWdpbkVkaXRhYmxlICJNYWluIiAtLT4gCisgICAgICA8SDMgQUxJR049IkNFTlRFUiI+U3RlcCAyLiBDcmVhdGluZyBhIE5ldyBSZXNvdXJjZSBCdW5kbGU8L0gzPgorICAgICAgPFA+PEI+VGhpbmdzIHRvIENvbnNpZGVyPC9CPjwvUD4KKyAgICAgIDxQPkEgcmVzb3VyY2UgYnVuZGxlIGluIHRlcm1zIG9mIHRoaXMgYXBwbGljYXRpb24gaXMgYSBncm91cCBvZiBwcm9wZXJ0eSAKKyAgICAgICAgZmlsZXMgd2l0aCB0aGUgc2FtZSBiYXNlIGNsYXNzIG5hbWUuIEZvciBpbnN0YW5jZSwgdGhlIHJlc291cmNlIGJ1bmRsZSAKKyAgICAgICAgZm9yIFJCIE1hbmFnZXIgaW5jbHVkZXMgZmlsZXM6IDxjb2RlPlJCTWFuYWdlci5wcm9wZXJ0aWVzPC9DT0RFPiwgPGNvZGU+UkJNYW5hZ2VyX2RlLnByb3BlcnRpZXM8L0NPREU+LCAKKyAgICAgICAgPGNvZGU+UkJNYW5nZXJfZmkucHJvcGVydGllczwvQ09ERT4sIGV0Yy4gSW4gZnV0dXJlIHZlcnNpb25zIG9mIHRoZSBwcm9ncmFtLCAKKyAgICAgICAgUkIgTWFuYWdlciB3aWxsIGJlIGV4dGVuZGVkIHRvIHN1cHBvcnQgaW1wb3J0aW5nIGFuZCBleHBvcnRpbmcgZGF0YSBmcm9tIAorICAgICAgICBvdGhlciBsYW5ndWFnZSB0cmFuc2xhdGlvbnMgc2NoZW1hcyBzdWNoIGFzIHRoZSBYTUwgaW50ZXJuYXRpb25hbGl6YXRpb24gCisgICAgICAgIHN0YW5kYXJkLCBUTVguPC9QPgorICAgICAgPFA+WW91IGNhbiBoYXZlIGFzIG1hbnkgUmVzb3VyY2UgQnVuZGxlcyBhcyB5b3UgbGlrZSBmb3IgYW4gYXBwbGljYXRpb24sIAorICAgICAgICB0aG91Z2ggbW9zdCB0ZWFtcyBjaG9vc2UgdG8gd29yayB3aXRoIGp1c3Qgb25lLiBSQiBNYW5hZ2VyIGFsbG93cyB5b3UgCisgICAgICAgIHRvIHdvcmsgb24gb25lIHJlc291cmNlIGJ1bmRsZSBhdCBhIHRpbWUsIGVkaXRpbmcgZWl0aGVyIGluZGl2aWR1YWwgdHJhbnNsYXRpb24gCisgICAgICAgIGZpbGVzIG9yIGdyb3VwcyBvZiB0cmFuc2xhdGlvbiBmaWxlcyB3aXRoaW4gdGhlIGJ1bmRsZS4gV2hlbiB5b3UgY3JlYXRlIAorICAgICAgICBhIHJlc291cmNlIGJ1bmRsZSB5b3Ugd2lsbCBiZSBjcmVhdGluZyB0aGUgYmFzZSBjbGFzcyB0cmFuc2xhdGlvbiBmaWxlIAorICAgICAgICBmb3IgdGhhdCBidW5kbGUuIE90aGVyIGZpbGVzIGNhbiBiZSBhZGRlZCBhdCBhbnkgdGltZSBsYXRlci4gVGhlIGJhc2UgCisgICAgICAgIGNsYXNzIHRyYW5zbGF0aW9uIGZpbGUgcHJvdmlkZXMgYSBkZWZhdWx0IHRyYW5zbGF0aW9uIGluIGNhc2UgbG9jYWxlcyAKKyAgICAgICAgYXJlIG5vdCBzcGVjaWZpZWQgb3IgYSByZXNvdXJjZSB0cmFuc2xhdGlvbiBmaWxlIGRvZXMgbm90IGV4aXN0IGZvciB0aGUgCisgICAgICAgIGxvY2FsZSB0aGF0IGlzIHNwZWNpZmllZC48L1A+CisgICAgICA8UD5Zb3Ugd2lsbCBoYXZlIHRvIGNob29zZSBhIGJhc2UgY2xhc3MgbmFtZSBmb3IgdGhlIHJlc291cmNlIGJ1bmRsZS4gVGhhdCAKKyAgICAgICAgbmFtZSBtYXkgaGF2ZSBubyB3aGl0ZSBzcGFjZXMgYW5kIG5vIHVuZGVyc2NvcmVzLCBhbmQgaXQgc2hvdWxkIHJlbWluZCAKKyAgICAgICAgeW91IGluIHNvbWUgd2F5IG9mIHRoZSBwcm9qZWN0IG9yIGZ1bmN0aW9uIHRvIHdoaWNoIGl0IGlzIGF0dGFjaGVkLiBZb3UgCisgICAgICAgIHdpbGwgYWxzbyBoYXZlIHRvIGVudGVyIGEgbmFtZSBmb3IgdGhlIHBlcnNvbiBvciBwZW9wbGUgaW4gY2hhcmdlIG9mIG1hbmFnaW5nIAorICAgICAgICB0aGUgcmVzb3VyY2UgYnVuZGxlLjwvUD4KKyAgICAgIDxQPjxCPkNyZWF0aW5nIHRoZSBSZXNvdXJjZSBCdW5kbGU8L0I+PC9QPgorICAgICAgPFA+RnJvbSB0aGUgRmlsZSBtZW51LCBzZWxlY3QgJ05ldyBSZXNvdXJjZSBCdW5kbGUuLi4nIFlvdSB3aWxsIGJlIHByb21wdGVkIAorICAgICAgICB0byBlbnRlciB0aGUgYmFzZSBjbGFzcyBuYW1lLiBJZiB5b3UgZW50ZXIgYSBwcm9wZXJseSBmb3JtYXR0ZWQgbmFtZSwgCisgICAgICAgIHRoZSB0cmVlIGRpc3BsYXkgb24gdGhlIGxvd2VyIGxlZnQgd2lsbCBjaGFuZ2UgdG8gcmVmbGVjdCB0aGUgbmFtZSB5b3UgCisgICAgICAgIGVudGVyZWQuIENsaWNrIG9uIHRoZSBuYW1lIG9mIHlvdXIgcmVzb3VyY2UgYnVuZGxlLCBhbmQgbWFrZSBzdXJlIHRoZSAKKyAgICAgICAgJ1N0YXRpc3RpY3MnIHRhYiBpcyBzZWxlY3RlZC4gWW91IHNob3VsZCBzZWUgc29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZzo8L1A+CisgICAgICA8UD48SU1HIFNSQz0iLi4vaW1hZ2VzL3NjcmVlbnNob3RzL25ld19idW5kbGUuZ2lmIiBXSURUSD0iNTUyIiBIRUlHSFQ9IjM4NSI+PC9QPgorICAgICAgPFA+VGhlIG9ubHkgcmVzb3VyY2UgZmlsZSB5b3UgaGF2ZSBpcyB0aGF0IG9mIHRoZSBiYXNlIGNsYXNzLiBTZWxlY3QgdGhlIAorICAgICAgICAnKEJhc2UgQ2xhc3MpJyBub2RlIG9mIHRoZSB0cmVlIGJ5IGNsaWNraW5nIG9uIGl0LiBZb3Ugc2hvdWxkIG5vdyBzZWUgCisgICAgICAgIHRoZSBmb2xsb3dpbmc6PC9QPgorICAgICAgPFA+PElNRyBTUkM9Ii4uL2ltYWdlcy9zY3JlZW5zaG90cy9uZXdfYmFzZWNsYXNzLmdpZiIgV0lEVEg9IjY3NiIgSEVJR0hUPSI1MTEiPjwvUD4KKyAgICAgIDxQPlRoZSBmaWVsZHMgcmVwcmVzZW50ZWQgaGVyZSBoYXZlIG5vIGJlYXJpbmcgb24gaG93IHRoZSB0cmFuc2xhdGlvbnMgd2lsbCAKKyAgICAgICAgd29yayBpbiB5b3VyIGFwcGxpY2F0aW9uLCBidXQgZ2l2ZSBSQk1hbmFnZXIgc29tZSBtZXRhZGF0YSB0byBiZXR0ZXIgb3JnYW5pemUgCisgICAgICAgIHRoZSBmaWxlLiBSZXNvdXJjZSBUaXRsZSBzaG91bGQgYmUgYSBzaG9ydCB0aXRsZSB0aGF0IHJlcHJlc2VudHMgdGhpcyAKKyAgICAgICAgZmlsZSwgc3VjaCBhcyAnUkJUdXRvcmlhbCBCYXNlIENsYXNzJy4gWW91IGNhbiBlbnRlciBhbnkgY29tbWVudCBhbmQgZmlsZSAKKyAgICAgICAgbWFuYWdlciB2YWx1ZSB5b3UgbGlrZS4gVGhlIGxhbmd1YWdlLCBjb3VudHJ5LCBhbmQgdmFyaWFudCBmaWVsZHMgcHJvdmlkZSAKKyAgICAgICAgYSBwbGFjZSBmb3IgbGlzdGluZyB0aGUgZnVsbCBuYW1lIG9mIHRoZSBsYW5ndWFnZSwgY291bnRyeSwgYW5kIHZhcmlhbnQgCisgICAgICAgIHNvIHRoYXQgeW91IGRvIG5vdCBoYXZlIHRvIHJlbHkgb24gdHdvIG9yIHRocmVlIGxldHRlciBlbmNvZGluZ3MuIFlvdSAKKyAgICAgICAgY2FuIGFsc28gbGVhdmUgdGhlc2UgZmllbGRzIGJsYW5rIGlmIHRoZXkgYXJlIG5vdCByZWxldmFudC4gT25jZSB5b3UgaGF2ZSAKKyAgICAgICAgZW50ZXJlZCB0aGVzZSB2YWx1ZXMgaW4sIGZpbmFsaXplIHRoZW0gYnkgcHJlc3NpbmcgdGhlICdVcGRhdGUnIGJ1dHRvbi48L1A+CisgICAgICA8UD48QSBIUkVGPSJzdGVwMS5odG1sIj5CYWNrIHRvIFN0ZXAgMTwvQT4gLW9yLSA8QSBIUkVGPSJzdGVwMy5odG1sIj5Gb3J3YXJkIAorICAgICAgICB0byBTdGVwIDM8L0E+PC9QPgorICAgICAgPCEtLSAjRW5kRWRpdGFibGUgLS0+PC9URD4KKwk8L1RSPgorCTxUUj4KKwkJPFREIEJBQ0tHUk9VTkQ9Ii4uL2ltYWdlcy90ZW1wbGF0ZV9sbC5naWYiIEhFSUdIVD0iNDAiIFdJRFRIPSIyMDAiPgorCQkJPCEtLSBDb21tZW50IC0tPgorCQk8L1REPgorCQk8VEQgV0lEVEg9IjgwIj4KKwkJCTwhLS0gQ29tbWVudCAtLT4KKwkJPC9URD4KKwkJPFREPgorCQkJPENFTlRFUj48U1BBTiBDTEFTUz0iQ29weXJpZ2h0Ij5Db3B5cmlnaHQgMjAwMC0yMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMsIEFsbCBSaWdodHMgUmVzZXJ2ZWQ8L1NQQU4+PC9DRU5URVI+CisJCTwvVEQ+CisJPC9UUj4KKzwvVEFCTEU+CisKKzwvQk9EWT4KKzwhLS0gI0VuZFRlbXBsYXRlIC0tPjwvSFRNTD4KZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL3R1dG9yaWFsL3N0ZXAzLmh0bWwgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy90dXRvcmlhbC9zdGVwMy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NzhlZGUKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy90dXRvcmlhbC9zdGVwMy5odG1sCkBAIC0wLDAgKzEsMTM1IEBACis8SFRNTD48IS0tICNCZWdpblRlbXBsYXRlICIvVGVtcGxhdGVzL01haW5UZW1wbGF0ZS5kd3QiIC0tPgorPEhFQUQ+Cis8IS0tICNCZWdpbkVkaXRhYmxlICJkb2N0aXRsZSIgLS0+IAorPFRJVExFPlJCIE1hbmFnZXIgVHV0b3JpYWwgLSBDcmVhdGluZyBHcm91cHM8L1RJVExFPgorPCEtLSAjRW5kRWRpdGFibGUgLS0+IAorPE1FVEEgSFRUUC1FUVVJVj0iQ29udGVudC1UeXBlIiBDT05URU5UPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8U1RZTEUgVFlQRT0iVEVYVC9DU1MiPgorPCEtLQorLnRvcGljSGVhZCB7ICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsgZm9udC1zaXplOiAxNHB0OyBmb250LXdlaWdodDogYm9sZDsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogIzMzMzMzM30KKy50b3BpY0xpc3QgeyAgZm9udC1mYW1pbHk6IEdlb3JnaWEsICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7IGZvbnQtc2l6ZTogOXB0OyBjb2xvcjogI0ZGMDA5OTsgbGlzdC1zdHlsZS1pbWFnZTogdXJsKC4uL2ltYWdlcy9kaWFtb25kX2J1bGxldC5naWYpOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IGZvbnQtd2VpZ2h0OiBib2xkfQorLm1haW5CbG9jayB7ICBmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMnB0OyBtYXJnaW4tdG9wOiA1cHg7IG1hcmdpbi1yaWdodDogNXB4OyBtYXJnaW4tYm90dG9tOiA1cHg7IG1hcmdpbi1sZWZ0OiA1cHg7IHBhZGRpbmctdG9wOiA1cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7IHBhZGRpbmctYm90dG9tOiA1cHg7IHBhZGRpbmctbGVmdDogMTBweDsgdGV4dC1hbGlnbjoganVzdGlmeX0KKy0tPgorPC9TVFlMRT4KKzwvSEVBRD4KKworPEJPRFkgQkdDT0xPUj0iI0ZGRkZGRiIgTEVGVE1BUkdJTj0iMCIgVE9QTUFSR0lOPSIwIiBNQVJHSU5XSURUSD0iMCIgTUFSR0lOSEVJR0hUPSIwIj4KKzxUQUJMRSBXSURUSD0iMTAwJSIgQk9SREVSPSIwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjAiPgorICA8VFI+CisgICAgPFREIFJPV1NQQU49IjIiIENPTFNQQU49IjIiIEJBQ0tHUk9VTkQ9Ii4uL2ltYWdlcy90ZW1wbGF0ZV91bC5naWYiIEhFSUdIVD0iNzUiPjxJTUcgU1JDPSIuLi9pbWFnZXMvc3BhY2VyLmdpZiIgV0lEVEg9IjI4MCIgSEVJR0hUPSIxIiBIU1BBQ0U9IjAiPjwvVEQ+CisJCTxURCBIRUlHSFQ9IjE1IiAgV0lEVEg9IjEwMCUiIEJBQ0tHUk9VTkQ9Ii4uL2ltYWdlcy90ZW1wbGF0ZV91LmdpZiI+PC9URD4KKwk8L1RSPgorCTxUUj4KKwkJPFREIEhFSUdIVD0iNjAiID4KKwkJCTxDRU5URVI+PElNRyBTUkM9Ii4uL2ltYWdlcy9UaXRsZUxvZ29fdHJhbnNwYXJlbnQuZ2lmIiBWU1BBQ0U9IjAiPjwvQ0VOVEVSPgorCQk8L1REPgorCTwvVFI+CisJPFRSPgorCQkKKyAgICA8VEQgV0lEVEg9IjIwMCIgQkFDS0dST1VORD0iLi4vaW1hZ2VzL3RlbXBsYXRlX2wuZ2lmIiBWQUxJR049InRvcCI+CisJCTxUQUJMRSBXSURUSD0iMTgwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjEiPiAKKyAgICAgIAk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljSGVhZCI+R2VuZXJhbDwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBWQUxJR049ImNlbnRlciI+PElNRyBTUkM9Ii4uL2ltYWdlcy90ZW1wbGF0ZV9saW5lLmdpZiI+PC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0xpc3QiPgorCSAgICAgICAgPFVMPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vc3lzdGVtX3JlcXVpcmVtZW50cy5odG1sIj5TeXN0ZW0gUmVxdWlyZW1lbnRzPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9mYXEuaHRtbCI+RkFRPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9mdXR1cmVfZmVhdHVyZXMuaHRtbCI+RnV0dXJlIFJlbGVhc2VzPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMSSBDTEFTUz0idG9waWNMaXN0Ij48QSBIUkVGPSIuLi9mdXR1cmVfZmVhdHVyZXMuaHRtbCI+VmVyc2lvbiAKKyAgICAgICAgICAgICAgICBIaXN0b3J5PC9BPjwvTEk+CisgICAgICAgICAgICA8L1VMPgorCQkJPC9URD4KKwkJPC9UUj4KKyAgICAgIAk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljSGVhZCI+UkIgTWFuYWdlcjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBWQUxJR049ImNlbnRlciI+PElNRyBTUkM9Ii4uL2ltYWdlcy90ZW1wbGF0ZV9saW5lLmdpZiI+PC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0xpc3QiPgorCSAgICAgICAgPFVMPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vaW5kZXguaHRtbCI+SG9tZTwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iaW5kZXguaHRtbCI+VHV0b3JpYWw8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL3ZpZXdzL2luZGV4Lmh0bWwiPkZ1bmN0aW9uYWxpdHkgYW5kIFZpZXdzPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9sb29rYW5kZmVlbC5odG1sIj5Mb29rIGFuZCBGZWVsPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9tZW51Lmh0bWwiPk1lbnUgSXRlbXM8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJIENMQVNTPSJ0b3BpY0xpc3QiPjxBIEhSRUY9InN0ZXAxLmh0bWwiPlByZWZlcmVuY2VzPC9BPjwvTEk+CisgICAgICAgICAgICA8L1VMPgorCQkJPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0hlYWQiPlJCIFJlcG9ydGVyPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIFZBTElHTj0iY2VudGVyIj48SU1HIFNSQz0iLi4vaW1hZ2VzL3RlbXBsYXRlX2xpbmUuZ2lmIj48L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljTGlzdCI+CisJICA8VUw+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9SQlJlcG9ydGVyLmh0bWwiPkhvbWU8L0E+PC9MST4KKyAgICAgICAgPExJPlJlcG9ydCBUeXBlczwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9zY2FuZmlsZS5odG1sIj5Db2RlIFNjYW5uaW5nPC9BPjwvTEk+CisgICAgICAgICAgICA8L1VMPgorCQkJPC9URD4KKwkJPC9UUj4KKwk8L1RBQkxFPgorCisgICAgICA8UD4mbmJzcDsgPC9QPgorICAgICAgPC9URD4KKwkJCisgICAgPFREIENPTFNQQU49IjIiIFZBTElHTj0idG9wIiBDTEFTUz0ibWFpbkJsb2NrIj48IS0tICNCZWdpbkVkaXRhYmxlICJNYWluIiAtLT4KKyAgICAgIDxESVYgQUxJR049IkNFTlRFUiI+CisgICAgICAgIDxIMz5DcmVhdGluZyBHcm91cHMgd2l0aGluIHRoZSBCdW5kbGU8L0gzPgorICAgICAgICA8UCBBTElHTj0iTEVGVCI+PEI+V2hhdCBpcyBhIEdyb3VwPzwvQj48L1A+CisgICAgICAgIDxQIEFMSUdOPSJMRUZUIj5PbmUgb2YgdGhlIGZ1bmRhbWVudGFsIHByb2JsZW1zIHdpdGggbWFuYWdpbmcgcmVzb3VyY2UgCisgICAgICAgICAgYnVuZGxlcyBhY3Jvc3MgbGFyZ2UgcHJvamVjdHMgaXMgdGhhdCBpbmRpdmlkdWFsIHJlc291cmNlcyBvZnRlbiBnb3QgCisgICAgICAgICAgbG9zdCBpbiB0aGUgdmFzdCBudW1iZXIgb2YgdHJhbnNsYXRpb25zLiBCeSBjcmVhdGluZyBncm91cHMgd2l0aGluIHJlc291cmNlcywgCisgICAgICAgICAgUkJNYW5hZ2VyIG1ha2VzIGl0IG11Y2ggc2ltcGxlciB0byBtYW5hZ2UgdGhlIGRhdW50aW5nIG51bWJlciBvZiB0cmFuc2xhdGlvbnMuIAorICAgICAgICAgIFRoZSByZXNvdXJjZSBidW5kbGUgaXMgbGlrZSBhIHRyZWUgd2l0aCB0aGUgZmlsZXMgYXQgdGhlIHVwcGVyIGxldmVscy4gCisgICAgICAgICAgQmVuZWF0aCB0aGUgZmlsZSBsZXZlbCBpcyB0aGUgZ3JvdXAgbGV2ZWwsIGFuZCBiZW5lYXRoIHRoYXQsIHRoZSBpbmRpdmlkdWFsIAorICAgICAgICAgIHJlc291cmNlcy48L1A+CisgICAgICAgIDxQIEFMSUdOPSJMRUZUIj5UaGUgb25seSBtZXRhIGRhdGEgdGhhdCBncm91cHMgY29udGFpbiBhcmUgbmFtZSBhbmQgY29tbWVudC4gCisgICAgICAgICAgVGhlIG5hbWUgaXMgYSB3YXkgb2YgaWRlbnRpZnlpbmcgdGhlIGdyb3VwIGZyb20gYSBsaXN0IG9mIGdyb3VwcywgYW5kIAorICAgICAgICAgIHRoZSBjb21tZW50IGlzIGEgcXVpY2sgZGVzY3JpcHRpb24gYWJvdXQgd2hhdCB0aGUgZ3JvdXAgY29udGFpbnMuPC9QPgorICAgICAgICA8UCBBTElHTj0iTEVGVCI+PEI+Q3JlYXRpbmcgYSBHcm91cDwvQj48L1A+CisgICAgICAgIDxQIEFMSUdOPSJMRUZUIj5MaWtlIGFueSBvdGhlciBlZGl0aW5nIHRoYXQgYWZmZWN0cyB0aGUgZW50aXJlIHJlc291cmNlIAorICAgICAgICAgIGJ1bmRsZSwgdGhlIGNyZWF0aW9uIG9mIGEgZ3JvdXAgY2FuIG5vdCBiZSBkb25lIGZyb20gdGhlIGluZGl2aWR1YWwgCisgICAgICAgICAgbGFuZ3VhZ2UgZmlsZSBsZXZlbC4gVHdvIHdheXMgZXhpc3QgdG8gY3JlYXRlIGEgZ3JvdXAuIFRoZSBmaXJzdCBpcyAKKyAgICAgICAgICB0byBzZWxlY3QgdGhlIGJhc2UgY2xhc3MgYXQgdGhlIHRvcCBvZiB0aGUgcmVzb3VyY2UgYnVuZGxlIHRyZWUsIHNlbGVjdCAKKyAgICAgICAgICB0aGUgJ0dyb3VwcycgdGFiLCBhbmQgY2xpY2sgdGhlICdDcmVhdGUgR3JvdXAnIGJ1dHRvbi4gVGhlIHNlY29uZCB3YXkgCisgICAgICAgICAgaXMgdG8gZ28gdG8gdGhlICdPcHRpb25zJyBtZW51IGFuZCBzZWxlY3QgJ0FkZCBOZXcgR3JvdXAnLiBUaGUgc2Vjb25kIAorICAgICAgICAgIG1ldGhvZCBjYW4gYmUgdXNlZCBubyBtYXR0ZXIgd2hhdCB5b3VyIGN1cnJlbnQgdmlldyBpcyBvbiB0aGUgbG93ZXIgCisgICAgICAgICAgcmlnaHQgcGFuZWwuPC9QPgorICAgICAgICA8UCBBTElHTj0iTEVGVCI+T25jZSB5b3UgaGF2ZSBmb2xsb3dlZCBvbmUgb2YgdGhlc2UgdHdvIG1ldGhvZHMsIHRoZSBmb2xsb3dpbmcgCisgICAgICAgICAgZGlhbG9nIHNob3VsZCBhcHBlYXI6PC9QPgorICAgICAgICA8UCBBTElHTj0iTEVGVCI+PElNRyBTUkM9Ii4uL2ltYWdlcy9zY3JlZW5zaG90cy9jcmVhdGVfZ3JvdXAuZ2lmIiBXSURUSD0iNDA4IiBIRUlHSFQ9IjEwOSI+PC9QPgorICAgICAgICA8UCBBTElHTj0iTEVGVCI+RW50ZXIgYSBuYW1lIGFuZCBjb21tZW50IGZvciB0aGUgZ3JvdXAsIGFuZCBjbGljayBvbiAnQ3JlYXRlJy4gCisgICAgICAgICAgTm93IHlvdSBoYXZlIGEgZ3JvdXAuIFlvdSBjYW4gYWRkIG1vcmUgZ3JvdXBzIG5vdyBvciBhdCBhbnkgdGltZS4gWW91IAorICAgICAgICAgIGNhbiBhbHNvIGJlZ2luIHRvIGNyZWF0ZSBuZXcgcmVzb3VyY2VzIHVuZGVyIHRoZSBuZXcgZ3JvdXAgYXMgZXhwbGFpbmVkIAorICAgICAgICAgIGluIHRoZSBuZXh0IHN0ZXAuPC9QPgorICAgICAgICA8UCBBTElHTj0iTEVGVCI+PEEgSFJFRj0ic3RlcDIuaHRtbCI+QmFjayB0byBTdGVwIDI8L0E+IC1vci0gPEEgSFJFRj0ic3RlcDQuaHRtbCI+Rm9yd2FyZCAKKyAgICAgICAgICB0byBTdGVwIDQ8L0E+PC9QPgorICAgICAgPC9ESVY+CisgICAgICA8IS0tICNFbmRFZGl0YWJsZSAtLT48L1REPgorCTwvVFI+CisJPFRSPgorCQk8VEQgQkFDS0dST1VORD0iLi4vaW1hZ2VzL3RlbXBsYXRlX2xsLmdpZiIgSEVJR0hUPSI0MCIgV0lEVEg9IjIwMCI+CisJCQk8IS0tIENvbW1lbnQgLS0+CisJCTwvVEQ+CisJCTxURCBXSURUSD0iODAiPgorCQkJPCEtLSBDb21tZW50IC0tPgorCQk8L1REPgorCQk8VEQ+CisJCQk8Q0VOVEVSPjxTUEFOIENMQVNTPSJDb3B5cmlnaHQiPkNvcHlyaWdodCAyMDAwLTIwMDEgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcywgQWxsIFJpZ2h0cyBSZXNlcnZlZDwvU1BBTj48L0NFTlRFUj4KKwkJPC9URD4KKwk8L1RSPgorPC9UQUJMRT4KKworPC9CT0RZPgorPCEtLSAjRW5kVGVtcGxhdGUgLS0+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvdHV0b3JpYWwvc3RlcDQuaHRtbCBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL3R1dG9yaWFsL3N0ZXA0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE3ZjBlMQotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL3R1dG9yaWFsL3N0ZXA0Lmh0bWwKQEAgLTAsMCArMSwxNjggQEAKKzxIVE1MPjwhLS0gI0JlZ2luVGVtcGxhdGUgIi9UZW1wbGF0ZXMvTWFpblRlbXBsYXRlLmR3dCIgLS0+Cis8SEVBRD4KKzwhLS0gI0JlZ2luRWRpdGFibGUgImRvY3RpdGxlIiAtLT4gCis8VElUTEU+UkIgTWFuYWdlciBUdXRvcmlhbCAtIFBvcHVsYXRpbmcgdGhlIEJ1bmRsZTwvVElUTEU+Cis8IS0tICNFbmRFZGl0YWJsZSAtLT4gCis8TUVUQSBIVFRQLUVRVUlWPSJDb250ZW50LVR5cGUiIENPTlRFTlQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzxTVFlMRSBUWVBFPSJURVhUL0NTUyI+Cis8IS0tCisudG9waWNIZWFkIHsgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOyBmb250LXNpemU6IDE0cHQ7IGZvbnQtd2VpZ2h0OiBib2xkOyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiAjMzMzMzMzfQorLnRvcGljTGlzdCB7ICBmb250LWZhbWlseTogR2VvcmdpYSwgIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsgZm9udC1zaXplOiA5cHQ7IGNvbG9yOiAjRkYwMDk5OyBsaXN0LXN0eWxlLWltYWdlOiB1cmwoLi4vaW1hZ2VzL2RpYW1vbmRfYnVsbGV0LmdpZik7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgZm9udC13ZWlnaHQ6IGJvbGR9CisubWFpbkJsb2NrIHsgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBmb250LXNpemU6IDEycHQ7IG1hcmdpbi10b3A6IDVweDsgbWFyZ2luLXJpZ2h0OiA1cHg7IG1hcmdpbi1ib3R0b206IDVweDsgbWFyZ2luLWxlZnQ6IDVweDsgcGFkZGluZy10b3A6IDVweDsgcGFkZGluZy1yaWdodDogMTBweDsgcGFkZGluZy1ib3R0b206IDVweDsgcGFkZGluZy1sZWZ0OiAxMHB4OyB0ZXh0LWFsaWduOiBqdXN0aWZ5fQorLS0+Cis8L1NUWUxFPgorPC9IRUFEPgorCis8Qk9EWSBCR0NPTE9SPSIjRkZGRkZGIiBMRUZUTUFSR0lOPSIwIiBUT1BNQVJHSU49IjAiIE1BUkdJTldJRFRIPSIwIiBNQVJHSU5IRUlHSFQ9IjAiPgorPFRBQkxFIFdJRFRIPSIxMDAlIiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iMCI+CisgIDxUUj4KKyAgICA8VEQgUk9XU1BBTj0iMiIgQ09MU1BBTj0iMiIgQkFDS0dST1VORD0iLi4vaW1hZ2VzL3RlbXBsYXRlX3VsLmdpZiIgSEVJR0hUPSI3NSI+PElNRyBTUkM9Ii4uL2ltYWdlcy9zcGFjZXIuZ2lmIiBXSURUSD0iMjgwIiBIRUlHSFQ9IjEiIEhTUEFDRT0iMCI+PC9URD4KKwkJPFREIEhFSUdIVD0iMTUiICBXSURUSD0iMTAwJSIgQkFDS0dST1VORD0iLi4vaW1hZ2VzL3RlbXBsYXRlX3UuZ2lmIj48L1REPgorCTwvVFI+CisJPFRSPgorCQk8VEQgSEVJR0hUPSI2MCIgPgorCQkJPENFTlRFUj48SU1HIFNSQz0iLi4vaW1hZ2VzL1RpdGxlTG9nb190cmFuc3BhcmVudC5naWYiIFZTUEFDRT0iMCI+PC9DRU5URVI+CisJCTwvVEQ+CisJPC9UUj4KKwk8VFI+CisJCQorICAgIDxURCBXSURUSD0iMjAwIiBCQUNLR1JPVU5EPSIuLi9pbWFnZXMvdGVtcGxhdGVfbC5naWYiIFZBTElHTj0idG9wIj4KKwkJPFRBQkxFIFdJRFRIPSIxODAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iMSI+IAorICAgICAgCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNIZWFkIj5HZW5lcmFsPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIFZBTElHTj0iY2VudGVyIj48SU1HIFNSQz0iLi4vaW1hZ2VzL3RlbXBsYXRlX2xpbmUuZ2lmIj48L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljTGlzdCI+CisJICAgICAgICA8VUw+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9zeXN0ZW1fcmVxdWlyZW1lbnRzLmh0bWwiPlN5c3RlbSBSZXF1aXJlbWVudHM8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL2ZhcS5odG1sIj5GQVE8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL2Z1dHVyZV9mZWF0dXJlcy5odG1sIj5GdXR1cmUgUmVsZWFzZXM8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJIENMQVNTPSJ0b3BpY0xpc3QiPjxBIEhSRUY9Ii4uL2Z1dHVyZV9mZWF0dXJlcy5odG1sIj5WZXJzaW9uIAorICAgICAgICAgICAgICAgIEhpc3Rvcnk8L0E+PC9MST4KKyAgICAgICAgICAgIDwvVUw+CisJCQk8L1REPgorCQk8L1RSPgorICAgICAgCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNIZWFkIj5SQiBNYW5hZ2VyPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIFZBTElHTj0iY2VudGVyIj48SU1HIFNSQz0iLi4vaW1hZ2VzL3RlbXBsYXRlX2xpbmUuZ2lmIj48L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljTGlzdCI+CisJICAgICAgICA8VUw+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9pbmRleC5odG1sIj5Ib21lPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJpbmRleC5odG1sIj5UdXRvcmlhbDwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vdmlld3MvaW5kZXguaHRtbCI+RnVuY3Rpb25hbGl0eSBhbmQgVmlld3M8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL2xvb2thbmRmZWVsLmh0bWwiPkxvb2sgYW5kIEZlZWw8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL21lbnUuaHRtbCI+TWVudSBJdGVtczwvQT48L0xJPgorICAgICAgICAgICAgICA8TEkgQ0xBU1M9InRvcGljTGlzdCI+PEEgSFJFRj0ic3RlcDEuaHRtbCI+UHJlZmVyZW5jZXM8L0E+PC9MST4KKyAgICAgICAgICAgIDwvVUw+CisJCQk8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljSGVhZCI+UkIgUmVwb3J0ZXI8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgVkFMSUdOPSJjZW50ZXIiPjxJTUcgU1JDPSIuLi9pbWFnZXMvdGVtcGxhdGVfbGluZS5naWYiPjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNMaXN0Ij4KKwkgIDxVTD4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL1JCUmVwb3J0ZXIuaHRtbCI+SG9tZTwvQT48L0xJPgorICAgICAgICA8TEk+UmVwb3J0IFR5cGVzPC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL3NjYW5maWxlLmh0bWwiPkNvZGUgU2Nhbm5pbmc8L0E+PC9MST4KKyAgICAgICAgICAgIDwvVUw+CisJCQk8L1REPgorCQk8L1RSPgorCTwvVEFCTEU+CisKKyAgICAgIDxQPiZuYnNwOyA8L1A+CisgICAgICA8L1REPgorCQkKKyAgICA8VEQgQ09MU1BBTj0iMiIgVkFMSUdOPSJ0b3AiIENMQVNTPSJtYWluQmxvY2siPjwhLS0gI0JlZ2luRWRpdGFibGUgIk1haW4iIC0tPiAKKyAgICAgIDxIMyBBTElHTj0iQ0VOVEVSIj5TdGVwIDQuIFBvcHVsYXRpbmcgdGhlIEJ1bmRsZSB3aXRoIFJlc291cmNlczwvSDM+CisgICAgICA8UD48Qj5Xb3JraW5nIHdpdGhpbiBhIEdyb3VwPC9CPjwvUD4KKyAgICAgIDxQPkluIHRoZSB0dXRvcmlhbCBmaWxlLCBmb2xsb3dpbmcgdGhlIHByb2Nlc3MgZGVzY3JpYmVkIGluIHRoZSBwcmV2aW91cyAKKyAgICAgICAgc3RlcCwgSSBjcmVhdGVkIGEgZ3JvdXAgY2FsbGVkICdRdWVzdGlvbnMnIGFuZCBnYXZlIGl0IGEgY29tbWVudC4gVG8gdmlldyAKKyAgICAgICAgdGhlIGdyb3VwIHRoYXQgeW91IGNyZWF0ZWQsIG1ha2Ugc3VyZSB0aGF0IHRoZSBiYXNlIGNsYXNzIGF0IHRoZSB0b3Agb2YgCisgICAgICAgIHRoZSBmaWxlIHRyZWUgdG8gdGhlIGxlZnQgaXMgc2VsZWN0ZWQsIHByZXNzIHRoZSAnR3JvdXBzJyB0YWIgb24gdGhlIHJpZ2h0LCAKKyAgICAgICAgYW5kIHNlbGVjdCB5b3VyIGdyb3VwIG5hbWUgZnJvbSB0aGUgZHJvcCBkb3duIG1lbnUuIFdpdGggYW55IGx1Y2ssIHlvdSAKKyAgICAgICAgd2lsbCBzZWUgc29tZXRoaW5nIGxpa2UgdGhpczo8L1A+CisgICAgICA8UD48SU1HIFNSQz0iLi4vaW1hZ2VzL3NjcmVlbnNob3RzL2VtcHR5X2dyb3VwLmdpZiIgV0lEVEg9Ijc1MCIgSEVJR0hUPSI0MzIiPjwvUD4KKyAgICAgIDxQPkZyb20gdGhpcyB2aWV3LCB0aGVyZSBhcmUgc2V2ZXJhbCBvcHRpb25zIHRoYXQgYXJlIHRvIGJlIGZvdW5kIGluIHRoZSAKKyAgICAgICAgc2l4IGJ1dHRvbnMgdG8gdGhlIGxvd2VyIHJpZ2h0LiBXZSBhcmUgbm93IGdvaW5nIHRvIGNyZWF0ZSBhIHJlc291cmNlLiAKKyAgICAgICAgVGhpcyBjYW4gYmUgYWNjb21wbGlzaGVkIGJ5IGVpdGhlciBwcmVzc2luZyB0aGUgYnV0dG9uICdDcmVhdGUgUmVzb3VyY2UnIAorICAgICAgICBvciBzZWxlY3RpbmcgJ0FkZCBOZXcgUmVzb3VyY2UuLi4nIGZyb20gdGhlICdPcHRpb25zJyBtZW51IGF0IHRoZSB0b3AgCisgICAgICAgIG9mIHRoZSBzY3JlZW4uPC9QPgorICAgICAgPFA+PEI+RmlsbGluZyBpbiBSZXNvdXJjZSBJbmZvcm1hdGlvbjwvQj48L1A+CisgICAgICA8UD5PbmNlIHlvdSBmb2xsb3cgb25lIG9mIHRoZSBhYm92ZSB0d28gc3RlcHMsIHlvdSBzaG91bGQgc2VlIGEgZGlhbG9nIHNpbWlsYXIgCisgICAgICAgIHRvIHRoZSBmb2xsb3dpbmc6PC9QPgorICAgICAgPFA+PElNRyBTUkM9Ii4uL2ltYWdlcy9zY3JlZW5zaG90cy9lbXB0eV9yZXNvdXJjZS5naWYiPjwvUD4KKyAgICAgIDxQPlRoZSBncm91cCBzaG93biBpcyB0aGUgb25lIGN1cnJlbnRseSBiZWluZyB2aWV3ZWQgd2hlbiB5b3UgY2xpY2tlZCBvbiAKKyAgICAgICAgdGhlICdDcmVhdGUgUmVzb3VyY2UnIGJ1dHRvbi4gSWYgeW91IHVzZWQgdGhlIG1lbnUgdG8gYnJpbmcgdXAgdGhpcyBkaWFsb2csIAorICAgICAgICBpdCBtYXkgYmUgYSBkaWZmZXJlbnQgZ3JvdXAuIFlvdSBtYXkgbW92ZSB0aGUgcmVzb3VyY2UgdG8gYW55IGdyb3VwIHlvdSAKKyAgICAgICAgd2lzaCBieSBjaGFuZ2luZyB0aGUgdmFsdWUgaW4gdGhpcyBkcm9wIGRvd24gYm94LiBCb3RoIHRoZSBlbnRyeSBrZXkgYW5kIAorICAgICAgICB0aGUgdHJhbnNsYXRpb24gZmllbGRzIGFyZSByZXF1aXJlZCBpbmZvcm1hdGlvbi4gVGhlc2UgbWFrZSB1cCB0aGUgbG9va3VwIAorICAgICAgICB2YWx1ZSBhbmQgdGhlIHRyYW5zbGF0aW9uIHZhbHVlIHJlc3BlY3RpdmVseSBzdG9yZWQgaW4geW91ciBidW5kbGUuIFRoZSAKKyAgICAgICAgY29tbWVudCBmaWVsZCBpcyB0aGVyZSBpbiBvcmRlciB0byBhaWQgdGhvc2Ugd2hvIHdpbGwgYmUgdHJhbnNsYXRpbmcgeW91ciAKKyAgICAgICAgd29yayBpbnRvIG90aGVyIGxhbmd1YWdlcy4gVGhpcyBmaWVsZCBwcm92aWRlcyBhIHdheSBmb3IgeW91IHRvIGRlc2NyaWJlIAorICAgICAgICB0aGUgY29udGV4dCBvZiB0aGlzIHBhcnRpY3VsYXIgcmVzb3VyY2UuPC9QPgorICAgICAgPFA+VGhlcmUgYXJlIGEgZmV3IHdheXMgdG8gY3JlYXRlIHRoZSByZXNvdXJjZSBvbmNlIHRoZSBpbmZvcm1hdGlvbiBpcyBlbnRlcmVkLiAKKyAgICAgICAgUHJlc3NpbmcgJ0NyZWF0ZScgd2lsbCBhZGQgdGhlIHJlc291cmNlIGFuZCBjbG9zZSB0aGUgZGlhbG9nLiBJZiB5b3Ugd2lzaCAKKyAgICAgICAgdG8gY29udGludWUgY3JlYXRpbmcgcmVzb3VyY2VzIGFmdGVyIHRoZSBjdXJyZW50IG9uZSwgcHJlc3NpbmcgJ0NyZWF0ZSAKKyAgICAgICAgJmFtcDsgQ29udGludWUnIHdpbGwgY3JlYXRlIHRoZSByZXNvdXJjZSwgY2xlYXIgdGhlIGluZm9ybWF0aW9uIHlvdSBoYXZlIAorICAgICAgICBqdXN0IGVudGVyZWQsIGFuZCBhbGxvdyB5b3UgdG8gZW50ZXIgaW4gYSBuZXcgcmVzb3VyY2UuIFByZXNzaW5nICdDYW5jZWwnIAorICAgICAgICB3aWxsIGNsb3NlIHRoZSBkaWFsb2cgYm94IGFuZCBpZ25vcmUgYW55IGluZm9ybWF0aW9uIGN1cnJlbnRseSBlbnRlcmVkLiAKKyAgICAgICAgQXMgYSBzaG9ydCBjdXQsIHlvdSBjYW4gYWxzbyBoaXQgZW50ZXIgZnJvbSBhbnkgb2YgdGhlIHRleHQgYm94ZXMgYnV0IAorICAgICAgICAnVHJhbnNsYXRpb24nLiBUaGlzIHdpbGwgY3JlYXRlIHRoZSByZXNvdXJjZS4gUHJlc3NpbmcgZW50ZXIgZnJvbSB0aGUgCisgICAgICAgIHRyYW5zbGF0aW9uIHRleHQgYm94LCBjcmVhdGVzIGEgdHJhbnNsYXRpb24gdGhhdCBzcGFucyBtdWx0aXBsZSBsaW5lcyAKKyAgICAgICAgb2YgdGV4dC48L1A+CisgICAgICA8UD5BIHNhbXBsZSByZXNvdXJjZSBjcmVhdGlvbiBpcyBzaG93IGFzIGZvbGxvd3M6PC9QPgorICAgICAgPFA+PElNRyBTUkM9Ii4uL2ltYWdlcy9zY3JlZW5zaG90cy9iYXNpY19yZXNvdXJjZS5naWYiPjwvUD4KKyAgICAgIDxQPjxCPlVzaW5nICdMb29rLXVwcyc8L0I+PC9QPgorICAgICAgPFA+UmVzb3VyY2UgYnVuZGxlcyBwcm92aWRlIGEgd2F5IG9mIHRyYW5zbGF0aW5nIGNvbnRleHR1YWwgaW5mb3JtYXRpb24gCisgICAgICAgIGFzIHdlbGwuIEZvciBpbnN0YW5jZSwgd2hhdCBpZiBJIHdhbnRlZCBhIHRyYW5zbGF0aW9uIGFza2luZyB0aGUgdXNlciAKKyAgICAgICAgaG93IG9sZCB0aGV5IHdlcmUsIGFuZCBJIHdhbnRlZCB0byBhc2sgaXQgd2l0aCB0aGVpciBuYW1lIGluc2VydGVkIGludG8gCisgICAgICAgIHRoZSBxdWVzdGlvbi4gVGhlIHBsYWNlbWVudCBvZiB0aGVpciBuYW1lIG1pZ2h0IGJlIGRpZmZlcmVudCBpbiBkaWZmZXJlbnQgCisgICAgICAgIGxhbmd1YWdlcy4gVGhpcyBpcyB0aGUgcmVhc29uIGZvciAnbG9vay11cHMnLiBUaGUgamF2YS50ZXh0IHBhY2thZ2UgZGVmaW5lcyAKKyAgICAgICAgYSB3YXkgZm9yIGltcGxlbWVudGluZyB0aGVzZSBsb29rLXVwcyB1c2luZyBudW1iZXJzIHN1cnJvdW5kZWQgYnkgY3VybHkgCisgICAgICAgIGJyYWNlcy4gVGh1cywgSSBtaWdodCB3YW50IHRvIGNyZWF0ZSBhIHJlc291cmNlIGxpa2UgdGhlIG9uZSBiZWxvdzo8L1A+CisgICAgICA8UD48SU1HIFNSQz0iLi4vaW1hZ2VzL3NjcmVlbnNob3RzL2xvb2t1cF9yZXNvdXJjZS5naWYiPjwvUD4KKyAgICAgIDxQPk9uY2UgeW91IGVudGVyIGFueXRoaW5nIGludG8geW91ciB0cmFuc2xhdGlvbiBzdXJyb3VuZGVkIGJ5IGN1cmx5IGJyYWNlcyAKKyAgICAgICAgYW5kIGNoYW5nZSB0aGUgZm9jdXMgYXdheSBmcm9tIHRoZSB0cmFuc2xhdGlvbiBmaWVsZCwgdGhlIGRpYWxvZyBib3ggd2lsbCAKKyAgICAgICAgdXBkYXRlIGl0c2VsZiB3aXRoIGFyZWFzIGZvciB5b3UgdG8gZW50ZXIgZGVzY3JpcHRpb25zIG9mIHRoZSBsb29rLXVwcyAKKyAgICAgICAgeW91IGhhdmUgZW50ZXJlZC4gVGhpcyBmZWF0dXJlIG9mIFJCTWFuYWdlciBhbGxvd3MgZnV0dXJlIHRyYW5zbGF0b3JzIAorICAgICAgICB0byB1bmRlcnN0YW5kIHRoZSBjb250ZXh0IG9mIGVhY2ggbG9vay11cC48L1A+CisgICAgICA8UD48Qj5FZGl0aW5nIHRoZSBSZXNvdXJjZXM8L0I+PC9QPgorICAgICAgPFA+RnJvbSB0aGUgJ0dyb3VwcycgdGFiIHZpZXcsIHlvdSBjYW4gYXQgYW55IHRpbWUgZWRpdCB0aGUgZGVmYXVsdCB2YWx1ZXMgCisgICAgICAgIGZvciBhIHJlc291cmNlLiBBcyB5b3UgZW50ZXIgaW4gbmV3IHJlc291cmNlcyB0aGV5IHdpbGwgYXBwZWFyIGluIHRoZSAKKyAgICAgICAgZ3JvdXAgdmlldyBhcyBzaG93bjo8L1A+CisgICAgICA8UD48SU1HIFNSQz0iLi4vaW1hZ2VzL3NjcmVlbnNob3RzL2Jhc2ljX2dyb3VwLmdpZiIgV0lEVEg9Ijc1MCIgSEVJR0hUPSI0MzIiPjwvUD4KKyAgICAgIDxQPkRvdWJsZSBjbGlja2luZyBvbiBhIHJlc291cmNlIHdpbGwgYnJpbmcgYSBkaWFsb2cgYm94IHVwIHNpbWlsYXIgdG8gdGhlIAorICAgICAgICBvbmUgZm9yIGNyZWF0aW5nIGEgcmVzb3VyY2UuIFJlbWVtYmVyIHRoYXQgaXQgaXMgb25seSBmcm9tIHRoaXMgdmlldyB0aGF0IAorICAgICAgICB5b3Ugd2lsbCBiZSBhYmxlIHRvIGNoYW5nZSB0aGUgcmVzb3VyY2UgaW4gYSB3YXkgdGhhdCB3aWxsIGVmZmVjdCB0aGUgCisgICAgICAgIGVudGlyZSBidW5kbGUuIFRodXMgaXQgaXMgb25seSBpbiB0aGlzIHZpZXcgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgcmVzb3VyY2UncyAKKyAgICAgICAgZ3JvdXAsIGtleSBuYW1lLCBhbmQgZGVmYXVsdCB0cmFuc2xhdGlvbiBhbmQgY29tbWVudC48L1A+CisgICAgICA8UD48QSBIUkVGPSJzdGVwMy5odG1sIj5CYWNrIHRvIFN0ZXAgMzwvQT4gLW9yLSA8QSBIUkVGPSJzdGVwNS5odG1sIj5Gb3J3YXJkIAorICAgICAgICB0byBTdGVwIDU8L0E+PC9QPgorICAgICAgPCEtLSAjRW5kRWRpdGFibGUgLS0+PC9URD4KKwk8L1RSPgorCTxUUj4KKwkJPFREIEJBQ0tHUk9VTkQ9Ii4uL2ltYWdlcy90ZW1wbGF0ZV9sbC5naWYiIEhFSUdIVD0iNDAiIFdJRFRIPSIyMDAiPgorCQkJPCEtLSBDb21tZW50IC0tPgorCQk8L1REPgorCQk8VEQgV0lEVEg9IjgwIj4KKwkJCTwhLS0gQ29tbWVudCAtLT4KKwkJPC9URD4KKwkJPFREPgorCQkJPENFTlRFUj48U1BBTiBDTEFTUz0iQ29weXJpZ2h0Ij5Db3B5cmlnaHQgMjAwMC0yMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMsIEFsbCBSaWdodHMgUmVzZXJ2ZWQ8L1NQQU4+PC9DRU5URVI+CisJCTwvVEQ+CisJPC9UUj4KKzwvVEFCTEU+CisKKzwvQk9EWT4KKzwhLS0gI0VuZFRlbXBsYXRlIC0tPjwvSFRNTD4KZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL3R1dG9yaWFsL3N0ZXA1Lmh0bWwgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy90dXRvcmlhbC9zdGVwNS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZDJlNGEKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy90dXRvcmlhbC9zdGVwNS5odG1sCkBAIC0wLDAgKzEsMTU4IEBACis8SFRNTD48IS0tICNCZWdpblRlbXBsYXRlICIvVGVtcGxhdGVzL01haW5UZW1wbGF0ZS5kd3QiIC0tPgorPEhFQUQ+Cis8IS0tICNCZWdpbkVkaXRhYmxlICJkb2N0aXRsZSIgLS0+IAorPFRJVExFPlJCIE1hbmFnZXIgVHV0b3JpYWwgLSBDcmVhdGluZyBSZXNvdXJjZSBGaWxlczwvVElUTEU+Cis8IS0tICNFbmRFZGl0YWJsZSAtLT4gCis8TUVUQSBIVFRQLUVRVUlWPSJDb250ZW50LVR5cGUiIENPTlRFTlQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzxTVFlMRSBUWVBFPSJURVhUL0NTUyI+Cis8IS0tCisudG9waWNIZWFkIHsgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOyBmb250LXNpemU6IDE0cHQ7IGZvbnQtd2VpZ2h0OiBib2xkOyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiAjMzMzMzMzfQorLnRvcGljTGlzdCB7ICBmb250LWZhbWlseTogR2VvcmdpYSwgIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsgZm9udC1zaXplOiA5cHQ7IGNvbG9yOiAjRkYwMDk5OyBsaXN0LXN0eWxlLWltYWdlOiB1cmwoLi4vaW1hZ2VzL2RpYW1vbmRfYnVsbGV0LmdpZik7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgZm9udC13ZWlnaHQ6IGJvbGR9CisubWFpbkJsb2NrIHsgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBmb250LXNpemU6IDEycHQ7IG1hcmdpbi10b3A6IDVweDsgbWFyZ2luLXJpZ2h0OiA1cHg7IG1hcmdpbi1ib3R0b206IDVweDsgbWFyZ2luLWxlZnQ6IDVweDsgcGFkZGluZy10b3A6IDVweDsgcGFkZGluZy1yaWdodDogMTBweDsgcGFkZGluZy1ib3R0b206IDVweDsgcGFkZGluZy1sZWZ0OiAxMHB4OyB0ZXh0LWFsaWduOiBqdXN0aWZ5fQorLS0+Cis8L1NUWUxFPgorPC9IRUFEPgorCis8Qk9EWSBCR0NPTE9SPSIjRkZGRkZGIiBMRUZUTUFSR0lOPSIwIiBUT1BNQVJHSU49IjAiIE1BUkdJTldJRFRIPSIwIiBNQVJHSU5IRUlHSFQ9IjAiPgorPFRBQkxFIFdJRFRIPSIxMDAlIiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iMCI+CisgIDxUUj4KKyAgICA8VEQgUk9XU1BBTj0iMiIgQ09MU1BBTj0iMiIgQkFDS0dST1VORD0iLi4vaW1hZ2VzL3RlbXBsYXRlX3VsLmdpZiIgSEVJR0hUPSI3NSI+PElNRyBTUkM9Ii4uL2ltYWdlcy9zcGFjZXIuZ2lmIiBXSURUSD0iMjgwIiBIRUlHSFQ9IjEiIEhTUEFDRT0iMCI+PC9URD4KKwkJPFREIEhFSUdIVD0iMTUiICBXSURUSD0iMTAwJSIgQkFDS0dST1VORD0iLi4vaW1hZ2VzL3RlbXBsYXRlX3UuZ2lmIj48L1REPgorCTwvVFI+CisJPFRSPgorCQk8VEQgSEVJR0hUPSI2MCIgPgorCQkJPENFTlRFUj48SU1HIFNSQz0iLi4vaW1hZ2VzL1RpdGxlTG9nb190cmFuc3BhcmVudC5naWYiIFZTUEFDRT0iMCI+PC9DRU5URVI+CisJCTwvVEQ+CisJPC9UUj4KKwk8VFI+CisJCQorICAgIDxURCBXSURUSD0iMjAwIiBCQUNLR1JPVU5EPSIuLi9pbWFnZXMvdGVtcGxhdGVfbC5naWYiIFZBTElHTj0idG9wIj4KKwkJPFRBQkxFIFdJRFRIPSIxODAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iMSI+IAorICAgICAgCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNIZWFkIj5HZW5lcmFsPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIFZBTElHTj0iY2VudGVyIj48SU1HIFNSQz0iLi4vaW1hZ2VzL3RlbXBsYXRlX2xpbmUuZ2lmIj48L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljTGlzdCI+CisJICAgICAgICA8VUw+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9zeXN0ZW1fcmVxdWlyZW1lbnRzLmh0bWwiPlN5c3RlbSBSZXF1aXJlbWVudHM8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL2ZhcS5odG1sIj5GQVE8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL2Z1dHVyZV9mZWF0dXJlcy5odG1sIj5GdXR1cmUgUmVsZWFzZXM8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJIENMQVNTPSJ0b3BpY0xpc3QiPjxBIEhSRUY9Ii4uL2Z1dHVyZV9mZWF0dXJlcy5odG1sIj5WZXJzaW9uIAorICAgICAgICAgICAgICAgIEhpc3Rvcnk8L0E+PC9MST4KKyAgICAgICAgICAgIDwvVUw+CisJCQk8L1REPgorCQk8L1RSPgorICAgICAgCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNIZWFkIj5SQiBNYW5hZ2VyPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIFZBTElHTj0iY2VudGVyIj48SU1HIFNSQz0iLi4vaW1hZ2VzL3RlbXBsYXRlX2xpbmUuZ2lmIj48L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljTGlzdCI+CisJICAgICAgICA8VUw+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9pbmRleC5odG1sIj5Ib21lPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJpbmRleC5odG1sIj5UdXRvcmlhbDwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vdmlld3MvaW5kZXguaHRtbCI+RnVuY3Rpb25hbGl0eSBhbmQgVmlld3M8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL2xvb2thbmRmZWVsLmh0bWwiPkxvb2sgYW5kIEZlZWw8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL21lbnUuaHRtbCI+TWVudSBJdGVtczwvQT48L0xJPgorICAgICAgICAgICAgICA8TEkgQ0xBU1M9InRvcGljTGlzdCI+PEEgSFJFRj0ic3RlcDEuaHRtbCI+UHJlZmVyZW5jZXM8L0E+PC9MST4KKyAgICAgICAgICAgIDwvVUw+CisJCQk8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljSGVhZCI+UkIgUmVwb3J0ZXI8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgVkFMSUdOPSJjZW50ZXIiPjxJTUcgU1JDPSIuLi9pbWFnZXMvdGVtcGxhdGVfbGluZS5naWYiPjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNMaXN0Ij4KKwkgIDxVTD4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL1JCUmVwb3J0ZXIuaHRtbCI+SG9tZTwvQT48L0xJPgorICAgICAgICA8TEk+UmVwb3J0IFR5cGVzPC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL3NjYW5maWxlLmh0bWwiPkNvZGUgU2Nhbm5pbmc8L0E+PC9MST4KKyAgICAgICAgICAgIDwvVUw+CisJCQk8L1REPgorCQk8L1RSPgorCTwvVEFCTEU+CisKKyAgICAgIDxQPiZuYnNwOyA8L1A+CisgICAgICA8L1REPgorCQkKKyAgICA8VEQgQ09MU1BBTj0iMiIgVkFMSUdOPSJ0b3AiIENMQVNTPSJtYWluQmxvY2siPjwhLS0gI0JlZ2luRWRpdGFibGUgIk1haW4iIC0tPiAKKyAgICAgIDxIMyBBTElHTj0iQ0VOVEVSIj5TdGVwIDUuIEFkZGluZyBSZXNvdXJjZSBGaWxlcyBmb3IgTmV3IExhbmd1YWdlczwvSDM+CisgICAgICA8UD48Qj5DcmVhdGluZyBhIE5ldyBMYW5ndWFnZSBGaWxlPC9CPjwvUD4KKyAgICAgIDxQPlRoZSBvbmx5IHdheSBieSB3aGljaCB0byBjcmVhdGUgYSBuZXcgbGFuZ3VhZ2UgZmlsZSBpcyBieSBzZWxlY3RpbmcgdGhlIAorICAgICAgICAnQWRkIE5ldyBSZXNvdXJjZSBGaWxlLi4uJyBvcHRpb24gZnJvbSB0aGUgJ09wdGlvbnMnIG1lbnUuIFdoZW4geW91IGRvIAorICAgICAgICBzbyBhIGRpYWxvZyBib3ggd2lsbCBhcHBlYXIgc2ltaWxhciB0byB0aGlzOjwvUD4KKyAgICAgIDxQPjxJTUcgU1JDPSIuLi9pbWFnZXMvc2NyZWVuc2hvdHMvYmFzaWNfZmlsZS5naWYiIFdJRFRIPSI2MjAiIEhFSUdIVD0iNDIxIj48L1A+CisgICAgICA8UD5UaGUgdG9wIHRocmVlIGZpZWxkcyBpZGVudGlmeSB0aGUgZmlsZS4gVGhlIGJvdHRvbSB0aHJlZSBzZWN0aW9ucywgTGFuZ3VhZ2UsIAorICAgICAgICBDb3VudHJ5LCBhbmQgVmFyaWFudCBkZWZpbmUgdGhlIHJvbGUgb2YgdGhlIHJlc291cmNlIGZpbGUgd2l0aGluIHRoZSBidW5kbGUuIAorICAgICAgICBUaGUgb25seSByZXF1aXJlZCBmaWVsZCBpcyB0aGUgZW5jb2RpbmcgZmllbGQgZm9yIHRoZSBsYW5ndWFnZS4gVGhlIGVuY29kaW5nIAorICAgICAgICBmaWVsZHMgYXJlIGluc2VydGVkIGludG8gdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIGZpbGUgd2hlbmV2ZXIgdGhlIGZpZWxkcyAKKyAgICAgICAgYXJlIGZpbGxlZC4gVGhlIGZpbGUgbmFtZSB3b3VsZCBmb2xsb3dpbmcgdGhlIHBhdHRlcm4gPENPREU+YmFzZWNsYXNzX2xhbmd1YWdlX2VuY29kaW5nX3ZhcmlhbnQucHJvcGVydGllczwvQ09ERT4uIAorICAgICAgICBJbiB0aGUgYWJvdmUgZXhhbXBsZSwgdGhlIGZpbGUgd291bGQgYmUgbmFtZWQ8Q09ERT4gUkJUdXRvcmlhbF9kZS5wcm9wZXJ0aWVzPC9DT0RFPi4gCisgICAgICAgIE5vdGUgdGhhdCBpdCBpcyBpbXBvcnRhbnQgdG8gZGVmaW5lIGZhbGxiYWNrIGZpbGVzIGZvciBlYWNoIGxhbmd1YWdlIChpLmUuIAorICAgICAgICBpZiB5b3UgaGF2ZSBhIGZpbGUgZm9yIDxDT0RFPlJCVHV0b3JpYWxfZGVfREUucHJvcGVydGllczwvQ09ERT4sIHlvdSBzaG91bGQgCisgICAgICAgIGFsc28gaGF2ZSBhIGZpbGUgZm9yIDxDT0RFPlJCVHV0b3JpYWxfZGUucHJvcGVydGllczwvQ09ERT4pLjwvUD4KKyAgICAgIDxQPlNpbmNlIHRoZXJlIG1heSBiZSBpbnN0YW5jZXMgd2hlcmUgdGhlIGxhbmd1YWdlIGZpbGUgYmVpbmcgY3JlYXRlZCBtYXkgCisgICAgICAgIGhhdmUgZmV3IGRpZmZlcmVuY2VzIGZyb20gdGhlIGJhc2UgY2xhc3MgcHJvcGVydHkgZmlsZSwgYW4gb3B0aW9uIGlzIGdpdmVuIAorICAgICAgICBmb3IgY29weWluZyBvciBub3QgYWxsIG9mIHRoZSByZXNvdXJjZXMgZnJvbSB0aGUgYmFzZSBjbGFzcyBmaWxlIHRvIHRoZSAKKyAgICAgICAgbmV3IGZpbGUuIEJ5IGRlZmF1bHQsIHRoaXMgb3B0aW9uIGlzIHNlbGVjdGVkIGFuZCBlYWNoIHJlc291cmNlIHdpbGwgYmUgCisgICAgICAgIGNvcGllZCBmcm9tIHRoZSBiYXNlIGZpbGUgYW5kIG1hcmtlZCBhcyB1bnRyYW5zbGF0ZWQgaW4gdGhlIG5ldyByZXNvdXJjZSAKKyAgICAgICAgZmlsZS48L1A+CisgICAgICA8UD48Qj5Xb3JraW5nIHdpdGggdGhlIE5ldyBMYW5ndWFnZSBGaWxlPC9CPjxCUj4KKyAgICAgIDwvUD4KKyAgICAgIDxQPk9uY2UgYSBsYW5ndWFnZSBmaWxlIGhhcyBiZWVuIGNyZWF0ZWQsIHRoZXJlIHdpbGwgYmUgcmVzb3VyY2VzIHRoYXQgbmVlZCAKKyAgICAgICAgdG8gYmUgdHJhbnNsYXRlZC4gVGhpcyBjYW4gYmUgZG9uZSBmcm9tIHR3byBkaWZmZXJlbnQgdmlld3MuIEZpcnN0LCBnbyAKKyAgICAgICAgdG8gdGhlIHRyZWUgb24gdGhlIGxvd2VyIGxlZnQgb2YgdGhlIHNjcmVlbiBhbmQgc2VsZWN0IHRoZSBmaWxlIHRoYXQgeW91IAorICAgICAgICBoYXZlIGp1c3QgY3JlYXRlZC4gSW4gdGhpcyBjYXNlIGl0IHdpbGwgYmUgdW5kZXIgdGhlIGxhbmd1YWdlIGVuY29kaW5nIAorICAgICAgICBkZSBub2RlIG9mIHRoZSB0cmVlLiBTZWxlY3QgdGhlIGZpbGUgYnkgY2xpY2tpbmcgb24gaXQgb25jZS4gU2VsZWN0aW5nIAorICAgICAgICB0aGUgJ1VudHJhbnNsYXRlZCcgdGFiIG9uIHRoZSByaWdodCBzaG91bGQgcmVzdWx0IGluIGEgdmlldyBzaW1pbGFyIHRvIAorICAgICAgICB0aGlzOjwvUD4KKyAgICAgIDxQPjxJTUcgU1JDPSIuLi9pbWFnZXMvc2NyZWVuc2hvdHMvYmFzaWNfdW50cmFuc2xhdGVkLmdpZiIgV0lEVEg9Ijc1MCIgSEVJR0hUPSI0MTYiPiAKKyAgICAgIDwvUD4KKyAgICAgIDxQPlRoaXMgc2VjdGlvbiBkaXNwbGF5cyBhbGwgb2YgdGhlIHJlc291cmNlcyB0aGF0IGFyZSBtYXJrZWQgYXMgdW50cmFuc2xhdGVkIAorICAgICAgICBpbiB0aGUgZmlsZS4gQWx0ZXJuYXRpdmVseSwgeW91IGNvdWxkIHNlbGVjdCB0aGUgJ0dyb3VwcycgdGFiIGFuZCBzZWUgCisgICAgICAgIGFsbCBvZiB0aGUgcmVzb3VyY2VzLCBvbmUgZ3JvdXAgYXQgYSB0aW1lLCB3aGV0aGVyIG9yIG5vdCB0aGV5IGhhdmUgYmVlbiAKKyAgICAgICAgbWFya2VkIGFzIHRyYW5zbGF0ZWQuIERvdWJsZSBjbGlja2luZyBvbiBhIHJvdyBpbiB0aGUgdGhlIHRhYmxlcyBwcmVzZW50IAorICAgICAgICBpbiBlaXRoZXIgdmlldyB3aWxsIGJyaW5nIHVwIGEgZGlhbG9nIGJveCBzaW1pbGFyIHRvIG9uZSB5b3UgaGF2ZSBhbGwgCisgICAgICAgIHJlYWR5IHNlZW46PC9QPgorICAgICAgPFA+PElNRyBTUkM9Ii4uL2ltYWdlcy9zY3JlZW5zaG90cy9iYXNpY190cmFuc2xhdGlvbi5naWYiIFdJRFRIPSI1MTMiIEhFSUdIVD0iMjY5Ij48L1A+CisgICAgICA8UD5UaGUgdG9wIHRocmVlIGVkaXRhYmxlIGNvbXBvbmVudHMgYXJlIGFsbCBkaXNhYmxlZC4gVGhpcyBpcyBiZWNhdXNlIGNoYW5naW5nIAorICAgICAgICB0aGVtIHdvdWxkIHJlcXVpcmVkIGVkaXRpbmcgZmlsZXMgb3RoZXIgdGhhbiB0aGUgb25lIGN1cnJlbnRseSBiZWluZyB2aWV3ZWQuIAorICAgICAgICBUaGlzIHR5cGUgb2YgZWRpdGluZyBjYW4gYmUgYWNjb21wbGlzaGVkIG9ubHkgZnJvbSB0aGUgYmFzZSBjbGFzcy4gVG8gCisgICAgICAgIGNoYW5nZSB0aGUgdHJhbnNsYXRpb24gdmFsdWUsIGFsdGVyIHRoZSBmaWVsZCBsYWJlbGVkICdUcmFuc2xhdGlvbjonIHdpdGggCisgICAgICAgIHRoZSBuZXcgdHJhbnNsYXRpb24uIFlvdSBtYXkgYWxzbyBjaGFuZ2UgdGhlIHJlc291cmNlIGNvbW1lbnQgYW5kIGxvb2t1cCAKKyAgICAgICAgY29tbWVudHMgaWYgeW91IGxpa2UsIGJ1dCB0aGlzIGNoYW5nZSB3aWxsIGJlIHZpc2libGUgb25seSBmcm9tIFJCTWFuYWdlci4gCisgICAgICAgIFlvdSBhbHNvIG1heSBmaW5kIHRoYXQgdGhlIHJlc291cmNlIHJlcXVpcmVzIG5vIHRyYW5zbGF0aW9uIGlmIHRoaXMgaXMgCisgICAgICAgIHRoZSBjYXNlLCBqdXN0IHNlbGVjdCB0aGUgJ1RyYW5zbGF0ZWQnIGNoZWNrIGJveCBhdCB0aGUgYm90dG9tIG9mIHRoZSAKKyAgICAgICAgZGlhbG9nIGFuZCBwcmVzcyAnRWRpdCcuIElmIHlvdSBjaGFuZ2UgdGhlIHRyYW5zbGF0aW9uLCB0aGUgJ1RyYW5zbGF0ZWQnIAorICAgICAgICBjaGVjayBib3ggd2lsbCBhdXRvbWF0aWNhbGx5IGNoZWNrIGl0c2VsZiB3aGVuIHlvdSBhcmUgZmluaXNoZWQuPC9QPgorICAgICAgPFA+Q29udGludWUgdGhpcyBwcm9jZXNzIHVudGlsIHlvdSBoYXZlIGNvbXBsZXRlbHkgdHJhbnNsYXRlZCB0aGlzIGZpbGUsIAorICAgICAgICBvciBsZWF2ZSB0aGUgZmlsZSB1bnRyYW5zbGF0ZWQsIGJ1dCBzYXZlIHlvdXIgd29yayBzbyB0aGF0IHlvdSBvciBzb21lb25lIAorICAgICAgICBlbHNlIGNhbiByZXR1cm4gdG8gaXQgbGF0ZXIuIFRvIGxlYXJuIGhvdyB0byBzYXZlIHlvdXIgcmVzdWx0cywgZ28gdG8gCisgICAgICAgIHRoZSBuZXh0IHN0ZXAuPC9QPgorICAgICAgPFA+PEEgSFJFRj0ic3RlcDQuaHRtbCI+QmFjayB0byBTdGVwIDQ8L0E+IC1vci0gPEEgSFJFRj0ic3RlcDYuaHRtbCI+Rm9yd2FyZCAKKyAgICAgICAgdG8gU3RlcCA2PC9BPjwvUD4KKyAgICAgIDwhLS0gI0VuZEVkaXRhYmxlIC0tPjwvVEQ+CisJPC9UUj4KKwk8VFI+CisJCTxURCBCQUNLR1JPVU5EPSIuLi9pbWFnZXMvdGVtcGxhdGVfbGwuZ2lmIiBIRUlHSFQ9IjQwIiBXSURUSD0iMjAwIj4KKwkJCTwhLS0gQ29tbWVudCAtLT4KKwkJPC9URD4KKwkJPFREIFdJRFRIPSI4MCI+CisJCQk8IS0tIENvbW1lbnQgLS0+CisJCTwvVEQ+CisJCTxURD4KKwkJCTxDRU5URVI+PFNQQU4gQ0xBU1M9IkNvcHlyaWdodCI+Q29weXJpZ2h0IDIwMDAtMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzLCBBbGwgUmlnaHRzIFJlc2VydmVkPC9TUEFOPjwvQ0VOVEVSPgorCQk8L1REPgorCTwvVFI+Cis8L1RBQkxFPgorCis8L0JPRFk+Cis8IS0tICNFbmRUZW1wbGF0ZSAtLT48L0hUTUw+CmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy90dXRvcmlhbC9zdGVwNi5odG1sIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvdHV0b3JpYWwvc3RlcDYuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTI1ODBmCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3MvdHV0b3JpYWwvc3RlcDYuaHRtbApAQCAtMCwwICsxLDEzMSBAQAorPEhUTUw+PCEtLSAjQmVnaW5UZW1wbGF0ZSAiL1RlbXBsYXRlcy9NYWluVGVtcGxhdGUuZHd0IiAtLT4KKzxIRUFEPgorPCEtLSAjQmVnaW5FZGl0YWJsZSAiZG9jdGl0bGUiIC0tPiAKKzxUSVRMRT5SQiBNYW5hZ2VyIFR1dG9yaWFsIC0gU2F2aW5nPC9USVRMRT4KKzwhLS0gI0VuZEVkaXRhYmxlIC0tPiAKKzxNRVRBIEhUVFAtRVFVSVY9IkNvbnRlbnQtVHlwZSIgQ09OVEVOVD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPFNUWUxFIFRZUEU9IlRFWFQvQ1NTIj4KKzwhLS0KKy50b3BpY0hlYWQgeyAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7IGZvbnQtc2l6ZTogMTRwdDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6ICMzMzMzMzN9CisudG9waWNMaXN0IHsgIGZvbnQtZmFtaWx5OiBHZW9yZ2lhLCAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOyBmb250LXNpemU6IDlwdDsgY29sb3I6ICNGRjAwOTk7IGxpc3Qtc3R5bGUtaW1hZ2U6IHVybCguLi9pbWFnZXMvZGlhbW9uZF9idWxsZXQuZ2lmKTsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyBmb250LXdlaWdodDogYm9sZH0KKy5tYWluQmxvY2sgeyAgZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTJwdDsgbWFyZ2luLXRvcDogNXB4OyBtYXJnaW4tcmlnaHQ6IDVweDsgbWFyZ2luLWJvdHRvbTogNXB4OyBtYXJnaW4tbGVmdDogNXB4OyBwYWRkaW5nLXRvcDogNXB4OyBwYWRkaW5nLXJpZ2h0OiAxMHB4OyBwYWRkaW5nLWJvdHRvbTogNXB4OyBwYWRkaW5nLWxlZnQ6IDEwcHg7IHRleHQtYWxpZ246IGp1c3RpZnl9CistLT4KKzwvU1RZTEU+Cis8L0hFQUQ+CisKKzxCT0RZIEJHQ09MT1I9IiNGRkZGRkYiIExFRlRNQVJHSU49IjAiIFRPUE1BUkdJTj0iMCIgTUFSR0lOV0lEVEg9IjAiIE1BUkdJTkhFSUdIVD0iMCI+Cis8VEFCTEUgV0lEVEg9IjEwMCUiIEJPUkRFUj0iMCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSIwIj4KKyAgPFRSPgorICAgIDxURCBST1dTUEFOPSIyIiBDT0xTUEFOPSIyIiBCQUNLR1JPVU5EPSIuLi9pbWFnZXMvdGVtcGxhdGVfdWwuZ2lmIiBIRUlHSFQ9Ijc1Ij48SU1HIFNSQz0iLi4vaW1hZ2VzL3NwYWNlci5naWYiIFdJRFRIPSIyODAiIEhFSUdIVD0iMSIgSFNQQUNFPSIwIj48L1REPgorCQk8VEQgSEVJR0hUPSIxNSIgIFdJRFRIPSIxMDAlIiBCQUNLR1JPVU5EPSIuLi9pbWFnZXMvdGVtcGxhdGVfdS5naWYiPjwvVEQ+CisJPC9UUj4KKwk8VFI+CisJCTxURCBIRUlHSFQ9IjYwIiA+CisJCQk8Q0VOVEVSPjxJTUcgU1JDPSIuLi9pbWFnZXMvVGl0bGVMb2dvX3RyYW5zcGFyZW50LmdpZiIgVlNQQUNFPSIwIj48L0NFTlRFUj4KKwkJPC9URD4KKwk8L1RSPgorCTxUUj4KKwkJCisgICAgPFREIFdJRFRIPSIyMDAiIEJBQ0tHUk9VTkQ9Ii4uL2ltYWdlcy90ZW1wbGF0ZV9sLmdpZiIgVkFMSUdOPSJ0b3AiPgorCQk8VEFCTEUgV0lEVEg9IjE4MCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSIxIj4gCisgICAgICAJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0hlYWQiPkdlbmVyYWw8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgVkFMSUdOPSJjZW50ZXIiPjxJTUcgU1JDPSIuLi9pbWFnZXMvdGVtcGxhdGVfbGluZS5naWYiPjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNMaXN0Ij4KKwkgICAgICAgIDxVTD4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL3N5c3RlbV9yZXF1aXJlbWVudHMuaHRtbCI+U3lzdGVtIFJlcXVpcmVtZW50czwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vZmFxLmh0bWwiPkZBUTwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vZnV0dXJlX2ZlYXR1cmVzLmh0bWwiPkZ1dHVyZSBSZWxlYXNlczwvQT48L0xJPgorICAgICAgICAgICAgICA8TEkgQ0xBU1M9InRvcGljTGlzdCI+PEEgSFJFRj0iLi4vZnV0dXJlX2ZlYXR1cmVzLmh0bWwiPlZlcnNpb24gCisgICAgICAgICAgICAgICAgSGlzdG9yeTwvQT48L0xJPgorICAgICAgICAgICAgPC9VTD4KKwkJCTwvVEQ+CisJCTwvVFI+CisgICAgICAJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0hlYWQiPlJCIE1hbmFnZXI8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgVkFMSUdOPSJjZW50ZXIiPjxJTUcgU1JDPSIuLi9pbWFnZXMvdGVtcGxhdGVfbGluZS5naWYiPjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNMaXN0Ij4KKwkgICAgICAgIDxVTD4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL2luZGV4Lmh0bWwiPkhvbWU8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9ImluZGV4Lmh0bWwiPlR1dG9yaWFsPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi92aWV3cy9pbmRleC5odG1sIj5GdW5jdGlvbmFsaXR5IGFuZCBWaWV3czwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vbG9va2FuZGZlZWwuaHRtbCI+TG9vayBhbmQgRmVlbDwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vbWVudS5odG1sIj5NZW51IEl0ZW1zPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMSSBDTEFTUz0idG9waWNMaXN0Ij48QSBIUkVGPSJzdGVwMS5odG1sIj5QcmVmZXJlbmNlczwvQT48L0xJPgorICAgICAgICAgICAgPC9VTD4KKwkJCTwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNIZWFkIj5SQiBSZXBvcnRlcjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBWQUxJR049ImNlbnRlciI+PElNRyBTUkM9Ii4uL2ltYWdlcy90ZW1wbGF0ZV9saW5lLmdpZiI+PC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0xpc3QiPgorCSAgPFVMPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vUkJSZXBvcnRlci5odG1sIj5Ib21lPC9BPjwvTEk+CisgICAgICAgIDxMST5SZXBvcnQgVHlwZXM8L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vc2NhbmZpbGUuaHRtbCI+Q29kZSBTY2FubmluZzwvQT48L0xJPgorICAgICAgICAgICAgPC9VTD4KKwkJCTwvVEQ+CisJCTwvVFI+CisJPC9UQUJMRT4KKworICAgICAgPFA+Jm5ic3A7IDwvUD4KKyAgICAgIDwvVEQ+CisJCQorICAgIDxURCBDT0xTUEFOPSIyIiBWQUxJR049InRvcCIgQ0xBU1M9Im1haW5CbG9jayI+PCEtLSAjQmVnaW5FZGl0YWJsZSAiTWFpbiIgLS0+CisgICAgICA8SDIgQUxJR049IkNFTlRFUiI+U3RlcCA2LiBTYXZpbmcgdGhlIFJlc3VsdHM8L0gyPgorICAgICAgPFA+PEI+QWx3YXlzIFNhdmUgUGVyaW9kaWNhbGx5PC9CPjwvUD4KKyAgICAgIDxQPk5vbmUgb2YgdGhlIHdvcmsgeW91IGRvIGluIG1hbmFnaW5nIHRoZSByZXNvdXJjZSBidW5kbGUgaXMgZmluYWwgdW50aWwgCisgICAgICAgIHlvdSBoYXZlIHNhdmVkIHRoZSByZXN1bHRzLiBUaGUgZmlyc3QgdGltZSB5b3Ugc2F2ZSB0aGUgcmVzb3VyY2UgYnVuZGxlLCAKKyAgICAgICAgeW91IHNob3VsZCBzZWxlY3QgdGhlICdTYXZlIFJlc291cmNlIEJ1bmRsZSBBcy4uLicgb3B0aW9uIGZyb20gdGhlIGZpbGUgCisgICAgICAgIG1lbnUuIFNlbGVjdCBhIGZvbGRlciBpbiB3aGljaCB0byBzYXZlIHRoZSBmaWxlIGFuZCBlbnRlciBpbiB0aGUgYmFzZSAKKyAgICAgICAgY2xhc3MgbmFtZSBvciB0aGUgYmFzZSBjbGFzcyBuYW1lIGZvbGxvd2VkIGJ5IHRoZSAucHJvcGVydGllcyBzdWZmaXggYW5kIAorICAgICAgICBwcmVzcyBzYXZlLjwvUD4KKyAgICAgIDxQPk9uY2UgdGhpcyBoYXMgYmVlbiBkb25lLCBpdCBpcyBzdWZmaWNpZW50IHRvIGNob3NlIHRoZSAnU2F2ZSBSZXNvdXJjZSAKKyAgICAgICAgQnVuZGxlJyBvcHRpb24gZnJvbSB0aGUgZmlsZSBtZW51LiBJZiB5b3UgYXJlIHdvcmtpbmcgd2l0aCBhIHZlcnNpb25pbmcgCisgICAgICAgIHRvb2wgc3VjaCBhcyBNaWNyb3NvZnQncyBWaXN1YWwgU291cmNlIFNhZmUsIGV0Yy4sIGJlIHN1cmUgdGhhdCB5b3UgaGF2ZSAKKyAgICAgICAgd3JpdGUgcHJpdmVsZWdlcyB0byB0aGUgZW50aXJlIGJ1bmRsZSBvZiBmaWxlcy4gT3RoZXJ3aXNlLCB5b3Ugd2lsbCByZWNpZXZlIAorICAgICAgICB3YXJuaW5nIGZyb20gUkJNYW5hZ2VyIHRoYXQgaXQgd2FzIHVuYWJsZSB0byB3cml0ZSB0byBhbGwgb2YgdGhlIGZpbGVzLjwvUD4KKyAgICAgIDxQPkEgd2F5IHRvIGdldCBhcm91bmQgdGhpcyBpcyB0byBzYXZlIHRoZSByZXNvdXJjZSBmaWxlcyBpbmRpdmlkdWFsbHkuIAorICAgICAgICBJbiBvcmRlciB0byBkbyB0aGlzLCByaWdodCBjbGljayBvbiBhIHJlc291cmNlIGZpbGUgaW4gdGhlIHRyZWUgdmlldyBhbmQgCisgICAgICAgIHNlbGVjdCB0aGUgJ1NhdmUgUmVzb3VyY2UgRmlsZScgb3B0aW9uLiBUaGlzIGlzIG5vdCByZWNvbW1lbmRlZCBpZiB5b3UgCisgICAgICAgIGhhdmUgbWFkZSBjaGFuZ2VzIHRvIHRoZSBlbnRpcmUgcmVzb3VyY2UgYnVuZGxlLCBidXQgaWYgeW91IGhhdmUgb25seSAKKyAgICAgICAgYmVlbiBkb2luZyB0cmFuc2xhdGlvbiB3b3JrIGZvciBhIHBhcnRpY3VsYXIgZmlsZSwgb3IgYSBmZXcgZmlsZXMsIHNhdmluZyAKKyAgICAgICAgaW4gdGhpcyBtYW5uZXIgY2FuIGJlIHVzZWZ1bC48L1A+CisgICAgICA8UD5JZiB5b3UgZXZlciB3YW50IHRvIGNoYW5nZSB0aGUgbG9jYXRpb24gb3IgYmFzZSBjbGFzcyBuYW1lIG9mIHRoZSByZXNvdXJjZSAKKyAgICAgICAgYnVuZGxlLCB5b3UgbWF5IGRvIHNvIGJ5IHJlc2F2aW5nIHdpdGggdGhlICdTYXZlIFJlc291cmNlIEJ1bmRsZSBBcy4uLicgCisgICAgICAgIG9wdGlvbi48L1A+CisgICAgICA8UD48Qj5Hb29kIEx1Y2s8L0I+PC9QPgorICAgICAgPFA+WW91IHdpbGwgZmluZCB0aGF0IHVzaW5nIHRoaXMgdG9vbCB3aWxsIHNwZWVkIHVwIHRoZSBkZXZlbG9wbWVudCBwcm9jZXNzIAorICAgICAgICBmb3IgeW91ciBpbnRlcm5hdGlvbmFsIGFwcGxpY2F0aW9uIG9yIHdlYiBzZXJ2aWNlLiBBcyB0aGlzIGlzIG9ubHkgYW4gCisgICAgICAgIGFscGhhIHZlcnNpb24gcmVsZWFzZSwgYmUgc3VyZSB0byBjaGVjayBhbHBoYXdvcmtzIGZyZXF1ZW50bHkgZm9yIHVwZGF0ZXMgCisgICAgICAgIGluIGZ1bmN0aW9uYWxpdHkgYW5kIGJ1ZyBmaXhlcy48L1A+CisgICAgICA8UD48QSBIUkVGPSJzdGVwNS5odG1sIj5CYWNrIHRvIFN0ZXAgNTwvQT48L1A+CisgICAgICA8IS0tICNFbmRFZGl0YWJsZSAtLT48L1REPgorCTwvVFI+CisJPFRSPgorCQk8VEQgQkFDS0dST1VORD0iLi4vaW1hZ2VzL3RlbXBsYXRlX2xsLmdpZiIgSEVJR0hUPSI0MCIgV0lEVEg9IjIwMCI+CisJCQk8IS0tIENvbW1lbnQgLS0+CisJCTwvVEQ+CisJCTxURCBXSURUSD0iODAiPgorCQkJPCEtLSBDb21tZW50IC0tPgorCQk8L1REPgorCQk8VEQ+CisJCQk8Q0VOVEVSPjxTUEFOIENMQVNTPSJDb3B5cmlnaHQiPkNvcHlyaWdodCAyMDAwLTIwMDEgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcywgQWxsIFJpZ2h0cyBSZXNlcnZlZDwvU1BBTj48L0NFTlRFUj4KKwkJPC9URD4KKwk8L1RSPgorPC9UQUJMRT4KKworPC9CT0RZPgorPCEtLSAjRW5kVGVtcGxhdGUgLS0+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3Mvdmlld3MvaW5kZXguaHRtbCBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL3ZpZXdzL2luZGV4Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVhZjhhNgotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL3ZpZXdzL2luZGV4Lmh0bWwKQEAgLTAsMCArMSwxNTUgQEAKKzxIVE1MPjwhLS0gI0JlZ2luVGVtcGxhdGUgIi9UZW1wbGF0ZXMvTWFpblRlbXBsYXRlLmR3dCIgLS0+Cis8SEVBRD4KKzwhLS0gI0JlZ2luRWRpdGFibGUgImRvY3RpdGxlIiAtLT4gCis8VElUTEU+UkIgTWFuYWdlciAtIEZ1bmN0aW9uYWxpdHkgYW5kIFZpZXdzPC9USVRMRT4KKzwhLS0gI0VuZEVkaXRhYmxlIC0tPiAKKzxNRVRBIEhUVFAtRVFVSVY9IkNvbnRlbnQtVHlwZSIgQ09OVEVOVD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgorPFNUWUxFIFRZUEU9IlRFWFQvQ1NTIj4KKzwhLS0KKy50b3BpY0hlYWQgeyAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7IGZvbnQtc2l6ZTogMTRwdDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6ICMzMzMzMzN9CisudG9waWNMaXN0IHsgIGZvbnQtZmFtaWx5OiBHZW9yZ2lhLCAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOyBmb250LXNpemU6IDlwdDsgY29sb3I6ICNGRjAwOTk7IGxpc3Qtc3R5bGUtaW1hZ2U6IHVybCguLi9pbWFnZXMvZGlhbW9uZF9idWxsZXQuZ2lmKTsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyBmb250LXdlaWdodDogYm9sZH0KKy5tYWluQmxvY2sgeyAgZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTJwdDsgbWFyZ2luLXRvcDogNXB4OyBtYXJnaW4tcmlnaHQ6IDVweDsgbWFyZ2luLWJvdHRvbTogNXB4OyBtYXJnaW4tbGVmdDogNXB4OyBwYWRkaW5nLXRvcDogNXB4OyBwYWRkaW5nLXJpZ2h0OiAxMHB4OyBwYWRkaW5nLWJvdHRvbTogNXB4OyBwYWRkaW5nLWxlZnQ6IDEwcHg7IHRleHQtYWxpZ246IGp1c3RpZnl9CistLT4KKzwvU1RZTEU+Cis8L0hFQUQ+CisKKzxCT0RZIEJHQ09MT1I9IiNGRkZGRkYiIExFRlRNQVJHSU49IjAiIFRPUE1BUkdJTj0iMCIgTUFSR0lOV0lEVEg9IjAiIE1BUkdJTkhFSUdIVD0iMCI+Cis8VEFCTEUgV0lEVEg9IjEwMCUiIEJPUkRFUj0iMCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSIwIj4KKyAgPFRSPgorICAgIDxURCBST1dTUEFOPSIyIiBDT0xTUEFOPSIyIiBCQUNLR1JPVU5EPSIuLi9pbWFnZXMvdGVtcGxhdGVfdWwuZ2lmIiBIRUlHSFQ9Ijc1Ij48SU1HIFNSQz0iLi4vaW1hZ2VzL3NwYWNlci5naWYiIFdJRFRIPSIyODAiIEhFSUdIVD0iMSIgSFNQQUNFPSIwIj48L1REPgorCQk8VEQgSEVJR0hUPSIxNSIgIFdJRFRIPSIxMDAlIiBCQUNLR1JPVU5EPSIuLi9pbWFnZXMvdGVtcGxhdGVfdS5naWYiPjwvVEQ+CisJPC9UUj4KKwk8VFI+CisJCTxURCBIRUlHSFQ9IjYwIiA+CisJCQk8Q0VOVEVSPjxJTUcgU1JDPSIuLi9pbWFnZXMvVGl0bGVMb2dvX3RyYW5zcGFyZW50LmdpZiIgVlNQQUNFPSIwIj48L0NFTlRFUj4KKwkJPC9URD4KKwk8L1RSPgorCTxUUj4KKwkJCisgICAgPFREIFdJRFRIPSIyMDAiIEJBQ0tHUk9VTkQ9Ii4uL2ltYWdlcy90ZW1wbGF0ZV9sLmdpZiIgVkFMSUdOPSJ0b3AiPgorCQk8VEFCTEUgV0lEVEg9IjE4MCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSIxIj4gCisgICAgICAJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0hlYWQiPkdlbmVyYWw8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgVkFMSUdOPSJjZW50ZXIiPjxJTUcgU1JDPSIuLi9pbWFnZXMvdGVtcGxhdGVfbGluZS5naWYiPjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNMaXN0Ij4KKwkgICAgICAgIDxVTD4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL3N5c3RlbV9yZXF1aXJlbWVudHMuaHRtbCI+U3lzdGVtIFJlcXVpcmVtZW50czwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vZmFxLmh0bWwiPkZBUTwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vZnV0dXJlX2ZlYXR1cmVzLmh0bWwiPkZ1dHVyZSBSZWxlYXNlczwvQT48L0xJPgorICAgICAgICAgICAgICA8TEkgQ0xBU1M9InRvcGljTGlzdCI+PEEgSFJFRj0iLi4vZnV0dXJlX2ZlYXR1cmVzLmh0bWwiPlZlcnNpb24gCisgICAgICAgICAgICAgICAgSGlzdG9yeTwvQT48L0xJPgorICAgICAgICAgICAgPC9VTD4KKwkJCTwvVEQ+CisJCTwvVFI+CisgICAgICAJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0hlYWQiPlJCIE1hbmFnZXI8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgVkFMSUdOPSJjZW50ZXIiPjxJTUcgU1JDPSIuLi9pbWFnZXMvdGVtcGxhdGVfbGluZS5naWYiPjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNMaXN0Ij4KKwkgICAgICAgIDxVTD4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL2luZGV4Lmh0bWwiPkhvbWU8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL3R1dG9yaWFsL2luZGV4Lmh0bWwiPlR1dG9yaWFsPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSJpbmRleC5odG1sIj5GdW5jdGlvbmFsaXR5IGFuZCBWaWV3czwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vbG9va2FuZGZlZWwuaHRtbCI+TG9vayBhbmQgRmVlbDwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vbWVudS5odG1sIj5NZW51IEl0ZW1zPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMSSBDTEFTUz0idG9waWNMaXN0Ij48QSBIUkVGPSIuLi90dXRvcmlhbC9zdGVwMS5odG1sIj5QcmVmZXJlbmNlczwvQT48L0xJPgorICAgICAgICAgICAgPC9VTD4KKwkJCTwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNIZWFkIj5SQiBSZXBvcnRlcjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBWQUxJR049ImNlbnRlciI+PElNRyBTUkM9Ii4uL2ltYWdlcy90ZW1wbGF0ZV9saW5lLmdpZiI+PC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0xpc3QiPgorCSAgPFVMPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vUkJSZXBvcnRlci5odG1sIj5Ib21lPC9BPjwvTEk+CisgICAgICAgIDxMST5SZXBvcnQgVHlwZXM8L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vc2NhbmZpbGUuaHRtbCI+Q29kZSBTY2FubmluZzwvQT48L0xJPgorICAgICAgICAgICAgPC9VTD4KKwkJCTwvVEQ+CisJCTwvVFI+CisJPC9UQUJMRT4KKworICAgICAgPFA+Jm5ic3A7IDwvUD4KKyAgICAgIDwvVEQ+CisJCQorICAgIDxURCBDT0xTUEFOPSIyIiBWQUxJR049InRvcCIgQ0xBU1M9Im1haW5CbG9jayI+PCEtLSAjQmVnaW5FZGl0YWJsZSAiTWFpbiIgLS0+IAorICAgICAgPERJViBBTElHTj0iQ0VOVEVSIj4gCisgICAgICAgIDxIMj5GdW5jdGlvbmFsaXR5IGFuZCBWaWV3czwvSDI+CisgICAgICAgIDxQIEFMSUdOPSJDRU5URVIiPlJCIE1hbmFnZXIgb2ZmZXJzIGZpdmUgZGlmZmVyZW50IHdheXMgdG8gbG9vayBhdCBhbmQgCisgICAgICAgICAgbWFuaXB1bGF0ZSByZXNvdXJjZSBidW5kbGVzLiBGb3VyIG9mIHRoZXNlIHZpZXdzIGFyZSBmb3VuZCBpbiB0aGUgdGFicyAKKyAgICAgICAgICBsb2NhdGVkIGluIHRoZSByaWdodCBwb3J0aW9uIG9mIHRoZSBkaXNwbGF5LiBUaGUgZmlmdGggaXMgdGhlIHRyZWUgdmlldyAKKyAgICAgICAgICBsb2NhdGVkIHRvIHRoZSBsZWZ0LiBJbiB0aGUgZm9sbG93aW5nIHBhZ2VzLCB0aGUgdXNlIG9mIGVhY2ggb2YgdGhlc2UgCisgICAgICAgICAgdmlld3MgaXMgZXhwbGFpbmVkLjwvUD4KKyAgICAgICAgPEgzIEFMSUdOPSJMRUZUIj4gCisgICAgICAgICAgPFVMPgorICAgICAgICAgICAgPExJPiAKKyAgICAgICAgICAgICAgPEg0PlZpZXcgMS4gPEEgSFJFRj0idmlldzEuaHRtbCI+VGhlIFJlc291cmNlIEJ1bmRsZSBUcmVlPC9BPjwvSDQ+CisgICAgICAgICAgICA8L0xJPgorICAgICAgICAgICAgPExJPiAKKyAgICAgICAgICAgICAgPEg0PlZpZXcgMi4gPEEgSFJFRj0idmlldzIuaHRtbCI+VGhlIFN0YXRpc3RpY3MgVGFiPC9BPjwvSDQ+CisgICAgICAgICAgICA8L0xJPgorICAgICAgICAgICAgPExJPiAKKyAgICAgICAgICAgICAgPEg0PlZpZXcgMy4gPEEgSFJFRj0idmlldzMuaHRtbCI+VGhlIFVudHJhbnNsYXRlZCBUYWI8L0E+PC9IND4KKyAgICAgICAgICAgIDwvTEk+CisgICAgICAgICAgICA8TEk+IAorICAgICAgICAgICAgICA8SDQ+VmlldyA0LiA8QSBIUkVGPSJ2aWV3NC5odG1sIj5UaGUgR3JvdXBzIFRhYjwvQT48L0g0PgorICAgICAgICAgICAgPC9MST4KKyAgICAgICAgICAgIDxMST4gCisgICAgICAgICAgICAgIDxIND5WaWV3IDUuIDxBIEhSRUY9InZpZXc1Lmh0bWwiPlRoZSBTZWFyY2ggVGFiPC9BPjwvSDQ+CisgICAgICAgICAgICA8L0xJPgorICAgICAgICAgIDwvVUw+CisgICAgICAgIDwvSDM+CisgICAgICAgIDxIND48QSBIUkVGPSJ2aWV3MS5odG1sIj5HbyB0byBWaWV3IDE8L0E+PC9IND4KKyAgICAgIDwvRElWPgorICAgICAgPCEtLSAjRW5kRWRpdGFibGUgLS0+PC9URD4KKwk8L1RSPgorCTxUUj4KKwkJPFREIEJBQ0tHUk9VTkQ9Ii4uL2ltYWdlcy90ZW1wbGF0ZV9sbC5naWYiIEhFSUdIVD0iNDAiIFdJRFRIPSIyMDAiPgorCQkJPCEtLSBDb21tZW50IC0tPgorCQk8L1REPgorCQk8VEQgV0lEVEg9IjgwIj4KKwkJCTwhLS0gQ29tbWVudCAtLT4KKwkJPC9URD4KKwkJPFREPgorCQkJPENFTlRFUj48U1BBTiBDTEFTUz0iQ29weXJpZ2h0Ij5Db3B5cmlnaHQgMjAwMC0yMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMsIEFsbCBSaWdodHMgUmVzZXJ2ZWQ8L1NQQU4+PC9DRU5URVI+CisJCTwvVEQ+CisJPC9UUj4KKzwvVEFCTEU+Cis8IS0tCis8VEFCTEUgV0lEVEg9IjEwMCUiIEJPUkRFUj0iMCIgQ0VMTFNQQUNJTkc9IjAiIENFTExQQURESU5HPSIyIj4KKyAgPFRSPgorICAgIDxURCBXSURUSD0iMjAwIiBCR0NPTE9SPSIjQ0NDQ0ZGIj4mbmJzcDs8L1REPgorICAgIDxURD4KKyAgICAgIDxESVYgQUxJR049IkNFTlRFUiI+PElNRyBTUkM9Ii4uL2ltYWdlcy9UaXRsZUxvZ29fdHJhbnNwYXJlbnQuZ2lmIiBXSURUSD0iMTc1IiBIRUlHSFQ9IjUwIj48L0RJVj4KKyAgICA8L1REPgorICA8L1RSPgorICA8VFIgVkFMSUdOPSJUT1AiPiAKKyAgICA8VEQgV0lEVEg9IjIwMCIgQkdDT0xPUj0iI0NDQ0NGRiI+IAorICAgICAgPFA+PEEgSFJFRj0iaW5kZXguaHRtbCI+UkJNYW5hZ2VyPC9BPjwvUD4KKyAgICAgIDxQPjxBIEhSRUY9IlJCUmVwb3J0ZXIuaHRtbCI+UkJSZXBvcnRlcjwvQT48L1A+CisgICAgICA8UD48QSBIUkVGPSIuLi90dXRvcmlhbC9zdGVwMS5odG1sIj5TeXN0ZW0gUmVxdWlyZW1lbnRzPC9BPjwvUD4KKyAgICAgIDxQPjxBIEhSRUY9ImZhcS5odG1sIj5GQVE8L0E+PC9QPgorICAgICAgPFA+VG9waWNzPC9QPgorICAgICAgPFVMPgorICAgICAgICA8TEk+PEEgSFJFRj0iLi4vdHV0b3JpYWwvaW5kZXguaHRtbCI+U3RlcC1ieS1zdGVwIFR1dG9yaWFsPC9BPjwvTEk+CisgICAgICAgIDxMST48QSBIUkVGPSJzdGVwMS5odG1sIj5DaGFuZ2luZyBQcmVmZW5jZXM8L0E+PC9MST4KKyAgICAgICAgPExJPjxBIEhSRUY9ImZ1dHVyZV9mZWF0dXJlcy5odG1sIj5GdXR1cmUgUmVsZWFzZSBGZWF0dXJlczwvQT48L0xJPgorICAgICAgPC9VTD4KKyAgICA8L1REPgorICAgIDxURD48L1REPgorICA8L1RSPgorPC9UQUJMRT4KKy0tPgorPC9CT0RZPgorPCEtLSAjRW5kVGVtcGxhdGUgLS0+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3Mvdmlld3MvdmlldzEuaHRtbCBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL3ZpZXdzL3ZpZXcxLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU1ZDk1NwotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL3ZpZXdzL3ZpZXcxLmh0bWwKQEAgLTAsMCArMSwxNTAgQEAKKzxIVE1MPjwhLS0gI0JlZ2luVGVtcGxhdGUgIi9UZW1wbGF0ZXMvTWFpblRlbXBsYXRlLmR3dCIgLS0+Cis8SEVBRD4KKzwhLS0gI0JlZ2luRWRpdGFibGUgImRvY3RpdGxlIiAtLT4gCis8VElUTEU+UkIgTWFuYWdlciAtIFRoZSBSZXNvdXJjZSBCdW5kbGUgVHJlZTwvVElUTEU+Cis8IS0tICNFbmRFZGl0YWJsZSAtLT4gCis8TUVUQSBIVFRQLUVRVUlWPSJDb250ZW50LVR5cGUiIENPTlRFTlQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzxTVFlMRSBUWVBFPSJURVhUL0NTUyI+Cis8IS0tCisudG9waWNIZWFkIHsgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOyBmb250LXNpemU6IDE0cHQ7IGZvbnQtd2VpZ2h0OiBib2xkOyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiAjMzMzMzMzfQorLnRvcGljTGlzdCB7ICBmb250LWZhbWlseTogR2VvcmdpYSwgIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsgZm9udC1zaXplOiA5cHQ7IGNvbG9yOiAjRkYwMDk5OyBsaXN0LXN0eWxlLWltYWdlOiB1cmwoLi4vaW1hZ2VzL2RpYW1vbmRfYnVsbGV0LmdpZik7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgZm9udC13ZWlnaHQ6IGJvbGR9CisubWFpbkJsb2NrIHsgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBmb250LXNpemU6IDEycHQ7IG1hcmdpbi10b3A6IDVweDsgbWFyZ2luLXJpZ2h0OiA1cHg7IG1hcmdpbi1ib3R0b206IDVweDsgbWFyZ2luLWxlZnQ6IDVweDsgcGFkZGluZy10b3A6IDVweDsgcGFkZGluZy1yaWdodDogMTBweDsgcGFkZGluZy1ib3R0b206IDVweDsgcGFkZGluZy1sZWZ0OiAxMHB4OyB0ZXh0LWFsaWduOiBqdXN0aWZ5fQorLS0+Cis8L1NUWUxFPgorPC9IRUFEPgorCis8Qk9EWSBCR0NPTE9SPSIjRkZGRkZGIiBMRUZUTUFSR0lOPSIwIiBUT1BNQVJHSU49IjAiIE1BUkdJTldJRFRIPSIwIiBNQVJHSU5IRUlHSFQ9IjAiPgorPFRBQkxFIFdJRFRIPSIxMDAlIiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iMCI+CisgIDxUUj4KKyAgICA8VEQgUk9XU1BBTj0iMiIgQ09MU1BBTj0iMiIgQkFDS0dST1VORD0iLi4vaW1hZ2VzL3RlbXBsYXRlX3VsLmdpZiIgSEVJR0hUPSI3NSI+PElNRyBTUkM9Ii4uL2ltYWdlcy9zcGFjZXIuZ2lmIiBXSURUSD0iMjgwIiBIRUlHSFQ9IjEiIEhTUEFDRT0iMCI+PC9URD4KKwkJPFREIEhFSUdIVD0iMTUiICBXSURUSD0iMTAwJSIgQkFDS0dST1VORD0iLi4vaW1hZ2VzL3RlbXBsYXRlX3UuZ2lmIj48L1REPgorCTwvVFI+CisJPFRSPgorCQk8VEQgSEVJR0hUPSI2MCIgPgorCQkJPENFTlRFUj48SU1HIFNSQz0iLi4vaW1hZ2VzL1RpdGxlTG9nb190cmFuc3BhcmVudC5naWYiIFZTUEFDRT0iMCI+PC9DRU5URVI+CisJCTwvVEQ+CisJPC9UUj4KKwk8VFI+CisJCQorICAgIDxURCBXSURUSD0iMjAwIiBCQUNLR1JPVU5EPSIuLi9pbWFnZXMvdGVtcGxhdGVfbC5naWYiIFZBTElHTj0idG9wIj4KKwkJPFRBQkxFIFdJRFRIPSIxODAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iMSI+IAorICAgICAgCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNIZWFkIj5HZW5lcmFsPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIFZBTElHTj0iY2VudGVyIj48SU1HIFNSQz0iLi4vaW1hZ2VzL3RlbXBsYXRlX2xpbmUuZ2lmIj48L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljTGlzdCI+CisJICAgICAgICA8VUw+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9zeXN0ZW1fcmVxdWlyZW1lbnRzLmh0bWwiPlN5c3RlbSBSZXF1aXJlbWVudHM8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL2ZhcS5odG1sIj5GQVE8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL2Z1dHVyZV9mZWF0dXJlcy5odG1sIj5GdXR1cmUgUmVsZWFzZXM8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJIENMQVNTPSJ0b3BpY0xpc3QiPjxBIEhSRUY9Ii4uL2Z1dHVyZV9mZWF0dXJlcy5odG1sIj5WZXJzaW9uIAorICAgICAgICAgICAgICAgIEhpc3Rvcnk8L0E+PC9MST4KKyAgICAgICAgICAgIDwvVUw+CisJCQk8L1REPgorCQk8L1RSPgorICAgICAgCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNIZWFkIj5SQiBNYW5hZ2VyPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIFZBTElHTj0iY2VudGVyIj48SU1HIFNSQz0iLi4vaW1hZ2VzL3RlbXBsYXRlX2xpbmUuZ2lmIj48L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljTGlzdCI+CisJICAgICAgICA8VUw+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9pbmRleC5odG1sIj5Ib21lPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi90dXRvcmlhbC9pbmRleC5odG1sIj5UdXRvcmlhbDwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iaW5kZXguaHRtbCI+RnVuY3Rpb25hbGl0eSBhbmQgVmlld3M8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL2xvb2thbmRmZWVsLmh0bWwiPkxvb2sgYW5kIEZlZWw8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL21lbnUuaHRtbCI+TWVudSBJdGVtczwvQT48L0xJPgorICAgICAgICAgICAgICA8TEkgQ0xBU1M9InRvcGljTGlzdCI+PEEgSFJFRj0iLi4vdHV0b3JpYWwvc3RlcDEuaHRtbCI+UHJlZmVyZW5jZXM8L0E+PC9MST4KKyAgICAgICAgICAgIDwvVUw+CisJCQk8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljSGVhZCI+UkIgUmVwb3J0ZXI8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgVkFMSUdOPSJjZW50ZXIiPjxJTUcgU1JDPSIuLi9pbWFnZXMvdGVtcGxhdGVfbGluZS5naWYiPjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNMaXN0Ij4KKwkgIDxVTD4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL1JCUmVwb3J0ZXIuaHRtbCI+SG9tZTwvQT48L0xJPgorICAgICAgICA8TEk+UmVwb3J0IFR5cGVzPC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL3NjYW5maWxlLmh0bWwiPkNvZGUgU2Nhbm5pbmc8L0E+PC9MST4KKyAgICAgICAgICAgIDwvVUw+CisJCQk8L1REPgorCQk8L1RSPgorCTwvVEFCTEU+CisKKyAgICAgIDxQPiZuYnNwOyA8L1A+CisgICAgICA8L1REPgorCQkKKyAgICA8VEQgQ09MU1BBTj0iMiIgVkFMSUdOPSJ0b3AiIENMQVNTPSJtYWluQmxvY2siPjwhLS0gI0JlZ2luRWRpdGFibGUgIk1haW4iIC0tPiAKKyAgICAgIDxIMyBBTElHTj0iQ0VOVEVSIj5WaWV3IDEuIFRoZSBSZXNvdXJjZSBCdW5kbGUgVHJlZTwvSDM+CisgICAgICA8UD5Mb2NhdGVkIG9uIHRoZSBsZWZ0IG9mIHRoZSBSQiBNYW5hZ2VyIGFwcGxpY2F0aW9uIGlzIGEgc2VjdGlvbiBmb3IgZGlzcGxheWluZyAKKyAgICAgICAgYSByZXNvdXJjZSBidW5kbGUgaW4gYSB0cmVlIHZpZXcuIFJlc291cmNlIEJ1bmRsZXMgdXN1YWxseSBhcmUgbWFkZSB1cCAKKyAgICAgICAgb2YgdGV4dCBvciBjbGFzcyBmaWxlcyBpbiBhIGZsYXQgZGlyZWN0b3J5IHN0cnVjdHVyZS4gSG93ZXZlciwgdGhlIGxvY2FsZSAKKyAgICAgICAgZW5jb2RpbmdzIGdpdmVuIHRvIGVhY2ggZmlsZSBtYWtlcyBhIHRyZWUgdmlldyBhIG5hdHVyYWwgd2F5IHRvIGxvb2sgYXQgCisgICAgICAgIHRoZSBidW5kbGUuPC9QPgorICAgICAgPFA+V2hlbiBSQiBNYW5hZ2VyIGlzIGluaXRpYWxseSBsYXVuY2hlZCwgdGhpcyB2aWV3IGlzIGVtcHR5LCBzaW5jZSB0aGVyZSAKKyAgICAgICAgaXMgbm8gb3BlbiByZXNvdXJjZSBidW5kbGUuIFVwb24gb3BlbmluZyBhIHZhbGlkIHJlc291cmNlIGJ1bmRsZSwgdGhlIAorICAgICAgICB0cmVlIGlzIHVwZGF0ZWQgdG8gcmVmbGVjdCB0aGUgb3BlbmVkIGJ1bmRsZS4gSW4gdGhlIGZvbGxvd2luZyBzY3JlZW4gCisgICAgICAgIHNob3RzLCB5b3Ugd2lsbCBzZWUgdGhlIHRyZWUgZm9yIHRoZSByZXNvdXJjZSBidW5kbGUgYXNzb2NpYXRlIHdpdGggUkIgCisgICAgICAgIE1hbmFnZXIgaXRzZWxmLjwvUD4KKyAgICAgIDxQPjxJTUcgU1JDPSIuLi9pbWFnZXMvc2NyZWVuc2hvdHMvdmlld190cmVlX2Jhc2ljLmdpZiIgV0lEVEg9IjY0MiIgSEVJR0hUPSI0OTkiPjwvUD4KKyAgICAgIDxQPlRoZSB0b3AgbW9zdCBlbGVtZW50IG9mIHRoZSB0cmVlICh0aGUgcm9vdCBvZiB0aGUgdHJlZSkgcmVwcmVzZW50cyB0aGUgCisgICAgICAgIHJlc291cmNlIGJ1bmRsZSBhcyBhIHdob2xlLiBCZWxvdyB0aGUgcm9vdCBhcmUgcmVzb3VyY2UgZmlsZXMsIHdoaWNoIGFyZSAKKyAgICAgICAgcmVwcmVzZW50ZWQgd2l0aCB0aGUgZmlsZSBpY29ucyB3aXRoIGEgbGV0dGVyIGluIHRoZSBtaWRkbGUsIGFuZCBsYW5ndWFnZSwgCisgICAgICAgIGNvdW50cnksIGFuZCB2YXJpYW50IGJyYW5jaGVzLiBMYW5ndWFnZSBicmFuY2hlcyBhcmUgcmVwcmVzZW50ZWQgYnkgYW4gCisgICAgICAgIGljb24gd2l0aCBhIGdsb2JlLiBCZW5lYXRoIHRoZXNlIGNhbiBiZSBsYW5ndWFnZSBicmFuY2hlcyByZXByZXNlbnRlZCAKKyAgICAgICAgYnkgYW4gaWNvbiB3aXRoIGEgZmxhZy4gQmVuZWF0aCB0aGVzZSBjYW4gYmUgdmFyaWFudCBicmFuY2hlcyByZXByZXNlbnRlZCAKKyAgICAgICAgYnkgYW4gaWNvbiB3aXRoIGEgY2FydG9vbiBkaWFsb2cgc3ltYm9sLiBCZW5lYXRoIGFueSBvZiB0aGUgYnJhbmNoIG5vZGVzLCAKKyAgICAgICAgcmVzb3VyY2UgZmlsZXMgY2FuIGJlIGZvdW5kLjwvUD4KKyAgICAgIDxQPlRoZSBuYW1lIG9mIHRoZSByb290IG9mIHRoZSB0cmVlIGlzIHRoZSBiYXNlIG5hbWUgb2YgdGhlIHJlc291cmNlIGJ1bmRsZSwgCisgICAgICAgIGluIHRoZSBleGFtcGxlIGFib3ZlLCB0aGUgYnVuZGxlIGlzIGNhbGxlZCBSQk1hbmFnZXIuIFRoZSBuYW1lIG9mIHRoZSAKKyAgICAgICAgZmlsZSBub2RlcyBpbiB0aGUgdHJlZSB3aWxsIHZhcnkgYWNjb3JkaW5nIHRvIHdoZXJlIGluIHRoZSB0cmVlIHRoZXkgYXJlLiAKKyAgICAgICAgRWFjaCBsYW5ndWFnZSBmaWxlIHdpbGwgZGlzcGxheSB0aGUgbGFuZ3VhZ2UsIGNvdW50cnksIGFuZCB2YXJpYW50IGluZm9ybWF0aW9uIAorICAgICAgICB0aGF0IGl0IGtub3dzIGFib3V0IGZvbGxvd2VkIGJ5IHRoZSBlbmNvZGluZyBvZiB0aGUgZmlsZSdzIGxvY2FsZSBpbiBwYXJlbnRoZXNpZXMuIAorICAgICAgICBUaGUgYnJhbmNoIG5vZGVzIHdpbGwgaW5kaWNhdGUgd2hldGhlciB0aGV5IGFyZSBsYW5ndWFnZSwgY291bnRyeSwgb3IgCisgICAgICAgIHZhcmlhbnQgYnJhbmNoZXMsIGFuZCB3aWxsIGRpc3BsYXkgdGhlIGVuY29kaW5nIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGJyYW5jaC48L1A+CisgICAgICA8UD5SQiBNYW5hZ2VyIGZ1bmN0aW9ucyBpbiB0d28gYmFzaWMgd2F5cyBmb3IgZXZlcnl0aGluZyBpdCBkb2VzLCBlaXRoZXIgCisgICAgICAgIGZvciB0aGUgcmVzb3VyY2UgYnVuZGxlIGFzIGEgd2hvbGUgb3IgZm9yIGFuIGluZGl2aWR1YWwgcmVzb3VyY2UgZmlsZS4gCisgICAgICAgIFRvIG1ha2UgY2hhbmdlcyBhbmQgdXBkYXRlcyB0byB0aGUgZW50aXJlIHJlc291cmNlIGJ1bmRsZSwgc2VsZWN0IHRoZSAKKyAgICAgICAgcm9vdCBub2RlIG5vdGF0ZWQgYnkgdGhlICdSQicgaWNvbiBhdCB0aGUgdG9wIG9mIHRoZSB0cmVlLiBUaGlzIHdpbGwgYWxzbyAKKyAgICAgICAgY2F1c2UgdGhlIHN0YXRpc3RpY3MgYW5kIHNlYXJjaCB2aWV3cyB0byBwcmVzZW50IHJlc3VsdHMgcmVmbGVjdGluZyB0aGUgCisgICAgICAgIHN0YXR1cyBvZiB0aGUgZW50aXJlIGJ1bmRsZS4gVG8gd29yayB3aXRoIGFuIGluZGl2aWR1YWwgcmVzb3VyY2UgZmlsZSwgCisgICAgICAgIHNlbGVjdCBhIGZpbGUgZnJvbSB0aGUgdHJlZSBieSBjbGlja2luZyBvbiBpdC4gTm93IGNoYW5nZXMgYW5kIHZpZXdzIHdpbGwgCisgICAgICAgIHJlZmxlY3Qgb25seSB0aGlzIHNlbGVjdGVkIHJlc291cmNlIGZpbGUuPC9QPgorICAgICAgPFA+Tm90ZSB0aGF0IHNlbGVjdGluZyB0aGUgdmFyaW91cyBicmFuY2ggbm9kZXMgZG9lcyBub3QgaGF2ZSBhbnkgbWVhbmluZyAKKyAgICAgICAgaW4gdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBSQk1hbmFnZXIuIEluIGZ1dHVyZSB2ZXJzaW9ucyB0aGUgYWJpbGl0eSB0byAKKyAgICAgICAgd29yayBvbiBzdWJ0cmVlcyBtYXkgYmUgYWRkZWQsIGJ1dCBmb3Igbm93IGVpdGhlciBzZWxlY3QgdGhlIHJlc291cmNlIAorICAgICAgICBidW5kbGUgb3IgYW4gaW5kaXZpZHVhbCBmaWxlLjwvUD4KKyAgICAgIDxQPlVuZGVyc3RhbmRpbmcgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB3b3JraW5nIHdpdGggdGhlIHJlc291cmNlIGJ1bmRsZSAKKyAgICAgICAgYW5kIHdvcmtpbmcgd2l0aCBhIHJlc291cmNlIGZpbGUgaXMgY3J1Y2lhbCB0byB1c2luZyBSQiBNYW5hZ2VyLiBOb3JtYWxseSAKKyAgICAgICAgZGV2ZWxvcGVycyBhZGRpbmcgcmVzb3VyY2VzIG9yIG1hbmFnZXIgd2lzaGluZyB0byBrbm93IHRoZSBzdGF0dXRzIG9mIAorICAgICAgICB0cmFuc2xhdGlvbiBlZmZvcnRzIHdpbGwgd29yayBmcm9tIHRoZSByb290IGxldmVsLiBUcmFuc2xhdG9ycyBhbmQgbWFuYWdlcnMgCisgICAgICAgIG9mIGluZGl2aWR1YWwgcmVzb3VyY2UgZmlsZXMgd2lsbCBtb3JlIG9mdGVuIHdvcmsgZnJvbSB0aGUgcmVzb3VyY2UgZmlsZSAKKyAgICAgICAgbGV2ZWwuIE9uY2UgdGhlIGRpZmZlcmVuY2UgaXMgdW5kZXJzdG9vZCwgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIHZpZXdzIAorICAgICAgICBpbiB0aGUgdGFiIHdpbGwgYmUgZWFzaWVyIHRvIHVuZGVyc3RhbmQuPC9QPgorICAgICAgPFAgQUxJR049IkNFTlRFUiI+PEEgSFJFRj0idmlldzIuaHRtbCI+VmlldyAyLiBUaGUgU3RhdGlzdGljcyBUYWI8L0E+PC9QPgorICAgICAgPCEtLSAjRW5kRWRpdGFibGUgLS0+PC9URD4KKwk8L1RSPgorCTxUUj4KKwkJPFREIEJBQ0tHUk9VTkQ9Ii4uL2ltYWdlcy90ZW1wbGF0ZV9sbC5naWYiIEhFSUdIVD0iNDAiIFdJRFRIPSIyMDAiPgorCQkJPCEtLSBDb21tZW50IC0tPgorCQk8L1REPgorCQk8VEQgV0lEVEg9IjgwIj4KKwkJCTwhLS0gQ29tbWVudCAtLT4KKwkJPC9URD4KKwkJPFREPgorCQkJPENFTlRFUj48U1BBTiBDTEFTUz0iQ29weXJpZ2h0Ij5Db3B5cmlnaHQgMjAwMC0yMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMsIEFsbCBSaWdodHMgUmVzZXJ2ZWQ8L1NQQU4+PC9DRU5URVI+CisJCTwvVEQ+CisJPC9UUj4KKzwvVEFCTEU+CisKKzwvQk9EWT4KKzwhLS0gI0VuZFRlbXBsYXRlIC0tPjwvSFRNTD4KZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL3ZpZXdzL3ZpZXcyLmh0bWwgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy92aWV3cy92aWV3Mi5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNDljNDkKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy92aWV3cy92aWV3Mi5odG1sCkBAIC0wLDAgKzEsMTYxIEBACis8SFRNTD48IS0tICNCZWdpblRlbXBsYXRlICIvVGVtcGxhdGVzL01haW5UZW1wbGF0ZS5kd3QiIC0tPgorPEhFQUQ+Cis8IS0tICNCZWdpbkVkaXRhYmxlICJkb2N0aXRsZSIgLS0+IAorPFRJVExFPlJCIE1hbmFnZXIgLSBUaGUgU3RhdGlzdGljcyBUYWI8L1RJVExFPgorPCEtLSAjRW5kRWRpdGFibGUgLS0+IAorPE1FVEEgSFRUUC1FUVVJVj0iQ29udGVudC1UeXBlIiBDT05URU5UPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8U1RZTEUgVFlQRT0iVEVYVC9DU1MiPgorPCEtLQorLnRvcGljSGVhZCB7ICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsgZm9udC1zaXplOiAxNHB0OyBmb250LXdlaWdodDogYm9sZDsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogIzMzMzMzM30KKy50b3BpY0xpc3QgeyAgZm9udC1mYW1pbHk6IEdlb3JnaWEsICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7IGZvbnQtc2l6ZTogOXB0OyBjb2xvcjogI0ZGMDA5OTsgbGlzdC1zdHlsZS1pbWFnZTogdXJsKC4uL2ltYWdlcy9kaWFtb25kX2J1bGxldC5naWYpOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IGZvbnQtd2VpZ2h0OiBib2xkfQorLm1haW5CbG9jayB7ICBmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMnB0OyBtYXJnaW4tdG9wOiA1cHg7IG1hcmdpbi1yaWdodDogNXB4OyBtYXJnaW4tYm90dG9tOiA1cHg7IG1hcmdpbi1sZWZ0OiA1cHg7IHBhZGRpbmctdG9wOiA1cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7IHBhZGRpbmctYm90dG9tOiA1cHg7IHBhZGRpbmctbGVmdDogMTBweDsgdGV4dC1hbGlnbjoganVzdGlmeX0KKy0tPgorPC9TVFlMRT4KKzwvSEVBRD4KKworPEJPRFkgQkdDT0xPUj0iI0ZGRkZGRiIgTEVGVE1BUkdJTj0iMCIgVE9QTUFSR0lOPSIwIiBNQVJHSU5XSURUSD0iMCIgTUFSR0lOSEVJR0hUPSIwIj4KKzxUQUJMRSBXSURUSD0iMTAwJSIgQk9SREVSPSIwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjAiPgorICA8VFI+CisgICAgPFREIFJPV1NQQU49IjIiIENPTFNQQU49IjIiIEJBQ0tHUk9VTkQ9Ii4uL2ltYWdlcy90ZW1wbGF0ZV91bC5naWYiIEhFSUdIVD0iNzUiPjxJTUcgU1JDPSIuLi9pbWFnZXMvc3BhY2VyLmdpZiIgV0lEVEg9IjI4MCIgSEVJR0hUPSIxIiBIU1BBQ0U9IjAiPjwvVEQ+CisJCTxURCBIRUlHSFQ9IjE1IiAgV0lEVEg9IjEwMCUiIEJBQ0tHUk9VTkQ9Ii4uL2ltYWdlcy90ZW1wbGF0ZV91LmdpZiI+PC9URD4KKwk8L1RSPgorCTxUUj4KKwkJPFREIEhFSUdIVD0iNjAiID4KKwkJCTxDRU5URVI+PElNRyBTUkM9Ii4uL2ltYWdlcy9UaXRsZUxvZ29fdHJhbnNwYXJlbnQuZ2lmIiBWU1BBQ0U9IjAiPjwvQ0VOVEVSPgorCQk8L1REPgorCTwvVFI+CisJPFRSPgorCQkKKyAgICA8VEQgV0lEVEg9IjIwMCIgQkFDS0dST1VORD0iLi4vaW1hZ2VzL3RlbXBsYXRlX2wuZ2lmIiBWQUxJR049InRvcCI+CisJCTxUQUJMRSBXSURUSD0iMTgwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjEiPiAKKyAgICAgIAk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljSGVhZCI+R2VuZXJhbDwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBWQUxJR049ImNlbnRlciI+PElNRyBTUkM9Ii4uL2ltYWdlcy90ZW1wbGF0ZV9saW5lLmdpZiI+PC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0xpc3QiPgorCSAgICAgICAgPFVMPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vc3lzdGVtX3JlcXVpcmVtZW50cy5odG1sIj5TeXN0ZW0gUmVxdWlyZW1lbnRzPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9mYXEuaHRtbCI+RkFRPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9mdXR1cmVfZmVhdHVyZXMuaHRtbCI+RnV0dXJlIFJlbGVhc2VzPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMSSBDTEFTUz0idG9waWNMaXN0Ij48QSBIUkVGPSIuLi9mdXR1cmVfZmVhdHVyZXMuaHRtbCI+VmVyc2lvbiAKKyAgICAgICAgICAgICAgICBIaXN0b3J5PC9BPjwvTEk+CisgICAgICAgICAgICA8L1VMPgorCQkJPC9URD4KKwkJPC9UUj4KKyAgICAgIAk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljSGVhZCI+UkIgTWFuYWdlcjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBWQUxJR049ImNlbnRlciI+PElNRyBTUkM9Ii4uL2ltYWdlcy90ZW1wbGF0ZV9saW5lLmdpZiI+PC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0xpc3QiPgorCSAgICAgICAgPFVMPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vaW5kZXguaHRtbCI+SG9tZTwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vdHV0b3JpYWwvaW5kZXguaHRtbCI+VHV0b3JpYWw8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9ImluZGV4Lmh0bWwiPkZ1bmN0aW9uYWxpdHkgYW5kIFZpZXdzPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9sb29rYW5kZmVlbC5odG1sIj5Mb29rIGFuZCBGZWVsPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9tZW51Lmh0bWwiPk1lbnUgSXRlbXM8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJIENMQVNTPSJ0b3BpY0xpc3QiPjxBIEhSRUY9Ii4uL3R1dG9yaWFsL3N0ZXAxLmh0bWwiPlByZWZlcmVuY2VzPC9BPjwvTEk+CisgICAgICAgICAgICA8L1VMPgorCQkJPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0hlYWQiPlJCIFJlcG9ydGVyPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIFZBTElHTj0iY2VudGVyIj48SU1HIFNSQz0iLi4vaW1hZ2VzL3RlbXBsYXRlX2xpbmUuZ2lmIj48L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljTGlzdCI+CisJICA8VUw+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9SQlJlcG9ydGVyLmh0bWwiPkhvbWU8L0E+PC9MST4KKyAgICAgICAgPExJPlJlcG9ydCBUeXBlczwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9zY2FuZmlsZS5odG1sIj5Db2RlIFNjYW5uaW5nPC9BPjwvTEk+CisgICAgICAgICAgICA8L1VMPgorCQkJPC9URD4KKwkJPC9UUj4KKwk8L1RBQkxFPgorCisgICAgICA8UD4mbmJzcDsgPC9QPgorICAgICAgPC9URD4KKwkJCisgICAgPFREIENPTFNQQU49IjIiIFZBTElHTj0idG9wIiBDTEFTUz0ibWFpbkJsb2NrIj48IS0tICNCZWdpbkVkaXRhYmxlICJNYWluIiAtLT4gCisgICAgICA8SDMgQUxJR049IkNFTlRFUiI+VmlldyAyLiBUaGUgU3RhdGlzdGljcyBUYWI8L0gzPgorICAgICAgPFA+VGhlIGZpcnN0IHRhYiBvbiB0aGUgcmlnaHQgcGFuZWwgb2YgdGhlIFJCIE1hbmFnZXIgYXBwbGljYXRpb24gaXMgdGhlIAorICAgICAgICBTdGF0aXN0aWNzIHRhYi4gQXMgd2l0aCBhbGwgb2YgdGhlIHRhYiB2aWV3cywgdGhlIHN0YXRpc3RpY3MgdGFiIGxvb2tzIAorICAgICAgICBhbmQgZnVuY3Rpb25zIGRpZmZlcmVudGx5IHdoZW4gd29ya2luZyB3aXRoIHRoZSByZXNvdXJjZSBidW5kbGUgYXMgYSB3aG9sZSAKKyAgICAgICAgdGhhbiB3aGVuIHdvcmtpbmcgd2l0aCBhbiBpbmRpdmlkdWFsIHJlc291cmNlIGZpbGUuIEZvciBhbiBvdmVydmlldyBvZiAKKyAgICAgICAgdGhpcyBkaWZmZXJlbmNlIHNlZSA8QSBIUkVGPSJ2aWV3MS5odG1sIj5WaWV3IDE8L0E+LjwvUD4KKyAgICAgIDxQPjxCPldvcmtpbmcgd2l0aCBhIFJlc291cmNlIEJ1bmRsZTwvQj48L1A+CisgICAgICA8UD5UaGUgc2NyZWVuIHNob3QgYmVsb3cgc2hvd3MgUkIgTWFuYWdlciBhbmQgc29tZSBzdGF0aXN0aWNzIGNvbmNlcm5pbmcgCisgICAgICAgIHRoZSByZXNvdXJjZSBidW5kbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhcHBsaWNhdGlvbi48L1A+CisgICAgICA8UD48SU1HIFNSQz0iLi4vaW1hZ2VzL3NjcmVlbnNob3RzL3ZpZXdfc3RhdHNfYnVuZGxlLmdpZiIgV0lEVEg9IjY0MiIgSEVJR0hUPSI1NDMiPjwvUD4KKyAgICAgIDxQPlRocmVlIGJhc2ljIGFyZWFzIGFyZSBjb3ZlcmVkIGJ5IHRoaXMgdmlldywgUmVzb3VyY2UgRmlsZXMsIFJlc291cmNlIAorICAgICAgICBHcm91cHMsIGFuZCBSZXNvdXJjZSBJdGVtcy48L1A+CisgICAgICA8UD5JbiB0aGUgUmVzb3VyY2UgRmlsZXMgc2VjdGlvbiwgdGhlIHRvdGFsIG51bWJlciBvZiBpbmRpdmlkdWFsIGZpbGVzIGlzIAorICAgICAgICBzaG93biBhcyB3ZWxsIGFzIHRoZSBuYW1lcyBvZiB0aGVzZSBmaWxlcyAobWFkZSB1cCBvZiB0aGUgbGFuZ3VhZ2UsIGNvdW50cnksIAorICAgICAgICBhbmQgdmFyaWFudCBpbmZvcm1hdGlvbiBrbm93biBhYm91dCB0aGUgZmlsZXMpLiBOZXcgcmVzb3VyY2UgZmlsZXMgY2FuIAorICAgICAgICBiZSBhZGRlZCB0byB0aGUgYnVuZGxlIGJ5IHByZXNzaW5nIHRoZSAnQWRkIGEgTmV3IFJlc291cmNlIEZpbGUnIGJ1dHRvbiAKKyAgICAgICAgb3IgdXNpbmcgdGhlIGFjY2VsZXJhdG9yIGtleSAoaW4gdGhpcyBjYXNlICdOJykgaW4gdGhlIG1hbm5lciBzcGVjaWZpZWQgCisgICAgICAgIGJ5IHlvdXIgb3BlcmF0aW5nIHN5c3RlbS4gTmV3IGZpbGVzIGNhbiBhbHNvIGJlIGFkZGVkIHRocm91Z2ggdGhlIE9wdGlvbnMgCisgICAgICAgIG1lbnUuPC9QPgorICAgICAgPFA+SW4gdGhlIFJlc291cmNlIEdyb3VwcyBzZWN0aW9uLCB0aGUgdG90YWwgbnVtYmVyIG9mIGdyb3VwcyBhc3NvY2lhdGVkIAorICAgICAgICB3aXRoIHRoZSBidW5kbGUgYXMgd2VsbCBhcyBhbiBhbHBoYWJldGljYWwgbGlzdCBvZiB0aGUgZ3JvdXBzIGlzIGRpc3BsYXllZC4gCisgICAgICAgIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIFJlc291cmNlIEdyb3Vwcywgc2VlIHRoZSA8QSBIUkVGPSIuLi90dXRvcmlhbC9pbmRleC5odG1sIj5UdXRvcmlhbDwvQT4uIAorICAgICAgICBOZXcgZ3JvdXBzIGNhbiBiZSBjcmVhdGVkIGJ5IHByZXNzaW5nIHRoZSAnQWRkIGEgTmV3IFJlc291cmVjZSBHcm91cCcgCisgICAgICAgIGJ1dHRvbi4gVGhpcyBjYW4gYWxzbyBiZSBkb25lIGZyb20gdGhlIE9wdGlvbnMgbWVudSBvciB0aGUgR3JvdXBzIHRhYiAKKyAgICAgICAgdmlldy48L1A+CisgICAgICA8UD5JbiB0aGUgUmVzb3VyY2UgSXRlbXMgdmlldywgdGhlIHRvdGFsIG51bWJlciBvZiByZXNvdXJjZXMgaW4gdGhlIGJ1bmRsZSAKKyAgICAgICAgaXMgZGlzcGxheWVkLiBUaGlzIG51bWJlciByZXByZXNlbnRzIHRoZSBudW1iZXIgb2YgcmVzb3VyY2VzIGluIHRoZSBiYXNlIAorICAgICAgICBjbGFzcyBmaWxlLCBhcyB0aGUgb3RoZXIgcmVzb3VyY2UgZmlsZXMgYXJlIG5vdCByZXF1aXJlZCB0byBwb3NzZXMgYWxsIAorICAgICAgICBvZiB0aGUgcmVzb3VyY2UgaXRlbXMuIEluIGFkZGl0aW9uLCB0aGUgbnVtYmVyIG9mIGR1cGxpY2F0ZWQgcmVzb3VyY2UgCisgICAgICAgIGtleXMgaXMgZGlzcGxheWVkLiBUaGlzIG51bWJlciBzaG91bGQgYmUgemVybyBvciB0aGUgcmVzb3VyY2UgYnVuZGxlIG1heSAKKyAgICAgICAgbm90IGZ1bmN0aW9uIHRoZSB3YXkgaXQgd2FzIGludGVuZGVkIHRvLiBUaGUgbGlzdCBib3ggd2lsbCBkaXNwbGF5IHRoZSAKKyAgICAgICAgbmFtZXMgb2YgdGhlIGR1cGxpY2F0ZWQga2V5cywgc28gdGhhdCB0aGUgZXJyb3JzIGNhbiBiZSByZW1vdmVkLiBOb3RlIAorICAgICAgICB0aGF0IGlmIHlvdSBjcmVhdGUgeW91ciBSZXNvdXJjZSBCdW5kbGVzIHRocm91Z2ggUkIgTWFuYWdlciwgeW91IHNob3VsZCAKKyAgICAgICAgbmV2ZXIgaGF2ZSBkdXBsaWNhdGUga2V5cy4gSG93ZXZlciwgaWYgeW91IGltcG9ydGVkIHRoZSBidW5kbGVzIGZyb20gYW5vdGhlciAKKyAgICAgICAgc291cmNlLCB0aGlzIGVycm9yIGNhbiBiZSBhIGNvbW1vbiBvbmUuPC9QPgorICAgICAgPFA+PEI+V29ya2luZyB3aXRoIGEgUmVzb3VyY2UgRmlsZTwvQj48L1A+CisgICAgICA8UD5UaGUgc2NyZWVuIHNob3QgYmVsb3cgc2hvd3MgdGhlIHN0YXRpc3RpY3MgdmlldyBmb3IgYW4gaW5kaXZpZHVhbCByZXNvdXJjZSAKKyAgICAgICAgZmlsZSwgaW4gdGhpcyBjYXNlIHRoZSBHZXJtYW4gKERldXRzY2gpIGZpbGUuIEZvciBvdXIgZXhhbXBsZSwgSSBoYXZlIAorICAgICAgICByZW1vdmVkIHNvbWUgb2YgdGhlIHRyYW5zbGF0aW9ucyBmcm9tIHRoaXMgZmlsZS48L1A+CisgICAgICA8UD48SU1HIFNSQz0iLi4vaW1hZ2VzL3NjcmVlbnNob3RzL3ZpZXdfc3RhdHNfZmlsZS5naWYiIFdJRFRIPSI2NzEiIEhFSUdIVD0iNTQzIj48L1A+CisgICAgICA8UD5UaGlzIHZpZXcgc2hvd3Mgc29tZSBtZXRhIGRhdGEgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIFJlc291cmNlIEZpbGUuIAorICAgICAgICBUaGlzIG1ldGEgZGF0YSBoYXMgYWJzb2x1dGVseSBubyBpbXBhY3Qgb24gdGhlIGZ1bmN0aW9uaW5nIG9mIHRoZSByZXNvdXJjZSAKKyAgICAgICAgYnVuZGxlIHdpdGhpbiBhbiBhcHBsaWNhdGlvbi4gSXQgaXMgdGhlcmUgc29sZWx5IHRvIGFpZCBkZXZlbG9wbWVudCBhbmQgCisgICAgICAgIHRyYW5zbGF0aW9uIHRlYW1zIGluIG1hbmFnaW5nIHRoZWlyIGVmZm9ydHMuPC9QPgorICAgICAgPFA+VGhlIFJlc291cmNlIFRpdGxlIGlzIGEgd2F5IHRvIGlkZW50aWZ5IHRoaXMgZmlsZSBhbmQgd2lsbCBzaG93IGF0IHRoZSAKKyAgICAgICAgdG9wIG9mIG1vc3Qgdmlld3Mgd2hlbiB3b3JraW5nIHdpdGggYSByZXNvdXJjZSBmaWxlLiBUaGUgQ29tbWVudCBjYW4gYmUgCisgICAgICAgIHVzZWQgdG8gc3BlY2lmeSBhbnl0aGluZyBzcGVjaWFsIGFib3V0IHRoaXMgZmlsZS4gVGhlIFJlc291cmNlIEZpbGUgTWFuYWdlciAKKyAgICAgICAgaXMgdGhlIHBlcnNvbiBpbiBjaGFyZ2Ugb2YgdHJhbnNsYXRpb25zIGluIHRoZSBsb2NhbGUgYXNzb2NpYXRlZCB3aXRoIAorICAgICAgICB0aGUgZmlsZS4gVGhlIExhbmd1YWdlLCBDb3VudHJ5LCBhbmQgVmFyaWFudCByZXByZXNlbnQgdGhlIGxvbmcgbmFtZXMgCisgICAgICAgIChpLmUuIG5vdCB0aGUgSVNPIGVuY29kaW5ncykgb2YgdGhlIGxhbmd1YWdlLCBjb3VudHJ5LCBhbmQgdmFyaWFudCBhc3NvY2lhdGUgCisgICAgICAgIHdpdGggdGhlIGZpbGUuIFRoZXNlIGFyZSB0aGUgbmFtZXMgdGhhdCBzaG93IHVwIGluIHRoZSBSZXNvdXJjZSBUcmVlLjwvUD4KKyAgICAgIDxQPkFsc28gZGlzcGxheWVkIGZvciB0aGUgc2VsZWN0ZWQgZmlsZSBpcyB0aGUgdG90YWwgbnVtYmVyIG9mIHRyYW5zbGF0aW9ucyAKKyAgICAgICAgaW4gdGhpcyBmaWxlLiBUaGlzIG51bWJlciBzaG91bGQgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgCisgICAgICAgIHRyYW5zbGF0aW9ucyBpbiB0aGUgYnVuZGxlLiBUaGUgbnVtYmVyIG9mIHVudHJhbnNsYXRlZCByZXNvdXJjZSBpdGVtcyAKKyAgICAgICAgaXMgYWxzbyBzaG93bi4gVGhlc2Ugc3RhdGlzdGljcyBhcmUgdXNlZnVsIGluIG1vbml0b3JpbmcgdGhlIHByb2dyZXNzIAorICAgICAgICBvZiB0cmFuc2xhdGlvbi4gVG8gd29yayB3aXRoIHRoZSB1bnRyYW5zbGF0ZWQgaXRlbXMsIGEgY29udmVuaWVudCB2aWV3IAorICAgICAgICBpcyBnaXZlbiBpbiB0aGUgVW50cmFuc2xhdGVkIHRhYiB2aWV3LjwvUD4KKyAgICAgIDxQIEFMSUdOPSJDRU5URVIiPjxBIEhSRUY9InZpZXczLmh0bWwiPlZpZXcgMy4gVGhlIFVudHJhbnNsYXRlZCBUYWI8L0E+PC9QPgorICAgICAgPCEtLSAjRW5kRWRpdGFibGUgLS0+PC9URD4KKwk8L1RSPgorCTxUUj4KKwkJPFREIEJBQ0tHUk9VTkQ9Ii4uL2ltYWdlcy90ZW1wbGF0ZV9sbC5naWYiIEhFSUdIVD0iNDAiIFdJRFRIPSIyMDAiPgorCQkJPCEtLSBDb21tZW50IC0tPgorCQk8L1REPgorCQk8VEQgV0lEVEg9IjgwIj4KKwkJCTwhLS0gQ29tbWVudCAtLT4KKwkJPC9URD4KKwkJPFREPgorCQkJPENFTlRFUj48U1BBTiBDTEFTUz0iQ29weXJpZ2h0Ij5Db3B5cmlnaHQgMjAwMC0yMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMsIEFsbCBSaWdodHMgUmVzZXJ2ZWQ8L1NQQU4+PC9DRU5URVI+CisJCTwvVEQ+CisJPC9UUj4KKzwvVEFCTEU+CisKKzwvQk9EWT4KKzwhLS0gI0VuZFRlbXBsYXRlIC0tPjwvSFRNTD4KZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL3ZpZXdzL3ZpZXczLmh0bWwgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy92aWV3cy92aWV3My5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjYTJjNDcKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy92aWV3cy92aWV3My5odG1sCkBAIC0wLDAgKzEsMTU1IEBACis8SFRNTD48IS0tICNCZWdpblRlbXBsYXRlICIvVGVtcGxhdGVzL01haW5UZW1wbGF0ZS5kd3QiIC0tPgorPEhFQUQ+Cis8IS0tICNCZWdpbkVkaXRhYmxlICJkb2N0aXRsZSIgLS0+IAorPFRJVExFPlJCIE1hbmFnZXIgLSBUaGUgVW50cmFuc2xhdGVkIFRhYjwvVElUTEU+Cis8IS0tICNFbmRFZGl0YWJsZSAtLT4gCis8TUVUQSBIVFRQLUVRVUlWPSJDb250ZW50LVR5cGUiIENPTlRFTlQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzxTVFlMRSBUWVBFPSJURVhUL0NTUyI+Cis8IS0tCisudG9waWNIZWFkIHsgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOyBmb250LXNpemU6IDE0cHQ7IGZvbnQtd2VpZ2h0OiBib2xkOyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiAjMzMzMzMzfQorLnRvcGljTGlzdCB7ICBmb250LWZhbWlseTogR2VvcmdpYSwgIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsgZm9udC1zaXplOiA5cHQ7IGNvbG9yOiAjRkYwMDk5OyBsaXN0LXN0eWxlLWltYWdlOiB1cmwoLi4vaW1hZ2VzL2RpYW1vbmRfYnVsbGV0LmdpZik7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgZm9udC13ZWlnaHQ6IGJvbGR9CisubWFpbkJsb2NrIHsgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBmb250LXNpemU6IDEycHQ7IG1hcmdpbi10b3A6IDVweDsgbWFyZ2luLXJpZ2h0OiA1cHg7IG1hcmdpbi1ib3R0b206IDVweDsgbWFyZ2luLWxlZnQ6IDVweDsgcGFkZGluZy10b3A6IDVweDsgcGFkZGluZy1yaWdodDogMTBweDsgcGFkZGluZy1ib3R0b206IDVweDsgcGFkZGluZy1sZWZ0OiAxMHB4OyB0ZXh0LWFsaWduOiBqdXN0aWZ5fQorLS0+Cis8L1NUWUxFPgorPC9IRUFEPgorCis8Qk9EWSBCR0NPTE9SPSIjRkZGRkZGIiBMRUZUTUFSR0lOPSIwIiBUT1BNQVJHSU49IjAiIE1BUkdJTldJRFRIPSIwIiBNQVJHSU5IRUlHSFQ9IjAiPgorPFRBQkxFIFdJRFRIPSIxMDAlIiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iMCI+CisgIDxUUj4KKyAgICA8VEQgUk9XU1BBTj0iMiIgQ09MU1BBTj0iMiIgQkFDS0dST1VORD0iLi4vaW1hZ2VzL3RlbXBsYXRlX3VsLmdpZiIgSEVJR0hUPSI3NSI+PElNRyBTUkM9Ii4uL2ltYWdlcy9zcGFjZXIuZ2lmIiBXSURUSD0iMjgwIiBIRUlHSFQ9IjEiIEhTUEFDRT0iMCI+PC9URD4KKwkJPFREIEhFSUdIVD0iMTUiICBXSURUSD0iMTAwJSIgQkFDS0dST1VORD0iLi4vaW1hZ2VzL3RlbXBsYXRlX3UuZ2lmIj48L1REPgorCTwvVFI+CisJPFRSPgorCQk8VEQgSEVJR0hUPSI2MCIgPgorCQkJPENFTlRFUj48SU1HIFNSQz0iLi4vaW1hZ2VzL1RpdGxlTG9nb190cmFuc3BhcmVudC5naWYiIFZTUEFDRT0iMCI+PC9DRU5URVI+CisJCTwvVEQ+CisJPC9UUj4KKwk8VFI+CisJCQorICAgIDxURCBXSURUSD0iMjAwIiBCQUNLR1JPVU5EPSIuLi9pbWFnZXMvdGVtcGxhdGVfbC5naWYiIFZBTElHTj0idG9wIj4KKwkJPFRBQkxFIFdJRFRIPSIxODAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iMSI+IAorICAgICAgCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNIZWFkIj5HZW5lcmFsPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIFZBTElHTj0iY2VudGVyIj48SU1HIFNSQz0iLi4vaW1hZ2VzL3RlbXBsYXRlX2xpbmUuZ2lmIj48L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljTGlzdCI+CisJICAgICAgICA8VUw+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9zeXN0ZW1fcmVxdWlyZW1lbnRzLmh0bWwiPlN5c3RlbSBSZXF1aXJlbWVudHM8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL2ZhcS5odG1sIj5GQVE8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL2Z1dHVyZV9mZWF0dXJlcy5odG1sIj5GdXR1cmUgUmVsZWFzZXM8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJIENMQVNTPSJ0b3BpY0xpc3QiPjxBIEhSRUY9Ii4uL2Z1dHVyZV9mZWF0dXJlcy5odG1sIj5WZXJzaW9uIAorICAgICAgICAgICAgICAgIEhpc3Rvcnk8L0E+PC9MST4KKyAgICAgICAgICAgIDwvVUw+CisJCQk8L1REPgorCQk8L1RSPgorICAgICAgCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNIZWFkIj5SQiBNYW5hZ2VyPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIFZBTElHTj0iY2VudGVyIj48SU1HIFNSQz0iLi4vaW1hZ2VzL3RlbXBsYXRlX2xpbmUuZ2lmIj48L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljTGlzdCI+CisJICAgICAgICA8VUw+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9pbmRleC5odG1sIj5Ib21lPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi90dXRvcmlhbC9pbmRleC5odG1sIj5UdXRvcmlhbDwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iaW5kZXguaHRtbCI+RnVuY3Rpb25hbGl0eSBhbmQgVmlld3M8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL2xvb2thbmRmZWVsLmh0bWwiPkxvb2sgYW5kIEZlZWw8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL21lbnUuaHRtbCI+TWVudSBJdGVtczwvQT48L0xJPgorICAgICAgICAgICAgICA8TEkgQ0xBU1M9InRvcGljTGlzdCI+PEEgSFJFRj0iLi4vdHV0b3JpYWwvc3RlcDEuaHRtbCI+UHJlZmVyZW5jZXM8L0E+PC9MST4KKyAgICAgICAgICAgIDwvVUw+CisJCQk8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljSGVhZCI+UkIgUmVwb3J0ZXI8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgVkFMSUdOPSJjZW50ZXIiPjxJTUcgU1JDPSIuLi9pbWFnZXMvdGVtcGxhdGVfbGluZS5naWYiPjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNMaXN0Ij4KKwkgIDxVTD4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL1JCUmVwb3J0ZXIuaHRtbCI+SG9tZTwvQT48L0xJPgorICAgICAgICA8TEk+UmVwb3J0IFR5cGVzPC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL3NjYW5maWxlLmh0bWwiPkNvZGUgU2Nhbm5pbmc8L0E+PC9MST4KKyAgICAgICAgICAgIDwvVUw+CisJCQk8L1REPgorCQk8L1RSPgorCTwvVEFCTEU+CisKKyAgICAgIDxQPiZuYnNwOyA8L1A+CisgICAgICA8L1REPgorCQkKKyAgICA8VEQgQ09MU1BBTj0iMiIgVkFMSUdOPSJ0b3AiIENMQVNTPSJtYWluQmxvY2siPjwhLS0gI0JlZ2luRWRpdGFibGUgIk1haW4iIC0tPiAKKyAgICAgIDxIMyBBTElHTj0iQ0VOVEVSIj5WaWV3IDMuIFRoZSBVbnRyYW5zbGF0ZWQgVGFiPC9IMz4KKyAgICAgIDxQPlRoZSBVbnRyYW5zbGF0ZWQgdGFiIHZpZXcsIGxpa2UgYWxsIHRhYiB2aWV3cywgbG9va3MgYW5kIGZ1bmN0aW9ucyBkaWZmZXJlbnRseSAKKyAgICAgICAgd2hlbiB3b3JraW5nIHdpdGggdGhlIHJlc291cmNlIGJ1bmRsZSBhcyBhIHdob2xlIHRoYW4gd2hlbiB3b3JraW5nIHdpdGggCisgICAgICAgIGFuIGluZGl2aWR1YWwgcmVzb3VyY2UgZmlsZS4gRm9yIGFuIG92ZXJ2aWV3IG9mIHRoaXMgZGlmZmVyZW5jZSBzZWUgPEEgSFJFRj0idmlldzEuaHRtbCI+VmlldyAKKyAgICAgICAgMTwvQT4uIFRoZSBVbnRyYW5zbGF0ZWQgdGFiIHZpZXcgaXMgbW9zdCBvZnRlbiB1c2VkIHdoZW4gd29ya2luZyB3aXRoIAorICAgICAgICBpbmRpdmlkdWFsIHJlc291cmNlIGZpbGVzLCBhbmQgaXMgcHJvYmFibHkgdGhlIGxhcmdlc3QgY29udmVuaWVuY2UgdGhhdCAKKyAgICAgICAgUkIgTWFuYWdlciBvZmZlcnMgb3ZlciBvdGhlciBtZXRob2RzIG9mIHdvcmtpbmcgd2l0aCByZXNvdXJjZSBidW5kbGVzLjwvUD4KKyAgICAgIDxQPjxCPldvcmtpbmcgd2l0aCBhIFJlc291cmNlIEJ1bmRsZTwvQj48L1A+CisgICAgICA8UD5UaGUgc2NyZWVuIHNob3QgYmVsb3cgc2hvd3MgUkIgTWFuYWdlciBhbmQgYSB2aWV3IG9mIHVudHJhbnNsYXRlZCBpdGVtcyAKKyAgICAgICAgZm9yIHRoZSBlbnRpcmUgcmVzb3VyY2UgYnVuZGxlLjwvUD4KKyAgICAgIDxQPjxJTUcgU1JDPSIuLi9pbWFnZXMvc2NyZWVuc2hvdHMvdmlld191bnRyYW5zX2J1bmRsZS5naWYiIFdJRFRIPSI2NzEiIEhFSUdIVD0iNTQzIj48L1A+CisgICAgICA8UD5Gcm9tIHRoaXMgdmlldywgcmVzb3VyY2UgYnVuZGxlcyBjYW4gbm90IGJlIGVkaXRlZC4gVG8gZG8gdGhpcyB5b3UgZWl0aGVyIAorICAgICAgICBoYXZlIHRvIGdvIHRvIHRoZSBHcm91cHMgdGFiIHZpZXcgb3Igc2VsZWN0IGFuIGluZGl2aWR1YWwgcmVzb3VyY2UgZmlsZS4gCisgICAgICAgIFRoZSB2aWV3IGlzIHVzZWZ1bCB0aG91Z2ggZm9yIGdldHRpbmcgYSBwaWN0dXJlIG9mIHRoZSB0cmFuc2xhdGlvbiBzdGF0dXMgCisgICAgICAgIG9mIHRoZSBlbnRpcmUgcmVzb3VyY2UgYnVuZGxlLjwvUD4KKyAgICAgIDxQPkluIHRoaXMgdmlldywgZWFjaCBvZiB0aGUgcmVzb3VyY2UgZmlsZXMgaXMgcmVwcmVzZW50ZWQgYW5kIHRoZSBudW1iZXIgCisgICAgICAgIG9mIHVudHJhbnNsYXRlZCBpdGVtcyBpcyBkaXNwbGF5ZWQgYXMgd2VsbCBhcyB0aGUgcmVzb3VyY2Uga2V5IGZvciBlYWNoIAorICAgICAgICBvZiB0aG9zZSBpdGVtcy4gU2Nyb2xsaW5nIHVwIGFuZCBkb3duIHRoZSB2aWV3IGdpdmVzIGEgY29tcGxldGUgbG9vayBhdCAKKyAgICAgICAgdGhlIHZhcmlvdXMgZmlsZXMuPC9QPgorICAgICAgPFA+PEI+V29ya2luZyB3aXRoIGEgUmVzb3VyY2UgRmlsZTwvQj48L1A+CisgICAgICA8UD5UaGUgbmV4dCBzY3JlZW4gc2hvdCBzaG93cyB0aGUgVW50cmFuc2xhdGVkIHRhYiB2aWV3IHdoZW4gd29ya2luZyB3aXRoIAorICAgICAgICBhbiBpbmRpdmlkdWFsIHJlc291cmNlIGZpbGUuIFRoaXMgaXMgdGhlIHZpZXcgdHJhbnNsYXRvcnMgd2lsbCBwcm9iYWJseSAKKyAgICAgICAgdXNlIHRoZSBtb3N0LjwvUD4KKyAgICAgIDxQPjxJTUcgU1JDPSIuLi9pbWFnZXMvc2NyZWVuc2hvdHMvdmlld191bnRyYW5zX2ZpbGUuZ2lmIiBXSURUSD0iNjcxIiBIRUlHSFQ9IjU0MyI+PC9QPgorICAgICAgPFA+TGlzdGVkIGluIHRoZSB0YWJsZSBpcyBlYWNoIG9mIHRoZSByZXNvdXJjZSBjdXJyZW50bHkgbWFya2VkIGFzIHVudHJhbnNsYXRlZCAKKyAgICAgICAgKGZvciBtb3JlIG9uIHRoZSBtZXRhIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGVhY2ggcmVzb3VyY2UsIHNlZSB0aGUgPEEgSFJFRj0iLi4vdHV0b3JpYWwvaW5kZXguaHRtbCI+VHV0b3JpYWw8L0E+KS4gCisgICAgICAgIFRoZSB0YWJsZSBzaG93cyB0aGUgcmVzb3VyY2Uga2V5IGFuZCBncm91cCBvZiB0aGUgcmVzb3VyY2UsIHdoaWNoIGNhbiAKKyAgICAgICAgbm90IGJlIGVkaXRlZCBmcm9tIGEgcmVzb3VyY2UgZmlsZSB2aWV3LCBhbmQgdGhlIHRyYW5zbGF0aW9uIG9mIHRoZSByZXNvdXJjZSwgCisgICAgICAgIHdoaWNoIGNhbiBiZSBlZGl0ZWQgaGVyZS48L1A+CisgICAgICA8UD5UbyB0cmFuc2xhdGUgYSByZXNvdXJjZSwgc2ltcGx5IGRvdWJsZSBjbGljayB0aGUgcm93IGNvbnRhaW5pbmcgdGhlIHJlc291cmNlLiAKKyAgICAgICAgQSBkaWFsb2cgYm94IHdpbGwgcG9wIHVwIGFsbG93aW5nIHRoZSByZXNvdXJjZSBmaWxlIHNwZWNpZmljIGVsZW1lbnRzIAorICAgICAgICBvZiB0aGUgcmVzb3VyY2UgdG8gYmUgZWRpdGVkLiBUaGF0IGRpYWxvZyBib3ggaXMgc2hvd24gaGVyZS4gSXRzIHVzZSBjYW4gCisgICAgICAgIGJlIGZvdW5kIGluIHRoZSBUdXRvcmlhbC48L1A+CisgICAgICA8UD48SU1HIFNSQz0iLi4vaW1hZ2VzL3NjcmVlbnNob3RzL3ZpZXdfdW50cmFuc19kaWFsb2cwLmdpZiIgV0lEVEg9IjUxMyIgSEVJR0hUPSIyNjkiPjwvUD4KKyAgICAgIDxQPkluIHNvbWUgY2FzZXMsIHlvdSBtYXkgd2FudCB0byBsZWF2ZSB0aGUgdHJhbnNsYXRpb24gYXMgaXQgc3RhbmRzLiBUaGlzIAorICAgICAgICBpcyBjb21tb24gZm9yIGluc3RhbmNlIHdoZW4gd29ya2luZyB3aXRoIHZhcmlhbnRzIG9mIGEgbGFuZ3VhZ2Ugd2l0aCBsaXR0bGUgCisgICAgICAgIGNoYW5nZSBmcm9tIHRoZSBsYW5ndWFnZSBwYXJlbnQgKGUuZy4gQ2FuYWRpYW4gRW5nbGlzaCBhbmQgVS5TLiBFbmdsaXNoIAorICAgICAgICBoYXZlIHJlbGF0aXZlbHkgZmV3IGRpZmZlcmVuY2VzKS48L1A+CisgICAgICA8UD5UaGVyZSBhcmUgdHdvIHdheXMgdG8gaGFuZGxlIHRoaXMuIE9uZSB3YXkgaXMgdG8gc2VsZWN0IHRoZSByZXNvdXJjZSAKKyAgICAgICAgYW5kIG1hcmsgaXQgYXMgdHJhbnNsYXRlZC4gVGhpcyBjYW4gYmUgZG9uZSBieSBwcmVzc2luZyB0aGUgJ01hcmsgUmVzb3VyY2UgCisgICAgICAgIGFzIFRyYW5zbGF0ZWQnIGJ1dHRvbiBvciBkb3VibGUgY2xpY2tpbmcgdGhlIHJlc291cmNlLCBjaGVja2luZyB0aGUgJ1RyYW5zbGF0ZWQnIAorICAgICAgICBjaGVjayBib3ggYW5kIGNsaWNraW5nIHRoZSAnRWRpdCcgYnV0dG9uLiBUaGUgb3RoZXIgd2F5IGlzIHRvIHJlbW92ZSB0aGUgCisgICAgICAgIHJlc291cmNlIGZyb20gdGhlIHJlc291cmNlIGZpbGUgYnkgc2VsZWN0aW5nIHRoZSByZXNvdXJjZSBhbmQgY2xpY2tpbmcgCisgICAgICAgICdEZWxldGUgUmVzb3VyY2UnLjwvUD4KKyAgICAgIDxQPkVpdGhlciB3YXksIHRoZSByZXNvdXJjZSBidW5kbGUgc2hvdWxkIGFjdCB0aGUgc2FtZSB3aGVuIHByZXNlbnRpbmcgdHJhbnNsYXRpb25zIAorICAgICAgICB0byB0aGUgdXNlci4gSW4gdGhlIGZvcm1lciBjYXNlLCB0aGUgdHJhbnNsYXRpb24gZnJvbSB0aGUgcmVzb3VyY2UgZmlsZSAKKyAgICAgICAgaXMgdXNlZC4gSW4gdGhlIGxhdHRlciBjYXNlLCB0aGUgdHJhbnNsYXRpb24gZmFsbHMgYmFjayB0byB0aGUgb25lIGZvdW5kIAorICAgICAgICBpbiBhbiBhbmNlc3RvciByZXNvdXJjZSBmaWxlLjwvUD4KKyAgICAgIDxQPk5vdGUgdGhhdCBvbmx5IG9uZSByZXNvdXJjZSBjYW4gYmUgZWRpdGVkIGF0IGEgdGltZSBpbiB0aGUgY3VycmVudCB2ZXJzaW9uIAorICAgICAgICBvZiBSQiBNYW5hZ2VyLiBGdXR1cmUgdmVyc2lvbnMgd2lsbCBhbGxvdyBtdWx0aXBsZSBzZWxlY3Rpb25zIG9mIHJlc291cmNlcyAKKyAgICAgICAgaW4gdGhpcyB2aWV3LjwvUD4KKyAgICAgIDxQIEFMSUdOPSJDRU5URVIiPjxBIEhSRUY9InZpZXc0Lmh0bWwiPlZpZXcgNC4gVGhlIEdyb3VwcyBUYWI8L0E+PC9QPgorICAgICAgPCEtLSAjRW5kRWRpdGFibGUgLS0+PC9URD4KKwk8L1RSPgorCTxUUj4KKwkJPFREIEJBQ0tHUk9VTkQ9Ii4uL2ltYWdlcy90ZW1wbGF0ZV9sbC5naWYiIEhFSUdIVD0iNDAiIFdJRFRIPSIyMDAiPgorCQkJPCEtLSBDb21tZW50IC0tPgorCQk8L1REPgorCQk8VEQgV0lEVEg9IjgwIj4KKwkJCTwhLS0gQ29tbWVudCAtLT4KKwkJPC9URD4KKwkJPFREPgorCQkJPENFTlRFUj48U1BBTiBDTEFTUz0iQ29weXJpZ2h0Ij5Db3B5cmlnaHQgMjAwMC0yMDAxIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMsIEFsbCBSaWdodHMgUmVzZXJ2ZWQ8L1NQQU4+PC9DRU5URVI+CisJCTwvVEQ+CisJPC9UUj4KKzwvVEFCTEU+CisKKzwvQk9EWT4KKzwhLS0gI0VuZFRlbXBsYXRlIC0tPjwvSFRNTD4KZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9kb2NzL3ZpZXdzL3ZpZXc0Lmh0bWwgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy92aWV3cy92aWV3NC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZTQyOTIKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy92aWV3cy92aWV3NC5odG1sCkBAIC0wLDAgKzEsMTQ1IEBACis8SFRNTD48IS0tICNCZWdpblRlbXBsYXRlICIvVGVtcGxhdGVzL01haW5UZW1wbGF0ZS5kd3QiIC0tPgorPEhFQUQ+Cis8IS0tICNCZWdpbkVkaXRhYmxlICJkb2N0aXRsZSIgLS0+IAorPFRJVExFPlJCIE1hbmFnZXIgLSBUaGUgR3JvdXBzIFRhYjwvVElUTEU+Cis8IS0tICNFbmRFZGl0YWJsZSAtLT4gCis8TUVUQSBIVFRQLUVRVUlWPSJDb250ZW50LVR5cGUiIENPTlRFTlQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KKzxTVFlMRSBUWVBFPSJURVhUL0NTUyI+Cis8IS0tCisudG9waWNIZWFkIHsgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOyBmb250LXNpemU6IDE0cHQ7IGZvbnQtd2VpZ2h0OiBib2xkOyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiAjMzMzMzMzfQorLnRvcGljTGlzdCB7ICBmb250LWZhbWlseTogR2VvcmdpYSwgIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsgZm9udC1zaXplOiA5cHQ7IGNvbG9yOiAjRkYwMDk5OyBsaXN0LXN0eWxlLWltYWdlOiB1cmwoLi4vaW1hZ2VzL2RpYW1vbmRfYnVsbGV0LmdpZik7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgZm9udC13ZWlnaHQ6IGJvbGR9CisubWFpbkJsb2NrIHsgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBmb250LXNpemU6IDEycHQ7IG1hcmdpbi10b3A6IDVweDsgbWFyZ2luLXJpZ2h0OiA1cHg7IG1hcmdpbi1ib3R0b206IDVweDsgbWFyZ2luLWxlZnQ6IDVweDsgcGFkZGluZy10b3A6IDVweDsgcGFkZGluZy1yaWdodDogMTBweDsgcGFkZGluZy1ib3R0b206IDVweDsgcGFkZGluZy1sZWZ0OiAxMHB4OyB0ZXh0LWFsaWduOiBqdXN0aWZ5fQorLS0+Cis8L1NUWUxFPgorPC9IRUFEPgorCis8Qk9EWSBCR0NPTE9SPSIjRkZGRkZGIiBMRUZUTUFSR0lOPSIwIiBUT1BNQVJHSU49IjAiIE1BUkdJTldJRFRIPSIwIiBNQVJHSU5IRUlHSFQ9IjAiPgorPFRBQkxFIFdJRFRIPSIxMDAlIiBCT1JERVI9IjAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iMCI+CisgIDxUUj4KKyAgICA8VEQgUk9XU1BBTj0iMiIgQ09MU1BBTj0iMiIgQkFDS0dST1VORD0iLi4vaW1hZ2VzL3RlbXBsYXRlX3VsLmdpZiIgSEVJR0hUPSI3NSI+PElNRyBTUkM9Ii4uL2ltYWdlcy9zcGFjZXIuZ2lmIiBXSURUSD0iMjgwIiBIRUlHSFQ9IjEiIEhTUEFDRT0iMCI+PC9URD4KKwkJPFREIEhFSUdIVD0iMTUiICBXSURUSD0iMTAwJSIgQkFDS0dST1VORD0iLi4vaW1hZ2VzL3RlbXBsYXRlX3UuZ2lmIj48L1REPgorCTwvVFI+CisJPFRSPgorCQk8VEQgSEVJR0hUPSI2MCIgPgorCQkJPENFTlRFUj48SU1HIFNSQz0iLi4vaW1hZ2VzL1RpdGxlTG9nb190cmFuc3BhcmVudC5naWYiIFZTUEFDRT0iMCI+PC9DRU5URVI+CisJCTwvVEQ+CisJPC9UUj4KKwk8VFI+CisJCQorICAgIDxURCBXSURUSD0iMjAwIiBCQUNLR1JPVU5EPSIuLi9pbWFnZXMvdGVtcGxhdGVfbC5naWYiIFZBTElHTj0idG9wIj4KKwkJPFRBQkxFIFdJRFRIPSIxODAiIENFTExTUEFDSU5HPSIwIiBDRUxMUEFERElORz0iMSI+IAorICAgICAgCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNIZWFkIj5HZW5lcmFsPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIFZBTElHTj0iY2VudGVyIj48SU1HIFNSQz0iLi4vaW1hZ2VzL3RlbXBsYXRlX2xpbmUuZ2lmIj48L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljTGlzdCI+CisJICAgICAgICA8VUw+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9zeXN0ZW1fcmVxdWlyZW1lbnRzLmh0bWwiPlN5c3RlbSBSZXF1aXJlbWVudHM8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL2ZhcS5odG1sIj5GQVE8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL2Z1dHVyZV9mZWF0dXJlcy5odG1sIj5GdXR1cmUgUmVsZWFzZXM8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJIENMQVNTPSJ0b3BpY0xpc3QiPjxBIEhSRUY9Ii4uL2Z1dHVyZV9mZWF0dXJlcy5odG1sIj5WZXJzaW9uIAorICAgICAgICAgICAgICAgIEhpc3Rvcnk8L0E+PC9MST4KKyAgICAgICAgICAgIDwvVUw+CisJCQk8L1REPgorCQk8L1RSPgorICAgICAgCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNIZWFkIj5SQiBNYW5hZ2VyPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIFZBTElHTj0iY2VudGVyIj48SU1HIFNSQz0iLi4vaW1hZ2VzL3RlbXBsYXRlX2xpbmUuZ2lmIj48L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljTGlzdCI+CisJICAgICAgICA8VUw+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9pbmRleC5odG1sIj5Ib21lPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi90dXRvcmlhbC9pbmRleC5odG1sIj5UdXRvcmlhbDwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iaW5kZXguaHRtbCI+RnVuY3Rpb25hbGl0eSBhbmQgVmlld3M8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL2xvb2thbmRmZWVsLmh0bWwiPkxvb2sgYW5kIEZlZWw8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL21lbnUuaHRtbCI+TWVudSBJdGVtczwvQT48L0xJPgorICAgICAgICAgICAgICA8TEkgQ0xBU1M9InRvcGljTGlzdCI+PEEgSFJFRj0iLi4vdHV0b3JpYWwvc3RlcDEuaHRtbCI+UHJlZmVyZW5jZXM8L0E+PC9MST4KKyAgICAgICAgICAgIDwvVUw+CisJCQk8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljSGVhZCI+UkIgUmVwb3J0ZXI8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgVkFMSUdOPSJjZW50ZXIiPjxJTUcgU1JDPSIuLi9pbWFnZXMvdGVtcGxhdGVfbGluZS5naWYiPjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBDTEFTUz0idG9waWNMaXN0Ij4KKwkgIDxVTD4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL1JCUmVwb3J0ZXIuaHRtbCI+SG9tZTwvQT48L0xJPgorICAgICAgICA8TEk+UmVwb3J0IFR5cGVzPC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9Ii4uL3NjYW5maWxlLmh0bWwiPkNvZGUgU2Nhbm5pbmc8L0E+PC9MST4KKyAgICAgICAgICAgIDwvVUw+CisJCQk8L1REPgorCQk8L1RSPgorCTwvVEFCTEU+CisKKyAgICAgIDxQPiZuYnNwOyA8L1A+CisgICAgICA8L1REPgorCQkKKyAgICA8VEQgQ09MU1BBTj0iMiIgVkFMSUdOPSJ0b3AiIENMQVNTPSJtYWluQmxvY2siPjwhLS0gI0JlZ2luRWRpdGFibGUgIk1haW4iIC0tPiAKKyAgICAgIDxIMyBBTElHTj0iQ0VOVEVSIj5WaWV3IDQuIFRoZSBHcm91cHMgVGFiPC9IMz4KKyAgICAgIDxQPlRoZSBHcm91cHMgdGFiIHZpZXcsIGxpa2UgYWxsIHRhYiB2aWV3cywgbG9va3MgYW5kIGZ1bmN0aW9ucyBkaWZmZXJlbnRseSAKKyAgICAgICAgd2hlbiB3b3JraW5nIHdpdGggdGhlIHJlc291cmNlIGJ1bmRsZSBhcyBhIHdob2xlIHRoYW4gd2hlbiB3b3JraW5nIHdpdGggCisgICAgICAgIGFuIGluZGl2aWR1YWwgcmVzb3VyY2UgZmlsZS4gRm9yIGFuIG92ZXJ2aWV3IG9mIHRoaXMgZGlmZmVyZW5jZSBzZWUgPEEgSFJFRj0idmlldzEuaHRtbCI+VmlldyAKKyAgICAgICAgMTwvQT4uIFJCIE1hbmFnZXIgYWRkcyBhIGxldmVsIG9mIGhlaXJhcmNoeSBub3QgY29tbW9ubHkgZm91bmQgaW4gcmVzb3VyY2UgCisgICAgICAgIGJ1bmRsZXMuIFRoaXMgYWRkdGlvbmFsIGxldmVsIGlzIGNhbGxlZCBHcm91cHMuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIAorICAgICAgICBSZXNvdXJjZSBHcm91cHMgc2VlIHRoZSA8QSBIUkVGPSIuLi90dXRvcmlhbC9pbmRleC5odG1sIj5UdXRvcmlhbDwvQT4uPC9QPgorICAgICAgPFA+PEI+V29ya2luZyB3aXRoIGEgUmVzb3VyY2UgQnVuZGxlPC9CPjwvUD4KKyAgICAgIDxQPlRoZSBzY3JlZW4gc2hvdCBiZWxvdyBzaG93cyBSQiBNYW5hZ2VyIGFuZCBhIHZpZXcgb2YgZ3JvdXBzIGZvciB0aGUgZW50aXJlIAorICAgICAgICByZXNvdXJjZSBidW5kbGUuPC9QPgorICAgICAgPFA+PElNRyBTUkM9Ii4uL2ltYWdlcy9zY3JlZW5zaG90cy92aWV3X2dyb3Vwc19idW5kbGUuZ2lmIiBXSURUSD0iNjcxIiBIRUlHSFQ9IjU0MyI+PC9QPgorICAgICAgPFA+VW5saWtlIHRoZSBVbnRyYW5zbGF0ZWQgdGFiIHZpZXcsIHRoaXMgdmlldyBhbGxvd3MgdGhlIGVkaXRpbmcgb2YgcmVzb3VyY2VzLiAKKyAgICAgICAgRWRpdGluZyBvciBhZGRpbmcgcmVzb3VyY2VzIGF0IHRoaXMgbGV2ZWwgYWZmZWN0cyB0aGUgcmVzb3VyY2UgYnVuZGxlIAorICAgICAgICBhcyBhIHdob2xlLiBUaHVzIGlmIGEgcmVzb3VyY2UgaGFzIGFsbCByZWFkeSBiZWVuIHRyYW5zbGF0ZWQgaW4gYSByZXNvdXJjZSAKKyAgICAgICAgZmlsZSwgaXQgd2lsbCBiZSBtYXJrZWQgYXMgdW50cmFuc2xhdGVkIHRvIHJlZmxlY3QgdGhlIGNoYW5nZSBpbiB0aGUgZW50aXJlIAorICAgICAgICBidW5kbGUuPC9QPgorICAgICAgPFA+RWRpdGluZyBhIHJlc291cmNlIGlzIGFzIHNpbXBsZSBhcyBzZWxlY3RpbmcgdGhlIGdyb3VwIGZyb20gdGhlIGRyb3AgCisgICAgICAgIGRvd24gYm94IGF0IHRoZSB0b3Agb2YgdGhlIHNjcmVlbiwgZG91YmxlIGNsaWNraW5nIGEgcmVzb3VyY2UsIG1ha2luZyAKKyAgICAgICAgdGhlIGRlc2lyZWQgY2hhbmdlLCBhbmQgY2xpY2tpbmcgJ0VkaXQnIG9uIHRoZSBkaWFsb2cgYm94IHJlc3VsdGluZyBmcm9tIAorICAgICAgICB0aGUgZG91YmxlIGNsaWNrLiBPcHRpb25hbGx5LCB0aGUgcmVzb3VyY2UgY2FuIGJlIGVkaXRlZCBieSBzZWxlY3RpbmcgCisgICAgICAgIGl0IGFuZCBwcmVzc2luZyB0aGUgJ0VkaXQgUmVzb3VyY2UnIGJ1dHRvbiBpbnN0ZWFkIG9mIGRvdWJsZSBjbGlja2luZy48L1A+CisgICAgICA8UD5UaGUgUmVzb3VyY2UgR3JvdXAgY2FuIGFsc28gYmUgZWRpdGVkLiBUaGUgbmFtZSBhbmQgY29tbWVudCBhc3NvY2lhdGUgCisgICAgICAgIHdpdGggdGhlIGdyb3VwIGNhbiBiZSBjaGFuZ2VkIGJ5IHByZXNzaW5nIHRoZSAnRWRpdCBHcm91cCcgYnV0dG9uLiBQcmVzc2luZyAKKyAgICAgICAgdGhlICdEZWxldGUgR3JvdXAnIGJ1dHRvbiB3aWxsIGRlbGV0ZSBib3RoIHRoZSBncm91cCBhbmQgYWxsIHJlc291cmNlcyAKKyAgICAgICAgY29udGFpbmVkIHdpdGhpbiBpdC4gQSBkaWFsb2cgd2lsbCBwcm9tcHQgeW91IHdoZW4gdGhpcyBidXR0b24gaXMgcHJlc3NlZCAKKyAgICAgICAgdG8gbWFrZSBzdXJlIHRoaXMgaXMgd2hhdCB5b3UgaW50ZW5kIHRvIGRvLjwvUD4KKyAgICAgIDxQPlJlc291cmNlcyBjcmVhdGVkIGluIHRoZSBHcm91cCB2aWV3IHdpbGwgYnkgZGVmYXVsdCBiZSBwbGFjZWQgaW4gdGhlIAorICAgICAgICBncm91cCBjdXJyZW50bHkgYmVpbmcgc2hvd24uIFRoaXMgY2FuIGJlIGNoYW5nZWQgaG93ZXZlciBieSBzZWxlY3RpbmcgCisgICAgICAgIGFub3RoZXIgZ3JvdXAgbmFtZSBmcm9tIHRoZSByZXNvdXJjZSBjcmVhdGlvbiBkaWFsb2cgYm94LjwvUD4KKyAgICAgIDxQPlRoaXMgdmlldyBpcyBwcm9iYWJseSB0aGUgbW9zdCBjb21tb25seSB1c2VkIHZpZXcgYnkgZGV2ZWxvcGVycyBpbnNlcnRpbmcgCisgICAgICAgIG5ldyByZXNvdXJjZXMgaW50byBhIGJ1bmRsZS48L1A+CisgICAgICA8UD48Qj5Xb3JraW5nIHdpdGggYSBSZXNvdXJjZSBGaWxlPC9CPjwvUD4KKyAgICAgIDxQPlRoZSBuZXh0IHNjcmVlbiBzaG90IHNob3dzIHRoZSBHcm91cCB0YWIgdmlldyB3aGVuIHdvcmtpbmcgd2l0aCBhbiBpbmRpdmlkdWFsIAorICAgICAgICByZXNvdXJjZSBmaWxlLjwvUD4KKyAgICAgIDxQPjxJTUcgU1JDPSIuLi9pbWFnZXMvc2NyZWVuc2hvdHMvdmlld19ncm91cHNfZmlsZS5naWYiIFdJRFRIPSI2NzEiIEhFSUdIVD0iNTQzIj48L1A+CisgICAgICA8UD5UaGUgZnVuY3Rpb25hbGl0eSBvZiB0aGlzIHZpZXcgbW9zdGx5IG1pcnJvcnMgdGhhdCBvZiB0aGUgVW50cmFuc2xhdGVkIAorICAgICAgICB0YWIgdmlldy4gTW9yZSBvbiB0aGF0IHZpZXcgaXMgZm91bmQgaW4gPEEgSFJFRj0idmlldzMuaHRtbCI+VmlldyAzPC9BPi4gCisgICAgICAgIFRoZSBvbmx5IGFkZGl0aW9uIGlzIHRoYXQgcmVzb3VyY2VzIGFsbCByZWFkeSBtYXJrZWQgYXMgdHJhbnNsYXRlZCBjYW4gCisgICAgICAgIGJlIHNlZW4gYW5kIGVkaXRlZCBmcm9tIHRoaXMgdmlldy4gU2VsZWN0aW5nIGEgZ3JvdXAgZnJvbSB0aGUgZHJvcCBkb3duIAorICAgICAgICBib3ggd2lsbCB1cGRhdGUgdGhlIGRpc3BsYXkgd2l0aCBhbGwgcmVzb3VyY2VzLCB0cmFuc2xhdGVkIG9yIG5vdCwgZnJvbSAKKyAgICAgICAgdGhhdCBncm91cC48L1A+CisgICAgICA8UCBBTElHTj0iQ0VOVEVSIj48QSBIUkVGPSJ2aWV3NS5odG1sIj5WaWV3IDUuIFRoZSBTZWFyY2ggVGFiPC9BPjwvUD4KKyAgICAgIDwhLS0gI0VuZEVkaXRhYmxlIC0tPjwvVEQ+CisJPC9UUj4KKwk8VFI+CisJCTxURCBCQUNLR1JPVU5EPSIuLi9pbWFnZXMvdGVtcGxhdGVfbGwuZ2lmIiBIRUlHSFQ9IjQwIiBXSURUSD0iMjAwIj4KKwkJCTwhLS0gQ29tbWVudCAtLT4KKwkJPC9URD4KKwkJPFREIFdJRFRIPSI4MCI+CisJCQk8IS0tIENvbW1lbnQgLS0+CisJCTwvVEQ+CisJCTxURD4KKwkJCTxDRU5URVI+PFNQQU4gQ0xBU1M9IkNvcHlyaWdodCI+Q29weXJpZ2h0IDIwMDAtMjAwMSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzLCBBbGwgUmlnaHRzIFJlc2VydmVkPC9TUEFOPjwvQ0VOVEVSPgorCQk8L1REPgorCTwvVFI+Cis8L1RBQkxFPgorCis8L0JPRFk+Cis8IS0tICNFbmRUZW1wbGF0ZSAtLT48L0hUTUw+CmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vZG9jcy92aWV3cy92aWV3NS5odG1sIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3Mvdmlld3MvdmlldzUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2VjMDlkCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2RvY3Mvdmlld3MvdmlldzUuaHRtbApAQCAtMCwwICsxLDEzMSBAQAorPEhUTUw+PCEtLSAjQmVnaW5UZW1wbGF0ZSAiL1RlbXBsYXRlcy9NYWluVGVtcGxhdGUuZHd0IiAtLT4KKzxIRUFEPgorPCEtLSAjQmVnaW5FZGl0YWJsZSAiZG9jdGl0bGUiIC0tPiAKKzxUSVRMRT5SQiBNYW5hZ2VyIC0gVGhlIFNlYXJjaCBUYWI8L1RJVExFPgorPCEtLSAjRW5kRWRpdGFibGUgLS0+IAorPE1FVEEgSFRUUC1FUVVJVj0iQ29udGVudC1UeXBlIiBDT05URU5UPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Cis8U1RZTEUgVFlQRT0iVEVYVC9DU1MiPgorPCEtLQorLnRvcGljSGVhZCB7ICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsgZm9udC1zaXplOiAxNHB0OyBmb250LXdlaWdodDogYm9sZDsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogIzMzMzMzM30KKy50b3BpY0xpc3QgeyAgZm9udC1mYW1pbHk6IEdlb3JnaWEsICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7IGZvbnQtc2l6ZTogOXB0OyBjb2xvcjogI0ZGMDA5OTsgbGlzdC1zdHlsZS1pbWFnZTogdXJsKC4uL2ltYWdlcy9kaWFtb25kX2J1bGxldC5naWYpOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IGZvbnQtd2VpZ2h0OiBib2xkfQorLm1haW5CbG9jayB7ICBmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgZm9udC1zaXplOiAxMnB0OyBtYXJnaW4tdG9wOiA1cHg7IG1hcmdpbi1yaWdodDogNXB4OyBtYXJnaW4tYm90dG9tOiA1cHg7IG1hcmdpbi1sZWZ0OiA1cHg7IHBhZGRpbmctdG9wOiA1cHg7IHBhZGRpbmctcmlnaHQ6IDEwcHg7IHBhZGRpbmctYm90dG9tOiA1cHg7IHBhZGRpbmctbGVmdDogMTBweDsgdGV4dC1hbGlnbjoganVzdGlmeX0KKy0tPgorPC9TVFlMRT4KKzwvSEVBRD4KKworPEJPRFkgQkdDT0xPUj0iI0ZGRkZGRiIgTEVGVE1BUkdJTj0iMCIgVE9QTUFSR0lOPSIwIiBNQVJHSU5XSURUSD0iMCIgTUFSR0lOSEVJR0hUPSIwIj4KKzxUQUJMRSBXSURUSD0iMTAwJSIgQk9SREVSPSIwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjAiPgorICA8VFI+CisgICAgPFREIFJPV1NQQU49IjIiIENPTFNQQU49IjIiIEJBQ0tHUk9VTkQ9Ii4uL2ltYWdlcy90ZW1wbGF0ZV91bC5naWYiIEhFSUdIVD0iNzUiPjxJTUcgU1JDPSIuLi9pbWFnZXMvc3BhY2VyLmdpZiIgV0lEVEg9IjI4MCIgSEVJR0hUPSIxIiBIU1BBQ0U9IjAiPjwvVEQ+CisJCTxURCBIRUlHSFQ9IjE1IiAgV0lEVEg9IjEwMCUiIEJBQ0tHUk9VTkQ9Ii4uL2ltYWdlcy90ZW1wbGF0ZV91LmdpZiI+PC9URD4KKwk8L1RSPgorCTxUUj4KKwkJPFREIEhFSUdIVD0iNjAiID4KKwkJCTxDRU5URVI+PElNRyBTUkM9Ii4uL2ltYWdlcy9UaXRsZUxvZ29fdHJhbnNwYXJlbnQuZ2lmIiBWU1BBQ0U9IjAiPjwvQ0VOVEVSPgorCQk8L1REPgorCTwvVFI+CisJPFRSPgorCQkKKyAgICA8VEQgV0lEVEg9IjIwMCIgQkFDS0dST1VORD0iLi4vaW1hZ2VzL3RlbXBsYXRlX2wuZ2lmIiBWQUxJR049InRvcCI+CisJCTxUQUJMRSBXSURUSD0iMTgwIiBDRUxMU1BBQ0lORz0iMCIgQ0VMTFBBRERJTkc9IjEiPiAKKyAgICAgIAk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljSGVhZCI+R2VuZXJhbDwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBWQUxJR049ImNlbnRlciI+PElNRyBTUkM9Ii4uL2ltYWdlcy90ZW1wbGF0ZV9saW5lLmdpZiI+PC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0xpc3QiPgorCSAgICAgICAgPFVMPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vc3lzdGVtX3JlcXVpcmVtZW50cy5odG1sIj5TeXN0ZW0gUmVxdWlyZW1lbnRzPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9mYXEuaHRtbCI+RkFRPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9mdXR1cmVfZmVhdHVyZXMuaHRtbCI+RnV0dXJlIFJlbGVhc2VzPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMSSBDTEFTUz0idG9waWNMaXN0Ij48QSBIUkVGPSIuLi9mdXR1cmVfZmVhdHVyZXMuaHRtbCI+VmVyc2lvbiAKKyAgICAgICAgICAgICAgICBIaXN0b3J5PC9BPjwvTEk+CisgICAgICAgICAgICA8L1VMPgorCQkJPC9URD4KKwkJPC9UUj4KKyAgICAgIAk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljSGVhZCI+UkIgTWFuYWdlcjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBWQUxJR049ImNlbnRlciI+PElNRyBTUkM9Ii4uL2ltYWdlcy90ZW1wbGF0ZV9saW5lLmdpZiI+PC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0xpc3QiPgorCSAgICAgICAgPFVMPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vaW5kZXguaHRtbCI+SG9tZTwvQT48L0xJPgorICAgICAgICAgICAgICA8TEk+PEEgSFJFRj0iLi4vdHV0b3JpYWwvaW5kZXguaHRtbCI+VHV0b3JpYWw8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJPjxBIEhSRUY9ImluZGV4Lmh0bWwiPkZ1bmN0aW9uYWxpdHkgYW5kIFZpZXdzPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9sb29rYW5kZmVlbC5odG1sIj5Mb29rIGFuZCBGZWVsPC9BPjwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9tZW51Lmh0bWwiPk1lbnUgSXRlbXM8L0E+PC9MST4KKyAgICAgICAgICAgICAgPExJIENMQVNTPSJ0b3BpY0xpc3QiPjxBIEhSRUY9Ii4uL3R1dG9yaWFsL3N0ZXAxLmh0bWwiPlByZWZlcmVuY2VzPC9BPjwvTEk+CisgICAgICAgICAgICA8L1VMPgorCQkJPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIENMQVNTPSJ0b3BpY0hlYWQiPlJCIFJlcG9ydGVyPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIFZBTElHTj0iY2VudGVyIj48SU1HIFNSQz0iLi4vaW1hZ2VzL3RlbXBsYXRlX2xpbmUuZ2lmIj48L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgQ0xBU1M9InRvcGljTGlzdCI+CisJICA8VUw+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9SQlJlcG9ydGVyLmh0bWwiPkhvbWU8L0E+PC9MST4KKyAgICAgICAgPExJPlJlcG9ydCBUeXBlczwvTEk+CisgICAgICAgICAgICAgIDxMST48QSBIUkVGPSIuLi9zY2FuZmlsZS5odG1sIj5Db2RlIFNjYW5uaW5nPC9BPjwvTEk+CisgICAgICAgICAgICA8L1VMPgorCQkJPC9URD4KKwkJPC9UUj4KKwk8L1RBQkxFPgorCisgICAgICA8UD4mbmJzcDsgPC9QPgorICAgICAgPC9URD4KKwkJCisgICAgPFREIENPTFNQQU49IjIiIFZBTElHTj0idG9wIiBDTEFTUz0ibWFpbkJsb2NrIj48IS0tICNCZWdpbkVkaXRhYmxlICJNYWluIiAtLT4gCisgICAgICA8SDMgQUxJR049IkNFTlRFUiI+VmlldyA1LiBUaGUgU2VhcmNoIFRhYjwvSDM+CisgICAgICA8UD5UaGUgR3JvdXBzIHRhYiB2aWV3LCBsaWtlIGFsbCB0YWIgdmlld3MsIGxvb2tzIGFuZCBmdW5jdGlvbnMgZGlmZmVyZW50bHkgCisgICAgICAgIHdoZW4gd29ya2luZyB3aXRoIHRoZSByZXNvdXJjZSBidW5kbGUgYXMgYSB3aG9sZSB0aGFuIHdoZW4gd29ya2luZyB3aXRoIAorICAgICAgICBhbiBpbmRpdmlkdWFsIHJlc291cmNlIGZpbGUuIEhvd2V2ZXIsIHVubGlrZSB0aGUgb3RoZXIgdGFiIHZpZXdzLCB0aGUgCisgICAgICAgIGRpZmZlcmVuY2VzIGFyZSBtaW5pbWFsLiBTZWFyY2hpbmcgZnJvbSB0aGUgYnVuZGxlIHBlcmZvcm1zIHRoZSBzZWFyY2ggCisgICAgICAgIG9uIHRoZSBiYXNlIGNsYXNzIGFuZCBlZGl0cyB0byB0aGUgZm91bmQgcmVzb3VyY2VzIGFmZmVjdCB0aGUgZW50aXJlIGJ1bmRsZS4gCisgICAgICAgIFNlYXJjaGluZyBmcm9tIGEgcmVzb3VyY2UgZmlsZSByZXN0cmljdHMgdGhlIHNlYXJjaCB0byB0aGF0IGZpbGUgYW5kIHRoZSAKKyAgICAgICAgY2hhbmdlcyBhcmUgYWxzbyByZXN0cmljdGVkIHRvIHRoYXQgcmVzb3VyY2UgZmlsZS48L1A+CisgICAgICA8UD5BIHNjcmVlbiBzaG90IG9mIHRoZSBTZWFyY2ggdGFiIHZpZXcgZm9yIHRoZSByZXNvdXJjZSBidW5kbGUgaXMgZ2l2ZW4gCisgICAgICAgIGJlbG93LiBUaGUgdmlldyBmb3IgdGhlIGluZGl2aWR1YWwgcmVzb3VyY2UgZmlsZXMgaXMgbmVhcmx5IGlkZW50aWNhbC48L1A+CisgICAgICA8UD48SU1HIFNSQz0iLi4vaW1hZ2VzL3NjcmVlbnNob3RzL3ZpZXdfc2VhcmNoLmdpZiIgV0lEVEg9IjY3MSIgSEVJR0hUPSI1NDMiPjwvUD4KKyAgICAgIDxQPlRoZXJlIGFyZSB0d28gYmFzaWMgZnVuY3Rpb25zIHRvIHRoaXMgdmlldywgRmluZCBBbGwgYW5kIFJlcGxhY2UgQWxsLiAKKyAgICAgICAgRmluZCBBbGwgdGFrZXMgdGhlIHBhcmFtZXRlcnMgZ2l2ZW4gaXQgYW5kIHBvcHVsYXRlcyB0aGUgcmVzdWx0IHRhYmxlIAorICAgICAgICB3aXRoIGFueSBtYXRjaGVzIGZvdW5kIChub3RlIHRoYXQgdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBSQiBNYW5hZ2VyIGRvZXMgCisgICAgICAgIG5vdCBzdXBwb3J0IHdpbGQgY2FyZCBjaGFyYWN0ZXJzIG9yIHJlZ3VsYXIgZXhwcmVzc2lvbnMpLiBUaGUgcmVzdWx0aW5nIAorICAgICAgICB0YWJsZSBjYW4gYmUgZWRpdGVkIGFzIGluIHRoZSBvdGhlciB2aWV3cyBieSBkb3VibGluZyBjbGlja2luZyBhIHJvdyBpbiAKKyAgICAgICAgdGhlIHRhYmxlLjwvUD4KKyAgICAgIDxQPlJlcGxhY2UgQWxsIHdvcmtzIGJ5IGZpcnN0IGZpbmRpbmcgYWxsIG9mIHRoZSByZXNvdXJjZXMgaW4gdGhlIHNhbWUgbWFubmVyIAorICAgICAgICBhcyBGaW5kIEFsbCBhbmQgdGhlbiByZXBsYWNpbmcgdGhlIHRleHQgdGhhdCBpcyBmb3VuZCB3aXRoIHRoZSB0ZXh0IGdpdmVuIAorICAgICAgICBpbiB0aGUgUmVwbGFjZSB0ZXh0IGJveC4gSXQgaXMgcmVjb21tZW5kZWQgdGhhdCB5b3UgZmlyc3QgcGVyZm9ybSBGaW5kIAorICAgICAgICBBbGwgYmVmb3JlIFJlcGxhY2UgQWxsLiBUaGUgY3VycmVudCB2ZXJzaW9uIG9mIFJCIE1hbmFnZXIgZG9lcyBhbiBhbGwgCisgICAgICAgIG9yIG5vdGhpbmcgcmVwbGFjZS4gRnV0dXJlIHZlcnNpb25zIG1heSBhbGxvdyBzdGVwIGJ5IHN0ZXAgcmVwbGFjZW1lbnQuPC9QPgorICAgICAgPFA+VXNpbmcgdGhlIGNoZWNrIGJveGVzIG9uIHRoZSBwYWdlLCB5b3UgY2FuIHNwZWNpZnkgYW55IGNvbWJpbmF0aW9uIG9mIAorICAgICAgICB0aHJlZSBwYXJ0cyBvZiB0aGUgcmVzb3VyY2VzIHRvIHNlYXJjaDogUmVzb3VyY2UgS2V5cywgVHJhbnNsYXRpb25zLCBhbmQgCisgICAgICAgIENvbW1lbnRzLiBBIGZvdXJ0aCBjaGVjayBib3ggYWxsb3dzIHlvdSB0byBtYWtlIHRoZSBzZWFyY2ggY2FzZSBzZW5zaXRpdmUuPC9QPgorICAgICAgPFA+VGhpcyB2aWV3IHdhcyBpbnRyb2R1Y2VkIGluIHZlcnNpb24gMC4zYSBvZiBSQiBNYW5hZ2VyLjwvUD4KKyAgICAgIDxQIEFMSUdOPSJDRU5URVIiPjxBIEhSRUY9ImluZGV4Lmh0bWwiPkJhY2sgdG8gdGhlIEZ1bmN0aW9uYWxpdHkgYW5kIFZpZXcgCisgICAgICAgIEluZGV4IDwvQT48L1A+CisgICAgICA8IS0tICNFbmRFZGl0YWJsZSAtLT48L1REPgorCTwvVFI+CisJPFRSPgorCQk8VEQgQkFDS0dST1VORD0iLi4vaW1hZ2VzL3RlbXBsYXRlX2xsLmdpZiIgSEVJR0hUPSI0MCIgV0lEVEg9IjIwMCI+CisJCQk8IS0tIENvbW1lbnQgLS0+CisJCTwvVEQ+CisJCTxURCBXSURUSD0iODAiPgorCQkJPCEtLSBDb21tZW50IC0tPgorCQk8L1REPgorCQk8VEQ+CisJCQk8Q0VOVEVSPjxTUEFOIENMQVNTPSJDb3B5cmlnaHQiPkNvcHlyaWdodCAyMDAwLTIwMDEgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcywgQWxsIFJpZ2h0cyBSZXNlcnZlZDwvU1BBTj48L0NFTlRFUj4KKwkJPC9URD4KKwk8L1RSPgorPC9UQUJMRT4KKworPC9CT0RZPgorPCEtLSAjRW5kVGVtcGxhdGUgLS0+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2d1aS9BYm91dERpYWxvZy5qYXZhIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2d1aS9BYm91dERpYWxvZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MjVjYjgKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZ3VpL0Fib3V0RGlhbG9nLmphdmEKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDQsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kICAqCisgKiBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitwYWNrYWdlIGNvbS5pYm0ucmJtLmd1aTsKKworaW1wb3J0IGNvbS5pYm0ucmJtLio7CitpbXBvcnQgamF2YS5hd3QuKjsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC4qOworaW1wb3J0IGphdmF4LnN3aW5nLio7CisKKworLyoqIEEgZGlhbG9nIGRpc3BsYXlpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBhcHBsaWNhdGlvbiAqLworY2xhc3MgQWJvdXREaWFsb2cgeworCXByaXZhdGUgc3RhdGljIEpEaWFsb2cgZGlhbG9nID0gbnVsbDsKKwkKKwlwdWJsaWMgc3RhdGljIHZvaWQgc2hvd0RpYWxvZyhGcmFtZSBwYXJlbnQpIHsKKwkJaWYgKGRpYWxvZyA9PSBudWxsKSB7CisJCQlkaWFsb2cgPSBuZXcgSkRpYWxvZyhwYXJlbnQsIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX3RpdGxlX2Fib3V0X3JibWFuYWdlciIpLCBmYWxzZSk7CisJCQlpbml0Q29tcG9uZW50cygpOworCQl9CisJCWRpYWxvZy5zZXRWaXNpYmxlKHRydWUpOworCX0KKwkKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGluaXRDb21wb25lbnRzKCkgeworCQlkaWFsb2cuZ2V0Q29udGVudFBhbmUoKS5zZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKKyAgICAgICAgSkxhYmVsIGxvZ29MYWJlbCA9IG51bGw7CisJCUpMYWJlbCB0aXRsZUxhYmVsID0gbmV3IEpMYWJlbChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInJibWFuYWdlciIpKTsKKwkJSkxhYmVsIHZlcnNpb25MYWJlbCA9IG5ldyBKTGFiZWwoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJ2ZXJzaW9uIiwgUGFja2FnZS5nZXRQYWNrYWdlKCJjb20uaWJtLnJibSIpLmdldEltcGxlbWVudGF0aW9uVmVyc2lvbigpKSk7CisJCUpMYWJlbCBjb3B5cmlnaHRMYWJlbCA9IG5ldyBKTGFiZWwoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJjb3B5cmlnaHQiKSk7CisJCUpMYWJlbCBjb250YWN0TGFiZWwgPSBuZXcgSkxhYmVsKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigicmJtYW5hZ2VyX2NvbnRhY3QiKSk7CisJCUpQYW5lbCBwYW5lbCA9IG5ldyBKUGFuZWwoKTsKKwkJQm94IGJveCA9IG5ldyBCb3goQm94TGF5b3V0LllfQVhJUyk7CisJCQorICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2xhc3MgdGhpc0NsYXNzID0gQ2xhc3MuZm9yTmFtZSgiY29tLmlibS5yYm0uZ3VpLkFib3V0RGlhbG9nIik7CisJCSAgICBsb2dvTGFiZWwgPSBuZXcgSkxhYmVsKG5ldyBJbWFnZUljb24odGhpc0NsYXNzLmdldFJlc291cmNlKCJpbWFnZXMvIiArCisJCQkJCQkJCQkgICAgICBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImxvZ29fZmlsZW5hbWUiKSkpKTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBSQk1hbmFnZXJHVUkuZGVidWdNc2coZS50b1N0cmluZygpKTsKKyAgICAgICAgfQorCisJCWJveC5hZGQodGl0bGVMYWJlbCk7CisJCWJveC5hZGQodmVyc2lvbkxhYmVsKTsKKwkJYm94LmFkZChCb3guY3JlYXRlVmVydGljYWxTdHJ1dCgxMCkpOworCQlib3guYWRkKGNvcHlyaWdodExhYmVsKTsKKwkJYm94LmFkZChCb3guY3JlYXRlVmVydGljYWxTdHJ1dCg1KSk7CisJCWJveC5hZGQoY29udGFjdExhYmVsKTsKKwkJCisJCXBhbmVsLmFkZChib3gpOworCQlkaWFsb2cuZ2V0Q29udGVudFBhbmUoKS5hZGQobG9nb0xhYmVsLCBCb3JkZXJMYXlvdXQuV0VTVCk7CisJCWRpYWxvZy5nZXRDb250ZW50UGFuZSgpLmFkZChwYW5lbCwgQm9yZGVyTGF5b3V0LkNFTlRFUik7CisJCQorCQlkaWFsb2cuYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCkgeworCQkJcHVibGljIHZvaWQgbW91c2VSZWxlYXNlZChNb3VzZUV2ZW50IGV2KSB7CisJCQkJaGlkZURpYWxvZygpOworCQkJfQorCQl9KTsKKwkJCisJCS8vZGlhbG9nLnZhbGlkYXRlKCk7CisJCWRpYWxvZy5wYWNrKCk7CisJCVBvaW50IHBhcmVudExvYyA9IGRpYWxvZy5nZXRQYXJlbnQoKS5nZXRMb2NhdGlvbigpOworCQlkaWFsb2cuc2V0TG9jYXRpb24obmV3IFBvaW50KHBhcmVudExvYy54ICsgNTAsIHBhcmVudExvYy55ICsgNTApKTsKKwkJZGlhbG9nLnNldFJlc2l6YWJsZShmYWxzZSk7CisJfQorCQorCXByaXZhdGUgc3RhdGljIHZvaWQgaGlkZURpYWxvZygpIHsKKwkJZGlhbG9nLnNldFZpc2libGUoZmFsc2UpOworCQlkaWFsb2cuZGlzcG9zZSgpOworCQlkaWFsb2cgPSBudWxsOworCX0KK30KZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9ndWkvQnVuZGxlR3JvdXBDcmVhdGlvbkRpYWxvZy5qYXZhIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2d1aS9CdW5kbGVHcm91cENyZWF0aW9uRGlhbG9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVhZDIxMgotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9ndWkvQnVuZGxlR3JvdXBDcmVhdGlvbkRpYWxvZy5qYXZhCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgICoKKyAqIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3BhY2thZ2UgY29tLmlibS5yYm0uZ3VpOworCitpbXBvcnQgamF2YS5hd3QuKjsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC4qOworCitpbXBvcnQgamF2YXguc3dpbmcuKjsKKworaW1wb3J0IGNvbS5pYm0ucmJtLio7CisKKy8qKgorICogQSBkaWFsb2cgd2hpY2ggYWxsb3dzIHRoZSB1c2VyIHRvIGNyZWF0ZSBhIG5ldyBCdW5kbGUgR3JvdXAKKyAqLworY2xhc3MgQnVuZGxlR3JvdXBDcmVhdGlvbkRpYWxvZyBleHRlbmRzIEpEaWFsb2cgeworCVJCTWFuYWdlciByYm07CisJCisJLy8gSGVscGVyIGRhdGEKKwlpbnQgbGVmdF9jb2xfd2lkdGggPSAxMjU7CisJaW50IHJpZ2h0X2NvbF93aWR0aCA9IDI3NTsKKwlpbnQgcm93X2hlaWdodCA9IDI1OworCURpbWVuc2lvbiBsZWZ0RGltID0gbmV3IERpbWVuc2lvbihsZWZ0X2NvbF93aWR0aCwgcm93X2hlaWdodCk7CisJRGltZW5zaW9uIHJpZ2h0RGltID0gbmV3IERpbWVuc2lvbihyaWdodF9jb2xfd2lkdGgsIHJvd19oZWlnaHQpOworCQorCS8vIENvbXBvbmVudHMKKwlCb3ggbWFpbkJveCA9IG5ldyBCb3goQm94TGF5b3V0LllfQVhJUyk7CisJQm94IGJveDEgPSBuZXcgQm94KEJveExheW91dC5YX0FYSVMpOworCUJveCBib3gyID0gbmV3IEJveChCb3hMYXlvdXQuWF9BWElTKTsKKwlCb3ggYm94MyA9IG5ldyBCb3goQm94TGF5b3V0LlhfQVhJUyk7CisJCisJSlRleHRBcmVhIGluc3RydWN0aW9uc0FyZWEgPSBuZXcgSlRleHRBcmVhKCIiKTsKKwlKTGFiZWwgbmFtZUxhYmVsID0gbmV3IEpMYWJlbChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImRpYWxvZ19ncm91cCIpKTsKKwlKTGFiZWwgY29tbWVudExhYmVsID0gbmV3IEpMYWJlbChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImRpYWxvZ19ncm91cF9jb21tZW50IikpOworCUpUZXh0RmllbGQgbmFtZUZpZWxkID0gbmV3IEpUZXh0RmllbGQoIiIpOworCUpUZXh0RmllbGQgY29tbWVudEZpZWxkID0gbmV3IEpUZXh0RmllbGQoIiIpOworCUpCdXR0b24gY3JlYXRlQnV0dG9uID0gbmV3IEpCdXR0b24oUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJidXR0b25fY3JlYXRlIikpOworCUpCdXR0b24gY2FuY2VsQnV0dG9uID0gbmV3IEpCdXR0b24oUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJidXR0b25fY2FuY2VsIikpOworCQorCQorCXB1YmxpYyBCdW5kbGVHcm91cENyZWF0aW9uRGlhbG9nKFJCTWFuYWdlciByYm0sIEpGcmFtZSBmcmFtZSwgU3RyaW5nIHRpdGxlLCBib29sZWFuIG1vZGFsKSB7CisJCXN1cGVyKGZyYW1lLCB0aXRsZSwgbW9kYWwpOworCQl0aGlzLnJibSA9IHJibTsKKwkJaW5pdENvbXBvbmVudHMoKTsKKwkJZW5hYmxlRXZlbnRzKEFXVEV2ZW50LktFWV9FVkVOVF9NQVNLKTsKKwl9CisJCisJYm9vbGVhbiBjcmVhdGVHcm91cCgpIHsKKwkJaWYgKHJibSA9PSBudWxsKSByZXR1cm4gZmFsc2U7CisJCXJldHVybiByYm0uY3JlYXRlR3JvdXAobmFtZUZpZWxkLmdldFRleHQoKS50cmltKCksIGNvbW1lbnRGaWVsZC5nZXRUZXh0KCkudHJpbSgpKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0tleUV2ZW50KEtleUV2ZW50IGV2KSB7CisJCWlmIChldi5nZXRLZXlDb2RlKCkgPT0gS2V5RXZlbnQuVktfRU5URVIpIHsKKwkJCWJvb2xlYW4gc3VjY2VzcyA9IGNyZWF0ZUdyb3VwKCk7CisJCQlpZiAoIXN1Y2Nlc3MpIHsKKwkJCQlTdHJpbmcgYWxlcnQgPSBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImVycm9yX2NyZWF0ZV9ncm91cCIpICsgIiAiICsKKwkJCQkJCQkgICBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImVycm9yX3RyeV9hZ2Fpbl9ncm91cCIpOworCQkJCUpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKHRoaXMsIGFsZXJ0LCBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImVycm9yIiksIEpPcHRpb25QYW5lLkVSUk9SX01FU1NBR0UpOworCQkJfSBlbHNlIHsKKwkJCQlzZXRWaXNpYmxlKGZhbHNlKTsKKwkJCQlkaXNwb3NlKCk7CisJCQl9CisJCX0gZWxzZSBpZiAoZXYuZ2V0S2V5Q29kZSgpID09IEtleUV2ZW50LlZLX0NBTkNFTCkgeworCQkJY2xvc2VXaW5kb3coKTsKKwkJfQorCX0KKwkKKwlwcml2YXRlIHZvaWQgaW5pdENvbXBvbmVudHMoKXsKKwkJLy8gRXJyb3IgY2hlY2sKKwkJaWYgKHJibSA9PSBudWxsKSB7CisJCQlTdHJpbmcgYWxlcnQgPSBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImVycm9yX25vX2J1bmRsZV9mb3JfZ3JvdXAiKTsKKwkJCUpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKHRoaXMsIGFsZXJ0LCBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImVycm9yIiksIEpPcHRpb25QYW5lLkVSUk9SX01FU1NBR0UpOworCQkJY2xvc2VXaW5kb3coKTsKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJLy8gSW5pdGlhbGl6ZSB2YWx1ZXMKKwkJCisJCS8vIFNldCB1cCB0aGUgY29tcG9uZW50cworCQluYW1lTGFiZWwuc2V0UHJlZmVycmVkU2l6ZShsZWZ0RGltKTsKKwkJbmFtZUZpZWxkLnNldENvbHVtbnMoMzApOworCQljb21tZW50TGFiZWwuc2V0UHJlZmVycmVkU2l6ZShsZWZ0RGltKTsKKwkJY29tbWVudEZpZWxkLnNldENvbHVtbnMoMzApOworCQlnZXRSb290UGFuZSgpLnNldERlZmF1bHRCdXR0b24oY3JlYXRlQnV0dG9uKTsKKwkJCisJCWJveDEuYWRkKG5hbWVMYWJlbCk7IGJveDEuYWRkKG5hbWVGaWVsZCk7CisJCWJveDIuYWRkKGNvbW1lbnRMYWJlbCk7IGJveDIuYWRkKGNvbW1lbnRGaWVsZCk7CisJCWJveDMuYWRkKGNyZWF0ZUJ1dHRvbik7CisJCWJveDMuYWRkKEJveC5jcmVhdGVIb3Jpem9udGFsU3RydXQoNSkpOworCQlib3gzLmFkZChjYW5jZWxCdXR0b24pOworCQkKKwkJaW5zdHJ1Y3Rpb25zQXJlYS5zZXRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVFdGNoZWRCb3JkZXIoKSk7CisJCQorCQkvLyBBZGQgdGhlIGFwcHJvcHJpYXRlIGxpc3RlbmVycworCQljYW5jZWxCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2KSB7CisJCQkJSkRpYWxvZyBkaWFsb2cgPSAoSkRpYWxvZykoKEpCdXR0b24pZXYuZ2V0U291cmNlKCkpLmdldFBhcmVudCgpLmdldFBhcmVudCgpLmdldFBhcmVudCgpLmdldFBhcmVudCgpLmdldFBhcmVudCgpOworCQkJCWRpYWxvZy5zZXRWaXNpYmxlKGZhbHNlKTsKKwkJCQlkaWFsb2cuZGlzcG9zZSgpOworCQkJfQorCQl9KTsKKwkJCisJCWNyZWF0ZUJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXYpIHsKKwkJCQlCdW5kbGVHcm91cENyZWF0aW9uRGlhbG9nIGRpYWxvZyA9CisJCQkJCShCdW5kbGVHcm91cENyZWF0aW9uRGlhbG9nKSgoSkJ1dHRvbilldi5nZXRTb3VyY2UoKSkuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCk7CisJCQkJYm9vbGVhbiBzdWNjZXNzID0gZGlhbG9nLmNyZWF0ZUdyb3VwKCk7CisJCQkJaWYgKCFzdWNjZXNzKSB7CisJCQkJCVN0cmluZyBhbGVydCA9IFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZXJyb3JfY3JlYXRlX2dyb3VwIikgKyAiICIgKworCQkJCQkJCQkgICBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImVycm9yX3RyeV9hZ2Fpbl9ncm91cCIpOworCQkJCQlKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyhkaWFsb2csIGFsZXJ0LCBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImVycm9yIiksIEpPcHRpb25QYW5lLkVSUk9SX01FU1NBR0UpOworCQkJCX0gZWxzZSB7CisJCQkJCWRpYWxvZy5zZXRWaXNpYmxlKGZhbHNlKTsKKwkJCQkJZGlhbG9nLmRpc3Bvc2UoKTsKKwkJCQl9CisJCQl9CisJCX0pOworCQkKKwkJLy8gQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBmcmFtZQorCQlzZXRMb2NhdGlvbihuZXcgamF2YS5hd3QuUG9pbnQoNTAsIDUwKSk7CisJCW1haW5Cb3gucmVtb3ZlQWxsKCk7CisJCW1haW5Cb3guYWRkKGJveDEpOworCQltYWluQm94LmFkZChCb3guY3JlYXRlVmVydGljYWxTdHJ1dCg1KSk7CisJCW1haW5Cb3guYWRkKGJveDIpOworCQlnZXRDb250ZW50UGFuZSgpLnNldExheW91dChuZXcgQm9yZGVyTGF5b3V0KCkpOworCQlnZXRDb250ZW50UGFuZSgpLnJlbW92ZUFsbCgpOworCQkvL2dldENvbnRlbnRQYW5lKCkuYWRkKGluc3RydWN0aW9uc0FyZWEsIEJvcmRlckxheW91dC5OT1JUSCk7CisJCWdldENvbnRlbnRQYW5lKCkuYWRkKG1haW5Cb3gsIEJvcmRlckxheW91dC5DRU5URVIpOworCQlnZXRDb250ZW50UGFuZSgpLmFkZChib3gzLCBCb3JkZXJMYXlvdXQuU09VVEgpOworCQl2YWxpZGF0ZVRyZWUoKTsKKwkJcGFjaygpOworCQlzZXRWaXNpYmxlKHRydWUpOworCQkvL3NldFJlc2l6YWJsZShmYWxzZSk7CisJfQorCQorCXZvaWQgY2xvc2VXaW5kb3coKSB7CisJCXNldFZpc2libGUoZmFsc2UpOworCQlkaXNwb3NlKCk7CisJfQorfQorCmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vZ3VpL0J1bmRsZUdyb3VwRWRpdERpYWxvZy5qYXZhIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2d1aS9CdW5kbGVHcm91cEVkaXREaWFsb2cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjc0YmVkCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2d1aS9CdW5kbGVHcm91cEVkaXREaWFsb2cuamF2YQpAQCAtMCwwICsxLDE0NiBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDQsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kICAqCisgKiBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitwYWNrYWdlIGNvbS5pYm0ucmJtLmd1aTsKKworaW1wb3J0IGphdmEuYXd0Lio7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuKjsKKworaW1wb3J0IGphdmF4LnN3aW5nLio7CisKK2ltcG9ydCBjb20uaWJtLnJibS4qOworCisvKioKKyAqIEEgZGlhbG9nIHdoaWNoIGFsbG93cyB0aGUgdXNlciB0byBjcmVhdGUgYSBuZXcgQnVuZGxlIEdyb3VwCisgKi8KK2NsYXNzIEJ1bmRsZUdyb3VwRWRpdERpYWxvZyBleHRlbmRzIEpEaWFsb2cgeworCUJ1bmRsZUdyb3VwIGdyb3VwOworCQorCS8vIEhlbHBlciBkYXRhCisJaW50IGxlZnRfY29sX3dpZHRoID0gMTI1OworCWludCByaWdodF9jb2xfd2lkdGggPSAyNzU7CisJaW50IHJvd19oZWlnaHQgPSAyNTsKKwlEaW1lbnNpb24gbGVmdERpbSA9IG5ldyBEaW1lbnNpb24obGVmdF9jb2xfd2lkdGgsIHJvd19oZWlnaHQpOworCURpbWVuc2lvbiByaWdodERpbSA9IG5ldyBEaW1lbnNpb24ocmlnaHRfY29sX3dpZHRoLCByb3dfaGVpZ2h0KTsKKwkKKwkvLyBDb21wb25lbnRzCisJQm94IG1haW5Cb3ggPSBuZXcgQm94KEJveExheW91dC5ZX0FYSVMpOworCUJveCBib3gxID0gbmV3IEJveChCb3hMYXlvdXQuWF9BWElTKTsKKwlCb3ggYm94MiA9IG5ldyBCb3goQm94TGF5b3V0LlhfQVhJUyk7CisJQm94IGJveDMgPSBuZXcgQm94KEJveExheW91dC5YX0FYSVMpOworCQorCUpMYWJlbCBuYW1lTGFiZWwgPSBuZXcgSkxhYmVsKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX2dyb3VwIikpOworCUpMYWJlbCBjb21tZW50TGFiZWwgPSBuZXcgSkxhYmVsKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX2dyb3VwX2NvbW1lbnQiKSk7CisJSlRleHRGaWVsZCBuYW1lRmllbGQgPSBuZXcgSlRleHRGaWVsZCgiIik7CisJSlRleHRGaWVsZCBjb21tZW50RmllbGQgPSBuZXcgSlRleHRGaWVsZCgiIik7CisJSkJ1dHRvbiBlZGl0QnV0dG9uID0gbmV3IEpCdXR0b24oUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJidXR0b25fZWRpdCIpKTsKKwlKQnV0dG9uIGNhbmNlbEJ1dHRvbiA9IG5ldyBKQnV0dG9uKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiYnV0dG9uX2NhbmNlbCIpKTsKKwkKKwkKKwlwdWJsaWMgQnVuZGxlR3JvdXBFZGl0RGlhbG9nKEJ1bmRsZUdyb3VwIGdyb3VwLCBKRnJhbWUgZnJhbWUsIFN0cmluZyB0aXRsZSwgYm9vbGVhbiBtb2RhbCkgeworCQlzdXBlcihmcmFtZSwgdGl0bGUsIG1vZGFsKTsKKwkJdGhpcy5ncm91cCA9IGdyb3VwOworCQlpbml0Q29tcG9uZW50cygpOworCQllbmFibGVFdmVudHMoQVdURXZlbnQuS0VZX0VWRU5UX01BU0spOworCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzS2V5RXZlbnQoS2V5RXZlbnQgZXYpIHsKKwkJaWYgKGV2LmdldEtleUNvZGUoKSA9PSBLZXlFdmVudC5WS19FTlRFUikgeworCQkJYm9vbGVhbiBzdWNjZXNzID0gZWRpdEdyb3VwKCk7CisJCQlpZiAoIXN1Y2Nlc3MpIHsKKwkJCQlTdHJpbmcgYWxlcnQgPSBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImVycm9yX21vZGlmeV9ncm91cCIpOworCQkJCUpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKHRoaXMsIGFsZXJ0LCBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImVycm9yX2ludGVybmFsIiksCisJCQkJCQkJCQkJCSAgSk9wdGlvblBhbmUuRVJST1JfTUVTU0FHRSk7CisJCQl9IGVsc2UgeworCQkJCXNldFZpc2libGUoZmFsc2UpOworCQkJCWRpc3Bvc2UoKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChldi5nZXRLZXlDb2RlKCkgPT0gS2V5RXZlbnQuVktfQ0FOQ0VMKSB7CisJCQljbG9zZVdpbmRvdygpOworCQl9CisJfQorCQorCWJvb2xlYW4gZWRpdEdyb3VwKCkgeworCQlpZiAoZ3JvdXAgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOworCQlncm91cC5zZXROYW1lKG5hbWVGaWVsZC5nZXRUZXh0KCkudHJpbSgpKTsKKwkJZ3JvdXAuc2V0Q29tbWVudChjb21tZW50RmllbGQuZ2V0VGV4dCgpLnRyaW0oKSk7CisJCXJldHVybiB0cnVlOworCX0KKwkKKwlwcml2YXRlIHZvaWQgaW5pdENvbXBvbmVudHMoKXsKKwkJLy8gRXJyb3IgY2hlY2sKKwkJaWYgKGdyb3VwID09IG51bGwpIHsKKwkJCVN0cmluZyBhbGVydCA9IFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZXJyb3JfbW9kaWZ5X2dyb3VwIik7CisJCQlKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyh0aGlzLCBhbGVydCwgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJlcnJvcl9pbnRlcm5hbCIpLCBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKKwkJCWNsb3NlV2luZG93KCk7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCS8vIEluaXRpYWxpemUgdmFsdWVzCisJCQorCQkvLyBTZXQgdXAgdGhlIGNvbXBvbmVudHMKKwkJbmFtZUxhYmVsLnNldFByZWZlcnJlZFNpemUobGVmdERpbSk7CisJCW5hbWVGaWVsZC5zZXRDb2x1bW5zKDMwKTsKKwkJY29tbWVudExhYmVsLnNldFByZWZlcnJlZFNpemUobGVmdERpbSk7CisJCWNvbW1lbnRGaWVsZC5zZXRDb2x1bW5zKDMwKTsKKwkJCisJCW5hbWVGaWVsZC5zZXRUZXh0KGdyb3VwLmdldE5hbWUoKSk7CisJCWNvbW1lbnRGaWVsZC5zZXRUZXh0KGdyb3VwLmdldENvbW1lbnQoKSk7CisJCWdldFJvb3RQYW5lKCkuc2V0RGVmYXVsdEJ1dHRvbihlZGl0QnV0dG9uKTsKKwkJCisJCWJveDEuYWRkKG5hbWVMYWJlbCk7IGJveDEuYWRkKG5hbWVGaWVsZCk7CisJCWJveDIuYWRkKGNvbW1lbnRMYWJlbCk7IGJveDIuYWRkKGNvbW1lbnRGaWVsZCk7CisJCWJveDMuYWRkKGVkaXRCdXR0b24pOworCQlib3gzLmFkZChCb3guY3JlYXRlSG9yaXpvbnRhbFN0cnV0KDUpKTsKKwkJYm94My5hZGQoY2FuY2VsQnV0dG9uKTsKKwkJCisJCS8vIEFkZCB0aGUgYXBwcm9wcmlhdGUgbGlzdGVuZXJzCisJCWNhbmNlbEJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXYpIHsKKwkJCQlKRGlhbG9nIGRpYWxvZyA9IChKRGlhbG9nKSgoSkJ1dHRvbilldi5nZXRTb3VyY2UoKSkuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCk7CisJCQkJZGlhbG9nLnNldFZpc2libGUoZmFsc2UpOworCQkJCWRpYWxvZy5kaXNwb3NlKCk7CisJCQl9CisJCX0pOworCQkKKwkJZWRpdEJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXYpIHsKKwkJCQlCdW5kbGVHcm91cEVkaXREaWFsb2cgZGlhbG9nID0KKwkJCQkJKEJ1bmRsZUdyb3VwRWRpdERpYWxvZykoKEpCdXR0b24pZXYuZ2V0U291cmNlKCkpLmdldFBhcmVudCgpLmdldFBhcmVudCgpLmdldFBhcmVudCgpLmdldFBhcmVudCgpLmdldFBhcmVudCgpOworCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGRpYWxvZy5lZGl0R3JvdXAoKTsKKwkJCQlpZiAoIXN1Y2Nlc3MpIHsKKwkJCQkJU3RyaW5nIGFsZXJ0ID0gUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJlcnJvcl9tb2RpZnlfZ3JvdXAiKTsKKwkJCQkJSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2coZGlhbG9nLCBhbGVydCwgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJlcnJvcl9pbnRlcm5hbCIpLAorCQkJCQkJCQkJCQkJICBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKKwkJCQl9IGVsc2UgeworCQkJCQlkaWFsb2cuc2V0VmlzaWJsZShmYWxzZSk7CisJCQkJCWRpYWxvZy5kaXNwb3NlKCk7CisJCQkJfQorCQkJfQorCQl9KTsKKwkJCisJCS8vIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgZnJhbWUKKwkJc2V0TG9jYXRpb24obmV3IGphdmEuYXd0LlBvaW50KDUwLCA1MCkpOworCQltYWluQm94LnJlbW92ZUFsbCgpOworCQltYWluQm94LmFkZChib3gxKTsKKwkJbWFpbkJveC5hZGQoQm94LmNyZWF0ZVZlcnRpY2FsU3RydXQoNSkpOworCQltYWluQm94LmFkZChib3gyKTsKKwkJZ2V0Q29udGVudFBhbmUoKS5zZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKKwkJZ2V0Q29udGVudFBhbmUoKS5yZW1vdmVBbGwoKTsKKwkJZ2V0Q29udGVudFBhbmUoKS5hZGQobWFpbkJveCwgQm9yZGVyTGF5b3V0LkNFTlRFUik7CisJCWdldENvbnRlbnRQYW5lKCkuYWRkKGJveDMsIEJvcmRlckxheW91dC5TT1VUSCk7CisJCXZhbGlkYXRlVHJlZSgpOworCQlwYWNrKCk7CisJCXNldFZpc2libGUodHJ1ZSk7CisJCS8vc2V0UmVzaXphYmxlKGZhbHNlKTsKKwl9CisJCisJdm9pZCBjbG9zZVdpbmRvdygpIHsKKwkJc2V0VmlzaWJsZShmYWxzZSk7CisJCWRpc3Bvc2UoKTsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9ndWkvQnVuZGxlSXRlbUNyZWF0aW9uRGlhbG9nLmphdmEgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZ3VpL0J1bmRsZUl0ZW1DcmVhdGlvbkRpYWxvZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMzNiYWQKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZ3VpL0J1bmRsZUl0ZW1DcmVhdGlvbkRpYWxvZy5qYXZhCkBAIC0wLDAgKzEsMzk5IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNywgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgICoKKyAqIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3BhY2thZ2UgY29tLmlibS5yYm0uZ3VpOworCitpbXBvcnQgamF2YS5hd3QuKjsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC4qOworaW1wb3J0IGphdmEudXRpbC4qOworCitpbXBvcnQgamF2YXguc3dpbmcuKjsKKworaW1wb3J0IGNvbS5pYm0ucmJtLio7CisKKy8qKgorICogQSBkaWFsb2cgd2hpY2ggYWxsb3dzIHRoZSB1c2VyIHRvIGNyZWF0ZSBhIG5ldyBCdW5kbGUgSXRlbQorICovCitjbGFzcyBCdW5kbGVJdGVtQ3JlYXRpb25EaWFsb2cgZXh0ZW5kcyBKRGlhbG9nIHsKKwlSQk1hbmFnZXIgcmJtOworCVN0cmluZyBncm91cE5hbWU7CisJQnVuZGxlSXRlbSBpdGVtOworCWJvb2xlYW4gZmlyc3RJbml0ID0gdHJ1ZTsKKwkKKwkvLyBIZWxwZXIgZGF0YQorCWludCBsZWZ0X2NvbF93aWR0aCA9IDEyNTsKKwlpbnQgcmlnaHRfY29sX3dpZHRoID0gMjc1OworCWludCByb3dfaGVpZ2h0ID0gMjU7CisJRGltZW5zaW9uIGxlZnREaW0gPSBuZXcgRGltZW5zaW9uKGxlZnRfY29sX3dpZHRoLCByb3dfaGVpZ2h0KTsKKwlEaW1lbnNpb24gcmlnaHREaW0gPSBuZXcgRGltZW5zaW9uKHJpZ2h0X2NvbF93aWR0aCwgcm93X2hlaWdodCk7CisJCisJLy8gQ29tcG9uZW50cworCUJveCBtYWluQm94ID0gbmV3IEJveChCb3hMYXlvdXQuWV9BWElTKTsKKwlCb3ggYm94MSA9IG5ldyBCb3goQm94TGF5b3V0LlhfQVhJUyk7CisJQm94IGJveDIgPSBuZXcgQm94KEJveExheW91dC5YX0FYSVMpOworCUJveCBib3gzID0gbmV3IEJveChCb3hMYXlvdXQuWF9BWElTKTsKKwlCb3ggYm94NCA9IG5ldyBCb3goQm94TGF5b3V0LlhfQVhJUyk7CisJQm94IGJveDUgPSBuZXcgQm94KEJveExheW91dC5YX0FYSVMpOworCUJveCBib3g2ID0gbmV3IEJveChCb3hMYXlvdXQuWF9BWElTKTsKKwkKKwlKTGFiZWwgaW5zdHJ1Y3Rpb25zTGFiZWwgPSBuZXcgSkxhYmVsKCIiKTsKKwlKTGFiZWwgZ3JvdXBMYWJlbCA9IG5ldyBKTGFiZWwoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJkaWFsb2dfZ3JvdXAiKSk7CisJSkxhYmVsIG5hbWVMYWJlbCA9IG5ldyBKTGFiZWwoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJkaWFsb2dfa2V5IikpOworCUpMYWJlbCB0cmFuc0xhYmVsID0gbmV3IEpMYWJlbChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImRpYWxvZ190cmFuc2xhdGlvbiIpKTsKKwlKTGFiZWwgY29tbWVudExhYmVsID0gbmV3IEpMYWJlbChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImRpYWxvZ19jb21tZW50IikpOworCUpMYWJlbCBsb29rdXBMYWJlbCA9IG5ldyBKTGFiZWwoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJkaWFsb2dfbG9va3VwcyIpKTsKKwkKKwlKQ29tYm9Cb3ggZ3JvdXBDb21ib0JveCA9IG5ldyBKQ29tYm9Cb3goKTsKKwlKVGV4dEZpZWxkIG5hbWVGaWVsZCA9IG5ldyBKVGV4dEZpZWxkKCIiKTsKKwlKVGV4dEZpZWxkIHRyYW5zRmllbGQgPSBuZXcgSlRleHRGaWVsZCgiIik7CisJSlRleHRGaWVsZCBjb21tZW50RmllbGQgPSBuZXcgSlRleHRGaWVsZCgiIik7CisJSlRleHRGaWVsZCBsb29rdXBGaWVsZHNbXSA9IG51bGw7CisJSkxhYmVsIG5vTG9va3VwTGFiZWwgPSBudWxsOworCUJveCBsb29rdXBCb3ggPSBudWxsOworCUJveCBsb29rdXBCb3hlc1tdID0gbnVsbDsKKwlKTGFiZWwgbG9va3VwTGFiZWxzW10gPSBudWxsOworCQorCUpCdXR0b24gY3JlYXRlQnV0dG9uID0gbmV3IEpCdXR0b24oUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJidXR0b25fY3JlYXRlIikpOworCUpCdXR0b24gY3JlYXRlTW9yZUJ1dHRvbiA9IG5ldyBKQnV0dG9uKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiYnV0dG9uX2NyZWF0ZV9tb3JlIikpOworCUpCdXR0b24gY2FuY2VsQnV0dG9uID0gbmV3IEpCdXR0b24oUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJidXR0b25fY2FuY2VsIikpOworCQorCUhhc2h0YWJsZSBsb29rdXBzID0gbmV3IEhhc2h0YWJsZSgpOworCQorCXB1YmxpYyBCdW5kbGVJdGVtQ3JlYXRpb25EaWFsb2coUkJNYW5hZ2VyIHJibSwgSkZyYW1lIGZyYW1lLCBTdHJpbmcgdGl0bGUsIGJvb2xlYW4gbW9kYWwpIHsKKwkJc3VwZXIoZnJhbWUsIHRpdGxlLCBtb2RhbCk7CisJCXRoaXMucmJtID0gcmJtOworCQlncm91cE5hbWUgPSBudWxsOworCQlpdGVtID0gbnVsbDsKKwkJaW5pdENvbXBvbmVudHMoKTsKKwl9CisJCisJcHVibGljIEJ1bmRsZUl0ZW1DcmVhdGlvbkRpYWxvZyhTdHJpbmcgZ3JvdXBOYW1lLCBSQk1hbmFnZXIgcmJtLCBKRnJhbWUgZnJhbWUsIFN0cmluZyB0aXRsZSwgYm9vbGVhbiBtb2RhbCkgeworCQlzdXBlcihmcmFtZSwgdGl0bGUsIG1vZGFsKTsKKwkJdGhpcy5yYm0gPSByYm07CisJCXRoaXMuZ3JvdXBOYW1lID0gZ3JvdXBOYW1lOworCQlpdGVtID0gbnVsbDsKKwkJaW5pdENvbXBvbmVudHMoKTsKKwl9CisJCisJcHVibGljIEJ1bmRsZUl0ZW1DcmVhdGlvbkRpYWxvZyhCdW5kbGVJdGVtIGl0ZW0sIFJCTWFuYWdlciByYm0sIEpGcmFtZSBmcmFtZSwgU3RyaW5nIHRpdGxlLCBib29sZWFuIG1vZGFsKSB7CisJCXN1cGVyKGZyYW1lLCB0aXRsZSwgbW9kYWwpOworCQl0aGlzLml0ZW0gPSBpdGVtOworCQl0aGlzLnJibSA9IHJibTsKKwkJZ3JvdXBOYW1lID0gaXRlbS5nZXRQYXJlbnRHcm91cCgpLmdldE5hbWUoKTsKKwkJaW5pdENvbXBvbmVudHMoKTsKKwl9CisJCisJYm9vbGVhbiBjcmVhdGVJdGVtKCkgeworCQlpZiAocmJtID09IG51bGwpIHJldHVybiBmYWxzZTsKKwkJSGFzaHRhYmxlIGxvb2t1cEhhc2ggPSBuZXcgSGFzaHRhYmxlKCk7CisJCWlmIChsb29rdXBCb3hlcyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpPTA7IGkgPCBsb29rdXBCb3hlcy5sZW5ndGg7IGkrKykgeworCQkJCVN0cmluZyBuYW1lVGV4dCA9IGxvb2t1cExhYmVsc1tpXS5nZXRUZXh0KCkudHJpbSgpOworCQkJCVN0cmluZyBuYW1lID0gbmFtZVRleHQuc3Vic3RyaW5nKG5hbWVUZXh0LmluZGV4T2YoInsiKSsxLG5hbWVUZXh0LmluZGV4T2YoIn0iKSk7CisJCQkJU3RyaW5nIHZhbHVlID0gbG9va3VwRmllbGRzW2ldLmdldFRleHQoKS50cmltKCk7CisJCQkJbG9va3VwSGFzaC5wdXQobmFtZSx2YWx1ZSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHJibS5jcmVhdGVJdGVtKG5hbWVGaWVsZC5nZXRUZXh0KCkudHJpbSgpLCB0cmFuc0ZpZWxkLmdldFRleHQoKS50cmltKCksCisJCQkJCQkJICAoKEJ1bmRsZUdyb3VwKWdyb3VwQ29tYm9Cb3guZ2V0U2VsZWN0ZWRJdGVtKCkpLmdldE5hbWUoKSwKKwkJCQkJCQkgIGNvbW1lbnRGaWVsZC5nZXRUZXh0KCkudHJpbSgpLCBsb29rdXBIYXNoKTsKKwl9CisJCisJYm9vbGVhbiBlZGl0SXRlbSgpIHsKKwkJaWYgKGl0ZW0gPT0gbnVsbCkgcmV0dXJuIGZhbHNlOworCQlIYXNodGFibGUgbG9va3VwSGFzaCA9IG5ldyBIYXNodGFibGUoKTsKKwkJaWYgKGxvb2t1cEJveGVzICE9IG51bGwpIHsKKwkJCWZvciAoaW50IGk9MDsgaSA8IGxvb2t1cEJveGVzLmxlbmd0aDsgaSsrKSB7CisJCQkJU3RyaW5nIG5hbWVUZXh0ID0gbG9va3VwTGFiZWxzW2ldLmdldFRleHQoKS50cmltKCk7CisJCQkJU3RyaW5nIG5hbWUgPSBuYW1lVGV4dC5zdWJzdHJpbmcobmFtZVRleHQuaW5kZXhPZigieyIpKzEsbmFtZVRleHQuaW5kZXhPZigifSIpKTsKKwkJCQlTdHJpbmcgdmFsdWUgPSBsb29rdXBGaWVsZHNbaV0uZ2V0VGV4dCgpLnRyaW0oKTsKKwkJCQlsb29rdXBIYXNoLnB1dChuYW1lLHZhbHVlKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcmJtLmVkaXRJdGVtKGl0ZW0sIG5hbWVGaWVsZC5nZXRUZXh0KCkudHJpbSgpLAorCQkJCQkJCXRyYW5zRmllbGQuZ2V0VGV4dCgpLnRyaW0oKSwgKChCdW5kbGVHcm91cClncm91cENvbWJvQm94LmdldFNlbGVjdGVkSXRlbSgpKS5nZXROYW1lKCksCisJCQkJCQkJY29tbWVudEZpZWxkLmdldFRleHQoKS50cmltKCksIGxvb2t1cEhhc2gpOyAKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGNsZWFyQ29tcG9uZW50cygpIHsKKwkJbmFtZUZpZWxkLnNldFRleHQoIiIpOworCQl0cmFuc0ZpZWxkLnNldFRleHQoIiIpOworCQljb21tZW50RmllbGQuc2V0VGV4dCgiIik7CisJCWluaXRDb21wb25lbnRzKCk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NLZXlFdmVudChLZXlFdmVudCBldikgeworCQlpZiAoZXYuZ2V0S2V5Q29kZSgpID09IEtleUV2ZW50LlZLX0VOVEVSICYmIGV2LmdldElEKCkgPT0gS2V5RXZlbnQuS0VZX1JFTEVBU0VEKSB7CisJCQlpZiAodHJhbnNGaWVsZC5oYXNGb2N1cygpKSB7CisJCQkJLy8gSWYgd2UgYXJlIGluIHRoZSB0cmFuc2xhdGlvbiBmaWVsZCwgdGhlbiBlbnRlciBzaG91bGQgY3JlYXRlIGEgbmV3IGxpbmUgY2hhcmFjdGVyLCBub3QgZXhpdCB0aGUgZGlhbG9nCisJCQkJaW50IGNhcmV0UG9zID0gdHJhbnNGaWVsZC5nZXRDYXJldFBvc2l0aW9uKCk7CisJCQkJU3RyaW5nIG9sZFRleHQgPSB0cmFuc0ZpZWxkLmdldFRleHQoKTsKKwkJCQl0cmFuc0ZpZWxkLnNldFRleHQob2xkVGV4dC5zdWJzdHJpbmcoMCxjYXJldFBvcykgKyAiXG4iICsgb2xkVGV4dC5zdWJzdHJpbmcoY2FyZXRQb3Msb2xkVGV4dC5sZW5ndGgoKSkpOworCQkJCXRyYW5zRmllbGQuc2V0Q2FyZXRQb3NpdGlvbihjYXJldFBvcysxKTsKKwkJCQl2YWxpZGF0ZSgpOworCQkJCXNldFNpemUoZ2V0UHJlZmVycmVkU2l6ZSgpKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQkKKwkJCUJ1bmRsZUl0ZW1DcmVhdGlvbkRpYWxvZyBkaWFsb2cgPSB0aGlzOworCQkJYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7CisJCQlpZiAoZGlhbG9nLml0ZW0gPT0gbnVsbCkgc3VjY2VzcyA9IGRpYWxvZy5jcmVhdGVJdGVtKCk7CisJCQllbHNlIHN1Y2Nlc3MgPSBkaWFsb2cuZWRpdEl0ZW0oKTsKKwkJCWlmICghc3VjY2VzcykgeworCQkJCVN0cmluZyBhbGVydCA9IChpdGVtID09IG51bGwgPyBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImVycm9yX2NyZWF0ZV9pdGVtIikgOgorCQkJCQkJCQkJCQkgICBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImVycm9yX21vZGlmeV9pdGVtIikpOworCQkJCWFsZXJ0ICs9ICIgIiArIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZXJyb3JfdHJ5X2FnYWluX2l0ZW0iKTsKKwkJCQlKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyhkaWFsb2csIGFsZXJ0LCBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImVycm9yIiksCisJCQkJCQkJCQkJCSAgSk9wdGlvblBhbmUuRVJST1JfTUVTU0FHRSk7CisJCQl9IGVsc2UgeworCQkJCSgoUkJNYW5hZ2VyR1VJKWRpYWxvZy5nZXRQYXJlbnQoKSkudXBkYXRlRGlzcGxheVBhbmVscygpOworCQkJCSgoUkJNYW5hZ2VyR1VJKWRpYWxvZy5nZXRQYXJlbnQoKSkuaW52YWxpZGF0ZSgpOworCQkJCS8vKChSQk1hbmFnZXJHVUkpZGlhbG9nLmdldFBhcmVudCgpKS52YWxpZGF0ZU15VHJlZSgpOworCQkJCWRpYWxvZy5zZXRWaXNpYmxlKGZhbHNlKTsKKwkJCQlkaWFsb2cuZGlzcG9zZSgpOworCQkJfQorCQl9IGVsc2UgaWYgKGV2LmdldEtleUNvZGUoKSA9PSBLZXlFdmVudC5WS19FU0NBUEUpIHsKKwkJCWNsb3NlV2luZG93KCk7CisJCX0KKwl9CisJCisJcHJpdmF0ZSB2b2lkIGluaXRDb21wb25lbnRzKCl7CisJCWVuYWJsZUV2ZW50cyhBV1RFdmVudC5LRVlfRVZFTlRfTUFTSyk7CisJCS8vIEVycm9yIGNoZWNrCisJCWlmIChyYm0gPT0gbnVsbCB8fCByYm0uZ2V0QnVuZGxlcygpID09IG51bGwpIHsKKwkJCVN0cmluZyBhbGVydCA9IFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZXJyb3Jfbm9fYnVuZGxlX2Zvcl9pdGVtIik7CisJCQlKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyh0aGlzLCBhbGVydCwgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJlcnJvciIpLCBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKKwkJCWNsb3NlV2luZG93KCk7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCS8vIEluaXRpYWxpemUgdmFsdWVzCisJCUJ1bmRsZSBtYWluQnVuZGxlID0gKEJ1bmRsZSlyYm0uZ2V0QnVuZGxlcygpLmZpcnN0RWxlbWVudCgpOworCQlpZiAoZmlyc3RJbml0KSB7CisJCQlncm91cENvbWJvQm94ID0gbmV3IEpDb21ib0JveChtYWluQnVuZGxlLmdldEdyb3Vwc0FzVmVjdG9yKCkpOworCQkJaWYgKGdyb3VwTmFtZSAhPSBudWxsKSB7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBncm91cENvbWJvQm94LmdldEl0ZW1Db3VudCgpOyBpKyspIHsKKwkJCQkJQnVuZGxlR3JvdXAgYmcgPSAoQnVuZGxlR3JvdXApZ3JvdXBDb21ib0JveC5nZXRJdGVtQXQoaSk7CisJCQkJCWlmIChiZy5nZXROYW1lKCkuZXF1YWxzKGdyb3VwTmFtZSkpIHsKKwkJCQkJCWdyb3VwQ29tYm9Cb3guc2V0U2VsZWN0ZWRJbmRleChpKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCisJCWlmIChmaXJzdEluaXQgJiYgaXRlbSAhPSBudWxsKSB7CisJCQkvLyBXZSBhcmUgZWRpdGluZywgbm90IGNyZWF0aW5nIGFuIGl0ZW0KKwkJCWNyZWF0ZUJ1dHRvbi5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiYnV0dG9uX2VkaXQiKSk7CisJCQljcmVhdGVNb3JlQnV0dG9uLnNldFRleHQoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJidXR0b25fZWRpdF9tb3JlIikpOworCQkJaWYgKGl0ZW0uZ2V0S2V5KCkgIT0gbnVsbCkgbmFtZUZpZWxkLnNldFRleHQoaXRlbS5nZXRLZXkoKSk7CisJCQlpZiAoaXRlbS5nZXRDb21tZW50KCkgIT0gbnVsbCkgY29tbWVudEZpZWxkLnNldFRleHQoaXRlbS5nZXRDb21tZW50KCkpOworCQkJaWYgKGl0ZW0uZ2V0VHJhbnNsYXRpb24oKSAhPSBudWxsKSB0cmFuc0ZpZWxkLnNldFRleHQoaXRlbS5nZXRUcmFuc2xhdGlvbigpKTsKKwkJCWlmIChpdGVtLmdldExvb2t1cHMoKSAhPSBudWxsKSBsb29rdXBzID0gaXRlbS5nZXRMb29rdXBzKCk7CisJCX0KKwkJCisJCVN0cmluZyBjdXJyZW50VHJhbnMgPSB0cmFuc0ZpZWxkLmdldFRleHQoKTsKKwkJLy8gKiogTE9PS1VQUyAqKgorCQkvLyBVcGRhdGUgdGhlIGxvb2t1cHMgaWYgbmVjZXNzYXJ5CisJCWlmIChsb29rdXBCb3hlcyAhPSBudWxsKSB7CisJCQlmb3IgKGludCBpPTA7IGkgPCBsb29rdXBCb3hlcy5sZW5ndGg7IGkrKykgeworCQkJCVN0cmluZyBuYW1lVGV4dCA9IGxvb2t1cExhYmVsc1tpXS5nZXRUZXh0KCkudHJpbSgpOworCQkJCVN0cmluZyBuYW1lID0gbmFtZVRleHQuc3Vic3RyaW5nKG5hbWVUZXh0LmluZGV4T2YoInsiKSsxLG5hbWVUZXh0LmluZGV4T2YoIn0iKSk7CisJCQkJU3RyaW5nIHZhbHVlID0gbG9va3VwRmllbGRzW2ldLmdldFRleHQoKS50cmltKCk7CisJCQkJbG9va3Vwcy5wdXQobmFtZSx2YWx1ZSk7CisJCQl9CisJCX0KKwkJLy8gUmVtb3ZlIG9sZCBsb29rdXBzIGlmIG5lY2Vzc2FyeQorCQlFbnVtZXJhdGlvbiBrZXlzID0gbG9va3Vwcy5rZXlzKCk7CisJCXdoaWxlIChrZXlzLmhhc01vcmVFbGVtZW50cygpKSB7CisJCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpa2V5cy5uZXh0RWxlbWVudCgpOworCQkJaWYgKGN1cnJlbnRUcmFucy5pbmRleE9mKCJ7IiArIG5hbWUgKyAifSIpIDwgMCkgeworCQkJCWxvb2t1cHMucmVtb3ZlKG5hbWUpOworCQkJfQorCQl9CisJCS8vIEFkZCBuZXcgbG9va3VwcyBpZiBuZWNjZXNhcnkKKwkJaWYgKGN1cnJlbnRUcmFucyAhPSBudWxsICYmIGN1cnJlbnRUcmFucy5pbmRleE9mKCJ7IikgPj0gMCkgeworCQkJd2hpbGUgKGN1cnJlbnRUcmFucy5pbmRleE9mKCJ7IikgPj0gMCkgeworCQkJCWN1cnJlbnRUcmFucyA9IGN1cnJlbnRUcmFucy5zdWJzdHJpbmcoY3VycmVudFRyYW5zLmluZGV4T2YoInsiKSsxLGN1cnJlbnRUcmFucy5sZW5ndGgoKSk7CisJCQkJU3RyaW5nIG5hbWUgPSBjdXJyZW50VHJhbnMuc3Vic3RyaW5nKDAsY3VycmVudFRyYW5zLmluZGV4T2YoIn0iKSk7CisJCQkJaWYgKCFsb29rdXBzLmNvbnRhaW5zS2V5KG5hbWUpKSB7CisJCQkJCWxvb2t1cHMucHV0KG5hbWUsIiIpOworCQkJCX0KKwkJCX0KKwkJfQorCQkvLyBSZW1vdmUgY29tcG9uZW50cworCQlib3g1LnJlbW92ZUFsbCgpOworCQkKKwkJLy8gTm93IGNyZWF0ZSB0aGUgdmlzdWFsIGNvbXBvbmVudHMgZm9yIHRoZSBsb29rdXBzCisJCWlmIChsb29rdXBzLnNpemUoKSA+IDApIHsKKwkJCW5vTG9va3VwTGFiZWwgPSBudWxsOworCQkJbG9va3VwQm94ID0gbmV3IEJveChCb3hMYXlvdXQuWV9BWElTKTsKKwkJCWxvb2t1cEJveGVzID0gbmV3IEJveFtsb29rdXBzLnNpemUoKV07CisJCQlsb29rdXBGaWVsZHMgPSBuZXcgSlRleHRGaWVsZFtsb29rdXBzLnNpemUoKV07CisJCQlsb29rdXBMYWJlbHMgPSBuZXcgSkxhYmVsW2xvb2t1cHMuc2l6ZSgpXTsKKwkJCWludCBjb3VudCA9IDA7CisJCQlrZXlzID0gbG9va3Vwcy5rZXlzKCk7CisJCQl3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkgeworCQkJCVN0cmluZyBuYW1lID0gKFN0cmluZylrZXlzLm5leHRFbGVtZW50KCk7CisJCQkJU3RyaW5nIHZhbHVlID0gKFN0cmluZylsb29rdXBzLmdldChuYW1lKTsKKwkJCQlSQk1hbmFnZXJHVUkuZGVidWdNc2coIkxvb2t1cDogIiArIG5hbWUgKyAiIC0+ICIgKyB2YWx1ZSk7CisJCQkJUkJNYW5hZ2VyR1VJLmRlYnVnTXNnKGxvb2t1cHMudG9TdHJpbmcoKSk7CisJCQkJbG9va3VwQm94ZXNbY291bnRdID0gbmV3IEJveChCb3hMYXlvdXQuWF9BWElTKTsKKwkJCQlsb29rdXBGaWVsZHNbY291bnRdID0gbmV3IEpUZXh0RmllbGQoKHZhbHVlID09IG51bGwgPyAiIiA6IHZhbHVlKSk7CisJCQkJbG9va3VwTGFiZWxzW2NvdW50XSA9IG5ldyBKTGFiZWwoInsiICsgbmFtZSArICJ9Iik7CisJCQkJbG9va3VwQm94ZXNbY291bnRdLmFkZChCb3guY3JlYXRlSG9yaXpvbnRhbEdsdWUoKSk7CisJCQkJbG9va3VwQm94ZXNbY291bnRdLmFkZChsb29rdXBMYWJlbHNbY291bnRdKTsKKwkJCQlsb29rdXBCb3hlc1tjb3VudF0uYWRkKEJveC5jcmVhdGVIb3Jpem9udGFsU3RydXQoNSkpOworCQkJCWxvb2t1cEJveGVzW2NvdW50XS5hZGQobG9va3VwRmllbGRzW2NvdW50XSk7CisJCQkJbG9va3VwQm94LmFkZChsb29rdXBCb3hlc1tjb3VudF0pOworCQkJCWNvdW50Kys7CisJCQl9CisJCX0gZWxzZSB7CisJCQlsb29rdXBCb3ggPSBudWxsOworCQkJbG9va3VwQm94ZXMgPSBudWxsOworCQkJbG9va3VwRmllbGRzID0gbnVsbDsKKwkJCWxvb2t1cExhYmVscyA9IG51bGw7CisJCQlub0xvb2t1cExhYmVsID0gbmV3IEpMYWJlbChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm5vbmUiKSk7CisJCX0KKwkJCisJCS8vIFNldCB1cCB0aGUgY29tcG9uZW50cworCQlpZiAoZmlyc3RJbml0KSB7CisJCQlncm91cExhYmVsLnNldFByZWZlcnJlZFNpemUobGVmdERpbSk7CisJCQlncm91cENvbWJvQm94LnNldFByZWZlcnJlZFNpemUocmlnaHREaW0pOworCQkJbmFtZUxhYmVsLnNldFByZWZlcnJlZFNpemUobGVmdERpbSk7CisJCQluYW1lRmllbGQuc2V0Q29sdW1ucygzMCk7CisJCQljb21tZW50TGFiZWwuc2V0UHJlZmVycmVkU2l6ZShsZWZ0RGltKTsKKwkJCWNvbW1lbnRGaWVsZC5zZXRDb2x1bW5zKDMwKTsKKwkJCXRyYW5zTGFiZWwuc2V0UHJlZmVycmVkU2l6ZShsZWZ0RGltKTsKKwkJCXRyYW5zRmllbGQuc2V0Q29sdW1ucygzMCk7CisJCQlsb29rdXBMYWJlbC5zZXRQcmVmZXJyZWRTaXplKGxlZnREaW0pOworCQkJCisJCQlib3gxLmFkZChncm91cExhYmVsKTsgYm94MS5hZGQoZ3JvdXBDb21ib0JveCk7CisJCQlib3gyLmFkZChuYW1lTGFiZWwpOyBib3gyLmFkZChuYW1lRmllbGQpOworCQkJYm94NC5hZGQoY29tbWVudExhYmVsKTsgYm94NC5hZGQoY29tbWVudEZpZWxkKTsKKwkJCWJveDMuYWRkKHRyYW5zTGFiZWwpOyBib3gzLmFkZCh0cmFuc0ZpZWxkKTsKKwkJCQorCQkJY3JlYXRlQnV0dG9uLnNldE1uZW1vbmljKFJCTWFuYWdlck1lbnVCYXIuZ2V0S2V5RXZlbnRLZXkoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJidXR0b25fY3JlYXRlX3RyaWdnZXIiKSkpOworCQkJY3JlYXRlTW9yZUJ1dHRvbi5zZXRNbmVtb25pYyhSQk1hbmFnZXJNZW51QmFyLmdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiYnV0dG9uX2NyZWF0ZV9tb3JlX3RyaWdnZXIiKSkpOworCQkJZ2V0Um9vdFBhbmUoKS5zZXREZWZhdWx0QnV0dG9uKGNyZWF0ZUJ1dHRvbik7CisJCX0KKwkJYm94NS5hZGQoQm94LmNyZWF0ZUhvcml6b250YWxHbHVlKCkpOyBib3g1LmFkZChsb29rdXBMYWJlbCk7IGJveDUuYWRkKEJveC5jcmVhdGVIb3Jpem9udGFsU3RydXQoNSkpOworCQlpZiAobm9Mb29rdXBMYWJlbCAhPSBudWxsKSB7CisJCQlub0xvb2t1cExhYmVsLnNldFByZWZlcnJlZFNpemUocmlnaHREaW0pOworCQkJYm94NS5hZGQobm9Mb29rdXBMYWJlbCk7CisJCX0KKwkJZWxzZQorCQkJYm94NS5hZGQobG9va3VwQm94KTsKKwkJaWYgKGZpcnN0SW5pdCkgeworCQkJYm94Ni5hZGQoY3JlYXRlQnV0dG9uKTsKKwkJCWJveDYuYWRkKEJveC5jcmVhdGVIb3Jpem9udGFsU3RydXQoNSkpOworCQkJaWYgKGl0ZW0gPT0gbnVsbCkKKwkJCQlib3g2LmFkZChjcmVhdGVNb3JlQnV0dG9uKTsKKwkJCWJveDYuYWRkKEJveC5jcmVhdGVIb3Jpem9udGFsU3RydXQoNSkpOworCQkJYm94Ni5hZGQoY2FuY2VsQnV0dG9uKTsKKwkJfQorCQkKKwkJaW5zdHJ1Y3Rpb25zTGFiZWwuc2V0Qm9yZGVyKEJvcmRlckZhY3RvcnkuY3JlYXRlRXRjaGVkQm9yZGVyKCkpOworCQkKKwkJLy8gQWRkIHRoZSBhcHByb3ByaWF0ZSBsaXN0ZW5lcnMKKwkJaWYgKGZpcnN0SW5pdCkgeworCQkJY2FuY2VsQnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKKwkJCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXYpIHsKKwkJCQkJSkRpYWxvZyBkaWFsb2cgPSAoSkRpYWxvZykoKEpCdXR0b24pZXYuZ2V0U291cmNlKCkpLmdldFBhcmVudCgpLmdldFBhcmVudCgpLmdldFBhcmVudCgpLmdldFBhcmVudCgpLmdldFBhcmVudCgpLmdldFBhcmVudCgpOworCQkJCQlkaWFsb2cuc2V0VmlzaWJsZShmYWxzZSk7CisJCQkJCWRpYWxvZy5kaXNwb3NlKCk7CisJCQkJfQorCQkJfSk7CisJCQorCQkJY3JlYXRlQnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKKwkJCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXYpIHsKKwkJCQkJQnVuZGxlSXRlbUNyZWF0aW9uRGlhbG9nIGRpYWxvZyA9CisJCQkJCQkoQnVuZGxlSXRlbUNyZWF0aW9uRGlhbG9nKSgoSkJ1dHRvbilldi5nZXRTb3VyY2UoKSkuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCk7CisJCQkJCWJvb2xlYW4gc3VjY2VzcyA9IGZhbHNlOworCQkJCQlpZiAoZGlhbG9nLml0ZW0gPT0gbnVsbCkgc3VjY2VzcyA9IGRpYWxvZy5jcmVhdGVJdGVtKCk7CisJCQkJCWVsc2Ugc3VjY2VzcyA9IGRpYWxvZy5lZGl0SXRlbSgpOworCQkJCQlpZiAoIXN1Y2Nlc3MpIHsKKwkJCQkJCVN0cmluZyBhbGVydCA9IChpdGVtID09IG51bGwgPyBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImVycm9yX2NyZWF0ZV9pdGVtIikgOgorCQkJCQkJCQkJCQkJCSAgIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZXJyb3JfbW9kaWZ5X2l0ZW0iKSk7CisJCQkJCQlhbGVydCArPSAiICIgKyBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImVycm9yX3RyeV9hZ2Fpbl9pdGVtIik7CisJCQkJCQlKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyhkaWFsb2csIGFsZXJ0LCBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImVycm9yIiksCisJCQkJCQkJCQkJCQkJICBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCSgoUkJNYW5hZ2VyR1VJKWRpYWxvZy5nZXRQYXJlbnQoKSkudXBkYXRlRGlzcGxheVBhbmVscygpOworCQkJCQkJKChSQk1hbmFnZXJHVUkpZGlhbG9nLmdldFBhcmVudCgpKS5pbnZhbGlkYXRlKCk7CisJCQkJCQkvLygoUkJNYW5hZ2VyR1VJKWRpYWxvZy5nZXRQYXJlbnQoKSkudmFsaWRhdGVNeVRyZWUoKTsKKwkJCQkJCWRpYWxvZy5zZXRWaXNpYmxlKGZhbHNlKTsKKwkJCQkJCWRpYWxvZy5kaXNwb3NlKCk7CisJCQkJCX0KKwkJCQl9CisJCQl9KTsKKwkJCQorCQkJY3JlYXRlTW9yZUJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7CisJCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2KSB7CisJCQkJCUJ1bmRsZUl0ZW1DcmVhdGlvbkRpYWxvZyBkaWFsb2cgPQorCQkJCQkJKEJ1bmRsZUl0ZW1DcmVhdGlvbkRpYWxvZykoKEpCdXR0b24pZXYuZ2V0U291cmNlKCkpLmdldFBhcmVudCgpLmdldFBhcmVudCgpLmdldFBhcmVudCgpLmdldFBhcmVudCgpLmdldFBhcmVudCgpLmdldFBhcmVudCgpOworCQkJCQlib29sZWFuIHN1Y2Nlc3MgPSBmYWxzZTsKKwkJCQkJaWYgKGRpYWxvZy5pdGVtID09IG51bGwpIHN1Y2Nlc3MgPSBjcmVhdGVJdGVtKCk7CisJCQkJCWVsc2Ugc3VjY2VzcyA9IGRpYWxvZy5lZGl0SXRlbSgpOworCQkJCQlpZiAoIXN1Y2Nlc3MpIHsKKwkJCQkJCVN0cmluZyBhbGVydCA9IChpdGVtID09IG51bGwgPyBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImVycm9yX2NyZWF0ZV9pdGVtIikgOgorCQkJCQkJCQkJCQkJCSAgIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZXJyb3JfbW9kaWZ5X2l0ZW0iKSk7CisJCQkJCQlhbGVydCArPSAiICIgKyBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImVycm9yX3RyeV9hZ2Fpbl9pdGVtIik7CisJCQkJCQlKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyhkaWFsb2csIGFsZXJ0LCBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImVycm9yIiksCisJCQkJCQkJCQkJCQkJICBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCSgoUkJNYW5hZ2VyR1VJKWRpYWxvZy5nZXRQYXJlbnQoKSkudXBkYXRlRGlzcGxheVBhbmVscygpOworCQkJCQkJKChSQk1hbmFnZXJHVUkpZGlhbG9nLmdldFBhcmVudCgpKS5pbnZhbGlkYXRlKCk7CisJCQkJCQkvLygoUkJNYW5hZ2VyR1VJKWRpYWxvZy5nZXRQYXJlbnQoKSkudmFsaWRhdGVNeVRyZWUoKTsKKwkJCQkJCWRpYWxvZy5jbGVhckNvbXBvbmVudHMoKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0pOworCQkKKwkJCXRyYW5zRmllbGQuYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNMaXN0ZW5lcigpIHsKKwkJCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGV2KSB7fQorCQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGV2KSB7CisJCQkJCUJ1bmRsZUl0ZW1DcmVhdGlvbkRpYWxvZyBkaWFsb2cgPQorCQkJCQkJKEJ1bmRsZUl0ZW1DcmVhdGlvbkRpYWxvZykoKEpUZXh0RmllbGQpZXYuZ2V0U291cmNlKCkpLmdldFBhcmVudCgpLmdldFBhcmVudCgpLmdldFBhcmVudCgpLmdldFBhcmVudCgpLmdldFBhcmVudCgpLmdldFBhcmVudCgpOworCQkJCQlmaXJzdEluaXQgPSBmYWxzZTsKKwkJCQkJZGlhbG9nLmluaXRDb21wb25lbnRzKCk7CisJCQkJfQorCQkJfSk7CisJCX0KKwkJCisJCS8vIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgZnJhbWUKKwkJaWYgKGZpcnN0SW5pdCkKKwkJCXNldExvY2F0aW9uKG5ldyBqYXZhLmF3dC5Qb2ludCg1MCwgNTApKTsKKwkJbWFpbkJveC5yZW1vdmVBbGwoKTsKKwkJLy9tYWluQm94LmFkZChpbnN0cnVjdGlvbnNMYWJlbCk7CisJCW1haW5Cb3guYWRkKEJveC5jcmVhdGVWZXJ0aWNhbFN0cnV0KDUpKTsKKwkJbWFpbkJveC5hZGQoYm94MSk7CisJCW1haW5Cb3guYWRkKEJveC5jcmVhdGVWZXJ0aWNhbFN0cnV0KDUpKTsKKwkJbWFpbkJveC5hZGQoYm94Mik7CisJCW1haW5Cb3guYWRkKEJveC5jcmVhdGVWZXJ0aWNhbFN0cnV0KDUpKTsKKwkJbWFpbkJveC5hZGQoYm94Myk7CisJCW1haW5Cb3guYWRkKEJveC5jcmVhdGVWZXJ0aWNhbFN0cnV0KDUpKTsKKwkJbWFpbkJveC5hZGQoYm94NCk7CisJCW1haW5Cb3guYWRkKEJveC5jcmVhdGVWZXJ0aWNhbFN0cnV0KDUpKTsKKwkJaWYgKG5vTG9va3VwTGFiZWwgPT0gbnVsbCkgeworCQkJbWFpbkJveC5hZGQoYm94NSk7CisJCQltYWluQm94LmFkZChCb3guY3JlYXRlVmVydGljYWxTdHJ1dCg1KSk7CisJCX0KKwkJbWFpbkJveC5hZGQoYm94Nik7CisJCWdldENvbnRlbnRQYW5lKCkuYWRkKG1haW5Cb3gsIEJvcmRlckxheW91dC5DRU5URVIpOworCQl2YWxpZGF0ZVRyZWUoKTsKKwkJcGFjaygpOworCQlzZXRWaXNpYmxlKHRydWUpOworCQkvL3NldFJlc2l6YWJsZShmYWxzZSk7CisJCWZpcnN0SW5pdCA9IGZhbHNlOworCX0KKwkKKwl2b2lkIGNsb3NlV2luZG93KCkgeworCQlzZXRWaXNpYmxlKGZhbHNlKTsKKwkJZGlzcG9zZSgpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2d1aS9CdW5kbGVJdGVtRGlhbG9nLmphdmEgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZ3VpL0J1bmRsZUl0ZW1EaWFsb2cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmVjNWNlCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2d1aS9CdW5kbGVJdGVtRGlhbG9nLmphdmEKQEAgLTAsMCArMSwzMDEgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoQykgMjAwMC0yMDA3LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCAgKgorICogb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworcGFja2FnZSBjb20uaWJtLnJibS5ndWk7CisKK2ltcG9ydCBqYXZhLmF3dC4qOworaW1wb3J0IGphdmEuYXd0LmV2ZW50Lio7CitpbXBvcnQgamF2YS50ZXh0LkRhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLio7CisKK2ltcG9ydCBqYXZheC5zd2luZy4qOworCitpbXBvcnQgY29tLmlibS5yYm0uKjsKKworLy9BIGRpYWxvZyB3aGljaCBkaXNwbGF5cyB0aGUgcHJvcGVydGllcyBvZiBhIEJ1bmRsZSBJdGVtIGluIGFuIGVkaXRhYmxlIHdheQorCitjbGFzcyBCdW5kbGVJdGVtRGlhbG9nIGV4dGVuZHMgSkRpYWxvZyBpbXBsZW1lbnRzIEFjdGlvbkxpc3RlbmVyIHsKKwlSQk1hbmFnZXIgcmJtOworCUJ1bmRsZUl0ZW0gaXRlbTsKKwlTdHJpbmcgdXNlcjsKKwlib29sZWFuIGZpcnN0SW5pdCA9IHRydWU7CQorCQorCS8vIEhlbHBlciBkYXRhCisJaW50IGxlZnRfY29sX3dpZHRoID0gMTI1OworCWludCByaWdodF9jb2xfd2lkdGggPSAzNzU7CisJaW50IHJvd19oZWlnaHQgPSAyNTsKKwlEaW1lbnNpb24gbGVmdERpbSA9IG5ldyBEaW1lbnNpb24obGVmdF9jb2xfd2lkdGgsIHJvd19oZWlnaHQpOworCURpbWVuc2lvbiByaWdodERpbSA9IG5ldyBEaW1lbnNpb24ocmlnaHRfY29sX3dpZHRoLCByb3dfaGVpZ2h0KTsKKwkKKwkvLyBDb21wb25lbnRzCisJQm94IG1haW5Cb3ggPSBuZXcgQm94KEJveExheW91dC5ZX0FYSVMpOworCUJveCBib3gwID0gbmV3IEJveChCb3hMYXlvdXQuWF9BWElTKTsKKwlCb3ggYm94MSA9IG5ldyBCb3goQm94TGF5b3V0LlhfQVhJUyk7CisJQm94IGJveDIgPSBuZXcgQm94KEJveExheW91dC5YX0FYSVMpOworCUJveCBib3gzID0gbmV3IEJveChCb3hMYXlvdXQuWF9BWElTKTsKKwlCb3ggYm94NCA9IG5ldyBCb3goQm94TGF5b3V0LlhfQVhJUyk7CisJQm94IGJveDUgPSBuZXcgQm94KEJveExheW91dC5YX0FYSVMpOworCUJveCBib3g2ID0gbmV3IEJveChCb3hMYXlvdXQuWF9BWElTKTsKKwlCb3ggYm94NyA9IG5ldyBCb3goQm94TGF5b3V0LlhfQVhJUyk7CisJQm94IGJveDggPSBuZXcgQm94KEJveExheW91dC5YX0FYSVMpOworCQorCUpMYWJlbCBncm91cExhYmVsID0gbmV3IEpMYWJlbChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImRpYWxvZ19ncm91cCIpKTsgCisJSkxhYmVsIGtleUxhYmVsID0gbmV3IEpMYWJlbChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImRpYWxvZ19rZXkiKSk7CisJSkxhYmVsIGRlZlRyYW5zTGFiZWwgPSBuZXcgSkxhYmVsKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX2RlZmF1bHRfdHJhbnNsYXRpb24iKSk7CisJSkxhYmVsIHRyYW5zTGFiZWwgPSBuZXcgSkxhYmVsKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX3RyYW5zbGF0aW9uIikpOworCUpMYWJlbCBjb21tZW50TGFiZWwgPSBuZXcgSkxhYmVsKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX2NvbW1lbnQiKSk7CisJSkxhYmVsIGxvb2t1cExhYmVsID0gbmV3IEpMYWJlbChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImRpYWxvZ19sb29rdXBzIikpOworCUpMYWJlbCBjcmVhdGVkTGFiZWwgPSBuZXcgSkxhYmVsKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX2NyZWF0ZWQiKSk7CisJSkxhYmVsIG1vZGlmaWVkTGFiZWwgPSBuZXcgSkxhYmVsKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX21vZGlmaWVkIikpOworCQorCUpDb21ib0JveCBncm91cENvbWJvQm94OworCUpUZXh0RmllbGQga2V5RmllbGQ7CisJSlRleHRGaWVsZCB0cmFuc0ZpZWxkOworCUpUZXh0RmllbGQgZGVmVHJhbnNGaWVsZDsKKwlKVGV4dEZpZWxkIGNvbW1lbnRGaWVsZDsKKwlKTGFiZWwgY3JlYXRlZExhYmVsMjsKKwlKTGFiZWwgbW9kaWZpZWRMYWJlbDI7CisJSkxhYmVsIGxvb2t1cExhYmVsMiA9IG51bGw7CisJSkNoZWNrQm94IHRyYW5zQ2hlY2tCb3g7CisJSkJ1dHRvbiBzYXZlQnV0dG9uID0gbmV3IEpCdXR0b24oUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJidXR0b25fZWRpdCIpKTsKKwlKQnV0dG9uIGNhbmNlbEJ1dHRvbiA9IG5ldyBKQnV0dG9uKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiYnV0dG9uX2NhbmNlbCIpKTsKKwlCb3ggbG9va3VwQm94ID0gbnVsbDsKKwlCb3ggbG9va3Vwc1tdID0gbnVsbDsKKwlKTGFiZWwgbG9va3VwTGFiZWxzW10gPSBudWxsOworCUpUZXh0RmllbGQgbG9va3VwRmllbGRzW10gPSBudWxsOworCQorCXB1YmxpYyBCdW5kbGVJdGVtRGlhbG9nKFJCTWFuYWdlciByYm0sIEJ1bmRsZUl0ZW0gaXRlbSwgU3RyaW5nIHVzZXIsIEpGcmFtZSBmcmFtZSwgU3RyaW5nIHRpdGxlLCBib29sZWFuIG1vZGFsKSB7CisJCXN1cGVyKGZyYW1lLCB0aXRsZSwgbW9kYWwpOworCQl0aGlzLnJibSA9IHJibTsKKwkJdGhpcy51c2VyID0gdXNlcjsKKwkJdGhpcy5pdGVtID0gaXRlbTsKKwkJaW5pdENvbXBvbmVudHMoKTsKKwkJZW5hYmxlRXZlbnRzKEFXVEV2ZW50LktFWV9FVkVOVF9NQVNLKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0tleUV2ZW50KEtleUV2ZW50IGV2KSB7CisJCWlmIChldi5nZXRLZXlDb2RlKCkgPT0gS2V5RXZlbnQuVktfRU5URVIgJiYgZXYuZ2V0SUQoKSA9PSBLZXlFdmVudC5LRVlfUkVMRUFTRUQpIHsKKwkJCWFjdGlvblBlcmZvcm1lZChudWxsKTsKKwkJfSBlbHNlIGlmIChldi5nZXRLZXlDb2RlKCkgPT0gS2V5RXZlbnQuVktfQ0FOQ0VMKSB7CisJCQljbG9zZVdpbmRvdygpOworCQl9CisJfQorCQorCXByaXZhdGUgdm9pZCBpbml0Q29tcG9uZW50cygpeworCQkvLyBFcnJvciBjaGVjaworCQlpZiAoaXRlbSA9PSBudWxsKSBjbG9zZVdpbmRvdygpOworCQlpZiAoIWZpcnN0SW5pdCkgY2xvc2VXaW5kb3coKTsKKwkJCisJCS8vIEluaXRpYWxpemUgdmFsdWVzCisJCURhdGVGb3JtYXQgZGYgPSBEYXRlRm9ybWF0LmdldERhdGVJbnN0YW5jZShEYXRlRm9ybWF0LlNIT1JUKTsKKwkJQnVuZGxlIGJ1bmRsZSA9IGl0ZW0uZ2V0UGFyZW50R3JvdXAoKS5nZXRQYXJlbnRCdW5kbGUoKTsKKwkJCisJCS8vIExvb2t1cCB0aGUgZGVmYXVsdCB0cmFuc2xhdGlvbgorCQlTdHJpbmcgZGVmVHJhbnMgPSBuZXcgU3RyaW5nKCk7CisJCU9iamVjdCBvID0gKChCdW5kbGUpcmJtLmdldEJ1bmRsZXMoKS5maXJzdEVsZW1lbnQoKSkuYWxsSXRlbXMuZ2V0KGl0ZW0uZ2V0S2V5KCkpOworCQlpZiAobyAhPSBudWxsKQorCQkJZGVmVHJhbnMgPSAoKEJ1bmRsZUl0ZW0pbykuZ2V0VHJhbnNsYXRpb24oKTsKKwkJCisJCWtleUZpZWxkID0gbmV3IEpUZXh0RmllbGQoaXRlbS5nZXRLZXkoKSk7CisJCWtleUZpZWxkLnNldEVuYWJsZWQoZmFsc2UpOworCQlkZWZUcmFuc0ZpZWxkID0gbmV3IEpUZXh0RmllbGQoZGVmVHJhbnMpOworCQlkZWZUcmFuc0ZpZWxkLnNldEVuYWJsZWQoZmFsc2UpOworCQl0cmFuc0ZpZWxkID0gbmV3IEpUZXh0RmllbGQoaXRlbS5nZXRUcmFuc2xhdGlvbigpKTsKKwkJY29tbWVudEZpZWxkID0gbmV3IEpUZXh0RmllbGQoaXRlbS5nZXRDb21tZW50KCkpOworCQlTdHJpbmcgY3JlYXRlZFtdID0ge2RmLmZvcm1hdChpdGVtLmdldENyZWF0ZWREYXRlKCkpLCBpdGVtLmdldENyZWF0b3IoKX07CisJCVN0cmluZyBtb2RpZmllZFtdID0ge2RmLmZvcm1hdChpdGVtLmdldE1vZGlmaWVkRGF0ZSgpKSwgaXRlbS5nZXRNb2RpZmllcigpfTsKKwkJU3RyaW5nIGNyZWF0ZWRTdHJpbmcgPSBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImRpYWxvZ19kYXRlX3BlcnNvbiIsIGNyZWF0ZWQpOworCQlTdHJpbmcgbW9kaWZpZWRTdHJpbmcgPSBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImRpYWxvZ19kYXRlX3BlcnNvbiIsIG1vZGlmaWVkKTsKKwkJY3JlYXRlZExhYmVsMiA9IG5ldyBKTGFiZWwoaXRlbS5nZXRDcmVhdG9yKCkgPT0gbnVsbCA/IGRmLmZvcm1hdChpdGVtLmdldENyZWF0ZWREYXRlKCkpIDogY3JlYXRlZFN0cmluZyk7CisJCW1vZGlmaWVkTGFiZWwyID0gbmV3IEpMYWJlbChpdGVtLmdldE1vZGlmaWVyKCkgPT0gbnVsbCA/IGRmLmZvcm1hdChpdGVtLmdldE1vZGlmaWVkRGF0ZSgpKSA6IG1vZGlmaWVkU3RyaW5nKTsKKwkJdHJhbnNDaGVja0JveCA9IG5ldyBKQ2hlY2tCb3goUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJkaWFsb2dfY2hlY2tib3hfdHJhbnNsYXRlZCIpLGl0ZW0uaXNUcmFuc2xhdGVkKCkpOworCQkKKwkJZ3JvdXBDb21ib0JveCA9IG5ldyBKQ29tYm9Cb3goYnVuZGxlLmdldEdyb3Vwc0FzVmVjdG9yKCkpOworCQlmb3IgKGludCBpPTA7IGkgPCBncm91cENvbWJvQm94LmdldEl0ZW1Db3VudCgpOyBpKyspIHsKKwkJCUJ1bmRsZUdyb3VwIGJnID0gKEJ1bmRsZUdyb3VwKWdyb3VwQ29tYm9Cb3guZ2V0SXRlbUF0KGkpOworCQkJaWYgKGJnLmdldE5hbWUoKS5lcXVhbHMoaXRlbS5nZXRQYXJlbnRHcm91cCgpLmdldE5hbWUoKSkpIHsKKwkJCQlncm91cENvbWJvQm94LnNldFNlbGVjdGVkSW5kZXgoaSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJZ3JvdXBDb21ib0JveC5zZXRFbmFibGVkKGZhbHNlKTsKKwkJCisJCS8vIFNldCB1cCB0aGUgY29tcG9uZW50cworCQlncm91cExhYmVsLnNldFByZWZlcnJlZFNpemUobGVmdERpbSk7CisJCWdyb3VwQ29tYm9Cb3guc2V0UHJlZmVycmVkU2l6ZShyaWdodERpbSk7CisJCWtleUxhYmVsLnNldFByZWZlcnJlZFNpemUobGVmdERpbSk7CisJCS8va2V5RmllbGQuc2V0UHJlZmVycmVkU2l6ZShyaWdodERpbSk7CisJCWtleUZpZWxkLnNldENvbHVtbnMoMzApOworCQlkZWZUcmFuc0xhYmVsLnNldFByZWZlcnJlZFNpemUobGVmdERpbSk7CisJCS8vZGVmVHJhbnNGaWVsZC5zZXRQcmVmZXJyZWRTaXplKHJpZ2h0RGltKTsKKwkJZGVmVHJhbnNGaWVsZC5zZXRDb2x1bW5zKDMwKTsKKwkJdHJhbnNMYWJlbC5zZXRQcmVmZXJyZWRTaXplKGxlZnREaW0pOworCQkvL3RyYW5zRmllbGQuc2V0UHJlZmVycmVkU2l6ZShyaWdodERpbSk7CisJCXRyYW5zRmllbGQuc2V0Q29sdW1ucygzMCk7CisJCWNvbW1lbnRMYWJlbC5zZXRQcmVmZXJyZWRTaXplKGxlZnREaW0pOworCQkvL2NvbW1lbnRGaWVsZC5zZXRQcmVmZXJyZWRTaXplKHJpZ2h0RGltKTsKKwkJY29tbWVudEZpZWxkLnNldENvbHVtbnMoMzApOworCQlsb29rdXBMYWJlbC5zZXRQcmVmZXJyZWRTaXplKGxlZnREaW0pOworCQljcmVhdGVkTGFiZWwuc2V0UHJlZmVycmVkU2l6ZShsZWZ0RGltKTsKKwkJY3JlYXRlZExhYmVsMi5zZXRQcmVmZXJyZWRTaXplKHJpZ2h0RGltKTsKKwkJbW9kaWZpZWRMYWJlbC5zZXRQcmVmZXJyZWRTaXplKGxlZnREaW0pOworCQltb2RpZmllZExhYmVsMi5zZXRQcmVmZXJyZWRTaXplKHJpZ2h0RGltKTsKKwkJLy8gU3BlY2lhbCBzZXR1cCBmb3IgdGhlIGxvb2t1cCBpdGVtcyBpZiB0aGV5IGV4aXN0CisJCWlmIChpdGVtLmdldExvb2t1cHMoKS5zaXplKCkgPCAxKSB7CisJCQlsb29rdXBMYWJlbDIgPSBuZXcgSkxhYmVsKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibm9uZSIpKTsKKwkJCWxvb2t1cExhYmVsMi5zZXRQcmVmZXJyZWRTaXplKHJpZ2h0RGltKTsKKwkJfSBlbHNlIHsKKwkJCWxvb2t1cEJveCA9IG5ldyBCb3goQm94TGF5b3V0LllfQVhJUyk7CisJCQlsb29rdXBzID0gbmV3IEJveFtpdGVtLmdldExvb2t1cHMoKS5zaXplKCldOworCQkJbG9va3VwTGFiZWxzID0gbmV3IEpMYWJlbFtpdGVtLmdldExvb2t1cHMoKS5zaXplKCldOworCQkJbG9va3VwRmllbGRzID0gbmV3IEpUZXh0RmllbGRbaXRlbS5nZXRMb29rdXBzKCkuc2l6ZSgpXTsKKwkJCUVudW1lcmF0aW9uIGtleXMgPSBpdGVtLmdldExvb2t1cHMoKS5rZXlzKCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW0uZ2V0TG9va3VwcygpLnNpemUoKTsgaSsrKSB7CisJCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKWtleXMubmV4dEVsZW1lbnQoKTsKKwkJCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKWl0ZW0uZ2V0TG9va3VwcygpLmdldChuYW1lKTsKKwkJCQlSQk1hbmFnZXJHVUkuZGVidWdNc2coIlggLSBMb29rdXA6ICIgKyBuYW1lICsgIiAtPiAiICsgdmFsdWUpOworCQkJCWxvb2t1cHNbaV0gPSBuZXcgQm94KEJveExheW91dC5YX0FYSVMpOworCQkJCWxvb2t1cExhYmVsc1tpXSA9IG5ldyBKTGFiZWwoInsiICsgbmFtZSArICJ9Iik7CisJCQkJbG9va3VwTGFiZWxzW2ldLnNldFByZWZlcnJlZFNpemUobmV3IERpbWVuc2lvbigzMCxyb3dfaGVpZ2h0KSk7CisJCQkJbG9va3VwRmllbGRzW2ldID0gbmV3IEpUZXh0RmllbGQodmFsdWUpOworCQkJCWxvb2t1cEZpZWxkc1tpXS5zZXRQcmVmZXJyZWRTaXplKG5ldyBEaW1lbnNpb24ocmlnaHRfY29sX3dpZHRoLTM1LHJvd19oZWlnaHQpKTsKKwkJCQlsb29rdXBzW2ldLmFkZChCb3guY3JlYXRlSG9yaXpvbnRhbEdsdWUoKSk7CisJCQkJbG9va3Vwc1tpXS5hZGQobG9va3VwTGFiZWxzW2ldKTsKKwkJCQlsb29rdXBzW2ldLmFkZChCb3guY3JlYXRlSG9yaXpvbnRhbFN0cnV0KDUpKTsKKwkJCQlsb29rdXBzW2ldLmFkZChsb29rdXBGaWVsZHNbaV0pOworCQkJCWxvb2t1cEJveC5hZGQobG9va3Vwc1tpXSk7CisJCQl9CisJCX0KKwkJCisJCS8vIEFkZCB0aGUgYXBwcm9wcmlhdGUgbGlzdGVuZXJzCisJCWlmIChmaXJzdEluaXQpIHsKKwkJCWNhbmNlbEJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7CisJCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2KSB7CisJCQkJCUpEaWFsb2cgZGlhbG9nID0gKEpEaWFsb2cpKChKQnV0dG9uKWV2LmdldFNvdXJjZSgpKS5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKTsKKwkJCQkJZGlhbG9nLnNldFZpc2libGUoZmFsc2UpOworCQkJCQlkaWFsb2cuZGlzcG9zZSgpOworCQkJCX0KKwkJCX0pOworCQkKKwkJCXNhdmVCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIodGhpcyk7CisJCQlnZXRSb290UGFuZSgpLnNldERlZmF1bHRCdXR0b24oc2F2ZUJ1dHRvbik7CisKKwkJCXRyYW5zRmllbGQuYWRkRm9jdXNMaXN0ZW5lcihuZXcgVHJhbnNsYXRpb25Gb2N1c0xpc3RlbmVyKGl0ZW0uZ2V0VHJhbnNsYXRpb24oKSx0cmFuc0NoZWNrQm94KSk7CisJCX0KKwkJCisJCWJveDAuYWRkKGdyb3VwTGFiZWwpOyBib3gwLmFkZChncm91cENvbWJvQm94KTsKKwkJYm94MS5hZGQoa2V5TGFiZWwpOyBib3gxLmFkZChrZXlGaWVsZCk7CisJCWJveDguYWRkKGRlZlRyYW5zTGFiZWwpOyBib3g4LmFkZChkZWZUcmFuc0ZpZWxkKTsKKwkJYm94Mi5hZGQodHJhbnNMYWJlbCk7IGJveDIuYWRkKHRyYW5zRmllbGQpOworCQlib3gzLmFkZChjb21tZW50TGFiZWwpOyBib3gzLmFkZChjb21tZW50RmllbGQpOworCQlib3g0LmFkZChCb3guY3JlYXRlSG9yaXpvbnRhbEdsdWUoKSk7IGJveDQuYWRkKGxvb2t1cExhYmVsKTsKKwkJaWYgKGxvb2t1cExhYmVsMiAhPSBudWxsKSB7CisJCQlib3g0LmFkZChCb3guY3JlYXRlSG9yaXpvbnRhbFN0cnV0KDUpKTsKKwkJCWJveDQuYWRkKGxvb2t1cExhYmVsMik7CisJCX0gZWxzZSBpZiAobG9va3VwQm94ICE9IG51bGwpIHsKKwkJCWJveDQuYWRkKEJveC5jcmVhdGVIb3Jpem9udGFsU3RydXQoNSkpOworCQkJYm94NC5hZGQobG9va3VwQm94KTsKKwkJfQorCQlib3g1LmFkZChCb3guY3JlYXRlSG9yaXpvbnRhbEdsdWUoKSk7IGJveDUuYWRkKGNyZWF0ZWRMYWJlbCk7CisJCWJveDUuYWRkKEJveC5jcmVhdGVIb3Jpem9udGFsU3RydXQoNSkpOyBib3g1LmFkZChjcmVhdGVkTGFiZWwyKTsKKwkJYm94Ni5hZGQoQm94LmNyZWF0ZUhvcml6b250YWxHbHVlKCkpOyBib3g2LmFkZChtb2RpZmllZExhYmVsKTsKKwkJYm94Ni5hZGQoQm94LmNyZWF0ZUhvcml6b250YWxTdHJ1dCg1KSk7IGJveDYuYWRkKG1vZGlmaWVkTGFiZWwyKTsKKwkJYm94Ny5hZGQodHJhbnNDaGVja0JveCk7IGJveDcuYWRkKHNhdmVCdXR0b24pOyBib3g3LmFkZChjYW5jZWxCdXR0b24pOworCQkKKwkJLy8gQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBmcmFtZQorCQlzZXRMb2NhdGlvbihuZXcgamF2YS5hd3QuUG9pbnQoNTAsIDUwKSk7CisJCW1haW5Cb3gucmVtb3ZlQWxsKCk7CisJCW1haW5Cb3guYWRkKGJveDApOworCQltYWluQm94LmFkZChib3gxKTsKKwkJbWFpbkJveC5hZGQoYm94OCk7CisJCW1haW5Cb3guYWRkKGJveDIpOworCQltYWluQm94LmFkZChib3gzKTsKKwkJbWFpbkJveC5hZGQoQm94LmNyZWF0ZVZlcnRpY2FsU3RydXQoNSkpOworCQltYWluQm94LmFkZChib3g0KTsKKwkJbWFpbkJveC5hZGQoQm94LmNyZWF0ZVZlcnRpY2FsU3RydXQoNSkpOworCQltYWluQm94LmFkZChib3g1KTsKKwkJbWFpbkJveC5hZGQoYm94Nik7CisJCW1haW5Cb3guYWRkKEJveC5jcmVhdGVWZXJ0aWNhbFN0cnV0KDUpKTsKKwkJbWFpbkJveC5hZGQoYm94Nyk7CisJCWdldENvbnRlbnRQYW5lKCkuYWRkKG1haW5Cb3gsIEJvcmRlckxheW91dC5DRU5URVIpOworCQl2YWxpZGF0ZVRyZWUoKTsKKwkJcGFjaygpOworCQlzZXRWaXNpYmxlKHRydWUpOworCQkvL3NldFJlc2l6YWJsZShmYWxzZSk7CisJCQorCQlmaXJzdEluaXQgPSBmYWxzZTsKKwl9CisJCisJdm9pZCBjbG9zZVdpbmRvdygpIHsKKwkJc2V0VmlzaWJsZShmYWxzZSk7CisJCWRpc3Bvc2UoKTsKKwl9CisJCisJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2KSB7CisJCWlmIChldiA9PSBudWxsICYmIHRyYW5zRmllbGQuaGFzRm9jdXMoKSkgeworCQkJLy8gSWYgd2UgYXJlIGluIHRoZSB0cmFuc2xhdGlvbiBmaWVsZCwgdGhlbiBlbnRlciBzaG91bGQgY3JlYXRlIGEgbmV3IGxpbmUgY2hhcmFjdGVyLCBub3QgZXhpdCB0aGUgZGlhbG9nCisJCQlpbnQgY2FyZXRQb3MgPSB0cmFuc0ZpZWxkLmdldENhcmV0UG9zaXRpb24oKTsKKwkJCVN0cmluZyBvbGRUZXh0ID0gdHJhbnNGaWVsZC5nZXRUZXh0KCk7CisJCQl0cmFuc0ZpZWxkLnNldFRleHQob2xkVGV4dC5zdWJzdHJpbmcoMCxjYXJldFBvcykgKyAiXG4iICsgb2xkVGV4dC5zdWJzdHJpbmcoY2FyZXRQb3Msb2xkVGV4dC5sZW5ndGgoKSkpOworCQkJdHJhbnNGaWVsZC5zZXRDYXJldFBvc2l0aW9uKGNhcmV0UG9zKzEpOworCQkJdmFsaWRhdGUoKTsKKwkJCXNldFNpemUoZ2V0UHJlZmVycmVkU2l6ZSgpKTsKKwkJCXJldHVybjsKKwkJfQorCQkKKwkJLy8gVGhpcyBhY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlICdFZGl0JyBidXR0b24gaXMgcHJlc3NlZAorCQlpdGVtLnNldFRyYW5zbGF0aW9uKHRyYW5zRmllbGQuZ2V0VGV4dCgpLnRyaW0oKSk7CisJCWlmICghaXRlbS5nZXRLZXkoKS5lcXVhbHMoa2V5RmllbGQuZ2V0VGV4dCgpKSkgaXRlbS5zZXRLZXkoa2V5RmllbGQuZ2V0VGV4dCgpLnRyaW0oKSk7CisJCWl0ZW0uc2V0Q29tbWVudChjb21tZW50RmllbGQuZ2V0VGV4dCgpKTsKKwkJaXRlbS5zZXRNb2RpZmllZERhdGUobmV3IERhdGUoKSk7CisJCWl0ZW0uc2V0TW9kaWZpZXIodXNlcik7CisJCWl0ZW0uc2V0VHJhbnNsYXRlZCh0cmFuc0NoZWNrQm94LmlzU2VsZWN0ZWQoKSk7CisJCWlmICh0cmFuc0NoZWNrQm94LmlzU2VsZWN0ZWQoKSkgeworCQkJLy8gUmVtb3ZlIHRoaXMgaXRlbSBmcm9tIHRoZSB1bnRyYW5zbGF0ZWQgaXRlbXMsIGlmIGl0IGlzIHRoZXJlCisJCQlpdGVtLmdldFBhcmVudEdyb3VwKCkuZ2V0UGFyZW50QnVuZGxlKCkucmVtb3ZlVW50cmFuc2xhdGVkSXRlbShpdGVtLmdldEtleSgpKTsKKwkJfSBlbHNlIHsKKwkJCWl0ZW0uZ2V0UGFyZW50R3JvdXAoKS5nZXRQYXJlbnRCdW5kbGUoKS5hZGRVbnRyYW5zbGF0ZWRJdGVtKGl0ZW0pOworCQl9CisJCWlmIChsb29rdXBzICE9IG51bGwpIHsKKwkJCWl0ZW0uc2V0TG9va3VwcyhuZXcgSGFzaHRhYmxlKCkpOworCQkJZm9yIChpbnQgaT0wOyBpIDwgbG9va3Vwcy5sZW5ndGg7IGkrKykgeworCQkJCVN0cmluZyBuYW1lID0gbG9va3VwTGFiZWxzW2ldLmdldFRleHQoKS50cmltKCk7CisJCQkJaWYgKG5hbWUuaW5kZXhPZigieyIpID49IDApIG5hbWUgPSBuYW1lLnN1YnN0cmluZyhuYW1lLmluZGV4T2YoInsiKSsxLG5hbWUubGVuZ3RoKCkpOworCQkJCWlmIChuYW1lLmluZGV4T2YoIn0iKSA+PSAwKSBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5pbmRleE9mKCJ9IikpOworCQkJCVN0cmluZyB2YWx1ZSA9IGxvb2t1cEZpZWxkc1tpXS5nZXRUZXh0KCkudHJpbSgpOworCQkJCWl0ZW0uZ2V0TG9va3VwcygpLnB1dChuYW1lLHZhbHVlKTsKKwkJCX0KKwkJfQorCQljbG9zZVdpbmRvdygpOworCX0KK30KKyAKKy8qKgorICogQSBsaXN0ZW5lciB3aGljaCBjaGVja3MgYSB0cmFuc2xhdGlvbiBib3ggdG8gc2VlIGlmIGl0IGNoYW5nZXMsIGlmIGl0IGRvZXMsIGl0IG1hcmtzIHRoZSB3b3JkIGFzIHRyYW5zbGF0ZWQgaW4gYSBjaGVjayBib3gKKyAqLworY2xhc3MgVHJhbnNsYXRpb25Gb2N1c0xpc3RlbmVyIGltcGxlbWVudHMgRm9jdXNMaXN0ZW5lciB7CisJU3RyaW5nIG9yaWdpbmFsOworCUpDaGVja0JveCBjYm94OworCWJvb2xlYW4gc2VsZWN0ZWQ7CisJCisJcHVibGljIFRyYW5zbGF0aW9uRm9jdXNMaXN0ZW5lcihTdHJpbmcgb3JpZ2luYWwsIEpDaGVja0JveCBjYm94KSB7CisJCXRoaXMub3JpZ2luYWwgPSBvcmlnaW5hbDsKKwkJdGhpcy5jYm94ID0gY2JveDsKKwkJc2VsZWN0ZWQgPSBjYm94LmlzU2VsZWN0ZWQoKTsKKwl9CisJCisJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBldikge30KKwkKKwlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBldikgeworCQlKVGV4dEZpZWxkIGZpZWxkID0gKEpUZXh0RmllbGQpZXYuZ2V0U291cmNlKCk7CisJCWlmIChmaWVsZC5nZXRUZXh0KCkuZXF1YWxzKG9yaWdpbmFsKSkgeworCQkJY2JveC5zZXRTZWxlY3RlZChzZWxlY3RlZCk7CisJCQlyZXR1cm47CisJCX0KKwkJY2JveC5zZXRTZWxlY3RlZCh0cnVlKTsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9ndWkvUHJlZmVyZW5jZXNEaWFsb2cuamF2YSBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9ndWkvUHJlZmVyZW5jZXNEaWFsb2cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjNjZTg3Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2d1aS9QcmVmZXJlbmNlc0RpYWxvZy5qYXZhCkBAIC0wLDAgKzEsMjgyIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgICoKKyAqIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3BhY2thZ2UgY29tLmlibS5yYm0uZ3VpOworCitpbXBvcnQgamF2YS5hd3QuKjsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC4qOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKKworaW1wb3J0IGphdmF4LnN3aW5nLio7CisKK2ltcG9ydCBjb20uaWJtLnJibS4qOworCisvKioKKyAqIERpYWxvZyB0byBkaXNwbGF5IHRvIGEgdXNlciBhYm91dCB0aGVpciBwcmVmZXJlbmNlcy4gCisgKi8KK2NsYXNzIFByZWZlcmVuY2VzRGlhbG9nIGV4dGVuZHMgSkRpYWxvZyB7CisJU3RyaW5nIHVzZXJOYW1lOworCUxvY2FsZSBsb2NhbGU7CisJTG9va0FuZEZlZWwgbGFmOworCVJCTWFuYWdlckdVSSBndWk7CisJCisJLy8gKiogQ09NUE9ORU5UUyAqKgorCUpUZXh0RmllbGQgICBuYW1lRmllbGQ7CisJSlJhZGlvQnV0dG9uIG1hY2hpbmVSYWRpbzsKKwlKUmFkaW9CdXR0b24gZGVmaW5lZFJhZGlvOworCUpSYWRpb0J1dHRvbiBpc29SYWRpbzsKKwlKQ29tYm9Cb3ggICAgbWFjaGluZUNvbWJvOworCUpDb21ib0JveCAgICBkZWZpbmVkQ29tYm87CisJSkNvbWJvQm94ICAgIGlzb0xhbmdDb21ibzsKKwlKQ29tYm9Cb3ggICAgaXNvQ291bkNvbWJvOworCUpDb21ib0JveCAgICBsYWZDb21ibzsKKwlKQnV0dG9uICAgICAgb2tCdXR0b247CisJSkJ1dHRvbiAgICAgIGNhbmNlbEJ1dHRvbjsKKwkKKwlwdWJsaWMgUHJlZmVyZW5jZXNEaWFsb2coUkJNYW5hZ2VyR1VJIGd1aSkgeworCQlzdXBlcihndWksIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX3RpdGxlX3ByZWZlcmVuY2VzIiksIHRydWUpOworCQl0aGlzLmd1aSA9IGd1aTsKKwkJdXNlck5hbWUgPSBndWkuZ2V0VXNlcigpOworCQlsb2NhbGUgPSBSZXNvdXJjZXMuZ2V0TG9jYWxlKCk7CisJCWxhZiA9IFVJTWFuYWdlci5nZXRMb29rQW5kRmVlbCgpOworCQkKKwkJaW5pdENvbXBvbmVudHMoKTsKKwkJZW5hYmxlRXZlbnRzKEFXVEV2ZW50LktFWV9FVkVOVF9NQVNLKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0tleUV2ZW50KEtleUV2ZW50IGV2KSB7CisJCWlmIChldi5nZXRLZXlDb2RlKCkgPT0gS2V5RXZlbnQuVktfRU5URVIpIHsKKwkJCXVwZGF0ZVByZWZlcmVuY2VzKCk7CisJCX0gZWxzZSBpZiAoZXYuZ2V0S2V5Q29kZSgpID09IEtleUV2ZW50LlZLX0NBTkNFTCkgeworCQkJdGhpc1dpbmRvd0Nsb3NpbmcoKTsKKwkJfQorCX0KKwkKKwlwcml2YXRlIHZvaWQgaW5pdENvbXBvbmVudHMoKSB7CisJCVVJTWFuYWdlci5Mb29rQW5kRmVlbEluZm8gbGFmaVtdID0gVUlNYW5hZ2VyLmdldEluc3RhbGxlZExvb2tBbmRGZWVscygpOworCQlTdHJpbmcgbGFmbltdID0gbmV3IFN0cmluZ1tsYWZpLmxlbmd0aF07CisJCWZvciAoaW50IGk9MDsgaSA8IGxhZmkubGVuZ3RoOyBpKyspIHsKKwkJCWxhZm5baV0gPSBsYWZpW2ldLmdldE5hbWUoKTsKKwkJfQorCQkKKwkJLy8gQ09NUE9ORU5UUworCQkKKwkJSlBhbmVsIHBhbmVsMSA9IG5ldyBKUGFuZWwoKTsKKwkJSlBhbmVsIHBhbmVsMiA9IG5ldyBKUGFuZWwoKTsKKwkJSlBhbmVsIHBhbmVsMyA9IG5ldyBKUGFuZWwoKTsKKwkJSlBhbmVsIHBhbmVsNCA9IG5ldyBKUGFuZWwoKTsKKwkJQm94ICAgIG1haW5Cb3ggPSBuZXcgQm94KEJveExheW91dC5ZX0FYSVMpOworCQlCb3ggICAgbG9jYWxlQm94MSA9IG5ldyBCb3goQm94TGF5b3V0LllfQVhJUyk7CisJCUJveCAgICBsb2NhbGVCb3gyID0gbmV3IEJveChCb3hMYXlvdXQuWV9BWElTKTsKKwkJSlBhbmVsIGxvY2FsZVBhbmVsID0gbmV3IEpQYW5lbCgpOworCQkKKwkJRGltZW5zaW9uIGxvY2FsZURpbTEgPSBuZXcgRGltZW5zaW9uKDIwMCwyNSk7CisJCURpbWVuc2lvbiBsb2NhbGVEaW0yID0gbmV3IERpbWVuc2lvbigxNTAsMjUpOworCQlEaW1lbnNpb24gbG9jYWxlRGltMyA9IG5ldyBEaW1lbnNpb24oNTAsMjUpOworCQkKKwkJSkxhYmVsIG5hbWVMYWJlbCA9IG5ldyBKTGFiZWwoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJkaWFsb2dfcHJlZmVyZW5jZXNfdXNlcm5hbWUiKSk7CisJCUpMYWJlbCBsYWZMYWJlbCA9IG5ldyBKTGFiZWwoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJkaWFsb2dfcHJlZmVyZW5jZXNfbG9va2FuZGZlZWwiKSk7CisJCUpMYWJlbCB3YXJuTGFiZWwgPSBuZXcgSkxhYmVsKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX3ByZWZlcmVuY2VzX2xvY2FsZV93YXJuaW5nIikpOworCQlKTGFiZWwgdW5kZXJzY29yZUxhYmVsID0gbmV3IEpMYWJlbCgiXyIpOworCQkKKwkJbmFtZUZpZWxkID0gbmV3IEpUZXh0RmllbGQodXNlck5hbWUpOworCQltYWNoaW5lUmFkaW8gPSBuZXcgSlJhZGlvQnV0dG9uKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX3ByZWZlcmVuY2VzX2xvY2FsZV9tYWNoaW5lIiksIGZhbHNlKTsKKwkJZGVmaW5lZFJhZGlvID0gbmV3IEpSYWRpb0J1dHRvbihSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImRpYWxvZ19wcmVmZXJlbmNlc19sb2NhbGVfZGVmaW5lZCIpLCB0cnVlKTsKKwkJaXNvUmFkaW8gPSBuZXcgSlJhZGlvQnV0dG9uKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX3ByZWZlcmVuY2VzX2xvY2FsZV9pc28iKSwgZmFsc2UpOworCQltYWNoaW5lQ29tYm8gPSBuZXcgSkNvbWJvQm94KExvY2FsZS5nZXRBdmFpbGFibGVMb2NhbGVzKCkpOworCQlkZWZpbmVkQ29tYm8gPSBuZXcgSkNvbWJvQm94KFJlc291cmNlcy5nZXRBdmFpbGFibGVMb2NhbGVzKCkpOworCQlpc29MYW5nQ29tYm8gPSBuZXcgSkNvbWJvQm94KExvY2FsZS5nZXRJU09MYW5ndWFnZXMoKSk7CisJCWlzb0NvdW5Db21ibyA9IG5ldyBKQ29tYm9Cb3goTG9jYWxlLmdldElTT0NvdW50cmllcygpKTsKKwkJbGFmQ29tYm8gPSBuZXcgSkNvbWJvQm94KGxhZm4pOworCQlva0J1dHRvbiA9IG5ldyBKQnV0dG9uKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiYnV0dG9uX3VwZGF0ZSIpKTsKKwkJY2FuY2VsQnV0dG9uID0gbmV3IEpCdXR0b24oUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJidXR0b25fY2FuY2VsIikpOworCQkKKwkJbWFjaGluZVJhZGlvLnNldFByZWZlcnJlZFNpemUobG9jYWxlRGltMSk7CisJCWRlZmluZWRSYWRpby5zZXRQcmVmZXJyZWRTaXplKGxvY2FsZURpbTEpOworCQlpc29SYWRpby5zZXRQcmVmZXJyZWRTaXplKGxvY2FsZURpbTEpOworCQkKKwkJbmFtZUxhYmVsLnNldFByZWZlcnJlZFNpemUobG9jYWxlRGltMSk7CisJCWxhZkxhYmVsLnNldFByZWZlcnJlZFNpemUobG9jYWxlRGltMSk7CisJCQorCQkvL2xvY2FsZVBhbmVsLnNldFByZWZlcnJlZFNpemUobG9jYWxlRGltMik7CisJCW1hY2hpbmVDb21iby5zZXRQcmVmZXJyZWRTaXplKGxvY2FsZURpbTIpOworCQlkZWZpbmVkQ29tYm8uc2V0UHJlZmVycmVkU2l6ZShsb2NhbGVEaW0yKTsKKwkJCisJCW5hbWVGaWVsZC5zZXRQcmVmZXJyZWRTaXplKGxvY2FsZURpbTIpOworCQlsYWZDb21iby5zZXRQcmVmZXJyZWRTaXplKGxvY2FsZURpbTIpOworCQkKKwkJaXNvTGFuZ0NvbWJvLnNldFByZWZlcnJlZFNpemUobG9jYWxlRGltMyk7CisJCWlzb0NvdW5Db21iby5zZXRQcmVmZXJyZWRTaXplKGxvY2FsZURpbTMpOworCQkKKwkJLy8gU2VsZWN0IHRoZSBhcHByb3ByaWF0ZSBlbnRyaWVzIGluIHRoZSBjb21ibyBib3hlcworCQlTdHJpbmcgbGFmbmFtZSA9IFVJTWFuYWdlci5nZXRMb29rQW5kRmVlbCgpLmdldE5hbWUoKTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBsYWZDb21iby5nZXRJdGVtQ291bnQoKTsgaSsrKSB7CisJCQlpZiAobGFmQ29tYm8uZ2V0SXRlbUF0KGkpLnRvU3RyaW5nKCkuZXF1YWxzKGxhZm5hbWUpKSB7CisJCQkJbGFmQ29tYm8uc2V0U2VsZWN0ZWRJbmRleChpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlTdHJpbmcgbG9jbmFtZSA9IFJlc291cmNlcy5nZXRMb2NhbGUoKS50b1N0cmluZygpOworCQlTdHJpbmcgbG9jbGFuZyA9IFJlc291cmNlcy5nZXRMb2NhbGUoKS5nZXRMYW5ndWFnZSgpOworCQlTdHJpbmcgbG9jY291biA9IFJlc291cmNlcy5nZXRMb2NhbGUoKS5nZXRDb3VudHJ5KCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFjaGluZUNvbWJvLmdldEl0ZW1Db3VudCgpOyBpKyspIHsKKwkJCWlmIChtYWNoaW5lQ29tYm8uZ2V0SXRlbUF0KGkpLnRvU3RyaW5nKCkuZXF1YWxzSWdub3JlQ2FzZShsb2NuYW1lKSkgeworCQkJCW1hY2hpbmVDb21iby5zZXRTZWxlY3RlZEluZGV4KGkpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWZvciAoaW50IGkgPSAwOyBpIDwgZGVmaW5lZENvbWJvLmdldEl0ZW1Db3VudCgpOyBpKyspIHsKKwkJCWlmIChkZWZpbmVkQ29tYm8uZ2V0SXRlbUF0KGkpLnRvU3RyaW5nKCkuZXF1YWxzSWdub3JlQ2FzZShsb2NuYW1lKSkgeworCQkJCWRlZmluZWRDb21iby5zZXRTZWxlY3RlZEluZGV4KGkpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWZvciAoaW50IGkgPSAwOyBpIDwgaXNvTGFuZ0NvbWJvLmdldEl0ZW1Db3VudCgpOyBpKyspIHsKKwkJCWlmIChpc29MYW5nQ29tYm8uZ2V0SXRlbUF0KGkpLnRvU3RyaW5nKCkuZXF1YWxzSWdub3JlQ2FzZShsb2NsYW5nKSkgeworCQkJCWlzb0xhbmdDb21iby5zZXRTZWxlY3RlZEluZGV4KGkpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWZvciAoaW50IGkgPSAwOyBpIDwgaXNvQ291bkNvbWJvLmdldEl0ZW1Db3VudCgpOyBpKyspIHsKKwkJCWlmIChpc29Db3VuQ29tYm8uZ2V0SXRlbUF0KGkpLnRvU3RyaW5nKCkuZXF1YWxzSWdub3JlQ2FzZShsb2Njb3VuKSkgeworCQkJCWlzb0NvdW5Db21iby5zZXRTZWxlY3RlZEluZGV4KGkpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCQorCQkvLyBTZXQgdGhlIHJhZGlvIGJ1dHRvbiBncm91cAorCQlCdXR0b25Hcm91cCBncm91cCA9IG5ldyBCdXR0b25Hcm91cCgpOworCQlncm91cC5hZGQobWFjaGluZVJhZGlvKTsKKwkJZ3JvdXAuYWRkKGRlZmluZWRSYWRpbyk7CisJCWdyb3VwLmFkZChpc29SYWRpbyk7CisJCQorCQluYW1lRmllbGQuc2V0Q29sdW1ucygxNSk7CisJCQorCQkvLyBBZGQgYWN0aW9uIGxpc3RlbmVycworCQljYW5jZWxCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgeworCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2KSB7CisJCQkJdGhpc1dpbmRvd0Nsb3NpbmcoKTsKKwkJCX0KKwkJfSk7CisJCQorCQlva0J1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXYpIHsKKwkJCQl1cGRhdGVQcmVmZXJlbmNlcygpOworCQkJfQorCQl9KTsKKwkJZ2V0Um9vdFBhbmUoKS5zZXREZWZhdWx0QnV0dG9uKG9rQnV0dG9uKTsKKwkJCisJCXBhbmVsMy5zZXRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVUaXRsZWRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVFdGNoZWRCb3JkZXIoKSwKKwkJCQkJCQkJCQkJCQkJICBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImRpYWxvZ19wcmVmZXJlbmNlc19sb2NhbGUiKSkpOworCQlwYW5lbDMuc2V0TGF5b3V0KG5ldyBCb3JkZXJMYXlvdXQoKSk7CisJCQorCQlsb2NhbGVQYW5lbC5hZGQoaXNvTGFuZ0NvbWJvKTsKKwkJbG9jYWxlUGFuZWwuYWRkKHVuZGVyc2NvcmVMYWJlbCk7CisJCWxvY2FsZVBhbmVsLmFkZChpc29Db3VuQ29tYm8pOworCQkKKwkJbG9jYWxlQm94MS5hZGQobWFjaGluZVJhZGlvKTsKKwkJbG9jYWxlQm94MS5hZGQoZGVmaW5lZFJhZGlvKTsKKwkJbG9jYWxlQm94MS5hZGQoaXNvUmFkaW8pOworCQlsb2NhbGVCb3gyLmFkZChtYWNoaW5lQ29tYm8pOworCQlsb2NhbGVCb3gyLmFkZChkZWZpbmVkQ29tYm8pOworCQlsb2NhbGVCb3gyLmFkZChsb2NhbGVQYW5lbCk7CisJCWxvY2FsZUJveDEuYWRkKEJveC5jcmVhdGVWZXJ0aWNhbFN0cnV0KDUpKTsKKwkJbG9jYWxlQm94Mi5hZGQoQm94LmNyZWF0ZVZlcnRpY2FsU3RydXQoNSkpOworCQkKKwkJcGFuZWwxLmFkZChuYW1lTGFiZWwpOworCQlwYW5lbDEuYWRkKG5hbWVGaWVsZCk7CisJCXBhbmVsMi5hZGQobGFmTGFiZWwpOworCQlwYW5lbDIuYWRkKGxhZkNvbWJvKTsKKwkJcGFuZWwzLmFkZChsb2NhbGVCb3gxLCBCb3JkZXJMYXlvdXQuV0VTVCk7CisJCXBhbmVsMy5hZGQobG9jYWxlQm94MiwgQm9yZGVyTGF5b3V0LkVBU1QpOworCQlwYW5lbDMuYWRkKHdhcm5MYWJlbCwgQm9yZGVyTGF5b3V0LlNPVVRIKTsKKwkJcGFuZWw0LmFkZChva0J1dHRvbik7CisJCXBhbmVsNC5hZGQoY2FuY2VsQnV0dG9uKTsKKwkJCisJCW1haW5Cb3guYWRkKHBhbmVsMSk7CisJCW1haW5Cb3guYWRkKHBhbmVsMik7CisJCW1haW5Cb3guYWRkKHBhbmVsMyk7CisJCW1haW5Cb3guYWRkKHBhbmVsNCk7CisJCQorCQlnZXRDb250ZW50UGFuZSgpLmFkZChtYWluQm94KTsKKwkJLy92YWxpZGF0ZSgpOworCQlwYWNrKCk7CisJCXNldFZpc2libGUodHJ1ZSk7CisJfQorCQorCXByaXZhdGUgdm9pZCB0aGlzV2luZG93Q2xvc2luZygpIHsKKwkJc2V0VmlzaWJsZShmYWxzZSk7CisJCWRpc3Bvc2UoKTsKKwl9CisJCisJdm9pZCB1cGRhdGVQcmVmZXJlbmNlcygpIHsKKwkJLy8gU2V0IHRoZSB1c2VyIG5hbWUKKwkJZ3VpLnNldFVzZXIobmFtZUZpZWxkLmdldFRleHQoKS50cmltKCkpOworCQkvLyBTZXQgdGhlIGxvb2sgYW5kIGZlZWwKKwkJdHJ5IHsKKwkJCVVJTWFuYWdlci5Mb29rQW5kRmVlbEluZm8gbGFmaVtdID0gVUlNYW5hZ2VyLmdldEluc3RhbGxlZExvb2tBbmRGZWVscygpOworCQkJZm9yIChpbnQgaT0wOyBpIDwgbGFmaS5sZW5ndGg7IGkrKykgeworCQkJCWlmIChsYWZpW2ldLmdldE5hbWUoKS5lcXVhbHMobGFmQ29tYm8uZ2V0U2VsZWN0ZWRJdGVtKCkudG9TdHJpbmcoKSkpIHsKKwkJCQkJVUlNYW5hZ2VyLnNldExvb2tBbmRGZWVsKGxhZmlbaV0uZ2V0Q2xhc3NOYW1lKCkpOworCQkJCQlndWkudXBkYXRlVUkoKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJU3lzdGVtLmVyci5wcmludGxuKCJDb3VsZCBub3QgY2hhbmdlIHRoZSBsb29rIGFuZCBmZWVsIik7CisJCQllLnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKKwkJfQorCQkvLyBTZXQgdGhlIGxvY2FsZQorCQlTdHJpbmcgbGFuZ3VhZ2UgPSBudWxsOworCQlTdHJpbmcgY291bnRyeSA9IG51bGw7CisJCVN0cmluZyB2YXJpYW50ID0gbnVsbDsKKwkJaWYgKGRlZmluZWRSYWRpby5pc1NlbGVjdGVkKCkpIHsKKwkJCVN0cmluZyBlbmNvZGluZyA9ICIiOworCQkJaWYgKGRlZmluZWRDb21iby5nZXRTZWxlY3RlZEl0ZW0oKSAhPSBudWxsKSB7CisJCQkJZW5jb2RpbmcgPSBkZWZpbmVkQ29tYm8uZ2V0U2VsZWN0ZWRJdGVtKCkudG9TdHJpbmcoKTsKKwkJCX0KKwkJCWxhbmd1YWdlID0gUmVzb3VyY2VzLmdldExhbmd1YWdlKGVuY29kaW5nKTsKKwkJCWNvdW50cnkgPSBSZXNvdXJjZXMuZ2V0Q291bnRyeShlbmNvZGluZyk7CisJCQl2YXJpYW50ID0gUmVzb3VyY2VzLmdldFZhcmlhbnQoZW5jb2RpbmcpOworCQkJUkJNYW5hZ2VyR1VJLmRlYnVnTXNnKCJCZWZvcmU6ICIgKyBsYW5ndWFnZSArICJfIiArIGNvdW50cnkgKyAiXyIgKyB2YXJpYW50KTsKKwkJCWlmIChjb3VudHJ5ID09IG51bGwpIGNvdW50cnkgPSBuZXcgU3RyaW5nKCk7CisJCQlpZiAodmFyaWFudCA9PSBudWxsKSBsb2NhbGUgPSBuZXcgTG9jYWxlKGxhbmd1YWdlLCBjb3VudHJ5KTsKKwkJCWVsc2UgbG9jYWxlID0gbmV3IExvY2FsZShsYW5ndWFnZSwgY291bnRyeSwgdmFyaWFudCk7CisJCQlSQk1hbmFnZXJHVUkuZGVidWdNc2coIkFmdGVyOiAiICsgbG9jYWxlLnRvU3RyaW5nKCkpOworCQl9IGVsc2UgaWYgKG1hY2hpbmVSYWRpby5pc1NlbGVjdGVkKCkpIHsKKwkJCVN0cmluZyBlbmNvZGluZyA9IG1hY2hpbmVDb21iby5nZXRTZWxlY3RlZEl0ZW0oKS50b1N0cmluZygpOworCQkJbGFuZ3VhZ2UgPSBSZXNvdXJjZXMuZ2V0TGFuZ3VhZ2UoZW5jb2RpbmcpOworCQkJY291bnRyeSA9IFJlc291cmNlcy5nZXRDb3VudHJ5KGVuY29kaW5nKTsKKwkJCXZhcmlhbnQgPSBSZXNvdXJjZXMuZ2V0VmFyaWFudChlbmNvZGluZyk7CisJCQlpZiAoY291bnRyeSA9PSBudWxsKSBjb3VudHJ5ID0gbmV3IFN0cmluZygpOworCQkJaWYgKHZhcmlhbnQgPT0gbnVsbCkgbG9jYWxlID0gbmV3IExvY2FsZShsYW5ndWFnZSwgY291bnRyeSk7CisJCQllbHNlIGxvY2FsZSA9IG5ldyBMb2NhbGUobGFuZ3VhZ2UsIGNvdW50cnksIHZhcmlhbnQpOworCQl9IGVsc2UgaWYgKGlzb1JhZGlvLmlzU2VsZWN0ZWQoKSkgeworCQkJbGFuZ3VhZ2UgPSBpc29MYW5nQ29tYm8uZ2V0U2VsZWN0ZWRJdGVtKCkudG9TdHJpbmcoKTsKKwkJCWNvdW50cnkgPSBpc29Db3VuQ29tYm8uZ2V0U2VsZWN0ZWRJdGVtKCkudG9TdHJpbmcoKTsKKwkJCWlmICh2YXJpYW50ID09IG51bGwpIGxvY2FsZSA9IG5ldyBMb2NhbGUobGFuZ3VhZ2UsIGNvdW50cnkpOworCQkJZWxzZSBsb2NhbGUgPSBuZXcgTG9jYWxlKGxhbmd1YWdlLCBjb3VudHJ5LCB2YXJpYW50KTsKKwkJfQorCQlSZXNvdXJjZXMuc2V0TG9jYWxlKGxvY2FsZSk7CisJCWd1aS51cGRhdGVMb2NhbGUobG9jYWxlKTsKKwkJCQorCQkvLyBXcml0ZSB0aGUgcHJlZmVyZW5jZXMKKwkJUHJlZmVyZW5jZXMuc2V0UHJlZmVyZW5jZSgidXNlcm5hbWUiLCBndWkuZ2V0VXNlcigpKTsKKwkJUHJlZmVyZW5jZXMuc2V0UHJlZmVyZW5jZSgibG9va2FuZGZlZWwiLCBVSU1hbmFnZXIuZ2V0TG9va0FuZEZlZWwoKS5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisJCVByZWZlcmVuY2VzLnNldFByZWZlcmVuY2UoImxvY2FsZSIsIGxvY2FsZS50b1N0cmluZygpKTsKKwkJdHJ5IHsKKwkJCVByZWZlcmVuY2VzLnNhdmVQcmVmZXJlbmNlcygpOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKwkJCUpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKHRoaXMsIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZXJyb3JfcHJlZmVyZW5jZXNfc2F2ZSIpLAorCQkJCQkJCQkJCSAgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJlcnJvciIpLCBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKKwkJCWlvZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7CisJCX0KKwkJCisJCS8vIENsb3NlIHRoZSB3aW5kb3cKKwkJdGhpc1dpbmRvd0Nsb3NpbmcoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vZ3VpL1JCR3JvdXBQYW5lbC5qYXZhIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2d1aS9SQkdyb3VwUGFuZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWI0MTlmCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2d1aS9SQkdyb3VwUGFuZWwuamF2YQpAQCAtMCwwICsxLDUzMCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDQsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kICAqCisgKiBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitwYWNrYWdlIGNvbS5pYm0ucmJtLmd1aTsKKworaW1wb3J0IGphdmEuYXd0Lio7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuKjsKKworaW1wb3J0IGphdmF4LnN3aW5nLio7CitpbXBvcnQgamF2YXguc3dpbmcudGFibGUuKjsKK2ltcG9ydCBqYXZheC5zd2luZy5ldmVudC4qOworCitpbXBvcnQgY29tLmlibS5yYm0uKjsKKworLyoqCisgKiBUaGUgY2xhc3MgdXNlZCB0byBkaXNwbGF5IGdyb3VwcworICovCitjbGFzcyBSQkdyb3VwUGFuZWwgZXh0ZW5kcyBKUGFuZWwgeworCVJCTWFuYWdlciByYm07CisJQnVuZGxlIGJ1bmRsZTsKKwlSQk1hbmFnZXJHVUkgbGlzdGVuZXI7CisJCisJLy8gQ29tcG9uZW50cworCUpMYWJlbCAgICAgIGpMYWJlbEdyb3VwVGl0bGU7CisJSkxhYmVsICAgICAgakxhYmVsR3JvdXBOYW1lVGl0bGU7CisJSkxhYmVsICAgICAgakxhYmVsR3JvdXBDb21tZW50VGl0bGU7CisJSkxhYmVsICAgICAgakxhYmVsR3JvdXBDb21tZW50OworCUpDb21ib0JveCAgIGpDb21ib0JveEdyb3VwOworCUpUYWJsZSAgICAgIGpUYWJsZUdyb3VwVGFibGU7CisJSlNjcm9sbFBhbmUgalNjcm9sbFBhbmVHcm91cFRhYmxlOworCQorCS8vIENvbXBvbmVudHMgLSBNYW5hZ2VyCisJSkxpc3QgICAgICAgakxpc3RHcm91cDsKKwlKQnV0dG9uICAgICBjcmVhdGVJdGVtQnV0dG9uOworCUpCdXR0b24gICAgIGNyZWF0ZUdyb3VwQnV0dG9uOworCUpCdXR0b24gICAgIGVkaXRJdGVtQnV0dG9uOworCUpCdXR0b24gICAgIGVkaXRHcm91cEJ1dHRvbjsKKwlKQnV0dG9uICAgICBkZWxldGVJdGVtQnV0dG9uOworCUpCdXR0b24gICAgIGRlbGV0ZUdyb3VwQnV0dG9uOworCUpQYW5lbCAgICAgIGl0ZW1QYW5lbDsKKwlKUGFuZWwgICAgICBncm91cFBhbmVsOworCQorCXB1YmxpYyBSQkdyb3VwUGFuZWwoUkJNYW5hZ2VyR1VJIGd1aSkgeworCQlzdXBlcigpOworCQlsaXN0ZW5lciA9IGd1aTsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0QnVuZGxlKEJ1bmRsZSBiKSB7CisJCXJibSA9IG51bGw7CisJCWlmIChidW5kbGUgPT0gbnVsbCkgeworCQkJYnVuZGxlID0gYjsKKwkJCWluaXRDb21wb25lbnRzKCk7CisJCX0gZWxzZSBpZiAoYnVuZGxlICE9IGIpIHsKKwkJCWJ1bmRsZSA9IGI7CisJCQl1cGRhdGVDb21wb25lbnRzKCk7CisJCX0KKwl9CisJCisJcHVibGljIHZvaWQgc2V0TWFuYWdlcihSQk1hbmFnZXIgbSkgeworCQlidW5kbGUgPSBudWxsOworCQlpZiAocmJtID09IG51bGwpIHsKKwkJCXJibSA9IG07CisJCQlpbml0Q29tcG9uZW50cygpOworCQl9IGVsc2UgaWYgKHJibSAhPSBtKSB7CisJCQlyYm0gPSBtOworCQkJdXBkYXRlQ29tcG9uZW50cygpOworCQl9CisJfQorCQorCXB1YmxpYyB2b2lkIHJlbW92ZUVsZW1lbnRzKCkgeworCQlpZiAocmJtICE9IG51bGwgfHwgYnVuZGxlICE9IG51bGwpIHsKKwkJCXJibSA9IG51bGw7CisJCQlidW5kbGUgPSBudWxsOworCQkJaW5pdENvbXBvbmVudHMoKTsKKwkJfQorCX0KKwkKKwkvLyBNYXJrcyB0aGUgc2VsZWN0ZWQgcmVzb3VyY2UgYXMgdHJhbnNsYXRlZCBhbmQgcmVtb3ZlcyBmcm9tIHRoaXMgdmlldworCXByaXZhdGUgdm9pZCBtYXJrU2VsZWN0ZWRSZXNvdXJjZUFzVHJhbnNsYXRlZCgpIHsKKwkJaWYgKGJ1bmRsZSA9PSBudWxsKSByZXR1cm47CisJCWlmIChqVGFibGVHcm91cFRhYmxlLmdldFNlbGVjdGVkUm93KCkgPCAwKSByZXR1cm47CisJCWlmIChqVGFibGVHcm91cFRhYmxlLmdldE1vZGVsKCkgaW5zdGFuY2VvZiBHcm91cEl0ZW1zVGFibGVNb2RlbCkgeworCQkJaW50IHJvdyA9IGpUYWJsZUdyb3VwVGFibGUuZ2V0U2VsZWN0ZWRSb3coKTsKKwkJCUdyb3VwSXRlbXNUYWJsZU1vZGVsIG1vZGVsID0gKEdyb3VwSXRlbXNUYWJsZU1vZGVsKWpUYWJsZUdyb3VwVGFibGUuZ2V0TW9kZWwoKTsKKwkJCUJ1bmRsZUl0ZW0gaXRlbSA9IG1vZGVsLmdldEJ1bmRsZUl0ZW0ocm93KTsKKwkJCWl0ZW0uc2V0VHJhbnNsYXRlZCh0cnVlKTsKKwkJCW1vZGVsLnVwZGF0ZSgpOworCQl9CisJfQorCQorCS8vIFJlbW92ZXMgdGhlIHNlbGVjdGVkIHJlc291cmNlIGZyb20gdGhlIHJlc291cmNlIGZpbGUKKwlwcml2YXRlIHZvaWQgZGVsZXRlU2VsZWN0ZWRSZXNvdXJjZSgpIHsKKwkJaWYgKGJ1bmRsZSA9PSBudWxsKSByZXR1cm47CisJCWlmIChqVGFibGVHcm91cFRhYmxlLmdldFNlbGVjdGVkUm93KCkgPCAwKSByZXR1cm47CisJCWlmIChqVGFibGVHcm91cFRhYmxlLmdldE1vZGVsKCkgaW5zdGFuY2VvZiBHcm91cEl0ZW1zVGFibGVNb2RlbCkgeworCQkJaW50IHJvdyA9IGpUYWJsZUdyb3VwVGFibGUuZ2V0U2VsZWN0ZWRSb3coKTsKKwkJCUdyb3VwSXRlbXNUYWJsZU1vZGVsIG1vZGVsID0gKEdyb3VwSXRlbXNUYWJsZU1vZGVsKWpUYWJsZUdyb3VwVGFibGUuZ2V0TW9kZWwoKTsKKwkJCUJ1bmRsZUl0ZW0gaXRlbSA9IG1vZGVsLmdldEJ1bmRsZUl0ZW0ocm93KTsKKwkJCWlmIChpdGVtLmdldFBhcmVudEdyb3VwKCkgIT0gbnVsbCAmJiBpdGVtLmdldFBhcmVudEdyb3VwKCkuZ2V0UGFyZW50QnVuZGxlKCkgIT0gbnVsbCkgeworCQkJCUJ1bmRsZSBwYXJlbnRCdW5kbGUgPSBpdGVtLmdldFBhcmVudEdyb3VwKCkuZ2V0UGFyZW50QnVuZGxlKCk7CisJCQkJcGFyZW50QnVuZGxlLnJlbW92ZUl0ZW0oaXRlbS5nZXRLZXkoKSk7CisJCQl9CisJCQltb2RlbC51cGRhdGUoKTsKKwkJfQorCX0KKwkJCisJcHJpdmF0ZSB2b2lkIGluaXRDb21wb25lbnRzKCkgeworCQkvLyBJbml0aWFsaXplIGNvbXBvbmVudHMKKwkJaWYgKGJ1bmRsZSAhPSBudWxsKSB7CisJCQlqTGFiZWxHcm91cFRpdGxlICAgICAgICAgID0gbmV3IEpMYWJlbChidW5kbGUubmFtZSk7CisJCQlqQ29tYm9Cb3hHcm91cCAgICAgICAgICAgID0gbmV3IEpDb21ib0JveChuZXcgR3JvdXBDb21ib0JveE1vZGVsKGJ1bmRsZSkpOworCQkJCisJCQlqVGFibGVHcm91cFRhYmxlICAgICAgICAgID0gbmV3IEpUYWJsZShuZXcgR3JvdXBJdGVtc1RhYmxlTW9kZWwoKEJ1bmRsZUdyb3VwKWpDb21ib0JveEdyb3VwLmdldFNlbGVjdGVkSXRlbSgpKSk7CisJCQlqU2Nyb2xsUGFuZUdyb3VwVGFibGUgICAgID0gbmV3IEpTY3JvbGxQYW5lKGpUYWJsZUdyb3VwVGFibGUpOworCQkJakxhYmVsR3JvdXBOYW1lVGl0bGUgICAgICA9IG5ldyBKTGFiZWwoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJiYXNlZ3JvdXBfZ3JvdXBfbmFtZSIpKTsKKwkJCWpMYWJlbEdyb3VwQ29tbWVudFRpdGxlICAgPSBuZXcgSkxhYmVsKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiYmFzZWdyb3VwX2dyb3VwX2NvbW1lbnQiKSk7CisJCQlqTGFiZWxHcm91cENvbW1lbnQgICAgICAgID0gbmV3IEpMYWJlbCgoKEJ1bmRsZUdyb3VwKWpDb21ib0JveEdyb3VwLmdldFNlbGVjdGVkSXRlbSgpKS5nZXRDb21tZW50KCkpOworCQkJCisJCQkvLyBMb3dlciBwYW5lbCBjb21wb25lbnRzCisJCQlKUGFuZWwgIGxvd2VyUGFuZWwgPSBuZXcgSlBhbmVsKCk7CisJCQlKQnV0dG9uIGRlbGV0ZUJ1dHRvbiA9IG5ldyBKQnV0dG9uKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiYnV0dG9uX2RlbGV0ZV9yZXNvdXJjZSIpKTsKKwkJCUpCdXR0b24gdHJhbnNsYXRlQnV0dG9uID0gbmV3IEpCdXR0b24oUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJidXR0b25fbWFya190cmFuc2xhdGVkIikpOworCQkJCisJCQlkZWxldGVCdXR0b24uc2V0TW5lbW9uaWMoUkJNYW5hZ2VyTWVudUJhci5nZXRLZXlFdmVudEtleShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImJ1dHRvbl9kZWxldGVfcmVzb3VyY2VfdHJpZ2dlciIpKSk7CisJCQl0cmFuc2xhdGVCdXR0b24uc2V0TW5lbW9uaWMoUkJNYW5hZ2VyTWVudUJhci5nZXRLZXlFdmVudEtleShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImJ1dHRvbl9tYXJrX3RyYW5zbGF0ZWRfdHJpZ2dlciIpKSk7CisJCQlsb3dlclBhbmVsLnNldEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZVRpdGxlZEJvcmRlcihSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImxhbmd1YWdldW50cmFuc19zZWxlY3RlZF9yZXNvdXJjZXNfb3B0aW9ucyIpKSk7CisJCQlsb3dlclBhbmVsLnNldExheW91dChuZXcgR3JpZExheW91dCgxLDIpKTsKKwkJCQorCQkJakxhYmVsR3JvdXBOYW1lVGl0bGUuc2V0SG9yaXpvbnRhbEFsaWdubWVudChTd2luZ0NvbnN0YW50cy5MRUZUKTsKKwkJCQorCQkJalRhYmxlR3JvdXBUYWJsZS5zZXRTZWxlY3Rpb25Nb2RlKExpc3RTZWxlY3Rpb25Nb2RlbC5TSU5HTEVfU0VMRUNUSU9OKTsKKwkJCWpUYWJsZUdyb3VwVGFibGUuYWRkTW91c2VMaXN0ZW5lcihsaXN0ZW5lcik7CisJCQkKKwkJCWpDb21ib0JveEdyb3VwLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBHcm91cENvbWJvQWN0aW9uTGlzdGVuZXIodGhpcykpOworCQkJCisJCQlqTGFiZWxHcm91cFRpdGxlLnNldEZvbnQobmV3IEZvbnQoIlNhbnNTZXJpZiIsRm9udC5QTEFJTiwxOCkpOworCQkJCisJCQkvLyBBZGQgYWN0aW9uIGxpc3RlbmVycworCQkJZGVsZXRlQnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpeworCQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldikgeworCQkJCQlkZWxldGVTZWxlY3RlZFJlc291cmNlKCk7CisJCQkJfQorCQkJfSk7CisJCQkKKwkJCXRyYW5zbGF0ZUJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKXsKKwkJCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXYpIHsKKwkJCQkJbWFya1NlbGVjdGVkUmVzb3VyY2VBc1RyYW5zbGF0ZWQoKTsKKwkJCQl9CisJCQl9KTsKKwkJCQorCQkJLy8gVXBkYXRlIHRoZSBkaXNwbGF5CisJCQlzZXRMYXlvdXQobmV3IEdyaWRCYWdMYXlvdXQoKSk7CisJCQlHcmlkQmFnQ29uc3RyYWludHMgZ2JjID0gbmV3IEdyaWRCYWdDb25zdHJhaW50cygpOworCQkJcmVtb3ZlQWxsKCk7CisJCQlsb3dlclBhbmVsLmFkZChkZWxldGVCdXR0b24pOworCQkJbG93ZXJQYW5lbC5hZGQodHJhbnNsYXRlQnV0dG9uKTsKKworCQkJZ2JjLndlaWdodHggPSAxLjA7CisJCQlnYmMud2VpZ2h0eSA9IDAuMDsKKwkJCWdiYy5ncmlkd2lkdGggPSBHcmlkQmFnQ29uc3RyYWludHMuUkVNQUlOREVSOworCQkJZ2JjLmZpbGwgPSBHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTDsKKwkJCWFkZChqTGFiZWxHcm91cFRpdGxlLCBnYmMpOworCQkJZ2JjLndlaWdodHggPSAwLjA7CisJCQlnYmMuZ3JpZHdpZHRoID0gMTsKKwkJCWFkZChqTGFiZWxHcm91cE5hbWVUaXRsZSwgZ2JjKTsKKwkJCWdiYy53ZWlnaHR4ID0gMS4wOworCQkJZ2JjLmdyaWR3aWR0aCA9IEdyaWRCYWdDb25zdHJhaW50cy5SRU1BSU5ERVI7CisJCQlhZGQoakNvbWJvQm94R3JvdXAsIGdiYyk7CisJCQlnYmMud2VpZ2h0eCA9IDAuMDsKKwkJCWdiYy5ncmlkd2lkdGggPSAxOworCQkJYWRkKGpMYWJlbEdyb3VwQ29tbWVudFRpdGxlLCBnYmMpOworCQkJZ2JjLndlaWdodHggPSAxLjA7CisJCQlnYmMuZ3JpZHdpZHRoID0gR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTUFJTkRFUjsKKwkJCWFkZChqTGFiZWxHcm91cENvbW1lbnQsIGdiYyk7CisJCQlnYmMuZmlsbCA9IEdyaWRCYWdDb25zdHJhaW50cy5CT1RIOworCQkJZ2JjLndlaWdodHkgPSAxLjA7CisJCQlhZGQoalNjcm9sbFBhbmVHcm91cFRhYmxlLCBnYmMpOworCQkJZ2JjLndlaWdodHkgPSAwLjA7CisJCQlnYmMuZmlsbCA9IEdyaWRCYWdDb25zdHJhaW50cy5IT1JJWk9OVEFMOworCQkJYWRkKGxvd2VyUGFuZWwsIGdiYyk7CisJCX0gZWxzZSBpZiAocmJtICE9IG51bGwpIHsKKwkJCUJ1bmRsZSBtYWluQnVuZGxlID0gKEJ1bmRsZSlyYm0uZ2V0QnVuZGxlcygpLmZpcnN0RWxlbWVudCgpOworCQkJakxhYmVsR3JvdXBUaXRsZSAgICAgICAgICA9IG5ldyBKTGFiZWwocmJtLmdldEJhc2VDbGFzcygpICsgIiAtICIgKyBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImdyb3VwcyIpKTsKKwkJCWpDb21ib0JveEdyb3VwICAgICAgICAgICAgPSBuZXcgSkNvbWJvQm94KG5ldyBHcm91cENvbWJvQm94TW9kZWwobWFpbkJ1bmRsZSkpOy8vbWFpbkJ1bmRsZS5nZXRHcm91cHNBc1ZlY3RvcigpKTsKKwkJCQorCQkJakxpc3RHcm91cCAgICAgICAgICAgICAgICA9IG5ldyBKTGlzdChuZXcgR3JvdXBJdGVtc0xpc3RNb2RlbCgoQnVuZGxlR3JvdXApakNvbWJvQm94R3JvdXAuZ2V0U2VsZWN0ZWRJdGVtKCkpKTsKKwkJCWpTY3JvbGxQYW5lR3JvdXBUYWJsZSAgICAgPSBuZXcgSlNjcm9sbFBhbmUoakxpc3RHcm91cCk7CisJCQlqTGFiZWxHcm91cE5hbWVUaXRsZSAgICAgID0gbmV3IEpMYWJlbChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImJhc2Vncm91cF9ncm91cF9uYW1lIikpOworCQkJakxhYmVsR3JvdXBDb21tZW50VGl0bGUgICA9IG5ldyBKTGFiZWwoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJiYXNlZ3JvdXBfZ3JvdXBfY29tbWVudCIpKTsKKwkJCXRyeSB7CisJCQkJakxhYmVsR3JvdXBDb21tZW50ICAgID0gbmV3IEpMYWJlbCgoKEJ1bmRsZUdyb3VwKWpDb21ib0JveEdyb3VwLmdldFNlbGVjdGVkSXRlbSgpKS5nZXRDb21tZW50KCkpOworCQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gbnBlKSB7CisJCQkJakxhYmVsR3JvdXBDb21tZW50ICAgID0gbmV3IEpMYWJlbCgiIik7CisJCQl9CisJCQkKKwkJCWNyZWF0ZUl0ZW1CdXR0b24gICAgICAgICAgPSBuZXcgSkJ1dHRvbihSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImJ1dHRvbl9jcmVhdGVfcmVzb3VyY2UiKSk7CisJCQljcmVhdGVHcm91cEJ1dHRvbiAgICAgICAgID0gbmV3IEpCdXR0b24oUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJidXR0b25fY3JlYXRlX2dyb3VwIikpOworCQkJZGVsZXRlSXRlbUJ1dHRvbiAgICAgICAgICA9IG5ldyBKQnV0dG9uKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiYnV0dG9uX2RlbGV0ZV9yZXNvdXJjZSIpKTsKKwkJCWRlbGV0ZUdyb3VwQnV0dG9uICAgICAgICAgPSBuZXcgSkJ1dHRvbihSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImJ1dHRvbl9kZWxldGVfZ3JvdXAiKSk7CisJCQllZGl0SXRlbUJ1dHRvbiAgICAgICAgICAgID0gbmV3IEpCdXR0b24oUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJidXR0b25fZWRpdF9yZXNvdXJjZSIpKTsKKwkJCWVkaXRHcm91cEJ1dHRvbiAgICAgICAgICAgPSBuZXcgSkJ1dHRvbihSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImJ1dHRvbl9lZGl0X2dyb3VwIikpOworCQkJCisJCQlpdGVtUGFuZWwgICAgICAgICAgICAgICAgID0gbmV3IEpQYW5lbCgpOworCQkJZ3JvdXBQYW5lbCAgICAgICAgICAgICAgICA9IG5ldyBKUGFuZWwoKTsKKwkJCQorCQkJaXRlbVBhbmVsLnNldEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZVRpdGxlZEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZUV0Y2hlZEJvcmRlcigpLAorCQkJCQkJCQkJCQkJCQkJCSAgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJiYXNlZ3JvdXBfaXRlbV9vcHRpb25zIikpKTsKKwkJCWdyb3VwUGFuZWwuc2V0Qm9yZGVyKEJvcmRlckZhY3RvcnkuY3JlYXRlVGl0bGVkQm9yZGVyKEJvcmRlckZhY3RvcnkuY3JlYXRlRXRjaGVkQm9yZGVyKCksCisJCQkJCQkJCQkJCQkJCQkJICBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImJhc2Vncm91cF9ncm91cF9vcHRpb25zIikpKTsKKwkJCWl0ZW1QYW5lbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwzKSk7CisJCQlncm91cFBhbmVsLnNldExheW91dChuZXcgR3JpZExheW91dCgxLDMpKTsKKwkJCWl0ZW1QYW5lbC5zZXRNYXhpbXVtU2l6ZShuZXcgRGltZW5zaW9uKDIwMDAwLDUwKSk7CisJCQlncm91cFBhbmVsLnNldE1heGltdW1TaXplKG5ldyBEaW1lbnNpb24oMjAwMDAsNTApKTsKKwkJCQorCQkJY3JlYXRlSXRlbUJ1dHRvbi5zZXRNbmVtb25pYyhSQk1hbmFnZXJNZW51QmFyLmdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiYnV0dG9uX2NyZWF0ZV9yZXNvdXJjZV90cmlnZ2VyIikpKTsKKwkJCWVkaXRJdGVtQnV0dG9uLnNldE1uZW1vbmljKFJCTWFuYWdlck1lbnVCYXIuZ2V0S2V5RXZlbnRLZXkoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJidXR0b25fZWRpdF9yZXNvdXJjZV90cmlnZ2VyIikpKTsKKwkJCWRlbGV0ZUl0ZW1CdXR0b24uc2V0TW5lbW9uaWMoUkJNYW5hZ2VyTWVudUJhci5nZXRLZXlFdmVudEtleShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImJ1dHRvbl9kZWxldGVfcmVzb3VyY2VfdHJpZ2dlciIpKSk7CisJCQljcmVhdGVHcm91cEJ1dHRvbi5zZXRNbmVtb25pYyhSQk1hbmFnZXJNZW51QmFyLmdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiYnV0dG9uX2NyZWF0ZV9ncm91cF90cmlnZ2VyIikpKTsKKwkJCQorCQkJakxpc3RHcm91cC5zZXRTZWxlY3Rpb25Nb2RlKExpc3RTZWxlY3Rpb25Nb2RlbC5TSU5HTEVfU0VMRUNUSU9OKTsKKwkJCQorCQkJakNvbWJvQm94R3JvdXAuYWRkQWN0aW9uTGlzdGVuZXIobmV3IEdyb3VwQ29tYm9BY3Rpb25MaXN0ZW5lcih0aGlzKSk7CisJCQkKKwkJCWpMYWJlbEdyb3VwVGl0bGUuc2V0Rm9udChuZXcgRm9udCgiU2Fuc1NlcmlmIixGb250LlBMQUlOLDE4KSk7CisKKwkJCS8vIEFkZCB0aGUgbGlzdGVuZXJzCisJCQlqTGlzdEdyb3VwLmFkZE1vdXNlTGlzdGVuZXIobmV3IE1vdXNlQWRhcHRlcigpIHsKKwkJCQlwdWJsaWMgdm9pZCBtb3VzZUNsaWNrZWQoTW91c2VFdmVudCBldikgeyAKKwkJCQkJaWYoZXYuZ2V0Q2xpY2tDb3VudCgpID09IDIgJiYgZXYuZ2V0U291cmNlKCkgaW5zdGFuY2VvZiBKTGlzdCkgeworCQkJCQkJLy8gQSBkb3VibGUgY2xpY2sgbWVhbnMgdGhleSB3YW50IHRvIGVkaXQgYSBidW5kbGUgaXRlbQorCQkJCQkJaWYgKCgoSkxpc3QpZXYuZ2V0U291cmNlKCkpLmdldFNlbGVjdGVkVmFsdWUoKSAhPSBudWxsKQorCQkJCQkJCW5ldyBCdW5kbGVJdGVtQ3JlYXRpb25EaWFsb2coKEJ1bmRsZUl0ZW0pKChKTGlzdClldi5nZXRTb3VyY2UoKSkuZ2V0U2VsZWN0ZWRWYWx1ZSgpLAorCQkJCQkJCQlsaXN0ZW5lci5yYm0sIGxpc3RlbmVyLCBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImRpYWxvZ190aXRsZV9lZGl0X2l0ZW0iKSwgdHJ1ZSk7CisJCQkJCX0KKwkJCQl9CisJCQl9KTsKKwkJCQorCQkJY3JlYXRlSXRlbUJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKXsKKwkJCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXYpIHsKKwkJCQkJbmV3IEJ1bmRsZUl0ZW1DcmVhdGlvbkRpYWxvZygoKEJ1bmRsZUdyb3VwKWpDb21ib0JveEdyb3VwLmdldFNlbGVjdGVkSXRlbSgpKS5nZXROYW1lKCksCisJCQkJCQkJCQkJCQkgbGlzdGVuZXIucmJtLCBsaXN0ZW5lciwKKwkJCQkJCQkJCQkJCSBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImRpYWxvZ190aXRsZV9uZXdfaXRlbSIpLCB0cnVlKTsKKwkJCQkJdXBkYXRlQ29tcG9uZW50cygpOworCQkJCX0KKwkJCX0pOworCQkJY3JlYXRlR3JvdXBCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOworCQkJZWRpdEl0ZW1CdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgeworCQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldikgeworCQkJCQlpZiAoakxpc3RHcm91cC5nZXRTZWxlY3RlZFZhbHVlKCkgIT0gbnVsbCkKKwkJCQkJCW5ldyBCdW5kbGVJdGVtQ3JlYXRpb25EaWFsb2coKEJ1bmRsZUl0ZW0pakxpc3RHcm91cC5nZXRTZWxlY3RlZFZhbHVlKCksCisJCQkJCQkJbGlzdGVuZXIucmJtLCBsaXN0ZW5lciwgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJkaWFsb2dfdGl0bGVfZWRpdF9pdGVtIiksIHRydWUpOworCQkJCQl1cGRhdGVDb21wb25lbnRzKCk7CisJCQkJfQorCQkJfSk7CisJCQllZGl0R3JvdXBCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgeworCQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldikgeworCQkJCQluZXcgQnVuZGxlR3JvdXBFZGl0RGlhbG9nKChCdW5kbGVHcm91cClqQ29tYm9Cb3hHcm91cC5nZXRTZWxlY3RlZEl0ZW0oKSwKKwkJCQkJCQkJCQkJICBsaXN0ZW5lciwgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJkaWFsb2dfdGl0bGVfZWRpdF9ncm91cCIpLCB0cnVlKTsKKwkJCQkJdXBkYXRlQ29tcG9uZW50cygpOworCQkJCX0KKwkJCX0pOworCQkJZGVsZXRlR3JvdXBCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCkgeworCQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldikgeworCQkJCQlpbnQgcmVzcG9uc2UgPSBKT3B0aW9uUGFuZS5zaG93Q29uZmlybURpYWxvZyhsaXN0ZW5lciwKKwkJCQkJCVJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX3dhcm5pbmdfZGVsZXRlX2dyb3VwIiksCisJCQkJCQlSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImRpYWxvZ190aXRsZV9kZWxldGVfZ3JvdXAiKSwgSk9wdGlvblBhbmUuT0tfQ0FOQ0VMX09QVElPTiwKKwkJCQkJCUpPcHRpb25QYW5lLldBUk5JTkdfTUVTU0FHRSk7CisJCQkJCWlmIChyZXNwb25zZSA9PSBKT3B0aW9uUGFuZS5PS19PUFRJT04pIHsKKwkJCQkJCS8vIERlbGV0ZSB0aGUgZ3JvdXAgCisJCQkJCQlpbnQgaW5kZXggPSBqQ29tYm9Cb3hHcm91cC5nZXRTZWxlY3RlZEluZGV4KCk7CisJCQkJCQlCdW5kbGVHcm91cCBncm91cCA9IChCdW5kbGVHcm91cClqQ29tYm9Cb3hHcm91cC5nZXRTZWxlY3RlZEl0ZW0oKTsKKwkJCQkJCWlmIChncm91cC5nZXROYW1lKCkuZXF1YWxzKCJVbmdyb3VwZWQgSXRlbXMiKSkKKwkJCQkJCQlyZXR1cm47CisJCQkJCQlpZiAoaW5kZXggPCBqQ29tYm9Cb3hHcm91cC5nZXRJdGVtQ291bnQoKS0xKQorCQkJCQkJCWpDb21ib0JveEdyb3VwLnNldFNlbGVjdGVkSW5kZXgoaW5kZXgrMSk7CisJCQkJCQllbHNlCisJCQkJCQkJakNvbWJvQm94R3JvdXAuc2V0U2VsZWN0ZWRJbmRleChpbmRleC0xKTsKKwkJCQkJCXJibS5kZWxldGVHcm91cChncm91cC5nZXROYW1lKCkpOworCQkJCQl9CisJCQkJCXVwZGF0ZUNvbXBvbmVudHMoKTsKKwkJCQl9CisJCQl9KTsKKwkJCQorCQkJZGVsZXRlSXRlbUJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7CisJCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2KSB7CisJCQkJCWludCByZXNwb25zZSA9IEpPcHRpb25QYW5lLnNob3dDb25maXJtRGlhbG9nKGxpc3RlbmVyLAorCQkJCQkJUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJkaWFsb2dfd2FybmluZ19kZWxldGVfaXRlbSIpLAorCQkJCQkJUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJkaWFsb2dfdGl0bGVfZGVsZXRlX2l0ZW0iKSwgSk9wdGlvblBhbmUuT0tfQ0FOQ0VMX09QVElPTiwKKwkJCQkJCUpPcHRpb25QYW5lLldBUk5JTkdfTUVTU0FHRSk7CisJCQkJCWlmIChyZXNwb25zZSA9PSBKT3B0aW9uUGFuZS5PS19PUFRJT04pIHsKKwkJCQkJCU9iamVjdCBvID0gakxpc3RHcm91cC5nZXRTZWxlY3RlZFZhbHVlKCk7CisJCQkJCQlpZiAobyAhPSBudWxsKSB7CisJCQkJCQkJQnVuZGxlSXRlbSBpdGVtID0gKEJ1bmRsZUl0ZW0pIG87CisJCQkJCQkJaGFuZGxlRGVsZXRlSXRlbShpdGVtLmdldEtleSgpKTsKKwkJCQkJCQkvL3BhbmVsLnJibS5kZWxldGVJdGVtKGl0ZW0uZ2V0S2V5KCkpOworCQkJCQkJfQorCQkJCQl9CisJCQkJCXVwZGF0ZUNvbXBvbmVudHMoKTsKKwkJCQl9CisJCQl9KTsKKwkJCQorCQkJLy8gVXBkYXRlIHRoZSBkaXNwbGF5CisJCQlzZXRMYXlvdXQobmV3IEdyaWRCYWdMYXlvdXQoKSk7CisJCQlHcmlkQmFnQ29uc3RyYWludHMgZ2JjID0gbmV3IEdyaWRCYWdDb25zdHJhaW50cygpOworCQkJcmVtb3ZlQWxsKCk7CisJCQlpdGVtUGFuZWwuYWRkKGNyZWF0ZUl0ZW1CdXR0b24sIEJvcmRlckxheW91dC5XRVNUKTsKKwkJCWl0ZW1QYW5lbC5hZGQoZWRpdEl0ZW1CdXR0b24sIEJvcmRlckxheW91dC5DRU5URVIpOworCQkJaXRlbVBhbmVsLmFkZChkZWxldGVJdGVtQnV0dG9uLCBCb3JkZXJMYXlvdXQuRUFTVCk7CisJCQlncm91cFBhbmVsLmFkZChjcmVhdGVHcm91cEJ1dHRvbiwgQm9yZGVyTGF5b3V0LldFU1QpOworCQkJZ3JvdXBQYW5lbC5hZGQoZWRpdEdyb3VwQnV0dG9uLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKKwkJCWdyb3VwUGFuZWwuYWRkKGRlbGV0ZUdyb3VwQnV0dG9uLCBCb3JkZXJMYXlvdXQuRUFTVCk7CisKKwkJCQorCQkJZ2JjLndlaWdodHggPSAxLjA7CisJCQlnYmMud2VpZ2h0eSA9IDAuMDsKKwkJCWdiYy5ncmlkd2lkdGggPSBHcmlkQmFnQ29uc3RyYWludHMuUkVNQUlOREVSOworCQkJZ2JjLmZpbGwgPSBHcmlkQmFnQ29uc3RyYWludHMuSE9SSVpPTlRBTDsKKwkJCWFkZChqTGFiZWxHcm91cFRpdGxlLCBnYmMpOworCQkJZ2JjLndlaWdodHggPSAwLjA7CisJCQlnYmMuZ3JpZHdpZHRoID0gMTsKKwkJCWFkZChqTGFiZWxHcm91cE5hbWVUaXRsZSwgZ2JjKTsKKwkJCWdiYy53ZWlnaHR4ID0gMS4wOworCQkJZ2JjLmdyaWR3aWR0aCA9IEdyaWRCYWdDb25zdHJhaW50cy5SRU1BSU5ERVI7CisJCQlhZGQoakNvbWJvQm94R3JvdXAsIGdiYyk7CisJCQlnYmMud2VpZ2h0eCA9IDAuMDsKKwkJCWdiYy5ncmlkd2lkdGggPSAxOworCQkJYWRkKGpMYWJlbEdyb3VwQ29tbWVudFRpdGxlLCBnYmMpOworCQkJZ2JjLndlaWdodHggPSAxLjA7CisJCQlnYmMuZ3JpZHdpZHRoID0gR3JpZEJhZ0NvbnN0cmFpbnRzLlJFTUFJTkRFUjsKKwkJCWFkZChqTGFiZWxHcm91cENvbW1lbnQsIGdiYyk7CisJCQlnYmMuZmlsbCA9IEdyaWRCYWdDb25zdHJhaW50cy5CT1RIOworCQkJZ2JjLndlaWdodHkgPSAxLjA7CisJCQlhZGQoalNjcm9sbFBhbmVHcm91cFRhYmxlLCBnYmMpOworCQkJZ2JjLndlaWdodHkgPSAwLjA7CisJCQlnYmMuZmlsbCA9IEdyaWRCYWdDb25zdHJhaW50cy5IT1JJWk9OVEFMOworCQkJYWRkKGdyb3VwUGFuZWwsIGdiYyk7CisJCQlhZGQoaXRlbVBhbmVsLCBnYmMpOworCQl9IGVsc2UgeworCQkJcmVtb3ZlQWxsKCk7CisJCX0KKwl9CisJCisJcHVibGljIHZvaWQgdXBkYXRlQ29tcG9uZW50cygpIHsKKwkJLy8gSW5pdGlhbGl6ZSBjb21wb25lbnRzCisJCWlmIChidW5kbGUgIT0gbnVsbCkgeworCQkJakxhYmVsR3JvdXBUaXRsZS5zZXRUZXh0KGJ1bmRsZS5uYW1lKTsKKwkJCQorCQkJKChHcm91cEl0ZW1zVGFibGVNb2RlbClqVGFibGVHcm91cFRhYmxlLmdldE1vZGVsKCkpLnNldEdyb3VwKChCdW5kbGVHcm91cClqQ29tYm9Cb3hHcm91cC5nZXRTZWxlY3RlZEl0ZW0oKSk7CisJCQlqTGFiZWxHcm91cENvbW1lbnQuc2V0VGV4dCgoKEJ1bmRsZUdyb3VwKWpDb21ib0JveEdyb3VwLmdldFNlbGVjdGVkSXRlbSgpKS5nZXRDb21tZW50KCkpOworCQkJCisJCQlqVGFibGVHcm91cFRhYmxlLnNldFNlbGVjdGlvbk1vZGUoTGlzdFNlbGVjdGlvbk1vZGVsLlNJTkdMRV9TRUxFQ1RJT04pOworCQkJCisJCQkvLyBVcGRhdGUgdGhlIGdyb3VwIGNvbW1lbnQKKwkJCWpMYWJlbEdyb3VwQ29tbWVudC5zZXRUZXh0KCgoQnVuZGxlR3JvdXApakNvbWJvQm94R3JvdXAuZ2V0U2VsZWN0ZWRJdGVtKCkpLmdldENvbW1lbnQoKSk7CisJCQkoKEdyb3VwQ29tYm9Cb3hNb2RlbClqQ29tYm9Cb3hHcm91cC5nZXRNb2RlbCgpKS51cGRhdGUoKTsKKwkJfSBlbHNlIGlmIChyYm0gIT0gbnVsbCkgeworCQkJCisJCQkvLyBVcGRhdGUgdGhlIGxpc3Qgb2YgZ3JvdXBzCisvLwkJCXRyeSB7CisJCQkJKChHcm91cENvbWJvQm94TW9kZWwpakNvbWJvQm94R3JvdXAuZ2V0TW9kZWwoKSkudXBkYXRlKCk7CisvLwkJCX0KKy8vCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQorCQkJLy8gVXBkYXRlIHRoZSBncm91cCBjb21tZW50CisJCQlpZiAoKEJ1bmRsZUdyb3VwKWpDb21ib0JveEdyb3VwLmdldFNlbGVjdGVkSXRlbSgpICE9IG51bGwpCisJCQkJakxhYmVsR3JvdXBDb21tZW50LnNldFRleHQoKChCdW5kbGVHcm91cClqQ29tYm9Cb3hHcm91cC5nZXRTZWxlY3RlZEl0ZW0oKSkuZ2V0Q29tbWVudCgpKTsKKwkJCWVsc2UKKwkJCQlqTGFiZWxHcm91cENvbW1lbnQuc2V0VGV4dCgiIik7CisJCQkvLyBVcGRhdGUgdGhlIGxpc3Qgb2YgcmVzb3VyY2VzCisJCQlMaXN0TW9kZWwgbG1vZGVsID0gakxpc3RHcm91cC5nZXRNb2RlbCgpOworCQkJaWYgKGxtb2RlbCBpbnN0YW5jZW9mIEdyb3VwSXRlbXNMaXN0TW9kZWwpIHsKKwkJCQkvLygoR3JvdXBJdGVtc0xpc3RNb2RlbClsbW9kZWwpLnVwZGF0ZSgpOworCQkJCSgoR3JvdXBJdGVtc0xpc3RNb2RlbClsbW9kZWwpLnNldEdyb3VwKChCdW5kbGVHcm91cClqQ29tYm9Cb3hHcm91cC5nZXRTZWxlY3RlZEl0ZW0oKSk7CisJCQl9CisJCQllbHNlIHsKKwkJCQlHcm91cEl0ZW1zTGlzdE1vZGVsIG5ld01vZGVsID0gbmV3IEdyb3VwSXRlbXNMaXN0TW9kZWwoKEJ1bmRsZUdyb3VwKWpDb21ib0JveEdyb3VwLmdldFNlbGVjdGVkSXRlbSgpKTsKKwkJCQlSQk1hbmFnZXJHVUkuZGVidWdNc2coIkxpc3QgTW9kZWwgbm90IGFzIGFudGljaXBhdGVkOiAiICsgbG1vZGVsLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKwkJCQlqTGlzdEdyb3VwLnNldE1vZGVsKG5ld01vZGVsKTsKKwkJCQluZXdNb2RlbC51cGRhdGUoKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCVJCTWFuYWdlckdVSS5kZWJ1Z01zZygiVXBkYXRlLCBidXQgbm8gYWN0aXZlIGNvbXBvbmVudHMiKTsKKwkJCXJlbW92ZUFsbCgpOworCQl9CisJCS8vdmFsaWRhdGUoKTsKKwl9CisJCisJcHJpdmF0ZSB2b2lkIGhhbmRsZURlbGV0ZUl0ZW0oU3RyaW5nIGtleSkgeworCQlpZiAocmJtICE9IG51bGwpIHJibS5kZWxldGVJdGVtKGtleSk7CisJfQorfQorCisvKioKKyAqIFRoZSBhY3Rpb24gbGlzdGVuZXIgd2hpY2ggbW9uaXRvcnMgY2hhbmdlcyBpbiB0aGUgZ3JvdXAgdG8gZGlzcGxheQorICovCitjbGFzcyBHcm91cENvbWJvQWN0aW9uTGlzdGVuZXIgaW1wbGVtZW50cyBBY3Rpb25MaXN0ZW5lciB7CisJUkJHcm91cFBhbmVsIHBhbmVsOworCQorCXByb3RlY3RlZCBHcm91cENvbWJvQWN0aW9uTGlzdGVuZXIoUkJHcm91cFBhbmVsIHBhbmVsKSB7CisJCXRoaXMucGFuZWwgPSBwYW5lbDsKKwl9CisJCisJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2KSB7CisJCXBhbmVsLnVwZGF0ZUNvbXBvbmVudHMoKTsKKwl9Cit9CisKKy8qKgorICogVGhlIGxpc3QgbW9kZWwgZm9yIGdyb3VwcworICovCitjbGFzcyBHcm91cEl0ZW1zTGlzdE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RMaXN0TW9kZWwgeworCUJ1bmRsZUdyb3VwIGdyb3VwOworCQorCXB1YmxpYyB2b2lkIHNldEdyb3VwKEJ1bmRsZUdyb3VwIGdyb3VwKSB7CisJCXRoaXMuZ3JvdXAgPSBncm91cDsKKwkJdXBkYXRlKCk7CisJfQorCQorCXB1YmxpYyBHcm91cEl0ZW1zTGlzdE1vZGVsKEJ1bmRsZUdyb3VwIGdyb3VwKSB7CisJCXRoaXMuZ3JvdXAgPSBncm91cDsKKwl9CisJCisJcHVibGljIGludCBnZXRTaXplKCkgeworCQlpZiAoZ3JvdXAgPT0gbnVsbCkKKwkJCXJldHVybiAwOworCQlpbnQgcmVzdWx0ID0gZ3JvdXAuZ2V0SXRlbUNvdW50KCk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCQorCXB1YmxpYyBPYmplY3QgZ2V0RWxlbWVudEF0KGludCBpbmRleCkgeworCQlyZXR1cm4gZ3JvdXAuZ2V0QnVuZGxlSXRlbShpbmRleCk7CisJfQorCQorCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKKwkJZmlyZUNvbnRlbnRzQ2hhbmdlZCh0aGlzLCAwLCBnZXRTaXplKCktMSk7CisJfQorfQorCisvKioKKyAqIFRoZSB0YWJsZSBtb2RlbCBmb3Igc2VhcmNoZWQgSXRlbXMKKyAqLworY2xhc3MgR3JvdXBDb21ib0JveE1vZGVsIGV4dGVuZHMgRGVmYXVsdENvbWJvQm94TW9kZWwgeworCUJ1bmRsZSBidW5kbGU7CisJCisJcHVibGljIEdyb3VwQ29tYm9Cb3hNb2RlbCAoQnVuZGxlIGJ1bmRsZSkgeworCQl0aGlzLmJ1bmRsZSA9IGJ1bmRsZTsKKwkJc2V0U2VsZWN0ZWRJdGVtKGJ1bmRsZS5nZXRCdW5kbGVHcm91cCgwKSk7CisJfQorCQorCXB1YmxpYyBpbnQgZ2V0U2l6ZSgpIHsKKwkJcmV0dXJuIGJ1bmRsZS5nZXRHcm91cENvdW50KCk7CisJfQorCQorCXB1YmxpYyBPYmplY3QgZ2V0RWxlbWVudEF0KGludCBpbmRleCkgeworCQlyZXR1cm4gYnVuZGxlLmdldEJ1bmRsZUdyb3VwKGluZGV4KTsKKwl9CisJCisJcHVibGljIE9iamVjdCBnZXRTZWxlY3RlZEl0ZW0oKSB7CisJCXJldHVybiBzdXBlci5nZXRTZWxlY3RlZEl0ZW0oKTsKKwkJLy9yZXR1cm4gZ2V0RWxlbWVudEF0KDApOworCX0KKwkKKwlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7CisJCWZpcmVDb250ZW50c0NoYW5nZWQodGhpcywgMCwgZ2V0U2l6ZSgpLTEpOworCX0KK30KKworLyoqCisgKiBUaGUgdGFibGUgbW9kZWwgZm9yIGJ1bmRsZSBncm91cHMKKyAqLworY2xhc3MgR3JvdXBJdGVtc1RhYmxlTW9kZWwgZXh0ZW5kcyBBYnN0cmFjdFRhYmxlTW9kZWwgeworCUJ1bmRsZUdyb3VwIGdyb3VwOworCQorCXB1YmxpYyBHcm91cEl0ZW1zVGFibGVNb2RlbChCdW5kbGVHcm91cCBncm91cCkgeworCQl0aGlzLmdyb3VwID0gZ3JvdXA7CisJfQorCQorCXB1YmxpYyBpbnQgZ2V0Q29sdW1uQ291bnQoKSB7IHJldHVybiAzOyB9CisJCSAgICAKKwlwdWJsaWMgaW50IGdldFJvd0NvdW50KCkgeworCQlyZXR1cm4gZ3JvdXAuZ2V0SXRlbUNvdW50KCk7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldEdyb3VwKEJ1bmRsZUdyb3VwIGJnKSB7CisJCWdyb3VwID0gYmc7CisJCWZpcmVUYWJsZUNoYW5nZWQobmV3IFRhYmxlTW9kZWxFdmVudCh0aGlzKSk7CisJfQorCQkJCisJcHVibGljIE9iamVjdCBnZXRWYWx1ZUF0KGludCByb3csIGludCBjb2wpIHsKKwkJQnVuZGxlSXRlbSBpdGVtID0gZ3JvdXAuZ2V0QnVuZGxlSXRlbShyb3cpOworCQkJCQorCQlTdHJpbmcgcmV0U3RyID0gbnVsbDsKKwkJCQkKKwkJc3dpdGNoKGNvbCkgeworCQljYXNlIDA6CisJCQlyZXRTdHIgPSBpdGVtLmdldEtleSgpOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCXJldFN0ciA9IGl0ZW0uZ2V0VHJhbnNsYXRpb24oKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlyZXRTdHIgPSAoaXRlbS5nZXRDb21tZW50KCkgPT0gbnVsbCA/ICIiIDogaXRlbS5nZXRDb21tZW50KCkpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXRTdHIgPSBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInRhYmxlX2NlbGxfZXJyb3IiKTsKKwkJfQorCQkJCQorCQlyZXR1cm4gcmV0U3RyOworCX0KKwkKKwlwdWJsaWMgU3RyaW5nIGdldENvbHVtbk5hbWUoaW50IGNvbCkgeworCQlpZiAoY29sID09IDApIHJldHVybiBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImxhbmd1YWdlZ3JvdXBfY29sdW1uX2tleSIpOworCQllbHNlIGlmIChjb2wgPT0gMSkgcmV0dXJuIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibGFuZ3VhZ2Vncm91cF9jb2x1bW5fdHJhbnNsYXRpb24iKTsKKwkJZWxzZSBpZiAoY29sID09IDIpIHJldHVybiBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImxhbmd1YWdlZ3JvdXBfY29sdW1uX2NvbW1lbnQiKTsKKwkJZWxzZSByZXR1cm4gUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJ0YWJsZV9jb2x1bW5fZXJyb3IiKTsKKwl9CisJCisJcHVibGljIEJ1bmRsZUl0ZW0gZ2V0QnVuZGxlSXRlbShpbnQgcm93KSB7CisJCWlmIChyb3cgPj0gZ3JvdXAuZ2V0SXRlbUNvdW50KCkpCisJCSAgICByZXR1cm4gbnVsbDsKKwkJcmV0dXJuIGdyb3VwLmdldEJ1bmRsZUl0ZW0ocm93KTsKKwl9CisJCisJcHVibGljIHZvaWQgdXBkYXRlKCkgeworCQlmaXJlVGFibGVEYXRhQ2hhbmdlZCgpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2d1aS9SQk1hbmFnZXJHVUkuamF2YSBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9ndWkvUkJNYW5hZ2VyR1VJLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzlmNDU2NgotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9ndWkvUkJNYW5hZ2VyR1VJLmphdmEKQEAgLTAsMCArMSwxODE1IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgICoKKyAqIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3BhY2thZ2UgY29tLmlibS5yYm0uZ3VpOworCitpbXBvcnQgamF2YS5hd3QuKjsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC4qOworaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZheC5zd2luZy4qOworaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50Lio7CitpbXBvcnQgamF2YXguc3dpbmcudHJlZS4qOworCitpbXBvcnQgY29tLmlibS5yYm0uKjsKKworLyoqCisgKiBUaGUgR3JhcGhpY2FsIFVzZXIgSW50ZXJmYWNlIGZvciB3b3JraW5nIHdpdGggYW5kIHRocm91Z2ggYSBSZXNvdXJjZSBCdW5kbGUgTWFuYWdlci4gVGhlIEdVSSBoYXMgbm8gcHVibGljIG1haW4KKyAqIG1ldGhvZC4gSXQgaXMgaW5zdGVhZCBpbnN0YW50aWF0ZWQgZnJvbSBydW5uaW5nIHRoZSBtYWluIG1ldGhvZCBpbiBSQk1hbmFnZXIuIEZvciBoZWxwIHdpdGggdXNpbmcgdGhpcyBpbnRlcmZhY2UsCisgKiBjb25zdWx0IHRoZSBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIGluIHRoZSBwcm9qZWN0LgorICogCisgKiBAYXV0aG9yIEphcmVkIEphY2tzb24KKyAqIEBzZWUgY29tLmlibS5yYm0uUkJNYW5hZ2VyCisgKi8KK3B1YmxpYyBjbGFzcyBSQk1hbmFnZXJHVUkgZXh0ZW5kcyBKRnJhbWUgaW1wbGVtZW50cyBBY3Rpb25MaXN0ZW5lciwgTW91c2VMaXN0ZW5lciwgQ2hhbmdlTGlzdGVuZXIsIFRyZWVTZWxlY3Rpb25MaXN0ZW5lcgoreworCS8vIENPTlNUQU5UUworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBidWZmZXIgPSAyMDsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBEaW1lbnNpb24gZGltTWFpbiA9IG5ldyBEaW1lbnNpb24oNzUwLDU1MCk7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGltZW5zaW9uIGRpbU1haW5NYXggPSBuZXcgRGltZW5zaW9uKDIwMDAsMTUwMCk7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGltZW5zaW9uIGRpbU1haW5NaW4gPSBuZXcgRGltZW5zaW9uKDU1MCwzNTApOworCXByaXZhdGUgc3RhdGljIGZpbmFsIERpbWVuc2lvbiBkaW1Ub3AgPSBuZXcgRGltZW5zaW9uKGRpbU1haW4ud2lkdGggLSBidWZmZXIsNTApOworCXByaXZhdGUgc3RhdGljIGZpbmFsIERpbWVuc2lvbiBkaW1Ub3BNYXggPSBuZXcgRGltZW5zaW9uKGRpbU1haW5NYXgud2lkdGggLSBidWZmZXIsNTApOworCXByaXZhdGUgc3RhdGljIGZpbmFsIERpbWVuc2lvbiBkaW1Ub3BNaW4gPSBuZXcgRGltZW5zaW9uKGRpbU1haW5NaW4ud2lkdGggLSBidWZmZXIsNTApOworCXByaXZhdGUgc3RhdGljIGZpbmFsIERpbWVuc2lvbiBkaW1Cb3R0b20gPSBuZXcgRGltZW5zaW9uKGRpbU1haW4ud2lkdGggLSBidWZmZXIsZGltTWFpbi5oZWlnaHQtZGltVG9wLmhlaWdodCAtIGJ1ZmZlcik7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGltZW5zaW9uIGRpbUJvdHRvbU1heCA9IG5ldyBEaW1lbnNpb24oZGltTWFpbk1heC53aWR0aCAtIGJ1ZmZlcixkaW1NYWluTWF4LmhlaWdodC1kaW1Ub3BNaW4uaGVpZ2h0IC0gYnVmZmVyKTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBEaW1lbnNpb24gZGltQm90dG9tTWluID0gbmV3IERpbWVuc2lvbihkaW1NYWluTWluLndpZHRoIC0gYnVmZmVyLGRpbU1haW5NaW4uaGVpZ2h0LWRpbVRvcE1heC5oZWlnaHQgLSBidWZmZXIpOworCXByaXZhdGUgc3RhdGljIGZpbmFsIERpbWVuc2lvbiBkaW1MZWZ0ID0gbmV3IERpbWVuc2lvbigxNzUsZGltQm90dG9tLmhlaWdodCAtIGJ1ZmZlcik7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGltZW5zaW9uIGRpbVJpZ2h0ID0gbmV3IERpbWVuc2lvbihkaW1NYWluLndpZHRoLWRpbUxlZnQud2lkdGggLSBidWZmZXIsZGltQm90dG9tLmhlaWdodCAtIGJ1ZmZlcik7CisJCisJLyoqCisJICogVXNlZCBmb3IgdG9nZ2xpbmcgdGhlIGRlYnVnIG1vZGUKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZGVidWcgPSBmYWxzZTsKKwkvKioKKwkgKiBVc2VkIHRvIGNvdW50IGRlYnVnIG1lc3NhZ2VzCisJICovCisJcHVibGljIHN0YXRpYyBpbnQgZGVidWdjb3VudCA9IDA7CisJCisJLy8gbWVtYmVyIGRlY2xhcmF0aW9ucworCQorCS8vICoqIERBVEEgKioKKwlSQk1hbmFnZXIgcmJtID0gbnVsbDsKKwlTdHJpbmcgdXNlck5hbWUgPSBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInVua25vd25fdXNlciIpOworCQorCURlZmF1bHRNdXRhYmxlVHJlZU5vZGUgYWN0aXZlTm9kZSA9IG51bGw7CisJCisJLy8gKiogTUFJTiBNRU5VICoqCisJUkJNYW5hZ2VyTWVudUJhciAgICAgICAgIGpNZW51QmFyTWFpbiA9IG51bGw7CisKKwkvLyAqKiBDT05URU5UIFBBTkVTICoqCisJQm94ICAgICAgICAgIGJveE1haW4gPSBuZXcgQm94KEJveExheW91dC5ZX0FYSVMpOworCS8vSlBhbmVsICAgICAgIGpQYW5lbFRvcCA9IG5ldyBKUGFuZWwoKTsKKwlKUGFuZWwgICAgICAgalBhbmVsQm90dG9tID0gbmV3IEpQYW5lbCgpOworCUpTcGxpdFBhbmUgICBqU3BsaXRQYW5lTWFpbiA9IG5ldyBKU3BsaXRQYW5lKEpTcGxpdFBhbmUuSE9SSVpPTlRBTF9TUExJVCk7CisKKwkvLyAqKiBTUExJVCBQQU5FIENPTVBPTkVOVFMgKioKKwlKVHJlZSAgICAgICAgalRyZWVEaXNwbGF5ID0gbmV3IEpUcmVlKCk7CisJSlRhYmJlZFBhbmUgIGpUYWJiZWRQYW5lTWFpbiA9IG5ldyBKVGFiYmVkUGFuZSgpOworCVJCU3RhdGlzdGljc1BhbmVsICAgICAgICBqUGFuZWxTdGF0cyA9IG5ldyBSQlN0YXRpc3RpY3NQYW5lbCgpOworCVJCVW50cmFuc2xhdGVkUGFuZWwgICAgICBqUGFuZWxVbnRyYW5zID0gbmV3IFJCVW50cmFuc2xhdGVkUGFuZWwodGhpcyk7CisJUkJHcm91cFBhbmVsICAgICAgICAgICAgIGpQYW5lbEdyb3VwcyA9IG5ldyBSQkdyb3VwUGFuZWwodGhpcyk7CisJUkJTZWFyY2hQYW5lbCAgICAgICAgICAgIGpQYW5lbFNlYXJjaCA9IG5ldyBSQlNlYXJjaFBhbmVsKHRoaXMpOworCUpTY3JvbGxQYW5lICBqU2Nyb2xsUGFuZVRyZWUgPSBuZXcgSlNjcm9sbFBhbmUoalRyZWVEaXNwbGF5LAorCQkJCQkJCQkJCQkJCVNjcm9sbFBhbmVDb25zdGFudHMuVkVSVElDQUxfU0NST0xMQkFSX0FTX05FRURFRCwKKwkJCQkJCQkJCQkJCQlTY3JvbGxQYW5lQ29uc3RhbnRzLkhPUklaT05UQUxfU0NST0xMQkFSX0FTX05FRURFRCk7CisJLy8gKiogUFJPSkVDVCBWSUVXIFNQTElUIFBBTkUgQ09NUE9ORU5UUworCUpUYWJiZWRQYW5lICAgICAgICAgICAgICB0cmVlVGFiYmVkUGFuZSA9IG5ldyBKVGFiYmVkUGFuZSgpOworCUpUcmVlICAgICAgICAgICAgICAgICAgICBwcm9qZWN0VHJlZSA9IG5ldyBKVHJlZSgpOworCUpTY3JvbGxQYW5lICAgICAgICAgICAgICBwcm9qZWN0U2Nyb2xsUGFuZSA9IG5ldyBKU2Nyb2xsUGFuZShwcm9qZWN0VHJlZSwgCisJCQkJCQkJCQkJCQkJCQkJU2Nyb2xsUGFuZUNvbnN0YW50cy5WRVJUSUNBTF9TQ1JPTExCQVJfQVNfTkVFREVELAorCQkJCQkJCQkJCQkJCQkJCVNjcm9sbFBhbmVDb25zdGFudHMuSE9SSVpPTlRBTF9TQ1JPTExCQVJfQVNfTkVFREVEKTsKKwlSQlByb2plY3RJdGVtUGFuZWwgICAgICAgcHJvamVjdFBhbmVsID0gbmV3IFJCUHJvamVjdEl0ZW1QYW5lbCh0aGlzKTsKKwlSQlByb2plY3QgICAgICAgICAgICAgICAgcHJvamVjdCA9IG51bGw7CisJCisJLy8gKiogRmlsZSBDaG9vc2VyICoqCisJSkZpbGVDaG9vc2VyIG9wZW5GaWxlQ2hvb3NlciA9IG5ldyBKRmlsZUNob29zZXIoKTsKKwlKRmlsZUNob29zZXIgc2F2ZUZpbGVDaG9vc2VyID0gbmV3IEpGaWxlQ2hvb3NlcigpOworCUpGaWxlQ2hvb3NlciBwcm9qZWN0RmlsZUNob29zZXIgPSBuZXcgSkZpbGVDaG9vc2VyKCk7CisJCisJLyoqCisJICogQ3JlYXRpb24gb2YgdGhlIEdVSSBzaG91bGQgYmUgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgdGhlIG1ldGhvZCBjYWxscyB0byBpbml0Q29tcG9uZW50cygpIGFuZCBzZXRWaXNpYmxlKHRydWUpLgorCSAqIFRoZXNlIG1ldGhvZHMgd2VyZSBub3QgY2FsbGVkIGJ5IGRlZmF1bHQgZm9yIHByb2dyYW1taW5nIGRpc2NyZXRpb24KKwkgKi8KKwkKKwlwdWJsaWMgUkJNYW5hZ2VyR1VJKCkKKwl7CisJfQorCQorCS8qKgorCSAqIEluaGVyaXRzIGZyb20gSkZyYW1lLnZhbGlkYXRlKCksIHdpdGggc29tZSBjb21wb25lbnQgdXBkYXRlcworCSAqLworCQorCXB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgeworCQlzdXBlci52YWxpZGF0ZSgpOworCQl1cGRhdGVEaXNwbGF5UGFuZWxzKCk7CisJfQorCQorCS8qKgorCSAqIEluaXRpYWwgY29uc3RydWN0aW9uIG9mIGFsbCBvZiB0aGUgR1VJIGNvbXBvbmVudHMuIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZQorCSAqIGNvbnN0cnVjdGlvbiBvZiB0aGUgR1VJIG9iamVjdC4KKwkgKi8KKwkKKwlwdWJsaWMgdm9pZCBpbml0Q29tcG9uZW50cygpIHRocm93cyBFeGNlcHRpb24KKwl7CisJCXRoaXMuc2V0RGVmYXVsdENsb3NlT3BlcmF0aW9uKFdpbmRvd0NvbnN0YW50cy5ET19OT1RISU5HX09OX0NMT1NFKTsKKwkJLy8gdGhlIGZvbGxvd2luZyBjb2RlIHNldHMgdGhlIGZyYW1lJ3MgaW5pdGlhbCBzdGF0ZQorCQkKKwkJb3BlbkZpbGVDaG9vc2VyLnNldEZpbGVGaWx0ZXIobmV3IGphdmF4LnN3aW5nLmZpbGVjaG9vc2VyLkZpbGVGaWx0ZXIoKSB7CisJCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBmKSB7CisJCQkJaWYgKGYuaXNEaXJlY3RvcnkoKSkgcmV0dXJuIHRydWU7CisJCQkJCisJCQkJU3RyaW5nIG5hbWUgPSBmLmdldE5hbWUoKTsKKwkJCQlpZiAoIShuYW1lLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi5wcm9wZXJ0aWVzIikpKSByZXR1cm4gZmFsc2U7CisJCQkJaWYgKG5hbWUuaW5kZXhPZigiXyIpID4gMCkgcmV0dXJuIGZhbHNlOworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQorCQkJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKwkJCQlyZXR1cm4gUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJkaWFsb2dfZmlsZV9maWx0ZXJfZGVzY3JpcHRpb24iKTsKKwkJCX0KKwkJfSk7CisJCQorCQlzYXZlRmlsZUNob29zZXIuc2V0RmlsZUZpbHRlcihuZXcgamF2YXguc3dpbmcuZmlsZWNob29zZXIuRmlsZUZpbHRlcigpIHsKKwkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGYpIHsKKwkJCQlpZiAoZi5pc0RpcmVjdG9yeSgpKSByZXR1cm4gdHJ1ZTsKKwkJCQkKKwkJCQlTdHJpbmcgbmFtZSA9IGYuZ2V0TmFtZSgpOworCQkJCWlmICghKG5hbWUudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLnByb3BlcnRpZXMiKSkpIHJldHVybiBmYWxzZTsKKwkJCQlpZiAobmFtZS5pbmRleE9mKCJfIikgPiAwKSByZXR1cm4gZmFsc2U7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCisJCQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworCQkJCXJldHVybiBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImRpYWxvZ19maWxlX2ZpbHRlcl9kZXNjcmlwdGlvbiIpOworCQkJfQorCQl9KTsKKwkJCisJCXByb2plY3RGaWxlQ2hvb3Nlci5zZXRGaWxlRmlsdGVyKG5ldyBqYXZheC5zd2luZy5maWxlY2hvb3Nlci5GaWxlRmlsdGVyKCkgeworCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZikgeworCQkJCWlmIChmLmlzRGlyZWN0b3J5KCkpIHJldHVybiB0cnVlOworCQkJCQorCQkJCVN0cmluZyBuYW1lID0gZi5nZXROYW1lKCk7CisJCQkJaWYgKCEobmFtZS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIucmJwcm9qZWN0IikpKSByZXR1cm4gZmFsc2U7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCQkKKwkJCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisJCQkJcmV0dXJuIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX3Byb2plY3RfZmlsdGVyX2Rlc2NyaXB0aW9uIik7CQorCQkJfQorCQl9KTsKKworICAgICAgICAvLyAqKiBUaGUgTWFpbiBwcm9ncmFtIGljb24gKioKKyAgICAgICAgc2V0SWNvbkltYWdlKChuZXcgSW1hZ2VJY29uKGdldENsYXNzKCkuZ2V0UmVzb3VyY2UoImltYWdlcy90cmVlX2ljb25fYnVuZGxlLmdpZiIpKSkuZ2V0SW1hZ2UoKSk7CisJCQorCQkvLyAqKiBNQUlOIE1FTlUgQkFSIElURU1TICoqCisJCWpNZW51QmFyTWFpbiA9IG5ldyBSQk1hbmFnZXJNZW51QmFyKHRoaXMpOworCQkKKwkJLy8gKiogRElTUExBWSBUUkVFICoqCisJCS8valNjcm9sbFBhbmVUcmVlLnNldFNpemUoZGltTGVmdCk7CisJCXVwZGF0ZURpc3BsYXlUcmVlKCk7CisJCXVwZGF0ZVByb2plY3RUcmVlKCk7CisJCXVwZGF0ZVByb2plY3RQYW5lbHMoKTsKKwkJCisJCWpQYW5lbFN0YXRzLnNldFNpemUoZGltUmlnaHQpOworCQlqUGFuZWxVbnRyYW5zLnNldFNpemUoZGltUmlnaHQpOworCQlqUGFuZWxHcm91cHMuc2V0U2l6ZShkaW1SaWdodCk7CisJCWpQYW5lbFNlYXJjaC5zZXRTaXplKGRpbVJpZ2h0KTsKKwkJCisJCS8vICoqIE1BSU4gVEFCQkVEIFBBTkUgKioKKwkJalRhYmJlZFBhbmVNYWluLnNldFNpemUoZGltUmlnaHQpOworCQlqVGFiYmVkUGFuZU1haW4uYWRkVGFiKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigidGFiX3N0YXRpc3RpY3MiKSwgalBhbmVsU3RhdHMpOworCQlqVGFiYmVkUGFuZU1haW4uYWRkVGFiKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigidGFiX3VudHJhbnNsYXRlZCIpLCBqUGFuZWxVbnRyYW5zKTsKKwkJalRhYmJlZFBhbmVNYWluLmFkZFRhYihSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInRhYl9ncm91cHMiKSwgalBhbmVsR3JvdXBzKTsKKwkJalRhYmJlZFBhbmVNYWluLmFkZFRhYihSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInRhYl9zZWFyY2giKSwgalBhbmVsU2VhcmNoKTsKKwkJCisJCS8vICoqIExFRlQgVEFCQkVEIFBBTkUgKioKKwkJdHJlZVRhYmJlZFBhbmUuc2V0U2l6ZShkaW1MZWZ0KTsKKwkJdHJlZVRhYmJlZFBhbmUuc2V0UHJlZmVycmVkU2l6ZShkaW1MZWZ0KTsKKwkJdHJlZVRhYmJlZFBhbmUuYWRkVGFiKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigidGFiX2J1bmRsZSIpLCBqU2Nyb2xsUGFuZVRyZWUpOworCQl0cmVlVGFiYmVkUGFuZS5hZGRUYWIoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJ0YWJfcHJvamVjdCIpLCBwcm9qZWN0U2Nyb2xsUGFuZSk7CisJCXRyZWVUYWJiZWRQYW5lLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMpOworCQkKKwkJLy8gKiogTUFJTiBTUExJVCBQQU5FICoqCisJCS8valNwbGl0UGFuZU1haW4uc2V0U2l6ZShkaW1Cb3R0b20pOworCQkvL2pTcGxpdFBhbmVNYWluLnNldExlZnRDb21wb25lbnQoalNjcm9sbFBhbmVUcmVlKTsKKwkJalNwbGl0UGFuZU1haW4uc2V0TGVmdENvbXBvbmVudCh0cmVlVGFiYmVkUGFuZSk7CisJCWpTcGxpdFBhbmVNYWluLnNldFJpZ2h0Q29tcG9uZW50KGpUYWJiZWRQYW5lTWFpbik7CisJCWpTcGxpdFBhbmVNYWluLnNldENvbnRpbnVvdXNMYXlvdXQodHJ1ZSk7CisJCQorCQkvLyAqKiBCT1RUT00gUEFORUwgKioKKwkJLy9qUGFuZWxCb3R0b20uc2V0UHJlZmVycmVkU2l6ZShkaW1Cb3R0b20pOworCQlqUGFuZWxCb3R0b20uc2V0TWF4aW11bVNpemUoZGltQm90dG9tTWF4KTsKKwkJalBhbmVsQm90dG9tLnNldE1pbmltdW1TaXplKGRpbUJvdHRvbU1pbik7CisJCWpQYW5lbEJvdHRvbS5zZXRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVMaW5lQm9yZGVyKENvbG9yLmJsYWNrKSk7CisJCWpQYW5lbEJvdHRvbS5zZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgxLDEpKTsKKwkJalBhbmVsQm90dG9tLnJlbW92ZUFsbCgpOworCQlqUGFuZWxCb3R0b20uYWRkKGpTcGxpdFBhbmVNYWluLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKKwkJCisJCS8vICoqIE1BSU4gRlJBTUUgU0VUVVAgKioKKwkJZGltTWFpbi5oZWlnaHQgKz0gak1lbnVCYXJNYWluLmdldFByZWZlcnJlZFNpemUoKS5oZWlnaHQ7CisJCXNldFNpemUoZGltTWFpbik7CisJCSgoSkNvbXBvbmVudClnZXRDb250ZW50UGFuZSgpKS5zZXRNYXhpbXVtU2l6ZShkaW1NYWluTWF4KTsKKwkJKChKQ29tcG9uZW50KWdldENvbnRlbnRQYW5lKCkpLnNldE1pbmltdW1TaXplKGRpbU1haW5NaW4pOworCQlzZXRKTWVudUJhcihqTWVudUJhck1haW4pOworCQlnZXRDb250ZW50UGFuZSgpLnJlbW92ZUFsbCgpOworCQlnZXRDb250ZW50UGFuZSgpLmFkZChqUGFuZWxCb3R0b20sIEJvcmRlckxheW91dC5DRU5URVIpOworCQlzZXRUaXRsZShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInJlc291cmNlX2J1bmRsZV9tYW5hZ2VyIikpOworCQl2YWxpZGF0ZVRyZWUoKTsKKwkJCisJCWFkZFdpbmRvd0xpc3RlbmVyKG5ldyBqYXZhLmF3dC5ldmVudC5XaW5kb3dBZGFwdGVyKCkgeworCQkJcHVibGljIHZvaWQgd2luZG93Q2xvc2luZyhqYXZhLmF3dC5ldmVudC5XaW5kb3dFdmVudCBlKSB7CisJCQkJdGhpc1dpbmRvd0Nsb3NpbmcoZSk7CisJCQl9CisJCX0pOworCX0KKyAgCisgIAlwcml2YXRlIGJvb2xlYW4gbVNob3duID0gZmFsc2U7CisJCisJLyoqCisJICogUmV2ZWFscyB0aGUgcHJpdmF0ZSBtZXRob2Qgb2YgSkZyYW1lLnZhbGlkYXRlVHJlZSgpCisJICovCisJCisJcHVibGljIHZvaWQgdmFsaWRhdGVNeVRyZWUoKSB7CisJCXZhbGlkYXRlVHJlZSgpOworCX0KKwkKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IFJlc291cmNlIEZpbGUgKGkuZS4gRW5nbGlzaCwgRW5nbGlzaCBDYW5hZGEsIEZpbm5pc2gsIGV0Yy4pCisJICovCisJCisJcHVibGljIHZvaWQgY3JlYXRlUmVzb3VyY2VGaWxlKCkgeworCQluZXcgUmVzb3VyY2VDcmVhdGlvbkRpYWxvZyhyYm0sIHRoaXMsIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX3RpdGxlX25ld19maWxlIiksIHRydWUpOworCX0KKwkKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGdyb3VwIGZvciBncm91cGluZyBCdW5kbGVJdGVtcworCSAqLworCQorCXB1YmxpYyB2b2lkIGNyZWF0ZUJ1bmRsZUdyb3VwKCkgeworCQluZXcgQnVuZGxlR3JvdXBDcmVhdGlvbkRpYWxvZyhyYm0sIHRoaXMsIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX3RpdGxlX25ld19ncm91cCIpLCB0cnVlKTsKKwkJdXBkYXRlRGlzcGxheVBhbmVscygpOworCX0KKwkKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IEJ1bmRsZUl0ZW0KKwkgKi8KKwkKKwlwdWJsaWMgdm9pZCBjcmVhdGVCdW5kbGVJdGVtKCkgeworCQluZXcgQnVuZGxlSXRlbUNyZWF0aW9uRGlhbG9nKHJibSwgdGhpcywgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJkaWFsb2dfdGl0bGVfbmV3X2l0ZW0iKSwgdHJ1ZSk7CisJCXVwZGF0ZURpc3BsYXlQYW5lbHMoKTsKKwkJdXBkYXRlUHJvamVjdFRyZWUoKTsKKwl9CisJCisJLyoqCisJICogSGFuZGxlcyBldmVudHMgZ2VuZXJhdGVkCisJICovCisJCisJcHVibGljIHZvaWQgdmFsdWVDaGFuZ2VkKFRyZWVTZWxlY3Rpb25FdmVudCBldikgeworCQlpZiAoZXYuZ2V0U291cmNlKCkgPT0gcHJvamVjdFRyZWUpIHVwZGF0ZVByb2plY3RQYW5lbHMoKTsKKwkJZWxzZSBpZiAoZXYuZ2V0U291cmNlKCkgPT0galRyZWVEaXNwbGF5KSB7CisJCQlUcmVlUGF0aCBzZWxQYXRoID0galRyZWVEaXNwbGF5LmdldFNlbGVjdGlvblBhdGgoKTsKKwkJCWFjdGl2ZU5vZGUgPSAoRGVmYXVsdE11dGFibGVUcmVlTm9kZSlzZWxQYXRoLmdldExhc3RQYXRoQ29tcG9uZW50KCk7CisJCQl1cGRhdGVEaXNwbGF5UGFuZWxzKCk7CisJCQkvKgorCQkJaW50IHNlbFJvdyA9IGpUcmVlRGlzcGxheS5nZXRSb3dGb3JMb2NhdGlvbihldi5nZXRYKCksIGV2LmdldFkoKSk7CisJCQlUcmVlUGF0aCBzZWxQYXRoID0galRyZWVEaXNwbGF5LmdldFBhdGhGb3JMb2NhdGlvbihldi5nZXRYKCksIGV2LmdldFkoKSk7CisJCQlpZiAoc2VsUm93ICE9IC0xKSB7CisgICAgICAgICAgICBpZiAoZXYuZ2V0Q2xpY2tDb3VudCgpID09IDEgJiYgZXYuZ2V0U291cmNlKCkgPT0galRyZWVEaXNwbGF5KSB7CisJCQkJCisJCQkJU3lzdGVtLm91dC5wcmludGxuKCJPdGhlciB0cmVlIik7CisJCQl9IGVsc2UgaWYgKGV2LmdldENsaWNrQ291bnQoKSA9PSAxICYmIGV2LmdldFNvdXJjZSgpID09IHByb2plY3RUcmVlKSB7CisJCQkJU3lzdGVtLm91dC5wcmludGxuKCJNb3VzZSBwcmVzc2VkIik7CisJCQkJdXBkYXRlUHJvamVjdFBhbmVscygpOwkKKwkJCX0gZWxzZSBTeXN0ZW0ub3V0LnByaW50bG4oU3RyaW5nLnZhbHVlT2YoZXYuZ2V0Q2xpY2tDb3VudCgpKSArICIgIiArIGV2LmdldFNvdXJjZSgpLnRvU3RyaW5nKCkpOworCQkJCisJCQkqLworCQl9CisJfQorCQorCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBldikgeworCQlpZiAoZXYuZ2V0U291cmNlKCkgPT0gdHJlZVRhYmJlZFBhbmUpIHsKKwkJCWludCBpbmRleCA9IHRyZWVUYWJiZWRQYW5lLmdldFNlbGVjdGVkSW5kZXgoKTsJCisJCQlTdHJpbmcgdGl0bGUgPSB0cmVlVGFiYmVkUGFuZS5nZXRUaXRsZUF0KGluZGV4KTsKKwkJCWlmICh0aXRsZS5lcXVhbHMoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJ0YWJfYnVuZGxlIikpKSB7CisJCQkJalNwbGl0UGFuZU1haW4uc2V0UmlnaHRDb21wb25lbnQoalRhYmJlZFBhbmVNYWluKTsKKwkJCQl1cGRhdGVEaXNwbGF5UGFuZWxzKCk7CisJCQl9IGVsc2UgaWYgKHRpdGxlLmVxdWFscyhSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInRhYl9wcm9qZWN0IikpKSB7CisJCQkJalNwbGl0UGFuZU1haW4uc2V0UmlnaHRDb21wb25lbnQocHJvamVjdFBhbmVsKTsKKwkJCQl1cGRhdGVQcm9qZWN0UGFuZWxzKCk7CisJCQl9CisJCX0KKwl9CisJCisJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2KSB7CisJCWlmIChldi5nZXRJRCgpID09IEFjdGlvbkV2ZW50LkFDVElPTl9QRVJGT1JNRUQpIHsKKwkJCWlmIChldi5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIEpNZW51SXRlbSAmJiAoKEpNZW51SXRlbSlldi5nZXRTb3VyY2UoKSkuZ2V0TmFtZSgpICE9IG51bGwgJiYKKwkJCQkoKEpNZW51SXRlbSlldi5nZXRTb3VyY2UoKSkuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoIl9fIikpIHsgICAgICAgICAgICAgICAvLyBNZW51IC0+IEZpbGUgLT4gX19SZWNlbnQgRmlsZQorCQkJCS8vIFRoaXMgaXRlbSBpcyBhIHJlY2VudCBmaWxlIHNlbGVjdGlvbi4gV2UgbmVlZCB0byBvcGVuIHRoYXQgZmlsZQorCQkJCVN0cmluZyBmaWxlTG9jYXRpb24gPSAoKEpNZW51SXRlbSlldi5nZXRTb3VyY2UoKSkuZ2V0TmFtZSgpOworCQkJCWZpbGVMb2NhdGlvbiA9IGZpbGVMb2NhdGlvbi5zdWJzdHJpbmcoMixmaWxlTG9jYXRpb24ubGVuZ3RoKCkpOworCQkJCXRyeSB7CisJCQkJCXJibSA9IG5ldyBSQk1hbmFnZXIobmV3IEZpbGUoZmlsZUxvY2F0aW9uKSk7CisJCQkJCXVwZGF0ZURpc3BsYXlUcmVlKCk7CisJCQkJCXVwZGF0ZVByb2plY3RUcmVlKCk7CisJCQkJCXVwZGF0ZVByb2plY3RQYW5lbHMoKTsKKwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKwkJCQkJSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2codGhpcyxSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImVycm9yX29wZW5pbmdfZmlsZSIsIGV2LmdldEFjdGlvbkNvbW1hbmQoKSksCisJCQkJCQkJCQkJCQkgIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX3RpdGxlX2Vycm9yX29wZW5pbmdfZmlsZSIpLAorCQkJCQkJCQkJCQkJICBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKKwkJCQkJcmJtID0gbnVsbDsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKGV2LmdldEFjdGlvbkNvbW1hbmQoKS5lcXVhbHMoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X3RyZWVfc2F2ZSIpKSAmJgorCQkJCQkgICAoKEpNZW51SXRlbSlldi5nZXRTb3VyY2UoKSkuZ2V0TmFtZSgpICE9IG51bGwpIHsgICAgICAgICAgICAgICAgLy8gUG9wdXAgVHJlZSBNZW51IC0+IFNhdmUKKwkJCQlTdHJpbmcgc2VsZWN0ZWRFbmNvZGluZyA9ICgoSk1lbnVJdGVtKWV2LmdldFNvdXJjZSgpKS5nZXROYW1lKCk7CisJCQkJc2F2ZVJlc291cmNlcyhzZWxlY3RlZEVuY29kaW5nKTsKKwkJCX0gZWxzZSBpZiAoZXYuZ2V0QWN0aW9uQ29tbWFuZCgpLmVxdWFscyhSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfdHJlZV9oaWRlIikpICYmCisJCQkJCSAgICgoSk1lbnVJdGVtKWV2LmdldFNvdXJjZSgpKS5nZXROYW1lKCkgIT0gbnVsbCkgeyAgICAgICAgICAgICAgICAvLyBQb3B1cCBUcmVlIE1lbnUgLT4gSGlkZQorCQkJCVN0cmluZyBzZWxlY3RlZEVuY29kaW5nID0gKChKTWVudUl0ZW0pZXYuZ2V0U291cmNlKCkpLmdldE5hbWUoKTsKKwkJCQkvLyBTaG91bGQgSSBwcm9tcHQgZm9yIHRoaXM/CisJCQkJaGlkZVJlc291cmNlcyhzZWxlY3RlZEVuY29kaW5nKTsKKwkJCX0gIGVsc2UgaWYgKGV2LmdldEFjdGlvbkNvbW1hbmQoKS5lcXVhbHMoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X3RyZWVfZGVsZXRlIikpICYmCisJCQkJCSAgICgoSk1lbnVJdGVtKWV2LmdldFNvdXJjZSgpKS5nZXROYW1lKCkgIT0gbnVsbCkgeyAgICAgICAgICAgICAgICAvLyBQb3B1cCBUcmVlIE1lbnUgLT4gRGVsZXRlCisJCQkJU3RyaW5nIHNlbGVjdGVkRW5jb2RpbmcgPSAoKEpNZW51SXRlbSlldi5nZXRTb3VyY2UoKSkuZ2V0TmFtZSgpOworCQkJCWludCByZXNwb25zZSA9IEpPcHRpb25QYW5lLnNob3dDb25maXJtRGlhbG9nKHRoaXMsCisJCQkJCVJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX2RlbGV0ZV93YXJuaW5nIiksCisJCQkJCVJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX3RpdGxlX3F1aXQiKSwgSk9wdGlvblBhbmUuWUVTX05PX0NBTkNFTF9PUFRJT04sCisJCQkJCUpPcHRpb25QYW5lLldBUk5JTkdfTUVTU0FHRSk7CisJCQkJaWYgKHJlc3BvbnNlID09IEpPcHRpb25QYW5lLllFU19PUFRJT04pIHsKKwkJCQkJZGVsZXRlUmVzb3VyY2VzKHNlbGVjdGVkRW5jb2RpbmcpOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoZXYuZ2V0QWN0aW9uQ29tbWFuZCgpLmVxdWFscyhSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfdHJlZV9uZXdfcHJvamVjdCIpKSkgeworCQkJCVN0cmluZyByZXNwb25zZSA9IEpPcHRpb25QYW5lLnNob3dJbnB1dERpYWxvZyh0aGlzLCAgICAgICAgICAgICAgICAgICAvLyBQb3B1cCBQcm9qZWN0IE1lbnUgLT4gTmV3IFByb2plY3QKKwkJCQkJUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJkaWFsb2dfbmV3X3Byb2plY3QiKSwgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJkaWFsb2dfdGl0bGVfbmV3X3Byb2plY3QiKSwKKwkJCQkJSk9wdGlvblBhbmUuUVVFU1RJT05fTUVTU0FHRSk7CisJCQkJaWYgKHJlc3BvbnNlID09IG51bGwgfHwgcmVzcG9uc2UudHJpbSgpLmVxdWFscygiIikpIHJldHVybjsKKwkJCQlwcm9qZWN0ID0gbmV3IFJCUHJvamVjdChyZXNwb25zZSk7CisJCQkJdXBkYXRlUHJvamVjdFRyZWUoKTsKKwkJCQl1cGRhdGVQcm9qZWN0UGFuZWxzKCk7CisJCQl9IGVsc2UgaWYgKGV2LmdldEFjdGlvbkNvbW1hbmQoKS5lcXVhbHMoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X3RyZWVfb3Blbl9wcm9qZWN0IikpKSB7CisJCQkJaW50IHJlc3VsdCA9IHByb2plY3RGaWxlQ2hvb3Nlci5zaG93T3BlbkRpYWxvZyh0aGlzKTsgICAgICAgICAgICAgICAgLy8gUG9wdXAgUHJvamVjdCBNZW51IC0+IE9wZW4gUHJvamVjdAorCQkJCWlmIChyZXN1bHQgPT0gSkZpbGVDaG9vc2VyLkFQUFJPVkVfT1BUSU9OKSB7CisJCQkJCUZpbGUgZiA9IHByb2plY3RGaWxlQ2hvb3Nlci5nZXRTZWxlY3RlZEZpbGUoKTsKKwkJCQkJdHJ5IHsKKwkJCQkJCXByb2plY3QgPSBuZXcgUkJQcm9qZWN0KGYpOworCQkJCQkJdXBkYXRlUHJvamVjdFRyZWUoKTsKKwkJCQkJCXVwZGF0ZVByb2plY3RQYW5lbHMoKTsKKwkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisJCQkJCQlKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyh0aGlzLAorCQkJCQkJCVJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZXJyb3JfY3JlYXRpbmdfcHJvamVjdCIpLAorCQkJCQkJCVJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX3RpdGxlX2Vycm9yIiksIEpPcHRpb25QYW5lLkVSUk9SX01FU1NBR0UpOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIGlmIChldi5nZXRBY3Rpb25Db21tYW5kKCkuZXF1YWxzKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV90cmVlX3NhdmVfcHJvamVjdCIpKSkgeworCQkJCWludCByZXN1bHQgPSBwcm9qZWN0RmlsZUNob29zZXIuc2hvd1NhdmVEaWFsb2codGhpcyk7ICAgICAgICAgICAgICAgIC8vIFBvcHVwIFByb2plY3QgTWVudSAtPiBTYXZlIFByb2plY3QKKwkJCQlpZiAocmVzdWx0ID09IEpGaWxlQ2hvb3Nlci5BUFBST1ZFX09QVElPTikgeworCQkJCQlGaWxlIGYgPSBwcm9qZWN0RmlsZUNob29zZXIuZ2V0U2VsZWN0ZWRGaWxlKCk7CisJCQkJCXRyeSB7CisJCQkJCQlwcm9qZWN0LndyaXRlKGYpOworCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKwkJCQkJCUpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKHRoaXMsCisJCQkJCQkJUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJlcnJvcl9zYXZpbmdfcHJvamVjdCIpLAorCQkJCQkJCVJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX3RpdGxlX2Vycm9yIiksIEpPcHRpb25QYW5lLkVSUk9SX01FU1NBR0UpOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIGlmIChldi5nZXRBY3Rpb25Db21tYW5kKCkuZXF1YWxzKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV90cmVlX2FkZF9wcm9qZWN0X2J1bmRsZSIpKSkgeworCQkJCWludCByZXN1bHQgPSBvcGVuRmlsZUNob29zZXIuc2hvd09wZW5EaWFsb2codGhpcyk7ICAgICAgICAgICAgICAgICAgIC8vIFBvcHVwIFByb2plY3QgTWVudSAtPiBBZGQgQnVuZGxlCisJCQkJaWYgKHJlc3VsdCA9PSBKRmlsZUNob29zZXIuQVBQUk9WRV9PUFRJT04pIHsKKwkJCQkJRmlsZSBmID0gb3BlbkZpbGVDaG9vc2VyLmdldFNlbGVjdGVkRmlsZSgpOworCQkJCQl0cnkgeworCQkJCQkJcHJvamVjdC5hZGRCdW5kbGUoZi5nZXRBYnNvbHV0ZVBhdGgoKSk7CisJCQkJCQl1cGRhdGVQcm9qZWN0VHJlZSgpOworCQkJCQkJdXBkYXRlUHJvamVjdFBhbmVscygpOworCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKwkJCQkJCUpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKHRoaXMsCisJCQkJCQkJUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJlcnJvcl9hZGRpbmdfcHJvamVjdF9idW5kbGUiKSwKKwkJCQkJCQlSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImRpYWxvZ190aXRsZV9lcnJvciIpLCBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSBpZiAoZXYuZ2V0QWN0aW9uQ29tbWFuZCgpLmVxdWFscyhSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfdHJlZV9yZW1vdmVfcHJvamVjdF9idW5kbGUiKSkpIHsKKwkJCQlTdHJpbmcgYnVuZGxlTmFtZSA9ICgoSk1lbnVJdGVtKWV2LmdldFNvdXJjZSgpKS5nZXROYW1lKCk7ICAgICAgICAgICAvLyBQb3B1cCBQcm9qZWN0IE1lbnUgLT4gUmVtb3ZlIEJ1bmRsZQorCQkJCXByb2plY3QucmVtb3ZlQnVuZGxlKGJ1bmRsZU5hbWUpOworCQkJCXVwZGF0ZVByb2plY3RUcmVlKCk7CisJCQkJdXBkYXRlUHJvamVjdFBhbmVscygpOworCQkJfSBlbHNlIGlmIChldi5nZXRBY3Rpb25Db21tYW5kKCkuZXF1YWxzKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV90cmVlX3NlbGVjdF9wcm9qZWN0X2J1bmRsZSIpKSkgeworCQkJCVN0cmluZyBidW5kbGVOYW1lID0gKChKTWVudUl0ZW0pZXYuZ2V0U291cmNlKCkpLmdldE5hbWUoKTsgICAgICAgICAgIC8vIFBvcHVwIFByb2plY3QgTWVudSAtPiBTZWxlY3QgQnVuZGxlCisJCQkJUkJNYW5hZ2VyIGJ1bmRsZSA9IHByb2plY3QuZ2V0QnVuZGxlKGJ1bmRsZU5hbWUpOworCQkJCXJibSA9IGJ1bmRsZTsKKwkJCQl1cGRhdGVEaXNwbGF5VHJlZSgpOworCQkJCXVwZGF0ZURpc3BsYXlQYW5lbHMoKTsKKwkJCX0gZWxzZSBpZiAoZXYuZ2V0QWN0aW9uQ29tbWFuZCgpLmVxdWFscyhSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZmlsZV9xdWl0IikpKSB7CisJCQkJCQkJCQkJCQkJCQkJCQkJCQkgICAvLyBNZW51IC0+IEZpbGUgLT4gUXVpdAorCQkJCXRoaXNXaW5kb3dDbG9zaW5nKG51bGwpOworCQkJCXJldHVybjsKKwkJCX0gZWxzZSBpZiAoZXYuZ2V0QWN0aW9uQ29tbWFuZCgpLmVxdWFscyhSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZmlsZV9uZXciKSkpIHsKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgIC8vIE1lbnUgLT4gRmlsZSAtPiBOZXcgUmVzb3VyY2UgQnVuZGxlCisJCQkJcHJvbXB0Rm9yU2F2ZShudWxsKTsKKwkJCQlTdHJpbmcgb2xkVXNlciA9IGdldFVzZXIoKTsKKwkJCQlpZiAocmJtICE9IG51bGwgJiYgcmJtLmdldFVzZXIoKSAhPSBudWxsICYmICEocmJtLmdldFVzZXIoKS5lcXVhbHMoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJ1bmtub3duX3VzZXIiKSkpKQorCQkJCQlvbGRVc2VyID0gcmJtLmdldFVzZXIoKTsKKwkJCQlTdHJpbmcgcmVzcG9uc2UgPSBKT3B0aW9uUGFuZS5zaG93SW5wdXREaWFsb2codGhpcywKKwkJCQkJUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJkaWFsb2dfbmV3X2Jhc2VjbGFzcyIpLCBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImRpYWxvZ190aXRsZV9uZXdfYnVuZGxlIiksCisJCQkJCUpPcHRpb25QYW5lLlFVRVNUSU9OX01FU1NBR0UpOworCQkJCWlmIChyZXNwb25zZSAhPSBudWxsKSB7CisJCQkJCS8vIFRlc3QgdGhlIHJlc3BvbnNlIGZvciB3aGl0ZSBzcGFjZQorCQkJCQlpZiAocmVzcG9uc2UuaW5kZXhPZigiICIpID4gMCB8fCByZXNwb25zZS5pbmRleE9mKCJcdCIpID4gMCB8fCByZXNwb25zZS5pbmRleE9mKCJcbiIpID4gMCkgeworCQkJCQkJSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2codGhpcywKKwkJCQkJCQlSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImVycm9yX2Jhc2VjbGFzc193aGl0ZXNwYWNlIikgKyAiXG4iICsgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJlcnJvcl9idW5kbGVfbm90X2NyZWF0ZWQiKSwKKwkJCQkJCQlSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImRpYWxvZ190aXRsZV9lcnJvcl9jcmVhdGluZ19idW5kbGUiKSwgSk9wdGlvblBhbmUuRVJST1JfTUVTU0FHRSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlyYm0gPSBuZXcgUkJNYW5hZ2VyKHJlc3BvbnNlKTsKKwkJCQkJCXVwZGF0ZURpc3BsYXlUcmVlKCk7CisJCQkJCQl1cGRhdGVQcm9qZWN0VHJlZSgpOworCQkJCQkJdXBkYXRlUHJvamVjdFBhbmVscygpOworCQkJCQkJdXBkYXRlRGlzcGxheVBhbmVscygpOworCQkJCQl9CisJCQkJfQorCQkJCS8vIFVwZGF0ZSB0aGUgdXNlciBpbmZvcm1hdGlvbgorCQkJCWlmIChvbGRVc2VyLmVxdWFscyhSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInVua25vd25fdXNlciIpKSkgeworCQkJCQlTdHJpbmcgdXNlciA9IEpPcHRpb25QYW5lLnNob3dJbnB1dERpYWxvZyh0aGlzLAorCQkJCQkJUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJkaWFsb2dfdXNlcl9uYW1lIiksIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX3RpdGxlX3VzZXJfbmFtZSIpLAorCQkJCQkJSk9wdGlvblBhbmUuUVVFU1RJT05fTUVTU0FHRSk7CisJCQkJCWlmICh1c2VyICE9IG51bGwgJiYgISh1c2VyLmVxdWFscygiIikpKSBzZXRVc2VyKHVzZXIpOworCQkJCX0gZWxzZSByYm0uc2V0VXNlcihvbGRVc2VyKTsKKwkJCX0gZWxzZSBpZiAoZXYuZ2V0QWN0aW9uQ29tbWFuZCgpLmVxdWFscyhSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZmlsZV9vcGVuIikpKSB7CisJCQkJCQkJCQkJCQkJCQkJCQkJCQkgICAvLyBNZW51IC0+IEZpbGUgLT4gT3BlbiBSZXNvdXJjZSBCdW5kbGUKKwkJCQlwcm9tcHRGb3JTYXZlKG51bGwpOworCQkJCVN0cmluZyBvbGRVc2VyID0gZ2V0VXNlcigpOworCQkJCWlmIChyYm0gIT0gbnVsbCAmJiByYm0uZ2V0VXNlcigpICE9IG51bGwgJiYgIShyYm0uZ2V0VXNlcigpLmVxdWFscyhSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInVua25vd25fdXNlciIpKSkpCisJCQkJCW9sZFVzZXIgPSByYm0uZ2V0VXNlcigpOworCQkJCW9wZW5GaWxlQ2hvb3Nlci5zZXRTZWxlY3RlZEZpbGUobmV3IEZpbGUoIlJlc291cmNlcyIgKyBGaWxlLnNlcGFyYXRvciArICJSQk1hbmFnZXIucHJvcGVydGllcyIpKTsKKwkJCQlpbnQgc3RhdHVzID0gb3BlbkZpbGVDaG9vc2VyLnNob3dPcGVuRGlhbG9nKHRoaXMpOworCQkJCWlmIChzdGF0dXMgPT0gSkZpbGVDaG9vc2VyLkNBTkNFTF9PUFRJT04pIHsKKwkJCQkJLy8gRmlsZSBvcGVuaW5nIGNhbmNlbGVkCisJCQkJfSBlbHNlIGlmIChzdGF0dXMgPT0gSkZpbGVDaG9vc2VyLkVSUk9SX09QVElPTikgeworCQkJCQkvLyBFcnJvciBpbiBmaWxlIG9wZW4KKwkJCQl9IGVsc2UgeworCQkJCQkvLyBBIGZpbGUgaGFzIGJlZW4gc2VsZWN0ZWQKKwkJCQkJdHJ5IHsKKwkJCQkJCXJibSA9IG5ldyBSQk1hbmFnZXIob3BlbkZpbGVDaG9vc2VyLmdldFNlbGVjdGVkRmlsZSgpKTsKKwkJCQkJCXVwZGF0ZURpc3BsYXlUcmVlKCk7CisJCQkJCQl1cGRhdGVQcm9qZWN0VHJlZSgpOworCQkJCQkJdXBkYXRlUHJvamVjdFBhbmVscygpOworCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKwkJCQkJCS8vIFNob3VsZCBwcm92aWRlIHNvbWUgYWxlcnQgaGVyZQorCQkJCQkJU3lzdGVtLmVyci5wcmludGxuKCJDb3VsZCBub3Qgb3BlbiB0aGUgZmlsZSAiICsgb3BlbkZpbGVDaG9vc2VyLmdldFNlbGVjdGVkRmlsZSgpLmdldEFic29sdXRlUGF0aCgpICsKKwkJCQkJCQkJCQkgICAiOiAiICsgaW9lLmdldE1lc3NhZ2UoKSk7CisJCQkJCQlyYm0gPSBudWxsOworCQkJCQl9CisJCQkJfQorCQkJCWlmIChyYm0gPT0gbnVsbCkgcmV0dXJuOworCQkJCS8vIFVwZGF0ZSB0aGUgdXNlciBpbmZvcm1hdGlvbgorCQkJCWlmIChvbGRVc2VyLmVxdWFscyhSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInVua25vd25fdXNlciIpKSkgeworCQkJCQlTdHJpbmcgdXNlciA9IEpPcHRpb25QYW5lLnNob3dJbnB1dERpYWxvZyh0aGlzLAorCQkJCQkJUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJkaWFsb2dfdXNlcl9uYW1lIiksIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX3RpdGxlX3VzZXJfbmFtZSIpLAorCQkJCQkJSk9wdGlvblBhbmUuUVVFU1RJT05fTUVTU0FHRSk7CisJCQkJCWlmICh1c2VyICE9IG51bGwgJiYgISh1c2VyLmVxdWFscygiIikpKQorCQkJCQkJc2V0VXNlcih1c2VyKTsKKwkJCQl9IGVsc2UKKwkJCQkJcmJtLnNldFVzZXIob2xkVXNlcik7CisJCQl9IGVsc2UgaWYgKGV2LmdldEFjdGlvbkNvbW1hbmQoKS5lcXVhbHMoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2ZpbGVfc2F2ZSIpKSkgeworCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgLy8gTWVudSAtPiBGaWxlIC0+IFNhdmUgUmVzb3VyY2UgQnVuZGxlCisJCQkJc2F2ZVJlc291cmNlcygpOworCQkJfSBlbHNlIGlmIChldi5nZXRBY3Rpb25Db21tYW5kKCkuZXF1YWxzKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9maWxlX3NhdmVhcyIpKSkgeworCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgLy8gTWVudSAtPiBGaWxlIC0+IFNhdmUgUmVzb3VyY2UgQnVuZGxlIEFzCisJCQkJc2F2ZVJlc291cmNlc0FzKCk7CisJCQl9IGVsc2UgaWYgKGV2LmdldEFjdGlvbkNvbW1hbmQoKS5lcXVhbHMoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2ZpbGVfaW1wb3J0X3Byb3BlcnRpZXMiKSkpIHsKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgIC8vIE1lbnUgLT4gRmlsZSAtPiBJbXBvcnQgLT4gUHJvcGVydGllcworCQkJCWlmIChyYm0gPT0gbnVsbCB8fCByYm0uZ2V0QnVuZGxlcygpID09IG51bGwpIHJldHVybjsKKwkJCQlSQlByb3BlcnRpZXNJbXBvcnRlciBpbXBvcnRlciA9IG5ldyBSQlByb3BlcnRpZXNJbXBvcnRlcihSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImltcG9ydF9wcm9wZXJ0aWVzX3RpdGxlIiksIHJibSwgdGhpcyk7CisJCQl9IGVsc2UgaWYgKGV2LmdldEFjdGlvbkNvbW1hbmQoKS5lcXVhbHMoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2ZpbGVfaW1wb3J0X2phdmEiKSkpIHsKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgIC8vIE1lbnUgLT4gRmlsZSAtPiBJbXBvcnQgLT4gSmF2YQorCQkJCWlmIChyYm0gPT0gbnVsbCB8fCByYm0uZ2V0QnVuZGxlcygpID09IG51bGwpIHJldHVybjsKKwkJCQlSQkphdmFJbXBvcnRlciBpbXBvcnRlciA9IG5ldyBSQkphdmFJbXBvcnRlcihSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImltcG9ydF9qYXZhX3RpdGxlIiksIHJibSwgdGhpcyk7CisJCQl9IGVsc2UgaWYgKGV2LmdldEFjdGlvbkNvbW1hbmQoKS5lcXVhbHMoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2ZpbGVfaW1wb3J0X1RNWCIpKSkgeworCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgLy8gTWVudSAtPiBGaWxlIC0+IEltcG9ydCAtPiBUTVgKKwkJCQlpZiAocmJtID09IG51bGwgfHwgcmJtLmdldEJ1bmRsZXMoKSA9PSBudWxsKQorCQkJCQlyZXR1cm47CisJCQkJUkJUTVhJbXBvcnRlciBpbXBvcnRlciA9IG5ldyBSQlRNWEltcG9ydGVyKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiaW1wb3J0X1RNWF90aXRsZSIpLCByYm0sIHRoaXMpOworCQkJfSBlbHNlIGlmIChldi5nZXRBY3Rpb25Db21tYW5kKCkuZXF1YWxzKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9maWxlX2ltcG9ydF9YTEYiKSkpIHsKKwkJCQkgICAvLyBNZW51IC0+IEZpbGUgLT4gSW1wb3J0IC0+IFhMSUZGCisJCQkJaWYgKHJibSA9PSBudWxsIHx8IHJibS5nZXRCdW5kbGVzKCkgPT0gbnVsbCkKKwkJCQkgICAgcmV0dXJuOworCQkJCVJCeGxpZmZJbXBvcnRlciBpbXBvcnRlciA9IG5ldyBSQnhsaWZmSW1wb3J0ZXIoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJpbXBvcnRfWExGX3RpdGxlIiksIHJibSwgdGhpcyk7CisJCQl9IGVsc2UgaWYgKGV2LmdldEFjdGlvbkNvbW1hbmQoKS5lcXVhbHMoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2ZpbGVfZXhwb3J0X3Byb3BlcnRpZXMiKSkpIHsKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgIC8vIE1lbnUgLT4gRmlsZSAtPiBFeHBvcnQgLT4gUHJvcGVydGllcworCQkJCVJCUHJvcGVydGllc0V4cG9ydGVyIGV4cCA9IG5ldyBSQlByb3BlcnRpZXNFeHBvcnRlcigpOworCQkJCXRyeSB7CisJCQkJCWlmIChyYm0gIT0gbnVsbCAmJiByYm0uZ2V0QnVuZGxlcygpICE9IG51bGwpCisJCQkJCQlleHAuZXhwb3J0KHJibSk7CisJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisJCQkJCUpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKHRoaXMsIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZXJyb3JfZXhwb3J0IiksCisJCQkJCQkJCQkJCQkgIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZXJyb3IiKSwgSk9wdGlvblBhbmUuRVJST1JfTUVTU0FHRSk7CisJCQkJfQorCQkJfSBlbHNlIGlmIChldi5nZXRBY3Rpb25Db21tYW5kKCkuZXF1YWxzKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9maWxlX2V4cG9ydF9qYXZhIikpKSB7CisJCQkJCQkJCQkJCQkJCQkJCQkJCQkgICAvLyBNZW51IC0+IEZpbGUgLT4gRXhwb3J0IC0+IEphdmEKKwkJCQlSQkphdmFFeHBvcnRlciBleHAgPSBuZXcgUkJKYXZhRXhwb3J0ZXIoKTsKKwkJCQl0cnkgeworCQkJCQlpZiAocmJtICE9IG51bGwgJiYgcmJtLmdldEJ1bmRsZXMoKSAhPSBudWxsKSBleHAuZXhwb3J0KHJibSk7CisJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisJCQkJCUpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKHRoaXMsIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZXJyb3JfZXhwb3J0IiksCisJCQkJCQkJCQkJCQkgIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZXJyb3IiKSwgSk9wdGlvblBhbmUuRVJST1JfTUVTU0FHRSk7CisJCQkJfQorCQkJfSBlbHNlIGlmIChldi5nZXRBY3Rpb25Db21tYW5kKCkuZXF1YWxzKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9maWxlX2V4cG9ydF9JQ1UiKSkpIHsKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgIC8vIE1lbnUgLT4gRmlsZSAtPiBFeHBvcnQgLT4gSmF2YQorCQkJCVJCSUNVRXhwb3J0ZXIgZXhwID0gbmV3IFJCSUNVRXhwb3J0ZXIoKTsKKwkJCQl0cnkgeworCQkJCQlpZiAocmJtICE9IG51bGwgJiYgcmJtLmdldEJ1bmRsZXMoKSAhPSBudWxsKSBleHAuZXhwb3J0KHJibSk7CisJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisJCQkJCUpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKHRoaXMsIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZXJyb3JfZXhwb3J0IiksCisJCQkJCQkJCQkJCQkgIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZXJyb3IiKSwgSk9wdGlvblBhbmUuRVJST1JfTUVTU0FHRSk7CisJCQkJfQorCQkJfSBlbHNlIGlmIChldi5nZXRBY3Rpb25Db21tYW5kKCkuZXF1YWxzKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9maWxlX2V4cG9ydF9UTVgiKSkpIHsKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgIC8vIE1lbnUgLT4gRmlsZSAtPiBFeHBvcnQgLT4gVE1YCisJCQkJUkJUTVhFeHBvcnRlciBleHAgPSBuZXcgUkJUTVhFeHBvcnRlcigpOworCQkJCXRyeSB7CisJCQkJCWlmIChyYm0gIT0gbnVsbCAmJiByYm0uZ2V0QnVuZGxlcygpICE9IG51bGwpIGV4cC5leHBvcnQocmJtKTsKKwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKwkJCQkJSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2codGhpcywgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJlcnJvcl9leHBvcnQiKSwKKwkJCQkJCQkJCQkJCSAgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJlcnJvciIpLCBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKGV2LmdldEFjdGlvbkNvbW1hbmQoKS5lcXVhbHMoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2ZpbGVfZXhwb3J0X1hMRiIpKSkgeworCQkJCSAgIC8vIE1lbnUgLT4gRmlsZSAtPiBFeHBvcnQgLT4gWExJRkYKKwkJCQlSQnhsaWZmRXhwb3J0ZXIgZXhwID0gbmV3IFJCeGxpZmZFeHBvcnRlcigpOworCQkJCXRyeSB7CisJCQkJCWlmIChyYm0gIT0gbnVsbCAmJiByYm0uZ2V0QnVuZGxlcygpICE9IG51bGwpCisJCQkJCSAgICBleHAuZXhwb3J0KHJibSk7CisJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisJCQkJCUpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKHRoaXMsIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZXJyb3JfZXhwb3J0IiksCisJCQkJCVJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZXJyb3IiKSwgSk9wdGlvblBhbmUuRVJST1JfTUVTU0FHRSk7CisJCQkJfQorCQkJfSBlbHNlIGlmIChldi5nZXRBY3Rpb25Db21tYW5kKCkuZXF1YWxzKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9vcHRpb25zX2FkZGZpbGUiKSkpIHsKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgIC8vIE1lbnUgLT4gT3B0aW9ucyAtPiBBZGQgTmV3IFJlc291cmNlCisJCQkJY3JlYXRlUmVzb3VyY2VGaWxlKCk7CisJCQl9IGVsc2UgaWYgKGV2LmdldEFjdGlvbkNvbW1hbmQoKS5lcXVhbHMoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X29wdGlvbnNfYWRkZ3JvdXAiKSkgfHwKKwkJCQkJICAgZXYuZ2V0QWN0aW9uQ29tbWFuZCgpLmVxdWFscyhSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImJ1dHRvbl9jcmVhdGVfZ3JvdXAiKSkpIHsKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgIC8vIE1lbnUgLT4gT3B0aW9ucyAtPiBBZGQgTmV3IEdyb3VwCisJCQkJY3JlYXRlQnVuZGxlR3JvdXAoKTsKKwkJCX0gZWxzZSBpZiAoZXYuZ2V0QWN0aW9uQ29tbWFuZCgpLmVxdWFscyhSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfb3B0aW9uc19hZGRlbnRyeSIpKSkgeworCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgLy8gTWVudSAtPiBPcHRpb25zIC0+IEFkZCBOZXcgRW50cnkKKwkJCQljcmVhdGVCdW5kbGVJdGVtKCk7CisJCQl9IGVsc2UgaWYgKGV2LmdldEFjdGlvbkNvbW1hbmQoKS5lcXVhbHMoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X29wdGlvbnNfcHJlZmVyZW5jZXMiKSkpIHsKKwkJCQkJCQkJCQkJCQkJCQkJCQkJCSAgIC8vIE1lbnUgLT4gT3B0aW9ucyAtPiBQcmVmZXJlbmNlcworCQkJCVByZWZlcmVuY2VzRGlhbG9nIHBkID0gbmV3IFByZWZlcmVuY2VzRGlhbG9nKHRoaXMpOworCQkJfSBlbHNlIGlmIChldi5nZXRBY3Rpb25Db21tYW5kKCkuZXF1YWxzKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9oZWxwX2Fib3V0IikpKSB7IAorCQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgLy8gTWVudSAtPiBIZWxwIC0+IEFib3V0IFJCTWFuYWdlcgorCQkJCUFib3V0RGlhbG9nLnNob3dEaWFsb2codGhpcyk7CisJCQl9IGVsc2UgUkJNYW5hZ2VyR1VJLmRlYnVnTXNnKCJNaXNzZWQgQWN0aW9uIENvbW1hbmQ6ICIgKyBldi5nZXRBY3Rpb25Db21tYW5kKCkpOworCQkJCisJCX0KKwkJCisJfQorCQorCS8qKgorCSAqIEhhbmRsZXMgZXZlbnRzIGdlbmVyYXRlZAorCSAqLworCQorCXB1YmxpYyB2b2lkIG1vdXNlUG9wdXAoTW91c2VFdmVudCBldikgeworCQlpZiAoZXYuZ2V0U291cmNlKCkgPT0galRyZWVEaXNwbGF5KSB7CisJCQlpbnQgc2VsUm93ID0galRyZWVEaXNwbGF5LmdldFJvd0ZvckxvY2F0aW9uKGV2LmdldFgoKSwgZXYuZ2V0WSgpKTsKKwkJCVRyZWVQYXRoIHNlbFBhdGggPSBqVHJlZURpc3BsYXkuZ2V0UGF0aEZvckxvY2F0aW9uKGV2LmdldFgoKSwgZXYuZ2V0WSgpKTsKKwkJCWlmIChzZWxSb3cgIT0gLTEpIHsKKwkJCSAgICBpZiAoZXYuZ2V0Q2xpY2tDb3VudCgpID09IDEpIHsKKwkJCQkJRGVmYXVsdE11dGFibGVUcmVlTm9kZSBub2RlID0gKERlZmF1bHRNdXRhYmxlVHJlZU5vZGUpc2VsUGF0aC5nZXRMYXN0UGF0aENvbXBvbmVudCgpOworCQkJCQlPYmplY3Qgb2JqID0gbm9kZS5nZXRVc2VyT2JqZWN0KCk7CisJCQkJCWlmIChvYmogPT0gbnVsbCB8fCAhKG9iaiBpbnN0YW5jZW9mIEJ1bmRsZSkpIHJldHVybjsKKwkJCQkJQnVuZGxlIGJ1bmRsZSA9IChCdW5kbGUpb2JqOworCQkJCQlTdHJpbmcgZW5jb2RpbmcgPSBidW5kbGUuZW5jb2Rpbmc7CisJCQkJCWlmIChlbmNvZGluZyA9PSBudWxsKSBlbmNvZGluZyA9IG5ldyBTdHJpbmcoKTsKKwkJCQkJCQkKKwkJCQkJLy8gQ3JlYXRlIHRoZSBtZW51IHRvIGRpc3BsYXkKKwkJCQkJSlBvcHVwTWVudSBwb3B1cE1lbnUgPSBuZXcgSlBvcHVwTWVudSgpOworCQkJCQlKTWVudUl0ZW0gc2F2ZUl0ZW0gPSBuZXcgSk1lbnVJdGVtKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV90cmVlX3NhdmUiKSk7CisJCQkJCUpNZW51SXRlbSBoaWRlSXRlbSA9IG5ldyBKTWVudUl0ZW0oUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X3RyZWVfaGlkZSIpKTsKKwkJCQkJSk1lbnVJdGVtIGRlbGV0ZUl0ZW0gPSBuZXcgSk1lbnVJdGVtKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV90cmVlX2RlbGV0ZSIpKTsKKwkJCQkJCQkKKwkJCQkJc2F2ZUl0ZW0uc2V0TmFtZShlbmNvZGluZyk7IHNhdmVJdGVtLmFkZEFjdGlvbkxpc3RlbmVyKHRoaXMpOworCQkJCQloaWRlSXRlbS5zZXROYW1lKGVuY29kaW5nKTsgaGlkZUl0ZW0uYWRkQWN0aW9uTGlzdGVuZXIodGhpcyk7CisJCQkJCWRlbGV0ZUl0ZW0uc2V0TmFtZShlbmNvZGluZyk7IGRlbGV0ZUl0ZW0uYWRkQWN0aW9uTGlzdGVuZXIodGhpcyk7CisJCQkJCQkJCisJCQkJCXBvcHVwTWVudS5hZGQoc2F2ZUl0ZW0pOworCQkJCQlpZiAobm9kZS5nZXRMZXZlbCgpICE9IDEpIHsKKwkJCQkJCXBvcHVwTWVudS5hZGQoaGlkZUl0ZW0pOworCQkJCQkJcG9wdXBNZW51LmFkZChkZWxldGVJdGVtKTsKKwkJCQkJfQorCQkJCQkJCQorCQkJCQlwb3B1cE1lbnUuc2hvdyhldi5nZXRDb21wb25lbnQoKSwgZXYuZ2V0WCgpLCBldi5nZXRZKCkpOworCQkJICAgIH0KKwkJCX0KKwkJfSBlbHNlIGlmIChldi5nZXRTb3VyY2UoKSA9PSBwcm9qZWN0VHJlZSkgeworCQkJaW50IHNlbFJvdyA9IHByb2plY3RUcmVlLmdldFJvd0ZvckxvY2F0aW9uKGV2LmdldFgoKSwgZXYuZ2V0WSgpKTsKKwkJCVRyZWVQYXRoIHNlbFBhdGggPSBwcm9qZWN0VHJlZS5nZXRQYXRoRm9yTG9jYXRpb24oZXYuZ2V0WCgpLCBldi5nZXRZKCkpOworCQkJaWYgKHNlbFJvdyAhPSAtMSAmJiBldi5nZXRDbGlja0NvdW50KCkgPT0gMSkgeworCQkJCURlZmF1bHRNdXRhYmxlVHJlZU5vZGUgbm9kZSA9IChEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKXNlbFBhdGguZ2V0TGFzdFBhdGhDb21wb25lbnQoKTsKKwkJCQlPYmplY3Qgb2JqID0gbm9kZS5nZXRVc2VyT2JqZWN0KCk7CisJCQkJaWYgKG9iaiA9PSBudWxsKSByZXR1cm47CisJCQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgU3RyaW5nKSB7CisJCQkJCUpQb3B1cE1lbnUgcG9wdXBNZW51ID0gbmV3IEpQb3B1cE1lbnUoKTsKKwkJCQkJSk1lbnVJdGVtIG5ld0l0ZW0gPSBuZXcgSk1lbnVJdGVtKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV90cmVlX25ld19wcm9qZWN0IikpOworCQkJCQlKTWVudUl0ZW0gb3Blbkl0ZW0gPSBuZXcgSk1lbnVJdGVtKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV90cmVlX29wZW5fcHJvamVjdCIpKTsKKwkJCQkJSk1lbnVJdGVtIHNhdmVJdGVtID0gbmV3IEpNZW51SXRlbShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfdHJlZV9zYXZlX3Byb2plY3QiKSk7CisJCQkJCW5ld0l0ZW0uYWRkQWN0aW9uTGlzdGVuZXIodGhpcyk7CisJCQkJCW9wZW5JdGVtLmFkZEFjdGlvbkxpc3RlbmVyKHRoaXMpOworCQkJCQlzYXZlSXRlbS5hZGRBY3Rpb25MaXN0ZW5lcih0aGlzKTsKKwkJCQkJcG9wdXBNZW51LmFkZChuZXdJdGVtKTsKKwkJCQkJcG9wdXBNZW51LmFkZChvcGVuSXRlbSk7CisJCQkJCXBvcHVwTWVudS5hZGQoc2F2ZUl0ZW0pOworCQkJCQlwb3B1cE1lbnUuc2hvdyhldi5nZXRDb21wb25lbnQoKSwgZXYuZ2V0WCgpLCBldi5nZXRZKCkpOworCQkJCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUkJQcm9qZWN0KSB7CisJCQkJCUpQb3B1cE1lbnUgcG9wdXBNZW51ID0gbmV3IEpQb3B1cE1lbnUoKTsKKwkJCQkJSk1lbnVJdGVtIG5ld0l0ZW0gPSBuZXcgSk1lbnVJdGVtKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV90cmVlX25ld19wcm9qZWN0IikpOworCQkJCQlKTWVudUl0ZW0gb3Blbkl0ZW0gPSBuZXcgSk1lbnVJdGVtKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV90cmVlX29wZW5fcHJvamVjdCIpKTsKKwkJCQkJSk1lbnVJdGVtIHNhdmVJdGVtID0gbmV3IEpNZW51SXRlbShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfdHJlZV9zYXZlX3Byb2plY3QiKSk7CisJCQkJCUpNZW51SXRlbSBhZGRJdGVtID0gbmV3IEpNZW51SXRlbShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfdHJlZV9hZGRfcHJvamVjdF9idW5kbGUiKSk7CisJCQkJCW5ld0l0ZW0uYWRkQWN0aW9uTGlzdGVuZXIodGhpcyk7CisJCQkJCW9wZW5JdGVtLmFkZEFjdGlvbkxpc3RlbmVyKHRoaXMpOworCQkJCQlzYXZlSXRlbS5hZGRBY3Rpb25MaXN0ZW5lcih0aGlzKTsKKwkJCQkJYWRkSXRlbS5hZGRBY3Rpb25MaXN0ZW5lcih0aGlzKTsKKwkJCQkJcG9wdXBNZW51LmFkZChuZXdJdGVtKTsKKwkJCQkJcG9wdXBNZW51LmFkZChvcGVuSXRlbSk7CisJCQkJCXBvcHVwTWVudS5hZGQoc2F2ZUl0ZW0pOworCQkJCQlwb3B1cE1lbnUuYWRkKGFkZEl0ZW0pOworCQkJCQlwb3B1cE1lbnUuc2hvdyhldi5nZXRDb21wb25lbnQoKSwgZXYuZ2V0WCgpLCBldi5nZXRZKCkpOworCQkJCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUkJNYW5hZ2VyKSB7CisJCQkJCVJCTWFuYWdlciByYm0gPSAoUkJNYW5hZ2VyKW9iajsKKwkJCQkJSlBvcHVwTWVudSBwb3B1cE1lbnUgPSBuZXcgSlBvcHVwTWVudSgpOworCQkJCQlKTWVudUl0ZW0gc2VsZWN0SXRlbSA9IG5ldyBKTWVudUl0ZW0oUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X3RyZWVfc2VsZWN0X3Byb2plY3RfYnVuZGxlIikpOworCQkJCQlKTWVudUl0ZW0gcmVtb3ZlSXRlbSA9IG5ldyBKTWVudUl0ZW0oUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X3RyZWVfcmVtb3ZlX3Byb2plY3RfYnVuZGxlIikpOworCQkJCQlzZWxlY3RJdGVtLnNldE5hbWUocmJtLmdldEJhc2VDbGFzcygpKTsKKwkJCQkJcmVtb3ZlSXRlbS5zZXROYW1lKHJibS5nZXRCYXNlQ2xhc3MoKSk7CisJCQkJCXNlbGVjdEl0ZW0uYWRkQWN0aW9uTGlzdGVuZXIodGhpcyk7CisJCQkJCXJlbW92ZUl0ZW0uYWRkQWN0aW9uTGlzdGVuZXIodGhpcyk7CisJCQkJCXBvcHVwTWVudS5hZGQoc2VsZWN0SXRlbSk7CisJCQkJCXBvcHVwTWVudS5hZGQocmVtb3ZlSXRlbSk7CisJCQkJCXBvcHVwTWVudS5zaG93KGV2LmdldENvbXBvbmVudCgpLCBldi5nZXRYKCksIGV2LmdldFkoKSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCQorCXB1YmxpYyB2b2lkIG1vdXNlUHJlc3NlZChNb3VzZUV2ZW50IGV2KSAgeworCQlpZiAoZXYuaXNQb3B1cFRyaWdnZXIoKSkgeworCQkJbW91c2VQb3B1cChldik7CisJCX0KKwl9CisJCisJcHVibGljIHZvaWQgbW91c2VSZWxlYXNlZChNb3VzZUV2ZW50IGV2KSB7CisJCWlmIChldi5pc1BvcHVwVHJpZ2dlcigpKSB7CisJCQltb3VzZVBvcHVwKGV2KTsKKwkJCXJldHVybjsKKwkJfQorCQkvLyBOb3QgdGhlIHBvcHVwIHRyaWdnZXIKKwl9CisJCisJcHVibGljIHZvaWQgbW91c2VFbnRlcmVkKE1vdXNlRXZlbnQgZXYpICB7IH0KKwkKKwlwdWJsaWMgdm9pZCBtb3VzZUV4aXRlZChNb3VzZUV2ZW50IGV2KSAgIHsgfQorCQorCXB1YmxpYyB2b2lkIG1vdXNlQ2xpY2tlZChNb3VzZUV2ZW50IGV2KSB7CisJCWlmIChldi5nZXRDbGlja0NvdW50KCkgPT0gMiAmJiBldi5nZXRTb3VyY2UoKSBpbnN0YW5jZW9mIEpUYWJsZSkgeworCQkJLy8gV2UgYXJlIGdvaW5nIHRvIGRpc3BsYXkgdGhlIGVkaXQgZnJhbWUgZm9yIHRoZSBpdGVtIHNlbGVjdGVkCisJCQlCdW5kbGVJdGVtIGl0ZW0gPSBudWxsOworCQkJSlRhYmxlIHRhYmxlID0gKEpUYWJsZSkgZXYuZ2V0U291cmNlKCk7CisJCQlpZiAodGFibGUuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFVudHJhbnNsYXRlZEl0ZW1zVGFibGVNb2RlbCkgeworCQkJCWludCByb3cgPSB0YWJsZS5nZXRTZWxlY3RlZFJvdygpOworCQkJCVVudHJhbnNsYXRlZEl0ZW1zVGFibGVNb2RlbCBtb2RlbCA9IChVbnRyYW5zbGF0ZWRJdGVtc1RhYmxlTW9kZWwpdGFibGUuZ2V0TW9kZWwoKTsKKwkJCQlpdGVtID0gbW9kZWwuZ2V0QnVuZGxlSXRlbShyb3cpOworCQkJCUJ1bmRsZUl0ZW1EaWFsb2cgYmlEaWFsb2cgPSBuZXcgQnVuZGxlSXRlbURpYWxvZyhyYm0sIGl0ZW0sIChyYm0gPT0gbnVsbCA/ICIiIDogcmJtLmdldFVzZXIoKSksCisJCQkJCQkJCQkJCQkJCQkgdGhpcywgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJkaWFsb2dfdGl0bGVfZWRpdF9pdGVtIiksIHRydWUpOworCQkJCW1vZGVsLnVwZGF0ZSgpOworCQkJfSBlbHNlIGlmICh0YWJsZS5nZXRNb2RlbCgpIGluc3RhbmNlb2YgU2VhcmNoSXRlbXNUYWJsZU1vZGVsKSB7CisJCQkJaW50IHJvdyA9IHRhYmxlLmdldFNlbGVjdGVkUm93KCk7CisJCQkJU2VhcmNoSXRlbXNUYWJsZU1vZGVsIG1vZGVsID0gKFNlYXJjaEl0ZW1zVGFibGVNb2RlbCl0YWJsZS5nZXRNb2RlbCgpOworCQkJCWl0ZW0gPSBtb2RlbC5nZXRCdW5kbGVJdGVtKHJvdyk7CisJCQkJQnVuZGxlSXRlbURpYWxvZyBiaURpYWxvZyA9IG5ldyBCdW5kbGVJdGVtRGlhbG9nKHJibSwgaXRlbSwgKHJibSA9PSBudWxsID8gIiIgOiByYm0uZ2V0VXNlcigpKSwKKwkJCQkJCQkJCQkJCQkJCSB0aGlzLCBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImRpYWxvZ190aXRsZV9lZGl0X2l0ZW0iKSwgdHJ1ZSk7CisJCQkJbW9kZWwudXBkYXRlKCk7CisJCQl9IGVsc2UgaWYgKHRhYmxlLmdldE1vZGVsKCkgaW5zdGFuY2VvZiBHcm91cEl0ZW1zVGFibGVNb2RlbCkgeworCQkJCWludCByb3cgPSB0YWJsZS5nZXRTZWxlY3RlZFJvdygpOworCQkJCUdyb3VwSXRlbXNUYWJsZU1vZGVsIG1vZGVsID0gKEdyb3VwSXRlbXNUYWJsZU1vZGVsKXRhYmxlLmdldE1vZGVsKCk7CisJCQkJaXRlbSA9IG1vZGVsLmdldEJ1bmRsZUl0ZW0ocm93KTsKKwkJCQlCdW5kbGVJdGVtRGlhbG9nIGJpRGlhbG9nID0gbmV3IEJ1bmRsZUl0ZW1EaWFsb2cocmJtLCBpdGVtLCAocmJtID09IG51bGwgPyAiIiA6IHJibS5nZXRVc2VyKCkpLAorCQkJCQkJCQkJCQkJCQkJIHRoaXMsIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX3RpdGxlX2VkaXRfaXRlbSIpLCB0cnVlKTsKKwkJCQltb2RlbC51cGRhdGUoKTsKKwkJCX0KKwkJCXVwZGF0ZURpc3BsYXlQYW5lbHMoKTsKKwkJfQorCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQcm9qZWN0UGFuZWxzKCkgeworCQlwcm9qZWN0UGFuZWwudXBkYXRlQ29tcG9uZW50cygpOworCX0KKwkKKwkvLyBVcGRhdGUgdGhlIGRpc3BsYXkgb2YgdGhlIG1haW4gcGFuZWxzIChzdGF0cywgdW50cmFucywgZ3JvdXBzKS4gU2hvdWxkIGJlIGNhbGxlZCBhZnRlciBhIG5ldyB0cmVlIHNlbGVjdGlvbgorCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURpc3BsYXlQYW5lbHMoKSB7CisJCWRlYnVnTXNnKCJVcGRhdGluZyBEaXNwbGF5IFBhbmVscyIpOworCQkKKwkJQnVuZGxlIGJ1bmRsZSA9IG51bGw7CisJCWlmIChhY3RpdmVOb2RlID09IG51bGwpIHJldHVybjsKKwkJT2JqZWN0IG8gPSBhY3RpdmVOb2RlLmdldFVzZXJPYmplY3QoKTsKKwkJaWYgKG8gPT0gbnVsbCkKKwkJCXJldHVybjsKKwkJaWYgKG8gaW5zdGFuY2VvZiBTdHJpbmcpIHsKKwkJCS8vIEEgbm9kZSB0aGF0IGlzIG5vdCBhIHJvb3Qgd2FzIHNlbGVjdGVkLi4uLiBJIG5lZWQgdG8gZG8gc29tZXRoaW5nIGhlcmUKKwkJCVN0cmluZyBzdHIgPSAoU3RyaW5nKW87CisJCQlpZiAocmJtID09IG51bGwpIHJldHVybjsKKwkJCWlmIChzdHIuZXF1YWxzKHJibS5nZXRCYXNlQ2xhc3MoKSkpIHsKKwkJCQkvLyBUaGUgYmFzZSBjbGFzcyBub2RlIHdhcyBzZWxlY3RlZAorCQkJCWpQYW5lbFN0YXRzLnNldE1hbmFnZXIocmJtKTsKKwkJCQlqUGFuZWxVbnRyYW5zLnNldE1hbmFnZXIocmJtKTsKKwkJCQlqUGFuZWxHcm91cHMuc2V0TWFuYWdlcihyYm0pOworCQkJCWpQYW5lbFNlYXJjaC5zZXRNYW5hZ2VyKHJibSk7CisJCQl9IGVsc2UgeworCQkJCWpQYW5lbFN0YXRzLnJlbW92ZUVsZW1lbnRzKCk7CisJCQkJalBhbmVsVW50cmFucy5yZW1vdmVFbGVtZW50cygpOworCQkJCWpQYW5lbEdyb3Vwcy5yZW1vdmVFbGVtZW50cygpOworCQkJCWpQYW5lbFNlYXJjaC5yZW1vdmVFbGVtZW50cygpOworCQkJfQorCQkJLy9yZXR1cm47CisJCX0KKwkJZWxzZSBpZiAobyBpbnN0YW5jZW9mIEJ1bmRsZSkgeworCQkJYnVuZGxlID0gKEJ1bmRsZSkgYWN0aXZlTm9kZS5nZXRVc2VyT2JqZWN0KCk7CisJCQlqUGFuZWxTdGF0cy5zZXRCdW5kbGUoYnVuZGxlKTsKKwkJCWpQYW5lbFVudHJhbnMuc2V0QnVuZGxlKGJ1bmRsZSk7CisJCQlqUGFuZWxHcm91cHMuc2V0QnVuZGxlKGJ1bmRsZSk7CisJCQlqUGFuZWxTZWFyY2guc2V0QnVuZGxlKGJ1bmRsZSk7CisJCX0KKwkJZWxzZQorCQkJUkJNYW5hZ2VyR1VJLmRlYnVnTXNnKG8udG9TdHJpbmcoKSk7CisJCQorCQlqUGFuZWxTdGF0cy51cGRhdGVDb21wb25lbnRzKCk7CisJCWpQYW5lbFVudHJhbnMudXBkYXRlQ29tcG9uZW50cygpOworCQlqUGFuZWxHcm91cHMudXBkYXRlQ29tcG9uZW50cygpOworCQlqUGFuZWxTZWFyY2gudXBkYXRlQ29tcG9uZW50cygpOworCQkKKwkJdmFsaWRhdGVUcmVlKCk7CisJfQorCQorCXB1YmxpYyB2b2lkIHVwZGF0ZVByb2plY3RUcmVlKCkgeworCQlkZWJ1Z01zZygiVXBkYXRpbmcgUHJvamVjdCBUcmVlcyIpOworCQkKKwkJRGVmYXVsdE11dGFibGVUcmVlTm9kZSByb290ID0gbnVsbDsKKwkJCisJCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKKwkJCXJvb3QgPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZShwcm9qZWN0KTsKKwkJCWZvciAoaW50IGk9MDsgaSA8IHByb2plY3QuZ2V0U2l6ZSgpOyBpKyspIHsKKwkJCQlSQk1hbmFnZXIgcmJtID0gcHJvamVjdC5nZXRCdW5kbGUoaSk7CisJCQkJRGVmYXVsdE11dGFibGVUcmVlTm9kZSBidW5kbGVOb2RlID0gbmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUocmJtKTsKKwkJCQlyb290LmFkZChidW5kbGVOb2RlKTsKKwkJCQlCdW5kbGUgbWFpbkJ1bmRsZSA9IChCdW5kbGUpcmJtLmdldEJ1bmRsZXMoKS5maXJzdEVsZW1lbnQoKTsKKwkJCQlWZWN0b3IgZ3JvdXBzID0gbWFpbkJ1bmRsZS5nZXRHcm91cHNBc1ZlY3RvcigpOworCQkJCWZvciAoaW50IGo9MDsgaiA8IGdyb3Vwcy5zaXplKCk7IGorKykgeworCQkJCQlCdW5kbGVHcm91cCBncm91cCA9IChCdW5kbGVHcm91cClncm91cHMuZWxlbWVudEF0KGopOworCQkJCQlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIGdyb3VwTm9kZSA9IG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKGdyb3VwKTsKKwkJCQkJYnVuZGxlTm9kZS5hZGQoZ3JvdXBOb2RlKTsKKwkJCQkJVmVjdG9yIGl0ZW1zID0gZ3JvdXAuZ2V0SXRlbXNBc1ZlY3RvcigpOworCQkJCQlmb3IgKGludCBrPTA7IGsgPCBpdGVtcy5zaXplKCk7IGsrKykgeworCQkJCQkJQnVuZGxlSXRlbSBpdGVtID0gKEJ1bmRsZUl0ZW0paXRlbXMuZWxlbWVudEF0KGspOworCQkJCQkJRGVmYXVsdE11dGFibGVUcmVlTm9kZSBpdGVtTm9kZSA9IG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKGl0ZW0pOworCQkJCQkJZ3JvdXBOb2RlLmFkZChpdGVtTm9kZSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0gZWxzZSBpZiAocmJtICE9IG51bGwpIHsKKwkJCS8vIFRoZXJlIGlzIGEgcmVzb3VyY2UgYnVuZGxlIG9wZW4sIGJ1dCBubyBwcm9qZWN0CisJCQlyb290ID0gbmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJub19wcm9qZWN0IikpOworCQkJQnVuZGxlIG1haW5CdW5kbGUgPSAoQnVuZGxlKXJibS5nZXRCdW5kbGVzKCkuZmlyc3RFbGVtZW50KCk7CisJCQlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIGJ1bmRsZU5vZGUgPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZShyYm0pOy8vKHJibS5nZXRCYXNlQ2xhc3MoKSk7CisJCQlyb290LmFkZChidW5kbGVOb2RlKTsKKwkJCVZlY3RvciBncm91cHMgPSBtYWluQnVuZGxlLmdldEdyb3Vwc0FzVmVjdG9yKCk7CisJCQlmb3IgKGludCBpPTA7IGkgPCBncm91cHMuc2l6ZSgpOyBpKyspIHsKKwkJCQlCdW5kbGVHcm91cCBncm91cCA9IChCdW5kbGVHcm91cClncm91cHMuZWxlbWVudEF0KGkpOworCQkJCURlZmF1bHRNdXRhYmxlVHJlZU5vZGUgZ3JvdXBOb2RlID0gbmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUoZ3JvdXApOworCQkJCWJ1bmRsZU5vZGUuYWRkKGdyb3VwTm9kZSk7CisJCQkJVmVjdG9yIGl0ZW1zID0gZ3JvdXAuZ2V0SXRlbXNBc1ZlY3RvcigpOworCQkJCWZvciAoaW50IGo9MDsgaiA8IGl0ZW1zLnNpemUoKTsgaisrKSB7CisJCQkJCUJ1bmRsZUl0ZW0gaXRlbSA9IChCdW5kbGVJdGVtKWl0ZW1zLmVsZW1lbnRBdChqKTsKKwkJCQkJRGVmYXVsdE11dGFibGVUcmVlTm9kZSBpdGVtTm9kZSA9IG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKGl0ZW0pOworCQkJCQlncm91cE5vZGUuYWRkKGl0ZW1Ob2RlKTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlyb290ID0gbmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJub19wcm9qZWN0X2J1bmRsZSIpKTsKKwkJfQorCQkKKwkJLy8gQ3JlYXRlIHRoZSB0cmVlIGZyb20gdGhlIHJvb3RzCisJCXByb2plY3RUcmVlID0gbmV3IEpUcmVlKHJvb3QpOworCQlwcm9qZWN0VHJlZS5hZGRNb3VzZUxpc3RlbmVyKHRoaXMpOworCQlwcm9qZWN0VHJlZS5hZGRUcmVlU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7CisJCXByb2plY3RUcmVlLnNldENlbGxSZW5kZXJlcihSQlRyZWVDZWxsUmVuZGVyZXIuZ2V0SW5zdGFuY2UoKSk7CisJCXByb2plY3RTY3JvbGxQYW5lLmdldFZpZXdwb3J0KCkucmVtb3ZlQWxsKCk7CisJCXByb2plY3RTY3JvbGxQYW5lLmdldFZpZXdwb3J0KCkuYWRkKHByb2plY3RUcmVlKTsKKwkJcmVwYWludCgpOworCQl2YWxpZGF0ZVRyZWUoKTsKKwkJcmV0dXJuOworCX0KKwkKKwkvLyBVcGRhdGUgdGhlIGRpc3BsYXkgb2YgdGhlIHRyZWUgZmlsZSBtYXAuIFNob3VsZCBiZSBjYWxsZWQgd2hlbiB0aGUgdHJlZSBpcyBjaGFuZ2VkL3VwZGF0ZWQKKwlwdWJsaWMgdm9pZCB1cGRhdGVEaXNwbGF5VHJlZSgpIHsKKwkJZGVidWdNc2coIlVwZGF0aW5nIERpc3BsYXkgVHJlZXMiKTsKKwkJCisJCURlZmF1bHRNdXRhYmxlVHJlZU5vZGUgcm9vdCA9IG51bGw7CisJCQorCQlpZiAocmJtID09IG51bGwgfHwgcmJtLmdldEJ1bmRsZXMoKSA9PSBudWxsKSB7CisJCQlyb290ID0gbmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJub19yZXNvdXJjZV9idW5kbGUiKSk7CisJCX0gZWxzZSB7CisJCQkvLyBGcm9tIGhlcmUgb24gb3V0LCB0aGVyZSBpcyBhIGRlZmluZWQgcmVzb3VyY2UgYnVuZGxlIG1hbmFnZXIKKwkJCUJ1bmRsZSBtYWluQnVuZGxlID0gKEJ1bmRsZSlyYm0uZ2V0QnVuZGxlcygpLmZpcnN0RWxlbWVudCgpOworCQkJcm9vdCA9IG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKHJibS5nZXRCYXNlQ2xhc3MoKSk7CisJCQkvLyBBZGQgdGhlIGJhc2UgY2xhc3MKKwkJCXJvb3QuYWRkKG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKG1haW5CdW5kbGUpKTsKKwkJCQorCQkJLy9EZWZhdWx0TXV0YWJsZVRyZWVOb2RlIGN1cnJOb2RlID0gcm9vdDsKKwkJCWZvciAoaW50IGkgPSAxOyBpIDwgcmJtLmdldEJ1bmRsZXMoKS5zaXplKCk7IGkrKykgeworCQkJCUJ1bmRsZSBjdXJyQnVuZGxlID0gKEJ1bmRsZSlyYm0uZ2V0QnVuZGxlcygpLmVsZW1lbnRBdChpKTsKKwkJCQlTdHJpbmcgdmFyaWFudCA9IGN1cnJCdW5kbGUuZ2V0VmFyaWFudEVuY29kaW5nKCk7CisJCQkJU3RyaW5nIGNvdW50cnkgPSBjdXJyQnVuZGxlLmdldENvdW50cnlFbmNvZGluZygpOworCQkJCVN0cmluZyBsYW5ndWFnZSA9IGN1cnJCdW5kbGUuZ2V0TGFuZ3VhZ2VFbmNvZGluZygpOworCQkJCS8vRGVmYXVsdE11dGFibGVUcmVlTm9kZSBsYW5ndWFnZU5vZGUgPSBudWxsOworCQkJCS8vIExvb2sgZm9yIGEgbm9kZSByZXByZXNlbnRpbmcgdGhpcyBsYW5ndWFnZQorCQkJCWlmIChsYW5ndWFnZSA9PSBudWxsIHx8IGxhbmd1YWdlLmVxdWFscygiIikpIGNvbnRpbnVlOworCQkJCWJvb2xlYW4gbGFuZ3VhZ2VOb2RlRm91bmQgPSBmYWxzZTsKKwkJCQlmb3IgKGludCBqPTA7IGogPCByb290LmdldENoaWxkQ291bnQoKTsgaisrKSB7CisJCQkJCURlZmF1bHRNdXRhYmxlVHJlZU5vZGUgbGFuZ05vZGUgPSAoRGVmYXVsdE11dGFibGVUcmVlTm9kZSlyb290LmdldENoaWxkQXQoaik7CisJCQkJCU9iamVjdCBvID0gbGFuZ05vZGUuZ2V0VXNlck9iamVjdCgpOworCQkJCQlpZiAobyA9PSBudWxsIHx8ICEobyBpbnN0YW5jZW9mIFN0cmluZykpIGNvbnRpbnVlOworCQkJCQlTdHJpbmcgc3RyID0gKFN0cmluZylvOworCQkJCQlpZiAoc3RyLmVxdWFscyhSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInRyZWVfbGFuZ3VhZ2Vfbm9kZSIsIGxhbmd1YWdlKSkpIHsKKwkJCQkJCS8vIFRoZXJlIGlzIGEgbm9uLWxlYWYgbm9kZSB3aXRoIHRoaXMgbGFuZ3VhZ2UKKwkJCQkJCWxhbmd1YWdlTm9kZUZvdW5kID0gdHJ1ZTsKKwkJCQkJCWlmIChjb3VudHJ5ID09IG51bGwgfHwgY291bnRyeS5lcXVhbHMoIiIpKQorCQkJCQkJCSBsYW5nTm9kZS5hZGQobmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUoY3VyckJ1bmRsZSkpOworCQkJCQkJZWxzZSB7CisJCQkJCQkJLy8gV2UgbmVlZCB0byBsb29rIGF0IGNvdW50cnksIHZhcmlhbnQKKwkJCQkJCQlib29sZWFuIGNvdW50cnlOb2RlRm91bmQgPSBmYWxzZTsKKwkJCQkJCQlmb3IgKGludCBrPTA7IGsgPCBsYW5nTm9kZS5nZXRDaGlsZENvdW50KCk7IGsrKykgeworCQkJCQkJCQlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIGNvdW50cnlOb2RlID0gKERlZmF1bHRNdXRhYmxlVHJlZU5vZGUpbGFuZ05vZGUuZ2V0Q2hpbGRBdChrKTsKKwkJCQkJCQkJT2JqZWN0IG8yID0gY291bnRyeU5vZGUuZ2V0VXNlck9iamVjdCgpOworCQkJCQkJCQlpZiAobzIgPT0gbnVsbCB8fCAhKG8yIGluc3RhbmNlb2YgU3RyaW5nKSkgY29udGludWU7CisJCQkJCQkJCVN0cmluZyBzdHIyID0gKFN0cmluZylvMjsKKwkJCQkJCQkJaWYgKHN0cjIuZXF1YWxzKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigidHJlZV9jb3VudHJ5X25vZGUiLCBjb3VudHJ5KSkpIHsKKwkJCQkJCQkJCS8vIFRoZXJlIGlzIGEgbm9uLWxlYWYgbm9kZSBmb3IgdGhpcyBjb3VudHJ5CisJCQkJCQkJCQljb3VudHJ5Tm9kZUZvdW5kID0gdHJ1ZTsKKwkJCQkJCQkJCWlmICh2YXJpYW50ID09IG51bGwgfHwgdmFyaWFudC5lcXVhbHMoIiIpKSB7CisJCQkJCQkJCQkJY291bnRyeU5vZGUuYWRkKG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKGN1cnJCdW5kbGUpKTsKKwkJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQkJLy8gV2UgbmVlZCB0byBsb29rIGF0IHZhcmlhbnQKKwkJCQkJCQkJCQlib29sZWFuIHZhcmlhbnROb2RlRm91bmQgPSBmYWxzZTsKKwkJCQkJCQkJCQlmb3IgKGludCBsPTA7IGwgPCBjb3VudHJ5Tm9kZS5nZXRDaGlsZENvdW50KCk7IGwrKykgeworCQkJCQkJCQkJCQlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIHZhcmlhbnROb2RlID0gKERlZmF1bHRNdXRhYmxlVHJlZU5vZGUpY291bnRyeU5vZGUuZ2V0Q2hpbGRBdChsKTsKKwkJCQkJCQkJCQkJT2JqZWN0IG8zID0gdmFyaWFudE5vZGUuZ2V0VXNlck9iamVjdCgpOworCQkJCQkJCQkJCQlpZiAobzMgPT0gbnVsbCB8fCAhKG8zIGluc3RhbmNlb2YgU3RyaW5nKSkgY29udGludWU7CisJCQkJCQkJCQkJCVN0cmluZyBzdHIzID0gKFN0cmluZylvMzsKKwkJCQkJCQkJCQkJaWYgKHN0cjMuZXF1YWxzKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigidHJlZV92YXJpYW50X25vZGUiKSkpIHsKKwkJCQkJCQkJCQkJCXZhcmlhbnROb2RlRm91bmQgPSB0cnVlOworCQkJCQkJCQkJCQkJdmFyaWFudE5vZGUuYWRkKG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKGN1cnJCdW5kbGUpKTsKKwkJCQkJCQkJCQkJfSAKKwkJCQkJCQkJCQl9IC8vIGVuZCBmb3IgLSBjb3VudHJ5IG5vZGUgbG9vcAorCQkJCQkJCQkJCWlmICghdmFyaWFudE5vZGVGb3VuZCkgeworCQkJCQkJCQkJCQlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIHZhcmlhbnROb2RlID0gbmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJ0cmVlX3ZhcmlhbnRfbm9kZSIpKTsKKwkJCQkJCQkJCQkJY291bnRyeU5vZGUuYWRkKHZhcmlhbnROb2RlKTsKKwkJCQkJCQkJCQkJdmFyaWFudE5vZGUuYWRkKG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKGN1cnJCdW5kbGUpKTsKKwkJCQkJCQkJCQl9CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQl9IC8vIGVuZCBmb3IgLSBsYW5ndWFnZSBub2RlIGxvb3AKKwkJCQkJCQlpZiAoIWNvdW50cnlOb2RlRm91bmQpIHsKKwkJCQkJCQkJRGVmYXVsdE11dGFibGVUcmVlTm9kZSBjb3VudHJ5Tm9kZSA9IG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigidHJlZV9jb3VudHJ5X25vZGUiLCBjb3VudHJ5KSk7CisJCQkJCQkJCWxhbmdOb2RlLmFkZChjb3VudHJ5Tm9kZSk7CisJCQkJCQkJCWlmICh2YXJpYW50ID09IG51bGwgfHwgdmFyaWFudC5lcXVhbHMoIiIpKSB7CisJCQkJCQkJCQljb3VudHJ5Tm9kZS5hZGQobmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUoY3VyckJ1bmRsZSkpOworCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJLy8gV2UgbmVlZCB0byBsb29rIGF0IHRoZSB2YXJpYW50CQorCQkJCQkJCQkJYm9vbGVhbiB2YXJpYW50Tm9kZUZvdW5kID0gZmFsc2U7CisJCQkJCQkJCQlmb3IgKGludCBsPTA7IGwgPCBjb3VudHJ5Tm9kZS5nZXRDaGlsZENvdW50KCk7IGwrKykgeworCQkJCQkJCQkJCURlZmF1bHRNdXRhYmxlVHJlZU5vZGUgdmFyaWFudE5vZGUgPSAoRGVmYXVsdE11dGFibGVUcmVlTm9kZSljb3VudHJ5Tm9kZS5nZXRDaGlsZEF0KGwpOworCQkJCQkJCQkJCU9iamVjdCBvMyA9IHZhcmlhbnROb2RlLmdldFVzZXJPYmplY3QoKTsKKwkJCQkJCQkJCQlpZiAobzMgPT0gbnVsbCB8fCAhKG8zIGluc3RhbmNlb2YgU3RyaW5nKSkgY29udGludWU7CisJCQkJCQkJCQkJU3RyaW5nIHN0cjMgPSAoU3RyaW5nKW8zOworCQkJCQkJCQkJCWlmIChzdHIzLmVxdWFscyhSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInRyZWVfdmFyaWFudF9ub2RlIikpKSB7CisJCQkJCQkJCQkJCXZhcmlhbnROb2RlRm91bmQgPSB0cnVlOworCQkJCQkJCQkJCQl2YXJpYW50Tm9kZS5hZGQobmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUoY3VyckJ1bmRsZSkpOworCQkJCQkJCQkJCX0gCisJCQkJCQkJCQl9IC8vIGVuZCBmb3IgLSBjb3VudHJ5IG5vZGUgbG9vcAorCQkJCQkJCQkJaWYgKCF2YXJpYW50Tm9kZUZvdW5kKSB7CisJCQkJCQkJCQkJRGVmYXVsdE11dGFibGVUcmVlTm9kZSB2YXJpYW50Tm9kZSA9IG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigidHJlZV92YXJpYW50X25vZGUiKSk7CisJCQkJCQkJCQkJY291bnRyeU5vZGUuYWRkKHZhcmlhbnROb2RlKTsKKwkJCQkJCQkJCQl2YXJpYW50Tm9kZS5hZGQobmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUoY3VyckJ1bmRsZSkpOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWlmICghbGFuZ3VhZ2VOb2RlRm91bmQpIHsKKwkJCQkJLy8gV2UgbmVlZCB0byBjcmVhdGUgYSBub2RlIGZvciB0aGlzIGNvdW50cnkKKwkJCQkJRGVmYXVsdE11dGFibGVUcmVlTm9kZSBsYW5nTm9kZSA9IG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigidHJlZV9sYW5ndWFnZV9ub2RlIiwgbGFuZ3VhZ2UpKTsKKwkJCQkJcm9vdC5hZGQobGFuZ05vZGUpOworCQkJCQlpZiAoY291bnRyeSA9PSBudWxsIHx8IGNvdW50cnkuZXF1YWxzKCIiKSkgeworCQkJCQkJbGFuZ05vZGUuYWRkKG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKGN1cnJCdW5kbGUpKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCS8vIFdlIG5lZWQgdG8gbG9vayBhdCB0aGUgY291bnRyeSwgdmFyaWFudAorCQkJCQkJYm9vbGVhbiBjb3VudHJ5Tm9kZUZvdW5kID0gZmFsc2U7CisJCQkJCQlmb3IgKGludCBrPTA7IGsgPCBsYW5nTm9kZS5nZXRDaGlsZENvdW50KCk7IGsrKykgeworCQkJCQkJCURlZmF1bHRNdXRhYmxlVHJlZU5vZGUgY291bnRyeU5vZGUgPSAoRGVmYXVsdE11dGFibGVUcmVlTm9kZSlsYW5nTm9kZS5nZXRDaGlsZEF0KGspOworCQkJCQkJCU9iamVjdCBvMiA9IGNvdW50cnlOb2RlLmdldFVzZXJPYmplY3QoKTsKKwkJCQkJCQlpZiAobzIgPT0gbnVsbCB8fCAhKG8yIGluc3RhbmNlb2YgU3RyaW5nKSkgY29udGludWU7CisJCQkJCQkJU3RyaW5nIHN0cjIgPSAoU3RyaW5nKW8yOworCQkJCQkJCWlmIChzdHIyLmVxdWFscyhSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInRyZWVfY291bnRyeV9ub2RlIiwgY291bnRyeSkpKSB7CisJCQkJCQkJCS8vIFRoZXJlIGlzIGEgbm9uLWxlYWYgbm9kZSBmb3IgdGhpcyBjb3VudHJ5CisJCQkJCQkJCWNvdW50cnlOb2RlRm91bmQgPSB0cnVlOworCQkJCQkJCQlpZiAodmFyaWFudCA9PSBudWxsIHx8IHZhcmlhbnQuZXF1YWxzKCIiKSkgeworCQkJCQkJCQkJY291bnRyeU5vZGUuYWRkKG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKGN1cnJCdW5kbGUpKTsKKwkJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJCS8vIFdlIG5lZWQgdG8gbG9vayBhdCB2YXJpYW50CisJCQkJCQkJCQlib29sZWFuIHZhcmlhbnROb2RlRm91bmQgPSBmYWxzZTsKKwkJCQkJCQkJCWZvciAoaW50IGw9MDsgbCA8IGNvdW50cnlOb2RlLmdldENoaWxkQ291bnQoKTsgbCsrKSB7CisJCQkJCQkJCQkJRGVmYXVsdE11dGFibGVUcmVlTm9kZSB2YXJpYW50Tm9kZSA9IChEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKWNvdW50cnlOb2RlLmdldENoaWxkQXQobCk7CisJCQkJCQkJCQkJT2JqZWN0IG8zID0gdmFyaWFudE5vZGUuZ2V0VXNlck9iamVjdCgpOworCQkJCQkJCQkJCWlmIChvMyA9PSBudWxsIHx8ICEobzMgaW5zdGFuY2VvZiBTdHJpbmcpKSBjb250aW51ZTsKKwkJCQkJCQkJCQlTdHJpbmcgc3RyMyA9IChTdHJpbmcpbzM7CisJCQkJCQkJCQkJaWYgKHN0cjMuZXF1YWxzKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigidHJlZV92YXJpYW50X25vZGUiKSkpIHsKKwkJCQkJCQkJCQkJdmFyaWFudE5vZGVGb3VuZCA9IHRydWU7CisJCQkJCQkJCQkJCXZhcmlhbnROb2RlLmFkZChuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZShjdXJyQnVuZGxlKSk7CisJCQkJCQkJCQkJfSAKKwkJCQkJCQkJCX0gLy8gZW5kIGZvciAtIGNvdW50cnkgbm9kZSBsb29wCisJCQkJCQkJCQlpZiAoIXZhcmlhbnROb2RlRm91bmQpIHsKKwkJCQkJCQkJCQlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIHZhcmlhbnROb2RlID0gbmV3IERlZmF1bHRNdXRhYmxlVHJlZU5vZGUoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJ0cmVlX3ZhcmlhbnRfbm9kZSIpKTsKKwkJCQkJCQkJCQljb3VudHJ5Tm9kZS5hZGQodmFyaWFudE5vZGUpOworCQkJCQkJCQkJCXZhcmlhbnROb2RlLmFkZChuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZShjdXJyQnVuZGxlKSk7CisJCQkJCQkJCQl9CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9IC8vIGVuZCBmb3IgLSBsYW5ndWFnZSBub2RlIGxvb3AKKwkJCQkJCWlmICghY291bnRyeU5vZGVGb3VuZCkgeworCQkJCQkJCURlZmF1bHRNdXRhYmxlVHJlZU5vZGUgY291bnRyeU5vZGUgPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInRyZWVfY291bnRyeV9ub2RlIiwgY291bnRyeSkpOworCQkJCQkJCWxhbmdOb2RlLmFkZChjb3VudHJ5Tm9kZSk7CisJCQkJCQkJaWYgKHZhcmlhbnQgPT0gbnVsbCB8fCB2YXJpYW50LmVxdWFscygiIikpIHsKKwkJCQkJCQkJY291bnRyeU5vZGUuYWRkKG5ldyBEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKGN1cnJCdW5kbGUpKTsKKwkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkvLyBXZSBuZWVkIHRvIGxvb2sgYXQgdGhlIHZhcmlhbnQJCisJCQkJCQkJCWJvb2xlYW4gdmFyaWFudE5vZGVGb3VuZCA9IGZhbHNlOworCQkJCQkJCQlmb3IgKGludCBsPTA7IGwgPCBjb3VudHJ5Tm9kZS5nZXRDaGlsZENvdW50KCk7IGwrKykgeworCQkJCQkJCQkJRGVmYXVsdE11dGFibGVUcmVlTm9kZSB2YXJpYW50Tm9kZSA9IChEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKWNvdW50cnlOb2RlLmdldENoaWxkQXQobCk7CisJCQkJCQkJCQlPYmplY3QgbzMgPSB2YXJpYW50Tm9kZS5nZXRVc2VyT2JqZWN0KCk7CisJCQkJCQkJCQlpZiAobzMgPT0gbnVsbCB8fCAhKG8zIGluc3RhbmNlb2YgU3RyaW5nKSkgY29udGludWU7CisJCQkJCQkJCQlTdHJpbmcgc3RyMyA9IChTdHJpbmcpbzM7CisJCQkJCQkJCQlpZiAoc3RyMy5lcXVhbHMoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJ0cmVlX3ZhcmlhbnRfbm9kZSIpKSkgeworCQkJCQkJCQkJCXZhcmlhbnROb2RlRm91bmQgPSB0cnVlOworCQkJCQkJCQkJCXZhcmlhbnROb2RlLmFkZChuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZShjdXJyQnVuZGxlKSk7CisJCQkJCQkJCQl9IAorCQkJCQkJCQl9IC8vIGVuZCBmb3IgLSBjb3VudHJ5IG5vZGUgbG9vcAorCQkJCQkJCQlpZiAoIXZhcmlhbnROb2RlRm91bmQpIHsKKwkJCQkJCQkJCURlZmF1bHRNdXRhYmxlVHJlZU5vZGUgdmFyaWFudE5vZGUgPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInRyZWVfdmFyaWFudF9ub2RlIiwgdmFyaWFudCkpOworCQkJCQkJCQkJY291bnRyeU5vZGUuYWRkKHZhcmlhbnROb2RlKTsKKwkJCQkJCQkJCXZhcmlhbnROb2RlLmFkZChuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZShjdXJyQnVuZGxlKSk7CisJCQkJCQkJCX0KKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJCisJCS8vIENyZWF0ZSB0aGUgdHJlZSBmcm9tIHRoZSByb290cworCQlqVHJlZURpc3BsYXkgPSBuZXcgSlRyZWUocm9vdCk7CisJCWpUcmVlRGlzcGxheS5hZGRNb3VzZUxpc3RlbmVyKHRoaXMpOworCQlqVHJlZURpc3BsYXkuYWRkVHJlZVNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOworCQlqVHJlZURpc3BsYXkuc2V0Q2VsbFJlbmRlcmVyKFJCVHJlZUNlbGxSZW5kZXJlci5nZXRJbnN0YW5jZSgpKTsKKwkJalNjcm9sbFBhbmVUcmVlLmdldFZpZXdwb3J0KCkucmVtb3ZlQWxsKCk7CisJCWpTY3JvbGxQYW5lVHJlZS5nZXRWaWV3cG9ydCgpLmFkZChqVHJlZURpc3BsYXkpOworCQlyZXBhaW50KCk7CisJCXZhbGlkYXRlVHJlZSgpOworCQlyZXR1cm47CisJfQorCQorCS8qKgorCSAqIEluaGVyaXRzIGZyb20gSkZyYW1lLmFkZE5vdGlmeSgpLCBidXQgYWxzbyBpbnNlcnRzIHRoZSBtZW51IGJhcgorCSAqLworCQorCXB1YmxpYyB2b2lkIGFkZE5vdGlmeSgpIAorCXsKKwkJc3VwZXIuYWRkTm90aWZ5KCk7CisJCQorCQlpZiAobVNob3duKQorCQkJcmV0dXJuOworCQkJCisJCS8vIHJlc2l6ZSBmcmFtZSB0byBhY2NvdW50IGZvciBtZW51YmFyCisJCUpNZW51QmFyIGpNZW51QmFyID0gZ2V0Sk1lbnVCYXIoKTsKKwkJaWYgKGpNZW51QmFyICE9IG51bGwpIHsKKwkJCWludCBqTWVudUJhckhlaWdodCA9IGpNZW51QmFyLmdldFByZWZlcnJlZFNpemUoKS5oZWlnaHQ7CisJCQlEaW1lbnNpb24gZGltZW5zaW9uID0gZ2V0U2l6ZSgpOworCQkJZGltZW5zaW9uLmhlaWdodCArPSBqTWVudUJhckhlaWdodDsKKwkJCXNldFNpemUoZGltZW5zaW9uKTsKKwkJfQorCisJCW1TaG93biA9IHRydWU7CisJfQorCisJLyoqCisJICogQ2FsbGVkIHdoZW4gaXQgbWF5IGJlIGFwcHJvcHJpYXRlIHRvIGNoZWNrIHdpdGggdGhlIHVzZXIgaWYgdGhleSB3YW50IHRvIHNhdmUgdGhlIGZpbGUKKwkgKi8KKwkKKwlib29sZWFuIHByb21wdEZvclNhdmUoU3RyaW5nIG1lc3NhZ2UpIHsKKwkJaWYgKHJibSAhPSBudWxsKSB7CisJCQlpbnQgcmVzcG9uc2UgPSBKT3B0aW9uUGFuZS5zaG93Q29uZmlybURpYWxvZyh0aGlzLAorCQkJCShtZXNzYWdlID09IG51bGwgPyBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImRpYWxvZ19zYXZlIikgOiBtZXNzYWdlKSwKKwkJCQlSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImRpYWxvZ190aXRsZV9xdWl0IiksIEpPcHRpb25QYW5lLllFU19OT19DQU5DRUxfT1BUSU9OLAorCQkJCUpPcHRpb25QYW5lLlFVRVNUSU9OX01FU1NBR0UpOworCQkJaWYgKHJlc3BvbnNlID09IEpPcHRpb25QYW5lLkNBTkNFTF9PUFRJT04pIHJldHVybiBmYWxzZTsKKwkJCWlmIChyZXNwb25zZSA9PSBKT3B0aW9uUGFuZS5ZRVNfT1BUSU9OKSB7CisJCQkJcmV0dXJuIHNhdmVSZXNvdXJjZXMoKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisJCisJcHVibGljIGJvb2xlYW4gZGVsZXRlUmVzb3VyY2VzKFN0cmluZyBlbmNvZGluZykgeworCQlpZiAocmJtID09IG51bGwpIHJldHVybiBmYWxzZTsgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbgorCQl0cnkgeworCQkJcmJtLmVyYXNlRmlsZShlbmNvZGluZyk7CQorCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKwkJCUpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKHRoaXMsIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZXJyb3JfZGVsZXRpbmciLCBpb2UuZ2V0TWVzc2FnZSgpKSwKKwkJCQkJCQkJCQkgIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZXJyb3IiKSwgSk9wdGlvblBhbmUuRVJST1JfTUVTU0FHRSk7CisJCQlpZiAoUkJNYW5hZ2VyR1VJLmRlYnVnKSBTeXN0ZW0uZXJyLnByaW50bG4oaW9lKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQl1cGRhdGVEaXNwbGF5VHJlZSgpOworCQl1cGRhdGVQcm9qZWN0VHJlZSgpOworCQl1cGRhdGVQcm9qZWN0UGFuZWxzKCk7CisJCXVwZGF0ZURpc3BsYXlQYW5lbHMoKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCQorCXB1YmxpYyB2b2lkIGhpZGVSZXNvdXJjZXMoU3RyaW5nIGVuY29kaW5nKSB7CisJCXJibS5oaWRlUmVzb3VyY2UoZW5jb2RpbmcpOworCQl1cGRhdGVEaXNwbGF5VHJlZSgpOworCQl1cGRhdGVQcm9qZWN0VHJlZSgpOworCQl1cGRhdGVQcm9qZWN0UGFuZWxzKCk7CisJCXVwZGF0ZURpc3BsYXlQYW5lbHMoKTsKKwl9CisJCisJLyoqCisJICogU2F2ZSBhIHBhcnRpY3VsYXIgcmVzb3VyY2VzIGZpbGUgd2l0aGluIHRoZSBidW5kbGUuCisJICovCisJCisJcHVibGljIGJvb2xlYW4gc2F2ZVJlc291cmNlcyhTdHJpbmcgZW5jb2RpbmcpIHsKKwkJaWYgKHJibSA9PSBudWxsKSByZXR1cm4gZmFsc2U7ICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4KKwkJcmV0dXJuIHNhdmVSZXNvdXJjZXMocmJtLCBlbmNvZGluZyk7CisJfQorCQorCXB1YmxpYyBib29sZWFuIHNhdmVSZXNvdXJjZXMoUkJNYW5hZ2VyIGJ1bmRsZSwgU3RyaW5nIGVuY29kaW5nKSB7CisJCXRyeSB7CisJCQlidW5kbGUud3JpdGVUb0ZpbGUoZW5jb2RpbmcpOwkKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisJCQlKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyh0aGlzLCBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImVycm9yX3NhdmluZyIsIGlvZS5nZXRNZXNzYWdlKCkpLAorCQkJCQkJCQkJCSAgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJlcnJvciIpLCBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKKwkJCWlmIChSQk1hbmFnZXJHVUkuZGVidWcpIFN5c3RlbS5lcnIucHJpbnRsbihpb2UpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiB0cnVlOworCX0KKwkKKwkvKioKKwkgKiBDYWxsZWQgd2hlbiB0aGUgcmVzb3VyY2VzIGFyZSB0byBiZSBzYXZlZAorCSAqLworCQorCXB1YmxpYyBib29sZWFuIHNhdmVSZXNvdXJjZXMoKSB7CisJCWlmIChyYm0gPT0gbnVsbCkgcmV0dXJuIHRydWU7CisJCXJldHVybiBzYXZlUmVzb3VyY2VzKHJibSk7CisJfQorCQorCXB1YmxpYyBib29sZWFuIHNhdmVSZXNvdXJjZXMoUkJNYW5hZ2VyIGJ1bmRsZSkgeworCQl0cnkgeworCQkJYnVuZGxlLndyaXRlVG9GaWxlKCk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworCQkJSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2codGhpcywgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJlcnJvcl9zYXZpbmciLCBpb2UuZ2V0TWVzc2FnZSgpKSwKKwkJCQkJCQkJCQkgIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZXJyb3IiKSwgSk9wdGlvblBhbmUuRVJST1JfTUVTU0FHRSk7CisJCQlpZiAoUkJNYW5hZ2VyR1VJLmRlYnVnKSBTeXN0ZW0uZXJyLnByaW50bG4oaW9lKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwl9CisJCisJLyoqCisJICogQ2FsbGVkIHdoZW4gdGhlIHJlc291cmNlIGJ1bmRsZSBpcyB0byBiZSBzYXZlZCwgYnV0IGRpc3BsYXlzIGEgd2luZG93IHRvIHRoZSB1c2VyIGFsbG93aW5nIHRoZW0KKwkgKiB0byBzZWxlY3RlIHRoZSBmaWxlIGRlc3RpbmF0aW9uIG9mIHRoZSBmb2xkZXIgaW4gd2hpY2ggdG8gc2F2ZSB0aGUgYnVuZGxlIGFzIHdlbGwgYXMgdGhlIGJhc2UKKwkgKiBjbGFzcyBuYW1lIGZvciB0aGUgYnVuZGxlLgorCSAqLworCQorCXB1YmxpYyBib29sZWFuIHNhdmVSZXNvdXJjZXNBcygpIHsKKwkJaWYgKHJibSA9PSBudWxsKSByZXR1cm4gdHJ1ZTsKKwkJaW50IHJlc3VsdCA9IHNhdmVGaWxlQ2hvb3Nlci5zaG93U2F2ZURpYWxvZyh0aGlzKTsKKwkJaWYgKHJlc3VsdCA9PSBKRmlsZUNob29zZXIuQVBQUk9WRV9PUFRJT04pIHsKKwkJCXRyeSB7CisJCQkJRmlsZSBuZXdGaWxlID0gc2F2ZUZpbGVDaG9vc2VyLmdldFNlbGVjdGVkRmlsZSgpOworCQkJCVN0cmluZyBmaWxlTmFtZSA9IG5ld0ZpbGUuZ2V0TmFtZSgpOworCQkJCVN0cmluZyBiYXNlTmFtZSA9IGZpbGVOYW1lOworCQkJCWlmIChmaWxlTmFtZS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIucHJvcGVydGllcyIpKQorCQkJCQliYXNlTmFtZSA9IGJhc2VOYW1lLnN1YnN0cmluZygwLGJhc2VOYW1lLmxlbmd0aCgpLTExKTsKKwkJCQlyYm0uc2V0QmFzZUNsYXNzKGJhc2VOYW1lKTsKKwkJCQlyYm0uc2V0RmlsZURpcmVjdG9yeShuZXdGaWxlLmdldFBhcmVudEZpbGUoKSk7CisJCQkJcmJtLndyaXRlVG9GaWxlKCk7CisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKwkJCQlKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyh0aGlzLCBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImVycm9yX3NhdmluZyIsIGlvZS5nZXRNZXNzYWdlKCkpLAorCQkJCQkJCQkJCQkgIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZXJyb3IiKSwgSk9wdGlvblBhbmUuRVJST1JfTUVTU0FHRSk7CisJCQkJaWYgKFJCTWFuYWdlckdVSS5kZWJ1ZykgU3lzdGVtLmVyci5wcmludGxuKGlvZSk7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9CisJCXJldHVybiB0cnVlOworCX0KKwkKKwl2b2lkIHVwZGF0ZUxvY2FsZShMb2NhbGUgbCkgeworCQkvLyBVcGRhdGUgdGhlIG1lbnViYXJzCisJCWpNZW51QmFyTWFpbi51cGRhdGVMb2NhbGUoKTsKKwkJCisJCXVwZGF0ZUxvY2FsZShnZXRDb250ZW50UGFuZSgpLCBsKTsKKwkJdXBkYXRlTG9jYWxlKG9wZW5GaWxlQ2hvb3NlciwgbCk7CisJCXVwZGF0ZUxvY2FsZShzYXZlRmlsZUNob29zZXIsIGwpOworCQkvLyBSZWRyYXcgdGhlIHBhbmVzCisJCXVwZGF0ZURpc3BsYXlUcmVlKCk7CisJCXVwZGF0ZVByb2plY3RUcmVlKCk7CisJCXVwZGF0ZVByb2plY3RQYW5lbHMoKTsKKwkJdXBkYXRlRGlzcGxheVBhbmVscygpOworCQkvLyB1cGRhdGUgdGhlIHRhYiB0aXRsZXMKKwkJalRhYmJlZFBhbmVNYWluLnNldFRpdGxlQXQoMCxSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInRhYl9zdGF0aXN0aWNzIikpOworCQlqVGFiYmVkUGFuZU1haW4uc2V0VGl0bGVBdCgxLFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigidGFiX3VudHJhbnNsYXRlZCIpKTsKKwkJalRhYmJlZFBhbmVNYWluLnNldFRpdGxlQXQoMixSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInRhYl9ncm91cHMiKSk7CisJCXNldFRpdGxlKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigicmVzb3VyY2VfYnVuZGxlX21hbmFnZXIiKSk7CisJfQorCQorCXN0YXRpYyB2b2lkIHVwZGF0ZUxvY2FsZShDb250YWluZXIgYywgTG9jYWxlIGwpIHsKKwkJQ29tcG9uZW50IGNvbXBbXSA9IGMuZ2V0Q29tcG9uZW50cygpOworCQlmb3IgKGludCBpPTA7IGkgPCBjb21wLmxlbmd0aDsgaSsrKSB7CisJCQlpZiAoY29tcFtpXSBpbnN0YW5jZW9mIEpDb21wb25lbnQpIHsKKwkJCQkoKEpDb21wb25lbnQpY29tcFtpXSkuc2V0TG9jYWxlKGwpOworCQkJfQorCQkJaWYgKGNvbXBbaV0gaW5zdGFuY2VvZiBDb250YWluZXIpIHsKKwkJCQl1cGRhdGVMb2NhbGUoKENvbnRhaW5lciljb21wW2ldLGwpOworCQkJfQorCQl9CisJCWlmIChjIGluc3RhbmNlb2YgSk1lbnUpIHsKKwkJCWNvbXAgPSAoKEpNZW51KWMpLmdldE1lbnVDb21wb25lbnRzKCk7CisJCQlmb3IgKGludCBpPTA7IGkgPCBjb21wLmxlbmd0aDsgaSsrKSB7CisJCQkJaWYgKGNvbXBbaV0gaW5zdGFuY2VvZiBKQ29tcG9uZW50KSB7CisJCQkJCSgoSkNvbXBvbmVudCljb21wW2ldKS5zZXRMb2NhbGUobCk7CisJCQkJfQorCQkJCWlmIChjb21wW2ldIGluc3RhbmNlb2YgQ29udGFpbmVyKSB7CisJCQkJCXVwZGF0ZUxvY2FsZSgoQ29udGFpbmVyKWNvbXBbaV0sbCk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCQkJCisJdm9pZCB1cGRhdGVVSSgpIHsKKwkJdXBkYXRlVUkoZ2V0Q29udGVudFBhbmUoKSk7CisJCWpNZW51QmFyTWFpbi51cGRhdGVVSSgpOworCQl1cGRhdGVVSShqTWVudUJhck1haW4pOworCQl1cGRhdGVVSShvcGVuRmlsZUNob29zZXIpOworCQl1cGRhdGVVSShzYXZlRmlsZUNob29zZXIpOworCX0KKwkKKwlzdGF0aWMgdm9pZCB1cGRhdGVVSShDb250YWluZXIgYykgeworCQlDb21wb25lbnQgY29tcFtdID0gYy5nZXRDb21wb25lbnRzKCk7CisJCWZvciAoaW50IGk9MDsgaSA8IGNvbXAubGVuZ3RoOyBpKyspIHsKKwkJCWlmIChjb21wW2ldIGluc3RhbmNlb2YgSkNvbXBvbmVudCkgeworCQkJCSgoSkNvbXBvbmVudCljb21wW2ldKS51cGRhdGVVSSgpOworCQkJfQorCQkJaWYgKGNvbXBbaV0gaW5zdGFuY2VvZiBDb250YWluZXIpIHsKKwkJCQl1cGRhdGVVSSgoQ29udGFpbmVyKWNvbXBbaV0pOworCQkJfQorCQl9CisJCWlmIChjIGluc3RhbmNlb2YgSk1lbnUpIHsKKwkJCWNvbXAgPSAoKEpNZW51KWMpLmdldE1lbnVDb21wb25lbnRzKCk7CisJCQlmb3IgKGludCBpPTA7IGkgPCBjb21wLmxlbmd0aDsgaSsrKSB7CisJCQkJaWYgKGNvbXBbaV0gaW5zdGFuY2VvZiBKQ29tcG9uZW50KSB7CisJCQkJCSgoSkNvbXBvbmVudCljb21wW2ldKS51cGRhdGVVSSgpOworCQkJCX0KKwkJCQlpZiAoY29tcFtpXSBpbnN0YW5jZW9mIENvbnRhaW5lcikgeworCQkJCQl1cGRhdGVVSSgoQ29udGFpbmVyKWNvbXBbaV0pOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwkKKwkvLyBDbG9zZSB0aGUgd2luZG93IHdoZW4gdGhlIGNsb3NlIGJveCBpcyBjbGlja2VkCisJdm9pZCB0aGlzV2luZG93Q2xvc2luZyhqYXZhLmF3dC5ldmVudC5XaW5kb3dFdmVudCBlKQorCXsKKwkJaWYgKHByb21wdEZvclNhdmUoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJkaWFsb2dfcXVpdF9zYXZlIikpKSB7CisJCQlzZXRWaXNpYmxlKGZhbHNlKTsKKwkJCWRpc3Bvc2UoKTsKKwkJCVN5c3RlbS5leGl0KDApOworCQl9CisJfQorCQorCXB1YmxpYyB2b2lkIHNldFVzZXIoU3RyaW5nIHVzZXJOYW1lKSB7CisJCXRoaXMudXNlck5hbWUgPSB1c2VyTmFtZTsKKwkJaWYgKHJibSAhPSBudWxsKSByYm0uc2V0VXNlcih1c2VyTmFtZSk7CisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0VXNlcigpIHsKKwkJcmV0dXJuIHVzZXJOYW1lOworCX0KKwkKKwlwdWJsaWMgQnVuZGxlSXRlbSBnZXRTZWxlY3RlZFByb2plY3RCdW5kbGVJdGVtKCkgeworCQlUcmVlUGF0aCBwYXRoID0gcHJvamVjdFRyZWUuZ2V0U2VsZWN0aW9uUGF0aCgpOworCQlpZiAocGF0aCA9PSBudWxsKSByZXR1cm4gbnVsbDsKKwkJRGVmYXVsdE11dGFibGVUcmVlTm9kZSBub2RlID0gKERlZmF1bHRNdXRhYmxlVHJlZU5vZGUpcGF0aC5nZXRMYXN0UGF0aENvbXBvbmVudCgpOworCQlPYmplY3Qgb2JqID0gbm9kZS5nZXRVc2VyT2JqZWN0KCk7CisJCWlmIChvYmogPT0gbnVsbCB8fCAhKG9iaiBpbnN0YW5jZW9mIEJ1bmRsZUl0ZW0pKSByZXR1cm4gbnVsbDsKKwkJcmV0dXJuIChCdW5kbGVJdGVtKW9iajsKKwl9CisJCisJcHVibGljIFJCTWFuYWdlciBnZXRTZWxlY3RlZFByb2plY3RCdW5kbGUoKSB7CisJCVRyZWVQYXRoIHBhdGggPSBwcm9qZWN0VHJlZS5nZXRTZWxlY3Rpb25QYXRoKCk7CisJCWlmIChwYXRoID09IG51bGwpIHJldHVybiBudWxsOworCQlmb3IgKGludCBpPTA7IGkgPCBwYXRoLmdldFBhdGhDb3VudCgpOyBpKyspIHsKKwkJCURlZmF1bHRNdXRhYmxlVHJlZU5vZGUgbm9kZSA9IChEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKXBhdGguZ2V0UGF0aENvbXBvbmVudChpKTsKKwkJCU9iamVjdCBvYmogPSBub2RlLmdldFVzZXJPYmplY3QoKTsKKwkJCWlmIChvYmogIT0gbnVsbCAmJiBvYmogaW5zdGFuY2VvZiBSQk1hbmFnZXIpIHJldHVybiAoUkJNYW5hZ2VyKW9iajsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJcHVibGljIHN0YXRpYyB2b2lkIGRlYnVnTXNnKFN0cmluZyBtc2cpIHsKKwkJaWYgKGRlYnVnKSBTeXN0ZW0ub3V0LnByaW50bG4oIkRlYnVnIE1lc3NhZ2UgWyIgKyBkZWJ1Z2NvdW50KysgKyAiXTogIiArIG1zZyk7CisJfQorfQorCitjbGFzcyBSQlRyZWVDZWxsUmVuZGVyZXIgZXh0ZW5kcyBEZWZhdWx0VHJlZUNlbGxSZW5kZXJlciB7CisJcHJpdmF0ZSBzdGF0aWMgUkJUcmVlQ2VsbFJlbmRlcmVyIGNlbGxSZW5kID0gbnVsbDsKKwlwcml2YXRlIHN0YXRpYyBJbWFnZUljb24gYnVuZGxlSWNvbiAgID0gbnVsbDsKKwlwcml2YXRlIHN0YXRpYyBJbWFnZUljb24gbGFuZ3VhZ2VJY29uID0gbnVsbDsKKwlwcml2YXRlIHN0YXRpYyBJbWFnZUljb24gY291bnRyeUljb24gID0gbnVsbDsKKwlwcml2YXRlIHN0YXRpYyBJbWFnZUljb24gdmFyaWFudEljb24gID0gbnVsbDsKKwlwcml2YXRlIHN0YXRpYyBJbWFnZUljb24gZmlsZUljb24gICAgID0gbnVsbDsKKwlwcml2YXRlIHN0YXRpYyBJbWFnZUljb24gZ3JvdXBJY29uICAgID0gbnVsbDsKKwlwcml2YXRlIHN0YXRpYyBJbWFnZUljb24gaXRlbUljb24gICAgID0gbnVsbDsKKwlwcml2YXRlIHN0YXRpYyBJbWFnZUljb24gcHJvamVjdEljb24gID0gbnVsbDsKKwkKKwlwcml2YXRlIFJCVHJlZUNlbGxSZW5kZXJlcigpIHsKKwkJCisJfQorCQorCXB1YmxpYyBDb21wb25lbnQgZ2V0VHJlZUNlbGxSZW5kZXJlckNvbXBvbmVudChKVHJlZSB0cmVlLCBPYmplY3QgdmFsdWUsIGJvb2xlYW4gc2VsZWN0ZWQsIGJvb2xlYW4gZXhwYW5kZWQsCisJCQkJCQkJCQkJCQkgIGJvb2xlYW4gbGVhZiwgaW50IHJvdywgYm9vbGVhbiBoYXNGb2N1cykgeworCQlzdXBlci5nZXRUcmVlQ2VsbFJlbmRlcmVyQ29tcG9uZW50KHRyZWUsIHZhbHVlLCBzZWxlY3RlZCwgZXhwYW5kZWQsIGxlYWYsIHJvdywgaGFzRm9jdXMpOworCQkKKwkJRGVmYXVsdE11dGFibGVUcmVlTm9kZSBub2RlID0gKERlZmF1bHRNdXRhYmxlVHJlZU5vZGUpdmFsdWU7CisJCWludCBsZXZlbCA9IG5vZGUuZ2V0TGV2ZWwoKTsKKwkJT2JqZWN0IG9iaiA9IG5vZGUuZ2V0VXNlck9iamVjdCgpOworCQkKKwkJaWYgKG9iaiBpbnN0YW5jZW9mIEJ1bmRsZUdyb3VwKSB7CisJCQlzZXRJY29uKGdyb3VwSWNvbik7CisJCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgQnVuZGxlSXRlbSkgeworCQkJc2V0SWNvbihpdGVtSWNvbik7CisJCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgUkJNYW5hZ2VyKSB7CisJCQlzZXRJY29uKGJ1bmRsZUljb24pOworCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFJCUHJvamVjdCkgeworCQkJc2V0SWNvbihwcm9qZWN0SWNvbik7CisJCX0gZWxzZSBpZiAobGVhZikgeworCQkJaWYgKGxldmVsICE9IDApIHNldEljb24oZmlsZUljb24pOwkKKwkJfSBlbHNlIHsJCisJCQlpZiAobGV2ZWwgPT0gMCkgeworCQkJCWlmIChvYmogaW5zdGFuY2VvZiBTdHJpbmcgJiYgKChTdHJpbmcpb2JqKS5lcXVhbHMoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJub19wcm9qZWN0IikpKSAKKwkJCQkJc2V0SWNvbihwcm9qZWN0SWNvbik7CisJCQkJZWxzZSBzZXRJY29uKGJ1bmRsZUljb24pOworCQkJfQorCQkJZWxzZSBpZiAobGV2ZWwgPT0gMSkgc2V0SWNvbihsYW5ndWFnZUljb24pOworCQkJZWxzZSBpZiAobGV2ZWwgPT0gMikgc2V0SWNvbihjb3VudHJ5SWNvbik7CisJCQllbHNlIGlmIChsZXZlbCA9PSAzKSBzZXRJY29uKHZhcmlhbnRJY29uKTsKKwkJfQorCQkKKwkJcmV0dXJuIHRoaXM7CisJfQorCQorCXB1YmxpYyBzdGF0aWMgUkJUcmVlQ2VsbFJlbmRlcmVyIGdldEluc3RhbmNlKCkgeworCQlpZiAoY2VsbFJlbmQgPT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBDbGFzcyB0aGlzQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKCJjb20uaWJtLnJibS5ndWkuUkJNYW5hZ2VyR1VJIik7CisJCQkgICAgLy8gQ3JlYXRlIGluc3RhbmNlcyBvZiB0aGUgaWNvbnMKKyAgICAgICAgICAgICAgICBJbWFnZSBzY2FsZWRJbWFnZSA9IChuZXcgSW1hZ2VJY29uKHRoaXNDbGFzcy5nZXRSZXNvdXJjZSgiaW1hZ2VzL3RyZWVfaWNvbl9idW5kbGUuZ2lmIikpKS5nZXRJbWFnZSgpLmdldFNjYWxlZEluc3RhbmNlKDE2LCAxNiwgSW1hZ2UuU0NBTEVfREVGQVVMVCk7CisJCQkgICAgYnVuZGxlSWNvbiAgID0gbmV3IEltYWdlSWNvbihzY2FsZWRJbWFnZSk7CisJCQkgICAgbGFuZ3VhZ2VJY29uID0gbmV3IEltYWdlSWNvbih0aGlzQ2xhc3MuZ2V0UmVzb3VyY2UoImltYWdlcy90cmVlX2ljb25fbGFuZ3VhZ2UuZ2lmIikpOworCQkJICAgIGNvdW50cnlJY29uICA9IG5ldyBJbWFnZUljb24odGhpc0NsYXNzLmdldFJlc291cmNlKCJpbWFnZXMvdHJlZV9pY29uX2NvdW50cnkuZ2lmIikpOworCQkJICAgIHZhcmlhbnRJY29uICA9IG5ldyBJbWFnZUljb24odGhpc0NsYXNzLmdldFJlc291cmNlKCJpbWFnZXMvdHJlZV9pY29uX3ZhcmlhbnQuZ2lmIikpOworCQkJICAgIGZpbGVJY29uICAgICA9IG5ldyBJbWFnZUljb24odGhpc0NsYXNzLmdldFJlc291cmNlKCJpbWFnZXMvdHJlZV9pY29uX2ZpbGUuZ2lmIikpOworCQkJICAgIGdyb3VwSWNvbiAgICA9IG5ldyBJbWFnZUljb24odGhpc0NsYXNzLmdldFJlc291cmNlKCJpbWFnZXMvdHJlZV9pY29uX2dyb3VwLmdpZiIpKTsKKwkJCSAgICBpdGVtSWNvbiAgICAgPSBuZXcgSW1hZ2VJY29uKHRoaXNDbGFzcy5nZXRSZXNvdXJjZSgiaW1hZ2VzL3RyZWVfaWNvbl9pdGVtLmdpZiIpKTsKKwkJCSAgICBwcm9qZWN0SWNvbiAgPSBuZXcgSW1hZ2VJY29uKHRoaXNDbGFzcy5nZXRSZXNvdXJjZSgiaW1hZ2VzL3RyZWVfaWNvbl9wcm9qZWN0LmdpZiIpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIFJCTWFuYWdlckdVSS5kZWJ1Z01zZyhlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorCQkJLy8gQ3JlYXRlIHRoZSBpbnN0YW5jZSBvZiB0aGUgcmVuZGVyZXIKKwkJCWNlbGxSZW5kID0gbmV3IFJCVHJlZUNlbGxSZW5kZXJlcigpOworCQl9CisJCXJldHVybiBjZWxsUmVuZDsKKwl9Cit9CisKKy8qKgorICogVGFibGUgbW9kZWwgZm9yIHJlc291cmNlIGJ1bmRsZSBwcm9qZWN0cworICovCitjbGFzcyBSQlByb2plY3QgeworCWphdmEudXRpbC5MaXN0IGJ1bmRsZU5hbWVzOworCWphdmEudXRpbC5MaXN0IGJ1bmRsZUZpbGVOYW1lczsKKwlqYXZhLnV0aWwuTGlzdCBidW5kbGVzOworCVN0cmluZyBwcm9qZWN0TmFtZTsKKwkKKwlwdWJsaWMgUkJQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSkgeworCQl0aGlzLnByb2plY3ROYW1lID0gcHJvamVjdE5hbWU7CisJCWJ1bmRsZU5hbWVzID0gbmV3IGphdmEudXRpbC5MaW5rZWRMaXN0KCk7CisJCWJ1bmRsZUZpbGVOYW1lcyA9IG5ldyBqYXZhLnV0aWwuTGlua2VkTGlzdCgpOworCQlidW5kbGVzID0gbmV3IGphdmEudXRpbC5MaW5rZWRMaXN0KCk7CisJfQorCQorCXB1YmxpYyBSQlByb2plY3QoRmlsZSBpbnB1dEZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXRoaXMoaW5wdXRGaWxlLmdldE5hbWUoKSk7CisJCQorCQlpZiAocHJvamVjdE5hbWUuaW5kZXhPZigiLiIpID4gMCkgeworCQkJcHJvamVjdE5hbWUgPSBwcm9qZWN0TmFtZS5zdWJzdHJpbmcoMCxwcm9qZWN0TmFtZS5sYXN0SW5kZXhPZigiLiIpKTsKKwkJfQorCQkKKwkJRmlsZVJlYWRlciBmciA9IG5ldyBGaWxlUmVhZGVyKGlucHV0RmlsZSk7CisJCUJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGZyKTsKKwkJU3RyaW5nIGxpbmUgPSBudWxsOworCQlpbnQgbGluZWNvdW50ID0gMDsKKwkJd2hpbGUgKChsaW5lID0gYnIucmVhZExpbmUoKSkgIT0gbnVsbCkgeworCQkJaWYgKGxpbmVjb3VudCAlIDIgPT0gMCkgeworCQkJCWJ1bmRsZU5hbWVzLmFkZChsaW5lLnRyaW0oKSk7CisJCQl9IGVsc2UgeworCQkJCWJ1bmRsZUZpbGVOYW1lcy5hZGQobGluZS50cmltKCkpOworCQkJfQorCQkJbGluZWNvdW50Kys7CisJCX0KKwkJZnIuY2xvc2UoKTsKKwkJdHJ5IHsKKwkJCWZvciAoaW50IGk9MDsgaSA8IGJ1bmRsZUZpbGVOYW1lcy5zaXplKCk7IGkrKykgeworCQkJCVJCTWFuYWdlciByYm0gPSBuZXcgUkJNYW5hZ2VyKG5ldyBGaWxlKChTdHJpbmcpYnVuZGxlRmlsZU5hbWVzLmdldChpKSkpOworCQkJCWJ1bmRsZXMuYWRkKHJibSk7CisJCQl9CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworCQkJSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2cobmV3IEpGcmFtZSgpLCBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImVycm9yX2xvYWRfcHJvamVjdCIpLAorCQkJCQkJCQkJCSAgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJlcnJvciIpLCBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKKwkJCWV4LnByaW50U3RhY2tUcmFjZSgpOworCQkJYnVuZGxlTmFtZXMuY2xlYXIoKTsKKwkJCWJ1bmRsZUZpbGVOYW1lcy5jbGVhcigpOworCQl9CisJfQorCQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7IHJldHVybiBwcm9qZWN0TmFtZTsgfQorCQorCXB1YmxpYyBpbnQgZ2V0U2l6ZSgpIHsgcmV0dXJuIGJ1bmRsZU5hbWVzLnNpemUoKTsgfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0QnVuZGxlTmFtZShpbnQgaW5kZXgpIHsKKwkJcmV0dXJuIChTdHJpbmcpYnVuZGxlTmFtZXMuZ2V0KGluZGV4KTsJCisJfQorCQorCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoaW50IGluZGV4KSB7CisJCXJldHVybiAoU3RyaW5nKWJ1bmRsZUZpbGVOYW1lcy5nZXQoaW5kZXgpOwkKKwl9CisJCisJcHVibGljIFJCTWFuYWdlciBnZXRCdW5kbGUoaW50IGluZGV4KSB7CisJCXJldHVybiAoUkJNYW5hZ2VyKWJ1bmRsZXMuZ2V0KGluZGV4KTsKKwl9CisJCisJcHVibGljIFJCTWFuYWdlciBnZXRCdW5kbGUoU3RyaW5nIGJ1bmRsZU5hbWUpIHsKKwkJaW50IGluZGV4ID0gYnVuZGxlTmFtZXMuaW5kZXhPZihidW5kbGVOYW1lKTsKKwkJaWYgKGluZGV4ID49IDApIHJldHVybiBnZXRCdW5kbGUoaW5kZXgpOworCQlyZXR1cm4gbnVsbDsKKwl9CisJCisJcHVibGljIHZvaWQgd3JpdGUoRmlsZSBvdXRwdXRGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlGaWxlV3JpdGVyIGZ3ID0gbmV3IEZpbGVXcml0ZXIob3V0cHV0RmlsZSk7CisJCWZvciAoaW50IGk9MDsgaSA8IGJ1bmRsZU5hbWVzLnNpemUoKTsgaSsrKSB7CisJCQlmdy53cml0ZSgoU3RyaW5nKWJ1bmRsZU5hbWVzLmdldChpKSk7CisJCQlmdy53cml0ZSgiXG4iKTsKKwkJCWZ3LndyaXRlKChTdHJpbmcpYnVuZGxlRmlsZU5hbWVzLmdldChpKSk7CisJCQlpZiAoaSAhPSBidW5kbGVOYW1lcy5zaXplKCktMSkgZncud3JpdGUoIlxuIik7CisJCX0KKwkJZncuZmx1c2goKTsKKwkJZncuY2xvc2UoKTsKKwl9CisJCisJcHVibGljIHZvaWQgYWRkQnVuZGxlKFN0cmluZyBidW5kbGVGaWxlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJUkJNYW5hZ2VyIGJ1bmRsZSA9IG5ldyBSQk1hbmFnZXIobmV3IEZpbGUoYnVuZGxlRmlsZU5hbWUpKTsKKwkJYnVuZGxlcy5hZGQoYnVuZGxlKTsKKwkJYnVuZGxlTmFtZXMuYWRkKGJ1bmRsZS5nZXRCYXNlQ2xhc3MoKSk7CisJCWJ1bmRsZUZpbGVOYW1lcy5hZGQoYnVuZGxlRmlsZU5hbWUpOworCX0KKwkKKwlwdWJsaWMgdm9pZCByZW1vdmVCdW5kbGUoU3RyaW5nIGJ1bmRsZU5hbWUpIHsKKwkJaW50IGluZGV4ID0gYnVuZGxlTmFtZXMuaW5kZXhPZihidW5kbGVOYW1lKTsKKwkJaWYgKGluZGV4ID49IDApIHsKKwkJCWJ1bmRsZU5hbWVzLnJlbW92ZShpbmRleCk7CisJCQlidW5kbGVGaWxlTmFtZXMucmVtb3ZlKGluZGV4KTsKKwkJCWJ1bmRsZXMucmVtb3ZlKGluZGV4KTsKKwkJfQorCX0KK30KKworY2xhc3MgUkJNYW5hZ2VyTWVudUJhciBleHRlbmRzIEpNZW51QmFyIHsKKwlSQk1hbmFnZXJHVUkgICAgICAgICAgICAgbGlzdGVuZXI7CisJCisJSk1lbnUgICAgICAgIGpNZW51RmlsZSA9IG5ldyBKTWVudSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNZW51IC0+IEZpbGUKKwlKTWVudUl0ZW0gICAgak1lbnVGaWxlTmV3UmVzb3VyY2VCdW5kbGUgPSBuZXcgSk1lbnVJdGVtKCk7ICAgICAgICAgICAgICAgIAorCUpNZW51SXRlbSAgICBqTWVudUZpbGVPcGVuUmVzb3VyY2VCdW5kbGUgPSBuZXcgSk1lbnVJdGVtKCk7CisJSk1lbnVJdGVtICAgIGpNZW51RmlsZVNhdmVSZXNvdXJjZUJ1bmRsZSA9IG5ldyBKTWVudUl0ZW0oKTsKKwlKTWVudUl0ZW0gICAgak1lbnVGaWxlU2F2ZVJlc291cmNlQnVuZGxlQXMgPSBuZXcgSk1lbnVJdGVtKCk7CisJSk1lbnUgICAgICAgIGpNZW51RmlsZUltcG9ydFJlc291cmNlQnVuZGxlID0gbmV3IEpNZW51KCk7ICAgICAgICAgICAgICAgICAvLyBNZW51IC0+IEZpbGUgLT4gSW1wb3J0CisJSk1lbnVJdGVtICAgIGpNZW51RmlsZUltcG9ydEphdmEgPSBuZXcgSk1lbnVJdGVtKCk7CisJSk1lbnVJdGVtICAgIGpNZW51RmlsZUltcG9ydFByb3BlcnRpZXMgPSBuZXcgSk1lbnVJdGVtKCk7CisJSk1lbnVJdGVtICAgIGpNZW51RmlsZUltcG9ydFRNWCA9IG5ldyBKTWVudUl0ZW0oKTsKKwlKTWVudUl0ZW0gICAgak1lbnVGaWxlSW1wb3J0WExGID0gbmV3IEpNZW51SXRlbSgpOworCUpNZW51ICAgICAgICBqTWVudUZpbGVFeHBvcnRSZXNvdXJjZUJ1bmRsZSA9IG5ldyBKTWVudSgpOyAgICAgICAgICAgICAgICAgLy8gTWVudSAtPiBGaWxlIC0+IEV4cG9ydAorCUpNZW51SXRlbSAgICBqTWVudUZpbGVFeHBvcnRKYXZhID0gbmV3IEpNZW51SXRlbSgpOworCUpNZW51SXRlbSAgICBqTWVudUZpbGVFeHBvcnRJQ1UgPSBuZXcgSk1lbnVJdGVtKCk7CisJSk1lbnVJdGVtICAgIGpNZW51RmlsZUV4cG9ydFByb3BlcnRpZXMgPSBuZXcgSk1lbnVJdGVtKCk7CisJSk1lbnVJdGVtICAgIGpNZW51RmlsZUV4cG9ydFRNWCA9IG5ldyBKTWVudUl0ZW0oKTsKKwlKTWVudUl0ZW0gICAgak1lbnVGaWxlRXhwb3J0WExGID0gbmV3IEpNZW51SXRlbSgpOworCUpNZW51SXRlbSAgICBqTWVudUZpbGVFeGl0ID0gbmV3IEpNZW51SXRlbSgpOworCUpNZW51ICAgICAgICBqTWVudUVkaXQgPSBuZXcgSk1lbnUoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWVudSAtPiBFZGl0CisJSk1lbnVJdGVtICAgIGpNZW51RWRpdEN1dCA9IG5ldyBKTWVudUl0ZW0oKTsKKwlKTWVudUl0ZW0gICAgak1lbnVFZGl0Q29weSA9IG5ldyBKTWVudUl0ZW0oKTsKKwlKTWVudUl0ZW0gICAgak1lbnVFZGl0UGFzdGUgPSBuZXcgSk1lbnVJdGVtKCk7CisJSk1lbnVJdGVtICAgIGpNZW51RWRpdERlbGV0ZSA9IG5ldyBKTWVudUl0ZW0oKTsKKwlKTWVudSAgICAgICAgak1lbnVPcHRpb25zID0gbmV3IEpNZW51KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1lbnUgLT4gT3B0aW9ucworCUpNZW51SXRlbSAgICBqTWVudU9wdGlvbnNBZGROZXdFbnRyeSA9IG5ldyBKTWVudUl0ZW0oKTsKKwlKTWVudUl0ZW0gICAgak1lbnVPcHRpb25zQWRkTmV3R3JvdXAgPSBuZXcgSk1lbnVJdGVtKCk7CisJSk1lbnVJdGVtICAgIGpNZW51T3B0aW9uc0FkZE5ld1Jlc291cmNlRmlsZSA9IG5ldyBKTWVudUl0ZW0oKTsKKwkvL0pNZW51SXRlbSAgICBqTWVudU9wdGlvbnNQcm9qZWN0Vmlld2VyID0gbmV3IEpNZW51SXRlbSgpOworCUpNZW51SXRlbSAgICBqTWVudU9wdGlvbnNQcmVmZXJlbmNlcyA9IG5ldyBKTWVudUl0ZW0oKTsKKwlKTWVudSAgICAgICAgak1lbnVWaWV3ID0gbmV3IEpNZW51KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1lbnUgLT4gVmlldworCUpNZW51SXRlbSAgICBqTWVudVZpZXdWaWV3U3RhdGlzdGljcyA9IG5ldyBKTWVudUl0ZW0oKTsKKwlKTWVudSAgICAgICAgak1lbnVIZWxwID0gbmV3IEpNZW51KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1lbnUgLT4gSGVscAorCUpNZW51SXRlbSAgICBqTWVudUhlbHBBYm91dFJlc291cmNlQnVuZGxlTWFuYWdlciA9IG5ldyBKTWVudUl0ZW0oKTsKKwkKKwl2b2lkIHVwZGF0ZUxvY2FsZSgpIHsKKwkJLy9GSUxFCisJCWpNZW51RmlsZS5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9maWxlIikpOworCQlqTWVudUZpbGUuc2V0TW5lbW9uaWMoZ2V0S2V5RXZlbnRLZXkoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2ZpbGVfdHJpZ2dlciIpKSk7CisJCWpNZW51RmlsZU5ld1Jlc291cmNlQnVuZGxlLnNldFRleHQoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2ZpbGVfbmV3IikpOworCQlqTWVudUZpbGVOZXdSZXNvdXJjZUJ1bmRsZS5zZXRNbmVtb25pYyhnZXRLZXlFdmVudEtleShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZmlsZV9uZXdfdHJpZ2dlciIpKSk7CisJCWpNZW51RmlsZU9wZW5SZXNvdXJjZUJ1bmRsZS5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9maWxlX29wZW4iKSk7CisJCWpNZW51RmlsZU9wZW5SZXNvdXJjZUJ1bmRsZS5zZXRNbmVtb25pYyhnZXRLZXlFdmVudEtleShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZmlsZV9vcGVuX3RyaWdnZXIiKSkpOworCQlqTWVudUZpbGVTYXZlUmVzb3VyY2VCdW5kbGUuc2V0VGV4dChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZmlsZV9zYXZlIikpOworCQlqTWVudUZpbGVTYXZlUmVzb3VyY2VCdW5kbGUuc2V0TW5lbW9uaWMoZ2V0S2V5RXZlbnRLZXkoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2ZpbGVfc2F2ZV90cmlnZ2VyIikpKTsKKwkJak1lbnVGaWxlU2F2ZVJlc291cmNlQnVuZGxlQXMuc2V0VGV4dChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZmlsZV9zYXZlYXMiKSk7CisJCWpNZW51RmlsZVNhdmVSZXNvdXJjZUJ1bmRsZUFzLnNldE1uZW1vbmljKGdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9maWxlX3NhdmVhc190cmlnZ2VyIikpKTsKKwkJak1lbnVGaWxlSW1wb3J0UmVzb3VyY2VCdW5kbGUuc2V0VGV4dChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZmlsZV9pbXBvcnQiKSk7CisJCWpNZW51RmlsZUltcG9ydFJlc291cmNlQnVuZGxlLnNldE1uZW1vbmljKGdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9maWxlX2ltcG9ydF90cmlnZ2VyIikpKTsKKwkJak1lbnVGaWxlSW1wb3J0SmF2YS5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9maWxlX2ltcG9ydF9qYXZhIikpOworCQlqTWVudUZpbGVJbXBvcnRKYXZhLnNldE1uZW1vbmljKGdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9maWxlX2ltcG9ydF9qYXZhX3RyaWdnZXIiKSkpOworCQlqTWVudUZpbGVJbXBvcnRQcm9wZXJ0aWVzLnNldFRleHQoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2ZpbGVfaW1wb3J0X3Byb3BlcnRpZXMiKSk7CisJCWpNZW51RmlsZUltcG9ydFByb3BlcnRpZXMuc2V0TW5lbW9uaWMoZ2V0S2V5RXZlbnRLZXkoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2ZpbGVfaW1wb3J0X3Byb3BlcnRpZXNfdHJpZ2dlciIpKSk7CisJCWpNZW51RmlsZUltcG9ydFRNWC5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9maWxlX2ltcG9ydF9UTVgiKSk7CisJCWpNZW51RmlsZUltcG9ydFRNWC5zZXRNbmVtb25pYyhnZXRLZXlFdmVudEtleShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZmlsZV9pbXBvcnRfVE1YX3RyaWdnZXIiKSkpOworCQlqTWVudUZpbGVJbXBvcnRYTEYuc2V0VGV4dChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZmlsZV9pbXBvcnRfWExGIikpOworCQlqTWVudUZpbGVJbXBvcnRYTEYuc2V0TW5lbW9uaWMoZ2V0S2V5RXZlbnRLZXkoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2ZpbGVfaW1wb3J0X1hMRl90cmlnZ2VyIikpKTsKKwkJak1lbnVGaWxlRXhwb3J0UmVzb3VyY2VCdW5kbGUuc2V0VGV4dChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZmlsZV9leHBvcnQiKSk7CisJCWpNZW51RmlsZUV4cG9ydFJlc291cmNlQnVuZGxlLnNldE1uZW1vbmljKGdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9maWxlX2V4cG9ydF90cmlnZ2VyIikpKTsKKwkJak1lbnVGaWxlRXhwb3J0SmF2YS5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9maWxlX2V4cG9ydF9qYXZhIikpOworCQlqTWVudUZpbGVFeHBvcnRKYXZhLnNldE1uZW1vbmljKGdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9maWxlX2V4cG9ydF9qYXZhX3RyaWdnZXIiKSkpOworCQlqTWVudUZpbGVFeHBvcnRJQ1Uuc2V0VGV4dChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZmlsZV9leHBvcnRfSUNVIikpOworCQlqTWVudUZpbGVFeHBvcnRJQ1Uuc2V0TW5lbW9uaWMoZ2V0S2V5RXZlbnRLZXkoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2ZpbGVfZXhwb3J0X0lDVV90cmlnZ2VyIikpKTsKKwkJak1lbnVGaWxlRXhwb3J0UHJvcGVydGllcy5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9maWxlX2V4cG9ydF9wcm9wZXJ0aWVzIikpOworCQlqTWVudUZpbGVFeHBvcnRQcm9wZXJ0aWVzLnNldE1uZW1vbmljKGdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9maWxlX2V4cG9ydF9wcm9wZXJ0aWVzX3RyaWdnZXIiKSkpOworCQlqTWVudUZpbGVFeHBvcnRUTVguc2V0VGV4dChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZmlsZV9leHBvcnRfVE1YIikpOworCQlqTWVudUZpbGVFeHBvcnRUTVguc2V0TW5lbW9uaWMoZ2V0S2V5RXZlbnRLZXkoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2ZpbGVfZXhwb3J0X1RNWF90cmlnZ2VyIikpKTsKKwkJak1lbnVGaWxlRXhwb3J0WExGLnNldFRleHQoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2ZpbGVfZXhwb3J0X1hMRiIpKTsKKwkJak1lbnVGaWxlRXhwb3J0WExGLnNldE1uZW1vbmljKGdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9maWxlX2V4cG9ydF9YTEZfdHJpZ2dlciIpKSk7CisJCWpNZW51RmlsZUV4aXQuc2V0VGV4dChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZmlsZV9xdWl0IikpOworCQlqTWVudUZpbGVFeGl0LnNldE1uZW1vbmljKGdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9maWxlX3F1aXRfdHJpZ2dlciIpKSk7CisJCS8vRURJVAorCQlqTWVudUVkaXQuc2V0VGV4dChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZWRpdCIpKTsKKwkJak1lbnVFZGl0LnNldE1uZW1vbmljKGdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9lZGl0X3RyaWdnZXIiKSkpOworCQlqTWVudUVkaXRDdXQuc2V0VGV4dChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZWRpdF9jdXQiKSk7CisJCWpNZW51RWRpdEN1dC5zZXRNbmVtb25pYyhnZXRLZXlFdmVudEtleShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZWRpdF9jdXRfdHJpZ2dlciIpKSk7CisJCWpNZW51RWRpdENvcHkuc2V0VGV4dChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZWRpdF9jb3B5IikpOworCQlqTWVudUVkaXRDb3B5LnNldE1uZW1vbmljKGdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9lZGl0X2NvcHlfdHJpZ2dlciIpKSk7CisJCWpNZW51RWRpdFBhc3RlLnNldFRleHQoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2VkaXRfcGFzdGUiKSk7CisJCWpNZW51RWRpdFBhc3RlLnNldE1uZW1vbmljKGdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9lZGl0X3Bhc3RlX3RyaWdnZXIiKSkpOworCQlqTWVudUVkaXREZWxldGUuc2V0VGV4dChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZWRpdF9kZWxldGUiKSk7CisJCWpNZW51RWRpdERlbGV0ZS5zZXRNbmVtb25pYyhnZXRLZXlFdmVudEtleShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZWRpdF9kZWxldGVfdHJpZ2dlciIpKSk7CisJCS8vT1BUSU9OUworCQlqTWVudU9wdGlvbnMuc2V0VGV4dChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfb3B0aW9ucyIpKTsKKwkJak1lbnVPcHRpb25zLnNldE1uZW1vbmljKGdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9vcHRpb25zX3RyaWdnZXIiKSkpOworCQlqTWVudU9wdGlvbnNBZGROZXdFbnRyeS5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9vcHRpb25zX2FkZGVudHJ5IikpOworCQlqTWVudU9wdGlvbnNBZGROZXdFbnRyeS5zZXRNbmVtb25pYyhnZXRLZXlFdmVudEtleShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfb3B0aW9uc19hZGRlbnRyeV90cmlnZ2VyIikpKTsKKwkJak1lbnVPcHRpb25zQWRkTmV3R3JvdXAuc2V0VGV4dChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfb3B0aW9uc19hZGRncm91cCIpKTsKKwkJak1lbnVPcHRpb25zQWRkTmV3R3JvdXAuc2V0TW5lbW9uaWMoZ2V0S2V5RXZlbnRLZXkoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X29wdGlvbnNfYWRkZ3JvdXBfdHJpZ2dlciIpKSk7CisJCWpNZW51T3B0aW9uc0FkZE5ld1Jlc291cmNlRmlsZS5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9vcHRpb25zX2FkZGZpbGUiKSk7CisJCWpNZW51T3B0aW9uc0FkZE5ld1Jlc291cmNlRmlsZS5zZXRNbmVtb25pYyhnZXRLZXlFdmVudEtleShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfb3B0aW9uc19hZGRmaWxlX3RyaWdnZXIiKSkpOworCQkvL2pNZW51T3B0aW9uc1Byb2plY3RWaWV3ZXIuc2V0VGV4dChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfb3B0aW9uc19wcm9qZWN0X3ZpZXdlciIpKTsKKwkJLy9qTWVudU9wdGlvbnNQcm9qZWN0Vmlld2VyLnNldE1uZW1vbmljKGdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9vcHRpb25zX3Byb2plY3Rfdmlld2VyX3RyaWdnZXIiKSkpOworCQlqTWVudU9wdGlvbnNQcmVmZXJlbmNlcy5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9vcHRpb25zX3ByZWZlcmVuY2VzIikpOworCQlqTWVudU9wdGlvbnNQcmVmZXJlbmNlcy5zZXRNbmVtb25pYyhnZXRLZXlFdmVudEtleShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfb3B0aW9uc19wcmVmZXJlbmNlc190cmlnZ2VyIikpKTsKKwkJLy9WSUVXCisJCWpNZW51Vmlldy5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV92aWV3IikpOworCQlqTWVudVZpZXcuc2V0TW5lbW9uaWMoZ2V0S2V5RXZlbnRLZXkoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X3ZpZXdfdHJpZ2dlciIpKSk7CisJCWpNZW51Vmlld1ZpZXdTdGF0aXN0aWNzLnNldFRleHQoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X3ZpZXdfc3RhdGlzdGljcyIpKTsKKwkJak1lbnVWaWV3Vmlld1N0YXRpc3RpY3Muc2V0TW5lbW9uaWMoZ2V0S2V5RXZlbnRLZXkoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X3ZpZXdfc3RhdGlzdGljc190cmlnZ2VyIikpKTsKKwkJLy9IRUxQCisJCWpNZW51SGVscC5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9oZWxwIikpOworCQlqTWVudUhlbHAuc2V0TW5lbW9uaWMoZ2V0S2V5RXZlbnRLZXkoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X29wdGlvbnNfdHJpZ2dlciIpKSk7CisJCWpNZW51SGVscEFib3V0UmVzb3VyY2VCdW5kbGVNYW5hZ2VyLnNldFRleHQoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2hlbHBfYWJvdXQiKSk7CisJCWpNZW51SGVscEFib3V0UmVzb3VyY2VCdW5kbGVNYW5hZ2VyLnNldE1uZW1vbmljKGdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9oZWxwX2Fib3V0X3RyaWdnZXIiKSkpOworCX0KKwkKKwlwdWJsaWMgUkJNYW5hZ2VyTWVudUJhcihSQk1hbmFnZXJHVUkgZ3VpKSB7CisJCXN1cGVyKCk7CQorCQkKKyAgICAgICAgYm9vbGVhbiB4bWxBdmFpbGFibGU7CisJCXRyeSB7CisgICAgICAgICAgICBDbGFzcy5mb3JOYW1lKCJvcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLkRPTVBhcnNlciIpOworICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZSgiamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyIik7CisgICAgICAgICAgICB4bWxBdmFpbGFibGUgPSB0cnVlOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHhtbEF2YWlsYWJsZSA9IGZhbHNlOworICAgICAgICB9CisJCWxpc3RlbmVyID0gZ3VpOworCQkKKwkJLy8gQWRkIHRoZSBtZW51cyB0byB0aGUgbWVudSBiYXIgCisJCXNldFZpc2libGUodHJ1ZSk7CisJCWFkZChqTWVudUZpbGUpOworCQkvL2FkZChqTWVudUVkaXQpOworCQlhZGQoak1lbnVPcHRpb25zKTsKKwkJLy9hZGQoak1lbnVWaWV3KTsKKwkJYWRkKGpNZW51SGVscCk7CisKKwkJLy8gQWRkIEZpbGUgTWVudSBJdGVtcyB0byB0aGUgRmlsZSBNZW51CisJCWpNZW51RmlsZS5zZXRWaXNpYmxlKHRydWUpOworCQlqTWVudUZpbGUuc2V0VGV4dChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZmlsZSIpKTsKKwkJak1lbnVGaWxlLnNldE1uZW1vbmljKGdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9maWxlX3RyaWdnZXIiKSkpOworCQlqTWVudUZpbGUuYWRkKGpNZW51RmlsZU5ld1Jlc291cmNlQnVuZGxlKTsKKwkJak1lbnVGaWxlLmFkZChqTWVudUZpbGVPcGVuUmVzb3VyY2VCdW5kbGUpOworCQlqTWVudUZpbGUuYWRkKGpNZW51RmlsZVNhdmVSZXNvdXJjZUJ1bmRsZSk7CisJCWpNZW51RmlsZS5hZGQoak1lbnVGaWxlU2F2ZVJlc291cmNlQnVuZGxlQXMpOworCQlqTWVudUZpbGUuYWRkU2VwYXJhdG9yKCk7CisJCWpNZW51RmlsZS5hZGQoak1lbnVGaWxlSW1wb3J0UmVzb3VyY2VCdW5kbGUpOworCQlqTWVudUZpbGUuYWRkKGpNZW51RmlsZUV4cG9ydFJlc291cmNlQnVuZGxlKTsKKwkJak1lbnVGaWxlLmFkZFNlcGFyYXRvcigpOworCQkvLyBBZGQgdGhlIHJlY2VudCBmaWxlcyB0byB0aGUgZmlsZSBtZW51CisJCVZlY3RvciByZWNlbnRGaWxlcyA9IFByZWZlcmVuY2VzLmdldFJlY2VudEZpbGVzUHJlZmVyZW5jZXMoKTsKKwkJaWYgKHJlY2VudEZpbGVzLnNpemUoKSA+IDApIHsKKwkJCWZvciAoaW50IGk9MDsgaSA8IHJlY2VudEZpbGVzLnNpemUoKTsgaSs9MikgeworCQkJCVN0cmluZyBuYW1lID0gKFN0cmluZylyZWNlbnRGaWxlcy5lbGVtZW50QXQoaSk7CisJCQkJU3RyaW5nIGxvY2F0aW9uID0gKFN0cmluZylyZWNlbnRGaWxlcy5lbGVtZW50QXQoaSsxKTsKKwkJCQlKTWVudUl0ZW0gcmVjZW50TWVudUl0ZW0gPSBuZXcgSk1lbnVJdGVtKCk7CisJCQkJcmVjZW50TWVudUl0ZW0uc2V0VmlzaWJsZSh0cnVlKTsKKwkJCQlyZWNlbnRNZW51SXRlbS5zZXRUZXh0KG5hbWUpOworCQkJCXJlY2VudE1lbnVJdGVtLnNldE5hbWUoIl9fIiArIGxvY2F0aW9uLnRyaW0oKSk7CisJCQkJcmVjZW50TWVudUl0ZW0uYWRkQWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOworCQkJCWpNZW51RmlsZS5hZGQocmVjZW50TWVudUl0ZW0pOworCQkJfQorCQkJak1lbnVGaWxlLmFkZFNlcGFyYXRvcigpOworCQl9CisJCWpNZW51RmlsZS5hZGQoak1lbnVGaWxlRXhpdCk7CisJCQorCQkvL2pNZW51RmlsZUltcG9ydFJlc291cmNlQnVuZGxlLmFkZChqTWVudUZpbGVJbXBvcnRKYXZhKTsKKwkJak1lbnVGaWxlSW1wb3J0UmVzb3VyY2VCdW5kbGUuYWRkKGpNZW51RmlsZUltcG9ydFByb3BlcnRpZXMpOworICAgICAgICBqTWVudUZpbGVJbXBvcnRUTVguc2V0RW5hYmxlZCh4bWxBdmFpbGFibGUpOworCQlqTWVudUZpbGVJbXBvcnRSZXNvdXJjZUJ1bmRsZS5hZGQoak1lbnVGaWxlSW1wb3J0VE1YKTsKKyAgICAgICAgak1lbnVGaWxlSW1wb3J0WExGLnNldEVuYWJsZWQoeG1sQXZhaWxhYmxlKTsKKwkJak1lbnVGaWxlSW1wb3J0UmVzb3VyY2VCdW5kbGUuYWRkKGpNZW51RmlsZUltcG9ydFhMRik7CisJCWpNZW51RmlsZUV4cG9ydFJlc291cmNlQnVuZGxlLmFkZChqTWVudUZpbGVFeHBvcnRKYXZhKTsKKwkJak1lbnVGaWxlRXhwb3J0UmVzb3VyY2VCdW5kbGUuYWRkKGpNZW51RmlsZUV4cG9ydElDVSk7CisJCWpNZW51RmlsZUV4cG9ydFJlc291cmNlQnVuZGxlLmFkZChqTWVudUZpbGVFeHBvcnRQcm9wZXJ0aWVzKTsKKyAgICAgICAgak1lbnVGaWxlRXhwb3J0VE1YLnNldEVuYWJsZWQoeG1sQXZhaWxhYmxlKTsKKwkJak1lbnVGaWxlRXhwb3J0UmVzb3VyY2VCdW5kbGUuYWRkKGpNZW51RmlsZUV4cG9ydFRNWCk7CisgICAgICAgIGpNZW51RmlsZUV4cG9ydFhMRi5zZXRFbmFibGVkKHhtbEF2YWlsYWJsZSk7CisJCWpNZW51RmlsZUV4cG9ydFJlc291cmNlQnVuZGxlLmFkZChqTWVudUZpbGVFeHBvcnRYTEYpOworCisJCWpNZW51RmlsZU5ld1Jlc291cmNlQnVuZGxlLnNldFZpc2libGUodHJ1ZSk7CisJCWpNZW51RmlsZU5ld1Jlc291cmNlQnVuZGxlLnNldFRleHQoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2ZpbGVfbmV3IikpOworCQlqTWVudUZpbGVOZXdSZXNvdXJjZUJ1bmRsZS5zZXRNbmVtb25pYyhnZXRLZXlFdmVudEtleShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZmlsZV9uZXdfdHJpZ2dlciIpKSk7CisJCWpNZW51RmlsZU5ld1Jlc291cmNlQnVuZGxlLnNldEFjY2VsZXJhdG9yKEtleVN0cm9rZS5nZXRLZXlTdHJva2UoCisgICAgICAgICAgICAgICAgICBLZXlFdmVudC5WS19OLCBBY3Rpb25FdmVudC5DVFJMX01BU0spKTsKKwkJak1lbnVGaWxlTmV3UmVzb3VyY2VCdW5kbGUuYWRkQWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOworCQkKKwkJak1lbnVGaWxlT3BlblJlc291cmNlQnVuZGxlLnNldFZpc2libGUodHJ1ZSk7CisJCWpNZW51RmlsZU9wZW5SZXNvdXJjZUJ1bmRsZS5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9maWxlX29wZW4iKSk7CisJCWpNZW51RmlsZU9wZW5SZXNvdXJjZUJ1bmRsZS5zZXRNbmVtb25pYyhnZXRLZXlFdmVudEtleShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZmlsZV9vcGVuX3RyaWdnZXIiKSkpOworCQlqTWVudUZpbGVPcGVuUmVzb3VyY2VCdW5kbGUuc2V0QWNjZWxlcmF0b3IoS2V5U3Ryb2tlLmdldEtleVN0cm9rZSgKKyAgICAgICAgICAgICAgICAgIEtleUV2ZW50LlZLX08sIEFjdGlvbkV2ZW50LkNUUkxfTUFTSykpOworCQlqTWVudUZpbGVPcGVuUmVzb3VyY2VCdW5kbGUuYWRkQWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOworCisJCWpNZW51RmlsZVNhdmVSZXNvdXJjZUJ1bmRsZS5zZXRWaXNpYmxlKHRydWUpOworCQlqTWVudUZpbGVTYXZlUmVzb3VyY2VCdW5kbGUuc2V0VGV4dChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZmlsZV9zYXZlIikpOworCQlqTWVudUZpbGVTYXZlUmVzb3VyY2VCdW5kbGUuc2V0TW5lbW9uaWMoZ2V0S2V5RXZlbnRLZXkoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2ZpbGVfc2F2ZV90cmlnZ2VyIikpKTsKKwkJak1lbnVGaWxlU2F2ZVJlc291cmNlQnVuZGxlLnNldEFjY2VsZXJhdG9yKEtleVN0cm9rZS5nZXRLZXlTdHJva2UoCisgICAgICAgICAgICAgICAgICBLZXlFdmVudC5WS19TLCBBY3Rpb25FdmVudC5DVFJMX01BU0spKTsKKwkJak1lbnVGaWxlU2F2ZVJlc291cmNlQnVuZGxlLmFkZEFjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKKworCQlqTWVudUZpbGVTYXZlUmVzb3VyY2VCdW5kbGVBcy5zZXRWaXNpYmxlKHRydWUpOworCQlqTWVudUZpbGVTYXZlUmVzb3VyY2VCdW5kbGVBcy5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9maWxlX3NhdmVhcyIpKTsKKwkJak1lbnVGaWxlU2F2ZVJlc291cmNlQnVuZGxlQXMuc2V0TW5lbW9uaWMoZ2V0S2V5RXZlbnRLZXkoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2ZpbGVfc2F2ZWFzX3RyaWdnZXIiKSkpOworCQlqTWVudUZpbGVTYXZlUmVzb3VyY2VCdW5kbGVBcy5zZXRBY2NlbGVyYXRvcihLZXlTdHJva2UuZ2V0S2V5U3Ryb2tlKAorICAgICAgICAgICAgICAgICAgS2V5RXZlbnQuVktfUywgQWN0aW9uRXZlbnQuQ1RSTF9NQVNLIHwgQWN0aW9uRXZlbnQuU0hJRlRfTUFTSykpOworCQlqTWVudUZpbGVTYXZlUmVzb3VyY2VCdW5kbGVBcy5hZGRBY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7CisJCQorCQlqTWVudUZpbGVJbXBvcnRSZXNvdXJjZUJ1bmRsZS5zZXRWaXNpYmxlKHRydWUpOworCQlqTWVudUZpbGVJbXBvcnRSZXNvdXJjZUJ1bmRsZS5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9maWxlX2ltcG9ydCIpKTsKKwkJak1lbnVGaWxlSW1wb3J0UmVzb3VyY2VCdW5kbGUuc2V0TW5lbW9uaWMoZ2V0S2V5RXZlbnRLZXkoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2ZpbGVfaW1wb3J0X3RyaWdnZXIiKSkpOworCQlqTWVudUZpbGVJbXBvcnRSZXNvdXJjZUJ1bmRsZS5hZGRBY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7CisJCQorCQlqTWVudUZpbGVJbXBvcnRKYXZhLnNldFZpc2libGUodHJ1ZSk7CisJCWpNZW51RmlsZUltcG9ydEphdmEuc2V0VGV4dChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZmlsZV9pbXBvcnRfamF2YSIpKTsKKwkJak1lbnVGaWxlSW1wb3J0SmF2YS5zZXRNbmVtb25pYyhnZXRLZXlFdmVudEtleShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZmlsZV9pbXBvcnRfamF2YV90cmlnZ2VyIikpKTsKKwkJak1lbnVGaWxlSW1wb3J0SmF2YS5hZGRBY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7CisJCQorCQlqTWVudUZpbGVJbXBvcnRQcm9wZXJ0aWVzLnNldFZpc2libGUodHJ1ZSk7CisJCWpNZW51RmlsZUltcG9ydFByb3BlcnRpZXMuc2V0VGV4dChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZmlsZV9pbXBvcnRfcHJvcGVydGllcyIpKTsKKwkJak1lbnVGaWxlSW1wb3J0UHJvcGVydGllcy5zZXRNbmVtb25pYyhnZXRLZXlFdmVudEtleShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZmlsZV9pbXBvcnRfcHJvcGVydGllc190cmlnZ2VyIikpKTsKKwkJak1lbnVGaWxlSW1wb3J0UHJvcGVydGllcy5hZGRBY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7CisJCQorCQlqTWVudUZpbGVJbXBvcnRUTVguc2V0VmlzaWJsZSh0cnVlKTsKKwkJak1lbnVGaWxlSW1wb3J0VE1YLnNldFRleHQoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2ZpbGVfaW1wb3J0X1RNWCIpKTsKKwkJak1lbnVGaWxlSW1wb3J0VE1YLnNldE1uZW1vbmljKGdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9maWxlX2ltcG9ydF9UTVhfdHJpZ2dlciIpKSk7CisJCWpNZW51RmlsZUltcG9ydFRNWC5hZGRBY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7CisJCQorCQlqTWVudUZpbGVJbXBvcnRYTEYuc2V0VmlzaWJsZSh0cnVlKTsKKwkJak1lbnVGaWxlSW1wb3J0WExGLnNldFRleHQoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2ZpbGVfaW1wb3J0X1hMRiIpKTsKKwkJak1lbnVGaWxlSW1wb3J0WExGLnNldE1uZW1vbmljKGdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9maWxlX2ltcG9ydF9YTEZfdHJpZ2dlciIpKSk7CisJCWpNZW51RmlsZUltcG9ydFhMRi5hZGRBY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7CisJCQorCQlqTWVudUZpbGVFeHBvcnRSZXNvdXJjZUJ1bmRsZS5zZXRWaXNpYmxlKHRydWUpOworCQlqTWVudUZpbGVFeHBvcnRSZXNvdXJjZUJ1bmRsZS5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9maWxlX2V4cG9ydCIpKTsKKwkJak1lbnVGaWxlRXhwb3J0UmVzb3VyY2VCdW5kbGUuc2V0TW5lbW9uaWMoZ2V0S2V5RXZlbnRLZXkoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2ZpbGVfZXhwb3J0X3RyaWdnZXIiKSkpOworCQlqTWVudUZpbGVFeHBvcnRSZXNvdXJjZUJ1bmRsZS5hZGRBY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7CisJCQorCQlqTWVudUZpbGVFeHBvcnRKYXZhLnNldFZpc2libGUodHJ1ZSk7CisJCWpNZW51RmlsZUV4cG9ydEphdmEuc2V0VGV4dChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZmlsZV9leHBvcnRfamF2YSIpKTsKKwkJak1lbnVGaWxlRXhwb3J0SmF2YS5zZXRNbmVtb25pYyhnZXRLZXlFdmVudEtleShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZmlsZV9leHBvcnRfamF2YV90cmlnZ2VyIikpKTsKKwkJak1lbnVGaWxlRXhwb3J0SmF2YS5hZGRBY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7CisJCQorCQlqTWVudUZpbGVFeHBvcnRJQ1Uuc2V0VmlzaWJsZSh0cnVlKTsKKwkJak1lbnVGaWxlRXhwb3J0SUNVLnNldFRleHQoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2ZpbGVfZXhwb3J0X0lDVSIpKTsKKwkJak1lbnVGaWxlRXhwb3J0SUNVLnNldE1uZW1vbmljKGdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9maWxlX2V4cG9ydF9JQ1VfdHJpZ2dlciIpKSk7CisJCWpNZW51RmlsZUV4cG9ydElDVS5hZGRBY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7CisKKwkJak1lbnVGaWxlRXhwb3J0UHJvcGVydGllcy5zZXRWaXNpYmxlKHRydWUpOworCQlqTWVudUZpbGVFeHBvcnRQcm9wZXJ0aWVzLnNldFRleHQoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2ZpbGVfZXhwb3J0X3Byb3BlcnRpZXMiKSk7CisJCWpNZW51RmlsZUV4cG9ydFByb3BlcnRpZXMuc2V0TW5lbW9uaWMoZ2V0S2V5RXZlbnRLZXkoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2ZpbGVfZXhwb3J0X3Byb3BlcnRpZXNfdHJpZ2dlciIpKSk7CisJCWpNZW51RmlsZUV4cG9ydFByb3BlcnRpZXMuYWRkQWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOworCQkKKwkJak1lbnVGaWxlRXhwb3J0VE1YLnNldFZpc2libGUodHJ1ZSk7CisJCWpNZW51RmlsZUV4cG9ydFRNWC5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9maWxlX2V4cG9ydF9UTVgiKSk7CisJCWpNZW51RmlsZUV4cG9ydFRNWC5zZXRNbmVtb25pYyhnZXRLZXlFdmVudEtleShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZmlsZV9leHBvcnRfVE1YX3RyaWdnZXIiKSkpOworCQlqTWVudUZpbGVFeHBvcnRUTVguYWRkQWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOworCQkKKwkJak1lbnVGaWxlRXhwb3J0WExGLnNldFZpc2libGUodHJ1ZSk7CisJCWpNZW51RmlsZUV4cG9ydFhMRi5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9maWxlX2V4cG9ydF9YTEYiKSk7CisJCWpNZW51RmlsZUV4cG9ydFhMRi5zZXRNbmVtb25pYyhnZXRLZXlFdmVudEtleShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZmlsZV9leHBvcnRfWExGX3RyaWdnZXIiKSkpOworCQlqTWVudUZpbGVFeHBvcnRYTEYuYWRkQWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOworCisJCWpNZW51RmlsZUV4aXQuc2V0VmlzaWJsZSh0cnVlKTsKKwkJak1lbnVGaWxlRXhpdC5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9maWxlX3F1aXQiKSk7CisJCWpNZW51RmlsZUV4aXQuc2V0TW5lbW9uaWMoZ2V0S2V5RXZlbnRLZXkoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2ZpbGVfcXVpdF90cmlnZ2VyIikpKTsKKwkJak1lbnVGaWxlRXhpdC5zZXRBY2NlbGVyYXRvcihLZXlTdHJva2UuZ2V0S2V5U3Ryb2tlKAorICAgICAgICAgICAgICAgICAgS2V5RXZlbnQuVktfUSwgQWN0aW9uRXZlbnQuQ1RSTF9NQVNLKSk7CisJCWpNZW51RmlsZUV4aXQuYWRkQWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOworCisJCS8vIEFkZCBFZGl0IE1lbnUgSXRlbXMgdG8gdGhlIEVkaXQgTWVudQorCQlqTWVudUVkaXQuc2V0VmlzaWJsZSh0cnVlKTsKKwkJak1lbnVFZGl0LnNldFRleHQoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2VkaXQiKSk7CisJCWpNZW51RWRpdC5zZXRNbmVtb25pYyhnZXRLZXlFdmVudEtleShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZWRpdF90cmlnZ2VyIikpKTsKKwkJak1lbnVFZGl0LmFkZChqTWVudUVkaXRDdXQpOworCQlqTWVudUVkaXQuYWRkKGpNZW51RWRpdENvcHkpOworCQlqTWVudUVkaXQuYWRkKGpNZW51RWRpdFBhc3RlKTsKKwkJak1lbnVFZGl0LmFkZChqTWVudUVkaXREZWxldGUpOworCisJCWpNZW51RWRpdEN1dC5zZXRWaXNpYmxlKHRydWUpOworCQlqTWVudUVkaXRDdXQuc2V0VGV4dChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZWRpdF9jdXQiKSk7CisJCWpNZW51RWRpdEN1dC5zZXRNbmVtb25pYyhnZXRLZXlFdmVudEtleShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfZWRpdF9jdXRfdHJpZ2dlciIpKSk7CisJCWpNZW51RWRpdEN1dC5zZXRBY2NlbGVyYXRvcihLZXlTdHJva2UuZ2V0S2V5U3Ryb2tlKAorCQkJCUtleUV2ZW50LlZLX1gsIEFjdGlvbkV2ZW50LkNUUkxfTUFTSykpOworCisJCWpNZW51RWRpdENvcHkuc2V0VmlzaWJsZSh0cnVlKTsKKwkJak1lbnVFZGl0Q29weS5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9lZGl0X2NvcHkiKSk7CisJCWpNZW51RWRpdENvcHkuc2V0TW5lbW9uaWMoZ2V0S2V5RXZlbnRLZXkoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2VkaXRfY29weV90cmlnZ2VyIikpKTsKKwkJak1lbnVFZGl0Q29weS5zZXRBY2NlbGVyYXRvcihLZXlTdHJva2UuZ2V0S2V5U3Ryb2tlKAorCQkJCUtleUV2ZW50LlZLX0MsIEFjdGlvbkV2ZW50LkNUUkxfTUFTSykpOworCisJCWpNZW51RWRpdFBhc3RlLnNldFZpc2libGUodHJ1ZSk7CisJCWpNZW51RWRpdFBhc3RlLnNldFRleHQoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X2VkaXRfcGFzdGUiKSk7CisJCWpNZW51RWRpdFBhc3RlLnNldE1uZW1vbmljKGdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9lZGl0X3Bhc3RlX3RyaWdnZXIiKSkpOworCQlqTWVudUVkaXRQYXN0ZS5zZXRBY2NlbGVyYXRvcihLZXlTdHJva2UuZ2V0S2V5U3Ryb2tlKAorCQkJCUtleUV2ZW50LlZLX1YsIEFjdGlvbkV2ZW50LkNUUkxfTUFTSykpOworCQkKKwkJak1lbnVFZGl0RGVsZXRlLnNldFZpc2libGUodHJ1ZSk7CisJCWpNZW51RWRpdERlbGV0ZS5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9lZGl0X2RlbGV0ZSIpKTsKKwkJak1lbnVFZGl0RGVsZXRlLnNldE1uZW1vbmljKGdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9lZGl0X2RlbGV0ZV90cmlnZ2VyIikpKTsKKworCQkvLyBBZGQgT3B0aW9ucyBNZW51IEl0ZW1zIHRvIHRoZSBPcHRpb25zIE1lbnUKKwkJak1lbnVPcHRpb25zLnNldFZpc2libGUodHJ1ZSk7CisJCWpNZW51T3B0aW9ucy5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9vcHRpb25zIikpOworCQlqTWVudU9wdGlvbnMuc2V0TW5lbW9uaWMoZ2V0S2V5RXZlbnRLZXkoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X29wdGlvbnNfdHJpZ2dlciIpKSk7CisJCWpNZW51T3B0aW9ucy5hZGQoak1lbnVPcHRpb25zQWRkTmV3RW50cnkpOworCQlqTWVudU9wdGlvbnMuYWRkKGpNZW51T3B0aW9uc0FkZE5ld0dyb3VwKTsKKwkJak1lbnVPcHRpb25zLmFkZChqTWVudU9wdGlvbnNBZGROZXdSZXNvdXJjZUZpbGUpOworCQkvL2pNZW51T3B0aW9ucy5hZGRTZXBhcmF0b3IoKTsKKwkJLy9qTWVudU9wdGlvbnMuYWRkKGpNZW51T3B0aW9uc1Byb2plY3RWaWV3ZXIpOworCQlqTWVudU9wdGlvbnMuYWRkU2VwYXJhdG9yKCk7CisJCWpNZW51T3B0aW9ucy5hZGQoak1lbnVPcHRpb25zUHJlZmVyZW5jZXMpOworCisJCWpNZW51T3B0aW9uc0FkZE5ld0VudHJ5LnNldFZpc2libGUodHJ1ZSk7CisJCWpNZW51T3B0aW9uc0FkZE5ld0VudHJ5LnNldFRleHQoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X29wdGlvbnNfYWRkZW50cnkiKSk7CisJCWpNZW51T3B0aW9uc0FkZE5ld0VudHJ5LnNldE1uZW1vbmljKGdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9vcHRpb25zX2FkZGVudHJ5X3RyaWdnZXIiKSkpOworCQlqTWVudU9wdGlvbnNBZGROZXdFbnRyeS5hZGRBY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7CisJCQorCQlqTWVudU9wdGlvbnNBZGROZXdHcm91cC5zZXRWaXNpYmxlKHRydWUpOworCQlqTWVudU9wdGlvbnNBZGROZXdHcm91cC5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9vcHRpb25zX2FkZGdyb3VwIikpOworCQlqTWVudU9wdGlvbnNBZGROZXdHcm91cC5zZXRNbmVtb25pYyhnZXRLZXlFdmVudEtleShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfb3B0aW9uc19hZGRncm91cF90cmlnZ2VyIikpKTsKKwkJak1lbnVPcHRpb25zQWRkTmV3R3JvdXAuYWRkQWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOworCisJCWpNZW51T3B0aW9uc0FkZE5ld1Jlc291cmNlRmlsZS5zZXRWaXNpYmxlKHRydWUpOworCQlqTWVudU9wdGlvbnNBZGROZXdSZXNvdXJjZUZpbGUuc2V0VGV4dChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfb3B0aW9uc19hZGRmaWxlIikpOworCQlqTWVudU9wdGlvbnNBZGROZXdSZXNvdXJjZUZpbGUuc2V0TW5lbW9uaWMoZ2V0S2V5RXZlbnRLZXkoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X29wdGlvbnNfYWRkZmlsZV90cmlnZ2VyIikpKTsKKwkJak1lbnVPcHRpb25zQWRkTmV3UmVzb3VyY2VGaWxlLmFkZEFjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKKwkJCisJCS8qCisJCWpNZW51T3B0aW9uc1Byb2plY3RWaWV3ZXIuc2V0VmlzaWJsZSh0cnVlKTsKKwkJak1lbnVPcHRpb25zUHJvamVjdFZpZXdlci5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9vcHRpb25zX3Byb2plY3Rfdmlld2VyIikpOworCQlqTWVudU9wdGlvbnNQcm9qZWN0Vmlld2VyLnNldE1uZW1vbmljKGdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9vcHRpb25zX3Byb2plY3Rfdmlld2VyX3RyaWdnZXIiKSkpOworCQlqTWVudU9wdGlvbnNQcm9qZWN0Vmlld2VyLmFkZEFjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKKwkJKi8KKwkJCisJCWpNZW51T3B0aW9uc1ByZWZlcmVuY2VzLnNldFZpc2libGUodHJ1ZSk7CisJCWpNZW51T3B0aW9uc1ByZWZlcmVuY2VzLnNldFRleHQoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJtZW51X29wdGlvbnNfcHJlZmVyZW5jZXMiKSk7CisJCWpNZW51T3B0aW9uc1ByZWZlcmVuY2VzLnNldE1uZW1vbmljKGdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9vcHRpb25zX3ByZWZlcmVuY2VzX3RyaWdnZXIiKSkpOworCQlqTWVudU9wdGlvbnNQcmVmZXJlbmNlcy5hZGRBY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7CisKKwkJLy8gQWRkIFZpZXcgTWVudSBJdGVtcyB0byB0aGUgVmlldyBNZW51CisJCWpNZW51Vmlldy5zZXRWaXNpYmxlKHRydWUpOworCQlqTWVudVZpZXcuc2V0VGV4dChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfdmlldyIpKTsKKwkJak1lbnVWaWV3LnNldE1uZW1vbmljKGdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV92aWV3X3RyaWdnZXIiKSkpOworCQlqTWVudVZpZXcuYWRkKGpNZW51Vmlld1ZpZXdTdGF0aXN0aWNzKTsKKworCQlqTWVudVZpZXdWaWV3U3RhdGlzdGljcy5zZXRWaXNpYmxlKHRydWUpOworCQlqTWVudVZpZXdWaWV3U3RhdGlzdGljcy5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV92aWV3X3N0YXRpc3RpY3MiKSk7CisJCWpNZW51Vmlld1ZpZXdTdGF0aXN0aWNzLnNldE1uZW1vbmljKGdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV92aWV3X3N0YXRpc3RpY3NfdHJpZ2dlciIpKSk7CisKKwkJLy8gQWRkIEhlbHAgTWVudSBJdGVtcyB0byB0aGUgSGVscCBNZW51CisJCWpNZW51SGVscC5zZXRWaXNpYmxlKHRydWUpOworCQlqTWVudUhlbHAuc2V0VGV4dChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfaGVscCIpKTsKKwkJak1lbnVIZWxwLnNldE1uZW1vbmljKGdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9oZWxwX3RyaWdnZXIiKSkpOworCQlqTWVudUhlbHAuYWRkKGpNZW51SGVscEFib3V0UmVzb3VyY2VCdW5kbGVNYW5hZ2VyKTsKKworCQlqTWVudUhlbHBBYm91dFJlc291cmNlQnVuZGxlTWFuYWdlci5zZXRWaXNpYmxlKHRydWUpOworCQlqTWVudUhlbHBBYm91dFJlc291cmNlQnVuZGxlTWFuYWdlci5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibWVudV9oZWxwX2Fib3V0IikpOworCQlqTWVudUhlbHBBYm91dFJlc291cmNlQnVuZGxlTWFuYWdlci5zZXRNbmVtb25pYyhnZXRLZXlFdmVudEtleShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oIm1lbnVfaGVscF9hYm91dF90cmlnZ2VyIikpKTsKKwkJak1lbnVIZWxwQWJvdXRSZXNvdXJjZUJ1bmRsZU1hbmFnZXIuc2V0QWNjZWxlcmF0b3IoS2V5U3Ryb2tlLmdldEtleVN0cm9rZSgKKwkJCQlLZXlFdmVudC5WS19ILCBBY3Rpb25FdmVudC5DVFJMX01BU0spKTsKKwkJak1lbnVIZWxwQWJvdXRSZXNvdXJjZUJ1bmRsZU1hbmFnZXIuYWRkQWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOworCX0KKwkKKwlwdWJsaWMgc3RhdGljIGludCBnZXRLZXlFdmVudEtleShTdHJpbmcgY2hhcmFjdGVyKSB7CisJCWlmIChjaGFyYWN0ZXIgPT0gbnVsbCkgcmV0dXJuIEtleUV2ZW50LlZLX0E7CisJCWNoYXJhY3RlciA9IGNoYXJhY3Rlci50b1VwcGVyQ2FzZSgpOworCQorCQlpZiAoY2hhcmFjdGVyLnN0YXJ0c1dpdGgoIkEiKSkgcmV0dXJuIEtleUV2ZW50LlZLX0E7CisJCWVsc2UgaWYgKGNoYXJhY3Rlci5zdGFydHNXaXRoKCJCIikpIHJldHVybiBLZXlFdmVudC5WS19COworCQllbHNlIGlmIChjaGFyYWN0ZXIuc3RhcnRzV2l0aCgiQyIpKSByZXR1cm4gS2V5RXZlbnQuVktfQzsKKwkJZWxzZSBpZiAoY2hhcmFjdGVyLnN0YXJ0c1dpdGgoIkQiKSkgcmV0dXJuIEtleUV2ZW50LlZLX0Q7CisJCWVsc2UgaWYgKGNoYXJhY3Rlci5zdGFydHNXaXRoKCJFIikpIHJldHVybiBLZXlFdmVudC5WS19FOworCQllbHNlIGlmIChjaGFyYWN0ZXIuc3RhcnRzV2l0aCgiRiIpKSByZXR1cm4gS2V5RXZlbnQuVktfRjsKKwkJZWxzZSBpZiAoY2hhcmFjdGVyLnN0YXJ0c1dpdGgoIkciKSkgcmV0dXJuIEtleUV2ZW50LlZLX0c7CisJCWVsc2UgaWYgKGNoYXJhY3Rlci5zdGFydHNXaXRoKCJIIikpIHJldHVybiBLZXlFdmVudC5WS19IOworCQllbHNlIGlmIChjaGFyYWN0ZXIuc3RhcnRzV2l0aCgiSSIpKSByZXR1cm4gS2V5RXZlbnQuVktfSTsKKwkJZWxzZSBpZiAoY2hhcmFjdGVyLnN0YXJ0c1dpdGgoIkoiKSkgcmV0dXJuIEtleUV2ZW50LlZLX0o7CisJCWVsc2UgaWYgKGNoYXJhY3Rlci5zdGFydHNXaXRoKCJLIikpIHJldHVybiBLZXlFdmVudC5WS19LOworCQllbHNlIGlmIChjaGFyYWN0ZXIuc3RhcnRzV2l0aCgiTCIpKSByZXR1cm4gS2V5RXZlbnQuVktfTDsKKwkJZWxzZSBpZiAoY2hhcmFjdGVyLnN0YXJ0c1dpdGgoIk0iKSkgcmV0dXJuIEtleUV2ZW50LlZLX007CisJCWVsc2UgaWYgKGNoYXJhY3Rlci5zdGFydHNXaXRoKCJOIikpIHJldHVybiBLZXlFdmVudC5WS19OOworCQllbHNlIGlmIChjaGFyYWN0ZXIuc3RhcnRzV2l0aCgiTyIpKSByZXR1cm4gS2V5RXZlbnQuVktfTzsKKwkJZWxzZSBpZiAoY2hhcmFjdGVyLnN0YXJ0c1dpdGgoIlAiKSkgcmV0dXJuIEtleUV2ZW50LlZLX1A7CisJCWVsc2UgaWYgKGNoYXJhY3Rlci5zdGFydHNXaXRoKCJRIikpIHJldHVybiBLZXlFdmVudC5WS19ROworCQllbHNlIGlmIChjaGFyYWN0ZXIuc3RhcnRzV2l0aCgiUiIpKSByZXR1cm4gS2V5RXZlbnQuVktfUjsKKwkJZWxzZSBpZiAoY2hhcmFjdGVyLnN0YXJ0c1dpdGgoIlMiKSkgcmV0dXJuIEtleUV2ZW50LlZLX1M7CisJCWVsc2UgaWYgKGNoYXJhY3Rlci5zdGFydHNXaXRoKCJUIikpIHJldHVybiBLZXlFdmVudC5WS19UOworCQllbHNlIGlmIChjaGFyYWN0ZXIuc3RhcnRzV2l0aCgiVSIpKSByZXR1cm4gS2V5RXZlbnQuVktfVTsKKwkJZWxzZSBpZiAoY2hhcmFjdGVyLnN0YXJ0c1dpdGgoIlYiKSkgcmV0dXJuIEtleUV2ZW50LlZLX1Y7CisJCWVsc2UgaWYgKGNoYXJhY3Rlci5zdGFydHNXaXRoKCJXIikpIHJldHVybiBLZXlFdmVudC5WS19XOworCQllbHNlIGlmIChjaGFyYWN0ZXIuc3RhcnRzV2l0aCgiWCIpKSByZXR1cm4gS2V5RXZlbnQuVktfWDsKKwkJZWxzZSBpZiAoY2hhcmFjdGVyLnN0YXJ0c1dpdGgoIlkiKSkgcmV0dXJuIEtleUV2ZW50LlZLX1k7CisJCWVsc2UgaWYgKGNoYXJhY3Rlci5zdGFydHNXaXRoKCJaIikpIHJldHVybiBLZXlFdmVudC5WS19aOworCQllbHNlIGlmIChjaGFyYWN0ZXIuc3RhcnRzV2l0aCgiMCIpKSByZXR1cm4gS2V5RXZlbnQuVktfMDsKKwkJZWxzZSBpZiAoY2hhcmFjdGVyLnN0YXJ0c1dpdGgoIjEiKSkgcmV0dXJuIEtleUV2ZW50LlZLXzE7CisJCWVsc2UgaWYgKGNoYXJhY3Rlci5zdGFydHNXaXRoKCIyIikpIHJldHVybiBLZXlFdmVudC5WS18yOworCQllbHNlIGlmIChjaGFyYWN0ZXIuc3RhcnRzV2l0aCgiMyIpKSByZXR1cm4gS2V5RXZlbnQuVktfMzsKKwkJZWxzZSBpZiAoY2hhcmFjdGVyLnN0YXJ0c1dpdGgoIjQiKSkgcmV0dXJuIEtleUV2ZW50LlZLXzQ7CisJCWVsc2UgaWYgKGNoYXJhY3Rlci5zdGFydHNXaXRoKCI1IikpIHJldHVybiBLZXlFdmVudC5WS181OworCQllbHNlIGlmIChjaGFyYWN0ZXIuc3RhcnRzV2l0aCgiNiIpKSByZXR1cm4gS2V5RXZlbnQuVktfNjsKKwkJZWxzZSBpZiAoY2hhcmFjdGVyLnN0YXJ0c1dpdGgoIjciKSkgcmV0dXJuIEtleUV2ZW50LlZLXzc7CisJCWVsc2UgaWYgKGNoYXJhY3Rlci5zdGFydHNXaXRoKCI4IikpIHJldHVybiBLZXlFdmVudC5WS184OworCQllbHNlIGlmIChjaGFyYWN0ZXIuc3RhcnRzV2l0aCgiOSIpKSByZXR1cm4gS2V5RXZlbnQuVktfOTsKKworCQlyZXR1cm4gS2V5RXZlbnQuVktfQTsKKwl9CisJCit9CmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vZ3VpL1JCUHJvamVjdEl0ZW1QYW5lbC5qYXZhIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2d1aS9SQlByb2plY3RJdGVtUGFuZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDFkZjM1Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2d1aS9SQlByb2plY3RJdGVtUGFuZWwuamF2YQpAQCAtMCwwICsxLDE4MyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDQsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kICAqCisgKiBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitwYWNrYWdlIGNvbS5pYm0ucmJtLmd1aTsKKworaW1wb3J0IGphdmEuYXd0Lio7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuKjsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworCitpbXBvcnQgamF2YXguc3dpbmcuKjsKKworaW1wb3J0IGNvbS5pYm0ucmJtLio7CisKKy8qKgorICovCitjbGFzcyBSQlByb2plY3RJdGVtUGFuZWwgZXh0ZW5kcyBKUGFuZWwgaW1wbGVtZW50cyBBY3Rpb25MaXN0ZW5lciB7CisJUkJNYW5hZ2VyR1VJIGd1aTsKKwkKKwkvLyBWaXN1YWwgQ29tcG9uZW50cworCUJveCBtYWluQm94OworCUpUZXh0RmllbGQgaXRlbUZpZWxkc1tdOworCUpMYWJlbCAgICAgaXRlbUxhYmVsc1tdOworCUpCdXR0b24gICAgY29tbWl0QnV0dG9uc1tdOworCUpCdXR0b24gICAgY29tbWl0QnV0dG9uOworCUpMYWJlbCAgICAgdGl0bGVMYWJlbDsKKwlKTGFiZWwgICAgIGtleUxhYmVsOworCUpMYWJlbCAgICAgY29tbWVudExhYmVsOworCQorCXB1YmxpYyBSQlByb2plY3RJdGVtUGFuZWwoUkJNYW5hZ2VyR1VJIGd1aSkgeworCQlzdXBlcigpOworCQl0aGlzLmd1aSA9IGd1aTsKKwkJaW5pdENvbXBvbmVudHMoKTsKKwl9CisJCisJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2KSB7CisJCUpCdXR0b24gYnV0dG9uID0gKEpCdXR0b24pZXYuZ2V0U291cmNlKCk7CisJCVN0cmluZyBidXR0b25OYW1lID0gYnV0dG9uLmdldE5hbWUoKTsKKwkJaWYgKGJ1dHRvbk5hbWUgPT0gbnVsbCkgeworCQkJLy8gU2F2ZSBhbGwgY29tcG9uZW50cworCQkJUkJNYW5hZ2VyIGJ1bmRsZSA9IGd1aS5nZXRTZWxlY3RlZFByb2plY3RCdW5kbGUoKTsKKwkJCVZlY3RvciBidW5kbGVzID0gYnVuZGxlLmdldEJ1bmRsZXMoKTsKKwkJCWZvciAoaW50IGk9MDsgaSA8IGl0ZW1GaWVsZHMubGVuZ3RoOyBpKyspIHsKKwkJCQlTdHJpbmcgZW5jb2RpbmcgPSBjb21taXRCdXR0b25zW2ldLmdldE5hbWUoKTsKKwkJCQlTdHJpbmcgdHJhbnNsYXRpb24gPSBpdGVtRmllbGRzW2ldLmdldFRleHQoKTsKKwkJCQlTdHJpbmcga2V5ID0gaXRlbUZpZWxkc1tpXS5nZXROYW1lKCk7CisJCQkJZm9yIChpbnQgaj0wOyBqIDwgYnVuZGxlcy5zaXplKCk7IGorKykgeworCQkJCQlCdW5kbGUgcmJ1bmRsZSA9IChCdW5kbGUpYnVuZGxlcy5lbGVtZW50QXQoaik7CisJCQkJCWlmIChyYnVuZGxlLmVuY29kaW5nLmVxdWFscyhlbmNvZGluZykpIHsKKwkJCQkJCUJ1bmRsZUl0ZW0gaXRlbSA9IHJidW5kbGUuZ2V0QnVuZGxlSXRlbShrZXkpOworCQkJCQkJaWYgKGl0ZW0gIT0gbnVsbCkgaXRlbS5zZXRUcmFuc2xhdGlvbih0cmFuc2xhdGlvbik7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWd1aS5zYXZlUmVzb3VyY2VzKGJ1bmRsZSk7CisJCX0gZWxzZSB7CisJCQkvLyBTYXZlIGEgcGFydGljdWxhciBlbmNvZGluZworCQkJU3RyaW5nIGVuY29kaW5nID0gYnV0dG9uTmFtZTsKKwkJCVJCTWFuYWdlciBidW5kbGUgPSBndWkuZ2V0U2VsZWN0ZWRQcm9qZWN0QnVuZGxlKCk7CisJCQlpbnQgaW5kZXggPSAtMTsKKwkJCWZvciAoaW50IGk9MDsgaSA8IGNvbW1pdEJ1dHRvbnMubGVuZ3RoOyBpKyspIHsKKwkJCQlpZiAoY29tbWl0QnV0dG9uc1tpXSA9PSBidXR0b24pIHsKKwkJCQkJaW5kZXggPSBpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlTdHJpbmcgdHJhbnNsYXRpb24gPSBpdGVtRmllbGRzW2luZGV4XS5nZXRUZXh0KCk7CisJCQlTdHJpbmcga2V5ID0gaXRlbUZpZWxkc1tpbmRleF0uZ2V0TmFtZSgpOworCQkJVmVjdG9yIGJ1bmRsZXMgPSBidW5kbGUuZ2V0QnVuZGxlcygpOworCQkJZm9yIChpbnQgaT0wOyBpIDwgYnVuZGxlcy5zaXplKCk7IGkrKykgeworCQkJCUJ1bmRsZSByYnVuZGxlID0gKEJ1bmRsZSlidW5kbGVzLmVsZW1lbnRBdChpKTsKKwkJCQlpZiAocmJ1bmRsZS5lbmNvZGluZy5lcXVhbHMoZW5jb2RpbmcpKSB7CisJCQkJCUJ1bmRsZUl0ZW0gaXRlbSA9IHJidW5kbGUuZ2V0QnVuZGxlSXRlbShrZXkpOworCQkJCQlpZiAoaXRlbSAhPSBudWxsKSB7CisJCQkJCQlpdGVtLnNldFRyYW5zbGF0aW9uKHRyYW5zbGF0aW9uKTsKKwkJCQkJCVJCTWFuYWdlckdVSS5kZWJ1Z01zZygiU2V0IHRyYW5zbGF0aW9uIHRvIDogIiArIHRyYW5zbGF0aW9uKTsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCSAgICBSQk1hbmFnZXJHVUkuZGVidWdNc2coIkl0ZW0gd2FzIG51bGwiKTsKKwkJCQkJYnJlYWs7CisJCQkJfSAKKwkJCQlSQk1hbmFnZXJHVUkuZGVidWdNc2coIkNvbXBhcmVkICIgKyByYnVuZGxlLmVuY29kaW5nICsgIiB3aXRoICIgKyBlbmNvZGluZyk7CisJCQl9CisJCQlndWkuc2F2ZVJlc291cmNlcyhidW5kbGUsIGVuY29kaW5nKTsKKwkJfQorCQl1cGRhdGVDb21wb25lbnRzKCk7CisJfQorCQorCXByaXZhdGUgdm9pZCBpbml0Q29tcG9uZW50cygpIHsKKwkJc2V0TGF5b3V0KG5ldyBCb3JkZXJMYXlvdXQoKSk7CisJCUpQYW5lbCB0b3BQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEdyaWRMYXlvdXQoMiwxKSk7CisJCXRpdGxlTGFiZWwgPSBuZXcgSkxhYmVsKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigicHJvamVjdF9wYW5lbF9kZWZhdWx0X3RpdGxlIiksIFN3aW5nQ29uc3RhbnRzLkNFTlRFUik7CisJCXRpdGxlTGFiZWwuc2V0Rm9udChuZXcgRm9udCgic2VyaWYiLEZvbnQuQk9MRCwxOCkpOworCQlKUGFuZWwgY29tbWVudFBhbmVsID0gbmV3IEpQYW5lbChuZXcgR3JpZExheW91dCgyLDEpKTsKKwkJSkxhYmVsIGNvbW1lbnRMYWJlbDIgPSBuZXcgSkxhYmVsKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigicHJvamVjdF9wYW5lbF9jb21tZW50IiksIFN3aW5nQ29uc3RhbnRzLkxFRlQpOworCQljb21tZW50TGFiZWwgPSBuZXcgSkxhYmVsKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigicHJvamVjdF9wYW5lbF9jb21tZW50X25vbmUiKSwgU3dpbmdDb25zdGFudHMuTEVGVCk7CisJCWNvbW1lbnRQYW5lbC5hZGQoY29tbWVudExhYmVsMik7CisJCWNvbW1lbnRQYW5lbC5hZGQoY29tbWVudExhYmVsKTsKKwkJdG9wUGFuZWwuYWRkKHRpdGxlTGFiZWwpOworCQl0b3BQYW5lbC5hZGQoY29tbWVudFBhbmVsKTsKKwkJSlBhbmVsIGNlbnRlclBhbmVsID0gbmV3IEpQYW5lbChuZXcgQm9yZGVyTGF5b3V0KCkpOworCQltYWluQm94ID0gbmV3IEJveChCb3hMYXlvdXQuWV9BWElTKTsKKwkJSlNjcm9sbFBhbmUgc2Nyb2xsUGFuZSA9IG5ldyBKU2Nyb2xsUGFuZShtYWluQm94LAorCQkJCQkJCQkJCQkJU2Nyb2xsUGFuZUNvbnN0YW50cy5WRVJUSUNBTF9TQ1JPTExCQVJfQVNfTkVFREVELAorCQkJCQkJCQkJCQkJU2Nyb2xsUGFuZUNvbnN0YW50cy5IT1JJWk9OVEFMX1NDUk9MTEJBUl9BU19ORUVERUQpOworCQljZW50ZXJQYW5lbC5hZGQoc2Nyb2xsUGFuZSwgQm9yZGVyTGF5b3V0Lk5PUlRIKTsKKwkJY2VudGVyUGFuZWwuc2V0Qm9yZGVyKEJvcmRlckZhY3RvcnkuY3JlYXRlRXRjaGVkQm9yZGVyKCkpOworCQlKUGFuZWwgYm90UGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBGbG93TGF5b3V0KEZsb3dMYXlvdXQuUklHSFQpKTsKKwkJY29tbWl0QnV0dG9uID0gbmV3IEpCdXR0b24oUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJwcm9qZWN0X3BhbmVsX2NvbW1pdF9idXR0b25fYWxsIikpOworCQljb21taXRCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIodGhpcyk7CisJCWJvdFBhbmVsLmFkZChjb21taXRCdXR0b24pOworCQlhZGQodG9wUGFuZWwsIEJvcmRlckxheW91dC5OT1JUSCk7CisJCWFkZChjZW50ZXJQYW5lbCwgQm9yZGVyTGF5b3V0LkNFTlRFUik7CisJCWFkZChib3RQYW5lbCwgQm9yZGVyTGF5b3V0LlNPVVRIKTsKKwkJCisJCXVwZGF0ZUNvbXBvbmVudHMoKTsKKwl9CisJCisJcHVibGljIHZvaWQgdXBkYXRlQ29tcG9uZW50cygpIHsKKwkJQnVuZGxlSXRlbSBpdGVtID0gZ3VpLmdldFNlbGVjdGVkUHJvamVjdEJ1bmRsZUl0ZW0oKTsKKwkJCisJCWlmIChpdGVtID09IG51bGwpIHsKKwkJCWNvbW1lbnRMYWJlbC5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigicHJvamVjdF9wYW5lbF9jb21tZW50X25vbmUiKSk7CisJCQl0aXRsZUxhYmVsLnNldFRleHQoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJwcm9qZWN0X3BhbmVsX2RlZmF1bHRfdGl0bGUiKSk7CisJCQlpdGVtRmllbGRzID0gbnVsbDsKKwkJCWl0ZW1MYWJlbHMgPSBudWxsOworCQkJY29tbWl0QnV0dG9ucyA9IG51bGw7CisJCQljb21taXRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7CisJCX0gZWxzZSB7CisJCQlTdHJpbmcgY29tbWVudCA9IGl0ZW0uZ2V0Q29tbWVudCgpOworCQkJU3RyaW5nIGtleSA9IGl0ZW0uZ2V0S2V5KCk7CisJCQljb21tZW50TGFiZWwuc2V0VGV4dChjb21tZW50KTsKKwkJCXRpdGxlTGFiZWwuc2V0VGV4dChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInByb2plY3RfcGFuZWxfdGl0bGUiLCBrZXkpKTsKKwkJCQorCQkJUkJNYW5hZ2VyIG1hbmFnZXIgPSBndWkuZ2V0U2VsZWN0ZWRQcm9qZWN0QnVuZGxlKCk7CisJCQlWZWN0b3IgYnVuZGxlcyA9IG1hbmFnZXIuZ2V0QnVuZGxlcygpOworCQkJaXRlbUZpZWxkcyA9IG5ldyBKVGV4dEZpZWxkW2J1bmRsZXMuc2l6ZSgpXTsKKwkJCWl0ZW1MYWJlbHMgPSBuZXcgSkxhYmVsW2J1bmRsZXMuc2l6ZSgpXTsKKwkJCWNvbW1pdEJ1dHRvbnMgPSBuZXcgSkJ1dHRvbltidW5kbGVzLnNpemUoKV07CisJCQlmb3IgKGludCBpPTA7IGkgPCBidW5kbGVzLnNpemUoKTsgaSsrKSB7CisJCQkJQnVuZGxlIGJ1bmRsZSA9IChCdW5kbGUpYnVuZGxlcy5lbGVtZW50QXQoaSk7CisJCQkJQnVuZGxlSXRlbSBidW5kbGVJdGVtID0gYnVuZGxlLmdldEJ1bmRsZUl0ZW0oa2V5KTsKKwkJCQkvL2Jvb2xlYW4gdHJhbnNsYXRlZCA9IGJ1bmRsZUl0ZW0uaXNUcmFuc2xhdGVkKCk7CisJCQkJSkxhYmVsIGVuY29kaW5nTGFiZWwgPSBuZXcgSkxhYmVsKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigicHJvamVjdF9wYW5lbF9idW5kbGUiLCBidW5kbGUudG9TdHJpbmcoKSksCisJCQkJCQkJCQkJCQkgIFN3aW5nQ29uc3RhbnRzLkxFRlQpOworCQkJCWlmIChidW5kbGVJdGVtID09IG51bGwgfHwgIWJ1bmRsZUl0ZW0uaXNUcmFuc2xhdGVkKCkpIHsKKwkJCQkgICAgZW5jb2RpbmdMYWJlbC5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigicHJvamVjdF9wYW5lbF9idW5kbGVfdW50cmFuc2xhdGVkIiwKKwkJCQkJCQkJCQkJCQkJCQkJYnVuZGxlLnRvU3RyaW5nKCkpKTsKKwkJCQl9CisJCQkJU3RyaW5nIGZpZWxkVGV4dCA9IChidW5kbGVJdGVtID09IG51bGwgPyBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInByb2plY3RfcGFuZWxfaXRlbV9pbmhlcml0cyIpIDoKKwkJCQkJCQkJCQkJCQkJIGJ1bmRsZUl0ZW0uZ2V0VHJhbnNsYXRpb24oKSk7CisJCQkJSlRleHRGaWVsZCBpdGVtRmllbGQgPSBuZXcgSlRleHRGaWVsZChmaWVsZFRleHQpOworCQkJCWl0ZW1GaWVsZC5zZXRNYXhpbXVtU2l6ZShuZXcgRGltZW5zaW9uKHRoaXMuZ2V0U2l6ZSgpLndpZHRoLTE1MCwgMjAwKSk7CisJCQkJaXRlbUZpZWxkLnNldE5hbWUoa2V5KTsKKwkJCQlKQnV0dG9uIGNvbW1pdEl0ZW1CdXR0b24gPSBuZXcgSkJ1dHRvbihSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInByb2plY3RfcGFuZWxfY29tbWl0X2J1dHRvbiIpKTsKKwkJCQljb21taXRJdGVtQnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKHRoaXMpOworCQkJCWNvbW1pdEl0ZW1CdXR0b24uc2V0TmFtZShidW5kbGUuZW5jb2RpbmcpOworCQkJCWl0ZW1GaWVsZHNbaV0gPSBpdGVtRmllbGQ7CisJCQkJaXRlbUxhYmVsc1tpXSA9IGVuY29kaW5nTGFiZWw7CisJCQkJY29tbWl0QnV0dG9uc1tpXSA9IGNvbW1pdEl0ZW1CdXR0b247CisJCQl9CisJCQljb21taXRCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKKwkJfQorCQkKKwkJbWFpbkJveC5yZW1vdmVBbGwoKTsKKwkJaWYgKGl0ZW1GaWVsZHMgIT0gbnVsbCkgeworCQkJZm9yIChpbnQgaT0wOyBpIDwgaXRlbUZpZWxkcy5sZW5ndGg7IGkrKykgeworCQkJCUpQYW5lbCBidW5kbGVQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEJvcmRlckxheW91dCgpKTsKKwkJCQlidW5kbGVQYW5lbC5zZXRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVMaW5lQm9yZGVyKENvbG9yLmRhcmtHcmF5KSk7CisJCQkJYnVuZGxlUGFuZWwuYWRkKGl0ZW1MYWJlbHNbaV0sIEJvcmRlckxheW91dC5OT1JUSCk7CisJCQkJYnVuZGxlUGFuZWwuYWRkKGl0ZW1GaWVsZHNbaV0sIEJvcmRlckxheW91dC5DRU5URVIpOworCQkJCWJ1bmRsZVBhbmVsLmFkZChjb21taXRCdXR0b25zW2ldLCBCb3JkZXJMYXlvdXQuRUFTVCk7CisJCQkJbWFpbkJveC5hZGQoYnVuZGxlUGFuZWwpOworCQkJfQorCQl9CisJCQorCQlyZXZhbGlkYXRlKCk7CisJfQorfQorCmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vZ3VpL1JCU2VhcmNoUGFuZWwuamF2YSBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9ndWkvUkJTZWFyY2hQYW5lbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjN2ZkNTAKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZ3VpL1JCU2VhcmNoUGFuZWwuamF2YQpAQCAtMCwwICsxLDMzOSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDcsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kICAqCisgKiBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitwYWNrYWdlIGNvbS5pYm0ucmJtLmd1aTsKKworaW1wb3J0IGphdmEuYXd0Lio7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuKjsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKworaW1wb3J0IGphdmF4LnN3aW5nLio7CitpbXBvcnQgamF2YXguc3dpbmcudGFibGUuKjsKKworaW1wb3J0IGNvbS5pYm0ucmJtLio7CisKKy8qKgorICogVGhlIGNsYXNzIHVzZWQgdG8gZGlzcGxheSB1bnRyYW5zbGF0ZWQgaXRlbXMKKyAqLworY2xhc3MgUkJTZWFyY2hQYW5lbCBleHRlbmRzIEpQYW5lbCB7CisJUkJNYW5hZ2VyIHJibTsKKwlCdW5kbGUgYnVuZGxlOworCVJCTWFuYWdlckdVSSBsaXN0ZW5lcjsKKwkKKwkvLyBDb21wb25lbnRzCisJSkxhYmVsIHRpdGxlTGFiZWwgICAgICAgPSBuZXcgSkxhYmVsKCk7CisJSkxhYmVsIGZpbmRMYWJlbCAgICAgICAgPSBuZXcgSkxhYmVsKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigic2VhcmNoX2ZpbmQiKSk7CisJSkxhYmVsIHJlcGxhY2VMYWJlbCAgICAgPSBuZXcgSkxhYmVsKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigic2VhcmNoX3JlcGxhY2UiKSk7CisJCisJSlRleHRGaWVsZCBmaW5kRmllbGQgICAgPSBuZXcgSlRleHRGaWVsZCgpOworCUpUZXh0RmllbGQgcmVwbGFjZUZpZWxkID0gbmV3IEpUZXh0RmllbGQoKTsKKwkKKwlKQ2hlY2tCb3gga2V5c0NoZWNrICAgICA9IG5ldyBKQ2hlY2tCb3goUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJzZWFyY2hfa2V5cyIpLCBmYWxzZSk7CisJSkNoZWNrQm94IHRyYW5zQ2hlY2sgICAgPSBuZXcgSkNoZWNrQm94KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigic2VhcmNoX3ZhbHVlcyIpLCB0cnVlKTsKKwlKQ2hlY2tCb3ggY29tbWVudHNDaGVjayA9IG5ldyBKQ2hlY2tCb3goUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJzZWFyY2hfY29tbWVudHMiKSwgZmFsc2UpOworCUpDaGVja0JveCBjYXNlQ2hlY2sgICAgID0gbmV3IEpDaGVja0JveChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInNlYXJjaF9jYXNlX3NlbnNpdGl2ZSIpLCBmYWxzZSk7CisJCisJSkJ1dHRvbiBmaW5kQnV0dG9uICAgICAgPSBuZXcgSkJ1dHRvbihSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImJ1dHRvbl9zZWFyY2hfZmluZF9hbGwiKSk7CisJSkJ1dHRvbiByZXBsYWNlQnV0dG9uICAgPSBuZXcgSkJ1dHRvbihSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImJ1dHRvbl9zZWFyY2hfcmVwbGFjZV9hbGwiKSk7CisJCisJU2VhcmNoSXRlbXNUYWJsZU1vZGVsICAgICBtb2RlbDsKKwlKVGFibGUgICAgICAgICAgICAgICAgICAgIHRhYmxlOworCUpTY3JvbGxQYW5lICAgICAgICAgICAgICAgdGFibGVTY3JvbGw7CisJCisJcHVibGljIFJCU2VhcmNoUGFuZWwoUkJNYW5hZ2VyR1VJIGd1aSkgeworCQlzdXBlcigpOworCQlsaXN0ZW5lciA9IGd1aTsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0QnVuZGxlKEJ1bmRsZSBiKSB7CisJCXJibSA9IG51bGw7CisJCWlmIChidW5kbGUgPT0gbnVsbCkgeworCQkJYnVuZGxlID0gYjsKKwkJCWluaXRDb21wb25lbnRzKCk7CisJCX0gZWxzZSBpZiAoYnVuZGxlICE9IGIpIHsKKwkJCWJ1bmRsZSA9IGI7CisJCQl1cGRhdGVDb21wb25lbnRzKCk7CisJCX0KKwl9CisJCisJcHVibGljIHZvaWQgc2V0TWFuYWdlcihSQk1hbmFnZXIgbSkgeworCQlidW5kbGUgPSBudWxsOworCQlpZiAocmJtID09IG51bGwpIHsKKwkJCXJibSA9IG07CisJCQlpbml0Q29tcG9uZW50cygpOworCQl9IGVsc2UgaWYgKHJibSAhPSBtKSB7CisJCQlyYm0gPSBtOworCQkJdXBkYXRlQ29tcG9uZW50cygpOworCQl9CisJfQorCQorCXB1YmxpYyB2b2lkIHJlbW92ZUVsZW1lbnRzKCkgeworCQlpZiAocmJtICE9IG51bGwgfHwgYnVuZGxlICE9IG51bGwpIHsKKwkJCXJibSA9IG51bGw7CisJCQlidW5kbGUgPSBudWxsOworCQkJaW5pdENvbXBvbmVudHMoKTsKKwkJfQorCX0KKwkKKwlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtU2VhcmNoKCkgeworCQlTdHJpbmcgc2VhcmNoX3Rlcm0gPSBmaW5kRmllbGQuZ2V0VGV4dCgpLnRyaW0oKTsKKwkJaWYgKHNlYXJjaF90ZXJtLmxlbmd0aCgpIDwgMSkgcmV0dXJuOworCQlpZiAoYnVuZGxlICE9IG51bGwpIHsKKwkJCXBlcmZvcm1TZWFyY2goc2VhcmNoX3Rlcm0sIGJ1bmRsZSwgY2FzZUNoZWNrLmlzU2VsZWN0ZWQoKSk7CisJCX0gZWxzZSBpZiAocmJtICE9IG51bGwpIHsKKwkJCXBlcmZvcm1TZWFyY2goc2VhcmNoX3Rlcm0sIChCdW5kbGUpcmJtLmdldEJ1bmRsZXMoKS5lbGVtZW50QXQoMCksIGNhc2VDaGVjay5pc1NlbGVjdGVkKCkpOworCQl9CisJfQorCQorCXByaXZhdGUgdm9pZCBwZXJmb3JtU2VhcmNoKFN0cmluZyB0ZXJtLCBCdW5kbGUgYnVuZGxlLCBib29sZWFuIGNhc2Vfc2Vuc2l0aXZlKSB7CisJCVZlY3RvciByZXRfdiA9IG5ldyBWZWN0b3IoKTsKKwkJRW51bWVyYXRpb24ga2V5cyA9IGJ1bmRsZS5hbGxJdGVtcy5rZXlzKCk7CisJCXdoaWxlIChrZXlzLmhhc01vcmVFbGVtZW50cygpKSB7CisJCQlTdHJpbmcga2V5ID0gKFN0cmluZylrZXlzLm5leHRFbGVtZW50KCk7CisJCQlCdW5kbGVJdGVtIGl0ZW0gPSAoQnVuZGxlSXRlbSlidW5kbGUuYWxsSXRlbXMuZ2V0KGtleSk7CisJCQlpZiAoY2FzZV9zZW5zaXRpdmUpIHsKKwkJCQlpZiAoa2V5c0NoZWNrLmlzU2VsZWN0ZWQoKSAmJiBrZXkuaW5kZXhPZih0ZXJtKSA+PSAwKSB7CisJCQkJCXJldF92LmFkZEVsZW1lbnQoaXRlbSk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0gLy8gZW5kIGlmIC0ga2V5cworCQkJCWlmICh0cmFuc0NoZWNrLmlzU2VsZWN0ZWQoKSAmJiBpdGVtLmdldFRyYW5zbGF0aW9uKCkuaW5kZXhPZih0ZXJtKSA+PSAwKSB7CisJCQkJCXJldF92LmFkZEVsZW1lbnQoaXRlbSk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0gLy8gZW5kIGlmIC0gdHJhbnNsYXRpb25zCisJCQkJaWYgKGNvbW1lbnRzQ2hlY2suaXNTZWxlY3RlZCgpKSB7CisJCQkJCWlmIChpdGVtLmdldENvbW1lbnQoKS5pbmRleE9mKHRlcm0pID49IDApIHsKKwkJCQkJCXJldF92LmFkZEVsZW1lbnQoaXRlbSk7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCQlIYXNodGFibGUgbG9va3VwcyA9IGl0ZW0uZ2V0TG9va3VwcygpOworCQkJCQlFbnVtZXJhdGlvbiBlbnVtMiA9IGxvb2t1cHMua2V5cygpOworCQkJCQl3aGlsZSAoZW51bTIuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKwkJCQkJCVN0cmluZyBsb29rdXBfa2V5ID0gKFN0cmluZyllbnVtMi5uZXh0RWxlbWVudCgpOworCQkJCQkJU3RyaW5nIGxvb2t1cF92YWx1ZSA9IChTdHJpbmcpbG9va3Vwcy5nZXQobG9va3VwX2tleSk7CisJCQkJCQlpZiAobG9va3VwX3ZhbHVlLmluZGV4T2YodGVybSkgPj0gMCkgeworCQkJCQkJCXJldF92LmFkZEVsZW1lbnQoaXRlbSk7CisJCQkJCQkJY29udGludWU7CisJCQkJCQl9CisJCQkJCX0gLy8gZW5kIHdoaWxlCisJCQkJfSAvLyBlbmQgaWYgLSBjb21tZW50cworCQkJfSBlbHNlIHsKKwkJCQkvLyBOb3QgY2FzZSBzZW5zaXRpdmUJCisJCQkJaWYgKGtleXNDaGVjay5pc1NlbGVjdGVkKCkgJiYga2V5LnRvVXBwZXJDYXNlKCkuaW5kZXhPZih0ZXJtLnRvVXBwZXJDYXNlKCkpID49IDApIHsKKwkJCQkJcmV0X3YuYWRkRWxlbWVudChpdGVtKTsKKwkJCQkJY29udGludWU7CisJCQkJfSAvLyBlbmQgaWYgLSBrZXlzCisJCQkJaWYgKHRyYW5zQ2hlY2suaXNTZWxlY3RlZCgpICYmIGl0ZW0uZ2V0VHJhbnNsYXRpb24oKS50b1VwcGVyQ2FzZSgpLmluZGV4T2YodGVybS50b1VwcGVyQ2FzZSgpKSA+PSAwKSB7CisJCQkJCXJldF92LmFkZEVsZW1lbnQoaXRlbSk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0gLy8gZW5kIGlmIC0gdHJhbnNsYXRpb25zCisJCQkJaWYgKGNvbW1lbnRzQ2hlY2suaXNTZWxlY3RlZCgpKSB7CisJCQkJCWlmIChpdGVtLmdldENvbW1lbnQoKS50b1VwcGVyQ2FzZSgpLmluZGV4T2YodGVybS50b1VwcGVyQ2FzZSgpKSA+PSAwKSB7CisJCQkJCQlyZXRfdi5hZGRFbGVtZW50KGl0ZW0pOworCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQkJSGFzaHRhYmxlIGxvb2t1cHMgPSBpdGVtLmdldExvb2t1cHMoKTsKKwkJCQkJRW51bWVyYXRpb24gZW51bTIgPSBsb29rdXBzLmtleXMoKTsKKwkJCQkJd2hpbGUgKGVudW0yLmhhc01vcmVFbGVtZW50cygpKSB7CisJCQkJCQlTdHJpbmcgbG9va3VwX2tleSA9IChTdHJpbmcpZW51bTIubmV4dEVsZW1lbnQoKTsKKwkJCQkJCVN0cmluZyBsb29rdXBfdmFsdWUgPSAoU3RyaW5nKWxvb2t1cHMuZ2V0KGxvb2t1cF9rZXkpOworCQkJCQkJaWYgKGxvb2t1cF92YWx1ZS50b1VwcGVyQ2FzZSgpLmluZGV4T2YodGVybS50b1VwcGVyQ2FzZSgpKSA+PSAwKSB7CisJCQkJCQkJcmV0X3YuYWRkRWxlbWVudChpdGVtKTsKKwkJCQkJCQljb250aW51ZTsKKwkJCQkJCX0KKwkJCQkJfSAvLyBlbmQgd2hpbGUKKwkJCQl9IC8vIGVuZCBpZiAtIGNvbW1lbnRzCisJCQl9CisJCX0gLy8gZW5kIHdoaWxlCisJCW1vZGVsLnNldEl0ZW1zKHJldF92KTsKKwkJbW9kZWwudXBkYXRlKCk7CisJfQorCQorCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1SZXBsYWNlKCkgeworCQlTdHJpbmcgc2VhcmNoX3Rlcm0gPSBmaW5kRmllbGQuZ2V0VGV4dCgpLnRyaW0oKTsKKwkJU3RyaW5nIHJlcGxhY2VfdGVybSA9IHJlcGxhY2VGaWVsZC5nZXRUZXh0KCkudHJpbSgpOworCQlwZXJmb3JtU2VhcmNoKCk7CisJCWlmIChzZWFyY2hfdGVybS5sZW5ndGgoKSA8IDEgfHwgcmVwbGFjZV90ZXJtLmxlbmd0aCgpIDwgMSkgcmV0dXJuOworCQlpZiAoa2V5c0NoZWNrLmlzU2VsZWN0ZWQoKSkgeworCQkJSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2codGhpcywKKwkJCQlSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImVycm9yX25vX2tleV9yZXBsYWNlIiksCisJCQkJUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJ3YXJuaW5nIiksIEpPcHRpb25QYW5lLldBUk5JTkdfTUVTU0FHRSk7CisJCX0KKwkJVmVjdG9yIGl0ZW1zID0gbW9kZWwuZ2V0QnVuZGxlSXRlbXMoKTsKKwkJZm9yIChpbnQgaT0wOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspIHsKKwkJCUJ1bmRsZUl0ZW0gaXRlbSA9IChCdW5kbGVJdGVtKWl0ZW1zLmVsZW1lbnRBdChpKTsKKwkJCWlmICh0cmFuc0NoZWNrLmlzU2VsZWN0ZWQoKSkgeworCQkJCWl0ZW0uc2V0VHJhbnNsYXRpb24ocmVwbGFjZShpdGVtLmdldFRyYW5zbGF0aW9uKCksIHNlYXJjaF90ZXJtLCByZXBsYWNlX3Rlcm0pKTsKKwkJCX0KKwkJCWlmIChjb21tZW50c0NoZWNrLmlzU2VsZWN0ZWQoKSkgeworCQkJCWl0ZW0uc2V0Q29tbWVudChyZXBsYWNlKGl0ZW0uZ2V0Q29tbWVudCgpLCBzZWFyY2hfdGVybSwgcmVwbGFjZV90ZXJtKSk7CisJCQl9CisJCX0KKwkJbW9kZWwudXBkYXRlKCk7CisJfQorCQorCS8vIFJlcGxhY2VzIGFsbCBpbnN0YW5jZXMgb2YgbWF0Y2ggaW4gb3JpZ2luYWwgd2l0aCByZXBsYWNlCisJCisJcHJpdmF0ZSBTdHJpbmcgcmVwbGFjZShTdHJpbmcgb3JpZ2luYWwsIFN0cmluZyBtYXRjaCwgU3RyaW5nIHJlcGxhY2UpIHsKKwkJaW50IGN1cnJlbnRfaW5kZXggPSAtMTsKKwkJd2hpbGUgKG9yaWdpbmFsLmluZGV4T2YobWF0Y2gsKytjdXJyZW50X2luZGV4KSA+PSAwKSB7CisJCQljdXJyZW50X2luZGV4ID0gb3JpZ2luYWwuaW5kZXhPZihtYXRjaCwgY3VycmVudF9pbmRleCk7CisJCQlvcmlnaW5hbCA9IG9yaWdpbmFsLnN1YnN0cmluZygwLGN1cnJlbnRfaW5kZXgpICsgcmVwbGFjZSArCisJCQkJCSAgIG9yaWdpbmFsLnN1YnN0cmluZyhjdXJyZW50X2luZGV4K21hdGNoLmxlbmd0aCgpLCBvcmlnaW5hbC5sZW5ndGgoKSk7CisJCX0KKwkJcmV0dXJuIG9yaWdpbmFsOworCX0KKwkKKwlwdWJsaWMgdm9pZCBpbml0Q29tcG9uZW50cygpIHsKKwkJLy8gSW5pdGlhbGl6ZSBjb21wb25lbnRzCisJCWlmIChidW5kbGUgIT0gbnVsbCkgeworCQkJdGl0bGVMYWJlbC5zZXRUZXh0KGJ1bmRsZS5uYW1lKTsKKwkJfQorCQllbHNlIGlmIChyYm0gIT0gbnVsbCkgeworCQkJdGl0bGVMYWJlbC5zZXRUZXh0KHJibS5nZXRCYXNlQ2xhc3MoKSArICIgLSAiICsgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJzZWFyY2giKSk7CisJCX0KKwkJbW9kZWwgPSBuZXcgU2VhcmNoSXRlbXNUYWJsZU1vZGVsKG5ldyBWZWN0b3IoKSk7CisJCQorCQl0aXRsZUxhYmVsLnNldEZvbnQobmV3IEZvbnQoIlNhbnNTZXJpZiIsRm9udC5QTEFJTiwxOCkpOworCQkKKwkJcmVtb3ZlQWxsKCk7CisJCXNldExheW91dChuZXcgQm9yZGVyTGF5b3V0KCkpOworCQl0YWJsZSA9IG5ldyBKVGFibGUobW9kZWwpOworCQl0YWJsZVNjcm9sbCA9IG5ldyBKU2Nyb2xsUGFuZSh0YWJsZSk7CisJCQorCQl0YWJsZS5zZXRTZWxlY3Rpb25Nb2RlKExpc3RTZWxlY3Rpb25Nb2RlbC5TSU5HTEVfSU5URVJWQUxfU0VMRUNUSU9OKTsKKwkJdGFibGUuYWRkTW91c2VMaXN0ZW5lcihsaXN0ZW5lcik7CisJCQorCQlEaW1lbnNpb24gZGltID0gbmV3IERpbWVuc2lvbig3NSwxNSk7CisJCQorCQlmaW5kRmllbGQuc2V0Q29sdW1ucygyMCk7CisJCXJlcGxhY2VGaWVsZC5zZXRDb2x1bW5zKDIwKTsKKwkJZmluZExhYmVsLnNldFByZWZlcnJlZFNpemUoZGltKTsKKwkJcmVwbGFjZUxhYmVsLnNldFByZWZlcnJlZFNpemUoZGltKTsKKwkJCisJCUpQYW5lbCBpbm5lclBhbmVsID0gbmV3IEpQYW5lbChuZXcgQm9yZGVyTGF5b3V0KCkpOworCQlKUGFuZWwgc291dGhQYW5lbCA9IG5ldyBKUGFuZWwoKTsKKwkJSlBhbmVsIHdlc3RQYW5lbDEgPSBuZXcgSlBhbmVsKG5ldyBGbG93TGF5b3V0KEZsb3dMYXlvdXQuTEVGVCkpOworCQlKUGFuZWwgd2VzdFBhbmVsMiA9IG5ldyBKUGFuZWwobmV3IEZsb3dMYXlvdXQoRmxvd0xheW91dC5MRUZUKSk7CisJCUJveCByaWdodEJveCA9IG5ldyBCb3goQm94TGF5b3V0LllfQVhJUyk7CisJCUJveCBsZWZ0Qm94ID0gbmV3IEJveChCb3hMYXlvdXQuWV9BWElTKTsKKwkJCisJCS8vIEFkZCBhY3Rpb24gbGlzdGVuZXJzCisJCWZpbmRCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCl7CisJCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXYpIHsKKwkJCQlwZXJmb3JtU2VhcmNoKCk7CisJCQl9CisJCX0pOworCQkKKwkJcmVwbGFjZUJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKXsKKwkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldikgeworCQkJCXBlcmZvcm1SZXBsYWNlKCk7CisJCQl9CisJCX0pOworCQkKKwkJZmluZEJ1dHRvbi5zZXRNbmVtb25pYyhSQk1hbmFnZXJNZW51QmFyLmdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiYnV0dG9uX3NlYXJjaF9maW5kX2FsbF90cmlnZ2VyIikpKTsKKwkJcmVwbGFjZUJ1dHRvbi5zZXRNbmVtb25pYyhSQk1hbmFnZXJNZW51QmFyLmdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiYnV0dG9uX3NlYXJjaF9yZXBsYWNlX2FsbF90cmlnZ2VyIikpKTsKKwkJCisJCS8vIFBsYWNlIGNvbXBvbmVudHMKKwkJd2VzdFBhbmVsMS5hZGQoZmluZExhYmVsKTsKKwkJd2VzdFBhbmVsMS5hZGQoQm94LmNyZWF0ZUhvcml6b250YWxTdHJ1dCg1KSk7CisJCXdlc3RQYW5lbDEuYWRkKGZpbmRGaWVsZCk7CisJCQorCQl3ZXN0UGFuZWwyLmFkZChyZXBsYWNlTGFiZWwpOworCQl3ZXN0UGFuZWwyLmFkZChCb3guY3JlYXRlSG9yaXpvbnRhbFN0cnV0KDUpKTsKKwkJd2VzdFBhbmVsMi5hZGQocmVwbGFjZUZpZWxkKTsKKwkJCisJCWxlZnRCb3guYWRkKEJveC5jcmVhdGVWZXJ0aWNhbEdsdWUoKSk7CisJCWxlZnRCb3guYWRkKHdlc3RQYW5lbDEpOworCQlsZWZ0Qm94LmFkZCh3ZXN0UGFuZWwyKTsKKwkJLy9sZWZ0Qm94LmFkZChjYXNlQ2hlY2spOworCQkKKwkJcmlnaHRCb3guYWRkKGtleXNDaGVjayk7CisJCXJpZ2h0Qm94LmFkZCh0cmFuc0NoZWNrKTsKKwkJcmlnaHRCb3guYWRkKGNvbW1lbnRzQ2hlY2spOworCQkKKwkJc291dGhQYW5lbC5hZGQoZmluZEJ1dHRvbik7CisJCXNvdXRoUGFuZWwuYWRkKEJveC5jcmVhdGVIb3Jpem9udGFsU3RydXQoNSkpOworCQlzb3V0aFBhbmVsLmFkZChyZXBsYWNlQnV0dG9uKTsKKwkJc291dGhQYW5lbC5hZGQoQm94LmNyZWF0ZUhvcml6b250YWxTdHJ1dCgxMCkpOworCQlzb3V0aFBhbmVsLmFkZChjYXNlQ2hlY2spOworCQkKKwkJaW5uZXJQYW5lbC5hZGQodGl0bGVMYWJlbCwgQm9yZGVyTGF5b3V0Lk5PUlRIKTsKKwkJaW5uZXJQYW5lbC5hZGQobGVmdEJveCwgQm9yZGVyTGF5b3V0LkNFTlRFUik7CisJCWlubmVyUGFuZWwuYWRkKHJpZ2h0Qm94LCBCb3JkZXJMYXlvdXQuRUFTVCk7CisJCWlubmVyUGFuZWwuYWRkKHNvdXRoUGFuZWwsIEJvcmRlckxheW91dC5TT1VUSCk7CisJCQorCQlhZGQoaW5uZXJQYW5lbCwgQm9yZGVyTGF5b3V0Lk5PUlRIKTsKKwkJYWRkKHRhYmxlU2Nyb2xsLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKKwkKKwkJaWYgKHJibSA9PSBudWxsICYmIGJ1bmRsZSA9PSBudWxsKSB7CisJCQlyZW1vdmVBbGwoKTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgdm9pZCB1cGRhdGVDb21wb25lbnRzKCkgeworCQkKKwl9Cit9CisKKy8vIFRoZSB0YWJsZSBtb2RlbCBmb3Igc2VhcmNoZWQgSXRlbXMKKworY2xhc3MgU2VhcmNoSXRlbXNUYWJsZU1vZGVsIGV4dGVuZHMgQWJzdHJhY3RUYWJsZU1vZGVsIHsKKwlWZWN0b3IgaXRlbXM7CisJCisJcHVibGljIFNlYXJjaEl0ZW1zVGFibGVNb2RlbChWZWN0b3IgaXRlbXMpIHsKKwkJdGhpcy5pdGVtcyA9IGl0ZW1zOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRJdGVtcyhWZWN0b3IgaXRlbXMpIHsKKwkJdGhpcy5pdGVtcyA9IGl0ZW1zOworCX0KKwkKKwlwdWJsaWMgaW50IGdldENvbHVtbkNvdW50KCkgeyByZXR1cm4gMzsgfQorCQkgICAgCisJcHVibGljIGludCBnZXRSb3dDb3VudCgpIHsKKwkJcmV0dXJuIGl0ZW1zLnNpemUoKTsKKwl9CisJCisJcHVibGljIE9iamVjdCBnZXRWYWx1ZUF0KGludCByb3csIGludCBjb2wpIHsKKwkJQnVuZGxlSXRlbSBpdGVtID0gKEJ1bmRsZUl0ZW0paXRlbXMuZWxlbWVudEF0KHJvdyk7CisJCVN0cmluZyByZXRTdHIgPSBudWxsOworCQkJCQorCQlzd2l0Y2goY29sKSB7CisJCWNhc2UgMDoKKwkJCXJldFN0ciA9IGl0ZW0uZ2V0S2V5KCk7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJcmV0U3RyID0gaXRlbS5nZXRUcmFuc2xhdGlvbigpOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCXJldFN0ciA9IChpdGVtLmdldFBhcmVudEdyb3VwKCkgPT0gbnVsbCA/ICIiIDogaXRlbS5nZXRQYXJlbnRHcm91cCgpLmdldE5hbWUoKSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldFN0ciA9IFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigidGFibGVfY2VsbF9lcnJvciIpOworCQl9CisJCQkJCisJCXJldHVybiByZXRTdHI7CisJfQorCQkJCisJcHVibGljIFN0cmluZyBnZXRDb2x1bW5OYW1lKGludCBjb2wpIHsKKwkJaWYgKGNvbCA9PSAwKSByZXR1cm4gUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJsYW5ndWFnZXVudHJhbnNfY29sdW1uX2tleSIpOworCQllbHNlIGlmIChjb2wgPT0gMSkgcmV0dXJuIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibGFuZ3VhZ2V1bnRyYW5zX2NvbHVtbl90cmFuc2xhdGlvbiIpOworCQllbHNlIGlmIChjb2wgPT0gMikgcmV0dXJuIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibGFuZ3VhZ2V1bnRyYW5zX2NvbHVtbl9ncm91cCIpOworCQllbHNlIHJldHVybiBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInRhYmxlX2NvbHVtbl9lcnJvciIpOworCX0KKwkKKwlwdWJsaWMgQnVuZGxlSXRlbSBnZXRCdW5kbGVJdGVtKGludCByb3cpIHsKKwkJcmV0dXJuIChCdW5kbGVJdGVtKWl0ZW1zLmVsZW1lbnRBdChyb3cpOworCX0KKwkKKwlwdWJsaWMgVmVjdG9yIGdldEJ1bmRsZUl0ZW1zKCkgeworCQlyZXR1cm4gaXRlbXM7CisJfQorCQorCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKKwkJZmlyZVRhYmxlRGF0YUNoYW5nZWQoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vZ3VpL1JCU3RhdGlzdGljc1BhbmVsLmphdmEgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZ3VpL1JCU3RhdGlzdGljc1BhbmVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFjOGUzMwotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9ndWkvUkJTdGF0aXN0aWNzUGFuZWwuamF2YQpAQCAtMCwwICsxLDM5MSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDQsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kICAqCisgKiBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitwYWNrYWdlIGNvbS5pYm0ucmJtLmd1aTsKKworaW1wb3J0IGphdmEuYXd0Lio7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuKjsKKworaW1wb3J0IGphdmF4LnN3aW5nLio7CitpbXBvcnQgamF2YXguc3dpbmcudGV4dC5KVGV4dENvbXBvbmVudDsKKworaW1wb3J0IGNvbS5pYm0ucmJtLio7CisKKy8qKgorICogVGhlIGNsYXNzIHVzZWQgdG8gZGlzcGxheSBzdGF0aXN0aWNzCisgKi8KK2NsYXNzIFJCU3RhdGlzdGljc1BhbmVsIGV4dGVuZHMgSlBhbmVsIHsKKwlSQk1hbmFnZXIgcmJtOworCUJ1bmRsZSBidW5kbGU7CisJCisJLy8gQ29tcG9uZW50cyAtIEJ1bmRsZQorCUpMYWJlbCAgICAgakxhYmVsU3RhdHNUaXRsZTsKKwkJCisJSkxhYmVsICAgICBqTGFiZWxTdGF0c05hbWU7CisJSkxhYmVsICAgICBqTGFiZWxTdGF0c0NvbW1lbnQ7CisJSkxhYmVsICAgICBqTGFiZWxTdGF0c01hbmFnZXI7CisJSkxhYmVsICAgICBqTGFiZWxTdGF0c0xhbmd1YWdlOworCUpMYWJlbCAgICAgakxhYmVsU3RhdHNDb3VudHJ5OworCUpMYWJlbCAgICAgakxhYmVsU3RhdHNWYXJpYW50OworCUpMYWJlbCAgICAgakxhYmVsU3RhdHNOdW1UcmFuczsKKwlKTGFiZWwgICAgIGpMYWJlbFN0YXRzTnVtVW50cmFuczsKKwkJCisJSlRleHRGaWVsZCBqVGV4dEZpZWxkU3RhdHNOYW1lOworCUpUZXh0RmllbGQgalRleHRGaWVsZFN0YXRzQ29tbWVudDsKKwlKVGV4dEZpZWxkIGpUZXh0RmllbGRTdGF0c01hbmFnZXI7CisJSlRleHRGaWVsZCBqVGV4dEZpZWxkU3RhdHNMYW5ndWFnZTsKKwlKVGV4dEZpZWxkIGpUZXh0RmllbGRTdGF0c0NvdW50cnk7CisJSlRleHRGaWVsZCBqVGV4dEZpZWxkU3RhdHNWYXJpYW50OworCQorCUpCdXR0b24gICAgdXBkYXRlQnV0dG9uOworCQorCUJveCAgICAgICAgYm94U3RhdHNMZWZ0UmlnaHQxOworCUJveCAgICAgICAgYm94U3RhdHNMZWZ0UmlnaHQyOworCQorCS8vIENvbXBvbmVudHMgLSBidW5kbGUgbWFuYWdlcgorCUpMYWJlbCAgICAgIHRpdGxlTGFiZWw7CisJSkxhYmVsICAgICAgbnVtRmlsZUxhYmVsOworCUpMYWJlbCAgICAgIG51bUR1cExhYmVsOworCUpMYWJlbCAgICAgIG51bUdyb3VwTGFiZWw7CisJSkxhYmVsICAgICAgbnVtSXRlbUxhYmVsOworCQorCUpMaXN0ICAgICAgIGdyb3VwTGlzdDsKKwlKTGlzdCAgICAgICBmaWxlTGlzdDsKKwlKTGlzdCAgICAgICBkdXBMaXN0OworCQorCUpTY3JvbGxQYW5lIGdyb3VwU2Nyb2xsOworCUpTY3JvbGxQYW5lIGR1cFNjcm9sbDsKKwlKU2Nyb2xsUGFuZSBmaWxlU2Nyb2xsOworCQorCUpQYW5lbCAgICAgIGZpbGVQYW5lbDsKKwlKUGFuZWwgICAgICBpdGVtUGFuZWw7CisJSlBhbmVsICAgICAgZ3JvdXBQYW5lbDsKKwkKKwlKQnV0dG9uICAgICBmaWxlQnV0dG9uOworCUpCdXR0b24gICAgIGdyb3VwQnV0dG9uOworCUpCdXR0b24gICAgIGl0ZW1CdXR0b247CisJCisJQm94ICAgICAgICAgbWFpbkJveDsKKwlCb3ggICAgICAgICBkdXBCb3g7CisJCisJCisJcHVibGljIHZvaWQgc2V0QnVuZGxlKEJ1bmRsZSBiKSB7CisJCXJibSA9IG51bGw7CisJCWlmIChidW5kbGUgPT0gbnVsbCkgeworCQkJYnVuZGxlID0gYjsKKwkJCWluaXRDb21wb25lbnRzKCk7CisJCX0gZWxzZSBpZiAoYnVuZGxlICE9IGIpIHsKKwkJCWJ1bmRsZSA9IGI7CisJCQl1cGRhdGVDb21wb25lbnRzKCk7CisJCX0KKwl9CisJCisJcHVibGljIHZvaWQgc2V0TWFuYWdlcihSQk1hbmFnZXIgbSkgeworCQlidW5kbGUgPSBudWxsOworCQlpZiAocmJtID09IG51bGwpIHsKKwkJCXJibSA9IG07CisJCQlpbml0Q29tcG9uZW50cygpOworCQl9IGVsc2UgaWYgKHJibSAhPSBtKSB7CisJCQlyYm0gPSBtOworCQkJdXBkYXRlQ29tcG9uZW50cygpOworCQl9CisJfQorCQorCXB1YmxpYyB2b2lkIHJlbW92ZUVsZW1lbnRzKCkgeworCQlpZiAocmJtICE9IG51bGwgfHwgYnVuZGxlICE9IG51bGwpIHsKKwkJCXJibSA9IG51bGw7CisJCQlidW5kbGUgPSBudWxsOworCQkJaW5pdENvbXBvbmVudHMoKTsKKwkJfQorCX0JCisJCQorCXB1YmxpYyB2b2lkIGluaXRDb21wb25lbnRzKCkgeworCQkvLyBJbml0aWFsaXplIGNvbXBvbmVudHMKKwkJaWYgKGJ1bmRsZSAhPSBudWxsKSB7CisJCQlSQk1hbmFnZXJHVUkuZGVidWdNc2coIkluaXRpYWxpemluZyBjb21wb25lbnRzIGZvciBSZXNvdXJjZSBGaWxlIik7CisJCQlpbnQgdW50cmFuc2xhdGVkID0gYnVuZGxlLmdldFVudHJhbnNsYXRlZEl0ZW1zU2l6ZSgpOworCQkJCisJCQlqTGFiZWxTdGF0c1RpdGxlICAgICAgICAgID0gbmV3IEpMYWJlbChidW5kbGUubmFtZSk7CisJCQorCQkJakxhYmVsU3RhdHNOYW1lICAgICAgICAgICA9IG5ldyBKTGFiZWwoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJsYW5ndWFnZXN0YXRzX3RpdGxlIikpOworCQkJakxhYmVsU3RhdHNDb21tZW50ICAgICAgICA9IG5ldyBKTGFiZWwoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJsYW5ndWFnZXN0YXRzX2NvbW1lbnQiKSk7CisJCQlqTGFiZWxTdGF0c01hbmFnZXIgICAgICAgID0gbmV3IEpMYWJlbChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImxhbmd1YWdlc3RhdHNfbWFuYWdlciIpKTsKKwkJCWpMYWJlbFN0YXRzTGFuZ3VhZ2UgICAgICAgPSBuZXcgSkxhYmVsKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibGFuZ3VhZ2VzdGF0c19sYW5ndWFnZSIpKTsKKwkJCWpMYWJlbFN0YXRzQ291bnRyeSAgICAgICAgPSBuZXcgSkxhYmVsKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibGFuZ3VhZ2VzdGF0c19jb3VudHJ5IikpOworCQkJakxhYmVsU3RhdHNWYXJpYW50ICAgICAgICA9IG5ldyBKTGFiZWwoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJsYW5ndWFnZXN0YXRzX3ZhcmlhbnQiKSk7CisJCQlqTGFiZWxTdGF0c051bVRyYW5zICAgICAgID0gbmV3IEpMYWJlbChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImxhbmd1YWdlc3RhdHNfaXRlbV9jb3VudCIpICsgIiAiICsKKwkJCQkJCQkJCQkJCSAgIFN0cmluZy52YWx1ZU9mKGJ1bmRsZS5hbGxJdGVtcy5zaXplKCkpKTsKKwkJCWpMYWJlbFN0YXRzTnVtVW50cmFucyAgICAgPSBuZXcgSkxhYmVsKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibGFuZ3VhZ2VzdGF0c190cmFuc2xhdGlvbl9jb3VudCIpICsgCisJCQkJCQkJCQkJCQkgICBTdHJpbmcudmFsdWVPZih1bnRyYW5zbGF0ZWQpKTsKKwkJCisJCQlqVGV4dEZpZWxkU3RhdHNOYW1lICAgICAgID0gbmV3IEpUZXh0RmllbGQoKGJ1bmRsZS5uYW1lID09IG51bGwgPyBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInVudGl0bGVkIikgOiBidW5kbGUubmFtZSkpOworCQkJalRleHRGaWVsZFN0YXRzQ29tbWVudCAgICA9IG5ldyBKVGV4dEZpZWxkKChidW5kbGUuY29tbWVudCA9PSBudWxsID8gIiIgOiBidW5kbGUuY29tbWVudCkpOworCQkJalRleHRGaWVsZFN0YXRzTWFuYWdlciAgICA9IG5ldyBKVGV4dEZpZWxkKChidW5kbGUubWFuYWdlciA9PSBudWxsID8gIiIgOiBidW5kbGUubWFuYWdlcikpOworCQkJalRleHRGaWVsZFN0YXRzTGFuZ3VhZ2UgICA9IG5ldyBKVGV4dEZpZWxkKChidW5kbGUubGFuZ3VhZ2UgPT0gbnVsbCA/ICIiIDogYnVuZGxlLmxhbmd1YWdlKSwyNSk7CisJCQlqVGV4dEZpZWxkU3RhdHNDb3VudHJ5ICAgID0gbmV3IEpUZXh0RmllbGQoKGJ1bmRsZS5jb3VudHJ5ID09IG51bGwgPyAiIiA6IGJ1bmRsZS5jb3VudHJ5KSwyNSk7CisJCQlqVGV4dEZpZWxkU3RhdHNWYXJpYW50ICAgID0gbmV3IEpUZXh0RmllbGQoKGJ1bmRsZS52YXJpYW50ID09IG51bGwgPyAiIiA6IGJ1bmRsZS52YXJpYW50KSwyNSk7CisJCQorCQkJYm94U3RhdHNMZWZ0UmlnaHQxICAgICAgICA9IG5ldyBCb3goQm94TGF5b3V0LlhfQVhJUyk7CisJCQlib3hTdGF0c0xlZnRSaWdodDIgICAgICAgID0gbmV3IEJveChCb3hMYXlvdXQuWF9BWElTKTsJCisJCQorCQkJdXBkYXRlQnV0dG9uICAgICAgICAgICAgICA9IG5ldyBKQnV0dG9uKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiYnV0dG9uX3VwZGF0ZSIpKTsKKwkJCXVwZGF0ZUJ1dHRvbi5zZXRNbmVtb25pYyhSQk1hbmFnZXJNZW51QmFyLmdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiYnV0dG9uX3VwZGF0ZV90cmlnZ2VyIikpKTsKKwkJCQorCQkJLy8gU2V0IHVwIHRoZSBjb21wb25lbnRzCisJCQlqTGFiZWxTdGF0c1RpdGxlLnNldEZvbnQobmV3IEZvbnQoIlNhbnNTZXJpZiIsRm9udC5QTEFJTiwxOCkpOworCQkJCisJCQlCdXR0b25FbmFibGVyRm9jdXNMaXN0ZW5lciBiZWZsID0gbmV3IEJ1dHRvbkVuYWJsZXJGb2N1c0xpc3RlbmVyKHVwZGF0ZUJ1dHRvbik7CisJCQkKKwkJCS8vIEFkZCBsaXN0ZW5lcnMKKwkJCXVwZGF0ZUJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKXsKKwkJCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXYpIHsKKwkJCQkJdXBkYXRlQnVuZGxlSW5mbygpOworCQkJCX0KKwkJCX0pOworCQkJCisJCQlqVGV4dEZpZWxkU3RhdHNOYW1lLmFkZEZvY3VzTGlzdGVuZXIoYmVmbCk7CisJCQlqVGV4dEZpZWxkU3RhdHNDb21tZW50LmFkZEZvY3VzTGlzdGVuZXIoYmVmbCk7CisJCQlqVGV4dEZpZWxkU3RhdHNNYW5hZ2VyLmFkZEZvY3VzTGlzdGVuZXIoYmVmbCk7CisJCQlqVGV4dEZpZWxkU3RhdHNMYW5ndWFnZS5hZGRGb2N1c0xpc3RlbmVyKGJlZmwpOworCQkJalRleHRGaWVsZFN0YXRzQ291bnRyeS5hZGRGb2N1c0xpc3RlbmVyKGJlZmwpOworCQkJalRleHRGaWVsZFN0YXRzVmFyaWFudC5hZGRGb2N1c0xpc3RlbmVyKGJlZmwpOworCQkJCisJCQlqVGV4dEZpZWxkU3RhdHNOYW1lLnNldENvbHVtbnMoMzUpOworCQkJalRleHRGaWVsZFN0YXRzQ29tbWVudC5zZXRDb2x1bW5zKDM1KTsKKwkJCWpUZXh0RmllbGRTdGF0c01hbmFnZXIuc2V0Q29sdW1ucygzNSk7CisJCQlqVGV4dEZpZWxkU3RhdHNMYW5ndWFnZS5zZXRDb2x1bW5zKDI1KTsKKwkJCWpUZXh0RmllbGRTdGF0c0NvdW50cnkuc2V0Q29sdW1ucygyNSk7CisJCQlqVGV4dEZpZWxkU3RhdHNWYXJpYW50LnNldENvbHVtbnMoMjUpOworCQkJCisJCQkvL3VwZGF0ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKKwkJCQorCQkJLy8gVXBkYXRlIHRoZSBkaXNwbGF5CisJCQlpZiAobWFpbkJveCAhPSBudWxsKXsKKwkJCQltYWluQm94LnJlbW92ZUFsbCgpOworCQkJfSBlbHNlIHsKKwkJCQltYWluQm94ID0gbmV3IEJveChCb3hMYXlvdXQuWV9BWElTKTsKKwkJCX0KKwkJCWlmIChkdXBCb3ggIT0gbnVsbCkKKwkJCQlkdXBCb3gucmVtb3ZlQWxsKCk7CisJCQlyZW1vdmVBbGwoKTsKKwkJCW1haW5Cb3guYWRkKGpMYWJlbFN0YXRzVGl0bGUpOworCQkJbWFpbkJveC5hZGQoQm94LmNyZWF0ZVZlcnRpY2FsU3RydXQoMTApKTsKKwkJCW1haW5Cb3guYWRkKGpMYWJlbFN0YXRzTmFtZSk7CisJCQltYWluQm94LmFkZChqVGV4dEZpZWxkU3RhdHNOYW1lKTsKKwkJCW1haW5Cb3guYWRkKEJveC5jcmVhdGVWZXJ0aWNhbFN0cnV0KDUpKTsKKwkJCW1haW5Cb3guYWRkKGpMYWJlbFN0YXRzQ29tbWVudCk7CisJCQltYWluQm94LmFkZChqVGV4dEZpZWxkU3RhdHNDb21tZW50KTsKKwkJCW1haW5Cb3guYWRkKEJveC5jcmVhdGVWZXJ0aWNhbFN0cnV0KDUpKTsKKwkJCW1haW5Cb3guYWRkKGpMYWJlbFN0YXRzTWFuYWdlcik7CisJCQltYWluQm94LmFkZChqVGV4dEZpZWxkU3RhdHNNYW5hZ2VyKTsKKwkJCW1haW5Cb3guYWRkKEJveC5jcmVhdGVWZXJ0aWNhbFN0cnV0KDUpKTsKKwkJCW1haW5Cb3guYWRkKGpMYWJlbFN0YXRzTGFuZ3VhZ2UpOworCQkJbWFpbkJveC5hZGQoalRleHRGaWVsZFN0YXRzTGFuZ3VhZ2UpOworCQkJbWFpbkJveC5hZGQoQm94LmNyZWF0ZVZlcnRpY2FsU3RydXQoNSkpOworCQkJbWFpbkJveC5hZGQoakxhYmVsU3RhdHNDb3VudHJ5KTsKKwkJCW1haW5Cb3guYWRkKGpUZXh0RmllbGRTdGF0c0NvdW50cnkpOworCQkJbWFpbkJveC5hZGQoQm94LmNyZWF0ZVZlcnRpY2FsU3RydXQoNSkpOworCQkJbWFpbkJveC5hZGQoakxhYmVsU3RhdHNWYXJpYW50KTsKKwkJCW1haW5Cb3guYWRkKGpUZXh0RmllbGRTdGF0c1ZhcmlhbnQpOworCQkJbWFpbkJveC5hZGQoQm94LmNyZWF0ZVZlcnRpY2FsU3RydXQoNSkpOworCQkJbWFpbkJveC5hZGQoakxhYmVsU3RhdHNOdW1UcmFucyk7CisJCQltYWluQm94LmFkZChCb3guY3JlYXRlVmVydGljYWxTdHJ1dCg1KSk7CisJCQltYWluQm94LmFkZChqTGFiZWxTdGF0c051bVVudHJhbnMpOworCQkJbWFpbkJveC5hZGQoQm94LmNyZWF0ZVZlcnRpY2FsU3RydXQoMTApKTsKKwkJCW1haW5Cb3guYWRkKHVwZGF0ZUJ1dHRvbik7CisJCQltYWluQm94LmFkZChCb3guY3JlYXRlSG9yaXpvbnRhbEdsdWUoKSk7CisJCQlpZiAoIShnZXRMYXlvdXQoKSBpbnN0YW5jZW9mIEZsb3dMYXlvdXQpKSB7CisJCQkJc2V0TGF5b3V0KG5ldyBGbG93TGF5b3V0KCkpOworCQkJfQorCQkJYWRkKG1haW5Cb3gpOworCQl9IGVsc2UgaWYgKHJibSAhPSBudWxsKSB7CisJCQlSQk1hbmFnZXJHVUkuZGVidWdNc2coIkluaXRpYWxpemluZyBjb21wb25lbnRzIGZvciBSZXNvdXJjZSBCdW5kbGUiKTsKKwkJCXRpdGxlTGFiZWwgICAgICAgICAgPSBuZXcgSkxhYmVsKHJibS5nZXRCYXNlQ2xhc3MoKSArICIgLSAiICsgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJiYXNlY2xhc3MiKSk7CisJCQorCQkJbnVtRmlsZUxhYmVsICAgICAgICA9IG5ldyBKTGFiZWwoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJiYXNlc3RhdHNfZmlsZV9jb3VudCIpICsgIiAiICsgcmJtLmdldE51bWJlckxhbmd1YWdlcygpKTsKKwkJCW51bUdyb3VwTGFiZWwgICAgICAgPSBuZXcgSkxhYmVsKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiYmFzZXN0YXRzX2dyb3VwX2NvdW50IikgKyAiICIgKyByYm0uZ2V0TnVtYmVyR3JvdXBzKCkpOworCQkJbnVtSXRlbUxhYmVsICAgICAgICA9IG5ldyBKTGFiZWwoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJiYXNlc3RhdHNfaXRlbV9jb3VudCIpICsgIiAiICsgcmJtLmdldE51bWJlclRvdGFsVHJhbnNsYXRpb25zKCkpOworCQkJbnVtRHVwTGFiZWwgICAgICAgICA9IG5ldyBKTGFiZWwoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJiYXNlc3RhdHNfZHVwbGljYXRlc19jb3VudCIpICsgIiAiICsgcmJtLmdldE51bWJlckR1cGxpY2F0ZXMoKSk7CisJCQkKKwkJCWZpbGVMaXN0ICAgICAgICAgICAgPSBuZXcgSkxpc3QocmJtLmdldExhbmd1YWdlTGlzdGluZ1ZlY3RvcigpKTsKKwkJCWdyb3VwTGlzdCAgICAgICAgICAgPSBuZXcgSkxpc3QocmJtLmdldEdyb3VwTGlzdGluZ1ZlY3RvcigpKTsKKwkJCWR1cExpc3QgICAgICAgICAgICAgPSBuZXcgSkxpc3QocmJtLmdldER1cGxpY2F0ZXNMaXN0aW5nVmVjdG9yKCkpOworCQkJCisJCQlmaWxlQnV0dG9uICAgICAgICAgID0gbmV3IEpCdXR0b24oUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJidXR0b25fYWRkX2ZpbGUiKSk7CisJCQlncm91cEJ1dHRvbiAgICAgICAgID0gbmV3IEpCdXR0b24oUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJidXR0b25fYWRkX2dyb3VwIikpOworCQkJaXRlbUJ1dHRvbiAgICAgICAgICA9IG5ldyBKQnV0dG9uKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiYnV0dG9uX2FkZF9yZXNvdXJjZSIpKTsKKwkJCQorCQkJZmlsZVBhbmVsICAgICAgICAgICA9IG5ldyBKUGFuZWwoKTsKKwkJCWdyb3VwUGFuZWwgICAgICAgICAgPSBuZXcgSlBhbmVsKCk7CisJCQlpdGVtUGFuZWwgICAgICAgICAgID0gbmV3IEpQYW5lbCgpOworCQkJCisJCQlmaWxlU2Nyb2xsICAgICAgICAgID0gbmV3IEpTY3JvbGxQYW5lKGZpbGVMaXN0KTsKKwkJCWdyb3VwU2Nyb2xsICAgICAgICAgPSBuZXcgSlNjcm9sbFBhbmUoZ3JvdXBMaXN0KTsKKwkJCWR1cFNjcm9sbCAgICAgICAgICAgPSBuZXcgSlNjcm9sbFBhbmUoZHVwTGlzdCk7CisJCQkKKwkJCWlmIChtYWluQm94ID09IG51bGwpIHsKKwkJCQltYWluQm94ICAgICAgICAgPSBuZXcgQm94KEJveExheW91dC5ZX0FYSVMpOworCQkJfSBlbHNlIHsKKwkJCQltYWluQm94LnJlbW92ZUFsbCgpOworCQkJfQorCQkJZHVwQm94ICAgICAgICAgICAgICA9IG5ldyBCb3goQm94TGF5b3V0LllfQVhJUyk7CisJCQkKKwkJCS8vIFNldCB1cCB0aGUgY29tcG9uZW50cworCQkJZmlsZVBhbmVsLnNldExheW91dChuZXcgQm9yZGVyTGF5b3V0KCkpOworCQkJZ3JvdXBQYW5lbC5zZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKKwkJCWl0ZW1QYW5lbC5zZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKKwkJCQorCQkJZmlsZVBhbmVsLnNldEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZVRpdGxlZEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZUV0Y2hlZEJvcmRlcigpLAorCQkJCQkJCQkJCQkJCQkJCSBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImJhc2VzdGF0c19maWxlX2dyb3VwIikpKTsKKwkJCWdyb3VwUGFuZWwuc2V0Qm9yZGVyKEJvcmRlckZhY3RvcnkuY3JlYXRlVGl0bGVkQm9yZGVyKEJvcmRlckZhY3RvcnkuY3JlYXRlRXRjaGVkQm9yZGVyKCksCisJCQkJCQkJCQkJCQkJCQkJIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiYmFzZXN0YXRzX2dyb3VwX2dyb3VwIikpKTsKKwkJCWl0ZW1QYW5lbC5zZXRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVUaXRsZWRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVFdGNoZWRCb3JkZXIoKSwKKwkJCQkJCQkJCQkJCQkJCQkgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJiYXNlc3RhdHNfaXRlbV9ncm91cCIpKSk7CisJCQkKKwkJCXRpdGxlTGFiZWwuc2V0Rm9udChuZXcgRm9udCgiU2Fuc1NlcmlmIixGb250LlBMQUlOLDE4KSk7CisJCQkKKwkJCWZpbGVCdXR0b24uc2V0TW5lbW9uaWMoUkJNYW5hZ2VyTWVudUJhci5nZXRLZXlFdmVudEtleShSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImJ1dHRvbl9hZGRfZmlsZV90cmlnZ2VyIikpKTsKKwkJCWdyb3VwQnV0dG9uLnNldE1uZW1vbmljKFJCTWFuYWdlck1lbnVCYXIuZ2V0S2V5RXZlbnRLZXkoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJidXR0b25fYWRkX2dyb3VwX3RyaWdnZXIiKSkpOworCQkJaXRlbUJ1dHRvbi5zZXRNbmVtb25pYyhSQk1hbmFnZXJNZW51QmFyLmdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiYnV0dG9uX2FkZF9yZXNvdXJjZV90cmlnZ2VyIikpKTsKKwkJCQorCQkJLy8gQWRkIGxpc3RlbmVycworCQkJZmlsZUJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKXsKKwkJCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXYpIHsKKwkJCQkJQ29udGFpbmVyIGMgPSAoKEpCdXR0b24pZXYuZ2V0U291cmNlKCkpLmdldFBhcmVudCgpOworCQkJCQlSQk1hbmFnZXJHVUkgZ3VpID0gbnVsbDsKKwkJCQkJd2hpbGUgKCEoYy5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIFJCTWFuYWdlckdVSSkpIGMgPSBjLmdldFBhcmVudCgpOworCQkJCQlndWkgPSAoUkJNYW5hZ2VyR1VJKWMuZ2V0UGFyZW50KCk7CisJCQkJCWd1aS5jcmVhdGVSZXNvdXJjZUZpbGUoKTsKKwkJCQl9CisJCQl9KTsKKwkJCQorCQkJZ3JvdXBCdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IEFjdGlvbkxpc3RlbmVyKCl7CisJCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2KSB7CisJCQkJCUNvbnRhaW5lciBjID0gKChKQnV0dG9uKWV2LmdldFNvdXJjZSgpKS5nZXRQYXJlbnQoKTsKKwkJCQkJUkJNYW5hZ2VyR1VJIGd1aSA9IG51bGw7CisJCQkJCXdoaWxlICghKGMuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBSQk1hbmFnZXJHVUkpKSBjID0gYy5nZXRQYXJlbnQoKTsKKwkJCQkJZ3VpID0gKFJCTWFuYWdlckdVSSljLmdldFBhcmVudCgpOworCQkJCQlndWkuY3JlYXRlQnVuZGxlR3JvdXAoKTsKKwkJCQl9CisJCQl9KTsKKwkJCQorCQkJaXRlbUJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKXsKKwkJCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXYpIHsKKwkJCQkJQ29udGFpbmVyIGMgPSAoKEpCdXR0b24pZXYuZ2V0U291cmNlKCkpLmdldFBhcmVudCgpOworCQkJCQlSQk1hbmFnZXJHVUkgZ3VpID0gbnVsbDsKKwkJCQkJd2hpbGUgKCEoYy5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIFJCTWFuYWdlckdVSSkpIGMgPSBjLmdldFBhcmVudCgpOworCQkJCQlndWkgPSAoUkJNYW5hZ2VyR1VJKWMuZ2V0UGFyZW50KCk7CisJCQkJCWd1aS5jcmVhdGVCdW5kbGVJdGVtKCk7CisJCQkJfQorCQkJfSk7CisJCQkKKwkJCS8vIFVwZGF0ZSB0aGUgZGlzcGxheQorCQkJZmlsZVBhbmVsLnJlbW92ZUFsbCgpOworCQkJZmlsZVBhbmVsLmFkZChudW1GaWxlTGFiZWwsIEJvcmRlckxheW91dC5OT1JUSCk7CisJCQlmaWxlUGFuZWwuYWRkKGZpbGVTY3JvbGwsIEJvcmRlckxheW91dC5DRU5URVIpOworCQkJZmlsZVBhbmVsLmFkZChmaWxlQnV0dG9uLCBCb3JkZXJMYXlvdXQuU09VVEgpOworCQkJCisJCQlncm91cFBhbmVsLnJlbW92ZUFsbCgpOworCQkJZ3JvdXBQYW5lbC5hZGQobnVtR3JvdXBMYWJlbCwgQm9yZGVyTGF5b3V0Lk5PUlRIKTsKKwkJCWdyb3VwUGFuZWwuYWRkKGdyb3VwU2Nyb2xsLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKKwkJCWdyb3VwUGFuZWwuYWRkKGdyb3VwQnV0dG9uLCBCb3JkZXJMYXlvdXQuU09VVEgpOworCQkJCisJCQlkdXBCb3gucmVtb3ZlQWxsKCk7CisJCQlkdXBCb3guYWRkKG51bUR1cExhYmVsKTsKKwkJCWR1cEJveC5hZGQoZHVwU2Nyb2xsKTsKKwkJCQorCQkJaXRlbVBhbmVsLnJlbW92ZUFsbCgpOworCQkJaXRlbVBhbmVsLmFkZChudW1JdGVtTGFiZWwsIEJvcmRlckxheW91dC5OT1JUSCk7CisJCQlpdGVtUGFuZWwuYWRkKGR1cEJveCwgQm9yZGVyTGF5b3V0LkNFTlRFUik7CisJCQlpdGVtUGFuZWwuYWRkKGl0ZW1CdXR0b24sIEJvcmRlckxheW91dC5TT1VUSCk7CisJCQkKKwkJCW1haW5Cb3gucmVtb3ZlQWxsKCk7CisJCQltYWluQm94LmFkZCh0aXRsZUxhYmVsKTsKKwkJCW1haW5Cb3guYWRkKEJveC5jcmVhdGVWZXJ0aWNhbFN0cnV0KDEwKSk7CisJCQltYWluQm94LmFkZChmaWxlUGFuZWwpOworCQkJbWFpbkJveC5hZGQoQm94LmNyZWF0ZVZlcnRpY2FsU3RydXQoMTApKTsKKwkJCW1haW5Cb3guYWRkKGdyb3VwUGFuZWwpOworCQkJbWFpbkJveC5hZGQoQm94LmNyZWF0ZVZlcnRpY2FsU3RydXQoMTApKTsKKwkJCW1haW5Cb3guYWRkKGl0ZW1QYW5lbCk7CisJCQkKKwkJCXJlbW92ZUFsbCgpOworCQkJaWYgKCEoZ2V0TGF5b3V0KCkgaW5zdGFuY2VvZiBCb3JkZXJMYXlvdXQpKQorCQkJCXNldExheW91dChuZXcgQm9yZGVyTGF5b3V0KCkpOworCQkJYWRkKG1haW5Cb3gsIEJvcmRlckxheW91dC5DRU5URVIpOworCQkJdXBkYXRlQ29tcG9uZW50cygpOworCQl9IGVsc2UgeworCQkJcmVtb3ZlQWxsKCk7CQorCQl9CisJCXJlcGFpbnQoKTsKKwl9CisJCisJcHVibGljIHZvaWQgdXBkYXRlQ29tcG9uZW50cygpIHsKKwkJaWYgKGJ1bmRsZSAhPSBudWxsKSB7CisJCQlpbnQgdW50cmFuc2xhdGVkID0gYnVuZGxlLmdldFVudHJhbnNsYXRlZEl0ZW1zU2l6ZSgpOworCQkJCisJCQlqTGFiZWxTdGF0c1RpdGxlLnNldFRleHQoYnVuZGxlLm5hbWUpOworCQkKKwkJCWpUZXh0RmllbGRTdGF0c05hbWUuc2V0VGV4dChidW5kbGUubmFtZSA9PSBudWxsID8gUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJ1bnRpdGxlZCIpIDogYnVuZGxlLm5hbWUpOworCQkJalRleHRGaWVsZFN0YXRzQ29tbWVudC5zZXRUZXh0KGJ1bmRsZS5jb21tZW50ID09IG51bGwgPyAiIiA6IGJ1bmRsZS5jb21tZW50KTsKKwkJCWpUZXh0RmllbGRTdGF0c01hbmFnZXIuc2V0VGV4dChidW5kbGUubWFuYWdlciA9PSBudWxsID8gIiIgOiBidW5kbGUubWFuYWdlcik7CisJCQlqVGV4dEZpZWxkU3RhdHNMYW5ndWFnZS5zZXRUZXh0KGJ1bmRsZS5sYW5ndWFnZSA9PSBudWxsID8gIiIgOiBidW5kbGUubGFuZ3VhZ2UpOworCQkJalRleHRGaWVsZFN0YXRzQ291bnRyeS5zZXRUZXh0KGJ1bmRsZS5jb3VudHJ5ID09IG51bGwgPyAiIiA6IGJ1bmRsZS5jb3VudHJ5KTsKKwkJCWpUZXh0RmllbGRTdGF0c1ZhcmlhbnQuc2V0VGV4dChidW5kbGUudmFyaWFudCA9PSBudWxsID8gIiIgOiBidW5kbGUudmFyaWFudCk7CisJCQlqTGFiZWxTdGF0c051bVRyYW5zLnNldFRleHQoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJsYW5ndWFnZXN0YXRzX2l0ZW1fY291bnQiKSArICIgIiArCisJCQkJCSAgIFN0cmluZy52YWx1ZU9mKGJ1bmRsZS5hbGxJdGVtcy5zaXplKCkpKTsKKwkJCWpMYWJlbFN0YXRzTnVtVW50cmFucy5zZXRUZXh0KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibGFuZ3VhZ2VzdGF0c190cmFuc2xhdGlvbl9jb3VudCIpICsgCisJCQkJCSAgIFN0cmluZy52YWx1ZU9mKHVudHJhbnNsYXRlZCkpOworCQl9IGVsc2UgaWYgKHJibSA9PSBudWxsKSB7CisJCQlyZW1vdmVBbGwoKTsKKwkJfQorCQkKKwl9CisJCisJdm9pZCB1cGRhdGVCdW5kbGVJbmZvKCkgeworCQlidW5kbGUubmFtZSAgICAgPSBqVGV4dEZpZWxkU3RhdHNOYW1lLmdldFRleHQoKS50cmltKCk7CisJCWJ1bmRsZS5jb21tZW50ICA9IGpUZXh0RmllbGRTdGF0c0NvbW1lbnQuZ2V0VGV4dCgpLnRyaW0oKTsKKwkJYnVuZGxlLm1hbmFnZXIgID0galRleHRGaWVsZFN0YXRzTWFuYWdlci5nZXRUZXh0KCkudHJpbSgpOworCQlidW5kbGUubGFuZ3VhZ2UgPSBqVGV4dEZpZWxkU3RhdHNMYW5ndWFnZS5nZXRUZXh0KCkudHJpbSgpOworCQlidW5kbGUuY291bnRyeSAgPSBqVGV4dEZpZWxkU3RhdHNDb3VudHJ5LmdldFRleHQoKS50cmltKCk7CisJCWJ1bmRsZS52YXJpYW50ICA9IGpUZXh0RmllbGRTdGF0c1ZhcmlhbnQuZ2V0VGV4dCgpLnRyaW0oKTsKKwkJdXBkYXRlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOworCX0KKwkKKwlwdWJsaWMgUkJTdGF0aXN0aWNzUGFuZWwoKSB7CisJCXN1cGVyKCk7CisJCWJ1bmRsZSA9IG51bGw7CisJCXJibSA9IG51bGw7CisJfQorCQorfQorCitjbGFzcyBCdXR0b25FbmFibGVyRm9jdXNMaXN0ZW5lciBpbXBsZW1lbnRzIEZvY3VzTGlzdGVuZXIgeworCUpCdXR0b24gYnV0dG9uOworCVN0cmluZyBiZWZvcmVUZXh0ID0gbnVsbDsKKwkKKwlwdWJsaWMgQnV0dG9uRW5hYmxlckZvY3VzTGlzdGVuZXIoSkJ1dHRvbiBidXR0b24pIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy5idXR0b24gPSBidXR0b247CisJfQorCQorCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZXYpIHsKKwkJT2JqZWN0IG8gPSBldi5nZXRTb3VyY2UoKTsKKwkJaWYgKG8gaW5zdGFuY2VvZiBKVGV4dENvbXBvbmVudCkgeworCQkJSlRleHRDb21wb25lbnQganRjID0gKEpUZXh0Q29tcG9uZW50KW87CisJCQliZWZvcmVUZXh0ID0ganRjLmdldFRleHQoKTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBldikgeworCQlPYmplY3QgbyA9IGV2LmdldFNvdXJjZSgpOworCQlpZiAobyBpbnN0YW5jZW9mIEpUZXh0Q29tcG9uZW50KSB7CisJCQlKVGV4dENvbXBvbmVudCBqdGMgPSAoSlRleHRDb21wb25lbnQpbzsKKwkJCVN0cmluZyBhZnRlclRleHQgPSBqdGMuZ2V0VGV4dCgpOworCQkJaWYgKCFhZnRlclRleHQuZXF1YWxzKGJlZm9yZVRleHQpKSBidXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKKwkJfSBlbHNlIGJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2d1aS9SQlVudHJhbnNsYXRlZFBhbmVsLmphdmEgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZ3VpL1JCVW50cmFuc2xhdGVkUGFuZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTg3ZGE0Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2d1aS9SQlVudHJhbnNsYXRlZFBhbmVsLmphdmEKQEAgLTAsMCArMSwzMTEgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoQykgMjAwMC0yMDA0LCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZCAgKgorICogb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworcGFja2FnZSBjb20uaWJtLnJibS5ndWk7CisKK2ltcG9ydCBqYXZhLmF3dC4qOworaW1wb3J0IGphdmEuYXd0LmV2ZW50Lio7CisKK2ltcG9ydCBqYXZheC5zd2luZy4qOworaW1wb3J0IGphdmF4LnN3aW5nLnRhYmxlLio7CisKK2ltcG9ydCBjb20uaWJtLnJibS4qOworCisvKioKKyAqIFRoZSBjbGFzcyB1c2VkIHRvIGRpc3BsYXkgdW50cmFuc2xhdGVkIGl0ZW1zCisgKi8KK2NsYXNzIFJCVW50cmFuc2xhdGVkUGFuZWwgZXh0ZW5kcyBKUGFuZWwgeworCVJCTWFuYWdlciByYm07CisJQnVuZGxlIGJ1bmRsZTsKKwlSQk1hbmFnZXJHVUkgbGlzdGVuZXI7CisJCisJLy8gQ29tcG9uZW50cyAtIEJ1bmRsZQorCUpMYWJlbCAgICAgICAgICAgICAgICAgICAgICBqTGFiZWxVbnRyYW5zVGl0bGU7CisJVW50cmFuc2xhdGVkSXRlbXNUYWJsZU1vZGVsIHVudHJhbnNUYWJsZU1vZGVsOworCUpUYWJsZSAgICAgICAgICAgICAgICAgICAgICBqVGFibGVVbnRyYW5zOworCUpTY3JvbGxQYW5lICAgICAgICAgICAgICAgICBqU2Nyb2xsUGFuZVVudHJhbnNUYWJsZTsKKwkKKwkvLyBDb21wb25lbnRzIC0gQnVuZGxlIE1hbmFnZXIKKwlCb3ggICAgICAgICAgICAgICAgICAgICAgICAgbWFpbkJveDsKKwlKUGFuZWwgICAgICAgICAgICAgICAgICAgICAgbWFpblBhbmVsc1tdOworCUpMYWJlbCAgICAgICAgICAgICAgICAgICAgICBudW1VbnRyYW5zTGFiZWxzW107CisJSlNjcm9sbFBhbmUgICAgICAgICAgICAgICAgIG1haW5TY3JvbGw7CisJSlNjcm9sbFBhbmUgICAgICAgICAgICAgICAgIGxpc3RTY3JvbGxzW107CisJSkxpc3QgICAgICAgICAgICAgICAgICAgICAgIHVudHJhbnNMaXN0c1tdOworCQorCXB1YmxpYyBSQlVudHJhbnNsYXRlZFBhbmVsKFJCTWFuYWdlckdVSSBndWkpIHsKKwkJc3VwZXIoKTsKKwkJbGlzdGVuZXIgPSBndWk7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldEJ1bmRsZShCdW5kbGUgYikgeworCQlyYm0gPSBudWxsOworCQlpZiAoYnVuZGxlID09IG51bGwpIHsKKwkJCWJ1bmRsZSA9IGI7CisJCQlpbml0Q29tcG9uZW50cygpOworCQl9IGVsc2UgaWYgKGJ1bmRsZSAhPSBiKSB7CisJCQlidW5kbGUgPSBiOworCQkJdXBkYXRlQ29tcG9uZW50cygpOworCQl9CisJfQorCQorCXB1YmxpYyB2b2lkIHNldE1hbmFnZXIoUkJNYW5hZ2VyIG0pIHsKKwkJYnVuZGxlID0gbnVsbDsKKwkJaWYgKHJibSA9PSBudWxsKSB7CisJCQlyYm0gPSBtOworCQkJaW5pdENvbXBvbmVudHMoKTsKKwkJfSBlbHNlIGlmIChyYm0gIT0gbSkgeworCQkJcmJtID0gbTsKKwkJCXVwZGF0ZUNvbXBvbmVudHMoKTsKKwkJfQorCX0KKwkKKwlwdWJsaWMgdm9pZCByZW1vdmVFbGVtZW50cygpIHsKKwkJaWYgKHJibSAhPSBudWxsIHx8IGJ1bmRsZSAhPSBudWxsKSB7CisJCQlyYm0gPSBudWxsOworCQkJYnVuZGxlID0gbnVsbDsKKwkJCWluaXRDb21wb25lbnRzKCk7CisJCX0KKwl9CQorCQorCS8vIE1hcmtzIHRoZSBzZWxlY3RlZCByZXNvdXJjZSBhcyB0cmFuc2xhdGVkIGFuZCByZW1vdmVzIGZyb20gdGhpcyB2aWV3CisJcHJpdmF0ZSB2b2lkIG1hcmtTZWxlY3RlZFJlc291cmNlQXNUcmFuc2xhdGVkKCkgeworCQlpZiAoYnVuZGxlID09IG51bGwpIHJldHVybjsKKwkJaWYgKGpUYWJsZVVudHJhbnMuZ2V0U2VsZWN0ZWRSb3coKSA8IDApIHJldHVybjsKKwkJaWYgKGpUYWJsZVVudHJhbnMuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFVudHJhbnNsYXRlZEl0ZW1zVGFibGVNb2RlbCkgeworCQkJaW50IHJvdyA9IGpUYWJsZVVudHJhbnMuZ2V0U2VsZWN0ZWRSb3coKTsKKwkJCVVudHJhbnNsYXRlZEl0ZW1zVGFibGVNb2RlbCBtb2RlbCA9IChVbnRyYW5zbGF0ZWRJdGVtc1RhYmxlTW9kZWwpalRhYmxlVW50cmFucy5nZXRNb2RlbCgpOworCQkJQnVuZGxlSXRlbSBpdGVtID0gbW9kZWwuZ2V0QnVuZGxlSXRlbShyb3cpOworCQkJaXRlbS5zZXRUcmFuc2xhdGVkKHRydWUpOworCQkJbW9kZWwudXBkYXRlKCk7CisJCX0KKwl9CisJCisJLy8gUmVtb3ZlcyB0aGUgc2VsZWN0ZWQgcmVzb3VyY2UgZnJvbSB0aGUgcmVzb3VyY2UgZmlsZQorCXByaXZhdGUgdm9pZCBkZWxldGVTZWxlY3RlZFJlc291cmNlKCkgeworCQlpZiAoYnVuZGxlID09IG51bGwpIHJldHVybjsKKwkJaWYgKGpUYWJsZVVudHJhbnMuZ2V0U2VsZWN0ZWRSb3coKSA8IDApIHJldHVybjsKKwkJaWYgKGpUYWJsZVVudHJhbnMuZ2V0TW9kZWwoKSBpbnN0YW5jZW9mIFVudHJhbnNsYXRlZEl0ZW1zVGFibGVNb2RlbCkgeworCQkJaW50IHJvdyA9IGpUYWJsZVVudHJhbnMuZ2V0U2VsZWN0ZWRSb3coKTsKKwkJCVVudHJhbnNsYXRlZEl0ZW1zVGFibGVNb2RlbCBtb2RlbCA9IChVbnRyYW5zbGF0ZWRJdGVtc1RhYmxlTW9kZWwpalRhYmxlVW50cmFucy5nZXRNb2RlbCgpOworCQkJQnVuZGxlSXRlbSBpdGVtID0gbW9kZWwuZ2V0QnVuZGxlSXRlbShyb3cpOworCQkJaWYgKGl0ZW0uZ2V0UGFyZW50R3JvdXAoKSAhPSBudWxsICYmIGl0ZW0uZ2V0UGFyZW50R3JvdXAoKS5nZXRQYXJlbnRCdW5kbGUoKSAhPSBudWxsKSB7CisJCQkJQnVuZGxlIGJ1bmRsZSA9IGl0ZW0uZ2V0UGFyZW50R3JvdXAoKS5nZXRQYXJlbnRCdW5kbGUoKTsKKwkJCQlidW5kbGUucmVtb3ZlSXRlbShpdGVtLmdldEtleSgpKTsKKwkJCX0KKwkJCW1vZGVsLnVwZGF0ZSgpOworCQl9CisJfQorCQorCXByaXZhdGUgdm9pZCBwcmludFRhYmxlKCkgeworCQlQcmludEpvYiBwam9iID0gZ2V0VG9vbGtpdCgpLmdldFByaW50Sm9iKG5ldyBGcmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW50aW5nIFRlc3QiLCBudWxsKTsKKworICAgICAgICBpZiAocGpvYiAhPSBudWxsKSB7ICAgICAgICAgIAorICAgICAgICAgICAgR3JhcGhpY3MgcGcgPSBwam9iLmdldEdyYXBoaWNzKCk7CisKKyAgICAgICAgICAgIGlmIChwZyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy9qVGFibGVVbnRyYW5zLnByaW50KHBnKTsKKyAgICAgICAgICAgICAgICBEaW1lbnNpb24gcGFnZV9kaW0gPSBwam9iLmdldFBhZ2VEaW1lbnNpb24oKTsKKwkJCQlwZy5zZXRDb2xvcihDb2xvci5ibGFjayk7CisJCQkJaW50IHlfb2ZmID0gNTA7CisJCQkJaW50IHhfb2ZmID0gMzA7CisJCQkJVGFibGVNb2RlbCBtb2RlbCA9IGpUYWJsZVVudHJhbnMuZ2V0TW9kZWwoKTsKKwkJCQlwZy5zZXRGb250KG5ldyBGb250KCJTYW5zU2VyaWYiLCBGb250LkJPTEQsIDE0KSk7CisJCQkJcGcuZHJhd1N0cmluZygiVW50cmFuc2xhdGVkIEl0ZW1zOiAgICAgICBQYWdlIDEiLCB4X29mZiwgeV9vZmYpOworCQkJCXBnLnNldEZvbnQobmV3IEZvbnQoIlNhbnNTZXJpZiIsIEZvbnQuUExBSU4sIDEwKSk7CisJCQkJCisJCQkJZm9yIChpbnQgaT0wIDsgaSA8IG1vZGVsLmdldFJvd0NvdW50KCk7IGkrKykgeworCQkJCQlpZiAoeV9vZmYgPCBwYWdlX2RpbS5oZWlnaHQgLSA1MCkgeworCQkJCQkJeV9vZmYgKz0gMTU7CisJCQkJCQlTdHJpbmcga2V5ID0gbW9kZWwuZ2V0VmFsdWVBdChpLCAwKS50b1N0cmluZygpOworCQkJCQkJU3RyaW5nIHRyYW5zbGF0aW9uID0gbW9kZWwuZ2V0VmFsdWVBdChpLDEpLnRvU3RyaW5nKCk7CisJCQkJCQlwZy5kcmF3U3RyaW5nKGtleSArICIgLT4gIiArIHRyYW5zbGF0aW9uLCB4X29mZiwgeV9vZmYpOworCQkJCQl9CisJCQkJfQorCQkJCXBnLmRpc3Bvc2UoKTsgLy8gZmx1c2ggcGFnZQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcGpvYi5lbmQoKTsKKworICAgICAgICB9CisJfQorCQorCXB1YmxpYyB2b2lkIGluaXRDb21wb25lbnRzKCkgeworCQkvLyBJbml0aWFsaXplIGNvbXBvbmVudHMKKwkJaWYgKGJ1bmRsZSAhPSBudWxsKSB7CisJCQlqTGFiZWxVbnRyYW5zVGl0bGUgICAgICAgID0gbmV3IEpMYWJlbChidW5kbGUubmFtZSk7CisJCQl1bnRyYW5zVGFibGVNb2RlbCAgICAgICAgID0gbmV3IFVudHJhbnNsYXRlZEl0ZW1zVGFibGVNb2RlbChidW5kbGUpOworCQkJalRhYmxlVW50cmFucyAgICAgICAgICAgICA9IG5ldyBKVGFibGUodW50cmFuc1RhYmxlTW9kZWwpOworCQkJalNjcm9sbFBhbmVVbnRyYW5zVGFibGUgICA9IG5ldyBKU2Nyb2xsUGFuZShqVGFibGVVbnRyYW5zKTsKKwkKKwkJCS8vIExvd2VyIHBhbmVsIGNvbXBvbmVudHMKKwkJCUpQYW5lbCAgbG93ZXJQYW5lbCA9IG5ldyBKUGFuZWwoKTsKKwkJCUpCdXR0b24gZGVsZXRlQnV0dG9uID0gbmV3IEpCdXR0b24oUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJidXR0b25fZGVsZXRlX3Jlc291cmNlIikpOworCQkJSkJ1dHRvbiB0cmFuc2xhdGVCdXR0b24gPSBuZXcgSkJ1dHRvbihSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImJ1dHRvbl9tYXJrX3RyYW5zbGF0ZWQiKSk7CisJCQlKQnV0dG9uIHByaW50QnV0dG9uID0gbmV3IEpCdXR0b24oUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJidXR0b25fcHJpbnRfdGFibGUiKSk7CisJCQkKKwkJCWRlbGV0ZUJ1dHRvbi5zZXRNbmVtb25pYyhSQk1hbmFnZXJNZW51QmFyLmdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiYnV0dG9uX2RlbGV0ZV9yZXNvdXJjZV90cmlnZ2VyIikpKTsKKwkJCXRyYW5zbGF0ZUJ1dHRvbi5zZXRNbmVtb25pYyhSQk1hbmFnZXJNZW51QmFyLmdldEtleUV2ZW50S2V5KFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiYnV0dG9uX21hcmtfdHJhbnNsYXRlZF90cmlnZ2VyIikpKTsKKwkJCWxvd2VyUGFuZWwuc2V0Qm9yZGVyKEJvcmRlckZhY3RvcnkuY3JlYXRlVGl0bGVkQm9yZGVyKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibGFuZ3VhZ2V1bnRyYW5zX3NlbGVjdGVkX3Jlc291cmNlc19vcHRpb25zIikpKTsKKwkJCWxvd2VyUGFuZWwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsMikpOworCQkJCisJCQlqVGFibGVVbnRyYW5zLnNldFNlbGVjdGlvbk1vZGUoTGlzdFNlbGVjdGlvbk1vZGVsLlNJTkdMRV9TRUxFQ1RJT04pOworCQkJalRhYmxlVW50cmFucy5hZGRNb3VzZUxpc3RlbmVyKGxpc3RlbmVyKTsKKwkJCQorCQkJakxhYmVsVW50cmFuc1RpdGxlLnNldEZvbnQobmV3IEZvbnQoIlNhbnNTZXJpZiIsRm9udC5QTEFJTiwxOCkpOworCQkJCisJCQkvLyBBZGQgYWN0aW9uIGxpc3RlbmVycworCQkJZGVsZXRlQnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKKwkJCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXYpIHsKKwkJCQkJZGVsZXRlU2VsZWN0ZWRSZXNvdXJjZSgpOworCQkJCX0KKwkJCX0pOworCQkJdHJhbnNsYXRlQnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKKwkJCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXYpIHsKKwkJCQkJbWFya1NlbGVjdGVkUmVzb3VyY2VBc1RyYW5zbGF0ZWQoKTsKKwkJCQl9CisJCQl9KTsKKwkJCXByaW50QnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKKwkJCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXYpIHsKKwkJCQkJcHJpbnRUYWJsZSgpOworCQkJCX0KKwkJCX0pOwkKKwkJCQorCQkJcmVtb3ZlQWxsKCk7CisJCQlzZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKKwkJCWxvd2VyUGFuZWwuYWRkKGRlbGV0ZUJ1dHRvbik7CisJCQlsb3dlclBhbmVsLmFkZCh0cmFuc2xhdGVCdXR0b24pOworCQkJLy9sb3dlclBhbmVsLmFkZChwcmludEJ1dHRvbik7CisJCQlhZGQoakxhYmVsVW50cmFuc1RpdGxlLCBCb3JkZXJMYXlvdXQuTk9SVEgpOworCQkJYWRkKGpTY3JvbGxQYW5lVW50cmFuc1RhYmxlLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKKwkJCWFkZChsb3dlclBhbmVsLCBCb3JkZXJMYXlvdXQuU09VVEgpOworCQl9IGVsc2UgaWYgKHJibSAhPSBudWxsKSB7CisJCQkKKwkJCWludCBsYW5nQ291bnQgPSAwOyAgICAgICAvLyBUaGUgbnVtYmVyIG9mIGxhbmd1YWdlcyB3aXRoIHVudHJhbnNsYXRlZCBJdGVtcworCQkJZm9yIChpbnQgaT0wOyBpIDwgcmJtLmdldEJ1bmRsZXMoKS5zaXplKCk7IGkrKykgeworCQkJCUJ1bmRsZSBidW5kbGUgPSAoQnVuZGxlKXJibS5nZXRCdW5kbGVzKCkuZWxlbWVudEF0KGkpOworCQkJCWlmIChidW5kbGUuZ2V0VW50cmFuc2xhdGVkSXRlbXNTaXplKCkgPiAwKSBsYW5nQ291bnQrKzsKKwkJCX0KKwkJCQorCQkJLy8gSW5pdGlhbGl6ZSB0aGUgY29tcG9uZW50cworCQkJbWFpblBhbmVscyAgICAgICAgICAgICAgID0gbmV3IEpQYW5lbFtsYW5nQ291bnRdOworCQkJbnVtVW50cmFuc0xhYmVscyAgICAgICAgID0gbmV3IEpMYWJlbFtsYW5nQ291bnRdOworCQkJbGlzdFNjcm9sbHMgICAgICAgICAgICAgID0gbmV3IEpTY3JvbGxQYW5lW2xhbmdDb3VudF07CisJCQl1bnRyYW5zTGlzdHMgICAgICAgICAgICAgPSBuZXcgSkxpc3RbbGFuZ0NvdW50XTsKKwkJCQorCQkJbWFpbkJveCAgICAgICAgICAgICAgICAgID0gbmV3IEJveChCb3hMYXlvdXQuWV9BWElTKTsKKwkJCW1haW5TY3JvbGwgICAgICAgICAgICAgICA9IG5ldyBKU2Nyb2xsUGFuZShtYWluQm94KTsKKwkJCWpMYWJlbFVudHJhbnNUaXRsZSAgICAgICA9IG5ldyBKTGFiZWwocmJtLmdldEJhc2VDbGFzcygpICsgIiAtICIgKyBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInVudHJhbnNsYXRlZF9pdGVtcyIpKTsKKwkJCQorCQkJLy8gU2V0IGNvbXBvbmVudCBwcm9wZXJ0aWVzCisJCQlqTGFiZWxVbnRyYW5zVGl0bGUuc2V0Rm9udChuZXcgRm9udCgiU2Fuc1NlcmlmIixGb250LlBMQUlOLDE4KSk7CisJCQltYWluQm94LmFkZChqTGFiZWxVbnRyYW5zVGl0bGUpOworCQkJCisJCQlpbnQgY291bnQgPSAwOworCQkJZm9yIChpbnQgaT0wOyBpIDwgcmJtLmdldEJ1bmRsZXMoKS5zaXplKCk7IGkrKykgeworCQkJCUJ1bmRsZSBidW5kbGUgPSAoQnVuZGxlKXJibS5nZXRCdW5kbGVzKCkuZWxlbWVudEF0KGkpOworCQkJCWlmIChidW5kbGUuZ2V0VW50cmFuc2xhdGVkSXRlbXNTaXplKCkgPiAwKSB7CisJCQkJCW1haW5QYW5lbHNbY291bnRdID0gbmV3IEpQYW5lbCgpOworCQkJCQltYWluUGFuZWxzW2NvdW50XS5zZXRMYXlvdXQobmV3IEJvcmRlckxheW91dCgpKTsKKwkJCQkJbnVtVW50cmFuc0xhYmVsc1tjb3VudF0gPSBuZXcgSkxhYmVsKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiYmFzZXVudHJhbnNfdW50cmFuc19jb3VudCIpICsKKwkJCQkJCQkJCQkJCQkJIGJ1bmRsZS5nZXRVbnRyYW5zbGF0ZWRJdGVtc1NpemUoKSk7CisJCQkJCS8vIFRPRE86IEltcGxlbWVudCBhIExpc3QgTW9kZWwgZm9yIHRoaXMgbGlzdCwgcmVtb3ZlIHVzZSBvZiB2ZWN0b3IKKwkJCQkJdW50cmFuc0xpc3RzW2NvdW50XSA9IG5ldyBKTGlzdChidW5kbGUuZ2V0VW50cmFuc2xhdGVkSXRlbXNBc1ZlY3RvcigpKTsKKwkJCQkJbGlzdFNjcm9sbHNbY291bnRdID0gbmV3IEpTY3JvbGxQYW5lKHVudHJhbnNMaXN0c1tjb3VudF0pOworCQkJCQkKKwkJCQkJbWFpblBhbmVsc1tjb3VudF0uc2V0Qm9yZGVyKEJvcmRlckZhY3RvcnkuY3JlYXRlVGl0bGVkQm9yZGVyKAorCQkJCQkJCQkJCQkJQm9yZGVyRmFjdG9yeS5jcmVhdGVFdGNoZWRCb3JkZXIoKSwKKwkJCQkJCQkJCQkJCVJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiYmFzZXVudHJhbnNfZmlsZSIpICsgIiAiICsgYnVuZGxlLnRvU3RyaW5nKCkpKTsKKwkJCQkJbWFpblBhbmVsc1tjb3VudF0ucmVtb3ZlQWxsKCk7CisJCQkJCW1haW5QYW5lbHNbY291bnRdLmFkZChudW1VbnRyYW5zTGFiZWxzW2NvdW50XSwgQm9yZGVyTGF5b3V0Lk5PUlRIKTsKKwkJCQkJbWFpblBhbmVsc1tjb3VudF0uYWRkKGxpc3RTY3JvbGxzW2NvdW50XSwgQm9yZGVyTGF5b3V0LkNFTlRFUik7CisJCQkJCQorCQkJCQltYWluQm94LmFkZChCb3guY3JlYXRlVmVydGljYWxTdHJ1dCg1KSk7CisJCQkJCW1haW5Cb3guYWRkKG1haW5QYW5lbHNbY291bnRdKTsKKwkJCQkJCisJCQkJCWNvdW50Kys7CisJCQkJfQorCQkJfQorCQkJbWFpblNjcm9sbC5zZXRQcmVmZXJyZWRTaXplKGdldFNpemUoKSk7CisJCQlyZW1vdmVBbGwoKTsKKwkJCWFkZChtYWluU2Nyb2xsKTsKKwkJfSBlbHNlIHsKKwkJCXJlbW92ZUFsbCgpOworCQl9CisJfQorCQorCXB1YmxpYyB2b2lkIHVwZGF0ZUNvbXBvbmVudHMoKSB7CisJCS8vIFVwZGF0ZSBjb21wb25lbnRzCisJCWlmIChidW5kbGUgIT0gbnVsbCkgeworCQkJakxhYmVsVW50cmFuc1RpdGxlLnNldFRleHQoYnVuZGxlLm5hbWUpOworCQkJdW50cmFuc1RhYmxlTW9kZWwuc2V0QnVuZGxlKGJ1bmRsZSk7CisJCX0gZWxzZSBpZiAocmJtICE9IG51bGwpIHsKKwkJCWluaXRDb21wb25lbnRzKCk7CisJCX0gZWxzZSB7CisJCQlyZW1vdmVBbGwoKTsKKwkJfQorCX0KK30KKworLyoqCisgKiBUaGUgdGFibGUgbW9kZWwgZm9yIHVudHJhbnNsYXRlZCBJdGVtcworICovCisKK2NsYXNzIFVudHJhbnNsYXRlZEl0ZW1zVGFibGVNb2RlbCBleHRlbmRzIEFic3RyYWN0VGFibGVNb2RlbCB7CisJQnVuZGxlIGJ1bmRsZTsKKwkKKwlwdWJsaWMgVW50cmFuc2xhdGVkSXRlbXNUYWJsZU1vZGVsKEJ1bmRsZSBidW5kbGUpIHsKKwkJdGhpcy5idW5kbGUgPSBidW5kbGU7CisJfQorCQorCXB1YmxpYyB2b2lkIHNldEJ1bmRsZShCdW5kbGUgYnVuZGxlKSB7CisJCXRoaXMuYnVuZGxlID0gYnVuZGxlOworCQl1cGRhdGUoKTsKKwl9CisJCisJcHVibGljIGludCBnZXRDb2x1bW5Db3VudCgpIHsgcmV0dXJuIDM7IH0KKwkJICAgIAorCXB1YmxpYyBpbnQgZ2V0Um93Q291bnQoKSB7CisJCXJldHVybiBidW5kbGUuZ2V0VW50cmFuc2xhdGVkSXRlbXNTaXplKCk7CisJfQorCQorCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWVBdChpbnQgcm93LCBpbnQgY29sKSB7CisJCUJ1bmRsZUl0ZW0gaXRlbSA9IGJ1bmRsZS5nZXRVbnRyYW5zbGF0ZWRJdGVtKHJvdyk7CisJCVN0cmluZyByZXRTdHIgPSBudWxsOworCQkJCQorCQlzd2l0Y2goY29sKSB7CisJCWNhc2UgMDoKKwkJCXJldFN0ciA9IGl0ZW0uZ2V0S2V5KCk7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJcmV0U3RyID0gaXRlbS5nZXRUcmFuc2xhdGlvbigpOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCXJldFN0ciA9IChpdGVtLmdldFBhcmVudEdyb3VwKCkgPT0gbnVsbCA/ICIiIDogaXRlbS5nZXRQYXJlbnRHcm91cCgpLmdldE5hbWUoKSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldFN0ciA9IFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigidGFibGVfY2VsbF9lcnJvciIpOworCQl9CisJCQkJCisJCXJldHVybiByZXRTdHI7CisJfQorCQkJCisJcHVibGljIFN0cmluZyBnZXRDb2x1bW5OYW1lKGludCBjb2wpIHsKKwkJaWYgKGNvbCA9PSAwKSByZXR1cm4gUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJsYW5ndWFnZXVudHJhbnNfY29sdW1uX2tleSIpOworCQllbHNlIGlmIChjb2wgPT0gMSkgcmV0dXJuIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibGFuZ3VhZ2V1bnRyYW5zX2NvbHVtbl90cmFuc2xhdGlvbiIpOworCQllbHNlIGlmIChjb2wgPT0gMikgcmV0dXJuIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigibGFuZ3VhZ2V1bnRyYW5zX2NvbHVtbl9ncm91cCIpOworCQllbHNlIHJldHVybiBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oInRhYmxlX2NvbHVtbl9lcnJvciIpOworCX0KKwkKKwlwdWJsaWMgQnVuZGxlSXRlbSBnZXRCdW5kbGVJdGVtKGludCByb3cpIHsKKwkJcmV0dXJuIGJ1bmRsZS5nZXRVbnRyYW5zbGF0ZWRJdGVtKHJvdyk7CisJfQorCQorCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKKwkJZmlyZVRhYmxlRGF0YUNoYW5nZWQoKTsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9ndWkvUmVzb3VyY2VDcmVhdGlvbkRpYWxvZy5qYXZhIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2d1aS9SZXNvdXJjZUNyZWF0aW9uRGlhbG9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVhMmI3OQotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9ndWkvUmVzb3VyY2VDcmVhdGlvbkRpYWxvZy5qYXZhCkBAIC0wLDAgKzEsMjAzIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwNCwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgICoKKyAqIG90aGVycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3BhY2thZ2UgY29tLmlibS5yYm0uZ3VpOworCitpbXBvcnQgamF2YS5hd3QuKjsKK2ltcG9ydCBqYXZhLmF3dC5ldmVudC4qOworCitpbXBvcnQgamF2YXguc3dpbmcuKjsKKworaW1wb3J0IGNvbS5pYm0ucmJtLio7CisKKy8qKgorICogQSBkaWFsb2cgZm9yIGNyZWF0aW5nIG5ldyBSZXNvdXJjZSBGaWxlcworICovCitjbGFzcyBSZXNvdXJjZUNyZWF0aW9uRGlhbG9nIGV4dGVuZHMgSkRpYWxvZyB7CisJUkJNYW5hZ2VyIHJibTsKKwlSQk1hbmFnZXJHVUkgZ3VpOworCQorCS8vIENvbXBvbmVudHMKKwlCb3ggbWFpbkJveCA9IG5ldyBCb3goQm94TGF5b3V0LllfQVhJUyk7CisJQm94IGluZm9Cb3ggPSBuZXcgQm94KEJveExheW91dC5ZX0FYSVMpOworCUpQYW5lbCBpbmZvUGFuZWwgPSBuZXcgSlBhbmVsKCk7CisJSlBhbmVsIGluZm9UaXRsZVBhbmVsID0gbmV3IEpQYW5lbCgpOworCUpQYW5lbCBpbmZvQ29tbWVudFBhbmVsID0gbmV3IEpQYW5lbCgpOworCUpQYW5lbCBpbmZvTWFuYWdlclBhbmVsID0gbmV3IEpQYW5lbCgpOworCUpQYW5lbCBsYW5nUGFuZWwgPSBuZXcgSlBhbmVsKCk7CisJSlBhbmVsIGNvdW5QYW5lbCA9IG5ldyBKUGFuZWwoKTsKKwlKUGFuZWwgdmFyaVBhbmVsID0gbmV3IEpQYW5lbCgpOworCUpQYW5lbCBidXR0UGFuZWwgPSBuZXcgSlBhbmVsKCk7CisJCisJSkxhYmVsIGluc3RydWN0aW9uc0xhYmVsID0gbmV3IEpMYWJlbCgiIik7CisJSkxhYmVsIHRpdGxlTGFiZWwgPSBuZXcgSkxhYmVsKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX2ZpbGVfdGl0bGUiKSk7CisJSkxhYmVsIGNvbW1lbnRMYWJlbCA9IG5ldyBKTGFiZWwoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJkaWFsb2dfZmlsZV9jb21tZW50IikpOworCUpMYWJlbCBtYW5hZ2VyTGFiZWwgPSBuZXcgSkxhYmVsKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX2ZpbGVfbWFuYWdlciIpKTsKKwlKTGFiZWwgZW5jMUxhYmVsID0gbmV3IEpMYWJlbChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImRpYWxvZ19lbmNvZGluZyIpKTsKKwlKTGFiZWwgZW5jMkxhYmVsID0gbmV3IEpMYWJlbChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImRpYWxvZ19lbmNvZGluZyIpKTsKKwlKTGFiZWwgZW5jM0xhYmVsID0gbmV3IEpMYWJlbChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImRpYWxvZ19lbmNvZGluZyIpKTsKKwlKTGFiZWwgbmFtMUxhYmVsID0gbmV3IEpMYWJlbChSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImRpYWxvZ19uYW1lIikpOworCUpMYWJlbCBuYW0yTGFiZWwgPSBuZXcgSkxhYmVsKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX25hbWUiKSk7CisJSkxhYmVsIG5hbTNMYWJlbCA9IG5ldyBKTGFiZWwoUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJkaWFsb2dfbmFtZSIpKTsKKwkKKwlKVGV4dEZpZWxkIHRpdGxlRmllbGQgPSBuZXcgSlRleHRGaWVsZCgiIik7CisJSlRleHRGaWVsZCBjb21tZW50RmllbGQgPSBuZXcgSlRleHRGaWVsZCgiIik7CisJSlRleHRGaWVsZCBtYW5hZ2VyRmllbGQgPSBuZXcgSlRleHRGaWVsZCgiIik7CisJSlRleHRGaWVsZCBlbmMxRmllbGQgPSBuZXcgSlRleHRGaWVsZCgiIik7CisJSlRleHRGaWVsZCBlbmMyRmllbGQgPSBuZXcgSlRleHRGaWVsZCgiIik7CisJSlRleHRGaWVsZCBlbmMzRmllbGQgPSBuZXcgSlRleHRGaWVsZCgiIik7CisJSlRleHRGaWVsZCBuYW0xRmllbGQgPSBuZXcgSlRleHRGaWVsZCgiIik7CisJSlRleHRGaWVsZCBuYW0yRmllbGQgPSBuZXcgSlRleHRGaWVsZCgiIik7CisJSlRleHRGaWVsZCBuYW0zRmllbGQgPSBuZXcgSlRleHRGaWVsZCgiIik7CisJCisJSkNoZWNrQm94IGNvcHlDaGVja0JveCA9IG5ldyBKQ2hlY2tCb3goUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJkaWFsb2dfY2hlY2tib3hfY29weV9lbGVtZW50cyIpLCB0cnVlKTsKKwkKKwlKQnV0dG9uIGNyZWF0ZUJ1dHRvbiA9IG5ldyBKQnV0dG9uKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiYnV0dG9uX2NyZWF0ZSIpKTsKKwlKQnV0dG9uIGNhbmNlbEJ1dHRvbiA9IG5ldyBKQnV0dG9uKFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiYnV0dG9uX2NhbmNlbCIpKTsKKwkKKwlwdWJsaWMgUmVzb3VyY2VDcmVhdGlvbkRpYWxvZyhSQk1hbmFnZXIgcmJtLCBKRnJhbWUgZnJhbWUsIFN0cmluZyB0aXRsZSwgYm9vbGVhbiBtb2RhbCkgeworCQlzdXBlcihmcmFtZSwgdGl0bGUsIG1vZGFsKTsKKwkJdGhpcy5ndWkgPSAoUkJNYW5hZ2VyR1VJKWZyYW1lOworCQl0aGlzLnJibSA9IHJibTsKKwkJaW5pdENvbXBvbmVudHMoKTsKKwkJZW5hYmxlRXZlbnRzKEFXVEV2ZW50LktFWV9FVkVOVF9NQVNLKTsKKwl9CisJCisJcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0tleUV2ZW50KEtleUV2ZW50IGV2KSB7CisJCWlmIChldi5nZXRLZXlDb2RlKCkgPT0gS2V5RXZlbnQuVktfRU5URVIpIHsKKwkJCWJvb2xlYW4gc3VjY2VzcyA9IGNyZWF0ZVJlc291cmNlKCk7CisJCQlpZiAoIXN1Y2Nlc3MpIHsKKwkJCQlTdHJpbmcgYWxlcnQgPSBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImVycm9yX2NyZWF0ZV9maWxlIikgKyAiICIgKworCQkJCQkJCSAgIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZXJyb3JfdHJ5X2FnYWluX2ZpbGUiKTsKKwkJCQlKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyh0aGlzLCBhbGVydCwgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJlcnJvciIpLCBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKKwkJCX0gZWxzZSB7CisJCQkJc2V0VmlzaWJsZShmYWxzZSk7CisJCQkJZGlzcG9zZSgpOworCQkJfQorCQl9IGVsc2UgaWYgKGV2LmdldEtleUNvZGUoKSA9PSBLZXlFdmVudC5WS19DQU5DRUwpIHsKKwkJCWNsb3NlV2luZG93KCk7CisJCX0KKwl9CisJCisJYm9vbGVhbiBjcmVhdGVSZXNvdXJjZSgpIHsKKwkJaWYgKHJibSA9PSBudWxsKSByZXR1cm4gZmFsc2U7CisJCVN0cmluZyBlbmNvZGluZyA9IGVuYzFGaWVsZC5nZXRUZXh0KCkudHJpbSgpOworCQlTdHJpbmcgZW5jMiA9IGVuYzJGaWVsZC5nZXRUZXh0KCkudHJpbSgpOworCQlpZiAoZW5jMiAhPSBudWxsICYmICFlbmMyLmVxdWFscygiIikpIGVuY29kaW5nICs9ICJfIiArIGVuYzI7CisJCVN0cmluZyBlbmMzID0gZW5jM0ZpZWxkLmdldFRleHQoKS50cmltKCk7CisJCWlmIChlbmMzICE9IG51bGwgJiYgIWVuYzMuZXF1YWxzKCIiKSkgZW5jb2RpbmcgKz0gIl8iICsgZW5jMzsKKwkJYm9vbGVhbiByZXQgPSByYm0uY3JlYXRlUmVzb3VyY2UodGl0bGVGaWVsZC5nZXRUZXh0KCkudHJpbSgpLCBjb21tZW50RmllbGQuZ2V0VGV4dCgpLnRyaW0oKSwgbWFuYWdlckZpZWxkLmdldFRleHQoKS50cmltKCksCisJCQkJCQkJZW5jb2RpbmcsIG5hbTFGaWVsZC5nZXRUZXh0KCkudHJpbSgpLCBuYW0yRmllbGQuZ2V0VGV4dCgpLnRyaW0oKSwKKwkJCQkJCQluYW0zRmllbGQuZ2V0VGV4dCgpLnRyaW0oKSwgY29weUNoZWNrQm94LmlzU2VsZWN0ZWQoKSk7CisJCWlmIChyZXQpIHsgCisJCQlndWkudXBkYXRlRGlzcGxheVRyZWUoKTsKKwkJCWd1aS51cGRhdGVQcm9qZWN0VHJlZSgpOworCQkJZ3VpLnVwZGF0ZVByb2plY3RQYW5lbHMoKTsKKwkJfQorCQlyZXR1cm4gcmV0OworCX0KKwkKKwlwdWJsaWMgdm9pZCBpbml0Q29tcG9uZW50cygpeworCQkvLyBFcnJvciBjaGVjaworCQlpZiAocmJtID09IG51bGwpIHsKKwkJCVN0cmluZyBhbGVydCA9IFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZXJyb3Jfbm9fYnVuZGxlX2Zvcl9maWxlIik7CisJCQlKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyh0aGlzLCBhbGVydCwgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJlcnJvciIpLCBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKKwkJCWNsb3NlV2luZG93KCk7CisJCQlyZXR1cm47CisJCX0KKwkJCisJCS8vIEluaXRpYWxpemUgdmFsdWVzCisJCWludCB0ZW1wV2lkdGggPSAxNzU7CisJCURpbWVuc2lvbiBsYWJlbERpbSA9IG5ldyBEaW1lbnNpb24odGVtcFdpZHRoLCAzMCk7CisJCXRpdGxlTGFiZWwuc2V0UHJlZmVycmVkU2l6ZShsYWJlbERpbSk7CisJCWNvbW1lbnRMYWJlbC5zZXRQcmVmZXJyZWRTaXplKGxhYmVsRGltKTsKKwkJbWFuYWdlckxhYmVsLnNldFByZWZlcnJlZFNpemUobGFiZWxEaW0pOworCQkKKwkJaW5mb1BhbmVsLnNldEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZVRpdGxlZEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZUV0Y2hlZEJvcmRlcigpLAorCQkJCQkJCQkJCQkJCQkJIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX2ZpbGVfaW5mbyIpKSk7CisJCWxhbmdQYW5lbC5zZXRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVUaXRsZWRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVFdGNoZWRCb3JkZXIoKSwKKwkJCQkJCQkJCQkJCQkJCSBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImRpYWxvZ19sYW5ndWFnZSIpKSk7CisJCWNvdW5QYW5lbC5zZXRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVUaXRsZWRCb3JkZXIoQm9yZGVyRmFjdG9yeS5jcmVhdGVFdGNoZWRCb3JkZXIoKSwKKwkJCQkJCQkJCQkJCQkJCSBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImRpYWxvZ19jb3VudHJ5IikpKTsKKwkJdmFyaVBhbmVsLnNldEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZVRpdGxlZEJvcmRlcihCb3JkZXJGYWN0b3J5LmNyZWF0ZUV0Y2hlZEJvcmRlcigpLAorCQkJCQkJCQkJCQkJCQkJIFJlc291cmNlcy5nZXRUcmFuc2xhdGlvbigiZGlhbG9nX3ZhcmlhbnQiKSkpOworCQkKKwkJdGl0bGVGaWVsZC5zZXRDb2x1bW5zKDMwKTsKKwkJY29tbWVudEZpZWxkLnNldENvbHVtbnMoMzApOworCQltYW5hZ2VyRmllbGQuc2V0Q29sdW1ucygzMCk7CisJCQorCQllbmMxRmllbGQuc2V0Q29sdW1ucygzKTsKKwkJZW5jMkZpZWxkLnNldENvbHVtbnMoMyk7CisJCWVuYzNGaWVsZC5zZXRDb2x1bW5zKDMpOworCQluYW0xRmllbGQuc2V0Q29sdW1ucygyMCk7CisJCW5hbTJGaWVsZC5zZXRDb2x1bW5zKDIwKTsKKwkJbmFtM0ZpZWxkLnNldENvbHVtbnMoMjApOworCQkKKwkJLy8gU2V0IHVwIHRoZSBjb21wb25lbnRzCisJCWluZm9UaXRsZVBhbmVsLmFkZCh0aXRsZUxhYmVsKTsgaW5mb1RpdGxlUGFuZWwuYWRkKHRpdGxlRmllbGQpOworCQlpbmZvQ29tbWVudFBhbmVsLmFkZChjb21tZW50TGFiZWwpOyBpbmZvQ29tbWVudFBhbmVsLmFkZChjb21tZW50RmllbGQpOworCQlpbmZvTWFuYWdlclBhbmVsLmFkZChtYW5hZ2VyTGFiZWwpOyBpbmZvTWFuYWdlclBhbmVsLmFkZChtYW5hZ2VyRmllbGQpOworCQlpbmZvQm94LmFkZChpbmZvVGl0bGVQYW5lbCk7CisJCWluZm9Cb3guYWRkKGluZm9Db21tZW50UGFuZWwpOworCQlpbmZvQm94LmFkZChpbmZvTWFuYWdlclBhbmVsKTsKKwkJaW5mb1BhbmVsLmFkZChpbmZvQm94KTsKKwkJCisJCWxhbmdQYW5lbC5hZGQoZW5jMUxhYmVsKTsgbGFuZ1BhbmVsLmFkZChlbmMxRmllbGQpOyBsYW5nUGFuZWwuYWRkKG5hbTFMYWJlbCk7IGxhbmdQYW5lbC5hZGQobmFtMUZpZWxkKTsKKwkJY291blBhbmVsLmFkZChlbmMyTGFiZWwpOyBjb3VuUGFuZWwuYWRkKGVuYzJGaWVsZCk7IGNvdW5QYW5lbC5hZGQobmFtMkxhYmVsKTsgY291blBhbmVsLmFkZChuYW0yRmllbGQpOworCQl2YXJpUGFuZWwuYWRkKGVuYzNMYWJlbCk7IHZhcmlQYW5lbC5hZGQoZW5jM0ZpZWxkKTsgdmFyaVBhbmVsLmFkZChuYW0zTGFiZWwpOyB2YXJpUGFuZWwuYWRkKG5hbTNGaWVsZCk7CisJCQorCQlidXR0UGFuZWwuYWRkKGNyZWF0ZUJ1dHRvbik7IGJ1dHRQYW5lbC5hZGQoY2FuY2VsQnV0dG9uKTsKKwkJCisJCS8vIEFkZCB0aGUgYXBwcm9wcmlhdGUgbGlzdGVuZXJzCisJCWNhbmNlbEJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgQWN0aW9uTGlzdGVuZXIoKSB7CisJCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXYpIHsKKwkJCQlKRGlhbG9nIGRpYWxvZyA9IChKRGlhbG9nKSgoSkJ1dHRvbilldi5nZXRTb3VyY2UoKSkuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCk7CisJCQkJZGlhbG9nLnNldFZpc2libGUoZmFsc2UpOworCQkJCWRpYWxvZy5kaXNwb3NlKCk7CisJCQl9CisJCX0pOworCQkKKwkJY3JlYXRlQnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKKwkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldikgeworCQkJCVJlc291cmNlQ3JlYXRpb25EaWFsb2cgZGlhbG9nID0KKwkJCQkJKFJlc291cmNlQ3JlYXRpb25EaWFsb2cpKChKQnV0dG9uKWV2LmdldFNvdXJjZSgpKS5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKS5nZXRQYXJlbnQoKTsKKwkJCQlib29sZWFuIHN1Y2Nlc3MgPSBkaWFsb2cuY3JlYXRlUmVzb3VyY2UoKTsKKwkJCQlpZiAoIXN1Y2Nlc3MpIHsKKwkJCQkJU3RyaW5nIGFsZXJ0ID0gUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJlcnJvcl9jcmVhdGVfZmlsZSIpICsgIiAiICsKKwkJCQkJCQkJICAgUmVzb3VyY2VzLmdldFRyYW5zbGF0aW9uKCJlcnJvcl90cnlfYWdhaW5fZmlsZSIpOworCQkJCQlKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyhkaWFsb2csIGFsZXJ0LCBSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oImVycm9yIiksIEpPcHRpb25QYW5lLkVSUk9SX01FU1NBR0UpOworCQkJCX0gZWxzZSB7CisJCQkJCWRpYWxvZy5zZXRWaXNpYmxlKGZhbHNlKTsKKwkJCQkJZGlhbG9nLmRpc3Bvc2UoKTsKKwkJCQl9CisJCQl9CisJCX0pOworCQlnZXRSb290UGFuZSgpLnNldERlZmF1bHRCdXR0b24oY3JlYXRlQnV0dG9uKTsKKwkJCisJCS8vIENvbXBsZXRlIHRoZSBjb21wb25lbnQgbGF5b3V0CisJCW1haW5Cb3gucmVtb3ZlQWxsKCk7CisJCS8vbWFpbkJveC5hZGQoaW5zdHJ1Y3Rpb25zTGFiZWwpOworCQltYWluQm94LmFkZChpbmZvUGFuZWwpOworCQltYWluQm94LmFkZChsYW5nUGFuZWwpOworCQltYWluQm94LmFkZChjb3VuUGFuZWwpOworCQltYWluQm94LmFkZCh2YXJpUGFuZWwpOworCQltYWluQm94LmFkZChjb3B5Q2hlY2tCb3gpOworCQltYWluQm94LmFkZChidXR0UGFuZWwpOworCQkKKwkJc2V0TG9jYXRpb24obmV3IGphdmEuYXd0LlBvaW50KDUwLCA1MCkpOworCQlnZXRDb250ZW50UGFuZSgpLmFkZChtYWluQm94LCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKKwkJdmFsaWRhdGVUcmVlKCk7CisJCXBhY2soKTsKKwkJc2V0VmlzaWJsZSh0cnVlKTsKKwkJLy9zZXRSZXNpemFibGUoZmFsc2UpOworCX0KKwkKKwl2b2lkIGNsb3NlV2luZG93KCkgeworCQlzZXRWaXNpYmxlKGZhbHNlKTsKKwkJZGlzcG9zZSgpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2d1aS9pbWFnZXMvVGl0bGVMb2dvX3RyYW5zcGFyZW50LmdpZiBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9ndWkvaW1hZ2VzL1RpdGxlTG9nb190cmFuc3BhcmVudC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAwMjdmZAotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9ndWkvaW1hZ2VzL1RpdGxlTG9nb190cmFuc3BhcmVudC5naWYKQEAgLTAsMCArMSwzIEBACit2ZXJzaW9uIGh0dHBzOi8vZ2l0LWxmcy5naXRodWIuY29tL3NwZWMvdjEKK29pZCBzaGEyNTY6MmFhMjIwYzJhNzMyMjMwYzFlZjI3OTI5OTY2N2NlN2I2OTg0NWQ4YWJkY2JlZWVjZTJmNTQ4ZDU0ZmVhZmI1OQorc2l6ZSAxNjE5CmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vZ3VpL2ltYWdlcy90cmVlX2ljb25fYnVuZGxlLmdpZiBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9ndWkvaW1hZ2VzL3RyZWVfaWNvbl9idW5kbGUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZmUzOGEKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZ3VpL2ltYWdlcy90cmVlX2ljb25fYnVuZGxlLmdpZgpAQCAtMCwwICsxLDMgQEAKK3ZlcnNpb24gaHR0cHM6Ly9naXQtbGZzLmdpdGh1Yi5jb20vc3BlYy92MQorb2lkIHNoYTI1NjowZDAyMjY3NTQzMDk2YmE1ZDJkZGMzNDk0ZDQ4ODc2OWNmYzEzOTY5ODYwMDQ5NDkzZDMzOTkyNzhjYjQyNGFiCitzaXplIDEwODYKZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9ndWkvaW1hZ2VzL3RyZWVfaWNvbl9jb3VudHJ5LmdpZiBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9ndWkvaW1hZ2VzL3RyZWVfaWNvbl9jb3VudHJ5LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGE3YWNkCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2d1aS9pbWFnZXMvdHJlZV9pY29uX2NvdW50cnkuZ2lmCkBAIC0wLDAgKzEsMyBAQAordmVyc2lvbiBodHRwczovL2dpdC1sZnMuZ2l0aHViLmNvbS9zcGVjL3YxCitvaWQgc2hhMjU2OjJmY2U4ZWU3OTYwOTZjYmMxYTZhZjZjNGMxY2UxYTM1NzEyZDNhNWFlZTRlZDU3YjljNGUzZDQ2NzdkZmU5ZGYKK3NpemUgNTc2CmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vZ3VpL2ltYWdlcy90cmVlX2ljb25fZmlsZS5naWYgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZ3VpL2ltYWdlcy90cmVlX2ljb25fZmlsZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBkOGZlZgotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9ndWkvaW1hZ2VzL3RyZWVfaWNvbl9maWxlLmdpZgpAQCAtMCwwICsxLDMgQEAKK3ZlcnNpb24gaHR0cHM6Ly9naXQtbGZzLmdpdGh1Yi5jb20vc3BlYy92MQorb2lkIHNoYTI1Njo5MTJmOTQ2ZTdjYjRkYzI5ZWM1MmZlMDg5NTk1MTFiMWJiZjU4MmJiNDNlMjUyN2EyNDM5ZjEzN2IzMWZiMzBiCitzaXplIDI4NQpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2d1aS9pbWFnZXMvdHJlZV9pY29uX2dyb3VwLmdpZiBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9ndWkvaW1hZ2VzL3RyZWVfaWNvbl9ncm91cC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ3MWRhZAotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9ndWkvaW1hZ2VzL3RyZWVfaWNvbl9ncm91cC5naWYKQEAgLTAsMCArMSwzIEBACit2ZXJzaW9uIGh0dHBzOi8vZ2l0LWxmcy5naXRodWIuY29tL3NwZWMvdjEKK29pZCBzaGEyNTY6NmY2ZDIxMmY0NmRhMGVhMjA3NmNkYmNkMjIzNzZiM2U3MzgwNmNhNDFmYzNjZGU5NTU1NjAwODlkZTJkNTAwNAorc2l6ZSAzNjkKZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9ndWkvaW1hZ2VzL3RyZWVfaWNvbl9pdGVtLmdpZiBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9ndWkvaW1hZ2VzL3RyZWVfaWNvbl9pdGVtLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWZlNzY0Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2d1aS9pbWFnZXMvdHJlZV9pY29uX2l0ZW0uZ2lmCkBAIC0wLDAgKzEsMyBAQAordmVyc2lvbiBodHRwczovL2dpdC1sZnMuZ2l0aHViLmNvbS9zcGVjL3YxCitvaWQgc2hhMjU2OjgwYWFhMDk4YjVmNzZhYjIyNTM0ZTNlZTE0YzgwY2MyOWZmNDYyZjkxNGMxZTg3ZmU1MzY4MDg3OTg4MGZhOWIKK3NpemUgMjAwCmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vZ3VpL2ltYWdlcy90cmVlX2ljb25fbGFuZ3VhZ2UuZ2lmIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2d1aS9pbWFnZXMvdHJlZV9pY29uX2xhbmd1YWdlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWEyZWUxCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2d1aS9pbWFnZXMvdHJlZV9pY29uX2xhbmd1YWdlLmdpZgpAQCAtMCwwICsxLDMgQEAKK3ZlcnNpb24gaHR0cHM6Ly9naXQtbGZzLmdpdGh1Yi5jb20vc3BlYy92MQorb2lkIHNoYTI1NjpjZGZkNThjOGFmOWMwYmI4M2IzZmFkNjhlOTBjOGQ4ZjBjYWJhMjhmNTcxZWQyYWM2MmQ2YThjM2M0ODYwMTlmCitzaXplIDEwNzgKZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9ndWkvaW1hZ2VzL3RyZWVfaWNvbl9wcm9qZWN0LmdpZiBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9ndWkvaW1hZ2VzL3RyZWVfaWNvbl9wcm9qZWN0LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODEyMjI5Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2d1aS9pbWFnZXMvdHJlZV9pY29uX3Byb2plY3QuZ2lmCkBAIC0wLDAgKzEsMyBAQAordmVyc2lvbiBodHRwczovL2dpdC1sZnMuZ2l0aHViLmNvbS9zcGVjL3YxCitvaWQgc2hhMjU2OmIxYTkxZDNlZTc5MmIxZDE5YjVlMzRjMGNmMzIwN2I1ZjBiNzQ1ZmI1NTkxYzJjYjU2Y2ExZWFkNGQ5MDVhN2MKK3NpemUgMjkxCmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vZ3VpL2ltYWdlcy90cmVlX2ljb25fdmFyaWFudC5naWYgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vZ3VpL2ltYWdlcy90cmVlX2ljb25fdmFyaWFudC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAwMmI0MAotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9ndWkvaW1hZ2VzL3RyZWVfaWNvbl92YXJpYW50LmdpZgpAQCAtMCwwICsxLDMgQEAKK3ZlcnNpb24gaHR0cHM6Ly9naXQtbGZzLmdpdGh1Yi5jb20vc3BlYy92MQorb2lkIHNoYTI1Njo0ZmVkNmE0ODk4MjI4ZmRjZjk3YTk4MmZmNDNhNzkwMTQ5Mjk5YjdjYTkzZjJmNDJiNDNlNGU0ZWI1OGRlNjc5CitzaXplIDQ1MApkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2luc3RhbGwuYmF0IGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL2luc3RhbGwuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRmMzcwMTEKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vaW5zdGFsbC5iYXQKQEAgLTAsMCArMSw2NCBAQAorQGVjaG8gb2ZmCisKK3JlbSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorcmVtICogQ29weXJpZ2h0IChDKSAyMDAwLTIwMDIsIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kICAqCityZW0gKiBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK3JlbSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitjYWxsIGNvbXBpbGUuYmF0IC1PCisKK2VjaG8gKiBNYWtpbmcgRGlyZWN0b3JpZXMKKworbWtkaXIgemlwCitjZCB6aXAKK21rZGlyIGxpYgorbWtkaXIgZG9jcworY2QgZG9jcworbWtkaXIgSW1hZ2VzCitjZCBJbWFnZXMKK21rZGlyIFNjcmVlbnNob3RzCitjZCAuLgorbWtkaXIgVHV0b3JpYWwKK21rZGlyIFZpZXdzCitjZCAuLgorbWtkaXIgUmVwb3J0cworY2QgLi4KKworZWNobyAqIENvcHlpbmcgRmlsZXMKKworZWNobyAqKiBDb3B5aW5nIEJhdGNoIEZpbGVzIGFuZCBQcm9wZXJ0aWVzCisKK2NvcHkgUkJNYW5hZ2VyLmphciB6aXAKK2NvcHkgUkJSZXBvcnRlci5iYXQgemlwCitjb3B5IHJibWFuYWdlcl9zY2FubmVyLnhtbCB6aXAKK2NvcHkgcmVzb3VyY2VzXHByZWZlcmVuY2VzLnByb3BlcnRpZXMgemlwCithdHRyaWIgLXIgemlwL3ByZWZlcmVuY2VzLnByb3BlcnRpZXMKKworZWNobyAqKiBDb3B5aW5nIERvY3VtZW50YXRpb24KKworY2QgZG9jcworY29weSAqLmh0bWwgLi5cemlwXGRvY3NcCitjZCBJbWFnZXMKK2NvcHkgKi5naWYgLi5cLi5cemlwXGRvY3NcSW1hZ2VzXAorY29weSAqLmpwZyAuLlwuLlx6aXBcZG9jc1xJbWFnZXNcCitjZCBTY3JlZW5zaG90cworY29weSAqLmdpZiAuLlwuLlwuLlx6aXBcZG9jc1xJbWFnZXNcU2NyZWVuc2hvdHNcCitjb3B5ICouanBnIC4uXC4uXC4uXHppcFxkb2NzXEltYWdlc1xTY3JlZW5zaG90c1wKK2NkIC4uXC4uXFR1dG9yaWFsCitjb3B5ICouaHRtbCAuLlwuLlx6aXBcZG9jc1xUdXRvcmlhbFwKK2NkIC4uXFZpZXdzCitjb3B5ICouaHRtbCAuLlwuLlx6aXBcZG9jc1xWaWV3c1wKK2NkIC4uXC4uCisKK2VjaG8gKiogQ29weWluZyBKYXIgRmlsZXMKKworY2QgbGliCitjb3B5ICouamFyIC4uXHppcFxsaWJcCitjZCAuLgorCitlY2hvICoqIENvcHlpbmcgTGljZW5zZQorY29weSAuLlwuLlwuLlxsaWNlbnNlLmh0bWwgemlwCisKK0BlY2hvICogRGlyZWN0b3J5IGNyZWF0ZWQ6IHppcAorQGVjaG8gKiogRG9uJ3QgZm9yZ2V0IHRvIG1vZGlmeSBwcmVmZXJlbmNlcy5wcm9wZXJ0aWVzCitwYXVzZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9tYW5pZmVzdC5zdHViIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL21hbmlmZXN0LnN0dWIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc2NzQyOQotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9tYW5pZmVzdC5zdHViCkBAIC0wLDAgKzEsMTIgQEAKK01hbmlmZXN0LVZlcnNpb246IDEuMAorU3BlY2lmaWNhdGlvbi1UaXRsZTogUmVzb3VyY2UgQnVuZGxlIE1hbmFnZXIKK1NwZWNpZmljYXRpb24tVmVyc2lvbjogMC43LjEKK1NwZWNpZmljYXRpb24tVmVuZG9yOiBJQk0gQ29ycG9yYXRpb24KK0ltcGxlbWVudGF0aW9uLVRpdGxlOiBSZXNvdXJjZSBCdW5kbGUgTWFuYWdlcgorSW1wbGVtZW50YXRpb24tVmVyc2lvbjogMC43LjEKK0ltcGxlbWVudGF0aW9uLVZlbmRvcjogSUJNIENvcnBvcmF0aW9uCitJbXBsZW1lbnRhdGlvbi1WZW5kb3ItSWQ6IGNvbS5pYm0KK01haW4tQ2xhc3M6IGNvbS5pYm0ucmJtLlJCTWFuYWdlcgorQ2xhc3MtUGF0aDogbGliL3hlcmNlcy5qYXIKKworTmFtZTogY29tL2libS9yYm0KZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9wcmVmZXJlbmNlcy5wcm9wZXJ0aWVzIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL3ByZWZlcmVuY2VzLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBjZmU4MAotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9wcmVmZXJlbmNlcy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMzMgQEAKKyNSQk1hbmFnZXIgUHJlZmVyZW5jZXMKKyNGcmkgTWF5IDEwIDA4OjU3OjE5IFBEVCAyMDAyCityZXBvcnRlcl9mb3JtYXRfaHRtbF9maWxlPXJlcG9ydC5odG1sCit1c2VybmFtZT1Vbmtub3duCityZXBvcnRlcl9mb3JtYXRfdGV4dF9kZXRhaWw9SGlnaAorcmVwb3J0ZXJfZm9ybWF0X3htbF9kZXRhaWw9SGlnaAorcmVwb3J0ZXJfZm9ybWF0X2htdGxfZW5hYmxlZD1ZZXMKK3JlcG9ydGVyX2VuYWJsZWQ9WWVzCityZXBvcnRlcl9mb3JtYXRfeG1sX2ZpbGU9cmVwb3J0LnhtbAorcmVwb3J0ZXJfaW50ZXJ2YWxfZGVmaW5lZF9ob3VyPTEKK3JlcG9ydGVyX2ludGVydmFsX3NlcXVlbnRpYWxfdmFsdWU9MQorcmVwb3J0ZXJfaW50ZXJ2YWxfc2VxdWVudGlhbF91bml0cz1Ib3VycworcmVwb3J0ZXJfcGVyZm9ybV9zY2FuPVllcworcmVwb3J0ZXJfZm9ybWF0X3RleHRfZmlsZT1yZXBvcnQudHh0CityZXBvcnRlcl9mb3JtYXRfeG1sX2VuYWJsZWQ9WWVzCityZXBvcnRlcl9pbnRlcnZhbF9kZWZpbmVkX2RheT1TYXR1cmRheQorbG9jYWxlPWVuCityZXBvcnRlcl9pbnRlcnZhbD1TZXF1ZW50aWFsCityZWNlbnRmaWxlbG9jMz0KK3JlY2VudGZpbGVsb2MyPQorcmVjZW50ZmlsZWxvYzE9CityZWNlbnRmaWxlbG9jMD0KK3JlcG9ydGVyX3NjYW5fZmlsZT0uL3JibWFuYWdlcl9zY2FubmVyLnhtbAorcmVwb3J0ZXJfZm9ybWF0X2h0bWxfZW5hYmxlZD1ZZXMKK3JlY2VudGZpbGVpZDM9CityZWNlbnRmaWxlaWQyPQorcmVjZW50ZmlsZWlkMT0KK3JlY2VudGZpbGVpZDA9CityZXBvcnRlcl9pbnRlcnZhbF9kZWZpbmVkX21pbnV0ZT0wMAorcmVwb3J0ZXJfZm9ybWF0X3RleHRfZW5hYmxlZD1ZZXMKK3JlcG9ydGVyX2Jhc2VfY2xhc3NfZmlsZT0KK3JlcG9ydGVyX291dHB1dF9kaXJlY3Rvcnk9CityZXBvcnRlcl9mb3JtYXRfaHRtbF9kZXRhaWw9SGlnaApkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL3JibWFuYWdlcl9zY2FubmVyLnhtbCBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9yYm1hbmFnZXJfc2Nhbm5lci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNkYWIyOQotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9yYm1hbmFnZXJfc2Nhbm5lci54bWwKQEAgLTAsMCArMSwyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiA/PiAKKzxSQkZpbGVTY2FubmVyIG5hbWU9IlJCTWFuYWdlciBTY2FubmVyIiBmaWxlbmFtZT0icmJtYW5hZ2VyX3NjYW5uZXIueG1sIj4KKwk8RmlsZVJ1bGVzPgorCQk8IS0tICBGaWxlUnVsZXMgY2FuIGhhdmUgYXR0cmlidXRlcyBzdGFydHNfd2l0aCwgZW5kc193aXRoLCBhbmQgY29udGFpbnMgLS0+IAorCQk8RmlsZVJ1bGUgbmFtZT0iSmF2YSBGaWxlIiBlbmRzX3dpdGg9Ii5qYXZhIiAvPiAKKwkJPEZpbGVSdWxlIG5hbWU9IlhTTCBGaWxlIiBlbmRzX3dpdGg9Ii54c2wiIC8+IAorCTwvRmlsZVJ1bGVzPgorCTxQYXJzZVJ1bGVzPgorCQk8IS0tICBQYXJzZVJ1bGVzIGNhbiBoYXZlIGF0dHJpYnV0ZXMgZm9sbG93cyBhbmQgcHJlY2VkZXMgLS0+IAorCQk8UGFyc2VSdWxlIG5hbWU9IkphdmEgc3RhdGljIHJlc291cmNlIiBmb2xsb3dzPSJSZXNvdXJjZXMuZ2V0VHJhbnNsYXRpb24oJnF1b3Q7IiBwcmVjZWRlcz0iJnF1b3Q7IiAvPgorCTwvUGFyc2VSdWxlcz4KKwk8U2Nhbj4KKwkJPERpcmVjdG9yeSBsb2NhdGlvbj0iLiIgcmVjdXJzZV9kaXJlY3Rvcmllcz0idHJ1ZSI+CisJCQk8UnVsZXM+CisJCQkJPEFwcGx5RmlsZVJ1bGUgbmFtZT0iSmF2YSBGaWxlIj4KKwkJCQkJPEFwcGx5UGFyc2VSdWxlIG5hbWU9IkphdmEgc3RhdGljIHJlc291cmNlIiAvPgorCQkJCTwvQXBwbHlGaWxlUnVsZT4KKwkJCTwvUnVsZXM+CisJCTwvRGlyZWN0b3J5PgorCTwvU2Nhbj4KKzwvUkJGaWxlU2Nhbm5lcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vcmVhZG1lLnR4dCBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9yZWFkbWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxOGYxZTgKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vcmVhZG1lLnR4dApAQCAtMCwwICsxLDEyIEBACitUaGlzIGRpcmVjdG9yeSBjb250YWlucyB0aGUgUkJNYW5hZ2VyIChSZXNvdXJjZSBCdW5kbGUgTWFuYWdlcikKKworVG8gcnVuIHRoZSBSQk1hbmFnZXIuamFyLCBkb3VibGUgY2xpY2sgb24gUkJNYW5hZ2VyLmphciBpbiBXaW5kb3dzCisJb3IgcnVuICJqYXZhIC1qYXIgUkJNYW5hZ2VyLmphciIgZnJvbSB0aGUgY29tbWFuZCBsaW5lLgorVG8gY3JlYXRlIHRoZSBSQk1hbmFnZXIuamFyIGZpbGUsIHVzZTogY29tcGlsZS5iYXQKK1RvIGNyZWF0ZSB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSwgdXNlOiBpbnN0YWxsLmJhdAorCitIZWxwIGFuZCBkb2N1bWVudGF0aW9uIGFyZSBjb250YWluZWQgaW4gdGhlIGRvY3MgZGlyZWN0b3J5LgorCitUaGlzIHZlcnNpb24gb2YgdGhlIFJCTWFuYWdlciByZXF1aXJlcyB2ZXJzaW9uIDMuMS4wIG9mIHRoZQoreGVyY2VzLmphciBmaWxlIHRvIGNvbXBpbGUsIGJ1dCBkb2VzIG5vdCByZXF1aXJlIGl0IGZvciBiYXNpYworZnVuY3Rpb25hbGl0eS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vcmVzb3VyY2VzL1JCTWFuYWdlci5wcm9wZXJ0aWVzIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL3Jlc291cmNlcy9SQk1hbmFnZXIucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGNiNjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL3Jlc291cmNlcy9SQk1hbmFnZXIucHJvcGVydGllcwpAQCAtMCwwICsxLDEyMTMgQEAKKyMgQGZpbGUgICAgICAgICAgUmVzb3VyY2UgQnVuZGxlIE1hbmFnZXIgQmFzZSBDbGFzcworIyBAZmlsZUVuY29kaW5nICAKKyMgQGZpbGVMYW5ndWFnZSAgRW5nbGlzaAorIyBAZmlsZUNvdW50cnkgICBVLlMuCisjIEBmaWxlVmFyaWFudCAgIAorIyBAZmlsZU1hbmFnZXIgICBKYXJlZCBKYWNrc29uCisjIEBmaWxlQ29tbWVudCAgIFRoaXMgaXMgdGhlIEJhc2UgQ2xhc3Mgb2YgdGhlIHRyYW5zbGF0aW9uIHJlc291cmNlIGJ1bmRsZSB1c2VkIGJ5IHRoaXMgYXBwbGljYXRpb24KKworCisjCisjIEBncm91cCBCYXNlIENsYXNzIEdyb3VwcyBQYW5lCisjCisjIEBncm91cENvbW1lbnQgVHJhbnNsYXRpb24gSXRlbXMgZm9yIHRoZSBCYXNlIENsYXNzIEdyb3VwIHRhYmJlZCBwYW5lCisKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCAKK2Jhc2Vncm91cF9ncm91cF9jb21tZW50PUdyb3VwXCBDb21tZW50XDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCAKK2Jhc2Vncm91cF9ncm91cF9uYW1lPUdyb3VwXCBOYW1lXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCAKK2Jhc2Vncm91cF9ncm91cF9vcHRpb25zPVJlc291cmNlXCBHcm91cFwgT3B0aW9ucworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IAorYmFzZWdyb3VwX2l0ZW1fb3B0aW9ucz1SZXNvdXJjZVwgSXRlbVwgT3B0aW9ucworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IAorYmFzZXN0YXRzX2ZpbGVfZ3JvdXA9UmVzb3VyY2VcIEZpbGVzCisKKyMKKyMgQGdyb3VwIEJhc2UgQ2xhc3MgU3RhdGlzdGljcyBQYW5lCisjCisjIEBncm91cENvbW1lbnQgQWxsIHRyYW5zbGF0aW9ucyBmb3Igc3RyaW5ncyBhcHBlYXJpbmcgb24gdGhlIHN0YXRpc3RpY3MgcGFuZSBmb3IgdGhlIGJhc2UgY2xhc3MKKworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IAorYmFzZXN0YXRzX2R1cGxpY2F0ZXNfY291bnQ9TnVtYmVyXCBvZlwgRHVwbGljYXRlXCBSZXNvdXJjZVwgS2V5c1w6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgCitiYXNlc3RhdHNfZmlsZV9jb3VudD1OdW1iZXJcIG9mXCBSZXNvdXJjZVwgRmlsZXNcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IAorYmFzZXN0YXRzX2dyb3VwX2NvdW50PU51bWJlclwgb2ZcIFJlc291cmNlXCBHcm91cHNcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IAorYmFzZXN0YXRzX2dyb3VwX2dyb3VwPVJlc291cmNlXCBHcm91cHMKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCAKK2Jhc2VzdGF0c19pdGVtX2NvdW50PU51bWJlclwgb2ZcIFJlc291cmNlXCBJdGVtc1w6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgCitiYXNlc3RhdHNfaXRlbV9ncm91cD1SZXNvdXJjZVwgSXRlbXMKKworIworIyBAZ3JvdXAgQmFzZSBDbGFzcyBVbnRyYW5zbGF0ZWQgSXRlbXMgUGFuZQorIworIyBAZ3JvdXBDb21tZW50IFRyYW5zbGF0aW9ucyBhcHBlYXJpbmcgb24gdGhlIEJhc2UgQ2xhc3MgVW50cmFuc2xhdGVkIEl0ZW1zIHBhbmUKKworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IEluZGljYXRpb24gb2YgdGhlIGZpbGUgYmVpbmcgdmlld2VkCitiYXNldW50cmFuc19maWxlPUZpbGVcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IEluZGljYXRpb24gb2YgdGhlIG51bWJlciBvZiByZXNvdXJjZSBpdGVtcyBub3QgdHJhbnNsYXRlZCBpbiB0aGUgZmlsZQorYmFzZXVudHJhbnNfdW50cmFuc19jb3VudD1OdW1iZXJcIG9mXCBVbnRyYW5zbGF0ZWRcIEl0ZW1zXDoKKworIworIyBAZ3JvdXAgQnV0dG9uIE5hbWVzCisjCisjIEBncm91cENvbW1lbnQgVGhlIG5hbWVzIGRpc3BsYXllZCBvbiB0aGUgdmFyaW91cyBidXR0b25zCisKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCBCdXR0b24gZm9yIGNyZWF0aW5nIGEgbmV3IHJlc291cmNlIGxhbmd1YWdlIGZpbGUKK2J1dHRvbl9hZGRfZmlsZT1BZGRcIGFcIE5ld1wgUmVzb3VyY2VcIEZpbGUKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTIzIEBtb2RpZmllZCAyMDAxLTAxLTIzIEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCitidXR0b25fYWRkX2ZpbGVfdHJpZ2dlcj1uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgQnV0dG9uIGZvciBjcmVhdGluZyBhIG5ldyByZXNvdXJjZSBncm91cAorYnV0dG9uX2FkZF9ncm91cD1BZGRcIGFcIE5ld1wgUmVzb3VyY2VcIEdyb3VwCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yMyBAbW9kaWZpZWQgMjAwMS0wMS0yMyBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorYnV0dG9uX2FkZF9ncm91cF90cmlnZ2VyPWcKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCBCdXR0b24gZm9yIGNyZWF0aW5nIGEgbmV3IHJlc291cmNlIHRyYW5zbGF0aW9uIGl0ZW0KK2J1dHRvbl9hZGRfcmVzb3VyY2U9QWRkXCBhXCBOZXdcIFJlc291cmNlXCBJdGVtCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yMyBAbW9kaWZpZWQgMjAwMS0wMS0yMyBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorYnV0dG9uX2FkZF9yZXNvdXJjZV90cmlnZ2VyPXIKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIGEgQG1vZGlmaWVyIGEKKyMgQGNvbW1lbnQgR2VuZXJpYyBidXR0b24gZm9yIGNhbmNlbGluZyBhY3Rpb25zCitidXR0b25fY2FuY2VsPUNhbmNlbAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjYgQG1vZGlmaWVkIDIwMDEtMDEtMjYgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBHZW5lcmljIGJ1dHRvbiBmb3IgYSBjaG9pY2Ugb3Igc2VsZWN0aW9uIG9wdGlvbgorYnV0dG9uX2Nob29zZT1DaG9vc2UKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTI2IEBtb2RpZmllZCAyMDAxLTAxLTI2IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCitidXR0b25fY2hvb3NlX3RyaWdnZXI9YworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IEJ1dHRvbiBmb3IgZ2VuZXJpYyBjcmVhdGlvbiBvZiBncm91cHMsIGl0ZW1zLCBmaWxlcywgZXRjLgorYnV0dG9uX2NyZWF0ZT1DcmVhdGUKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIGEgQG1vZGlmaWVyIGEKKyMgQGNvbW1lbnQgRm9yIGNyZWF0aW9uIG9mIGEgcmVzb3VyY2UgZ3JvdXAKK2J1dHRvbl9jcmVhdGVfZ3JvdXA9Q3JlYXRlXCBHcm91cAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjMgQG1vZGlmaWVkIDIwMDEtMDEtMjMgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK2J1dHRvbl9jcmVhdGVfZ3JvdXBfdHJpZ2dlcj1nCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wMiBAbW9kaWZpZWQgMjAwMS0wMi0wMiBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEJ1dHRvbiB0aXRsZSBmb3IgY3JlYXRpbmcgYW4gaXRlbSB0aGVuIGNvbnRpbnVpbmcgY3JlYXRpbmcgbW9yZSBpdGVtcworYnV0dG9uX2NyZWF0ZV9tb3JlPUNyZWF0ZVwgJlwgQ29udGludWUKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTAyIEBtb2RpZmllZCAyMDAxLTAyLTAyIEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCitidXR0b25fY3JlYXRlX21vcmVfdHJpZ2dlcj1yCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBhIEBtb2RpZmllciBhCisjIEBjb21tZW50IEJ1dHRvbiBmb3IgY3JlYXRpbmcgYSByZXNvdXJjZSB0cmFuc2xhdGlvbiBpdGVtCitidXR0b25fY3JlYXRlX3Jlc291cmNlPUNyZWF0ZVwgUmVzb3VyY2UKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTIzIEBtb2RpZmllZCAyMDAxLTAxLTIzIEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCitidXR0b25fY3JlYXRlX3Jlc291cmNlX3RyaWdnZXI9YworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDIgQG1vZGlmaWVkIDIwMDEtMDItMDIgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK2J1dHRvbl9jcmVhdGVfdHJpZ2dlcj1jCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBhIEBtb2RpZmllciBhCisjIEBjb21tZW50IEJ1dHRvbiBmb3IgcmVtb3ZpbmcgYSBncm91cCBhbmQgaXRzIGNvbnRlbnRzCitidXR0b25fZGVsZXRlX2dyb3VwPURlbGV0ZVwgR3JvdXAKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIGEgQG1vZGlmaWVyIGEKKyMgQGNvbW1lbnQgQnV0dG9uIGZvciBwZXJtYW5lbnRseSByZW1vdmluZyBhIHJlc291cmNlIGZyb20gdGhlIGJ1bmRsZQorYnV0dG9uX2RlbGV0ZV9yZXNvdXJjZT1EZWxldGVcIFJlc291cmNlCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yMyBAbW9kaWZpZWQgMjAwMS0wMS0yMyBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorYnV0dG9uX2RlbGV0ZV9yZXNvdXJjZV90cmlnZ2VyPWQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCBHZW5lcmljIGVkaXQgYnV0dG9uCitidXR0b25fZWRpdD1FZGl0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBhIEBtb2RpZmllciBhCisjIEBjb21tZW50IEJ1dHRvbiBmb3IgZWRpdGluZyBncm91cCBuYW1lIGFuZCBjb21tZW50CitidXR0b25fZWRpdF9ncm91cD1FZGl0XCBHcm91cAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgYSBAbW9kaWZpZXIgYQorIyBAY29tbWVudCBCdXR0b24gZm9yIGVkaXRpbmcgcmVzb3VyY2UgaW5mb3JtYXRpb24sIGluY2x1ZGluZyBrZXkgYW5kIHRyYW5zbGF0aW9uCitidXR0b25fZWRpdF9yZXNvdXJjZT1FZGl0XCBSZXNvdXJjZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjMgQG1vZGlmaWVkIDIwMDEtMDEtMjMgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK2J1dHRvbl9lZGl0X3Jlc291cmNlX3RyaWdnZXI9ZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjYgQG1vZGlmaWVkIDIwMDEtMDEtMjYgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBCdXR0b24gdGl0bGUgZm9yIGluaXRpYXRpbmcgYW4gaW1wb3J0IG9mIHJlc291cmNlcyBmcm9tIGFuIGFsdGVybmF0ZSBzb3VyY2UKK2J1dHRvbl9pbXBvcnQ9SW1wb3J0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yNiBAbW9kaWZpZWQgMjAwMS0wMS0yNiBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorYnV0dG9uX2ltcG9ydF90cmlnZ2VyPWkKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTIzIEBtb2RpZmllZCAyMDAxLTAxLTIzIEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgQnV0dG9uIGFsbG93cyBhIHNlbGVjdGVkIHJlc291cmNlIHRvIGJlIG1hcmtlZCBhcyB0cmFuc2xhdGVkIHdpdGhvdXQgZnVydGhlciBlZGl0aW5nCitidXR0b25fbWFya190cmFuc2xhdGVkPU1hcmtcIFJlc291cmNlXCBhc1wgVHJhbnNsYXRlZAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjMgQG1vZGlmaWVkIDIwMDEtMDEtMjMgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK2J1dHRvbl9tYXJrX3RyYW5zbGF0ZWRfdHJpZ2dlcj10CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMS0yMCBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IEJ1dHRvbiBmb3IgYWRkaW5nIHRoZSBjdXJyZW50IHJlc291cmNlIGJ1bmRsZSBpbiB0aGUgbWFpbiBhcHBsaWNhdGlvbiB0byB0aGUgcHJvamVjdAorYnV0dG9uX3Byb2plY3RfYWRkPUFkZFwgQ3VycmVudFwgQnVuZGxlCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMS0yMCBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IAorYnV0dG9uX3Byb2plY3RfYWRkX3RyaWdnZXI9YQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTEtMjAgQG1vZGlmaWVkIDIwMDEtMTEtMjAgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBCdXR0b24gZm9yIGNsb3NpbmcgdGhlIHByb2plY3Qgd2luZG93CitidXR0b25fcHJvamVjdF9jbG9zZT1DbG9zZVwgUHJvamVjdAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTEtMjAgQG1vZGlmaWVkIDIwMDEtMTEtMjAgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCAKK2J1dHRvbl9wcm9qZWN0X2Nsb3NlX3RyaWdnZXI9YworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTEtMjAgQG1vZGlmaWVkIDIwMDEtMTEtMjAgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBCdXR0b24gZm9yIGNyZWF0aW5nIGEgbmV3IHJlc291cmNlIGJ1bmRsZSBwcm9qZWN0CitidXR0b25fcHJvamVjdF9uZXc9TmV3XCBQcm9qZWN0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMS0yMCBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IAorYnV0dG9uX3Byb2plY3RfbmV3X3RyaWdnZXI9bgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTEtMjAgQG1vZGlmaWVkIDIwMDEtMTEtMjAgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBCdXR0b24gZm9yIG9wZW5pbmcgYSBwcm9qZWN0IGZpbGUKK2J1dHRvbl9wcm9qZWN0X29wZW49T3BlblwgUHJvamVjdAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTEtMjAgQG1vZGlmaWVkIDIwMDEtMTEtMjAgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCAKK2J1dHRvbl9wcm9qZWN0X29wZW5fdHJpZ2dlcj1vCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMS0yMCBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IEJ1dHRvbiBmb3IgcmVtb3ZpbmcgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCByZXNvdXJjZSBidW5kbGUgZnJvbSB0aGUgcHJvamVjdAorYnV0dG9uX3Byb2plY3RfcmVtb3ZlPVJlbW92ZVwgU2VsZWN0aW9uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMS0yMCBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IAorYnV0dG9uX3Byb2plY3RfcmVtb3ZlX3RyaWdnZXI9cgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTEtMjAgQG1vZGlmaWVkIDIwMDEtMTEtMjAgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBCdXR0b24gZm9yIGNhdXNpbmcgdGhlIHNlbGVjdGVkIHJlc291cmNlIGJ1bmRsZSB0byBiZSB0aGUgb25lIGJlaW5nIGVkaXRlZCBpbiB0aGUgbWFpbiBhcHBsaWNhdGlvbgorYnV0dG9uX3Byb2plY3Rfc2VsZWN0PUVkaXRcIFNlbGVjdGVkCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMS0yMCBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IAorYnV0dG9uX3Byb2plY3Rfc2VsZWN0X3RyaWdnZXI9ZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDYgQG1vZGlmaWVkIDIwMDEtMDItMDYgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUaXRsZSBmb3IgcGVyZm9ybWluZyBhIGNvbXBsZXRlIHNlYXJjaAorYnV0dG9uX3NlYXJjaF9maW5kX2FsbD1GaW5kXCBBbGwKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTA2IEBtb2RpZmllZCAyMDAxLTAyLTA2IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCitidXR0b25fc2VhcmNoX2ZpbmRfYWxsX3RyaWdnZXI9ZgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDYgQG1vZGlmaWVkIDIwMDEtMDItMDYgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUaXRsZSBmb3IgcGVyZm9ybWluZyBjb21wbGV0ZSBzZWFyY2ggYW5kIHJlcGxhY2UKK2J1dHRvbl9zZWFyY2hfcmVwbGFjZV9hbGw9UmVwbGFjZVwgQWxsCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wNiBAbW9kaWZpZWQgMjAwMS0wMi0wNiBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorYnV0dG9uX3NlYXJjaF9yZXBsYWNlX2FsbF90cmlnZ2VyPXIKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCBHZW5lcmljIGJ1dHRvbiBmb3IgdXBkYXRpbmcgaW5mb3JtYXRpb24KK2J1dHRvbl91cGRhdGU9VXBkYXRlCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yMyBAbW9kaWZpZWQgMjAwMS0wMS0yMyBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorYnV0dG9uX3VwZGF0ZV90cmlnZ2VyPXUKKworIworIyBAZ3JvdXAgRGlhbG9ncworIworIyBAZ3JvdXBDb21tZW50IFRyYW5zbGF0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIGFwcGxpY2F0aW9ucyB2YXJpb3VzIGRpYWxvZyBib3hlcworCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgSW5kaWNhdGlvbiBvZiB3ZXRoZXIgb3Igbm90IGEgbmV3IGZpbGUgd2lsbCBiZSBwb3B1bGF0ZWQgZnJvbSB0aGUgZWxlbWVudHMgaW4gdGhlIGJhc2UgY2xhc3MKK2RpYWxvZ19jaGVja2JveF9jb3B5X2VsZW1lbnRzPUNvcHlcIGVudHJpZXNcIGZyb21cIHRoZVwgYmFzZVwgY2xhc3NcIHRvXCB0aGVcIG5ld1wgZmlsZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IEluZGljYXRvciBvZiB3ZXRoZXIgYW4gaXRlbSBpcyB0cmFuc2xhdGVkIG9yIG5vdAorZGlhbG9nX2NoZWNrYm94X3RyYW5zbGF0ZWQ9VHJhbnNsYXRlZAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IAorZGlhbG9nX2NvbW1lbnQ9Q29tbWVudFw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgCitkaWFsb2dfY291bnRyeT1Db3VudHJ5CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgCitkaWFsb2dfY3JlYXRlZD1DcmVhdGVkXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCAKK2RpYWxvZ19jcmVhdG9yPUNyZWF0ZWRcIEJ5XDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAezF9IFRoZSBkYXRlCisjIEB7MH0gVGhlIG5hbWUgb2YgdGhlIHBlcnNvbiBpbnZvbHZlZAorIyBAY29tbWVudCBUaGUgZGF0ZSBhbmQgcGVyc29uIGFzc29jaWF0ZWQgd2l0aCBhIGNyZWF0aW9uIG9yIG1vZGlmaWNhdGlvbiBvZiBhbiBpdGVtCitkaWFsb2dfZGF0ZV9wZXJzb249ezB9XCBieVwgezF9CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgCitkaWFsb2dfZGVmYXVsdF9jb21tZW50PURlZmF1bHRcIENvbW1lbnRcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IAorZGlhbG9nX2RlZmF1bHRfdHJhbnNsYXRpb249RGVmYXVsdFwgVHJhbnNsYXRpb25cOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IAorZGlhbG9nX2RlbGV0ZV9maWxlPURlbGV0ZVwgYVwgUmVzb3VyY2VcIEZpbGUKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCAKK2RpYWxvZ19kZWxldGVfZ3JvdXA9RGVsZXRlXCBhXCBSZXNvdXJjZVwgR3JvdXAKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCAKK2RpYWxvZ19kZWxldGVfaXRlbT1EZWxldGVcIGFcIFJlc291cmNlXCBJdGVtCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wNi0yNyBAbW9kaWZpZWQgMjAwMS0wNi0yNyBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IFdhcm5pbmcgZGlzcGxheWVkIHdoZW4gYSB1c2VyIGFza3MgZm9yIGEgZGVsZXRpb24gb2YgYSBmaWxlLiBQcm9tcHRzIGZvciAnWWVzJyBvciAnTm8nCitkaWFsb2dfZGVsZXRlX3dhcm5pbmc9V2FybmluZ1whXCBUaGVcIGRlbGV0aW9uXCBvcGVyYXRpb25cIGNhblwgbm9cIGJlXCB1bmRvbmUuXG5BcmVcIHlvdVwgc3VyZVwgeW91XCB3YW50XCB0b1wgY29udGludWU/CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgCitkaWFsb2dfZW5jb2Rpbmc9RW5jb2RpbmdcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IAorZGlhbG9nX2ZpbGVfY29tbWVudD1SZXNvdXJjZVwgRmlsZVwgQ29tbWVudFw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgCitkaWFsb2dfZmlsZV9maWx0ZXJfZGVzY3JpcHRpb249QmFzZVwgQ2xhc3NcIFByb3BlcnR5XCBGaWxlcworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDYgQG1vZGlmaWVkIDIwMDEtMDItMDYgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBEZXNjcmlwdGlvbiBvZiBGaWxlIEZpbHRlciBmb3IgUkJSZXBvcnRlciBYTUwgc2NhbiBjb25maWd1cmF0aW9uIGZpbGVzCitkaWFsb2dfZmlsZV9maWx0ZXJfZGVzY3JpcHRpb25fc2Nhbj1YTUxcIFJCUmVwb3J0ZXJcIFNjYW5cIEZpbGVzCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgCitkaWFsb2dfZmlsZV9pbmZvPUZpbGVcIEluZm9ybWF0aW9uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgCitkaWFsb2dfZmlsZV9tYW5hZ2VyPVJlc291cmNlXCBNYW5hZ2VyXCBOYW1lXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCAKK2RpYWxvZ19maWxlX3RpdGxlPVJlc291cmNlXCBGaWxlXCBUaXRsZVw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgCitkaWFsb2dfZ3JvdXA9R3JvdXBcIE5hbWVcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IAorZGlhbG9nX2dyb3VwX2NvbW1lbnQ9R3JvdXBcIENvbW1lbnRcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IAorZGlhbG9nX2tleT1FbnRyeVwgS2V5XDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCAKK2RpYWxvZ19sYW5ndWFnZT1MYW5ndWFnZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IAorZGlhbG9nX2xvb2t1cHM9TG9va3Vwc1w6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgCitkaWFsb2dfbW9kaWZpZWQ9TGFzdFwgTW9kaWZpZWRcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IAorZGlhbG9nX21vZGlmaWVyPUxhc3RcIE1vZGlmaWVkXCBCeVw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgVGhlIG5hbWUgb2YgYSBsYW5ndWFnZSwgY291bnRyeSwgb3IgdmFyaWFudCBvZiBhIGxhbmd1YWdlIGZpbGUKK2RpYWxvZ19uYW1lPU5hbWVcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IFByb21wdHMgdGhlIHVzZXIgdG8gZW50ZXIgYSBuYW1lIGZvciB0aGUgcmVzb3VyY2UgYnVuZGxlLCBiZWZvcmUgY3JlYXRpbmcgdGhhdCBidW5kbGUKK2RpYWxvZ19uZXdfYmFzZWNsYXNzPVBsZWFzZVwgZW50ZXJcIGFcIGJhc2VcIGNsYXNzXCBuYW1lXCBmb3JcIHRoZVwgbmV3XCByZXNvdXJjZVwgYnVuZGxlLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTkgQG1vZGlmaWVkIDIwMDEtMTItMTkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBEaWFsb2cgcG9wdXAgd2luZG93IHRleHQgcHJvbXB0aW5nIHRoZSB1c2VyIGZvciB0aGUgbmFtZSBvZiBhIHJlc291cmNlIGJ1bmRsZSBwcm9qZWN0CitkaWFsb2dfbmV3X3Byb2plY3Q9UGxlYXNlXCBlbnRlclwgYVwgdGl0bGVcIGZvclwgeW91clwgbmV3XCBSZXNvdXJjZVwgQnVuZGxlXCBQcm9qZWN0LgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IEEgZGVzY3JpcHRpb24gb2YgdGhlIGZpbGVzIG1ha2luZyBpdCB0aHJvdWdoIHRoZSBmaWx0ZXIgdXBvbiBvcGVuaW5nIGEgcmVzb3VyY2UgYnVuZGxlCitkaWFsb2dfb3Blbl9maWxlX2ZpbHRlcj1CYXNlXCBDbGFzc1wgUHJvcGVydHlcIEZpbGVzCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgVGhpcyBpcyBhIHNlY3Rpb24gaGVhZGluZyBmb3Igc2V0dGluZyB0aGUgbG9jYWxlCitkaWFsb2dfcHJlZmVyZW5jZXNfbG9jYWxlPUxvY2FsZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IExvY2FsZXMgY3VycmVudGx5IGRlZmluZWQgaW4gdGhlIHByb3BlcnRpZXMgZmlsZXMgZm9yIHRoZSBhcHBsaWNhdGlvbgorZGlhbG9nX3ByZWZlcmVuY2VzX2xvY2FsZV9kZWZpbmVkPURlZmluZWRcIGZvclwgUkJNYW5hZ2VyXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA3IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCitkaWFsb2dfcHJlZmVyZW5jZXNfbG9jYWxlX2lzbz1JU09cIFN0YW5kYXJkc1w6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgTG9jYWxlcyB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgdGhlIGhvc3QgSmF2YSBWaXJ0dWFsIE1hY2hpbmUKK2RpYWxvZ19wcmVmZXJlbmNlc19sb2NhbGVfbWFjaGluZT1NYWNoaW5lXCBTdXBwb3J0ZWRcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDcgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK2RpYWxvZ19wcmVmZXJlbmNlc19sb2NhbGVfd2FybmluZz1OT1RFXDpcIExvY2FsZVwgY2hhbmdlc1wgYXJlXCBub3RcIGFwcGxpZWRcIHVudGlsXCBhcHBsaWNhdGlvblwgaXNcIHJlc3RhcnRlZAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IAorZGlhbG9nX3ByZWZlcmVuY2VzX2xvb2thbmRmZWVsPUxvb2tcIEFuZFwgRmVlbFw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgCitkaWFsb2dfcHJlZmVyZW5jZXNfdXNlcm5hbWU9VXNlclwgTmFtZVw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMS0yMCBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IERlc2NyaXB0b3IgdGhhdCBnb2VzIGludG8gR1VJIGZpbGUgY2hvb3NlcgorZGlhbG9nX3Byb2plY3RfZmlsZV9maWx0ZXJfZGVzY3JpcHRpb249UkJNYW5hZ2VyXCBQcm9qZWN0XCBGaWxlcworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMTItMTcgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBGaWxlIEZpbHRlciBkZXNjcmlwdGlvbiBmb3IgcmVzb3VyY2UgYnVuZGxlIHByb2plY3QgZmlsZXMKK2RpYWxvZ19wcm9qZWN0X2ZpbHRlcl9kZXNjcmlwdGlvbj1SZXNvdXJjZVwgQnVuZGxlXCBQcm9qZWN0cworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTEtMjAgQG1vZGlmaWVkIDIwMDEtMTEtMjAgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBBbiBpbmRpY2F0aW9uIHRoYXQgbm8gcHJvamVjdCBpcyBvcGVuLCBwbGFjZWQgaW4gdGhlIHRpdGxlIG9mIHRoZSBkaWFsb2cgd2hlcmUgdGhlIHByb2plY3QgbmFtZSB3b3VsZCBub3JtYWxseSBnbworZGlhbG9nX3Byb2plY3Rfbm9uZV9zZWxlY3RlZD1Ob1wgQWN0aXZlXCBQcm9qZWN0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMS0yMCBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEB7MH0gVGhlIG5hbWUgb2YgdGhlIHByb2plY3QKKyMgQGNvbW1lbnQgVGl0bGUgZm9yIHRoZSB3aW5kb3cgc2hvd2luZyBhbGwgdGhlIHJlc291cmNlIGJ1bmRsZXMgaW4gYSBwcm9qZWN0CitkaWFsb2dfcHJvamVjdF90aXRsZT1SZXNvdXJjZVwgQnVuZGxlXCBQcm9qZWN0XDpcIHswfQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IFByb21wdHMgdGhlIHVzZXIgaWYgdGhleSB3b3VsZCBsaWtlIHRvIHNhdmUgY2hhbmdlcyBiZWZvcmUgZXhpdGluZworZGlhbG9nX3F1aXRfc2F2ZT1Xb3VsZFwgeW91XCBsaWtlXCB0b1wgc2F2ZVwgeW91clwgY2hhbmdlc1wgYmVmb3JlXCBxdWl0aW5nXCBSQk1hbmFnZXI/CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0xMCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEEgZ2VuZXJpYyBwcm9wbXB0IHRvIGFzayB0aGUgdXNlciBpZiB0aGV5IHdpc2ggdG8gc2F2ZSBjaGFuZ2VzCitkaWFsb2dfc2F2ZT1Xb3VsZFwgeW91XCBsaWtlXCB0b1wgc2F2ZVwgeW91clwgY2hhbmdlc1wgdG9cIHRoZVwgcmVzb3VyY2VcIGJ1bmRsZT8KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCAKK2RpYWxvZ19zZWFyY2hfb3B0aW9ucz1TZWFyY2hcIE9wdGlvbnMKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCAKK2RpYWxvZ19zZWFyY2hfcGFyYW09U2VhcmNoXCBGb3JcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IFRoZSB0aXRsZSBvZiB0aGUgYWJvdXQgZGlhbG9nIGJveAorZGlhbG9nX3RpdGxlX2Fib3V0X3JibWFuYWdlcj1BYm91dFwgUkJNYW5hZ2VyCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yMiBAbW9kaWZpZWQgMjAwMS0wMS0yMiBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFRpdGxlIGZvciBkaWFsb2cgcHJvbXB0aW5nIGZvciBkZWxldGlvbiBvZiBhbiBlbnRpcmUgcmVzb3VyY2UgZ3JvdXAKK2RpYWxvZ190aXRsZV9kZWxldGVfZ3JvdXA9RGVsZXRlXCBSZXNvdXJjZVwgR3JvdXAKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTIyIEBtb2RpZmllZCAyMDAxLTAxLTIyIEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgVGl0bGUgd2hlbiBwcm9tcHRpbmcgdG8gZGVsZXRlIGEgcmVzb3VyY2UKK2RpYWxvZ190aXRsZV9kZWxldGVfaXRlbT1EZWxldGVcIFJlc291cmNlCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgCitkaWFsb2dfdGl0bGVfZWRpdF9ncm91cD1FZGl0XCBhXCBSZXNvdXJjZVwgR3JvdXAKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCAKK2RpYWxvZ190aXRsZV9lZGl0X2l0ZW09RWRpdFwgYVwgUmVzb3VyY2VcIEl0ZW0KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE5IEBtb2RpZmllZCAyMDAxLTEyLTE5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgCitkaWFsb2dfdGl0bGVfZXJyb3I9RXJyb3IKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCAKK2RpYWxvZ190aXRsZV9lcnJvcl9jcmVhdGluZ19idW5kbGU9RXJyb3JcIENyZWF0aW5nXCBSZXNvdXJjZVwgQnVuZGxlCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yMiBAbW9kaWZpZWQgMjAwMS0wMS0yMiBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IERpYWxvZyB0aXRsZSB3aGVuIG9wZW5pbmcgYSByZXNvdXJjZSBidW5kbGUgbm90IGNyZWF0ZWQgYnkgUkJNYW5hZ2VyCitkaWFsb2dfdGl0bGVfZXJyb3Jfbm90X3JibWFuYWdlcl9mb3JtYXQ9RXJyb3JcOlwgVW5yZWFkYWJsZVwgUmVzb3VyY2VcIEJ1bmRsZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDYtMjcgQG1vZGlmaWVkIDIwMDEtMDYtMjcgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBUaXRsZSBvbiBhIHdhcm5pbmcgZGlhbG9nIHRoYXQgSS9PIG1hbGZ1bmN0aW9uZWQgb3BlbmluZyBhIGZpbGUKK2RpYWxvZ190aXRsZV9lcnJvcl9vcGVuaW5nX2ZpbGU9RXJyb3JcIE9wZW5pbmdcIEZpbGUKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTA2LTI3IEBtb2RpZmllZCAyMDAxLTA2LTI3IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgRGlhbG9nIHRpdGxlIGZvciBhIGRpYWxvZyBib3ggZm9yIGVudGVyaW5nIHNwZWNpYWwgcGFyYW1ldGVycyBuZWVkZWQgdG8gZXhwb3J0IGEgcmVzb3VyY2UgYnVuZGxlIHRvIGphdmEgY2xhc3MgY29kZQorZGlhbG9nX3RpdGxlX2V4cG9ydF9qYXZhX29wdGlvbnM9RXhwb3J0XCBQYXJhbWV0ZXJzXDpcIEphdmFcIGNsYXNzCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wNyBAbW9kaWZpZWQgMjAwMS0wMi0wNyBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFRpdGxlIGZvciBhIGRpYWxvZyB3aXRoIGEgcHJvZ3Jlc3MgYmFyIGdvdmVybmluZyBpbXBvcnQgc3RhdHVzCitkaWFsb2dfdGl0bGVfaW1wb3J0X3Byb2dyZXNzPUltcG9ydFwgUHJvZ3Jlc3MKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCBUaXRsZSBmb3IgY3JlYXRpbmcgbmV3IGJ1bmRsZQorZGlhbG9nX3RpdGxlX25ld19idW5kbGU9Q3JlYXRlXCBhXCBOZXdcIFJlc291cmNlXCBCdW5kbGUKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCBUaXRsZSBmb3IgY3JlYXRpbmcgYSBuZXcgcmVzb3VyY2UgZmlsZQorZGlhbG9nX3RpdGxlX25ld19maWxlPUNyZWF0ZVwgYVwgTmV3XCBSZXNvdXJjZVwgRmlsZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IFRpdGxlIGZvciBjcmVhdGluZyBhIG5ldyByZXNvdXJjZSBncm91cAorZGlhbG9nX3RpdGxlX25ld19ncm91cD1DcmVhdGVcIGFcIE5ld1wgUmVzb3VyY2VcIEdyb3VwCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgVGl0bGUgZm9yIGNyZWF0aW5nIHJlc291cmNlCitkaWFsb2dfdGl0bGVfbmV3X2l0ZW09Q3JlYXRlXCBhXCBOZXdcIFJlc291cmNlXCBJdGVtCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xOSBAbW9kaWZpZWQgMjAwMS0xMi0xOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IFRpdGxlIG9mIHRoZSBkaWFsb2cgYm94IHNob3dpbmcgd2hlbiBjcmVhdGluZyBhIG5ldyBwcm9qZWN0CitkaWFsb2dfdGl0bGVfbmV3X3Byb2plY3Q9TmV3XCBSZXNvdXJjZVwgQnVuZGxlXCBQcm9qZWN0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgCitkaWFsb2dfdGl0bGVfcHJlZmVyZW5jZXM9UHJlZmVyZW5jZXMKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCBUaXRsZSBmb3IgY29uZmlybWluZyBleGl0IGZyb20gYXBwbGljYXRpb24KK2RpYWxvZ190aXRsZV9xdWl0PVF1aXRcIFJCTWFuYWdlcgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IAorZGlhbG9nX3RpdGxlX3NlYXJjaD1TZWFyY2gKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCAKK2RpYWxvZ190aXRsZV91c2VyX25hbWU9RW50ZXJcIFVzZXJcIE5hbWUKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCAKK2RpYWxvZ190cmFuc2xhdGlvbj1UcmFuc2xhdGlvblw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgCitkaWFsb2dfdXNlcl9uYW1lPVBsZWFzZVwgZW50ZXJcIHlvdXJcIG5hbWUuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgCitkaWFsb2dfdmFyaWFudD1WYXJpYW50CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgCitkaWFsb2dfd2FybmluZ19kZWxldGVfZ3JvdXA9RGVsZXRpbmdcIHRoaXNcIGdyb3VwXCB3aWxsXCBjYXVzZVwgYWxsXCBpdGVtc1wgaW5cIHRoZVwgZ3JvdXBcIHRvXCBiZVwgcGVybWFuZW50bHlcIHJlbW92ZWQuXCBEb1wgeW91XCB3aXNoXCB0b1wgY29udGludWU/CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgCitkaWFsb2dfd2FybmluZ19kZWxldGVfaXRlbT1EZWxldGluZ1wgdGhlXCByc291cmNlXCBpdGVtXCB3aWxsXCBjYXVzZVwgaXRcIHRvXCBiZVwgcGVybWFuZW50bHlcIHJlbW92ZWQuXCBEb1wgeW91XCB3aXNoXCB0b1wgY29udGludWU/CisKKyMKKyMgQGdyb3VwIEVycm9yIE1lc3NhZ2VzCisjCisjIEBncm91cENvbW1lbnQgCisKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCAKK2Vycm9yPUVycm9yCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xOSBAbW9kaWZpZWQgMjAwMS0xMi0xOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IEdlbmVyYWwgZXJyb3IgbWVzc2FnZSB3aGVuIHRyeWluZyB0byBhZGQgYSByZXNvdXJjZSBidW5kbGUgdG8gYSBwcm9qZWN0LgorZXJyb3JfYWRkaW5nX3Byb2plY3RfYnVuZGxlPUFuXCBlcnJvclwgb2NjdXJyZWRcIHRyeWluZ1wgdG9cIGFkZFwgdGhlXCBSZXNvdXJjZVwgQnVuZGxlXCB5b3VcIHNlbGVjdGVkLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IAorZXJyb3JfYmFzZWNsYXNzX3doaXRlc3BhY2U9UmVzb3VyY2VcIG5hbWVzXCBjYW5cIG5vdFwgaGF2ZVwgYW55XCB3aGl0ZVwgc3BhY2VcIGNoYXJhY3RlcnNcIGluXCB0aGVtLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IAorZXJyb3JfYnVuZGxlX25vdF9jcmVhdGVkPU5vXCBSZXNvdXJjZVwgQnVuZGxlXCB3YXNcIGNyZWF0ZWQuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgCitlcnJvcl9jcmVhdGVfZmlsZT1BXCBwcm9ibGVtXCB3YXNcIGVuY291bnRlcmVkXCB0cnlpbmdcIHRvXCBjcmVhdGVcIHRoZVwgcmVzb3VyY2VcIGZpbGUuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgCitlcnJvcl9jcmVhdGVfZ3JvdXA9QVwgcHJvYmxlbVwgd2FzXCBlbmNvdW50ZXJlZFwgdHJ5aW5nXCB0b1wgY3JlYXRlXCB0aGVcIGdyb3VwLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IAorZXJyb3JfY3JlYXRlX2l0ZW09QVwgcHJvYmxlbVwgd2FzXCBlbmNvdW50ZXJlZFwgdHJ5aW5nXCB0b1wgY3JlYXRlXCB0aGVcIGVudHJ5LgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTkgQG1vZGlmaWVkIDIwMDEtMTItMTkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBHZW5lcmFsIGVycm9yIG1lc3NhZ2Ugd2hlbiBjcmVhdGluZyBhIHByb2plY3QKK2Vycm9yX2NyZWF0aW5nX3Byb2plY3Q9QW5cIGVycm9yXCB3YXNcIGVuY291bnRlcmVkXCB0cnlpbmdcIHRvXCBjcmVhdGVcIGFcIFJlc291cmNlXCBCdW5kbGVcIFByb2plY3QuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wNi0yNyBAbW9kaWZpZWQgMjAwMS0wNi0yNyBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEB7MH0gVGhlIG1lc3NhZ2UgZnJvbSBhbiBJT0V4Y2VwdGlvbiB0aGF0IGlzIHRocm93bgorIyBAY29tbWVudCBFcnJvciBtZXNzYWdlIHdoZW4gdHJ5aW5nIHRvIGRlbGV0ZSBhIGZpbGUKK2Vycm9yX2RlbGV0aW5nPVRoZXJlXCB3YXNcIGFuXCBlcnJvclwgdHJ5aW5nXCB0b1wgZGVsZXRlXCB0aGVcIGZpbGVcOlwgezB9CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wNi0yNyBAbW9kaWZpZWQgMjAwMS0wNi0yNyBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IEFuIGVycm9yIHRoYXQgb2NjdXJzIHdoZW4gYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIGRlbGV0ZSBhIGZpbGUsIGJ1dCB0aGUgdmlydHVhbCBtYWNoaW5lIGNhbiBub3QgZG8gc28KK2Vycm9yX2RlbGV0aW9uX25vdF9wb3NzaWJsZT1SQk1hbmFnZXJcIHdhc1wgdW5hYmxlXCB0b1wgZGVsZXRlXCB0aGVcIGZpbGUuXCBQZXJtaXNzaW9uXCBkZW5pZWQuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wNyBAbW9kaWZpZWQgMjAwMS0wMi0wNyBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEdlbmVyYWwgZXJyb3IgbWVzc2FnZSBmb3IgZXhwb3J0aW5nIHJlc291cmNlIGJ1bmRsZXMKK2Vycm9yX2V4cG9ydD1UaGVyZVwgaGFzXCBiZWVuXCBhblwgZXJyb3JcIGV4cG9ydGluZ1wgdGhlXCByZXNvdXJjZVwgYnVuZGxlCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgCitlcnJvcl9pbnRlcm5hbD1JbnRlcm5hbFwgRXJyb3IKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCAKK2Vycm9yX21vZGlmeV9maWxlPUFuXCBlcnJvclwgd2FzXCBlbmNvdW50ZXJlZFwgdHJ5aW5nXCB0b1wgbW9kaWZ5XCB0aGVcIHJlc291cmNlXCBmaWxlLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IAorZXJyb3JfbW9kaWZ5X2dyb3VwPVRoZXJlXCB3YXNcIGFcIHByb2JsZW1cIHRyeWluZ1wgdG9cIG1vZGlmeVwgdGhpc1wgZ3JvdXAuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgCitlcnJvcl9tb2RpZnlfaXRlbT1BblwgcHJvYmxlbVwgd2FzXCBlbmNvdW50ZXJlZFwgdHJ5aW5nXCB0b1wgbW9kaWZ5XCB0aGVcIGVudHJ5CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgCitlcnJvcl9ub19idW5kbGVfZm9yX2ZpbGU9SW5cIG9yZGVyXCB0b1wgY3JlYXRlXCBhXCByZXNvdXJjZVwgZmlsZSxcIHlvdVwgbXVzdFwgZmlyc3RcIG9wZW5cIG9yXCBjcmVhdGVcIGFcIFJlc291cmNlXCBCdW5kbGUuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgCitlcnJvcl9ub19idW5kbGVfZm9yX2dyb3VwPUluXCBvcmRlclwgdG9cIGNyZWF0ZVwgYVwgZ3JvdXAsXCB5b3VcIG11c3RcIGZpcnN0XCBvcGVuXCBvclwgY3JlYXRlXCBhXCBSZXNvdXJjZVwgQnVuZGxlLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IEVycm9yIG1lc3NhZ2UgZGlzcGxheWVkIHdoZW4gdGhlIHVzZXIgdHJpZXMgdG8gY3JlYXRlIGEgcmVzb3VyY2UsIHdpdGhvdXQgYW4gb3BlbiByZXNvdXJjZSBidW5kbGUKK2Vycm9yX25vX2J1bmRsZV9mb3JfaXRlbT1QbGVhc2VcIGNyZWF0ZVwgb3JcIG9wZW5cIGFcIHJlc291cmNlXCBidW5kbGVcIGJlZm9yZVwgYXR0ZW1wdGluZ1wgdG9cIGNyZWF0ZVwgYVwgcmVzb3VyY2VcIGl0ZW0uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wNiBAbW9kaWZpZWQgMjAwMS0wMi0wNiBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorZXJyb3Jfbm9fa2V5X3JlcGxhY2U9UmVwbGFjZVwgZG9lc1wgbm90XCBmdW5jdGlvblwgZm9yXCBSZXNvdXJjZVwgS2V5cy5cIEFsbFwgb3RoZXJcIHJlcGxhY2VzXCB3aWxsXCBiZVwgcGVyZm9ybWVkCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yMiBAbW9kaWZpZWQgMjAwMS0wMS0yMiBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEluZGljYXRpb24gdGhhdCBSQk1hbmFnZXIgY2FuIG5vdCByZWFkIHRoZSBmaWxlIGFzIGNyZWF0ZWQgYnkgUkJNYW5hZ2VyCitlcnJvcl9ub3RfcmJtYW5hZ2VyX2Zvcm1hdD1UaGVcIHNlbGVjdGVkXCByZXNvdXJjZVwgYnVuZGxlXCB3YXNcIG5vdFwgY3JlYXRlZFwgYnlcIFJCTWFuYWdlclwgb3JcIGhhc1wgYmVlblwgZGFtYWdlZC4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTA2LTI3IEBtb2RpZmllZCAyMDAxLTA2LTI3IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQHswfSBUaGUgbmFtZSBvZiB0aGUgZmlsZSB0aGF0IHdvdWxkIG5vdCBvcGVuCisjIEBjb21tZW50IEVycm9yIG1lc3NhZ2Ugb2NjdXJpbmcgb24gYW4gSS9PIGVycm9yIHRyeWluZyB0byBvcGVuIGEgZmlsZQorZXJyb3Jfb3BlbmluZ19maWxlPUNvdWxkXCBub3RcIG9wZW5cIHRoZVwgZmlsZVwgezB9CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0xNSBAbW9kaWZpZWQgMjAwMS0wMS0xNSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEVycm9yIG1lc3NhZ2UgZGlzcGxheWVkIHdoZW4gUkJNYW5hZ2VyIGVuY291bnRlcnMgYW4gZXJyb3Igd3JpdGluZyBwcmVmZXJlbmNlcyB0byB0aGUgZmlsZSBzeXN0ZW0KK2Vycm9yX3ByZWZlcmVuY2VzX3NhdmU9VGhlcmVcIHdhc1wgYW5cIGVycm9yXCBhdHRlbXB0aW5nXCB0b1wgc2F2ZVwgeW91clwgcHJlZmVyZW5jZXMuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0xMCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEB7MH0gVGhlIGVycm9yIG1lc3NhZ2UgZ2VuZXJhdGVkCisjIEBjb21tZW50IEEgbWVzc2FnZSBwcmVzZW50ZWQgdG8gdGhlIHVzZXIgd2hlbiBhbiBlcnJvciBvY2N1cnMgaW4gc2F2aW5nIHRoZSByZXNvdXJjZSBidW5kbGUKK2Vycm9yX3NhdmluZz1UaGVyZVwgd2FzXCBhblwgZXJyb3JcIHNhdmluZ1wgdGhlXCByZXNvdXJjZVwgYnVuZGxlXDpcIHswfQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTkgQG1vZGlmaWVkIDIwMDEtMTItMTkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBHZW5lcmFsIGVycm9yIG1lc3NhZ2Ugd2hlbiBzYXZpbmcgYSBwcm9qZWN0CitlcnJvcl9zYXZpbmdfcHJvamVjdD1BblwgZXJyb3JcIHdhc1wgZW5jb3VudGVyZWRcIHRyeWluZ1wgdG9cIHNhdmVcIHRoZVwgUmVzb3VyY2VcIEJ1bmRsZVwgUHJvamVjdC4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTIyIEBtb2RpZmllZCAyMDAxLTAxLTIyIEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgU3VnZ2VzdCB0cnlpbmcgdG8gaW1wb3J0IHRoZSByZXNvdXJjZSBidW5kbGUgaW5zdGVhZCBvZiBvcGVuaW5nIGl0LgorZXJyb3Jfc3VnZ2VzdF9pbXBvcnRfcHJvcGVydGllcz1UcnlcIGltcG9ydGluZ1wgdGhlXCByZXNvdXJjZVwgYnVuZGxlXCBpbnN0ZWFkCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgCitlcnJvcl90cnlfYWdhaW5fZmlsZT1QbGVhc2VcIHRyeVwgYWdhaW5cIHdpdGhcIGRpZmZlcmVudFwgZW5jb2RpbmdcIHZhbHVlcy4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorZXJyb3JfdHJ5X2FnYWluX2dyb3VwPVBsZWFzZVwgdHJ5XCBhZ2Fpblwgd2l0aFwgYVwgZGlmZmVyZW50XCBncm91cFwgbmFtZS4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorZXJyb3JfdHJ5X2FnYWluX2l0ZW09UGxlYXNlXCB0cnlcIGFnYWluXCB3aXRoXCBhXCBkaWZmZXJlbnRcIGVudHJ5XCBrZXkuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wNyBAbW9kaWZpZWQgMjAwMS0wMi0wNyBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFZhbHVlIGluc2VydGVkIGludG8gdGFibGUgY2VsbHMgd2hlbiBhbiBlcnJvciBoYXMgb2NjdXJlZAordGFibGVfY2VsbF9lcnJvcj0qRXJyb3IqCisKKyMKKyMgQGdyb3VwIEV4cG9ydAorIworIyBAZ3JvdXBDb21tZW50IFJlc291cmNlcyBkZWFsaW5nIHdpdGggZXhwb3J0IG9wdGlvbnMKKworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDYtMjcgQG1vZGlmaWVkIDIwMDEtMDYtMjcgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBPcHRpb24gZm9yIHRoZSBwYXJhbWV0ZXIgZm9yIGNyZWF0ZWQgYSBwcm90ZWN0ZWQgY2xhc3MKK2V4cG9ydF9qYXZhX2NsYXNzX3Byb3RlY3RlZD1DcmVhdGVcIGFcIHByb3RlY3RlZFwgY2xhc3MKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTA2LTI3IEBtb2RpZmllZCAyMDAxLTA2LTI3IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgT3B0aW9uIGZvciBwYXJhbWV0ZXIgc2V0dGluZyB0aGUgY3JlYXRlZCBjbGFzcyBhcyBwdWJsaWMKK2V4cG9ydF9qYXZhX2NsYXNzX3B1YmxpYz1DcmVhdGVcIGFcIHB1YmxpY1wgY2xhc3MKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTA2LTI3IEBtb2RpZmllZCAyMDAxLTA2LTI3IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgT3B0aW9uIGZvciBwYXJhbWV0ZXIgZm9yIGNyZWF0aW5nIHByb3RlY3RlZCBtZXRob2RzIGluIHRoZSBqYXZhIGNsYXNzCitleHBvcnRfamF2YV9tZXRob2RzX3Byb3RlY3RlZD1DcmVhdGVcIHByb3RlY3RlZFwgbWV0aG9kcworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDYtMjcgQG1vZGlmaWVkIDIwMDEtMDYtMjcgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBPcHRpb24gZm9yIHBhcmFtZXRlciBmb3IgY3JlYXRpbmcgcHVibGljIG1ldGhvZHMKK2V4cG9ydF9qYXZhX21ldGhvZHNfcHVibGljPUNyZWF0ZVwgcHVibGljXCBtZXRob2RzCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wNi0yNyBAbW9kaWZpZWQgMjAwMS0wNi0yNyBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IFRpdGxlIG9mIGEgY2hlY2sgYm94IGZvbGxvd2VkIGJ5IGEgdGV4dCBmaWVsZCBmb3Igc3BlY2lmeWluZyB3aGV0aGVyIG9yIG5vdCB0byB1c2UgYSBwYWNrYWdlIGluIHRoZSBnZW5lcmF0ZWQgamF2YSBjbGFzcyBhbmQgd2hhdCB0aGUgcGFja2FnZSBzaG91bGQgYmUgY2FsbGVkCitleHBvcnRfamF2YV9wYWNrYWdlPVNwZWNpZnlcIGFcIHBhY2thZ2VcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDYtMjcgQG1vZGlmaWVkIDIwMDEtMDYtMjcgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBUZXh0IHBsYWNlZCBpbiBhIGxhYmVsIGF0IHRoZSB0b3Agb2YgdGhlIGRpYWxvZyBib3ggZm9yIHNwZWNpZnlpbmcgcGFyYW1ldGVycyBjb25jZXJuaW5nIHRoZSBleHBvcnQgb2YgcmVzb3VyY2UgYnVuZGxlcyBpbnRvIGEgamF2YSBjbGFzcworZXhwb3J0X2phdmFfdGl0bGU9UGxlYXNlXCBzcGVjaWZ5XCB0aGVcIGZvbGxvd2luZ1wgcGFyYW1ldGVyc1wgZm9yXCB5b3VyXCBKYXZhXCBjbGFzc1w6CisKKyMKKyMgQGdyb3VwIEdlbmVyYWwKKyMKKyMgQGdyb3VwQ29tbWVudCBTb21lIGl0ZW1zIHRoYXQgYXJlIGNvbW1vbiBhY2Nyb3NzIGdyb3VwcworCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgVGhlIGZpbGUgb3IgY2xhc3MgY29tcG9zZWQgb2YgdGhlIGRlZmF1bHQgdHJhbnNsYXRpb25zIGZvciB0aGUgYnVuZGxlCitiYXNlY2xhc3M9QmFzZVwgQ2xhc3MKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDA0LTA2LTI5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBHZW9yZ2UKKyMgQGNvbW1lbnQgVGhpcyBpcyB0aGUgbGVnYWwgY29weXJpZ2h0IG5vdGljZQorY29weXJpZ2h0PShDKVwgQ29weXJpZ2h0XCBJQk1cIENvcnAuXCAyMDAwLTIwMDRcIC1cIEFsbFwgUmlnaHRzXCBSZXNlcnZlZAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDYgQG1vZGlmaWVkIDIwMDEtMDItMDYgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBHZXJuZXJhbCB1c2UgZm9yIGZpbGUgZGlyZWN0b3JpZXMKK2RpcmVjdG9yeT1EaXJlY3RvcnkKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCAKK2dyb3Vwcz1Hcm91cHMKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCBUaGUgbmFtZSBvZiB0aGUgaW1hZ2UgZmlsZSBpbiB0aGUgJ0ltYWdlcycgZGlyZWN0b3J5IHRoYXQgcmVwcmVzZW50cyB0aGUgbG9nbyBzZWVuIGF0IHRoZSB0b3Agb2YgdGhlIGFwcGxpY2F0aW9uCitsb2dvX2ZpbGVuYW1lPVRpdGxlTG9nb190cmFuc3BhcmVudC5naWYKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTEyLTE3IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgVHJlZSBub2RlIHRpdGxlIHdoZW4gdmlld2luZyBhIHJlc291cmNlIGJ1bmRsZSBpbiB0aGUgcHJvamVjdCB2aWV3IHdoZW4gdGhlcmUgaXMgbm8gYWN0aXZlIHByb2plY3QKK25vX3Byb2plY3Q9RGVmYXVsdFwgUHJvamVjdAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMTItMTcgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBUcmVlIG5vZGUgdGl0bGUgZGVmYXVsdGVkIHRvIHdoZW4gbm8gcmVzb3VyY2UgYnVuZGxlIG9yIHByb2plY3QgaGFzIGJlZW4gb3BlbmVkIGJ5IHRoZSB1c2VyCitub19wcm9qZWN0X2J1bmRsZT1Ob1wgUHJvamVjdFwgb3JcIFJlc291cmNlXCBCdW5kbGVcIE9wZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCBUaGUgdG9wIHRyZWUgbm9kZSB0aXRsZSwgd2hlbiBubyByZXNvdXJjZSBidW5kbGUgaGFzIGJlZW4gb3BlbmVkIG9yIGNyZWF0ZWQKK25vX3Jlc291cmNlX2J1bmRsZT1Ob1wgUmVzb3VyY2VcIEJ1bmRsZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IAorbm9uZT1Ob25lCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMS0yMCBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IFByb2plY3QgdGFibGUgY29sdW1uIG5hbWUgLSBMb2NhdGlvbiBvZiBhIHJlc291cmNlIGJ1bmRsZQorcHJvamVjdF90YWJsZV9maWxlX2xvY2F0aW9uPUZpbGVcIExvY2F0aW9uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMS0yMCBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IFRhYmxlIENvbHVtbiBOYW1lIGZvciByZXNvdXJjZSBidW5kbGUgbmFtZQorcHJvamVjdF90YWJsZV9yZXNvdXJjZV9idW5kbGU9UmVzb3VyY2VcIEJ1bmRsZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IEFuIGFiYnJldmlhdGVkIG5hbWUgb2YgdGhpcyBhcHBsaWNhdGlvbgorcmJtYW5hZ2VyPVJCTWFuYWdlcgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDQtMDYtMjkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEdlb3JnZQorIyBAY29tbWVudCAKK3JibWFuYWdlcl9jb250YWN0PUF1dGhvcnNcOlwgSmFyZWRcIEphY2tzb25cICZcIEdlb3JnZVwgUmhvdGVuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgVGhlIGZ1bGwgbmFtZSBvZiB0aGlzIGFwcGxpY2F0aW9uCityZXNvdXJjZV9idW5kbGVfbWFuYWdlcj1SZXNvdXJjZVwgQnVuZGxlXCBNYW5hZ2VyCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgCit0YWJsZV9jb2x1bW5fZXJyb3I9VGFibGVcIENvbHVtblwgRXJyb3IKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAxLTAxLTIyIEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEB7MH0gQ291bnRyeSBJU08gY29kZQorIyBAY29tbWVudCBOb2RlIHRpdGxlLCB1bmRlciB3aGljaCBhbGwgZmlsZXMgb2YgdGhlIHNhbWUgY291bnRyeSwgbGFuZ3VhZ2UgcmVzaWRlCit0cmVlX2NvdW50cnlfbm9kZT1Db3VudHJ5XCBDb2RlXDpcIHswfQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEB7MH0gTGFuZ3VhZ2UgRW5jb2RpbmcKKyMgQGNvbW1lbnQgVGhlIG5vZGUgYmVsb3cgd2hpY2ggbGFuZ3VhZ2VzIG9mIG9uZSBlbmNvZGluZyBhcmUgZ3JvdXBlZAordHJlZV9sYW5ndWFnZV9ub2RlPUxhbmd1YWdlXCBDb2RlXDpcIHswfQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IAordHJlZV92YXJpYW50X25vZGU9VmFyaWFudHNcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IFRoZSBuYW1lIGFzc2lnbmVkIGFzIGEgdXNlciBuYW1lIHdoZW4gdGhlIHVzZXIgbmFtZSBpcyBub3Qgc3BlY2lmaWVkCit1bmtub3duX3VzZXI9VW5rbm93bgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IAordW50aXRsZWQ9VW50aXRsZWQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCAKK3VudHJhbnNsYXRlZF9pdGVtcz1VbnRyYW5zbGF0ZWRcIEl0ZW1zCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQHswfSBUaGUgdmVyc2lvbiBudW1iZXIKKyMgQGNvbW1lbnQgVGhlIHZlcnNpb24gb2YgdGhpcyBhcHBsaWNhdGlvbgordmVyc2lvbj1WZXJzaW9uXCB7MH0KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTA2IEBtb2RpZmllZCAyMDAxLTAyLTA2IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgZ2VuZXJhbCB1c2UgV2FybmluZword2FybmluZz1XYXJuaW5nCisKKyMKKyMgQGdyb3VwIEltcG9ydAorIworIyBAZ3JvdXBDb21tZW50IFJlc291cmNlcyBkZWFsaW5nIHdpdGggaW1wb3J0IG9wdGlvbnMKKworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjYgQG1vZGlmaWVkIDIwMDEtMDEtMjYgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUaXRsZSBmb3IgZmlsZSBjaG9vc2VyIGZvciBjaG9vc2luZyBUTVggZmlsZXMKK2ltcG9ydF9UTVhfZmlsZV9kZXNjcmlwdGlvbj1UTVhcIEZpbGVzCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yNiBAbW9kaWZpZWQgMjAwMS0wMS0yNiBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IERpYWxvZyB0aXRsZSBmb3IgaW1wb3J0aW5nIGZyb20gVE1YIFhNTCBmaWxlcworaW1wb3J0X1RNWF90aXRsZT1UTVhcIEZpbGVcIEltcG9ydAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDQtMDctMDEgQG1vZGlmaWVkIDIwMDQtMDctMDEgQGNyZWF0b3IgR2VvcmdlIFJob3RlbiBAbW9kaWZpZXIgR2VvcmdlIFJob3RlbgorIyBAY29tbWVudCBUaXRsZSBmb3IgdGhlIGZpbGUgY2hvb3NlciBmb3IgY2hvb3NpbmcgWExJRkYgKC54bGYpIGZpbGVzCitpbXBvcnRfWExGX2ZpbGVfZGVzY3JpcHRpb249WExJRkZcIEZpbGVzCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwNC0wNy0wMSBAbW9kaWZpZWQgMjAwNC0wNy0wMSBAY3JlYXRvciBHZW9yZ2UgUmhvdGVuIEBtb2RpZmllciBHZW9yZ2UgUmhvdGVuCisjIEBjb21tZW50IERpYWxvZyB0aXRsZSBmb3IgaW1wb3J0aW5nIGZyb20gWExJRkYgKC54bGYpIGZpbGVzCitpbXBvcnRfWExGX3RpdGxlPVhMSUZGXCBGaWxlcworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjYgQG1vZGlmaWVkIDIwMDEtMDEtMjYgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBPcHRpb24gZm9yIHJlc29sdmluZyBjb25mbGNpdHMgb24gYSBjYXNlIGJ5IGNhc2UgYmFzaXMKK2ltcG9ydF9jb25mbGljdF9wcm9tcHQ9UHJvbXB0XCBmb3JcIGVhY2hcIGNvbmZsaWN0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wNyBAbW9kaWZpZWQgMjAwMS0wMi0wNyBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IE9wdGlvbiBzcGVjaWZ5aW5nIHdoZXRoZXIgYSBncm91cCBmb3VuZCBpbiB0aGUgdGFyZ2V0IGJ1dCBub3QgZm91bmQgaW4gdGhlIGFjdGl2ZSByZXNvdXJjZSBidW5kbGUgc2hvdWxkIGJlIGNyZWF0ZWQgaW4gdGhlIHJlc291cmNlIGJ1bmRsZSBvciBub3QKK2ltcG9ydF9kZWZhdWx0X2dyb3VwX2NyZWF0aW9uPUNyZWF0ZVwgZ3JvdXBzXCBub3RcIGV4aXN0aW5nXCBpblwgdGhlXCBjdXJyZW50XCBidW5kbGUKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTI2IEBtb2RpZmllZCAyMDAxLTAxLTI2IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgT3B0b2luIGZvciBtYXJraW5nIHRoZSBpbmNvbWluZyB2YWx1ZXMgYXMgdHJhbnNsYXRlZCBvciBub3QKK2ltcG9ydF9kZWZhdWx0X3RyYW5zbGF0ZWQ9TWFya1wgYXNcIHRyYW5zbGF0ZWQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTI2IEBtb2RpZmllZCAyMDAxLTAxLTI2IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgVGl0bGUgZm9yIG9wdGlvbnMgc3BlY2lmeWluZyB0aGUgbWV0YSBkYXRhIHRvIGJlIGFwcGxpZWQgdG8gaW5kaXZpZHVhbCByZXNvdXJjZXMgaWYgaXQgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgaW1wb3J0IHNvdXJjZQoraW1wb3J0X2RlZmF1bHRfdmFsdWVzPURlZmF1bHRcIFZhbHVlcworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDIgQG1vZGlmaWVkIDIwMDEtMDItMDIgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAezB9IFRoZSBsb2NhbGUgZW5jb2Rpbmcgb2YgdGhlIGZpbGUgaW4gcXVlc3Rpb24KKyMgQGNvbW1lbnQgSW5zdHJ1Y3Rpb25zIGZvciBwcm9tcHRpbmcgdGhlIHVzZXIgdG8gcmVzb2x2ZSBhIGNvbmZsaWN0IHdoZW4gaW1wb3J0aW5nIHJlc291cmNlcyBmcm9tIGEgbG9jYWxlIHRoYXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGN1cnJlbnQgcmVzb3VyY2UgYnVuZGxlCitpbXBvcnRfZmlsZV9jb25mbGljdF9jaG9vc2U9VGhlXCBlbmNvZGluZ1wgezB9XCBkb2VzXCBub3RcIGV4aXN0LlwgU2VsZWN0XCBhblwgb3B0aW9uXCB0b1wgcmVzb2x2ZVwgb3JcIGNhbmNlbFwgdG9cIGlnbm9yZVwgdGhpc1wgY29uZmxpY3QuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yNiBAbW9kaWZpZWQgMjAwMS0wMS0yNiBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IE9wdGlvbiBmb3IgZmlsZSBjb25mbGljdHMgaW4gd2hpY2ggYSBuZXcgZmlsZSBpcyBnZW5lcmF0ZWQsIGJ1dCBub3QgcG9wdWxhdGVkCitpbXBvcnRfZmlsZV9jb25mbGljdF9nZW5lcmF0ZV9lbXB0eT1HZW5lcmF0ZVwgYVwgbmV3LFwgZW1wdHlcIHJlc291cmNlXCBmaWxlCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yNiBAbW9kaWZpZWQgMjAwMS0wMS0yNiBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IE9wdGlvbiBmb3IgcmVzb2x2aW5nIGZpbGUgY29uZmxpY3RzIGluIHdoaWNoIGEgbmV3IGZpbGUgaXMgZ2VuZXJhdGVkIGFuZCBwb3B1bGF0ZWQgd2l0aCBhbGwgdGhlIGV4aXN0aW5nIHJlc291cmNlcworaW1wb3J0X2ZpbGVfY29uZmxpY3RfZ2VuZXJhdGVfcG9wdWxhdGU9R2VuZXJhdGVcIGFcIG5ld1wgcmVzb3VyY2VcIGZpbGVcIGFuZFwgcG9wdWxhdGVcIGl0XCB3aXRoXCB0aGVcIGJhc2VcIGNsYXNzXCByZXNvdXJjZXMKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTI2IEBtb2RpZmllZCAyMDAxLTAxLTI2IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgT3B0aW9uIGZvciBmaWxlIGNvbmZsaWN0cyBpbiB3aGljaCB0aGUgY29uZmxpY3RzIGFyZSBpZ25vcmVkCitpbXBvcnRfZmlsZV9jb25mbGljdF9pZ25vcmU9U2tpcFwgYW5kXCBpZ25vcmVcIGFsbFwgcmVzb3VyY2VzXCBmcm9tXCBsb2NhbGVzXCBub3RcIGV4aXN0YW50XCBpblwgdGhlXCBjdXJyZW50XCByZXNvdXJjZVwgYnVuZGxlCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yNiBAbW9kaWZpZWQgMjAwMS0wMS0yNiBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFRpdGxlIGZvciBzZWN0aW9uIGxpc3Rpbmcgb3B0aW9ucyBmb3Igd2hhdCB0byBkbyB3aGVuIGFuIGltcG9ydGVkIHZhbHVlIGV4aXN0cyBpbiBhIGxvY2FsZSBub3QgZGVmaW5lZCBpbiB0aGUgZXhpc3RpbmcgcmVzb3VyY2UgYnVuZGxlCitpbXBvcnRfZmlsZV9jb25mbGljdHM9TWlzc2luZ1wgUmVzb3VyY2VcIEZpbGVzCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yNiBAbW9kaWZpZWQgMjAwMS0wMS0yNiBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFNlbGVjdGlvbiBvZiB0aGUgZGVmYXVsdCBncm91cC4gQSBsaXN0IG9mIGdyb3VwcyB3aWxsIGFwcGVhciB0byB0aGUgcmlnaHQgb2YgdGhpcyByZXNvdXJjZSBpbiBhIENvbWJvQm94CitpbXBvcnRfaW5zZXJ0X2dyb3VwPUluc2VydFwgaW50b1wgZ3JvdXBcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjYgQG1vZGlmaWVkIDIwMDEtMDEtMjYgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUaXRsZSBmb3IgdGhlIHR5cGVzIG9mIGZpbGVzIGFjY2VwdGVkIGZvciB0aGlzIGltcG9ydCB0eXBlCitpbXBvcnRfamF2YV9maWxlX2Rlc2NyaXB0aW9uPUphdmFcIExpc3RSZXNvdXJjZUJ1bmRsZVwgQmFzZVwgQ2xhc3NlcworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjYgQG1vZGlmaWVkIDIwMDEtMDEtMjYgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUaXRsZSBmb3IgZGlhbG9nIHByb21wdGluZyBmb3IgaW1wb3J0IGZyb20gamF2YSBjbGFzc2VzCitpbXBvcnRfamF2YV90aXRsZT1KYXZhXCBMaXN0UmVzb3VyY2VCdW5kbGVcIENsYXNzXCBJbXBvcnQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTI2IEBtb2RpZmllZCAyMDAxLTAxLTI2IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgVGl0bGUgaW5kaWNhdGluZyBzZWN0aW9uIGNvbnRhaW5pbmcgdXNlciBvcHRpb25zCitpbXBvcnRfb3B0aW9ucz1JbXBvcnRcIE9wdGlvbnMKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTI2IEBtb2RpZmllZCAyMDAxLTAxLTI2IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgVGl0bGUgZm9yIGZpbGUgY2hvb3NlciBmb3Igc2VsZWN0aW9uIG9mIHJlc291cmNlIGJ1bmRsZXMgc3RvcmVkIGluIC5wcm9wZXJ0aWVzIGZpbGVzCitpbXBvcnRfcHJvcGVydGllc19maWxlX2Rlc2NyaXB0aW9uPVJlc291cmNlXCBCdW5kbGVcIEJhc2VcIENsYXNzZXMKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTI2IEBtb2RpZmllZCAyMDAxLTAxLTI2IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgRGlhbG9nIHRpdGxlIGZvciBpbXBvcnRpbmcgZnJvbSBwcm9wZXJ0aWVzIGZpbGVzIChjcmVhdGVkIG9yIG5vdCBieSBSQk1hbmFnZXIpCitpbXBvcnRfcHJvcGVydGllc190aXRsZT1SZXNvdXJjZVwgQnVuZGxlXCBQcm9wZXJ0aWVzXCBGaWxlc1wgSW1wb3J0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wMiBAbW9kaWZpZWQgMjAwMS0wMi0wMiBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEB7MX0gRW5jb2Rpbmcgb2YgdGhlIHJlc291cmNlIHZhbHVlIHdpdGggYSBjb25mbGljdAorIyBAezB9IFRoZSBrZXkgdmFsdWUgb2YgdGhlIHJlc291cmNlIGluIGNvbmZsaWN0CisjIEBjb21tZW50IFRoaXMgaXMgYSB3YXJuaW5nIGFuZCBpbnN0cnVjdGlvbiBmb3Igd2hlbiBhIHJlc291cmNlIGNvbmZsaWN0IG9jY3VycyBkdXJpbmcgYW4gaW1wb3J0CitpbXBvcnRfcmVzb3VyY2VfY29uZmxpY3RfY2hvb3NlPVRoZVwga2V5XCB7MH1cIGFsbFwgcmVhZHlcIGV4aXN0c1wgaW5cIHRoZVwgezF9XCByZXNvdXJjZVwgYnVuZGxlLkNob29zZVwgYW5cIG9wdGlvblwgdG9cIHJlc29sdmVcIHRoaXNcIGNvbmZsaWN0XDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTAyIEBtb2RpZmllZCAyMDAxLTAyLTAyIEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQHswfSBUaGUgdHJhbnNsYXRpb24gdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXNvdXJjZSBpdGVtCisjIEBjb21tZW50IEFuIGluZGljYXRpb24gb2YgdGhlIHZhbHVlIG9mIHRoZSByZXNvdXJjZSBhY2NvcmRpbmcgdG8gdGhlIGltcG9ydCBmaWxlCitpbXBvcnRfcmVzb3VyY2VfY29uZmxpY3RfY2hvb3NlX3NvdXJjZT1JbXBvcnRcIFRyYW5zbGF0aW9uXDpcIHswfQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDIgQG1vZGlmaWVkIDIwMDEtMDItMDIgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAezB9IFRoZSB0cmFuc2xhdGlvbiB2YWx1ZSBvZiB0aGUgcmVzb3VyY2UgaXRlbQorIyBAY29tbWVudCBBbiBpbmRpY2F0aW9uIG9mIHRoZSB0cmFuc2xhdGlvbiB2YWx1ZSBoZWxkIGJ5IHRoZSBhY3RpdmUgcmVzb3VyY2UgYnVuZGxlIGR1cmluZyBhIHRyYW5zbGF0aW9uIHJlc291cmNlIGNvbmZsaWN0CitpbXBvcnRfcmVzb3VyY2VfY29uZmxpY3RfY2hvb3NlX3RhcmdldD1SZXNvdXJjZVwgQnVuZGxlXCB0cmFuc2xhdGlvblw6XCB7MH0KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTI2IEBtb2RpZmllZCAyMDAxLTAxLTI2IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgT3B0aW9uIGZvciByZXNvbHZpbmcgcmVzb3VyY2UgY29uZmxpY3RzIGJ5IGlnbm9yaW5nIGltcG9ydCB2YWx1ZQoraW1wb3J0X3Jlc291cmNlX2NvbmZsaWN0X2lnbm9yZT1JZ25vcmVcIHRoZVwgY29uZmxpY3RcIGFuZFwgbGVhdmVcIHRoZVwgb3JpZ2luYWxcIHJlc291cmNlXCB1bmNoYW5nZWQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTI2IEBtb2RpZmllZCAyMDAxLTAxLTI2IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgT3B0aW9uIGZvciByZXNvbHZpbmcgY29uZmxpY3RzIGJ5IHVzaW5nIHRoZSBpbXBvcnQgdmFsdWUKK2ltcG9ydF9yZXNvdXJjZV9jb25mbGljdF9vdmVyd3JpdGU9T3ZlcndyaXRlXCByZXNvdXJjZVwgd2l0aFwgdGhlXCB2YWx1ZVwgZnJvbVwgdGhlXCBpbXBvcnRcIGZpbGUKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTI2IEBtb2RpZmllZCAyMDAxLTAxLTI2IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgVGl0bGUgbGlzdGluZyBvcHRpb25zIGZvciByZXNvbHZpbmcgY29uZmxpY3RzIGJldHdlZW4gcmVzb3VyY2VzCitpbXBvcnRfcmVzb3VyY2VfY29uZmxpY3RzPVJlc291cmNlXCBDb25mbGljdHMKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTI2IEBtb2RpZmllZCAyMDAxLTAxLTI2IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQHswfSBUaGUgcGF0aCBhbmQgbmFtZSBvZiB0aGUgc291cmNlIGZpbGUKKyMgQGNvbW1lbnQgSW5kaWNhdGlvbiBvZiB0aGUgc291cmNlIGZpbGUgZm9yIHRoZSBpbXBvcnQKK2ltcG9ydF9zb3VyY2VfZmlsZT1Tb3VyY2VcIEZpbGVcOlwgezB9CisKKyMKKyMgQGdyb3VwIE1lbnUgSXRlbXMKKyMKKyMgQGdyb3VwQ29tbWVudCBUaGVzZSByZXNvdXJjZXMgcmVwcmVzZW50IGFsbCBvZiB0aGUgbWVudSBhbmQgbWVudSBpdGVtIHRpdGxlcworCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IFRoZSBtZW51IHRpdGxlIGNvdmVyaW5nIGNvcHlpbmcsIHBhc3RpbmcsIGRlbGV0aW5nIG9mIGl0ZW1zCittZW51X2VkaXQ9RWRpdAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDcgQG1vZGlmaWVkIDIwMDEtMDItMDcgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK21lbnVfZWRpdF9jb3B5PUNvcHkKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTA3IEBtb2RpZmllZCAyMDAxLTAyLTA3IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCittZW51X2VkaXRfY29weV90cmlnZ2VyPWMKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTA3IEBtb2RpZmllZCAyMDAxLTAyLTA3IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCittZW51X2VkaXRfY3V0PUN1dAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDcgQG1vZGlmaWVkIDIwMDEtMDItMDcgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK21lbnVfZWRpdF9jdXRfdHJpZ2dlcj10CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wNyBAbW9kaWZpZWQgMjAwMS0wMi0wNyBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorbWVudV9lZGl0X2RlbGV0ZT1EZWxldGUKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTA3IEBtb2RpZmllZCAyMDAxLTAyLTA3IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCittZW51X2VkaXRfZGVsZXRlX3RyaWdnZXI9ZAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDcgQG1vZGlmaWVkIDIwMDEtMDItMDcgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK21lbnVfZWRpdF9wYXN0ZT1QYXN0ZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDcgQG1vZGlmaWVkIDIwMDEtMDItMDcgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK21lbnVfZWRpdF9wYXN0ZV90cmlnZ2VyPXAKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI0IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgVGhlIHRyaWdnZXIgaXMgYSBsZXR0ZXIgZnJvbSB0aGUgdHJhbnNsYXRpb24gb2YgJ21lbnVfZWRpdCcgd2hpY2ggcHJvdmlkZXMgYSBrZXlib2FyZCBzaG9ydGN1dCB0byB0aGUgbWVudQorbWVudV9lZGl0X3RyaWdnZXI9ZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjQgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBNZW51IHRpdGxlIGZvciB0aGUgb3BlbmluZywgc2F2aW5nLCBldGMuIGRvY3VtZW50cyBhbmQgZXhpdGluZyB0aGUgcHJvZ3JhbQorbWVudV9maWxlPUZpbGUKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTE1IEBtb2RpZmllZCAyMDAxLTAxLTE1IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgQWJpbGl0eSB0byBleHBvcnQgcmVzb3VyY2UgYnVuZGxlcyBpbiBhIHZhcmlldHkgb2YgZm9ybWF0cworbWVudV9maWxlX2V4cG9ydD1FeHBvcnRcIFJlc291cmNlXCBCdW5kbGVzCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMi0wNS0xNyBAbW9kaWZpZWQgMjAwMi0wNS0xNyBAY3JlYXRvciBHZW9yZ2UgUmhvdGVuIEBtb2RpZmllciBHZW9yZ2UgUmhvdGVuCisjIEBjb21tZW50IEFibGl0eSB0byBleHBvcnQgdG8gSUNVIFJlc291cmNlIEJ1bmRsZSBmaWxlcworbWVudV9maWxlX2V4cG9ydF9JQ1U9SUNVXCBGaWxlcy4uLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDItMDUtMTcgQG1vZGlmaWVkIDIwMDItMDUtMTcgQGNyZWF0b3IgR2VvcmdlIFJob3RlbiBAbW9kaWZpZXIgR2VvcmdlIFJob3RlbgorIyBAY29tbWVudCAKK21lbnVfZmlsZV9leHBvcnRfSUNVX3RyaWdnZXI9aQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMTUgQG1vZGlmaWVkIDIwMDEtMDEtMTUgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBBYmxpdHkgdG8gZXhwb3J0IHRvIFRNWCBYTUwgZmlsZXMKK21lbnVfZmlsZV9leHBvcnRfVE1YPVRNWFwgRmlsZXMuLi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTE1IEBtb2RpZmllZCAyMDAxLTAxLTE1IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCittZW51X2ZpbGVfZXhwb3J0X1RNWF90cmlnZ2VyPXQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDA0LTA3LTAxIEBtb2RpZmllZCAyMDA0LTA3LTAxIEBjcmVhdG9yIEdlb3JnZSBSaG90ZW4gQG1vZGlmaWVyIEdlb3JnZSBSaG90ZW4KKyMgQGNvbW1lbnQgQWJpbGl0eSB0byBleHBvcnQgWExJRkYgWE1MIGZpbGVzCittZW51X2ZpbGVfZXhwb3J0X1hMRj1YTElGRlwgRmlsZXMuLi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDA0LTA3LTAxIEBtb2RpZmllZCAyMDA0LTA3LTAxIEBjcmVhdG9yIEdlb3JnZSBSaG90ZW4gQG1vZGlmaWVyIEdlb3JnZSBSaG90ZW4KKyMgQGNvbW1lbnQgCittZW51X2ZpbGVfZXhwb3J0X1hMRl90cmlnZ2VyPXgKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTE1IEBtb2RpZmllZCAyMDAxLTAxLTE1IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgQWJpbGl0eSB0byBleHBvcnQgdG8gamF2YSBmaWxlcyB0aGF0IGNvbXBpbGUgdG8gYmUgTGlzdFJlc291cmNlQnVuZGxlIGNsYXNzIGV4dGVuc2lvbnMKK21lbnVfZmlsZV9leHBvcnRfamF2YT1Db21waWxhYmxlXCBKYXZhXCBGaWxlcy4uLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMTUgQG1vZGlmaWVkIDIwMDEtMDEtMTUgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK21lbnVfZmlsZV9leHBvcnRfamF2YV90cmlnZ2VyPWoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTE1IEBtb2RpZmllZCAyMDAxLTAxLTE1IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgRXhwb3J0IGFiaWxpdHkgdG8gcHJvcGVydGllcyBmaWxlcyBtaW51cyB0aGUgbWV0YWRhdGEKK21lbnVfZmlsZV9leHBvcnRfcHJvcGVydGllcz1NaW5pbWFsXCBQcm9wZXJ0aWVzXCBGaWxlcy4uLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMTUgQG1vZGlmaWVkIDIwMDEtMDEtMTUgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK21lbnVfZmlsZV9leHBvcnRfcHJvcGVydGllc190cmlnZ2VyPXMKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTE1IEBtb2RpZmllZCAyMDAxLTAxLTE1IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCittZW51X2ZpbGVfZXhwb3J0X3RyaWdnZXI9eAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjQgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBNZW51IGl0ZW0gZm9yIGltcG9ydCBhbmQgbWVyZ2luZyBhbm90aGVyIHJlc291cmNlIGZpbGUgd2l0aCB0aGUgYnVuZGxlIGJlaW5nIHdvcmtlZCB3aXRoCittZW51X2ZpbGVfaW1wb3J0PU1lcmdlXCAoSW1wb3J0XCBpbnRvKVwgVG9cIFJlc291cmNlXCBCdW5kbGUKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTE1IEBtb2RpZmllZCAyMDAxLTAxLTE1IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgSW1wb3J0IGFibGlpdHkgZnJvbSBYTUwgVE1YIGRvY3VtZW50cworbWVudV9maWxlX2ltcG9ydF9UTVg9VE1YXCBEb2N1bWVudHMuLi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTE1IEBtb2RpZmllZCAyMDAxLTAxLTE1IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCittZW51X2ZpbGVfaW1wb3J0X1RNWF90cmlnZ2VyPXQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDA0LTA3LTAxIEBtb2RpZmllZCAyMDA0LTA3LTA2IEBjcmVhdG9yIEdlb3JnZSBSaG90ZW4gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgSW1wb3J0IGFiaWxpdHkgZnJvbSBYTUwgWExJRkYgKC54bGYpIGZpbGVzCittZW51X2ZpbGVfaW1wb3J0X1hMRj1YTElGRlwgRG9jdW1lbnRzLi4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwNC0wNy0wMSBAbW9kaWZpZWQgMjAwNC0wNy0wNiBAY3JlYXRvciBHZW9yZ2UgUmhvdGVuIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IAorbWVudV9maWxlX2ltcG9ydF9YTEZfdHJpZ2dlcj1YCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0xNSBAbW9kaWZpZWQgMjAwMS0wMS0xNSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEltcG9ydCBhYmlsaXR5IGZyb20gamF2YSBjbGFzc2VzIChMaXN0UmVzb3VyY2VCdW5kbGUpCittZW51X2ZpbGVfaW1wb3J0X2phdmE9TGlzdFJlc291cmNlQnVuZGxlXCBKYXZhXCBDbGFzc2VzLi4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0xNSBAbW9kaWZpZWQgMjAwMS0wMS0xNSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorbWVudV9maWxlX2ltcG9ydF9qYXZhX3RyaWdnZXI9agorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMTUgQG1vZGlmaWVkIDIwMDEtMDEtMTUgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBJbXBvcnQgYWJpbGl0eSBmcm9tIHByb3BlcnRpZXMgZmlsZXMgbm90IGdlbmVyYXRlZCBieSBSQk1hbmFnZXIKK21lbnVfZmlsZV9pbXBvcnRfcHJvcGVydGllcz1TaW1wbGVcIFJlc291cmNlXCBCdW5kbGVzLi4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0xNSBAbW9kaWZpZWQgMjAwMS0wMS0xNSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorbWVudV9maWxlX2ltcG9ydF9wcm9wZXJ0aWVzX3RyaWdnZXI9UworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjQgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCAKK21lbnVfZmlsZV9pbXBvcnRfdHJpZ2dlcj1tCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IE1lbnUgaXRlbSBmb3IgY3JlYXRpbmcgYSBuZXcgcmVzb3VyY2UgYnVuZGxlCittZW51X2ZpbGVfbmV3PU5ld1wgUmVzb3VyY2VcIEJ1bmRsZS4uLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjQgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCAKK21lbnVfZmlsZV9uZXdfdHJpZ2dlcj1uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IE1lbnUgSXRlbSBmb3Igb3BlbmluZyBhIHJlc291cmNlIGJ1bmRsZQorbWVudV9maWxlX29wZW49T3BlblwgUmVzb3VyY2VcIEJ1bmRsZS4uLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjQgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCAKK21lbnVfZmlsZV9vcGVuX3RyaWdnZXI9bworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjQgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBNZW51IGl0ZW0gZm9yIGNsb3NpbmcgdGhlIGFwcGxpY2F0aW9uCittZW51X2ZpbGVfcXVpdD1RdWl0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IAorbWVudV9maWxlX3F1aXRfdHJpZ2dlcj1xCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IE1lbnUgaXRlbSBmb3Igc2F2aW5nIHRoZSByZXNvdXJjZSBidW5kbGUgYmVpbmcgd29ya2VkIHdpdGgKK21lbnVfZmlsZV9zYXZlPVNhdmVcIFJlc291cmNlXCBCdW5kbGUKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIGEKKyMgQGNvbW1lbnQgCittZW51X2ZpbGVfc2F2ZV90cmlnZ2VyPXMKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI0IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgTWVudSBJdGVtIGZvciBzYXZpbmcgYSByZXNvdXJjZSBidW5kbGUgdG8gYSBwYXJ0aWN1bGFyIGxvY2F0aW9uIGFuZCBmaWxlIG5hbWUKK21lbnVfZmlsZV9zYXZlYXM9U2F2ZVwgUmVzb3VyY2VcIEJ1bmRsZVwgQXMuLi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI0IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgCittZW51X2ZpbGVfc2F2ZWFzX3RyaWdnZXI9YQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjQgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBUaGUgdHJpZ2dlciBpcyBhIGxldHRlciBmcm9tIHRoZSB0cmFuc2xhdGlvbiBvZiAnbWVudV9maWxlJyB3aGljaCBwcm92aWRlcyBhIGtleWJvYXJkIHNob3J0Y3V0IHRvIHRoZSBtZW51CittZW51X2ZpbGVfdHJpZ2dlcj1mCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IE1lbnUgdGl0bGUgZm9yIGhlbHAgaW5mb3JtYXRpb24gYW5kIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByb2dyYW0KK21lbnVfaGVscD1IZWxwCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IE1lbnUgaXRlbSB3aGljaCBicmluZ3MgdXAgYSBkaWFsb2cgZGVzY3JpYmluZyB0aGUgYXBwbGljYXRpb24KK21lbnVfaGVscF9hYm91dD1BYm91dFwgUmVzb3VyY2VcIEJ1bmRsZVwgTWFuYWdlci4uLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjQgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCAKK21lbnVfaGVscF9hYm91dF90cmlnZ2VyPWEKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI0IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgVGhlIHRyaWdnZXIgaXMgYSBsZXR0ZXIgZnJvbSB0aGUgdHJhbnNsYXRpb24gb2YgJ21lbnVfaGVscCcgd2hpY2ggcHJvdmlkZXMgYSBrZXlib2FyZCBzaG9ydGN1dCB0byB0aGUgbWVudQorbWVudV9oZWxwX3RyaWdnZXI9aAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjQgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBNZW51IHRpdGxlIGZvciBvcHRpb25zIHN1Y2ggYXMgY3JlYXRpbmcgbmV3IHJlc291cmNlcywgZ3JvdXBzLCBhbmQgcmVzb3VyY2UgZmlsZXMKK21lbnVfb3B0aW9ucz1PcHRpb25zCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IE1lbnUgSXRlbSBmb3IgY3JlYXRpbmcgYSBuZXcgcmVzb3VyY2UgaXRlbQorbWVudV9vcHRpb25zX2FkZGVudHJ5PUFkZFwgTmV3XCBFbnRyeS4uLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjQgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCAKK21lbnVfb3B0aW9uc19hZGRlbnRyeV90cmlnZ2VyPWUKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI0IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgTWVudSBJdGVtIGZvciBjcmVhdGluZyBhIG5ldyByZXNvdXJjZSBmaWxlIGZvciBhIHBhcnRpY3VsYXIgbGFuZ3VhZ2UvY291bnRyeS92YXJpYW50CittZW51X29wdGlvbnNfYWRkZmlsZT1BZGRcIE5ld1wgUmVzb3VyY2VcIEZpbGUuLi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI0IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgCittZW51X29wdGlvbnNfYWRkZmlsZV90cmlnZ2VyPWYKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI0IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgTWVudSBpdGVtIGZvciBjcmVhdGluZyBhIG5ldyByZXNvdXJjZSBncm91cAorbWVudV9vcHRpb25zX2FkZGdyb3VwPUFkZFwgTmV3XCBHcm91cC4uLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjQgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCAKK21lbnVfb3B0aW9uc19hZGRncm91cF90cmlnZ2VyPWcKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI1IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCBNZW51IGl0ZW0gZm9yIGVkaXRpbmcgdGhlIHVzZXIncyBwcmVmZXJlbmNlcyBmb3IgdGhlIGFwcGxpY2F0aW9uCittZW51X29wdGlvbnNfcHJlZmVyZW5jZXM9UHJlZmVyZW5jZXMuLi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI1IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCAKK21lbnVfb3B0aW9uc19wcmVmZXJlbmNlc190cmlnZ2VyPXAKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTExLTIwIEBtb2RpZmllZCAyMDAxLTExLTIwIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgTWVudSBpdGVtIHRoYXQgbWFrZXMgdmlzaWJsZSB0aGUgcHJvamVjdCB2aWV3ZXIKK21lbnVfb3B0aW9uc19wcm9qZWN0X3ZpZXdlcj1PcGVuXCBQcm9qZWN0XCBWaWV3ZXIKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTExLTIwIEBtb2RpZmllZCAyMDAxLTExLTIwIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgCittZW51X29wdGlvbnNfcHJvamVjdF92aWV3ZXJfdHJpZ2dlcj12CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IFRoZSB0cmlnZ2VyIGlzIGEgbGV0dGVyIGZyb20gdGhlIHRyYW5zbGF0aW9uIG9mICdtZW51X29wdGlvbnMnIHdoaWNoIHByb3ZpZGVzIGEga2V5Ym9hcmQgc2hvcnRjdXQgdG8gdGhlIG1lbnUKK21lbnVfb3B0aW9uc190cmlnZ2VyPW8KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTEyLTE3IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgUG9wdXAgbWVudSBpdGVtIGZvciBhZGRpbmcgYSBuZXcgcmVzb3VyY2UgYnVuZGxlIHRvIHRoZSBwcm9qZWN0CittZW51X3RyZWVfYWRkX3Byb2plY3RfYnVuZGxlPUFkZFwgUmVzb3VyY2VcIEJ1bmRsZS4uLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDYtMjcgQG1vZGlmaWVkIDIwMDEtMDYtMjcgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBQb3B1cCBtZW51IGl0ZW0gZm9yIGRlbGV0aW5nIHBlcm1hbmVudGx5IGEgcmVzb3VyY2UgZmlsZQorbWVudV90cmVlX2RlbGV0ZT1EZWxldGVcIFJlc291cmNlXCBGaWxlCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wNi0yNyBAbW9kaWZpZWQgMjAwMS0wNi0yNyBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IFBvcHVwIG1lbnUgaXRlbSBmb3IgcmVtb3ZpbmcgYSBzcGVjaWZpYyByZXNvdXJjZSBmaWxlIGZyb20gdGhlIHRyZWUgdmlldyBvZiB0aGUgcmVzb3VyY2UgYnVuZGxlCittZW51X3RyZWVfaGlkZT1IaWRlXCBSZXNvdXJjZVwgRmlsZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTkgQG1vZGlmaWVkIDIwMDEtMTItMTkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBQb3B1cCBtZW51IGl0ZW0gZm9yIGNyZWF0aW5nIGEgbmV3IHByb2plY3QKK21lbnVfdHJlZV9uZXdfcHJvamVjdD1OZXdcIFJlc291cmNlXCBCdW5kbGVcIFByb2plY3QuLi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTEyLTE3IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgUG9wdXAgbWVudSBpdGVtIGZvciBvcGVuaW5nIGEgcmVzb3VyY2UgYnVuZGxlIHByb2plY3QKK21lbnVfdHJlZV9vcGVuX3Byb2plY3Q9T3BlblwgUmVzb3VyY2VcIEJ1bmRsZVwgUHJvamVjdC4uLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMTItMTcgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBQb3B1cCBtZW51IGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlIGJ1bmRsZSBpbiB0aGUgcHJvamVjdCB0cmVlCittZW51X3RyZWVfcmVtb3ZlX3Byb2plY3RfYnVuZGxlPVJlbW92ZVwgZnJvbVwgUHJvamVjdAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDYtMjcgQG1vZGlmaWVkIDIwMDEtMDYtMjcgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBQb3B1cCBtZW51IGl0ZW0gZm9yIHNhdmluZyBhIHNwZWNpZmljIHJlc291cmNlIGJ1bmRsZSBmaWxlCittZW51X3RyZWVfc2F2ZT1TYXZlXCBSZXNvdXJjZVwgRmlsZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMTItMTcgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBQb3B1cCBtZW51IGl0ZW0gZm9yIHNhdmluZyBjaGFuZ2VzIHRvIHRoZSByZXNvdXJjZSBwcm9qZWN0IGZpbGUsIG5vdCB0aGUgcmVzb3VyY2UgYnVuZGxlcyB0aGVtc2VsdmVzIHdpdGhpbiB0aGUgcHJvamVjdAorbWVudV90cmVlX3NhdmVfcHJvamVjdD1TYXZlXCBSZXNvdXJjZVwgQnVuZGxlXCBQcm9qZWN0XCBGaWxlLi4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0xMi0xNyBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IFBvcHVwIG1lbnUgZm9yIHNlbGVjdGluZyBhIHJlc291cmNlIGJ1bmRsZSBmcm9tIHRoZSBwcm9qZWN0IHRyZWUgdG8gYmUgZWRpdGVkIGluIHRoZSByZXNvdXJjZSBidW5kbGUgdHJlZQorbWVudV90cmVlX3NlbGVjdF9wcm9qZWN0X2J1bmRsZT1Xb3JrXCB3aXRoXCB0aGlzXCBSZXNvdXJjZVwgQnVuZGxlCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IE1lbnUgdGl0bGUgZm9yIGNoYW5naW5nIHRoZSBkaXNwbGF5IGJlaW5nIHNlZW4gYnkgdGhlIHVzZXIKK21lbnVfdmlldz1WaWV3CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IE1lbnUgaXRlbSB0aGF0IHRha2VzIHlvdSBkaXJlY3RseSB0byB0aGUgc3RhdGlzdGljcyBwYW5lbCBmb3IgdGhlIGVudGlyZSBidW5kbGUKK21lbnVfdmlld19zdGF0aXN0aWNzPVZpZXdcIFJlc291cmNlXCBCdW5kbGVcIFN0YXRpc3RpY3MKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI0IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgCittZW51X3ZpZXdfc3RhdGlzdGljc190cmlnZ2VyPXMKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI0IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgVGhlIHRyaWdnZXIgaXMgYSBsZXR0ZXIgZnJvbSB0aGUgdHJhbnNsYXRpb24gb2YgJ21lbnVfdmlldycgd2hpY2ggcHJvdmlkZXMgYSBrZXlib2FyZCBzaG9ydGN1dCB0byB0aGUgbWVudQorbWVudV92aWV3X3RyaWdnZXI9dgorCisjCisjIEBncm91cCBQcm9qZWN0IFBhbmVsCisjCisjIEBncm91cENvbW1lbnQgUGFuZWwgYXNzb2NpYXRlZCB3aXRoIFByb2plY3QgZWRpdGluZworCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xOSBAbW9kaWZpZWQgMjAwMS0xMi0xOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEB7MH0gVGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIGJ1bmRsZQorIyBAY29tbWVudCBMYWJlbCBpbmRpY2F0b3IgYXNzb2NpYXRpbmcgYSB0ZXh0IGJveCBjb250YWluaW5nIGEgdHJhbnNsYXRpb24gd2l0aCB0aGUgcmVzb3VyY2UgYnVuZGxlIHRoZSB0cmFuc2xhdGlvbiBjb21lcyBmcm9tCitwcm9qZWN0X3BhbmVsX2J1bmRsZT1SZXNvdXJjZVwgQnVuZGxlXDpcIHswfQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTkgQG1vZGlmaWVkIDIwMDEtMTItMTkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAezB9IE5hbWUgb2YgdGhlIHJlc291cmNlIGJ1bmRsZQorIyBAY29tbWVudCBTcGVjaWFsIGluZGljYXRvciBvZiB0aGUgcmVzb3VyY2UgaXRlbSByZXNvdXJjZSBidW5kbGUgd2hlbiB0aGUgaXRlbSBpcyB1bnRyYW5zbGF0ZWQKK3Byb2plY3RfcGFuZWxfYnVuZGxlX3VudHJhbnNsYXRlZD1SZXNvdXJjZVwgQnVuZGxlXDpcIHswfVwgKFVudHJhbnNsYXRlZCkKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE5IEBtb2RpZmllZCAyMDAxLTEyLTE5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgTGFiZWwgdGV4dCBtYXJraW5nIHRoZSBsaW5lIGFib3ZlIG9yIHRvIHRoZSBsZWZ0IG9mIGEgcmVzb3VyY2UgY29tbWVudAorcHJvamVjdF9wYW5lbF9jb21tZW50PUJhc2VcIENsYXNzXCBSZXNvdXJjZVwgQ29tbWVudFw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xOSBAbW9kaWZpZWQgMjAwMS0xMi0xOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IExhYmVsIHRleHQgZm9yIGEgY29tbWVudCB3aGVuIG5vbmUgaXMgZm91bmQgZm9yIGEgcmVzb3VyY2UKK3Byb2plY3RfcGFuZWxfY29tbWVudF9ub25lPU5vXCBjb21tZW50XCBzdXBwbGllZAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTkgQG1vZGlmaWVkIDIwMDEtMTItMTkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBCdXR0b24gdGl0bGUgc2hvd24gb24gdGhlIHByb2plY3QgcGFuZWwgZm9yIGNvbW1pdHRpbmcgY2hhbmdlIHRvIG9uZSByZXNvdXJjZSBvbmx5Citwcm9qZWN0X3BhbmVsX2NvbW1pdF9idXR0b249Q29tbWl0XCBDaGFuZ2UKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE5IEBtb2RpZmllZCAyMDAxLTEyLTE5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgQnV0dG9uIHRpdGxlIG9uIHRoZSBwcm9qZWN0IHBhbmVsIGZvciBzYXZpbmcgYWxsIG9mIHRoZSByZXNvdXJjZXMgZGlzcGxheWVkLiBUaGlzIG1lYW5zIG11bHRpcGxlIHJlc291cmNlIGZpbGVzIGdldCBzYXZlZC4KK3Byb2plY3RfcGFuZWxfY29tbWl0X2J1dHRvbl9hbGw9Q29tbWl0XCBBbGxcIFJlc291cmNlXCBDaGFuZ2VzCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xOSBAbW9kaWZpZWQgMjAwMS0xMi0xOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IERlZmF1bHQgdGl0bGUgc2hvd24gb24gdGhlIHByb2plY3QgcGFuZWwgd2hlbiBubyBwYXJ0aWN1bGFyIHJlc291cmNlIGhhcyBiZWVuIHNlbGVjdGVkCitwcm9qZWN0X3BhbmVsX2RlZmF1bHRfdGl0bGU9UHJvamVjdFwgUmVzb3VyY2VcIEVkaXRpbmcKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE5IEBtb2RpZmllZCAyMDAxLTEyLTE5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgVGV4dCBmaWVsZCBtYXJrZXIgZm9yIHRoZSB0cmFuc2xhdGlvbiBvZiBhIHJlc291cmNlIHdoZW4gdGhhdCByZXNvdXJjZSBkb2VzIG5vdCBleGlzdCBmb3IgdGhlIGVuY29kaW5nIGZpbGUgaXQgaXMgYXNzb2NpYXRlZCB3aXRoCitwcm9qZWN0X3BhbmVsX2l0ZW1faW5oZXJpdHM9PE5vXCBUcmFuc2xhdGlvblw6XCBSZXNvdXJjZVwgSW5oZXJpdHNcIGZyb21cIHBhcmVudD4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE5IEBtb2RpZmllZCAyMDAxLTEyLTE5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQHswfSBUaGUga2V5IG9mIHRoZSBzZWxlY3RlZCByZXNvdXJjZQorIyBAY29tbWVudCBUaXRsZSBvbiB0aGUgcHJvamVjdCBwYW5lbCB3aGlsZSBhIHJlc291cmNlIGlzIHNlbGVjdGVkCitwcm9qZWN0X3BhbmVsX3RpdGxlPVByb2plY3RcIFJlc291cmNlXCBFZGl0aW5nXDpcIHswfQorCisjCisjIEBncm91cCBSQlJlcG9ydGVyCisjCisjIEBncm91cENvbW1lbnQgVHJhbnNsYXRpb25zIGZvciB0aGUgUkJSZXBvcnRlciBhcHBsaWNhdGlvbgorCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMC0xMS0xNyBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgQnV0dG9uIHRpdGxlIGZvciBzZWxlY3RpbmcgZmlsZSBsb2NhdGlvbnMgZm9yIGlucHV0L291dHB1dAorcmVwb3J0ZXJfYnV0dG9uX2Nob29zZT1DaG9vc2UuLi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAwLTExLTE3IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCBCdXR0b24gaW5kaWNhdGluZyB0aGUgcmVwb3J0IGdlbmVyYXRpb24gc2hvdWxkIG9jY3VyIGltbWVkaWF0ZWx5CityZXBvcnRlcl9idXR0b25fbm93PVVwZGF0ZVwgTm93CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0yOSBAbW9kaWZpZWQgMjAwMC0xMS0yOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEJ1dHRvbiB0aXRsZSBmb3Igc2F2aW5nIHRoZSBjdXJyZW50IHNldHRpbmdzIGFzIGRlZmF1bHQKK3JlcG9ydGVyX2J1dHRvbl9zYXZlX2RlZmF1bHRzPVNhdmVcIHRoZVwgQ3VycmVudFwgU2V0dGluZ3NcIGFzXCBEZWZhdWx0cworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDAtMTEtMTcgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IEJ1dHRvbiB0byBhY3RpdmF0ZSB0aGUgcmVwb3J0ZXIKK3JlcG9ydGVyX2J1dHRvbl9zdGFydD1TdGFydAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDAtMTEtMTcgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IEJ1dHRvbiB0byBkZWFjdGl2ZSB0aGUgcmVwb3J0ZXIKK3JlcG9ydGVyX2J1dHRvbl9zdG9wPVN0b3AKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAwLTExLTE3IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCBMZXZlbCBvZiBkZXRhaWw6IG1vc3QgaW5mb3JtYXRpb24gYXZhaWxhYmxlCityZXBvcnRlcl9kZXRhaWxfaGlnaD1IaWdoCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMC0xMS0xNyBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgSW5kaWNhdGlvbiBvZiBhIHNlbGVjdGlvbiBvcHRpb24gb2YgdGhlIGxldmVsIG9mIGRldGFpbCBpbiByZXBvcnRpbmcKK3JlcG9ydGVyX2RldGFpbF9sZXZlbD1EZXRhaWxcIExldmVsXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAwLTExLTE3IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCBMZXZlbCBvZiBkZXRhaWw6IHN0YW5kYXJkCityZXBvcnRlcl9kZXRhaWxfbm9ybWFsPU5vcm1hbAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDAtMTEtMTcgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IEFuIG91dHB1dCBmb3JtYXQ6IEhUTUwKK3JlcG9ydGVyX2Zvcm1hdF9odG1sPUhUTUwKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAwLTExLTE3IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCBBbiBvdXRwdXQgZm9ybWF0IHR5cGU6IHBsYWluIHRleHQKK3JlcG9ydGVyX2Zvcm1hdF90ZXh0PVRleHQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAwLTExLTE3IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCBBbiBvdXRwdXQgZm9ybWF0OiBYTUwKK3JlcG9ydGVyX2Zvcm1hdF94bWw9WE1MCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMC0xMS0xNyBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgSW5kaWNhdGlvbiBvZiBmaWxlIGxvY2F0aW9uIG9mIHRoZSByZXNvdXJjZSBidW5kbGUgdG8gcmVwb3J0IG9uCityZXBvcnRlcl9pbnB1dF9idW5kbGU9UmVzb3VyY2VcIEJ1bmRsZVw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMC0xMS0xNyBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgSW5kaWNhdGlvbiB0aGF0IHJlcG9ydGluZyB3aWxsIGhhcHBlbiBhdCBhIHNwZWNpaWZpZWQgdGltZSBvZiBkYXkuIEZvbGxvd2VkIGJ5IGEgdGltZSBhbmQgZGF5IG9wdGlvbi4KK3JlcG9ydGVyX2ludGVydmFsX2RlZmluZWQ9UmVwb3J0XCBhdAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDAtMTEtMTcgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IFRleHQgaW5kaWNhdGlvbiBvZiBzZXF1ZW50aWFsIHJlcG9ydGluZyBwYXVzZWQgZm9yIGEgZGVmaW5lZCBpbnRlcnZhbCBiZXR3ZWVuIHJlcG9ydGluZy4gSW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSBudW1iZXIgYW5kIGEgdW5pdCBvZiBtZWFzdXJlIG9mIHRpbWUKK3JlcG9ydGVyX2ludGVydmFsX3NlcXVlbnRpYWw9UmVwb3J0XCBldmVyeQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDAtMTEtMTcgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEB7MH0gRGF0ZS9UaW1lIG9mIGxhc3QgcmVwb3J0IGdlbmVyYXRpb24KKyMgQGNvbW1lbnQgSW5kaWNhdGlvbiBvZiB0aGUgdGltZSBvZiB0aGUgbGFzdCByZXBvcnQKK3JlcG9ydGVyX2xhc3RfcmVwb3J0PUxhc3RcIFJlcG9ydFw6XCB7MH0KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAwLTExLTE3IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAezB9IERhdGUvVGltZSBvZiBuZXh0IHJlcG9ydAorIyBAY29tbWVudCBJbmRpY2F0aW9uIG9mIHdoZW4gdGhlIG5leHQgcmVwb3J0IHdpbGwgYmUgZ2VuZXJhdGVkCityZXBvcnRlcl9uZXh0X3JlcG9ydD1OZXh0XCBSZXBvcnRcOlwgezB9CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMC0xMS0xNyBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgSW5kaWNhdGlvbiBvZiB0aGUgb3V0cHV0IGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSByZXBvcnRzIGFyZSBwbGFjZWQKK3JlcG9ydGVyX291dHB1dF9kaXJlY3Rvcnk9T3V0cHV0XCBEaXJlY3RvcnlcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDAtMTEtMTcgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IEFuIGluZGljYXRpb24gb2YgdGhlIG5hbWUgb2YgdGhlIG91dHB1dCBmaWxlIGZvciBhIHBhcnRpY3VsYXIgb3V0cHV0IGZvcm1hdAorcmVwb3J0ZXJfb3V0cHV0X2ZpbGU9RmlsZVwgTmFtZVw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMC0xMS0xNyBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgUGFuZWwgdGl0bGUgZm9yIHNldHRpbmcgaW50ZXJ2YWwgb2YgcmVwb3J0aW5nCityZXBvcnRlcl9wYW5lbF9pbnRlcnZhbD1SZXBvcnRcIEludGVydmFsCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMC0xMS0xNyBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgUGFuZWwgdGl0bGUgZm9yIGNvbmZpZ3VyYWJsZSBvcHRpb25zIG9mIHRoZSByZXBvcnRpbmcKK3JlcG9ydGVyX3BhbmVsX29wdGlvbnM9UmVwb3J0XCBPcHRpb25zCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMC0xMS0xNyBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgU3VicGFuZWwgdGl0bGUgZm9yIGNob29zaW5nIG91dHB1dCBmb3JtYXRzIGZvciB0aGUgcmVwb3J0cworcmVwb3J0ZXJfcGFuZWxfb3V0cHV0X2Zvcm1hdD1PdXRwdXRcIEZvcm1hdAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDAtMTEtMTcgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IFBhbmVsIHRpdGxlIGZvciBpbmRpY2F0aW9uIG9mIHJ1bm5pbmcgc3RhdHVzIG9mIHRoZSByZXBvcnRlcgorcmVwb3J0ZXJfcGFuZWxfc3RhdHVzPVN0YXR1cworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDYgQG1vZGlmaWVkIDIwMDEtMDItMDYgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBTaG9ydCB0aXRsZSBmb3Igc2VsZWN0aW5nIGEgY29kZSBzY2FuIGNvbmZpZ3VyYXRpb24gZmlsZQorcmVwb3J0ZXJfcGVyZm9ybV9zY2FuPUNvZGVcIFNjYW5cIEZpbGUKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAwLTExLTE3IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCBRdWljayBpbmRpY2F0aW9uIHRoYXQgdGhlIHJlcG9ydGVyIGlzIGFjdGl2ZSAocGVyaGFwcyB3YWl0aW5nKQorcmVwb3J0ZXJfc3RhdHVzX3J1bm5pbmc9U3RhcnRlZAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDAtMTEtMTcgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IFF1aWNrIHN0YXR1cyBpbmRpY2F0aW9uIHRoYXQgdGhlIHJlcG9ydGVyIGlzIG5vdCBhY3RpdmUKK3JlcG9ydGVyX3N0YXR1c19zdG9wcGVkPVN0b3BwZWQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAwLTExLTE3IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCBkYXlzIG9wdGlvbgorcmVwb3J0ZXJfdGltZV9kYXlzPURheXMKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAwLTExLTE3IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCBldmVyeSBkYXkgb3B0aW9uCityZXBvcnRlcl90aW1lX2V2ZXJ5ZGF5PUV2ZXJ5XCBkYXkKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAwLTExLTE3IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCBmcmlkYXkgb3B0aW9uCityZXBvcnRlcl90aW1lX2ZyaWRheT1GcmlkYXkKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAwLTExLTE3IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCBob3VycyBvcHRpb24KK3JlcG9ydGVyX3RpbWVfaG91cnM9SG91cnMKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAwLTExLTE3IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCBtaW51dGVzIG9wdGlvbgorcmVwb3J0ZXJfdGltZV9taW51dGVzPU1pbnV0ZXMKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAwLTExLTE3IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCBtb25kYXkgb3B0aW9uCityZXBvcnRlcl90aW1lX21vbmRheT1Nb25kYXkKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAwLTExLTE3IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCBzYXR1cmRheSBvcHRpb24KK3JlcG9ydGVyX3RpbWVfc2F0dXJkYXk9U2F0dXJkYXkKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAwLTExLTE3IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCBzdW5kYXkgb3B0aW9uCityZXBvcnRlcl90aW1lX3N1bmRheT1TdW5kYXkKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAwLTExLTE3IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCB0aHVyc2RheSBvcHRpb24KK3JlcG9ydGVyX3RpbWVfdGh1cnNkYXk9VGh1cnNkYXkKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAwLTExLTE3IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCB0dWVzZGF5IG9wdGlvbgorcmVwb3J0ZXJfdGltZV90dWVzZGF5PVR1ZXNkYXkKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAwLTExLTE3IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCB3ZWRuZXNkYXkgb3B0aW9uCityZXBvcnRlcl90aW1lX3dlZG5lc2RheT1XZWRuZXNkYXkKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAwLTExLTE3IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCBUaXRsZSBvZiB0aGUgYXBwbGljYXRpb24KK3Jlc291cmNlX2J1bmRsZV9yZXBvcnRlcj1SQlJlcG9ydGVyCisKKyMKKyMgQGdyb3VwIFNlYXJjaCBhbmQgUmVwbGFjZQorIworIyBAZ3JvdXBDb21tZW50IFJlc291cmNlcyBmb3VuZCBvbiB0aGUgc2VhcmNoIHRhYiBwYW5lCisKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTA2IEBtb2RpZmllZCAyMDAxLTAyLTA2IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgR2VuZXJhbCBzZWFyY2ggdGl0bGUKK3NlYXJjaD1TZWFyY2gKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTA3IEBtb2RpZmllZCAyMDAxLTAyLTA3IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgQ2hlY2sgYm94IG9wdGlvbiBmb3IgbWFraW5nIHRoZSBzZWFyY2ggY2FzZSBzZW5zaXRpdmUgb3Igbm90CitzZWFyY2hfY2FzZV9zZW5zaXRpdmU9Q2FzZVwgU2Vuc2l0aXZlXCBTZWFyY2gKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTA2IEBtb2RpZmllZCAyMDAxLTAyLTA2IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgQ2hlY2sgYm94IG9wdGlvbiBmb3Igc2VhcmNoaW5nIHRocm91Z2ggcmVzb3VyY2UgY29tbWVudHMKK3NlYXJjaF9jb21tZW50cz1Db21tZW50cworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDYgQG1vZGlmaWVkIDIwMDEtMDItMDYgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUZXh0IGluZGljYXRpb24gb2YgdGhlIGZpZWxkIGZvciBlbnRlcmluZyB0ZXh0IHRvIHNlYXJjaCBvbgorc2VhcmNoX2ZpbmQ9RmluZFw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wNiBAbW9kaWZpZWQgMjAwMS0wMi0wNiBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IENoZWNrIGJveCBzZWxlY3Rpb24gZm9yIHNlYXJjaGluZyBvcHRpb24gdGhyb3VnaCByZXNvdXJjZSBrZXlzCitzZWFyY2hfa2V5cz1SZXNvdXJjZVwgS2V5cworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDYgQG1vZGlmaWVkIDIwMDEtMDItMDYgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUZXh0IGluZGljYXRpb24gb2YgdGhlIGZpZWxkIGZvciBlbnRlcmluZyB0ZXh0IGZvciByZXBsYWNpbmcgdGhlIGZvdW5kIHZhbHVlCitzZWFyY2hfcmVwbGFjZT1SZXBsYWNlXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTA2IEBtb2RpZmllZCAyMDAxLTAyLTA2IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgQ2hlY2sgYm94IG9wdGlvbiBmb3Igc2VhcmNoaW5nIHRocm91Z2ggdHJhbnNsYXRpb24gdmFsdWVzCitzZWFyY2hfdmFsdWVzPVRyYW5zbGF0aW9ucworCisjCisjIEBncm91cCBUYWJzCisjCisjIEBncm91cENvbW1lbnQgR1VJIFRhYnMgaW4gdGhlIG1haW4gcGFuZWwKKworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMTItMTcgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBHVUkgVGFiIGZvciBUYWJiZWQgUGFuZSBvdmVyIHRoZSB0cmVlIHNob3dpbmcgYSBzaW5nbGUgcmVzb3VyY2UgYnVuZGxlIGFuZCBpdHMgdmFyaW91cyBmaWxlcwordGFiX2J1bmRsZT1CdW5kbGUKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI0IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCBUYWIgZm9yIHRoZSBkaXNwbGF5IG9mIHRoZSB2YXJpb3VzIGdyb3VwcyBpbiB0aGUgYnVuZGxlCit0YWJfZ3JvdXBzPUdyb3VwcworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMTItMTcgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBHVUkgVGFiIGZvciB0YWIgb3ZlciB0cmVlIHNob3dpbmcgYSByZXNvdXJjZSBidW5kbGUgcHJvamVjdAordGFiX3Byb2plY3Q9UHJvamVjdAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDYgQG1vZGlmaWVkIDIwMDEtMDItMDYgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUaXRsZSBmb3IgcGFuZSBhbGxvd2luZyBmb3Igc2VhcmNoIGFuZCByZXBsYWNlIGZ1bmN0aW9ucwordGFiX3NlYXJjaD1TZWFyY2gKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI0IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCBUYWIgZm9yIHN0YXRpc3RpY3MgZGlzcGxheSBmb3IgZWl0aGVyIHRoZSBSZXNvdXJjZSBCdW5kbGUgYXMgYSB3aG9sZSBvciBwYXJ0aWN1bGFyIGxhbmd1YWdlIGZpbGVzCit0YWJfc3RhdGlzdGljcz1TdGF0aXN0aWNzCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgVGFiIGZvciBkaXNwbGF5IG9mIHVudHJhbnNsYXRlZCBpdGVtcyBpbiB0aGUgZGlmZmVyZW50IGxhbmd1YWdlIGZpbGVzCit0YWJfdW50cmFuc2xhdGVkPVVudHJhbnNsYXRlZAorCisjCisjIEBncm91cCBUcmFuc2xhdGlvbiBGaWxlIEdyb3VwcyBQYW5lCisjCisjIEBncm91cENvbW1lbnQgCisKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCBDb2x1bW4gdGl0bGUgZm9yIGl0ZW0gY29tbWVudHMKK2xhbmd1YWdlZ3JvdXBfY29sdW1uX2NvbW1lbnQ9Q29tbWVudAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IENvbHVtbiB0aXRsZSBmb3IgaXRlbSdzIHJlc291cmNlIGtleQorbGFuZ3VhZ2Vncm91cF9jb2x1bW5fa2V5PVJlc291cmNlXCBLZXkKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCAKK2xhbmd1YWdlZ3JvdXBfY29sdW1uX3RyYW5zbGF0aW9uPVRyYW5zbGF0aW9uCisKKyMKKyMgQGdyb3VwIFRyYW5zbGF0aW9uIEZpbGUgU3RhdGlzdGljcyBQYW5lCisjCisjIEBncm91cENvbW1lbnQgVHJhbnNsYXRpb25zIGZvciBzdHJpbmdzIGluIHRoZSBsYW5ndWFnZSBmaWxlIHN0YXRpc3RpY3MgcGFuZQorCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgQSBjb21tZW50IGdpdmVuIHRvIHRoZSBmaWxlCitsYW5ndWFnZXN0YXRzX2NvbW1lbnQ9Q29tbWVudFw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgVGhlIGNvdW50cnkgYmVpbmcgZGVzY3JpYmVkIGJ5IHRoZSBmaWxlCitsYW5ndWFnZXN0YXRzX2NvdW50cnk9Q291bnRyeVw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgVGhlIG51bWJlciBvZiByZXNvdXJjZXMgaW4gdGhlIGZpbGUKK2xhbmd1YWdlc3RhdHNfaXRlbV9jb3VudD1OdW1iZXJcIG9mXCBSZXNvdXJjZXNcIGluXCB0aGlzXCBMYW5ndWFnZVwgRmlsZVw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgVGhlIGxhbmd1YWdlIGRlc2NyaWJlZCBieSB0aGUgZmlsZQorbGFuZ3VhZ2VzdGF0c19sYW5ndWFnZT1MYW5ndWFnZVw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgVGhlIG5hbWUgb2YgYSBwZXJzb24gcmVzcG9uc2libGUgZm9yIHRoZSB0cmFuc2xhdGlvbnMgaW4gdGhpcyBsYW5ndWFnZSBmaWxlCitsYW5ndWFnZXN0YXRzX21hbmFnZXI9UmVzb3VyY2VcIEZpbGVcIE1hbmFnZXJcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IFRoZSBuYW1lIGdpdmVuIHRvIHRoZSBsYW5ndWFnZSBmaWxlCitsYW5ndWFnZXN0YXRzX3RpdGxlPVJlc291cmNlXCBUaXRsZVw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgTnVtYmVyIG9mIHJlc291cmNlcyBuZWVkaW5nIHRyYW5zbGF0aW9uIGluIHRoZSBmaWxlCitsYW5ndWFnZXN0YXRzX3RyYW5zbGF0aW9uX2NvdW50PU51bWJlclwgb2ZcIFVudHJhbnNsYXRlZFwgUmVzb3VyY2VcIEl0ZW1zXCBpblwgdGhpc1wgRmlsZVw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMC0yNiBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgVGhlIGxhbmd1YWdlL3JlZ2lvbiB2YXJpYW50IGRlc2NyaWJlZCBieSB0aGUgZmlsZQorbGFuZ3VhZ2VzdGF0c192YXJpYW50PVZhcmlhbnRcOgorCisjCisjIEBncm91cCBUcmFuc2xhdGlvbiBGaWxlIFVudHJhbnNsYXRlZCBJdGVtcyBQYW5lCisjCisjIEBncm91cENvbW1lbnQgCisKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCBUaGUgY29sdW1uIHRpdGxlIGZvciBncm91cCBuYW1lcyBvZiBpdGVtcyBpbiB0aGUgcm93cworbGFuZ3VhZ2V1bnRyYW5zX2NvbHVtbl9ncm91cD1Hcm91cAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTAtMjYgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IFRoZSBrZXkgb2YgdGhlIGl0ZW0gYSByb3cKK2xhbmd1YWdldW50cmFuc19jb2x1bW5fa2V5PVJlc291cmNlXCBLZXkKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTEwLTI2IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZAorIyBAY29tbWVudCBUaGUgdHJhbnNsYXRlZCB2YWx1ZSBvZiBhbiBpdGVtIGluIGEgcm93CitsYW5ndWFnZXVudHJhbnNfY29sdW1uX3RyYW5zbGF0aW9uPVRyYW5zbGF0aW9uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yMyBAbW9kaWZpZWQgMjAwMS0wMS0yMyBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFBhbmVsIHRpdGxlIGNvdmVyaW5nIGJ1dHRvbnMgdGhhdCBhcHBseSB0byBhIHNlbGVjdGVkIHJlc291cmNlIGZyb20gYSB0YWJsZSBvZiByZXNvdXJjZXMKK2xhbmd1YWdldW50cmFuc19zZWxlY3RlZF9yZXNvdXJjZXNfb3B0aW9ucz1PcHRpb25zXCBmb3JcIFNlbGVjdGVkXCBSZXNvdXJjZXMKZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9yZXNvdXJjZXMvUkJNYW5hZ2VyX2RlLnByb3BlcnRpZXMgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vcmVzb3VyY2VzL1JCTWFuYWdlcl9kZS5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyMGI5MDQKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vcmVzb3VyY2VzL1JCTWFuYWdlcl9kZS5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTIxMyBAQAorIyBAZmlsZSAgICAgICAgICBSQk0vR2VybWFuCisjIEBmaWxlRW5jb2RpbmcgIGRlCisjIEBmaWxlTGFuZ3VhZ2UgIERldXRzY2gKKyMgQGZpbGVDb3VudHJ5ICAgCisjIEBmaWxlVmFyaWFudCAgIAorIyBAZmlsZU1hbmFnZXIgICBNYXJ0aW4gR2VybGFjaAorIyBAZmlsZUNvbW1lbnQgICAKKworCisjCisjIEBncm91cCBCYXNlIENsYXNzIEdyb3VwcyBQYW5lCisjCisjIEBncm91cENvbW1lbnQgVHJhbnNsYXRpb24gSXRlbXMgZm9yIHRoZSBCYXNlIENsYXNzIEdyb3VwIHRhYmJlZCBwYW5lCisKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCAKK2Jhc2Vncm91cF9ncm91cF9jb21tZW50PUdydXBwZW5rb21tZW50YXJcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IAorYmFzZWdyb3VwX2dyb3VwX25hbWU9R3J1cHBlbm5hbWVcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IAorYmFzZWdyb3VwX2dyb3VwX29wdGlvbnM9UmVzb3VyY2VuZ3J1cHBlbi1PcHRpb25lbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IAorYmFzZWdyb3VwX2l0ZW1fb3B0aW9ucz1SZXNvdXJjZW4tT3B0aW9uZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCAKK2Jhc2VzdGF0c19maWxlX2dyb3VwPVJlc291cmNlbmRhdGVpZW4KKworIworIyBAZ3JvdXAgQmFzZSBDbGFzcyBTdGF0aXN0aWNzIFBhbmUKKyMKKyMgQGdyb3VwQ29tbWVudCBBbGwgdHJhbnNsYXRpb25zIGZvciBzdHJpbmdzIGFwcGVhcmluZyBvbiB0aGUgc3RhdGlzdGljcyBwYW5lIGZvciB0aGUgYmFzZSBjbGFzcworCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCitiYXNlc3RhdHNfZHVwbGljYXRlc19jb3VudD1BbnphaGxcIG1laHJmYWNoZXJcIFJlc291cmNlbnNjaGxcdTAwRkNzc2VsXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCAKK2Jhc2VzdGF0c19maWxlX2NvdW50PUFuemFobFwgUmVzb3VyY2VuZGF0ZWllblw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCitiYXNlc3RhdHNfZ3JvdXBfY291bnQ9QW56YWhsXCBSZXNvdXJjZW5ncnVwcGVuXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCAKK2Jhc2VzdGF0c19ncm91cF9ncm91cD1SZXNvdXJjZW5ncnVwcGVuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCitiYXNlc3RhdHNfaXRlbV9jb3VudD1BbnphaGxcIFJlc291cmNlblw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCitiYXNlc3RhdHNfaXRlbV9ncm91cD1SZXNvdXJjZW4KKworIworIyBAZ3JvdXAgQmFzZSBDbGFzcyBVbnRyYW5zbGF0ZWQgSXRlbXMgUGFuZQorIworIyBAZ3JvdXBDb21tZW50IFRyYW5zbGF0aW9ucyBhcHBlYXJpbmcgb24gdGhlIEJhc2UgQ2xhc3MgVW50cmFuc2xhdGVkIEl0ZW1zIHBhbmUKKworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IEluZGljYXRpb24gb2YgdGhlIGZpbGUgYmVpbmcgdmlld2VkCitiYXNldW50cmFuc19maWxlPURhdGVpXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCBJbmRpY2F0aW9uIG9mIHRoZSBudW1iZXIgb2YgcmVzb3VyY2UgaXRlbXMgbm90IHRyYW5zbGF0ZWQgaW4gdGhlIGZpbGUKK2Jhc2V1bnRyYW5zX3VudHJhbnNfY291bnQ9QW56YWhsXCBuaWNodFwgXHUwMEZDYmVyc2V0enRlclwgUmVzb3VyY2VuXDoKKworIworIyBAZ3JvdXAgQnV0dG9uIE5hbWVzCisjCisjIEBncm91cENvbW1lbnQgVGhlIG5hbWVzIGRpc3BsYXllZCBvbiB0aGUgdmFyaW91cyBidXR0b25zCisKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCBCdXR0b24gZm9yIGNyZWF0aW5nIGEgbmV3IHJlc291cmNlIGxhbmd1YWdlIGZpbGUKK2J1dHRvbl9hZGRfZmlsZT1SZXNvdXJjZW5kYXRlaVwgaGluenVmXHUwMEZDZ2VuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yMyBAbW9kaWZpZWQgMjAwMS0wMi0xMiBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorYnV0dG9uX2FkZF9maWxlX3RyaWdnZXI9aAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IEJ1dHRvbiBmb3IgY3JlYXRpbmcgYSBuZXcgcmVzb3VyY2UgZ3JvdXAKK2J1dHRvbl9hZGRfZ3JvdXA9UmVzb3VyY2VuZ3J1cHBlXCBoaW56dWZcdTAwRkNnZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTIzIEBtb2RpZmllZCAyMDAxLTAxLTIzIEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCitidXR0b25fYWRkX2dyb3VwX3RyaWdnZXI9ZworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IEJ1dHRvbiBmb3IgY3JlYXRpbmcgYSBuZXcgcmVzb3VyY2UgdHJhbnNsYXRpb24gaXRlbQorYnV0dG9uX2FkZF9yZXNvdXJjZT1SZXNvdXJjZVwgaGluenVmXHUwMEZDZ2VuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yMyBAbW9kaWZpZWQgMjAwMS0wMS0yMyBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorYnV0dG9uX2FkZF9yZXNvdXJjZV90cmlnZ2VyPXIKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIGEgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IEdlbmVyaWMgYnV0dG9uIGZvciBjYW5jZWxpbmcgYWN0aW9ucworYnV0dG9uX2NhbmNlbD1BYmJyZWNoZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTI2IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgR2VuZXJpYyBidXR0b24gZm9yIGEgY2hvaWNlIG9yIHNlbGVjdGlvbiBvcHRpb24KK2J1dHRvbl9jaG9vc2U9QXVzd1x1MDBFNGhsZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTI2IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCitidXR0b25fY2hvb3NlX3RyaWdnZXI9QQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IEJ1dHRvbiBmb3IgZ2VuZXJpYyBjcmVhdGlvbiBvZiBncm91cHMsIGl0ZW1zLCBmaWxlcywgZXRjLgorYnV0dG9uX2NyZWF0ZT1FcnpldWdlbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgYSBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgRm9yIGNyZWF0aW9uIG9mIGEgcmVzb3VyY2UgZ3JvdXAKK2J1dHRvbl9jcmVhdGVfZ3JvdXA9R3J1cHBlXCBlcnpldWdlbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjMgQG1vZGlmaWVkIDIwMDEtMDEtMjMgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK2J1dHRvbl9jcmVhdGVfZ3JvdXBfdHJpZ2dlcj1nCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wMiBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEJ1dHRvbiB0aXRsZSBmb3IgY3JlYXRpbmcgYW4gaXRlbSB0aGVuIGNvbnRpbnVpbmcgY3JlYXRpbmcgbW9yZSBpdGVtcworYnV0dG9uX2NyZWF0ZV9tb3JlPUVyemV1Z2VuXCAmXCBXZWl0ZXIKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTAyIEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCitidXR0b25fY3JlYXRlX21vcmVfdHJpZ2dlcj1yCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBhIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCBCdXR0b24gZm9yIGNyZWF0aW5nIGEgcmVzb3VyY2UgdHJhbnNsYXRpb24gaXRlbQorYnV0dG9uX2NyZWF0ZV9yZXNvdXJjZT1SZXNvdXJjZVwgZXJ6ZXVnZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTIzIEBtb2RpZmllZCAyMDAxLTAyLTEyIEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCitidXR0b25fY3JlYXRlX3Jlc291cmNlX3RyaWdnZXI9cgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDIgQG1vZGlmaWVkIDIwMDEtMDItMTIgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK2J1dHRvbl9jcmVhdGVfdHJpZ2dlcj1lCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBhIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCBCdXR0b24gZm9yIHJlbW92aW5nIGEgZ3JvdXAgYW5kIGl0cyBjb250ZW50cworYnV0dG9uX2RlbGV0ZV9ncm91cD1HcnVwcGVcIGxcdTAwRjZzY2hlbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgYSBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgQnV0dG9uIGZvciBwZXJtYW5lbnRseSByZW1vdmluZyBhIHJlc291cmNlIGZyb20gdGhlIGJ1bmRsZQorYnV0dG9uX2RlbGV0ZV9yZXNvdXJjZT1SZXNvdXJjZVwgbFx1MDBGNnNjaGVuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yMyBAbW9kaWZpZWQgMjAwMS0wMi0xMiBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorYnV0dG9uX2RlbGV0ZV9yZXNvdXJjZV90cmlnZ2VyPWwKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCBHZW5lcmljIGVkaXQgYnV0dG9uCitidXR0b25fZWRpdD1CZWFyYmVpdGVuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBhIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCBCdXR0b24gZm9yIGVkaXRpbmcgZ3JvdXAgbmFtZSBhbmQgY29tbWVudAorYnV0dG9uX2VkaXRfZ3JvdXA9R3J1cHBlXCBiZWFyYmVpdGVuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBhIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCBCdXR0b24gZm9yIGVkaXRpbmcgcmVzb3VyY2UgaW5mb3JtYXRpb24sIGluY2x1ZGluZyBrZXkgYW5kIHRyYW5zbGF0aW9uCitidXR0b25fZWRpdF9yZXNvdXJjZT1SZXNvdXJjZVwgYmVhcmJlaXRlbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjMgQG1vZGlmaWVkIDIwMDEtMDItMTIgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK2J1dHRvbl9lZGl0X3Jlc291cmNlX3RyaWdnZXI9YgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjYgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBCdXR0b24gdGl0bGUgZm9yIGluaXRpYXRpbmcgYW4gaW1wb3J0IG9mIHJlc291cmNlcyBmcm9tIGFuIGFsdGVybmF0ZSBzb3VyY2UKK2J1dHRvbl9pbXBvcnQ9SW1wb3J0aWVyZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTI2IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCitidXR0b25faW1wb3J0X3RyaWdnZXI9aQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjMgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBCdXR0b24gYWxsb3dzIGEgc2VsZWN0ZWQgcmVzb3VyY2UgdG8gYmUgbWFya2VkIGFzIHRyYW5zbGF0ZWQgd2l0aG91dCBmdXJ0aGVyIGVkaXRpbmcKK2J1dHRvbl9tYXJrX3RyYW5zbGF0ZWQ9UmVzb3VyY2VcIGFsc1wgXHUwMEZDYmVyc2V0enRcIG1hcmtpZXJlbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjMgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK2J1dHRvbl9tYXJrX3RyYW5zbGF0ZWRfdHJpZ2dlcj1tCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTEtMjAgQG1vZGlmaWVkIDIwMDEtMTEtMjAgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBCdXR0b24gZm9yIGFkZGluZyB0aGUgY3VycmVudCByZXNvdXJjZSBidW5kbGUgaW4gdGhlIG1haW4gYXBwbGljYXRpb24gdG8gdGhlIHByb2plY3QKK2J1dHRvbl9wcm9qZWN0X2FkZD1BZGRcIEN1cnJlbnRcIEJ1bmRsZQorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTExLTIwIEBtb2RpZmllZCAyMDAxLTExLTIwIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgCitidXR0b25fcHJvamVjdF9hZGRfdHJpZ2dlcj1hCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTEtMjAgQG1vZGlmaWVkIDIwMDEtMTEtMjAgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBCdXR0b24gZm9yIGNsb3NpbmcgdGhlIHByb2plY3Qgd2luZG93CitidXR0b25fcHJvamVjdF9jbG9zZT1DbG9zZVwgUHJvamVjdAorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTExLTIwIEBtb2RpZmllZCAyMDAxLTExLTIwIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgCitidXR0b25fcHJvamVjdF9jbG9zZV90cmlnZ2VyPWMKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMS0yMCBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IEJ1dHRvbiBmb3IgY3JlYXRpbmcgYSBuZXcgcmVzb3VyY2UgYnVuZGxlIHByb2plY3QKK2J1dHRvbl9wcm9qZWN0X25ldz1OZXdcIFByb2plY3QKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMS0yMCBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IAorYnV0dG9uX3Byb2plY3RfbmV3X3RyaWdnZXI9bgorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTExLTIwIEBtb2RpZmllZCAyMDAxLTExLTIwIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgQnV0dG9uIGZvciBvcGVuaW5nIGEgcHJvamVjdCBmaWxlCitidXR0b25fcHJvamVjdF9vcGVuPU9wZW5cIFByb2plY3QKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMS0yMCBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IAorYnV0dG9uX3Byb2plY3Rfb3Blbl90cmlnZ2VyPW8KKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMS0yMCBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IEJ1dHRvbiBmb3IgcmVtb3ZpbmcgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCByZXNvdXJjZSBidW5kbGUgZnJvbSB0aGUgcHJvamVjdAorYnV0dG9uX3Byb2plY3RfcmVtb3ZlPVJlbW92ZVwgU2VsZWN0aW9uCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTEtMjAgQG1vZGlmaWVkIDIwMDEtMTEtMjAgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCAKK2J1dHRvbl9wcm9qZWN0X3JlbW92ZV90cmlnZ2VyPXIKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMS0yMCBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IEJ1dHRvbiBmb3IgY2F1c2luZyB0aGUgc2VsZWN0ZWQgcmVzb3VyY2UgYnVuZGxlIHRvIGJlIHRoZSBvbmUgYmVpbmcgZWRpdGVkIGluIHRoZSBtYWluIGFwcGxpY2F0aW9uCitidXR0b25fcHJvamVjdF9zZWxlY3Q9RWRpdFwgU2VsZWN0ZWQKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMS0yMCBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IAorYnV0dG9uX3Byb2plY3Rfc2VsZWN0X3RyaWdnZXI9ZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDYgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUaXRsZSBmb3IgcGVyZm9ybWluZyBhIGNvbXBsZXRlIHNlYXJjaAorYnV0dG9uX3NlYXJjaF9maW5kX2FsbD1BbGxlXCBmaW5kZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTA2IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCitidXR0b25fc2VhcmNoX2ZpbmRfYWxsX3RyaWdnZXI9YQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDYgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUaXRsZSBmb3IgcGVyZm9ybWluZyBjb21wbGV0ZSBzZWFyY2ggYW5kIHJlcGxhY2UKK2J1dHRvbl9zZWFyY2hfcmVwbGFjZV9hbGw9QWxsZVwgZXJzZXR6ZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTA2IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCitidXR0b25fc2VhcmNoX3JlcGxhY2VfYWxsX3RyaWdnZXI9cgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IEdlbmVyaWMgYnV0dG9uIGZvciB1cGRhdGluZyBpbmZvcm1hdGlvbgorYnV0dG9uX3VwZGF0ZT1cdTAwQzRuZGVybgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjMgQG1vZGlmaWVkIDIwMDEtMDItMTIgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK2J1dHRvbl91cGRhdGVfdHJpZ2dlcj1uCisKKyMKKyMgQGdyb3VwIERpYWxvZ3MKKyMKKyMgQGdyb3VwQ29tbWVudCBUcmFuc2xhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhcHBsaWNhdGlvbnMgdmFyaW91cyBkaWFsb2cgYm94ZXMKKworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IEluZGljYXRpb24gb2Ygd2V0aGVyIG9yIG5vdCBhIG5ldyBmaWxlIHdpbGwgYmUgcG9wdWxhdGVkIGZyb20gdGhlIGVsZW1lbnRzIGluIHRoZSBiYXNlIGNsYXNzCitkaWFsb2dfY2hlY2tib3hfY29weV9lbGVtZW50cz1FaW50clx1MDBFNGdlXCBhdXNcIGRlclwgQmFzaXNrbGFzc2VcIGluXCBkaWVcIG5ldWVcIERhdGVpXCBcdTAwRkNiZXJuZWhtZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCBJbmRpY2F0b3Igb2Ygd2V0aGVyIGFuIGl0ZW0gaXMgdHJhbnNsYXRlZCBvciBub3QKK2RpYWxvZ19jaGVja2JveF90cmFuc2xhdGVkPVx1MDBEQ2JlcnNldHp0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCitkaWFsb2dfY29tbWVudD1Lb21tZW50YXJcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IAorZGlhbG9nX2NvdW50cnk9TGFuZAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IAorZGlhbG9nX2NyZWF0ZWQ9RXJ6ZXVndFw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCitkaWFsb2dfY3JlYXRvcj1FcnpldWd0XCBkdXJjaFw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQHsxfSBUaGUgZGF0ZQorIyBAezB9IFRoZSBuYW1lIG9mIHRoZSBwZXJzb24gaW52b2x2ZWQKKyMgQGNvbW1lbnQgVGhlIGRhdGUgYW5kIHBlcnNvbiBhc3NvY2lhdGVkIHdpdGggYSBjcmVhdGlvbiBvciBtb2RpZmljYXRpb24gb2YgYW4gaXRlbQorZGlhbG9nX2RhdGVfcGVyc29uPXswfVwgYW1cIHsxfQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IAorZGlhbG9nX2RlZmF1bHRfY29tbWVudD1EZWZhdWx0LUtvbW1lbnRhclw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCitkaWFsb2dfZGVmYXVsdF90cmFuc2xhdGlvbj1EZWZhdWx0LVx1MDBEQ2JlcnNldHp1bmdcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IAorZGlhbG9nX2RlbGV0ZV9maWxlPVJlc291cmNlbmRhdGVpXCBsXHUwMEY2c2NoZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCAKK2RpYWxvZ19kZWxldGVfZ3JvdXA9UmVzb3VyY2VuZ3J1cHBlXCBsXHUwMEY2c2NoZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCAKK2RpYWxvZ19kZWxldGVfaXRlbT1SZXNvdXJjZVwgbFx1MDBGNnNjaGVuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wNi0yNyBAbW9kaWZpZWQgMjAwMS0wNi0yOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBNYXJ0aW4KKyMgQGNvbW1lbnQgV2FybmluZyBkaXNwbGF5ZWQgd2hlbiBhIHVzZXIgYXNrcyBmb3IgYSBkZWxldGlvbiBvZiBhIGZpbGUuIFByb21wdHMgZm9yICdZZXMnIG9yICdObycKK2RpYWxvZ19kZWxldGVfd2FybmluZz1XYXJudW5nXCFcIERpZXNlXCBPcGVyYXRpb25cIGthbm5cIG5pY2h0XCBydWVja2dhZW5naWdcIGdlbWFjaHRcbndlcmRlbi5cIFNpbmRcIFNpZVwgc2ljaHJlLFwgZGFzc1wgc2llXCBmb3J0ZmFocmVuXCBtb2VjaHRlbj8KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCAKK2RpYWxvZ19lbmNvZGluZz1FbmNvZGluZ1w6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCitkaWFsb2dfZmlsZV9jb21tZW50PVJlc291cmNlbmRhdGVpa29tbWVudGFyXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCAKK2RpYWxvZ19maWxlX2ZpbHRlcl9kZXNjcmlwdGlvbj1CYXNpc2tsYXNzZW4tUmVzb3VyY2VuZGF0ZWllblwgKC5wcm9wZXJ0aWVzKQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDYgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBEZXNjcmlwdGlvbiBvZiBGaWxlIEZpbHRlciBmb3IgUkJSZXBvcnRlciBYTUwgc2NhbiBjb25maWd1cmF0aW9uIGZpbGVzCitkaWFsb2dfZmlsZV9maWx0ZXJfZGVzY3JpcHRpb25fc2Nhbj1YTUxcIFJCUmVwb3J0ZXJcIFNjYW5cIERhdGVpZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCAKK2RpYWxvZ19maWxlX2luZm89RGF0ZWlpbmZvcm1hdGlvbmVuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCitkaWFsb2dfZmlsZV9tYW5hZ2VyPU5hbWVcIGRlc1wgUmVzb3VyY2VubWFuYWdlcnNcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IAorZGlhbG9nX2ZpbGVfdGl0bGU9VGl0ZWxcIGRlclwgUmVzb3VyY2VuZGF0ZWlcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IAorZGlhbG9nX2dyb3VwPUdydXBwZW5uYW1lXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCAKK2RpYWxvZ19ncm91cF9jb21tZW50PUdydXBwZW5rb21tZW50YXJcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IAorZGlhbG9nX2tleT1FaW50cmFnc3NjaGxcdTAwRkNzc2VsXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCAKK2RpYWxvZ19sYW5ndWFnZT1TcHJhY2hlCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCitkaWFsb2dfbG9va3Vwcz1QYXJhbWV0ZXJcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IAorZGlhbG9nX21vZGlmaWVkPVp1bGV0enRcIGdlXHUwMEU0bmRlcnRcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IAorZGlhbG9nX21vZGlmaWVyPVp1bGV0enRcIGdlXHUwMEU0bmRlcnRcIGR1cmNoXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCBUaGUgbmFtZSBvZiBhIGxhbmd1YWdlLCBjb3VudHJ5LCBvciB2YXJpYW50IG9mIGEgbGFuZ3VhZ2UgZmlsZQorZGlhbG9nX25hbWU9TmFtZVw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgUHJvbXB0cyB0aGUgdXNlciB0byBlbnRlciBhIG5hbWUgZm9yIHRoZSByZXNvdXJjZSBidW5kbGUsIGJlZm9yZSBjcmVhdGluZyB0aGF0IGJ1bmRsZQorZGlhbG9nX25ld19iYXNlY2xhc3M9Qml0dGVcIGdlYmVuXCBTaWVcIGVpbmVuXCBOYW1lblwgZlx1MDBGQ3JcIGRpZVwgQmFzaXNrbGFzc2VcIGRlc1wgbmV1ZW5cIFJlc291cmNlLUJ1bmRsZXNcIGVpbi4KKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMi0xOSBAbW9kaWZpZWQgMjAwMS0xMi0xOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IERpYWxvZyBwb3B1cCB3aW5kb3cgdGV4dCBwcm9tcHRpbmcgdGhlIHVzZXIgZm9yIHRoZSBuYW1lIG9mIGEgcmVzb3VyY2UgYnVuZGxlIHByb2plY3QKK2RpYWxvZ19uZXdfcHJvamVjdD1QbGVhc2VcIGVudGVyXCBhXCB0aXRsZVwgZm9yXCB5b3VyXCBuZXdcIFJlc291cmNlXCBCdW5kbGVcIFByb2plY3QuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgQSBkZXNjcmlwdGlvbiBvZiB0aGUgZmlsZXMgbWFraW5nIGl0IHRocm91Z2ggdGhlIGZpbHRlciB1cG9uIG9wZW5pbmcgYSByZXNvdXJjZSBidW5kbGUKK2RpYWxvZ19vcGVuX2ZpbGVfZmlsdGVyPUJhc2lza2xhc3Nlbi1SZXNvdXJjZW5kYXRlaWVuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgVGhpcyBpcyBhIHNlY3Rpb24gaGVhZGluZyBmb3Igc2V0dGluZyB0aGUgbG9jYWxlCitkaWFsb2dfcHJlZmVyZW5jZXNfbG9jYWxlPUxvY2FsZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IExvY2FsZXMgY3VycmVudGx5IGRlZmluZWQgaW4gdGhlIHByb3BlcnRpZXMgZmlsZXMgZm9yIHRoZSBhcHBsaWNhdGlvbgorZGlhbG9nX3ByZWZlcmVuY2VzX2xvY2FsZV9kZWZpbmVkPURlZmluaWVydFwgZlx1MDBGQ3JcIFJCTWFuYWdlclw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCAKK2RpYWxvZ19wcmVmZXJlbmNlc19sb2NhbGVfaXNvPUlTTy1TdGFuZGFyZHNcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IExvY2FsZXMgdGhhdCBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBob3N0IEphdmEgVmlydHVhbCBNYWNoaW5lCitkaWFsb2dfcHJlZmVyZW5jZXNfbG9jYWxlX21hY2hpbmU9Vm9uXCBkaWVzZW1cIFN5c3RlbVwgdW50ZXJzdFx1MDBGQ3R6dFw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCAKK2RpYWxvZ19wcmVmZXJlbmNlc19sb2NhbGVfd2FybmluZz1BTk1FUktVTkdcOlwgXHUwMEM0bmRlcnVuZ2VuXCBkZXJcIExvY2FsZVwgd2lya2VuXCBzaWNoXCBlcnN0XCBiZWltXCBuXHUwMEU0Y2hzdGVuXCBTdGFydFwgZGVyXCBBbndlbmR1bmdcIGF1cy4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCAKK2RpYWxvZ19wcmVmZXJlbmNlc19sb29rYW5kZmVlbD1Mb29rXCBBbmRcIEZlZWxcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IAorZGlhbG9nX3ByZWZlcmVuY2VzX3VzZXJuYW1lPUJlbnV0emVybmFtZVw6CisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTEtMjAgQG1vZGlmaWVkIDIwMDEtMTEtMjAgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBEZXNjcmlwdG9yIHRoYXQgZ29lcyBpbnRvIEdVSSBmaWxlIGNob29zZXIKK2RpYWxvZ19wcm9qZWN0X2ZpbGVfZmlsdGVyX2Rlc2NyaXB0aW9uPVJCTWFuYWdlclwgUHJvamVjdFwgRmlsZXMKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0xMi0xNyBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IEZpbGUgRmlsdGVyIGRlc2NyaXB0aW9uIGZvciByZXNvdXJjZSBidW5kbGUgcHJvamVjdCBmaWxlcworZGlhbG9nX3Byb2plY3RfZmlsdGVyX2Rlc2NyaXB0aW9uPVJlc291cmNlXCBCdW5kbGVcIFByb2plY3RzCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTEtMjAgQG1vZGlmaWVkIDIwMDEtMTEtMjAgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBBbiBpbmRpY2F0aW9uIHRoYXQgbm8gcHJvamVjdCBpcyBvcGVuLCBwbGFjZWQgaW4gdGhlIHRpdGxlIG9mIHRoZSBkaWFsb2cgd2hlcmUgdGhlIHByb2plY3QgbmFtZSB3b3VsZCBub3JtYWxseSBnbworZGlhbG9nX3Byb2plY3Rfbm9uZV9zZWxlY3RlZD1Ob1wgQWN0aXZlXCBQcm9qZWN0CisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTEtMjAgQG1vZGlmaWVkIDIwMDEtMTEtMjAgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAezB9IFRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0CisjIEBjb21tZW50IFRpdGxlIGZvciB0aGUgd2luZG93IHNob3dpbmcgYWxsIHRoZSByZXNvdXJjZSBidW5kbGVzIGluIGEgcHJvamVjdAorZGlhbG9nX3Byb2plY3RfdGl0bGU9UmVzb3VyY2VcIEJ1bmRsZVwgUHJvamVjdFw6XCB7MH0KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCBQcm9tcHRzIHRoZSB1c2VyIGlmIHRoZXkgd291bGQgbGlrZSB0byBzYXZlIGNoYW5nZXMgYmVmb3JlIGV4aXRpbmcKK2RpYWxvZ19xdWl0X3NhdmU9TVx1MDBGNmNodGVuXCBTaWVcIElocmVcIFx1MDBDNG5kZXJ1bmdlblwgdm9yXCBiZWVuZGVuXCB2b25cIFJCTWFuYWdlclwgc3BlaWNoZXJuPworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMTAgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBBIGdlbmVyaWMgcHJvcG1wdCB0byBhc2sgdGhlIHVzZXIgaWYgdGhleSB3aXNoIHRvIHNhdmUgY2hhbmdlcworZGlhbG9nX3NhdmU9TVx1MDBGNmNodGVuXCBTaWVcIElocmVcIFx1MDBDNG5kZXJ1bmdlblwgc3BlaWNoZXJuPworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IAorZGlhbG9nX3NlYXJjaF9vcHRpb25zPVN1Y2hvcHRpb25lbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IAorZGlhbG9nX3NlYXJjaF9wYXJhbT1TdWNoZVwgbmFjaFw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgVGhlIHRpdGxlIG9mIHRoZSBhYm91dCBkaWFsb2cgYm94CitkaWFsb2dfdGl0bGVfYWJvdXRfcmJtYW5hZ2VyPVx1MDBEQ2JlclwgUkJNYW5hZ2VyCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yMiBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFRpdGxlIGZvciBkaWFsb2cgcHJvbXB0aW5nIGZvciBkZWxldGlvbiBvZiBhbiBlbnRpcmUgcmVzb3VyY2UgZ3JvdXAKK2RpYWxvZ190aXRsZV9kZWxldGVfZ3JvdXA9UmVzb3VyY2VuZ3J1cHBlblwgbFx1MDBGNnNjaGVuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yMiBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFRpdGxlIHdoZW4gcHJvbXB0aW5nIHRvIGRlbGV0ZSBhIHJlc291cmNlCitkaWFsb2dfdGl0bGVfZGVsZXRlX2l0ZW09UmVzb3VyY2VcIGxcdTAwRjZzY2hlbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IAorZGlhbG9nX3RpdGxlX2VkaXRfZ3JvdXA9UmVzb3VyY2VuZ3J1cHBlXCBiZWFyYmVpdGVuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCitkaWFsb2dfdGl0bGVfZWRpdF9pdGVtPVJlc291cmNlXCBiZWFyYmVpdGVuCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTItMTkgQG1vZGlmaWVkIDIwMDEtMTItMTkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCAKK2RpYWxvZ190aXRsZV9lcnJvcj1FcnJvcgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IAorZGlhbG9nX3RpdGxlX2Vycm9yX2NyZWF0aW5nX2J1bmRsZT1GZWhsZXJcIGJlaW1cIGVyemV1Z2VuXCBkZXNcIFJlc291cmNlLUJ1bmRsZXMKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTIyIEBtb2RpZmllZCAyMDAxLTA2LTI5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgRGlhbG9nIHRpdGxlIHdoZW4gb3BlbmluZyBhIHJlc291cmNlIGJ1bmRsZSBub3QgY3JlYXRlZCBieSBSQk1hbmFnZXIKK2RpYWxvZ190aXRsZV9lcnJvcl9ub3RfcmJtYW5hZ2VyX2Zvcm1hdD1GZWhsZXJcOlwgUmVzb3VyY2VcIEJ1bmRsZVwgaXN0XCBuaWNodFwgbGVzYmFyCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wNi0yNyBAbW9kaWZpZWQgMjAwMS0wNi0yOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBNYXJ0aW4KKyMgQGNvbW1lbnQgVGl0bGUgb24gYSB3YXJuaW5nIGRpYWxvZyB0aGF0IEkvTyBtYWxmdW5jdGlvbmVkIG9wZW5pbmcgYSBmaWxlCitkaWFsb2dfdGl0bGVfZXJyb3Jfb3BlbmluZ19maWxlPUZlaGxlclwgYmVpbVwgT2VmZm5lblwgZGVyXCBEYXRlaQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDYtMjcgQG1vZGlmaWVkIDIwMDEtMDYtMjkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgTWFydGluCisjIEBjb21tZW50IERpYWxvZyB0aXRsZSBmb3IgYSBkaWFsb2cgYm94IGZvciBlbnRlcmluZyBzcGVjaWFsIHBhcmFtZXRlcnMgbmVlZGVkIHRvIGV4cG9ydCBhIHJlc291cmNlIGJ1bmRsZSB0byBqYXZhIGNsYXNzIGNvZGUKK2RpYWxvZ190aXRsZV9leHBvcnRfamF2YV9vcHRpb25zPUV4cG9ydC1QYXJhbWV0ZXJcOlwgSmF2YS1LbGFzc2UKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTA3IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgVGl0bGUgZm9yIGEgZGlhbG9nIHdpdGggYSBwcm9ncmVzcyBiYXIgZ292ZXJuaW5nIGltcG9ydCBzdGF0dXMKK2RpYWxvZ190aXRsZV9pbXBvcnRfcHJvZ3Jlc3M9SW1wb3J0c2ZvcnRzY2hyaXR0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgVGl0bGUgZm9yIGNyZWF0aW5nIG5ldyBidW5kbGUKK2RpYWxvZ190aXRsZV9uZXdfYnVuZGxlPU5ldWVzXCBSZXNvdXJjZS1CdW5kbGVcIGVyemV1Z2VuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgVGl0bGUgZm9yIGNyZWF0aW5nIGEgbmV3IHJlc291cmNlIGZpbGUKK2RpYWxvZ190aXRsZV9uZXdfZmlsZT1OZXVlXCBSZXNvdXJjZW5kYXRlaVwgZXJ6ZXVnZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCBUaXRsZSBmb3IgY3JlYXRpbmcgYSBuZXcgcmVzb3VyY2UgZ3JvdXAKK2RpYWxvZ190aXRsZV9uZXdfZ3JvdXA9TmV1ZVwgUmVzb3VyY2VuZ3J1cHBlXCBlcnpldWdlbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IFRpdGxlIGZvciBjcmVhdGluZyByZXNvdXJjZQorZGlhbG9nX3RpdGxlX25ld19pdGVtPU5ldWVcIFJlc291cmNlXCBlcnpldWdlbgorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTEyLTE5IEBtb2RpZmllZCAyMDAxLTEyLTE5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgVGl0bGUgb2YgdGhlIGRpYWxvZyBib3ggc2hvd2luZyB3aGVuIGNyZWF0aW5nIGEgbmV3IHByb2plY3QKK2RpYWxvZ190aXRsZV9uZXdfcHJvamVjdD1OZXdcIFJlc291cmNlXCBCdW5kbGVcIFByb2plY3QKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCAKK2RpYWxvZ190aXRsZV9wcmVmZXJlbmNlcz1FaW5zdGVsbHVuZ2VuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgVGl0bGUgZm9yIGNvbmZpcm1pbmcgZXhpdCBmcm9tIGFwcGxpY2F0aW9uCitkaWFsb2dfdGl0bGVfcXVpdD1SQk1hbmFnZXJcIGJlZW5kZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCAKK2RpYWxvZ190aXRsZV9zZWFyY2g9U3VjaGUKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCAKK2RpYWxvZ190aXRsZV91c2VyX25hbWU9QmVudXR6ZXJuYW1lblwgZWluZ2ViZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCAKK2RpYWxvZ190cmFuc2xhdGlvbj1cdTAwRENiZXJzZXR6dHVuZ1w6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCitkaWFsb2dfdXNlcl9uYW1lPUJpdHRlXCBnZWJlblwgU2llXCBJaHJlblwgTmFtZW5cIGVpbi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCAKK2RpYWxvZ192YXJpYW50PVZhcmlhbnRlCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCitkaWFsb2dfd2FybmluZ19kZWxldGVfZ3JvdXA9RGFzXCBMXHUwMEY2c2NoZW5cIGRpZXNlclwgR3J1cHBlXCBiZXdpcmt0XCBkaWVcIHBlcm1hbmVudGVcIExcdTAwRjZzY2h1bmdcIGFsbGVyXCBSZXNvdXJjZW5cIGRpZXNlclwgR3J1cHBlLlwgTVx1MDBGNmNodGVuXCBTaWVcIGRpZVwgR3J1cHBlXCBkZW5ub2NoXCBsXHUwMEY2c2NoZW4/CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCitkaWFsb2dfd2FybmluZ19kZWxldGVfaXRlbT1NXHUwMEY2Y2h0ZW5cIFNpZVwgZGllc2VcIFJlc291cmNlXCB3aXJrbGljaFwgbFx1MDBGNnNjaGVuPworCisjCisjIEBncm91cCBFcnJvciBNZXNzYWdlcworIworIyBAZ3JvdXBDb21tZW50IAorCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCitlcnJvcj1GZWhsZXIKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMi0xOSBAbW9kaWZpZWQgMjAwMS0xMi0xOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IEdlbmVyYWwgZXJyb3IgbWVzc2FnZSB3aGVuIHRyeWluZyB0byBhZGQgYSByZXNvdXJjZSBidW5kbGUgdG8gYSBwcm9qZWN0LgorZXJyb3JfYWRkaW5nX3Byb2plY3RfYnVuZGxlPUFuXCBlcnJvclwgb2NjdXJyZWRcIHRyeWluZ1wgdG9cIGFkZFwgdGhlXCBSZXNvdXJjZVwgQnVuZGxlXCB5b3VcIHNlbGVjdGVkLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IAorZXJyb3JfYmFzZWNsYXNzX3doaXRlc3BhY2U9UmVzb3VyY2VubmFtZW5cIGRcdTAwRkNyZmVuXCBrZWluZVwgV2hpdGUtU3BhY2VzXCBlbnRoYWx0ZW4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCitlcnJvcl9idW5kbGVfbm90X2NyZWF0ZWQ9RXNcIHd1cmRlXCBrZWluXCBSZXNvdXJjZS1CdW5kbGVcIGVyemV1Z3QuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCitlcnJvcl9jcmVhdGVfZmlsZT1CZWltXCBFcnpldWdlblwgZGVyXCBSZXNvdXJjZW5kYXRlaVwgaXN0XCBlaW5cIFByb2JsZW1cIGF1ZmdldHJldGVuLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IAorZXJyb3JfY3JlYXRlX2dyb3VwPUJlaW1cIEVyemV1Z2VuXCBkZXJcIFJlc291cmNlbmdydXBwZVwgaXN0XCBlaW5cIFByb2JsZW1cIGF1ZmdldHJldGVuLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IAorZXJyb3JfY3JlYXRlX2l0ZW09QmVpbVwgRXJ6ZXVnZW5cIGRlc1wgRWludHJhZ3NcIGlzdFwgZWluXCBQcm9ibGVtXCBhdWZnZXRyZXRlbi4KKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMi0xOSBAbW9kaWZpZWQgMjAwMS0xMi0xOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IEdlbmVyYWwgZXJyb3IgbWVzc2FnZSB3aGVuIGNyZWF0aW5nIGEgcHJvamVjdAorZXJyb3JfY3JlYXRpbmdfcHJvamVjdD1BblwgZXJyb3JcIHdhc1wgZW5jb3VudGVyZWRcIHRyeWluZ1wgdG9cIGNyZWF0ZVwgYVwgUmVzb3VyY2VcIEJ1bmRsZVwgUHJvamVjdC4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTA2LTI3IEBtb2RpZmllZCAyMDAxLTA2LTI5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQHswfSBUaGUgbWVzc2FnZSBmcm9tIGFuIElPRXhjZXB0aW9uIHRoYXQgaXMgdGhyb3duCisjIEBjb21tZW50IEVycm9yIG1lc3NhZ2Ugd2hlbiB0cnlpbmcgdG8gZGVsZXRlIGEgZmlsZQorZXJyb3JfZGVsZXRpbmc9QmVpbVwgbFx1MDBGNnNjaGVuXCBkZXJcIERhdGVpXCB7MH1cIGlzdFwgZWluXCBGZWhsZXJcIGF1ZmdldHJldGVuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wNi0yNyBAbW9kaWZpZWQgMjAwMS0wNi0yOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBNYXJ0aW4KKyMgQGNvbW1lbnQgQW4gZXJyb3IgdGhhdCBvY2N1cnMgd2hlbiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gZGVsZXRlIGEgZmlsZSwgYnV0IHRoZSB2aXJ0dWFsIG1hY2hpbmUgY2FuIG5vdCBkbyBzbworZXJyb3JfZGVsZXRpb25fbm90X3Bvc3NpYmxlPVJCTWFuYWdlclwga29ubnRlXCBkaWVcIERhdGVpXCBuaWNodFwgbG9lc2NoZW4uXCBadWdhbmdcIHZlcndlaWdlcnQuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wNyBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEdlbmVyYWwgZXJyb3IgbWVzc2FnZSBmb3IgZXhwb3J0aW5nIHJlc291cmNlIGJ1bmRsZXMKK2Vycm9yX2V4cG9ydD1FaW5cIEZlaGxlclwgaXN0XCBiZWltXCBFeHBvcnRpZXJlblwgZGVzXCBSZXNvdXJjZW5iXHUwMEZDbmRlbHNcIGF1ZmdldHJldGVuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCitlcnJvcl9pbnRlcm5hbD1JbnRlcm5lclwgRmVobGVyCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCitlcnJvcl9tb2RpZnlfZmlsZT1CZWltXCBcdTAwQzRuZGVyblwgZGVyXCBSZXNvdXJjZW5kYXRlaVwgaXN0XCBlaW5cIFByb2JsZW1cIGF1ZmdldHJldGVuLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IAorZXJyb3JfbW9kaWZ5X2dyb3VwPUJlaW1cIFx1MDBDNG5kZXJuXCBkZXJcIFJlc291cmNlbmdydXBwZVwgaXN0XCBlaW5cIFByb2JsZW1cIGF1ZmdldHJldGVuLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IAorZXJyb3JfbW9kaWZ5X2l0ZW09QmVpbVwgXHUwMEM0bmRlcm5cIGRlc1wgRWludHJhZ3NcIGlzdFwgZWluXCBQcm9ibGVtXCBhdWZnZXRyZXRlbi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCAKK2Vycm9yX25vX2J1bmRsZV9mb3JfZmlsZT1VbVwgZWluZVwgUmVzb3VyY2VuZGF0ZWlcIHp1XCBlcnpldWdlbixcIG1cdTAwRkNzc2VuXCBTaWVcIHp1blx1MDBFNGNoc3RcIGVpblwgUmVzb3VyY2UtQnVuZGxlXCBlcnpldWdlblwgb2RlclwgXHUwMEY2ZmZuZW4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCitlcnJvcl9ub19idW5kbGVfZm9yX2dyb3VwPVVtXCBlaW5lXCBSZXNvdXJjZW5ncnVwcGVcIHp1XCBlcnpldWdlbixcIG1cdTAwRkNzc2VuXCBTaWVcIHp1blx1MDBFNGNoc3RcIGVpblwgUmVzb3VyY2UtQnVuZGxlXCBlcnpldWdlblwgb2RlclwgXHUwMEY2ZmZuZW4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgRXJyb3IgbWVzc2FnZSBkaXNwbGF5ZWQgd2hlbiB0aGUgdXNlciB0cmllcyB0byBjcmVhdGUgYSByZXNvdXJjZSwgd2l0aG91dCBhbiBvcGVuIHJlc291cmNlIGJ1bmRsZQorZXJyb3Jfbm9fYnVuZGxlX2Zvcl9pdGVtPVVtXCBlaW5lXCBSZXNvdXJjZVwgenVcIGVyemV1Z2VuLFwgbVx1MDBGQ3NzZW5cIFNpZVwgenVuXHUwMEU0Y2hzdFwgZWluXCBSZXNvdXJjZS1CdW5kbGVcIGVyemV1Z2VuXCBvZGVyXCBcdTAwRjZmZm5lbi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTA2IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCitlcnJvcl9ub19rZXlfcmVwbGFjZT1FcnNldHplblwgZlx1MDBGQ3JcIFJlc291cmNlbnNjaGxcdTAwRkNzc2VsXCBpc3RcIG5pY2h0XCBlcmxhdWJ0LlwgQWxsZVwgYW5kZXJlblwgRXJzZXR6dW5nZW5cIHdlcmRlblwgZHVyY2hnZWZcdTAwRkNocnQuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yMiBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEluZGljYXRpb24gdGhhdCBSQk1hbmFnZXIgY2FuIG5vdCByZWFkIHRoZSBmaWxlIGFzIGNyZWF0ZWQgYnkgUkJNYW5hZ2VyCitlcnJvcl9ub3RfcmJtYW5hZ2VyX2Zvcm1hdD1EaWVcIGF1c2dld1x1MDBFNGhsdGVcIFJlc291cmNlXCB3dXJkZVwgbmljaHRcIHZvbVwgUkJNYW5hZ2VyXCBlcnpldWd0XCBvZGVyXCBpc3RcIGJlc2NoXHUwMEU0ZGlndC4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTA2LTI3IEBtb2RpZmllZCAyMDAxLTA2LTI5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQHswfSBUaGUgbmFtZSBvZiB0aGUgZmlsZSB0aGF0IHdvdWxkIG5vdCBvcGVuCisjIEBjb21tZW50IEVycm9yIG1lc3NhZ2Ugb2NjdXJpbmcgb24gYW4gSS9PIGVycm9yIHRyeWluZyB0byBvcGVuIGEgZmlsZQorZXJyb3Jfb3BlbmluZ19maWxlPUtvbm50ZVwgZGllXCBEYXRlaVwgezB9XCBuaWNodFwgXHUwMEY2ZmZuZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTE1IEBtb2RpZmllZCAyMDAxLTA2LTI5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgRXJyb3IgbWVzc2FnZSBkaXNwbGF5ZWQgd2hlbiBSQk1hbmFnZXIgZW5jb3VudGVycyBhbiBlcnJvciB3cml0aW5nIHByZWZlcmVuY2VzIHRvIHRoZSBmaWxlIHN5c3RlbQorZXJyb3JfcHJlZmVyZW5jZXNfc2F2ZT1FaW5cIEZlaGxlclwgaXN0XCBiZWltXCBTcGVpY2hlcm5cIGRlclwgRWluc3RlbGx1bmdlblwgYXVmZ2V0cmV0ZW4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMS0wNi0yOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBVbmtub3duCisjIEB7MH0gVGhlIGVycm9yIG1lc3NhZ2UgZ2VuZXJhdGVkCisjIEBjb21tZW50IEEgbWVzc2FnZSBwcmVzZW50ZWQgdG8gdGhlIHVzZXIgd2hlbiBhbiBlcnJvciBvY2N1cnMgaW4gc2F2aW5nIHRoZSByZXNvdXJjZSBidW5kbGUKK2Vycm9yX3NhdmluZz1CZWltXCBTcGVpY2hlcm5cIGRlc1wgUmVzb3VyY2VcIEJ1bmRsZXNcIGlzdFwgZWluXCBGZWhsZXJcIGF1ZmdldHJldGVuXDpcIHswfQorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTEyLTE5IEBtb2RpZmllZCAyMDAxLTEyLTE5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgR2VuZXJhbCBlcnJvciBtZXNzYWdlIHdoZW4gc2F2aW5nIGEgcHJvamVjdAorZXJyb3Jfc2F2aW5nX3Byb2plY3Q9QW5cIGVycm9yXCB3YXNcIGVuY291bnRlcmVkXCB0cnlpbmdcIHRvXCBzYXZlXCB0aGVcIFJlc291cmNlXCBCdW5kbGVcIFByb2plY3QuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yMiBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFN1Z2dlc3QgdHJ5aW5nIHRvIGltcG9ydCB0aGUgcmVzb3VyY2UgYnVuZGxlIGluc3RlYWQgb2Ygb3BlbmluZyBpdC4KK2Vycm9yX3N1Z2dlc3RfaW1wb3J0X3Byb3BlcnRpZXM9VmVyc3VjaGVuXCBTaWVcIGFsdGVybmF0aXZcIGRhc1wgUmVzb3VyY2VuYlx1MDBGQ25kZWxcIHp1XCBpbXBvcnRpZXJlbi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCAKK2Vycm9yX3RyeV9hZ2Fpbl9maWxlPUJpdHRlXCB3XHUwMEU0aGxlblwgU2llXCBhbmRlcmVcIEVuY29kaW5nLVdlcnRlLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IAorZXJyb3JfdHJ5X2FnYWluX2dyb3VwPUJpdHRlXCB3XHUwMEU0aGxlblwgU2llXCBlaW5lblwgYW5kZXJlblwgR3J1cHBlbm5hbWVuLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IAorZXJyb3JfdHJ5X2FnYWluX2l0ZW09Qml0dGVcIHdcdTAwRTRobGVuXCBTaWVcIGVpbmVuXCBhbmRlcmVuXCBFaW50cmFnc3NjaGxcdTAwRkNzc2VsLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDcgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBWYWx1ZSBpbnNlcnRlZCBpbnRvIHRhYmxlIGNlbGxzIHdoZW4gYW4gZXJyb3IgaGFzIG9jY3VyZWQKK3RhYmxlX2NlbGxfZXJyb3I9KkZlaGxlcioKKworIworIyBAZ3JvdXAgRXhwb3J0CisjCisjIEBncm91cENvbW1lbnQgUmVzb3VyY2VzIGRlYWxpbmcgd2l0aCBleHBvcnQgb3B0aW9ucworCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wNi0yNyBAbW9kaWZpZWQgMjAwMS0wNi0yOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBNYXJ0aW4KKyMgQGNvbW1lbnQgT3B0aW9uIGZvciB0aGUgcGFyYW1ldGVyIGZvciBjcmVhdGVkIGEgcHJvdGVjdGVkIGNsYXNzCitleHBvcnRfamF2YV9jbGFzc19wcm90ZWN0ZWQ9J3Byb3RlY3RlZFwgY2xhc3MnXCBlcnN0ZWxsZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTA2LTI3IEBtb2RpZmllZCAyMDAxLTA2LTI5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIE1hcnRpbgorIyBAY29tbWVudCBPcHRpb24gZm9yIHBhcmFtZXRlciBzZXR0aW5nIHRoZSBjcmVhdGVkIGNsYXNzIGFzIHB1YmxpYworZXhwb3J0X2phdmFfY2xhc3NfcHVibGljPSdwdWJsaWNcIGNsYXNzJ1wgZXJzdGVsbGVuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wNi0yNyBAbW9kaWZpZWQgMjAwMS0wNi0yOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBNYXJ0aW4KKyMgQGNvbW1lbnQgT3B0aW9uIGZvciBwYXJhbWV0ZXIgZm9yIGNyZWF0aW5nIHByb3RlY3RlZCBtZXRob2RzIGluIHRoZSBqYXZhIGNsYXNzCitleHBvcnRfamF2YV9tZXRob2RzX3Byb3RlY3RlZD0ncHJvdGVjdGVkXCBtZXRob2RzJ1wgZXJzdGVsbGVuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wNi0yNyBAbW9kaWZpZWQgMjAwMS0wNi0yOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBNYXJ0aW4KKyMgQGNvbW1lbnQgT3B0aW9uIGZvciBwYXJhbWV0ZXIgZm9yIGNyZWF0aW5nIHB1YmxpYyBtZXRob2RzCitleHBvcnRfamF2YV9tZXRob2RzX3B1YmxpYz0ncHVibGljXCBtZXRob2RzJ1wgZXJzdGVsbGVuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wNi0yNyBAbW9kaWZpZWQgMjAwMS0wNi0yOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBNYXJ0aW4KKyMgQGNvbW1lbnQgVGl0bGUgb2YgYSBjaGVjayBib3ggZm9sbG93ZWQgYnkgYSB0ZXh0IGZpZWxkIGZvciBzcGVjaWZ5aW5nIHdoZXRoZXIgb3Igbm90IHRvIHVzZSBhIHBhY2thZ2UgaW4gdGhlIGdlbmVyYXRlZCBqYXZhIGNsYXNzIGFuZCB3aGF0IHRoZSBwYWNrYWdlIHNob3VsZCBiZSBjYWxsZWQKK2V4cG9ydF9qYXZhX3BhY2thZ2U9R2ViZW5cIHNpZVwgZWluXCAncGFja2FnZSdcIGFuXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTA2LTI3IEBtb2RpZmllZCAyMDAxLTA2LTI5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIE1hcnRpbgorIyBAY29tbWVudCBUZXh0IHBsYWNlZCBpbiBhIGxhYmVsIGF0IHRoZSB0b3Agb2YgdGhlIGRpYWxvZyBib3ggZm9yIHNwZWNpZnlpbmcgcGFyYW1ldGVycyBjb25jZXJuaW5nIHRoZSBleHBvcnQgb2YgcmVzb3VyY2UgYnVuZGxlcyBpbnRvIGEgamF2YSBjbGFzcworZXhwb3J0X2phdmFfdGl0bGU9Qml0dGVcIGdlYmVuXCBTaWVcIGRpZVwgZm9sZ2VuZGVuXCBQYXJhbWV0ZXJcIGZ1ZXJcIGRpZVwgSmF2YS1LbGFzc2VcIGFuXDoKKworIworIyBAZ3JvdXAgR2VuZXJhbAorIworIyBAZ3JvdXBDb21tZW50IFNvbWUgaXRlbXMgdGhhdCBhcmUgY29tbW9uIGFjY3Jvc3MgZ3JvdXBzCisKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCBUaGUgZmlsZSBvciBjbGFzcyBjb21wb3NlZCBvZiB0aGUgZGVmYXVsdCB0cmFuc2xhdGlvbnMgZm9yIHRoZSBidW5kbGUKK2Jhc2VjbGFzcz1CYXNpc2tsYXNzZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDQtMDYtMjkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEdlb3JnZQorIyBAY29tbWVudCBUaGlzIGlzIHRoZSBsZWdhbCBjb3B5cmlnaHQgbm90aWNlCitjb3B5cmlnaHQ9KEMpXCBDb3B5cmlnaHRcIElCTVwgQ29ycC5cIDIwMDAtMjAwNFwgLVwgQWxsZVwgUmVjaHRlXCB2b3JiZWhhbHRlbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDYgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBHZXJuZXJhbCB1c2UgZm9yIGZpbGUgZGlyZWN0b3JpZXMKK2RpcmVjdG9yeT1WZXJ6ZWljaG5pcworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IAorZ3JvdXBzPUdydXBwZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCBUaGUgbmFtZSBvZiB0aGUgaW1hZ2UgZmlsZSBpbiB0aGUgJ0ltYWdlcycgZGlyZWN0b3J5IHRoYXQgcmVwcmVzZW50cyB0aGUgbG9nbyBzZWVuIGF0IHRoZSB0b3Agb2YgdGhlIGFwcGxpY2F0aW9uCitsb2dvX2ZpbGVuYW1lPVRpdGxlTG9nb190cmFuc3BhcmVudC5naWYKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0xMi0xNyBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IFRyZWUgbm9kZSB0aXRsZSB3aGVuIHZpZXdpbmcgYSByZXNvdXJjZSBidW5kbGUgaW4gdGhlIHByb2plY3QgdmlldyB3aGVuIHRoZXJlIGlzIG5vIGFjdGl2ZSBwcm9qZWN0Citub19wcm9qZWN0PURlZmF1bHRcIFByb2plY3QKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0xMi0xNyBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IFRyZWUgbm9kZSB0aXRsZSBkZWZhdWx0ZWQgdG8gd2hlbiBubyByZXNvdXJjZSBidW5kbGUgb3IgcHJvamVjdCBoYXMgYmVlbiBvcGVuZWQgYnkgdGhlIHVzZXIKK25vX3Byb2plY3RfYnVuZGxlPU5vXCBQcm9qZWN0XCBvclwgUmVzb3VyY2VcIEJ1bmRsZVwgT3BlbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IFRoZSB0b3AgdHJlZSBub2RlIHRpdGxlLCB3aGVuIG5vIHJlc291cmNlIGJ1bmRsZSBoYXMgYmVlbiBvcGVuZWQgb3IgY3JlYXRlZAorbm9fcmVzb3VyY2VfYnVuZGxlPUtlaW5cIFJlc291cmNlLUJ1bmRsZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IAorbm9uZT1LZWluKGUpCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTEtMjAgQG1vZGlmaWVkIDIwMDEtMTEtMjAgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBQcm9qZWN0IHRhYmxlIGNvbHVtbiBuYW1lIC0gTG9jYXRpb24gb2YgYSByZXNvdXJjZSBidW5kbGUKK3Byb2plY3RfdGFibGVfZmlsZV9sb2NhdGlvbj1GaWxlXCBMb2NhdGlvbgorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTExLTIwIEBtb2RpZmllZCAyMDAxLTExLTIwIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgVGFibGUgQ29sdW1uIE5hbWUgZm9yIHJlc291cmNlIGJ1bmRsZSBuYW1lCitwcm9qZWN0X3RhYmxlX3Jlc291cmNlX2J1bmRsZT1SZXNvdXJjZVwgQnVuZGxlCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgQW4gYWJicmV2aWF0ZWQgbmFtZSBvZiB0aGlzIGFwcGxpY2F0aW9uCityYm1hbmFnZXI9UkJNYW5hZ2VyCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwNC0wNi0yOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgR2VvcmdlCisjIEBjb21tZW50IAorcmJtYW5hZ2VyX2NvbnRhY3Q9QXV0b3JcOlwgSmFyZWRcIEphY2tzb25cICZcIEdlb3JnZVwgUmhvdGVuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgVGhlIGZ1bGwgbmFtZSBvZiB0aGlzIGFwcGxpY2F0aW9uCityZXNvdXJjZV9idW5kbGVfbWFuYWdlcj1SZXNvdXJjZVwgQnVuZGxlXCBNYW5hZ2VyCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCit0YWJsZV9jb2x1bW5fZXJyb3I9VGFiZWxsZW5zcGFsdGVuZmVobGVyCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQHswfSBDb3VudHJ5IElTTyBjb2RlCisjIEBjb21tZW50IE5vZGUgdGl0bGUsIHVuZGVyIHdoaWNoIGFsbCBmaWxlcyBvZiB0aGUgc2FtZSBjb3VudHJ5LCBsYW5ndWFnZSByZXNpZGUKK3RyZWVfY291bnRyeV9ub2RlPUxcdTAwRTRuZGVyLUNvZGVcOlwgezB9CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQHswfSBMYW5ndWFnZSBFbmNvZGluZworIyBAY29tbWVudCBUaGUgbm9kZSBiZWxvdyB3aGljaCBsYW5ndWFnZXMgb2Ygb25lIGVuY29kaW5nIGFyZSBncm91cGVkCit0cmVlX2xhbmd1YWdlX25vZGU9U3ByYWNoZW4tQ29kZVw6XCB7MH0KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCAKK3RyZWVfdmFyaWFudF9ub2RlPVZhcmlhbnRlblw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgVGhlIG5hbWUgYXNzaWduZWQgYXMgYSB1c2VyIG5hbWUgd2hlbiB0aGUgdXNlciBuYW1lIGlzIG5vdCBzcGVjaWZpZWQKK3Vua25vd25fdXNlcj1VbmJla2FubnQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCAKK3VudGl0bGVkPVVuYmVuYW5udAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IAordW50cmFuc2xhdGVkX2l0ZW1zPU5pY2h0XCBcdTAwRkNiZXJzZXR6dGVcIFJlc291cmNlbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEB7MH0gVGhlIHZlcnNpb24gbnVtYmVyCisjIEBjb21tZW50IFRoZSB2ZXJzaW9uIG9mIHRoaXMgYXBwbGljYXRpb24KK3ZlcnNpb249VmVyc2lvblwgezB9CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wNiBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IGdlbmVyYWwgdXNlIFdhcm5pbmcKK3dhcm5pbmc9V2FybnVuZworCisjCisjIEBncm91cCBJbXBvcnQKKyMKKyMgQGdyb3VwQ29tbWVudCBSZXNvdXJjZXMgZGVhbGluZyB3aXRoIGltcG9ydCBvcHRpb25zCisKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTI2IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgVGl0bGUgZm9yIGZpbGUgY2hvb3NlciBmb3IgY2hvb3NpbmcgVE1YIGZpbGVzCitpbXBvcnRfVE1YX2ZpbGVfZGVzY3JpcHRpb249VE1YXCBEYXRlaWVuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yNiBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IERpYWxvZyB0aXRsZSBmb3IgaW1wb3J0aW5nIGZyb20gVE1YIFhNTCBmaWxlcworaW1wb3J0X1RNWF90aXRsZT1UTVhcIERhdGVpXCBpbVwgcG9ydGllcmVuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwNC0wNy0wMSBAbW9kaWZpZWQgMjAwNC0wNy0wMSBAY3JlYXRvciBHZW9yZ2UgUmhvdGVuIEBtb2RpZmllciBHZW9yZ2UgUmhvdGVuCisjIEBjb21tZW50IFRpdGxlIGZvciB0aGUgZmlsZSBjaG9vc2VyIGZvciBjaG9vc2luZyBYTElGRiAoLnhsZikgZmlsZXMKK2ltcG9ydF9YTEZfZmlsZV9kZXNjcmlwdGlvbj1YTElGRlwgRGF0ZWllbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDQtMDctMDEgQG1vZGlmaWVkIDIwMDQtMDctMDEgQGNyZWF0b3IgR2VvcmdlIFJob3RlbiBAbW9kaWZpZXIgR2VvcmdlIFJob3RlbgorIyBAY29tbWVudCBEaWFsb2cgdGl0bGUgZm9yIGltcG9ydGluZyBmcm9tIFhMSUZGICgueGxmKSBmaWxlcworaW1wb3J0X1hMRl90aXRsZT1YTElGRlwgRGF0ZWlcIGltXCBwb3J0aWVyZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTI2IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgT3B0aW9uIGZvciByZXNvbHZpbmcgY29uZmxjaXRzIG9uIGEgY2FzZSBieSBjYXNlIGJhc2lzCitpbXBvcnRfY29uZmxpY3RfcHJvbXB0PUJlaVwgamVkZW1cIEtvbmZpbGt0XCBuYWNoZnJhZ2VuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wNyBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IE9wdGlvbiBzcGVjaWZ5aW5nIHdoZXRoZXIgYSBncm91cCBmb3VuZCBpbiB0aGUgdGFyZ2V0IGJ1dCBub3QgZm91bmQgaW4gdGhlIGFjdGl2ZSByZXNvdXJjZSBidW5kbGUgc2hvdWxkIGJlIGNyZWF0ZWQgaW4gdGhlIHJlc291cmNlIGJ1bmRsZSBvciBub3QKK2ltcG9ydF9kZWZhdWx0X2dyb3VwX2NyZWF0aW9uPUdydXBwZW5cIGVyemV1Z2VuLFwgZGllXCBuaWNodFwgaW1cIGFrdHVlbGxlblwgQlx1MDBGQ25kZWxcIGVudGhhbHRlblwgc2luZAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjYgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBPcHRvaW4gZm9yIG1hcmtpbmcgdGhlIGluY29taW5nIHZhbHVlcyBhcyB0cmFuc2xhdGVkIG9yIG5vdAoraW1wb3J0X2RlZmF1bHRfdHJhbnNsYXRlZD1BbHNcIFx1MDBGQ2JlcnNldHp0XCBtYXJraWVyZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTI2IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgVGl0bGUgZm9yIG9wdGlvbnMgc3BlY2lmeWluZyB0aGUgbWV0YSBkYXRhIHRvIGJlIGFwcGxpZWQgdG8gaW5kaXZpZHVhbCByZXNvdXJjZXMgaWYgaXQgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgaW1wb3J0IHNvdXJjZQoraW1wb3J0X2RlZmF1bHRfdmFsdWVzPVZvcmVpbnN0ZWxsdW5nZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTAyIEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQHswfSBUaGUgbG9jYWxlIGVuY29kaW5nIG9mIHRoZSBmaWxlIGluIHF1ZXN0aW9uCisjIEBjb21tZW50IEluc3RydWN0aW9ucyBmb3IgcHJvbXB0aW5nIHRoZSB1c2VyIHRvIHJlc29sdmUgYSBjb25mbGljdCB3aGVuIGltcG9ydGluZyByZXNvdXJjZXMgZnJvbSBhIGxvY2FsZSB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBjdXJyZW50IHJlc291cmNlIGJ1bmRsZQoraW1wb3J0X2ZpbGVfY29uZmxpY3RfY2hvb3NlPURpZVwgQ29kaWVydW5nXCB7MH1cIGV4aXN0aWVydFwgbmljaHQuXCBXXHUwMEU0aGxlblwgU2llXCBlaW5lXCBPcHRpb24sXCB1bVwgZGFzXCBQcm9ibGVtXCB6dVwgbFx1MDBGNnNlbixcIG9kZXJcIENhbmNlbFwgdW1cIGRlblwgS29uZmxpa3RcIHp1XCBpZ25vcmllcmVuLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjYgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBPcHRpb24gZm9yIGZpbGUgY29uZmxpY3RzIGluIHdoaWNoIGEgbmV3IGZpbGUgaXMgZ2VuZXJhdGVkLCBidXQgbm90IHBvcHVsYXRlZAoraW1wb3J0X2ZpbGVfY29uZmxpY3RfZ2VuZXJhdGVfZW1wdHk9RWluZVwgbmV1ZSxcIGxlZXJlXCBSZXNvdXJjZW5kYXRlaVwgZXJ6ZXVnZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTI2IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgT3B0aW9uIGZvciByZXNvbHZpbmcgZmlsZSBjb25mbGljdHMgaW4gd2hpY2ggYSBuZXcgZmlsZSBpcyBnZW5lcmF0ZWQgYW5kIHBvcHVsYXRlZCB3aXRoIGFsbCB0aGUgZXhpc3RpbmcgcmVzb3VyY2VzCitpbXBvcnRfZmlsZV9jb25mbGljdF9nZW5lcmF0ZV9wb3B1bGF0ZT1FaW5lXCBuZXVlXCBSZXNvdXJjZW5kYXRlaVwgZXJ6ZXVnZW5cIHVuZFwgbWl0XCBkZW5cIFJlc291cmNlblwgZGVyXCBCYXNpc2tsYXNzZVwgZlx1MDBGQ2xsZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTI2IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgT3B0aW9uIGZvciBmaWxlIGNvbmZsaWN0cyBpbiB3aGljaCB0aGUgY29uZmxpY3RzIGFyZSBpZ25vcmVkCitpbXBvcnRfZmlsZV9jb25mbGljdF9pZ25vcmU9QWxsZVwgUmVzb3VyY2VuXCBhdXNcIExva2FsZ3J1cHBlbixcIGRpZVwgbmljaHRcIGluXCBpbVwgYWt0dWVsbGVuXCBSZXNvdXJjZW5iXHUwMEZDbmRlbFwgZXhpc3RpZXJlbixcIFx1MDBGQ2JlcnNwcmluZ2VuXCB1bmRcIGlnbm9yaWVyZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTI2IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgVGl0bGUgZm9yIHNlY3Rpb24gbGlzdGluZyBvcHRpb25zIGZvciB3aGF0IHRvIGRvIHdoZW4gYW4gaW1wb3J0ZWQgdmFsdWUgZXhpc3RzIGluIGEgbG9jYWxlIG5vdCBkZWZpbmVkIGluIHRoZSBleGlzdGluZyByZXNvdXJjZSBidW5kbGUKK2ltcG9ydF9maWxlX2NvbmZsaWN0cz1SZXNvdXJjZW5kYXRlaVwgbmljaHRcIGdlZnVuZGVuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yNiBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFNlbGVjdGlvbiBvZiB0aGUgZGVmYXVsdCBncm91cC4gQSBsaXN0IG9mIGdyb3VwcyB3aWxsIGFwcGVhciB0byB0aGUgcmlnaHQgb2YgdGhpcyByZXNvdXJjZSBpbiBhIENvbWJvQm94CitpbXBvcnRfaW5zZXJ0X2dyb3VwPUVpbmZcdTAwRkNnZW5cIGluXCBHcnVwcGVcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjYgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUaXRsZSBmb3IgdGhlIHR5cGVzIG9mIGZpbGVzIGFjY2VwdGVkIGZvciB0aGlzIGltcG9ydCB0eXBlCitpbXBvcnRfamF2YV9maWxlX2Rlc2NyaXB0aW9uPUphdmFcIExpc3RSZXNvdXJjZUJ1bmRsZVwgQmFzaXNrbGFzc2VuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yNiBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFRpdGxlIGZvciBkaWFsb2cgcHJvbXB0aW5nIGZvciBpbXBvcnQgZnJvbSBqYXZhIGNsYXNzZXMKK2ltcG9ydF9qYXZhX3RpdGxlPUphdmFcIExpc3RSZXNvdXJjZUJ1bmRsZVwgS2xhc3NlbmltcG9ydAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjYgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUaXRsZSBpbmRpY2F0aW5nIHNlY3Rpb24gY29udGFpbmluZyB1c2VyIG9wdGlvbnMKK2ltcG9ydF9vcHRpb25zPUltcG9ydG9wdGlvbmVuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yNiBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFRpdGxlIGZvciBmaWxlIGNob29zZXIgZm9yIHNlbGVjdGlvbiBvZiByZXNvdXJjZSBidW5kbGVzIHN0b3JlZCBpbiAucHJvcGVydGllcyBmaWxlcworaW1wb3J0X3Byb3BlcnRpZXNfZmlsZV9kZXNjcmlwdGlvbj1CYXNpc2tsYXNzZW5cIGRlc1wgUmVzb3VyY2VuYlx1MDBGQ25kZWxzCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yNiBAbW9kaWZpZWQgMjAwMS0wNi0yOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IERpYWxvZyB0aXRsZSBmb3IgaW1wb3J0aW5nIGZyb20gcHJvcGVydGllcyBmaWxlcyAoY3JlYXRlZCBvciBub3QgYnkgUkJNYW5hZ2VyKQoraW1wb3J0X3Byb3BlcnRpZXNfdGl0bGU9UHJvcGVydHktRGF0ZWllblwgaW1wb3J0aWVyZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTAyIEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQHsxfSBFbmNvZGluZyBvZiB0aGUgcmVzb3VyY2UgdmFsdWUgd2l0aCBhIGNvbmZsaWN0CisjIEB7MH0gVGhlIGtleSB2YWx1ZSBvZiB0aGUgcmVzb3VyY2UgaW4gY29uZmxpY3QKKyMgQGNvbW1lbnQgVGhpcyBpcyBhIHdhcm5pbmcgYW5kIGluc3RydWN0aW9uIGZvciB3aGVuIGEgcmVzb3VyY2UgY29uZmxpY3Qgb2NjdXJzIGR1cmluZyBhbiBpbXBvcnQKK2ltcG9ydF9yZXNvdXJjZV9jb25mbGljdF9jaG9vc2U9RGVyXCBTY2hsXHUwMEZDc3NlbFwgezB9XCBleGlzdGllcnRcIGJlcmVpdHNcIGltXCBSZXNvdXJjZW5iXHUwMEZDbmRlbFwgezF9LlwgV1x1MDBFNGhsZW5cIFNpZVwgZWluZVwgT3B0aW9uXCBhdXMsXCB1bVwgZGllc2VuXCBLb25mbGlrdFwgenVcIGxcdTAwRjZzZW5cOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDIgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAezB9IFRoZSB0cmFuc2xhdGlvbiB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc291cmNlIGl0ZW0KKyMgQGNvbW1lbnQgQW4gaW5kaWNhdGlvbiBvZiB0aGUgdmFsdWUgb2YgdGhlIHJlc291cmNlIGFjY29yZGluZyB0byB0aGUgaW1wb3J0IGZpbGUKK2ltcG9ydF9yZXNvdXJjZV9jb25mbGljdF9jaG9vc2Vfc291cmNlPVx1MDBEQ2JlcnNldHp1bmdcIGltcG9ydGllcmVuXDpcIHswfQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDIgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAezB9IFRoZSB0cmFuc2xhdGlvbiB2YWx1ZSBvZiB0aGUgcmVzb3VyY2UgaXRlbQorIyBAY29tbWVudCBBbiBpbmRpY2F0aW9uIG9mIHRoZSB0cmFuc2xhdGlvbiB2YWx1ZSBoZWxkIGJ5IHRoZSBhY3RpdmUgcmVzb3VyY2UgYnVuZGxlIGR1cmluZyBhIHRyYW5zbGF0aW9uIHJlc291cmNlIGNvbmZsaWN0CitpbXBvcnRfcmVzb3VyY2VfY29uZmxpY3RfY2hvb3NlX3RhcmdldD1cdTAwRENiZXJzdHp1bmdcIGRlc1wgUmVzb3VyY2VuYlx1MDBGQ25kZWxzXDpcIHswfQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjYgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBPcHRpb24gZm9yIHJlc29sdmluZyByZXNvdXJjZSBjb25mbGljdHMgYnkgaWdub3JpbmcgaW1wb3J0IHZhbHVlCitpbXBvcnRfcmVzb3VyY2VfY29uZmxpY3RfaWdub3JlPUtvbmZsaWt0XCBpZ25vcmllcmVuXCB1bmRcIE9yaWdpbmFscmVzb3VyY2VcIGJlaWJlaGFsdGVuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yNiBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IE9wdGlvbiBmb3IgcmVzb2x2aW5nIGNvbmZsaWN0cyBieSB1c2luZyB0aGUgaW1wb3J0IHZhbHVlCitpbXBvcnRfcmVzb3VyY2VfY29uZmxpY3Rfb3ZlcndyaXRlPVJlc291cmNlXCBtaXRcIGRlbVwgV2VydFwgYXVzXCBkZXJcIEltcG9ydGRhdGVpXCBcdTAwRkNiZXJzY2hyZWliZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTI2IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgVGl0bGUgbGlzdGluZyBvcHRpb25zIGZvciByZXNvbHZpbmcgY29uZmxpY3RzIGJldHdlZW4gcmVzb3VyY2VzCitpbXBvcnRfcmVzb3VyY2VfY29uZmxpY3RzPVJlc291cmNlbmtvbmZsaWt0ZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjYgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAezB9IFRoZSBwYXRoIGFuZCBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZQorIyBAY29tbWVudCBJbmRpY2F0aW9uIG9mIHRoZSBzb3VyY2UgZmlsZSBmb3IgdGhlIGltcG9ydAoraW1wb3J0X3NvdXJjZV9maWxlPVF1ZWxsZGF0ZWlcOlwgezB9CisKKyMKKyMgQGdyb3VwIE1lbnUgSXRlbXMKKyMKKyMgQGdyb3VwQ29tbWVudCBUaGVzZSByZXNvdXJjZXMgcmVwcmVzZW50IGFsbCBvZiB0aGUgbWVudSBhbmQgbWVudSBpdGVtIHRpdGxlcworCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCBUaGUgbWVudSB0aXRsZSBjb3ZlcmluZyBjb3B5aW5nLCBwYXN0aW5nLCBkZWxldGluZyBvZiBpdGVtcworbWVudV9lZGl0PUJlYXJiZWl0ZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTA3IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCittZW51X2VkaXRfY29weT1Lb3BpZXJlbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDcgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK21lbnVfZWRpdF9jb3B5X3RyaWdnZXI9aworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDcgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK21lbnVfZWRpdF9jdXQ9QXVzc2NobmVpZGVuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wNyBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorbWVudV9lZGl0X2N1dF90cmlnZ2VyPWEKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTA3IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCittZW51X2VkaXRfZGVsZXRlPUxcdTAwRjZzY2hlbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDcgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK21lbnVfZWRpdF9kZWxldGVfdHJpZ2dlcj1sCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wNyBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorbWVudV9lZGl0X3Bhc3RlPUVpbmZcdTAwRkNnZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTA3IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCittZW51X2VkaXRfcGFzdGVfdHJpZ2dlcj1lCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCBUaGUgdHJpZ2dlciBpcyBhIGxldHRlciBmcm9tIHRoZSB0cmFuc2xhdGlvbiBvZiAnbWVudV9lZGl0JyB3aGljaCBwcm92aWRlcyBhIGtleWJvYXJkIHNob3J0Y3V0IHRvIHRoZSBtZW51CittZW51X2VkaXRfdHJpZ2dlcj1iCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCBNZW51IHRpdGxlIGZvciB0aGUgb3BlbmluZywgc2F2aW5nLCBldGMuIGRvY3VtZW50cyBhbmQgZXhpdGluZyB0aGUgcHJvZ3JhbQorbWVudV9maWxlPURhdGVpCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0xNSBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEFiaWxpdHkgdG8gZXhwb3J0IHJlc291cmNlIGJ1bmRsZXMgaW4gYSB2YXJpZXR5IG9mIGZvcm1hdHMKK21lbnVfZmlsZV9leHBvcnQ9UmVzb3VyY2VuYlx1MDBGQ25kZWxcIGV4cG9ydGllcmVuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMi0wNS0xNyBAbW9kaWZpZWQgMjAwMi0wNS0xNyBAY3JlYXRvciBHZW9yZ2UgUmhvdGVuIEBtb2RpZmllciBHZW9yZ2UgUmhvdGVuCisjIEBjb21tZW50IEFibGl0eSB0byBleHBvcnQgdG8gSUNVIFJlc291cmNlIEJ1bmRsZSBmaWxlcworbWVudV9maWxlX2V4cG9ydF9JQ1U9SUNVXCBEb2t1bWVudGUuLi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAyLTA1LTE3IEBtb2RpZmllZCAyMDAyLTA1LTE3IEBjcmVhdG9yIEdlb3JnZSBSaG90ZW4gQG1vZGlmaWVyIEdlb3JnZSBSaG90ZW4KKyMgQGNvbW1lbnQgCittZW51X2ZpbGVfZXhwb3J0X0lDVV90cmlnZ2VyPWkKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTE1IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgQWJsaXR5IHRvIGV4cG9ydCB0byBUTVggWE1MIGZpbGVzCittZW51X2ZpbGVfZXhwb3J0X1RNWD1UTVhcIERhdGVpZW4uLi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTE1IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCittZW51X2ZpbGVfZXhwb3J0X1RNWF90cmlnZ2VyPXQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDA0LTA3LTAxIEBtb2RpZmllZCAyMDA0LTA3LTAxIEBjcmVhdG9yIEdlb3JnZSBSaG90ZW4gQG1vZGlmaWVyIEdlb3JnZSBSaG90ZW4KKyMgQGNvbW1lbnQgeAorbWVudV9maWxlX2V4cG9ydF9YTEY9WExJRkZcIERhdGVpZW4uLi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDA0LTA3LTAxIEBtb2RpZmllZCAyMDA0LTA3LTAxIEBjcmVhdG9yIEdlb3JnZSBSaG90ZW4gQG1vZGlmaWVyIEdlb3JnZSBSaG90ZW4KKyMgQGNvbW1lbnQgCittZW51X2ZpbGVfZXhwb3J0X1hMRl90cmlnZ2VyPXgKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTE1IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgQWJpbGl0eSB0byBleHBvcnQgdG8gamF2YSBmaWxlcyB0aGF0IGNvbXBpbGUgdG8gYmUgTGlzdFJlc291cmNlQnVuZGxlIGNsYXNzIGV4dGVuc2lvbnMKK21lbnVfZmlsZV9leHBvcnRfamF2YT1Lb21waWxpZXJiYXJlXCBKYXZhXCBEYXRlaWVuLi4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0xNSBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorbWVudV9maWxlX2V4cG9ydF9qYXZhX3RyaWdnZXI9agorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMTUgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBFeHBvcnQgYWJpbGl0eSB0byBwcm9wZXJ0aWVzIGZpbGVzIG1pbnVzIHRoZSBtZXRhZGF0YQorbWVudV9maWxlX2V4cG9ydF9wcm9wZXJ0aWVzPU1pbmltYWxlXCBFaWdlbnNjaGFmdHNkYXRlaWVuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0xNSBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorbWVudV9maWxlX2V4cG9ydF9wcm9wZXJ0aWVzX3RyaWdnZXI9ZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMTUgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK21lbnVfZmlsZV9leHBvcnRfdHJpZ2dlcj14CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCBNZW51IGl0ZW0gZm9yIGltcG9ydCBhbmQgbWVyZ2luZyBhbm90aGVyIHJlc291cmNlIGZpbGUgd2l0aCB0aGUgYnVuZGxlIGJlaW5nIHdvcmtlZCB3aXRoCittZW51X2ZpbGVfaW1wb3J0PVJlc291cmNlLUJ1bmRsZVwgYXVzXCBEYXRlaVwgaW1wb3J0aWVyZW4uLi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTE1IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgSW1wb3J0IGFibGlpdHkgZnJvbSBYTUwgVE1YIGRvY3VtZW50cworbWVudV9maWxlX2ltcG9ydF9UTVg9VE1YXCBEb2t1bWVudGUuLi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTE1IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCittZW51X2ZpbGVfaW1wb3J0X1RNWF90cmlnZ2VyPXQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDA0LTA3LTAxIEBtb2RpZmllZCAyMDA0LTA3LTAxIEBjcmVhdG9yIEdlb3JnZSBSaG90ZW4gQG1vZGlmaWVyIEdlb3JnZSBSaG90ZW4KKyMgQGNvbW1lbnQgSW1wb3J0IGFiaWxpdHkgZnJvbSBYTUwgWExJRkYgKC54bGYpIGZpbGVzCittZW51X2ZpbGVfaW1wb3J0X1hMRj1YTElGRlwgRG9rdW1lbnRlLi4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwNC0wNy0wMSBAbW9kaWZpZWQgMjAwNC0wNy0wMSBAY3JlYXRvciBHZW9yZ2UgUmhvdGVuIEBtb2RpZmllciBHZW9yZ2UgUmhvdGVuCisjIEBjb21tZW50IFgKK21lbnVfZmlsZV9pbXBvcnRfWExGX3RyaWdnZXI9eAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMTUgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBJbXBvcnQgYWJpbGl0eSBmcm9tIGphdmEgY2xhc3NlcyAoTGlzdFJlc291cmNlQnVuZGxlKQorbWVudV9maWxlX2ltcG9ydF9qYXZhPUxpc3RSZXNvdXJjZUJ1bmRsZVwgSmF2YVwgS2xhc3Nlbi4uLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMTUgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK21lbnVfZmlsZV9pbXBvcnRfamF2YV90cmlnZ2VyPWoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTE1IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgSW1wb3J0IGFiaWxpdHkgZnJvbSBwcm9wZXJ0aWVzIGZpbGVzIG5vdCBnZW5lcmF0ZWQgYnkgUkJNYW5hZ2VyCittZW51X2ZpbGVfaW1wb3J0X3Byb3BlcnRpZXM9RWluZmFjaGVcIFJlc291cmNlbmJcdTAwRkNuZGVsLi4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0xNSBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorbWVudV9maWxlX2ltcG9ydF9wcm9wZXJ0aWVzX3RyaWdnZXI9UworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCittZW51X2ZpbGVfaW1wb3J0X3RyaWdnZXI9bQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgTWVudSBpdGVtIGZvciBjcmVhdGluZyBhIG5ldyByZXNvdXJjZSBidW5kbGUKK21lbnVfZmlsZV9uZXc9TmV1CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCAKK21lbnVfZmlsZV9uZXdfdHJpZ2dlcj1uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCBNZW51IEl0ZW0gZm9yIG9wZW5pbmcgYSByZXNvdXJjZSBidW5kbGUKK21lbnVfZmlsZV9vcGVuPVx1MDBENmZmbmVuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCAKK21lbnVfZmlsZV9vcGVuX3RyaWdnZXI9ZgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgTWVudSBpdGVtIGZvciBjbG9zaW5nIHRoZSBhcHBsaWNhdGlvbgorbWVudV9maWxlX3F1aXQ9QmVlbmRlbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCittZW51X2ZpbGVfcXVpdF90cmlnZ2VyPWUKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IE1lbnUgaXRlbSBmb3Igc2F2aW5nIHRoZSByZXNvdXJjZSBidW5kbGUgYmVpbmcgd29ya2VkIHdpdGgKK21lbnVfZmlsZV9zYXZlPVNwZWljaGVybgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCittZW51X2ZpbGVfc2F2ZV90cmlnZ2VyPXMKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IE1lbnUgSXRlbSBmb3Igc2F2aW5nIGEgcmVzb3VyY2UgYnVuZGxlIHRvIGEgcGFydGljdWxhciBsb2NhdGlvbiBhbmQgZmlsZSBuYW1lCittZW51X2ZpbGVfc2F2ZWFzPVNwZWljaGVyblwgdW50ZXIuLi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IAorbWVudV9maWxlX3NhdmVhc190cmlnZ2VyPXUKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IFRoZSB0cmlnZ2VyIGlzIGEgbGV0dGVyIGZyb20gdGhlIHRyYW5zbGF0aW9uIG9mICdtZW51X2ZpbGUnIHdoaWNoIHByb3ZpZGVzIGEga2V5Ym9hcmQgc2hvcnRjdXQgdG8gdGhlIG1lbnUKK21lbnVfZmlsZV90cmlnZ2VyPWQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IE1lbnUgdGl0bGUgZm9yIGhlbHAgaW5mb3JtYXRpb24gYW5kIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByb2dyYW0KK21lbnVfaGVscD1IaWxmZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgTWVudSBpdGVtIHdoaWNoIGJyaW5ncyB1cCBhIGRpYWxvZyBkZXNjcmliaW5nIHRoZSBhcHBsaWNhdGlvbgorbWVudV9oZWxwX2Fib3V0PVx1MDBEQ2JlclwgUmVzb3VyY2VcIEJ1bmRsZVwgTWFuYWdlcgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCittZW51X2hlbHBfYWJvdXRfdHJpZ2dlcj1iCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCBUaGUgdHJpZ2dlciBpcyBhIGxldHRlciBmcm9tIHRoZSB0cmFuc2xhdGlvbiBvZiAnbWVudV9oZWxwJyB3aGljaCBwcm92aWRlcyBhIGtleWJvYXJkIHNob3J0Y3V0IHRvIHRoZSBtZW51CittZW51X2hlbHBfdHJpZ2dlcj1oCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCBNZW51IHRpdGxlIGZvciBvcHRpb25zIHN1Y2ggYXMgY3JlYXRpbmcgbmV3IHJlc291cmNlcywgZ3JvdXBzLCBhbmQgcmVzb3VyY2UgZmlsZXMKK21lbnVfb3B0aW9ucz1PcHRpb25lbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgTWVudSBJdGVtIGZvciBjcmVhdGluZyBhIG5ldyByZXNvdXJjZSBpdGVtCittZW51X29wdGlvbnNfYWRkZW50cnk9TmV1ZW5cIEVpbnRyYWdcIGhpbnp1Zlx1MDBGQ2dlbi4uLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCittZW51X29wdGlvbnNfYWRkZW50cnlfdHJpZ2dlcj1lCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCBNZW51IEl0ZW0gZm9yIGNyZWF0aW5nIGEgbmV3IHJlc291cmNlIGZpbGUgZm9yIGEgcGFydGljdWxhciBsYW5ndWFnZS9jb3VudHJ5L3ZhcmlhbnQKK21lbnVfb3B0aW9uc19hZGRmaWxlPU5ldWVcIFJlc291cmNlbmRhdGVpXCBoaW56dWZcdTAwRkNnZW4uLi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IAorbWVudV9vcHRpb25zX2FkZGZpbGVfdHJpZ2dlcj1kCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCBNZW51IGl0ZW0gZm9yIGNyZWF0aW5nIGEgbmV3IHJlc291cmNlIGdyb3VwCittZW51X29wdGlvbnNfYWRkZ3JvdXA9TmV1ZVwgUmVzb3VyY2VuZ3J1cHBlXCBoaW56dWZcdTAwRkNnZW4uLi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IAorbWVudV9vcHRpb25zX2FkZGdyb3VwX3RyaWdnZXI9ZworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IE1lbnUgaXRlbSBmb3IgZWRpdGluZyB0aGUgdXNlcidzIHByZWZlcmVuY2VzIGZvciB0aGUgYXBwbGljYXRpb24KK21lbnVfb3B0aW9uc19wcmVmZXJlbmNlcz1FaW5zdGVsbHVuZ2VuLi4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgCittZW51X29wdGlvbnNfcHJlZmVyZW5jZXNfdHJpZ2dlcj1zCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTEtMjAgQG1vZGlmaWVkIDIwMDEtMTEtMjAgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBNZW51IGl0ZW0gdGhhdCBtYWtlcyB2aXNpYmxlIHRoZSBwcm9qZWN0IHZpZXdlcgorbWVudV9vcHRpb25zX3Byb2plY3Rfdmlld2VyPU9wZW5cIFByb2plY3RcIFZpZXdlcgorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTExLTIwIEBtb2RpZmllZCAyMDAxLTExLTIwIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgCittZW51X29wdGlvbnNfcHJvamVjdF92aWV3ZXJfdHJpZ2dlcj12CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCBUaGUgdHJpZ2dlciBpcyBhIGxldHRlciBmcm9tIHRoZSB0cmFuc2xhdGlvbiBvZiAnbWVudV9vcHRpb25zJyB3aGljaCBwcm92aWRlcyBhIGtleWJvYXJkIHNob3J0Y3V0IHRvIHRoZSBtZW51CittZW51X29wdGlvbnNfdHJpZ2dlcj1vCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMTItMTcgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBQb3B1cCBtZW51IGl0ZW0gZm9yIGFkZGluZyBhIG5ldyByZXNvdXJjZSBidW5kbGUgdG8gdGhlIHByb2plY3QKK21lbnVfdHJlZV9hZGRfcHJvamVjdF9idW5kbGU9QWRkXCBSZXNvdXJjZVwgQnVuZGxlLi4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wNi0yNyBAbW9kaWZpZWQgMjAwMS0wNi0yOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IFBvcHVwIG1lbnUgaXRlbSBmb3IgZGVsZXRpbmcgcGVybWFuZW50bHkgYSByZXNvdXJjZSBmaWxlCittZW51X3RyZWVfZGVsZXRlPVJlc291cmNlbmRhdGVpXCBsXHUwMEY2c2NoZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTA2LTI3IEBtb2RpZmllZCAyMDAxLTA2LTI5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIE1hcnRpbgorIyBAY29tbWVudCBQb3B1cCBtZW51IGl0ZW0gZm9yIHJlbW92aW5nIGEgc3BlY2lmaWMgcmVzb3VyY2UgZmlsZSBmcm9tIHRoZSB0cmVlIHZpZXcgb2YgdGhlIHJlc291cmNlIGJ1bmRsZQorbWVudV90cmVlX2hpZGU9UmVzb3VyY2VuZGF0ZWlcIG5pY2h0XCBtZWhyXCBhbnplaWdlbgorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTEyLTE5IEBtb2RpZmllZCAyMDAxLTEyLTE5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgUG9wdXAgbWVudSBpdGVtIGZvciBjcmVhdGluZyBhIG5ldyBwcm9qZWN0CittZW51X3RyZWVfbmV3X3Byb2plY3Q9TmV3XCBSZXNvdXJjZVwgQnVuZGxlXCBQcm9qZWN0Li4uCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMTItMTcgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBQb3B1cCBtZW51IGl0ZW0gZm9yIG9wZW5pbmcgYSByZXNvdXJjZSBidW5kbGUgcHJvamVjdAorbWVudV90cmVlX29wZW5fcHJvamVjdD1PcGVuXCBSZXNvdXJjZVwgQnVuZGxlXCBQcm9qZWN0Li4uCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMTItMTcgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBQb3B1cCBtZW51IGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlIGJ1bmRsZSBpbiB0aGUgcHJvamVjdCB0cmVlCittZW51X3RyZWVfcmVtb3ZlX3Byb2plY3RfYnVuZGxlPVJlbW92ZVwgZnJvbVwgUHJvamVjdAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDYtMjcgQG1vZGlmaWVkIDIwMDEtMDYtMjkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgTWFydGluCisjIEBjb21tZW50IFBvcHVwIG1lbnUgaXRlbSBmb3Igc2F2aW5nIGEgc3BlY2lmaWMgcmVzb3VyY2UgYnVuZGxlIGZpbGUKK21lbnVfdHJlZV9zYXZlPVJlc291cmNlbmRhdGVpXCBzcGVpY2hlcm4KKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0xMi0xNyBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IFBvcHVwIG1lbnUgaXRlbSBmb3Igc2F2aW5nIGNoYW5nZXMgdG8gdGhlIHJlc291cmNlIHByb2plY3QgZmlsZSwgbm90IHRoZSByZXNvdXJjZSBidW5kbGVzIHRoZW1zZWx2ZXMgd2l0aGluIHRoZSBwcm9qZWN0CittZW51X3RyZWVfc2F2ZV9wcm9qZWN0PVNhdmVcIFJlc291cmNlXCBCdW5kbGVcIFByb2plY3RcIEZpbGUuLi4KKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0xMi0xNyBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IFBvcHVwIG1lbnUgZm9yIHNlbGVjdGluZyBhIHJlc291cmNlIGJ1bmRsZSBmcm9tIHRoZSBwcm9qZWN0IHRyZWUgdG8gYmUgZWRpdGVkIGluIHRoZSByZXNvdXJjZSBidW5kbGUgdHJlZQorbWVudV90cmVlX3NlbGVjdF9wcm9qZWN0X2J1bmRsZT1Xb3JrXCB3aXRoXCB0aGlzXCBSZXNvdXJjZVwgQnVuZGxlCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCBNZW51IHRpdGxlIGZvciBjaGFuZ2luZyB0aGUgZGlzcGxheSBiZWluZyBzZWVuIGJ5IHRoZSB1c2VyCittZW51X3ZpZXc9QW5zaWNodAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgTWVudSBpdGVtIHRoYXQgdGFrZXMgeW91IGRpcmVjdGx5IHRvIHRoZSBzdGF0aXN0aWNzIHBhbmVsIGZvciB0aGUgZW50aXJlIGJ1bmRsZQorbWVudV92aWV3X3N0YXRpc3RpY3M9UmVzb3VyY2VcIEJ1bmRsZVwgU3RhdGlzdGlrCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCAKK21lbnVfdmlld19zdGF0aXN0aWNzX3RyaWdnZXI9cworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgVGhlIHRyaWdnZXIgaXMgYSBsZXR0ZXIgZnJvbSB0aGUgdHJhbnNsYXRpb24gb2YgJ21lbnVfdmlldycgd2hpY2ggcHJvdmlkZXMgYSBrZXlib2FyZCBzaG9ydGN1dCB0byB0aGUgbWVudQorbWVudV92aWV3X3RyaWdnZXI9YQorCisjCisjIEBncm91cCBQcm9qZWN0IFBhbmVsCisjCisjIEBncm91cENvbW1lbnQgUGFuZWwgYXNzb2NpYXRlZCB3aXRoIFByb2plY3QgZWRpdGluZworCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTItMTkgQG1vZGlmaWVkIDIwMDEtMTItMTkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAezB9IFRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZSBidW5kbGUKKyMgQGNvbW1lbnQgTGFiZWwgaW5kaWNhdG9yIGFzc29jaWF0aW5nIGEgdGV4dCBib3ggY29udGFpbmluZyBhIHRyYW5zbGF0aW9uIHdpdGggdGhlIHJlc291cmNlIGJ1bmRsZSB0aGUgdHJhbnNsYXRpb24gY29tZXMgZnJvbQorcHJvamVjdF9wYW5lbF9idW5kbGU9UmVzb3VyY2VcIEJ1bmRsZVw6XCB7MH0KKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMi0xOSBAbW9kaWZpZWQgMjAwMS0xMi0xOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEB7MH0gTmFtZSBvZiB0aGUgcmVzb3VyY2UgYnVuZGxlCisjIEBjb21tZW50IFNwZWNpYWwgaW5kaWNhdG9yIG9mIHRoZSByZXNvdXJjZSBpdGVtIHJlc291cmNlIGJ1bmRsZSB3aGVuIHRoZSBpdGVtIGlzIHVudHJhbnNsYXRlZAorcHJvamVjdF9wYW5lbF9idW5kbGVfdW50cmFuc2xhdGVkPVJlc291cmNlXCBCdW5kbGVcOlwgezB9XCAoVW50cmFuc2xhdGVkKQorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTEyLTE5IEBtb2RpZmllZCAyMDAxLTEyLTE5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgTGFiZWwgdGV4dCBtYXJraW5nIHRoZSBsaW5lIGFib3ZlIG9yIHRvIHRoZSBsZWZ0IG9mIGEgcmVzb3VyY2UgY29tbWVudAorcHJvamVjdF9wYW5lbF9jb21tZW50PUJhc2VcIENsYXNzXCBSZXNvdXJjZVwgQ29tbWVudFw6CisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTItMTkgQG1vZGlmaWVkIDIwMDEtMTItMTkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBMYWJlbCB0ZXh0IGZvciBhIGNvbW1lbnQgd2hlbiBub25lIGlzIGZvdW5kIGZvciBhIHJlc291cmNlCitwcm9qZWN0X3BhbmVsX2NvbW1lbnRfbm9uZT1Ob1wgY29tbWVudFwgc3VwcGxpZWQKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMi0xOSBAbW9kaWZpZWQgMjAwMS0xMi0xOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IEJ1dHRvbiB0aXRsZSBzaG93biBvbiB0aGUgcHJvamVjdCBwYW5lbCBmb3IgY29tbWl0dGluZyBjaGFuZ2UgdG8gb25lIHJlc291cmNlIG9ubHkKK3Byb2plY3RfcGFuZWxfY29tbWl0X2J1dHRvbj1Db21taXRcIENoYW5nZQorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTEyLTE5IEBtb2RpZmllZCAyMDAxLTEyLTE5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgQnV0dG9uIHRpdGxlIG9uIHRoZSBwcm9qZWN0IHBhbmVsIGZvciBzYXZpbmcgYWxsIG9mIHRoZSByZXNvdXJjZXMgZGlzcGxheWVkLiBUaGlzIG1lYW5zIG11bHRpcGxlIHJlc291cmNlIGZpbGVzIGdldCBzYXZlZC4KK3Byb2plY3RfcGFuZWxfY29tbWl0X2J1dHRvbl9hbGw9Q29tbWl0XCBBbGxcIFJlc291cmNlXCBDaGFuZ2VzCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTItMTkgQG1vZGlmaWVkIDIwMDEtMTItMTkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBEZWZhdWx0IHRpdGxlIHNob3duIG9uIHRoZSBwcm9qZWN0IHBhbmVsIHdoZW4gbm8gcGFydGljdWxhciByZXNvdXJjZSBoYXMgYmVlbiBzZWxlY3RlZAorcHJvamVjdF9wYW5lbF9kZWZhdWx0X3RpdGxlPVByb2plY3RcIFJlc291cmNlXCBFZGl0aW5nCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTItMTkgQG1vZGlmaWVkIDIwMDEtMTItMTkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBUZXh0IGZpZWxkIG1hcmtlciBmb3IgdGhlIHRyYW5zbGF0aW9uIG9mIGEgcmVzb3VyY2Ugd2hlbiB0aGF0IHJlc291cmNlIGRvZXMgbm90IGV4aXN0IGZvciB0aGUgZW5jb2RpbmcgZmlsZSBpdCBpcyBhc3NvY2lhdGVkIHdpdGgKK3Byb2plY3RfcGFuZWxfaXRlbV9pbmhlcml0cz08Tm9cIFRyYW5zbGF0aW9uXDpcIFJlc291cmNlXCBJbmhlcml0c1wgZnJvbVwgcGFyZW50PgorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTEyLTE5IEBtb2RpZmllZCAyMDAxLTEyLTE5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQHswfSBUaGUga2V5IG9mIHRoZSBzZWxlY3RlZCByZXNvdXJjZQorIyBAY29tbWVudCBUaXRsZSBvbiB0aGUgcHJvamVjdCBwYW5lbCB3aGlsZSBhIHJlc291cmNlIGlzIHNlbGVjdGVkCitwcm9qZWN0X3BhbmVsX3RpdGxlPVByb2plY3RcIFJlc291cmNlXCBFZGl0aW5nXDpcIHswfQorCisjCisjIEBncm91cCBSQlJlcG9ydGVyCisjCisjIEBncm91cENvbW1lbnQgVHJhbnNsYXRpb25zIGZvciB0aGUgUkJSZXBvcnRlciBhcHBsaWNhdGlvbgorCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBCdXR0b24gdGl0bGUgZm9yIHNlbGVjdGluZyBmaWxlIGxvY2F0aW9ucyBmb3IgaW5wdXQvb3V0cHV0CityZXBvcnRlcl9idXR0b25fY2hvb3NlPUF1c3dcdTAwRTRobGVuLi4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBCdXR0b24gaW5kaWNhdGluZyB0aGUgcmVwb3J0IGdlbmVyYXRpb24gc2hvdWxkIG9jY3VyIGltbWVkaWF0ZWx5CityZXBvcnRlcl9idXR0b25fbm93PUVyemV1Z2VuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0yOSBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEJ1dHRvbiB0aXRsZSBmb3Igc2F2aW5nIHRoZSBjdXJyZW50IHNldHRpbmdzIGFzIGRlZmF1bHQKK3JlcG9ydGVyX2J1dHRvbl9zYXZlX2RlZmF1bHRzPU1vbWVudGFuZVwgRWluc3RlbGx1bmdlblwgYWxzXCBWb3JlaW5zdGVsbHVuZ2VuXCBzcGVpY2hlcm4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEJ1dHRvbiB0byBhY3RpdmF0ZSB0aGUgcmVwb3J0ZXIKK3JlcG9ydGVyX2J1dHRvbl9zdGFydD1TdGFydAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgQnV0dG9uIHRvIGRlYWN0aXZlIHRoZSByZXBvcnRlcgorcmVwb3J0ZXJfYnV0dG9uX3N0b3A9U3RvcAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgTGV2ZWwgb2YgZGV0YWlsOiBtb3N0IGluZm9ybWF0aW9uIGF2YWlsYWJsZQorcmVwb3J0ZXJfZGV0YWlsX2hpZ2g9SG9jaAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgSW5kaWNhdGlvbiBvZiBhIHNlbGVjdGlvbiBvcHRpb24gb2YgdGhlIGxldmVsIG9mIGRldGFpbCBpbiByZXBvcnRpbmcKK3JlcG9ydGVyX2RldGFpbF9sZXZlbD1EZXRhaWxzdHVmZVw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBMZXZlbCBvZiBkZXRhaWw6IHN0YW5kYXJkCityZXBvcnRlcl9kZXRhaWxfbm9ybWFsPU5vcm1hbAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgQW4gb3V0cHV0IGZvcm1hdDogSFRNTAorcmVwb3J0ZXJfZm9ybWF0X2h0bWw9SFRNTAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgQW4gb3V0cHV0IGZvcm1hdCB0eXBlOiBwbGFpbiB0ZXh0CityZXBvcnRlcl9mb3JtYXRfdGV4dD1UZXh0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBBbiBvdXRwdXQgZm9ybWF0OiBYTUwKK3JlcG9ydGVyX2Zvcm1hdF94bWw9WE1MCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBJbmRpY2F0aW9uIG9mIGZpbGUgbG9jYXRpb24gb2YgdGhlIHJlc291cmNlIGJ1bmRsZSB0byByZXBvcnQgb24KK3JlcG9ydGVyX2lucHV0X2J1bmRsZT1SZXNvdXJjZW5iXHUwMEZDbmRlbFw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBJbmRpY2F0aW9uIHRoYXQgcmVwb3J0aW5nIHdpbGwgaGFwcGVuIGF0IGEgc3BlY2lpZmllZCB0aW1lIG9mIGRheS4gRm9sbG93ZWQgYnkgYSB0aW1lIGFuZCBkYXkgb3B0aW9uLgorcmVwb3J0ZXJfaW50ZXJ2YWxfZGVmaW5lZD1CZXJpY2h0ZW5cIHVtCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUZXh0IGluZGljYXRpb24gb2Ygc2VxdWVudGlhbCByZXBvcnRpbmcgcGF1c2VkIGZvciBhIGRlZmluZWQgaW50ZXJ2YWwgYmV0d2VlbiByZXBvcnRpbmcuIEltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgbnVtYmVyIGFuZCBhIHVuaXQgb2YgbWVhc3VyZSBvZiB0aW1lCityZXBvcnRlcl9pbnRlcnZhbF9zZXF1ZW50aWFsPUJlcmljaHRlblwgYWxsZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQHswfSBEYXRlL1RpbWUgb2YgbGFzdCByZXBvcnQgZ2VuZXJhdGlvbgorIyBAY29tbWVudCBJbmRpY2F0aW9uIG9mIHRoZSB0aW1lIG9mIHRoZSBsYXN0IHJlcG9ydAorcmVwb3J0ZXJfbGFzdF9yZXBvcnQ9TGV0enRlclwgQmVyaWNodFw6XCB7MH0KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEB7MH0gRGF0ZS9UaW1lIG9mIG5leHQgcmVwb3J0CisjIEBjb21tZW50IEluZGljYXRpb24gb2Ygd2hlbiB0aGUgbmV4dCByZXBvcnQgd2lsbCBiZSBnZW5lcmF0ZWQKK3JlcG9ydGVyX25leHRfcmVwb3J0PU5cdTAwRTRjaHN0ZXJcIEJlcmljaHRcOlwgezB9CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBJbmRpY2F0aW9uIG9mIHRoZSBvdXRwdXQgZGlyZWN0b3J5IGludG8gd2hpY2ggdGhlIHJlcG9ydHMgYXJlIHBsYWNlZAorcmVwb3J0ZXJfb3V0cHV0X2RpcmVjdG9yeT1BdXNnYWJldmVyemVpY2huaXNcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgQW4gaW5kaWNhdGlvbiBvZiB0aGUgbmFtZSBvZiB0aGUgb3V0cHV0IGZpbGUgZm9yIGEgcGFydGljdWxhciBvdXRwdXQgZm9ybWF0CityZXBvcnRlcl9vdXRwdXRfZmlsZT1EYXRlaW5hbWVcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgUGFuZWwgdGl0bGUgZm9yIHNldHRpbmcgaW50ZXJ2YWwgb2YgcmVwb3J0aW5nCityZXBvcnRlcl9wYW5lbF9pbnRlcnZhbD1CZXJpY2h0c2ludGVydmFsbAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgUGFuZWwgdGl0bGUgZm9yIGNvbmZpZ3VyYWJsZSBvcHRpb25zIG9mIHRoZSByZXBvcnRpbmcKK3JlcG9ydGVyX3BhbmVsX29wdGlvbnM9QmVyaWNodHNvcHRpb25lbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgU3VicGFuZWwgdGl0bGUgZm9yIGNob29zaW5nIG91dHB1dCBmb3JtYXRzIGZvciB0aGUgcmVwb3J0cworcmVwb3J0ZXJfcGFuZWxfb3V0cHV0X2Zvcm1hdD1BdXNnYWJlZm9ybWF0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBQYW5lbCB0aXRsZSBmb3IgaW5kaWNhdGlvbiBvZiBydW5uaW5nIHN0YXR1cyBvZiB0aGUgcmVwb3J0ZXIKK3JlcG9ydGVyX3BhbmVsX3N0YXR1cz1TdGF0dXMKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTA2IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgU2hvcnQgdGl0bGUgZm9yIHNlbGVjdGluZyBhIGNvZGUgc2NhbiBjb25maWd1cmF0aW9uIGZpbGUKK3JlcG9ydGVyX3BlcmZvcm1fc2Nhbj1Db2RlXCBTY2FuXCBEYXRlaQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgUXVpY2sgaW5kaWNhdGlvbiB0aGF0IHRoZSByZXBvcnRlciBpcyBhY3RpdmUgKHBlcmhhcHMgd2FpdGluZykKK3JlcG9ydGVyX3N0YXR1c19ydW5uaW5nPUdlc3RhcnRldAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDEtMDYtMjkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgUXVpY2sgc3RhdHVzIGluZGljYXRpb24gdGhhdCB0aGUgcmVwb3J0ZXIgaXMgbm90IGFjdGl2ZQorcmVwb3J0ZXJfc3RhdHVzX3N0b3BwZWQ9R2VzdG9wcHQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IGRheXMgb3B0aW9uCityZXBvcnRlcl90aW1lX2RheXM9VGFnZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgZXZlcnkgZGF5IG9wdGlvbgorcmVwb3J0ZXJfdGltZV9ldmVyeWRheT1KZWRlblwgVGFnCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBmcmlkYXkgb3B0aW9uCityZXBvcnRlcl90aW1lX2ZyaWRheT1GcmVpdGFnCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBob3VycyBvcHRpb24KK3JlcG9ydGVyX3RpbWVfaG91cnM9U3R1bmRlbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgbWludXRlcyBvcHRpb24KK3JlcG9ydGVyX3RpbWVfbWludXRlcz1NaW51dGVuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBtb25kYXkgb3B0aW9uCityZXBvcnRlcl90aW1lX21vbmRheT1Nb250YWcKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IHNhdHVyZGF5IG9wdGlvbgorcmVwb3J0ZXJfdGltZV9zYXR1cmRheT1Tb25uYWJlbmQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IHN1bmRheSBvcHRpb24KK3JlcG9ydGVyX3RpbWVfc3VuZGF5PVNvbm50YWcKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IHRodXJzZGF5IG9wdGlvbgorcmVwb3J0ZXJfdGltZV90aHVyc2RheT1Eb25uZXJzdGFnCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCB0dWVzZGF5IG9wdGlvbgorcmVwb3J0ZXJfdGltZV90dWVzZGF5PURpZW5zdGFnCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCB3ZWRuZXNkYXkgb3B0aW9uCityZXBvcnRlcl90aW1lX3dlZG5lc2RheT1NaXR0d29jaAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDAtMTEtMTcgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkCisjIEBjb21tZW50IFRpdGxlIG9mIHRoZSBhcHBsaWNhdGlvbgorcmVzb3VyY2VfYnVuZGxlX3JlcG9ydGVyPVJCUmVwb3J0ZXIKKworIworIyBAZ3JvdXAgU2VhcmNoIGFuZCBSZXBsYWNlCisjCisjIEBncm91cENvbW1lbnQgUmVzb3VyY2VzIGZvdW5kIG9uIHRoZSBzZWFyY2ggdGFiIHBhbmUKKworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDYgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBHZW5lcmFsIHNlYXJjaCB0aXRsZQorc2VhcmNoPVN1Y2hlCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wNyBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IENoZWNrIGJveCBvcHRpb24gZm9yIG1ha2luZyB0aGUgc2VhcmNoIGNhc2Ugc2Vuc2l0aXZlIG9yIG5vdAorc2VhcmNoX2Nhc2Vfc2Vuc2l0aXZlPUdyb1x1MDBERi0vS2xlaW5zY2hyZWlidW5nXCBiZWFjaHRlbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDYgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBDaGVjayBib3ggb3B0aW9uIGZvciBzZWFyY2hpbmcgdGhyb3VnaCByZXNvdXJjZSBjb21tZW50cworc2VhcmNoX2NvbW1lbnRzPUtvbW1lbnRhcmUKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTA2IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgVGV4dCBpbmRpY2F0aW9uIG9mIHRoZSBmaWVsZCBmb3IgZW50ZXJpbmcgdGV4dCB0byBzZWFyY2ggb24KK3NlYXJjaF9maW5kPVN1Y2hlblw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wNiBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IENoZWNrIGJveCBzZWxlY3Rpb24gZm9yIHNlYXJjaGluZyBvcHRpb24gdGhyb3VnaCByZXNvdXJjZSBrZXlzCitzZWFyY2hfa2V5cz1TY2hsXHUwMEZDc3NlbAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDYgQG1vZGlmaWVkIDIwMDEtMDItMDkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUZXh0IGluZGljYXRpb24gb2YgdGhlIGZpZWxkIGZvciBlbnRlcmluZyB0ZXh0IGZvciByZXBsYWNpbmcgdGhlIGZvdW5kIHZhbHVlCitzZWFyY2hfcmVwbGFjZT1FcnNldHplblw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wNiBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IENoZWNrIGJveCBvcHRpb24gZm9yIHNlYXJjaGluZyB0aHJvdWdoIHRyYW5zbGF0aW9uIHZhbHVlcworc2VhcmNoX3ZhbHVlcz1cdTAwRENiZXJzZXR6dW5nZW4KKworIworIyBAZ3JvdXAgVGFicworIworIyBAZ3JvdXBDb21tZW50IEdVSSBUYWJzIGluIHRoZSBtYWluIHBhbmVsCisKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0xMi0xNyBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IEdVSSBUYWIgZm9yIFRhYmJlZCBQYW5lIG92ZXIgdGhlIHRyZWUgc2hvd2luZyBhIHNpbmdsZSByZXNvdXJjZSBidW5kbGUgYW5kIGl0cyB2YXJpb3VzIGZpbGVzCit0YWJfYnVuZGxlPUJ1bmRsZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IFRhYiBmb3IgdGhlIGRpc3BsYXkgb2YgdGhlIHZhcmlvdXMgZ3JvdXBzIGluIHRoZSBidW5kbGUKK3RhYl9ncm91cHM9R3J1cHBlbgorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTEyLTE3IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgR1VJIFRhYiBmb3IgdGFiIG92ZXIgdHJlZSBzaG93aW5nIGEgcmVzb3VyY2UgYnVuZGxlIHByb2plY3QKK3RhYl9wcm9qZWN0PVByb2plY3QKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTA2IEBtb2RpZmllZCAyMDAxLTAyLTA5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgVGl0bGUgZm9yIHBhbmUgYWxsb3dpbmcgZm9yIHNlYXJjaCBhbmQgcmVwbGFjZSBmdW5jdGlvbnMKK3RhYl9zZWFyY2g9U3VjaGUKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCBUYWIgZm9yIHN0YXRpc3RpY3MgZGlzcGxheSBmb3IgZWl0aGVyIHRoZSBSZXNvdXJjZSBCdW5kbGUgYXMgYSB3aG9sZSBvciBwYXJ0aWN1bGFyIGxhbmd1YWdlIGZpbGVzCit0YWJfc3RhdGlzdGljcz1TdGF0aXN0aWsKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCBUYWIgZm9yIGRpc3BsYXkgb2YgdW50cmFuc2xhdGVkIGl0ZW1zIGluIHRoZSBkaWZmZXJlbnQgbGFuZ3VhZ2UgZmlsZXMKK3RhYl91bnRyYW5zbGF0ZWQ9TmljaHRcIFx1MDBGQ2JlcnNldHp0CisKKyMKKyMgQGdyb3VwIFRyYW5zbGF0aW9uIEZpbGUgR3JvdXBzIFBhbmUKKyMKKyMgQGdyb3VwQ29tbWVudCAKKworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IENvbHVtbiB0aXRsZSBmb3IgaXRlbSBjb21tZW50cworbGFuZ3VhZ2Vncm91cF9jb2x1bW5fY29tbWVudD1Lb21tZW50YXIKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCBDb2x1bW4gdGl0bGUgZm9yIGl0ZW0ncyByZXNvdXJjZSBrZXkKK2xhbmd1YWdlZ3JvdXBfY29sdW1uX2tleT1SZXNvdXJjZS1TY2hsXHUwMEZDc3NlbAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IAorbGFuZ3VhZ2Vncm91cF9jb2x1bW5fdHJhbnNsYXRpb249XHUwMERDYmVyc2V0enVuZworCisjCisjIEBncm91cCBUcmFuc2xhdGlvbiBGaWxlIFN0YXRpc3RpY3MgUGFuZQorIworIyBAZ3JvdXBDb21tZW50IFRyYW5zbGF0aW9ucyBmb3Igc3RyaW5ncyBpbiB0aGUgbGFuZ3VhZ2UgZmlsZSBzdGF0aXN0aWNzIHBhbmUKKworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IEEgY29tbWVudCBnaXZlbiB0byB0aGUgZmlsZQorbGFuZ3VhZ2VzdGF0c19jb21tZW50PUtvbW1lbnRhclw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgVGhlIGNvdW50cnkgYmVpbmcgZGVzY3JpYmVkIGJ5IHRoZSBmaWxlCitsYW5ndWFnZXN0YXRzX2NvdW50cnk9TGFuZFw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgVGhlIG51bWJlciBvZiByZXNvdXJjZXMgaW4gdGhlIGZpbGUKK2xhbmd1YWdlc3RhdHNfaXRlbV9jb3VudD1BbnphaGxcIFJlc291cmNlblwgaW5cIGRlclwgUmVzb3VyY2VuZGF0ZWlcIGZcdTAwRkNyXCBkaWVzZVwgU3ByYWNoZVw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgVGhlIGxhbmd1YWdlIGRlc2NyaWJlZCBieSB0aGUgZmlsZQorbGFuZ3VhZ2VzdGF0c19sYW5ndWFnZT1TcHJhY2hlXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCBUaGUgbmFtZSBvZiBhIHBlcnNvbiByZXNwb25zaWJsZSBmb3IgdGhlIHRyYW5zbGF0aW9ucyBpbiB0aGlzIGxhbmd1YWdlIGZpbGUKK2xhbmd1YWdlc3RhdHNfbWFuYWdlcj1SZXNvdXJjZW5tYW5hZ2VyXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBNYXJ0aW4gR2VybGFjaAorIyBAY29tbWVudCBUaGUgbmFtZSBnaXZlbiB0byB0aGUgbGFuZ3VhZ2UgZmlsZQorbGFuZ3VhZ2VzdGF0c190aXRsZT1UaXRlbFw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgTnVtYmVyIG9mIHJlc291cmNlcyBuZWVkaW5nIHRyYW5zbGF0aW9uIGluIHRoZSBmaWxlCitsYW5ndWFnZXN0YXRzX3RyYW5zbGF0aW9uX2NvdW50PUFuemFobFwgbmljaHRcIFx1MDBGQ2JlcnNldHp0ZXJcIFJlc291cmNlblwgaW5cIGRpZXNlclwgRGF0ZWlcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IFRoZSBsYW5ndWFnZS9yZWdpb24gdmFyaWFudCBkZXNjcmliZWQgYnkgdGhlIGZpbGUKK2xhbmd1YWdlc3RhdHNfdmFyaWFudD1WYXJpYW50ZVw6CisKKyMKKyMgQGdyb3VwIFRyYW5zbGF0aW9uIEZpbGUgVW50cmFuc2xhdGVkIEl0ZW1zIFBhbmUKKyMKKyMgQGdyb3VwQ29tbWVudCAKKworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IFRoZSBjb2x1bW4gdGl0bGUgZm9yIGdyb3VwIG5hbWVzIG9mIGl0ZW1zIGluIHRoZSByb3dzCitsYW5ndWFnZXVudHJhbnNfY29sdW1uX2dyb3VwPUdydXBwZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIE1hcnRpbiBHZXJsYWNoCisjIEBjb21tZW50IFRoZSBrZXkgb2YgdGhlIGl0ZW0gYSByb3cKK2xhbmd1YWdldW50cmFuc19jb2x1bW5fa2V5PVJlc291cmNlLVNjaGxcdTAwRkNzc2VsCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgTWFydGluIEdlcmxhY2gKKyMgQGNvbW1lbnQgVGhlIHRyYW5zbGF0ZWQgdmFsdWUgb2YgYW4gaXRlbSBpbiBhIHJvdworbGFuZ3VhZ2V1bnRyYW5zX2NvbHVtbl90cmFuc2xhdGlvbj1cdTAwRENiZXJzZXR6dW5nCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yMyBAbW9kaWZpZWQgMjAwMS0wMi0wOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFBhbmVsIHRpdGxlIGNvdmVyaW5nIGJ1dHRvbnMgdGhhdCBhcHBseSB0byBhIHNlbGVjdGVkIHJlc291cmNlIGZyb20gYSB0YWJsZSBvZiByZXNvdXJjZXMKK2xhbmd1YWdldW50cmFuc19zZWxlY3RlZF9yZXNvdXJjZXNfb3B0aW9ucz1PcHRpb25lblwgZlx1MDBGQ3JcIGRpZVwgYXVzZ2V3XHUwMEU0aGx0ZW5cIFJlc291cmNlbgpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL3Jlc291cmNlcy9SQk1hbmFnZXJfZmkucHJvcGVydGllcyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9yZXNvdXJjZXMvUkJNYW5hZ2VyX2ZpLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFmMzQ0NQotLS0gL2Rldi9udWxsCisrKyBiL3VuaWNvZGV0b29scy9jb20vaWJtL3JibS9yZXNvdXJjZXMvUkJNYW5hZ2VyX2ZpLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxMjE2IEBACisjIEBmaWxlICAgICAgICAgIFJCTWFuYWdlcgorIyBAZmlsZUVuY29kaW5nICBmaQorIyBAZmlsZUxhbmd1YWdlICBGaW5uaXNoCisjIEBmaWxlQ291bnRyeSAgIAorIyBAZmlsZVZhcmlhbnQgICAKKyMgQGZpbGVNYW5hZ2VyICAgSnVzc2kgTXlsbHlt5GtpCisjIEBmaWxlQ29tbWVudCAgIFRoaXMgaXMgdGhlIEZpbm5pc2ggdHJhbnNsYXRpb24gb2YgdGhlIFJCTWFuYWdlciBHVUkuCisKKworIworIyBAZ3JvdXAgQmFzZSBDbGFzcyBHcm91cHMgUGFuZQorIworIyBAZ3JvdXBDb21tZW50IFRyYW5zbGF0aW9uIEl0ZW1zIGZvciB0aGUgQmFzZSBDbGFzcyBHcm91cCB0YWJiZWQgcGFuZQorCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wNi0yNyBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCAKK2Jhc2Vncm91cF9ncm91cF9jb21tZW50PVJlc3Vyc3NpcnlobVx1MDBFNG5cIGtvbW1lbnR0aQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCAKK2Jhc2Vncm91cF9ncm91cF9uYW1lPVJlc3Vyc3NpcnlobVx1MDBFNG5cIG5pbWlcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCAKK2Jhc2Vncm91cF9ncm91cF9vcHRpb25zPVJlc3Vyc3NpcnlobVx1MDBFNG5cIHRvaW1pbm5vdAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCAKK2Jhc2Vncm91cF9pdGVtX29wdGlvbnM9UmVzdXJzc2luXCB0b2ltaW5ub3QKKworIworIyBAZ3JvdXAgQmFzZSBDbGFzcyBTdGF0aXN0aWNzIFBhbmUKKyMKKyMgQGdyb3VwQ29tbWVudCBBbGwgdHJhbnNsYXRpb25zIGZvciBzdHJpbmdzIGFwcGVhcmluZyBvbiB0aGUgc3RhdGlzdGljcyBwYW5lIGZvciB0aGUgYmFzZSBjbGFzcworCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IAorYmFzZXN0YXRzX2R1cGxpY2F0ZXNfY291bnQ9UmVzdXJzc2luXCBrb3Bpb2lkZW5cIG1cdTAwRTRcdTAwRTRyXHUwMEU0XDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgCitiYXNlc3RhdHNfZmlsZV9jb3VudD1SZXN1cnNzaXRpZWRvc3RvamVuXCBtXHUwMEU0XHUwMEU0clx1MDBFNFw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IAorYmFzZXN0YXRzX2dyb3VwX2NvdW50PVJlc3Vyc3NpcnlobWllblwgbVx1MDBFNFx1MDBFNHJcdTAwRTRcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCAKK2Jhc2VzdGF0c19ncm91cF9ncm91cD1SZXN1cnNzaXJ5aG1cdTAwRTR0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IAorYmFzZXN0YXRzX2l0ZW1fY291bnQ9UmVzdXJzc2llblwgbVx1MDBFNFx1MDBFNHJcdTAwRTRcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCAKK2Jhc2VzdGF0c19pdGVtX2dyb3VwPVJlc3Vyc3NpdAorCisjCisjIEBncm91cCBCYXNlIENsYXNzIFVudHJhbnNsYXRlZCBJdGVtcyBQYW5lCisjCisjIEBncm91cENvbW1lbnQgVHJhbnNsYXRpb25zIGFwcGVhcmluZyBvbiB0aGUgQmFzZSBDbGFzcyBVbnRyYW5zbGF0ZWQgSXRlbXMgcGFuZQorCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IEluZGljYXRpb24gb2YgdGhlIGZpbGUgYmVpbmcgdmlld2VkCitiYXNldW50cmFuc19maWxlPVRpZWRvc3RvXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgSW5kaWNhdGlvbiBvZiB0aGUgbnVtYmVyIG9mIHJlc291cmNlIGl0ZW1zIG5vdCB0cmFuc2xhdGVkIGluIHRoZSBmaWxlCitiYXNldW50cmFuc191bnRyYW5zX2NvdW50PUtcdTAwRTRcdTAwRTRudFx1MDBFNG1cdTAwRTR0dFx1MDBGNm1pZW5cIHJlc3Vyc3NpZW5cIG1cdTAwRTRcdTAwRTRyXHUwMEU0XDoKKworIworIyBAZ3JvdXAgQnV0dG9uIE5hbWVzCisjCisjIEBncm91cENvbW1lbnQgVGhlIG5hbWVzIGRpc3BsYXllZCBvbiB0aGUgdmFyaW91cyBidXR0b25zCisKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgCitiYXNlc3RhdHNfZmlsZV9ncm91cD1SZXN1cnNzaXRpZWRvc3RvdAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgQnV0dG9uIGZvciBjcmVhdGluZyBhIG5ldyByZXNvdXJjZSBsYW5ndWFnZSBmaWxlCitidXR0b25fYWRkX2ZpbGU9TGlzXHUwMEU0XHUwMEU0XCB1dXNpXCByZXN1cnNzaXRpZWRvc3RvCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorYnV0dG9uX2FkZF9maWxlX3RyaWdnZXI9dAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCBCdXR0b24gZm9yIGNyZWF0aW5nIGEgbmV3IHJlc291cmNlIGdyb3VwCitidXR0b25fYWRkX2dyb3VwPUxpc1x1MDBFNFx1MDBFNFwgdXVzaVwgcmVzdXJzc2lyeWhtXHUwMEU0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorYnV0dG9uX2FkZF9ncm91cF90cmlnZ2VyPXkKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgQnV0dG9uIGZvciBjcmVhdGluZyBhIG5ldyByZXNvdXJjZSB0cmFuc2xhdGlvbiBpdGVtCitidXR0b25fYWRkX3Jlc291cmNlPUxpc1x1MDBFNFx1MDBFNFwgdXVzaVwgcmVzdXJzc2kKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCitidXR0b25fYWRkX3Jlc291cmNlX3RyaWdnZXI9cgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgYSBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IEdlbmVyaWMgYnV0dG9uIGZvciBjYW5jZWxpbmcgYWN0aW9ucworYnV0dG9uX2NhbmNlbD1QZXJ1dXRhCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEdlbmVyaWMgYnV0dG9uIGZvciBhIGNob2ljZSBvciBzZWxlY3Rpb24gb3B0aW9uCitidXR0b25fY2hvb3NlPVZhbGl0c2UKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCitidXR0b25fY2hvb3NlX3RyaWdnZXI9dgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCBCdXR0b24gZm9yIGdlbmVyaWMgY3JlYXRpb24gb2YgZ3JvdXBzLCBpdGVtcywgZmlsZXMsIGV0Yy4KK2J1dHRvbl9jcmVhdGU9TGlzXHUwMEU0XHUwMEU0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBhIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgRm9yIGNyZWF0aW9uIG9mIGEgcmVzb3VyY2UgZ3JvdXAKK2J1dHRvbl9jcmVhdGVfZ3JvdXA9THVvXCB1dXNpXCByeWhtXHUwMEU0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorYnV0dG9uX2NyZWF0ZV9ncm91cF90cmlnZ2VyPXIKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgQnV0dG9uIHRpdGxlIGZvciBjcmVhdGluZyBhbiBpdGVtIHRoZW4gY29udGludWluZyBjcmVhdGluZyBtb3JlIGl0ZW1zCitidXR0b25fY3JlYXRlX21vcmU9THVvXCAmXCBKYXRrYQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK2J1dHRvbl9jcmVhdGVfbW9yZV90cmlnZ2VyPWwKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIGEgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCBCdXR0b24gZm9yIGNyZWF0aW5nIGEgcmVzb3VyY2UgdHJhbnNsYXRpb24gaXRlbQorYnV0dG9uX2NyZWF0ZV9yZXNvdXJjZT1MdW9cIHV1c2lcIHJlc3Vyc3NpCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorYnV0dG9uX2NyZWF0ZV9yZXNvdXJjZV90cmlnZ2VyPXIKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCitidXR0b25fY3JlYXRlX3RyaWdnZXI9bAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgYSBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IEJ1dHRvbiBmb3IgcmVtb3ZpbmcgYSBncm91cCBhbmQgaXRzIGNvbnRlbnRzCitidXR0b25fZGVsZXRlX2dyb3VwPVBvaXN0YVwgcmVzdXJzc2lyeWhtXHUwMEU0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBhIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgQnV0dG9uIGZvciBwZXJtYW5lbnRseSByZW1vdmluZyBhIHJlc291cmNlIGZyb20gdGhlIGJ1bmRsZQorYnV0dG9uX2RlbGV0ZV9yZXNvdXJjZT1Qb2lzdGFcIHJlc3Vyc3NpCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorYnV0dG9uX2RlbGV0ZV9yZXNvdXJjZV90cmlnZ2VyPXAKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgR2VuZXJpYyBlZGl0IGJ1dHRvbgorYnV0dG9uX2VkaXQ9TXV1dGEKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIGEgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCBCdXR0b24gZm9yIGVkaXRpbmcgZ3JvdXAgbmFtZSBhbmQgY29tbWVudAorYnV0dG9uX2VkaXRfZ3JvdXA9TXV1dGFcIHJlc3Vyc3NpcnlobVx1MDBFNFx1MDBFNAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgYSBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IEJ1dHRvbiBmb3IgZWRpdGluZyByZXNvdXJjZSBpbmZvcm1hdGlvbiwgaW5jbHVkaW5nIGtleSBhbmQgdHJhbnNsYXRpb24KK2J1dHRvbl9lZGl0X3Jlc291cmNlPU11dXRhXCByZXN1cnNzaWEKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCitidXR0b25fZWRpdF9yZXNvdXJjZV90cmlnZ2VyPW0KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgQnV0dG9uIHRpdGxlIGZvciBpbml0aWF0aW5nIGFuIGltcG9ydCBvZiByZXNvdXJjZXMgZnJvbSBhbiBhbHRlcm5hdGUgc291cmNlCitidXR0b25faW1wb3J0PUhhZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK2J1dHRvbl9pbXBvcnRfdHJpZ2dlcj1oCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEJ1dHRvbiBhbGxvd3MgYSBzZWxlY3RlZCByZXNvdXJjZSB0byBiZSBtYXJrZWQgYXMgdHJhbnNsYXRlZCB3aXRob3V0IGZ1cnRoZXIgZWRpdGluZworYnV0dG9uX21hcmtfdHJhbnNsYXRlZD1NZXJraXRzZVwgUmVzdXJzc2lcIEtcdTAwRTRcdTAwRTRubmV0eWtzaQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK2J1dHRvbl9tYXJrX3RyYW5zbGF0ZWRfdHJpZ2dlcj1tCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBKdXNzaSBNeWxseW1ha2kKKyMgQGNvbW1lbnQgQnV0dG9uIGZvciBhZGRpbmcgdGhlIGN1cnJlbnQgcmVzb3VyY2UgYnVuZGxlIGluIHRoZSBtYWluIGFwcGxpY2F0aW9uIHRvIHRoZSBwcm9qZWN0CitidXR0b25fcHJvamVjdF9hZGQ9TGlzXHUwMEU0XHUwMEU0XCBUXHUwMEU0bVx1MDBFNFwgUmVzdXJzc2lrb2tvZWxtYQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMTEtMjAgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgSnVzc2kgTXlsbHltYWtpCisjIEBjb21tZW50IAorYnV0dG9uX3Byb2plY3RfYWRkX3RyaWdnZXI9bAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMTEtMjAgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgSnVzc2kgTXlsbHltYWtpCisjIEBjb21tZW50IEJ1dHRvbiBmb3IgY2xvc2luZyB0aGUgcHJvamVjdCB3aW5kb3cKK2J1dHRvbl9wcm9qZWN0X2Nsb3NlPVN1bGplXCBQcm9qZWt0aQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMTEtMjAgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgSnVzc2kgTXlsbHltYWtpCisjIEBjb21tZW50IAorYnV0dG9uX3Byb2plY3RfY2xvc2VfdHJpZ2dlcj1zCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBKdXNzaSBNeWxseW1ha2kKKyMgQGNvbW1lbnQgQnV0dG9uIGZvciBjcmVhdGluZyBhIG5ldyByZXNvdXJjZSBidW5kbGUgcHJvamVjdAorYnV0dG9uX3Byb2plY3RfbmV3PVV1c2lcIFByb2pla3RpCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBKdXNzaSBNeWxseW1ha2kKKyMgQGNvbW1lbnQgCitidXR0b25fcHJvamVjdF9uZXdfdHJpZ2dlcj11CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBKdXNzaSBNeWxseW1ha2kKKyMgQGNvbW1lbnQgQnV0dG9uIGZvciBvcGVuaW5nIGEgcHJvamVjdCBmaWxlCitidXR0b25fcHJvamVjdF9vcGVuPUF2YWFcIFByb2pla3RpCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBKdXNzaSBNeWxseW1ha2kKKyMgQGNvbW1lbnQgCitidXR0b25fcHJvamVjdF9vcGVuX3RyaWdnZXI9YQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMTEtMjAgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgSnVzc2kgTXlsbHltYWtpCisjIEBjb21tZW50IEJ1dHRvbiBmb3IgcmVtb3ZpbmcgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCByZXNvdXJjZSBidW5kbGUgZnJvbSB0aGUgcHJvamVjdAorYnV0dG9uX3Byb2plY3RfcmVtb3ZlPVBvaXN0YVwgVmFsaXR0dQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMTEtMjAgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgSnVzc2kgTXlsbHltYWtpCisjIEBjb21tZW50IAorYnV0dG9uX3Byb2plY3RfcmVtb3ZlX3RyaWdnZXI9cAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMTEtMjAgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgSnVzc2kgTXlsbHltYWtpCisjIEBjb21tZW50IEJ1dHRvbiBmb3IgY2F1c2luZyB0aGUgc2VsZWN0ZWQgcmVzb3VyY2UgYnVuZGxlIHRvIGJlIHRoZSBvbmUgYmVpbmcgZWRpdGVkIGluIHRoZSBtYWluIGFwcGxpY2F0aW9uCitidXR0b25fcHJvamVjdF9zZWxlY3Q9TXV1dGFcIFZhbGl0dHVhCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBKdXNzaSBNeWxseW1ha2kKKyMgQGNvbW1lbnQgCitidXR0b25fcHJvamVjdF9zZWxlY3RfdHJpZ2dlcj1tCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFRpdGxlIGZvciBwZXJmb3JtaW5nIGEgY29tcGxldGUgc2VhcmNoCitidXR0b25fc2VhcmNoX2ZpbmRfYWxsPUV0c2lcIEthaWtraQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK2J1dHRvbl9zZWFyY2hfZmluZF9hbGxfdHJpZ2dlcj1lCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFRpdGxlIGZvciBwZXJmb3JtaW5nIGNvbXBsZXRlIHNlYXJjaCBhbmQgcmVwbGFjZQorYnV0dG9uX3NlYXJjaF9yZXBsYWNlX2FsbD1NdXV0YVwgS2Fpa2tpCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorYnV0dG9uX3NlYXJjaF9yZXBsYWNlX2FsbF90cmlnZ2VyPW0KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgR2VuZXJpYyBidXR0b24gZm9yIHVwZGF0aW5nIGluZm9ybWF0aW9uCitidXR0b25fdXBkYXRlPVBcdTAwRTRpdml0XHUwMEU0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorYnV0dG9uX3VwZGF0ZV90cmlnZ2VyPXAKKworIworIyBAZ3JvdXAgRGlhbG9ncworIworIyBAZ3JvdXBDb21tZW50IFRyYW5zbGF0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIGFwcGxpY2F0aW9ucyB2YXJpb3VzIGRpYWxvZyBib3hlcworCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IAorZGFpbG9nX3RpdGxlX3ByZWZlcmVuY2VzPUFzZXR1a3NldAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCBJbmRpY2F0aW9uIG9mIHdldGhlciBvciBub3QgYSBuZXcgZmlsZSB3aWxsIGJlIHBvcHVsYXRlZCBmcm9tIHRoZSBlbGVtZW50cyBpbiB0aGUgYmFzZSBjbGFzcworZGlhbG9nX2NoZWNrYm94X2NvcHlfZWxlbWVudHM9S29waW9pXCByZXN1cnNzaXRcIHBlcnVzdGllZG9zdG9zdGFcIHRcdTAwRTRoXHUwMEU0blwgdGllZG9zdG9vbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCBJbmRpY2F0b3Igb2Ygd2V0aGVyIGFuIGl0ZW0gaXMgdHJhbnNsYXRlZCBvciBub3QKK2RpYWxvZ19jaGVja2JveF90cmFuc2xhdGVkPUtcdTAwRTRcdTAwRTRubmV0dHkKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgCitkaWFsb2dfY29tbWVudD1Lb21tZW50dGlcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCAKK2RpYWxvZ19jb3VudHJ5PU1hYQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCAKK2RpYWxvZ19jcmVhdGVkPUx1b3R1XDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgCitkaWFsb2dfY3JlYXRvcj1MdW9udXRcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAezF9IFRoZSBkYXRlCisjIEB7MH0gVGhlIG5hbWUgb2YgdGhlIHBlcnNvbiBpbnZvbHZlZAorIyBAY29tbWVudCBUaGUgZGF0ZSBhbmQgcGVyc29uIGFzc29jaWF0ZWQgd2l0aCBhIGNyZWF0aW9uIG9yIG1vZGlmaWNhdGlvbiBvZiBhbiBpdGVtCitkaWFsb2dfZGF0ZV9wZXJzb249ezF9XCAoezB9KQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCAKK2RpYWxvZ19kZWZhdWx0X2NvbW1lbnQ9S29tbWVudGluXCBvbGV0dXNhcnZvXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgCitkaWFsb2dfZGVmYXVsdF90cmFuc2xhdGlvbj1LXHUwMEU0XHUwMEU0bm5cdTAwRjZrc2VuXCBvbGV0dXNhcnZvXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgCitkaWFsb2dfZGVsZXRlX2ZpbGU9UG9pc3RhXCByZXN1cnNzaXRpZWRvc3RvCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IAorZGlhbG9nX2RlbGV0ZV9ncm91cD1Qb2lzdGFcIHJlc3Vyc3NpcnlobVx1MDBFNAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCAKK2RpYWxvZ19kZWxldGVfaXRlbT1Qb2lzdGFcIHJlc3Vyc3NpCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wNy0wMiBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBKdXNzaSBNeWxseW1ha2kKKyMgQGNvbW1lbnQgV2FybmluZyBkaXNwbGF5ZWQgd2hlbiBhIHVzZXIgYXNrcyBmb3IgYSBkZWxldGlvbiBvZiBhIGZpbGUuIFByb21wdHMgZm9yICdZZXMnIG9yICdObycKK2RpYWxvZ19kZWxldGVfd2FybmluZz1WYXJvaXR1c1whXCBQb2lzdG8tb3BlcmFhdGlvdGFcIGVpXCB2b2lcIHBlcnV1dHRhYS5cbkhhbHVhdGtvXCB2YXJtYXN0aVwgamF0a2FhPworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCAKK2RpYWxvZ19lbmNvZGluZz1FbmNvZGluZ1w6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IAorZGlhbG9nX2ZpbGVfY29tbWVudD1SZXN1cnNzaXRpZWRvc3Rvblwga29tbWVudHRpXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgCitkaWFsb2dfZmlsZV9maWx0ZXJfZGVzY3JpcHRpb249QmFzZVwgQ2xhc3NpblwgcmVzdXJzc2l0aWVkb3N0b3QKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgRGVzY3JpcHRpb24gb2YgRmlsZSBGaWx0ZXIgZm9yIFJCUmVwb3J0ZXIgWE1MIHNjYW4gY29uZmlndXJhdGlvbiBmaWxlcworZGlhbG9nX2ZpbGVfZmlsdGVyX2Rlc2NyaXB0aW9uX3NjYW49WE1MXCBSQlJlcG9ydGVyXCBTY2FuXCBGaWxlcworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCAKK2RpYWxvZ19maWxlX2luZm89VGllZG9zdG9uXCB0aWVkb3QKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgCitkaWFsb2dfZmlsZV9tYW5hZ2VyPVJlc3Vyc3NpbWFuYWdlcmluXCBuaW1pXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgCitkaWFsb2dfZmlsZV90aXRsZT1SZXN1cnNzaXRpZWRvc3Rvblwgb3RzaWtrb1w6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IAorZGlhbG9nX2dyb3VwPVJ5aG1cdTAwRTRuXCBuaW1pXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgCitkaWFsb2dfZ3JvdXBfY29tbWVudD1SeWhtXHUwMEU0blwga29tbWVudHRpXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgCitkaWFsb2dfa2V5PVJlc3Vyc3NpblwgdHVubmlzdGVcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCAKK2RpYWxvZ19sYW5ndWFnZT1LaWVsaQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCAKK2RpYWxvZ19sb29rdXBzPUhha3VcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCAKK2RpYWxvZ19tb2RpZmllZD1NdXV0ZXR0dVwgdmlpbWVrc2lcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCAKK2RpYWxvZ19tb2RpZmllcj1WaWltZWlzaW5cIG11dXR0YWphXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgVGhlIG5hbWUgb2YgYSBsYW5ndWFnZSwgY291bnRyeSwgb3IgdmFyaWFudCBvZiBhIGxhbmd1YWdlIGZpbGUKK2RpYWxvZ19uYW1lPU5pbWlcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCBQcm9tcHRzIHRoZSB1c2VyIHRvIGVudGVyIGEgbmFtZSBmb3IgdGhlIHJlc291cmNlIGJ1bmRsZSwgYmVmb3JlIGNyZWF0aW5nIHRoYXQgYnVuZGxlCitkaWFsb2dfbmV3X2Jhc2VjbGFzcz1PbGVcIGh5dlx1MDBFNFwgamFcIHN5XHUwMEY2dFx1MDBFNFwgQmFzZVwgQ2xhc3NpblwgbmltaVwgdXVkZWxsZVwgcmVzdXJzc2lrb2tvZWxtYWxsZS4KKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMi0xOSBAbW9kaWZpZWQgMjAwMS0xMi0xOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IERpYWxvZyBwb3B1cCB3aW5kb3cgdGV4dCBwcm9tcHRpbmcgdGhlIHVzZXIgZm9yIHRoZSBuYW1lIG9mIGEgcmVzb3VyY2UgYnVuZGxlIHByb2plY3QKK2RpYWxvZ19uZXdfcHJvamVjdD1QbGVhc2VcIGVudGVyXCBhXCB0aXRsZVwgZm9yXCB5b3VyXCBuZXdcIFJlc291cmNlXCBCdW5kbGVcIFByb2plY3QuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IEEgZGVzY3JpcHRpb24gb2YgdGhlIGZpbGVzIG1ha2luZyBpdCB0aHJvdWdoIHRoZSBmaWx0ZXIgdXBvbiBvcGVuaW5nIGEgcmVzb3VyY2UgYnVuZGxlCitkaWFsb2dfb3Blbl9maWxlX2ZpbHRlcj1CYXNlXCBDbGFzc2luXCByZXN1cnNzaXRpZWRvc3RvdAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCBUaGlzIGlzIGEgc2VjdGlvbiBoZWFkaW5nIGZvciBzZXR0aW5nIHRoZSBBbHVlCitkaWFsb2dfcHJlZmVyZW5jZXNfQWx1ZT1BbHVlCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IEFsdWVzIGN1cnJlbnRseSBkZWZpbmVkIGluIHRoZSBwcm9wZXJ0aWVzIGZpbGVzIGZvciB0aGUgYXBwbGljYXRpb24KK2RpYWxvZ19wcmVmZXJlbmNlc19sb2NhbGVfZGVmaW5lZD1NXHUwMEU0XHUwMEU0cml0ZWx0eVwgcmVzdXJzc2l0aWVkb3N0b2lzc2FcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IAorZGlhbG9nX3ByZWZlcmVuY2VzX2xvY2FsZV9pc289SVNPXCBzdGFuZGFyZGl0XDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgTG9jYWxlcyB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgdGhlIGhvc3QgSmF2YSBWaXJ0dWFsIE1hY2hpbmUKK2RpYWxvZ19wcmVmZXJlbmNlc19sb2NhbGVfbWFjaGluZT1UdWV0dHVcIGtvbmV0eXlwcGlcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IAorZGlhbG9nX3ByZWZlcmVuY2VzX2xvY2FsZV93YXJuaW5nPUhVT01cOlwgQWx1ZWVuXCB2YWlodG9cIGFzdHV1XCB2b2ltYWFuXCB2YXN0YVwga3VuXCBzb3ZlbGx1c1wga1x1MDBFNHlubmlzdGV0XHUwMEU0XHUwMEU0blwgdXVkZXN0YWFuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IAorZGlhbG9nX3ByZWZlcmVuY2VzX2xvb2thbmRmZWVsPUxvb2tcIEFuZFwgRmVlbFw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IAorZGlhbG9nX3ByZWZlcmVuY2VzX3VzZXJuYW1lPUtcdTAwRTR5dHRcdTAwRTRqXHUwMEU0dHVubnVzXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTExLTIwIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIEp1c3NpIE15bGx5bWFraQorIyBAY29tbWVudCBEZXNjcmlwdG9yIHRoYXQgZ29lcyBpbnRvIEdVSSBmaWxlIGNob29zZXIKK2RpYWxvZ19wcm9qZWN0X2ZpbGVfZmlsdGVyX2Rlc2NyaXB0aW9uPVJCTWFuYWdlclwgUHJvamVrdGl0aWVkb3N0b3QKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0xMi0xNyBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IEZpbGUgRmlsdGVyIGRlc2NyaXB0aW9uIGZvciByZXNvdXJjZSBidW5kbGUgcHJvamVjdCBmaWxlcworZGlhbG9nX3Byb2plY3RfZmlsdGVyX2Rlc2NyaXB0aW9uPVJlc291cmNlXCBCdW5kbGVcIFByb2plY3RzCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBKdXNzaSBNeWxseW1ha2kKKyMgQGNvbW1lbnQgQW4gaW5kaWNhdGlvbiB0aGF0IG5vIHByb2plY3QgaXMgb3BlbiwgcGxhY2VkIGluIHRoZSB0aXRsZSBvZiB0aGUgZGlhbG9nIHdoZXJlIHRoZSBwcm9qZWN0IG5hbWUgd291bGQgbm9ybWFsbHkgZ28KK2RpYWxvZ19wcm9qZWN0X25vbmVfc2VsZWN0ZWQ9UHJvamVrdGlhXCBFaVwgVmFsaXR0dQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMTEtMjAgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgSnVzc2kgTXlsbHltYWtpCisjIEB7MH0gVGhlIG5hbWUgb2YgdGhlIHByb2plY3QKKyMgQGNvbW1lbnQgVGl0bGUgZm9yIHRoZSB3aW5kb3cgc2hvd2luZyBhbGwgdGhlIHJlc291cmNlIGJ1bmRsZXMgaW4gYSBwcm9qZWN0CitkaWFsb2dfcHJvamVjdF90aXRsZT1Qcm9qZWt0aW5cIFJlc3Vyc3Npa29rb2VsbWF0XDpcIHswfQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCBQcm9tcHRzIHRoZSB1c2VyIGlmIHRoZXkgd291bGQgbGlrZSB0byBzYXZlIGNoYW5nZXMgYmVmb3JlIGV4aXRpbmcKK2RpYWxvZ19xdWl0X3NhdmU9SGFsdWF0a29cIHRhbGxlbnRhYVwgbXV1dG9rc2V0XCBlbm5lblwgcG9pc3R1bWlzdGE/CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0xMCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEEgZ2VuZXJpYyBwcm9wbXB0IHRvIGFzayB0aGUgdXNlciBpZiB0aGV5IHdpc2ggdG8gc2F2ZSBjaGFuZ2VzCitkaWFsb2dfc2F2ZT1IYWx1YXRrb1wgdGFsbGV0dGFhXCBtdXV0b2tzZXRcIHJlc3Vyc3Npa29rb2VsbWFhbj8KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgCitkaWFsb2dfc2VhcmNoX29wdGlvbnM9RXRzaW50XHUwMEU0cGFyYW1ldHJpdAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCAKK2RpYWxvZ19zZWFyY2hfcGFyYW09RXRzaVwgdGVrc3RpXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgVGhlIHRpdGxlIG9mIHRoZSBhYm91dCBkaWFsb2cgYm94CitkaWFsb2dfdGl0bGVfYWJvdXRfcmJtYW5hZ2VyPVRpZXRvamFcIFJlc3Vyc3NpbWFuYWdlcmlzdGEKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgVGl0bGUgZm9yIGRpYWxvZyBwcm9tcHRpbmcgZm9yIGRlbGV0aW9uIG9mIGFuIGVudGlyZSByZXNvdXJjZSBncm91cAorZGlhbG9nX3RpdGxlX2RlbGV0ZV9ncm91cD1Qb2lzdGFcIFJlc3Vyc3NpcnlobVx1MDBFNAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUaXRsZSB3aGVuIHByb21wdGluZyB0byBkZWxldGUgYSByZXNvdXJjZQorZGlhbG9nX3RpdGxlX2RlbGV0ZV9pdGVtPVBvaXN0YVwgUmVzdXJzc2kKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgCitkaWFsb2dfdGl0bGVfZWRpdF9ncm91cD1NdXV0YVwgcmVzdXJzc2lyeWhtXHUwMEU0XHUwMEU0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IAorZGlhbG9nX3RpdGxlX2VkaXRfaXRlbT1NdXV0YVwgcmVzdXJzc2lhCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTItMTkgQG1vZGlmaWVkIDIwMDEtMTItMTkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCAKK2RpYWxvZ190aXRsZV9lcnJvcj1FcnJvcgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCAKK2RpYWxvZ190aXRsZV9lcnJvcl9jcmVhdGluZ19idW5kbGU9VmlyaGVcIHV1dHRhXCByZXN1cnNzaWtva29lbG1hYVwgbHVvdGFlc3NhCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IERpYWxvZyB0aXRsZSB3aGVuIG9wZW5pbmcgYSByZXNvdXJjZSBidW5kbGUgbm90IGNyZWF0ZWQgYnkgUkJNYW5hZ2VyCitkaWFsb2dfdGl0bGVfZXJyb3Jfbm90X3JibWFuYWdlcl9mb3JtYXQ9VmlyaGVcOlwgUmVzdXJzc2l0aWVkb3N0b2FcIGVpXCB2b2lkYVwgbHVrZWEKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTA3LTAyIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIEp1c3NpIE15bGx5bWFraQorIyBAY29tbWVudCBUaXRsZSBvbiBhIHdhcm5pbmcgZGlhbG9nIHRoYXQgSS9PIG1hbGZ1bmN0aW9uZWQgb3BlbmluZyBhIGZpbGUKK2RpYWxvZ190aXRsZV9lcnJvcl9vcGVuaW5nX2ZpbGU9VGllZG9zdG9hXCBFaVwgVm9pZGFcIEF2YXRhCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wNy0wMiBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBKdXNzaSBNeWxseW1ha2kKKyMgQGNvbW1lbnQgRGlhbG9nIHRpdGxlIGZvciBhIGRpYWxvZyBib3ggZm9yIGVudGVyaW5nIHNwZWNpYWwgcGFyYW1ldGVycyBuZWVkZWQgdG8gZXhwb3J0IGEgcmVzb3VyY2UgYnVuZGxlIHRvIGphdmEgY2xhc3MgY29kZQorZGlhbG9nX3RpdGxlX2V4cG9ydF9qYXZhX29wdGlvbnM9VGFsbGV0dXNwYXJhbWV0cml0XDpcIEphdmFcIGx1b2trYQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUaXRsZSBmb3IgYSBkaWFsb2cgd2l0aCBhIHByb2dyZXNzIGJhciBnb3Zlcm5pbmcgaW1wb3J0IHN0YXR1cworZGlhbG9nX3RpdGxlX2ltcG9ydF9wcm9ncmVzcz1IYXVuXCBFZGlzdHltaW5lbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCBUaXRsZSBmb3IgY3JlYXRpbmcgbmV3IGJ1bmRsZQorZGlhbG9nX3RpdGxlX25ld19idW5kbGU9THVvXCB1dXNpXCByZXN1cnNzaWtva29lbG1hCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IFRpdGxlIGZvciBjcmVhdGluZyBhIG5ldyByZXNvdXJjZSBmaWxlCitkaWFsb2dfdGl0bGVfbmV3X2ZpbGU9THVvXCB1dXNpXCByZXN1cnNzaXRpZWRvc3RvCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IFRpdGxlIGZvciBjcmVhdGluZyBhIG5ldyByZXNvdXJjZSBncm91cAorZGlhbG9nX3RpdGxlX25ld19ncm91cD1MdW9cIHV1c2lcIHJlc3Vyc3NpcnlobVx1MDBFNAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCBUaXRsZSBmb3IgY3JlYXRpbmcgcmVzb3VyY2UKK2RpYWxvZ190aXRsZV9uZXdfaXRlbT1MdW9cIHV1c2lcIHJlc3Vyc3NpCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTItMTkgQG1vZGlmaWVkIDIwMDEtMTItMTkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBUaXRsZSBvZiB0aGUgZGlhbG9nIGJveCBzaG93aW5nIHdoZW4gY3JlYXRpbmcgYSBuZXcgcHJvamVjdAorZGlhbG9nX3RpdGxlX25ld19wcm9qZWN0PU5ld1wgUmVzb3VyY2VcIEJ1bmRsZVwgUHJvamVjdAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCAKK2RpYWxvZ190aXRsZV9wcmVmZXJlbmNlcz1Bc2V0dWtzZXQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgVGl0bGUgZm9yIGNvbmZpcm1pbmcgZXhpdCBmcm9tIGFwcGxpY2F0aW9uCitkaWFsb2dfdGl0bGVfcXVpdD1Qb2lzdHVcIFJlc3Vyc3NpbWFuYWdlcmlzdGEKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgCitkaWFsb2dfdGl0bGVfc2VhcmNoPUV0c2kKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgCitkaWFsb2dfdGl0bGVfdXNlcl9uYW1lPVN5XHUwMEY2dFx1MDBFNFwga1x1MDBFNHl0dFx1MDBFNGpcdTAwRTR0dW5udXMKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgCitkaWFsb2dfdHJhbnNsYXRpb249S1x1MDBFNFx1MDBFNG5uXHUwMEY2c1w6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IAorZGlhbG9nX3VzZXJfbmFtZT1TeVx1MDBGNnRcdTAwRTRcIG5pbWVzaS4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgCitkaWFsb2dfdmFyaWFudD1NdXVubmVsbWEKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgCitkaWFsb2dfd2FybmluZ19kZWxldGVfZ3JvdXA9UmVzdXJzc2lyeWhtXHUwMEU0blwgcG9pc3RhbWluZW5cIHBvaXN0YWFcIG15XHUwMEY2c1wga2Fpa2tpXCByeWhtXHUwMEU0c3NcdTAwRTRcIG9sZXZhdFwgcmVzdXJzc2l0XCBweXN5dlx1MDBFNHN0aS5cIEhhbHVhdGtvXCBqYXRrYWE/CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IAorZGlhbG9nX3dhcm5pbmdfZGVsZXRlX2l0ZW09UmVzdXJzc2lcIHBvaXN0ZXRhYW5cIHB5c3l2XHUwMEU0c3RpLlwgSGFsdWF0a29cIGphdGthYT8KKworIworIyBAZ3JvdXAgRXJyb3IgTWVzc2FnZXMKKyMKKyMgQGdyb3VwQ29tbWVudCAKKworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCAKK2Vycm9yPVZpcmhlCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTItMTkgQG1vZGlmaWVkIDIwMDEtMTItMTkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBHZW5lcmFsIGVycm9yIG1lc3NhZ2Ugd2hlbiB0cnlpbmcgdG8gYWRkIGEgcmVzb3VyY2UgYnVuZGxlIHRvIGEgcHJvamVjdC4KK2Vycm9yX2FkZGluZ19wcm9qZWN0X2J1bmRsZT1BblwgZXJyb3JcIG9jY3VycmVkXCB0cnlpbmdcIHRvXCBhZGRcIHRoZVwgUmVzb3VyY2VcIEJ1bmRsZVwgeW91XCBzZWxlY3RlZC4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgCitlcnJvcl9iYXNlY2xhc3Nfd2hpdGVzcGFjZT1SZXN1cnNzaW5cIG5pbWVzc1x1MDBFNFwgZWlcIHZvaVwgb2xsYVwgdlx1MDBFNGxpbHlcdTAwRjZudGlcdTAwRTQuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IAorZXJyb3JfYnVuZGxlX25vdF9jcmVhdGVkPVJlc3Vyc3Npa29rb2VsbWFhXCBlaVwgbHVvdHUuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IAorZXJyb3JfY3JlYXRlX2ZpbGU9UmVzdXJzc2l0aWVkb3N0b25cIGx1b250aVwgZXBcdTAwRTRvbm5pc3R1aS4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgCitlcnJvcl9jcmVhdGVfZ3JvdXA9UmVzdXJzc2lyeWhtXHUwMEU0blwgbHVvbnRpXCBlcFx1MDBFNG9ubmlzdHVpLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCAKK2Vycm9yX2NyZWF0ZV9pdGVtPVJlc3Vyc3NpblwgbHVvbnRpXCBlcFx1MDBFNG9ubmlzdHVpLgorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTEyLTE5IEBtb2RpZmllZCAyMDAxLTEyLTE5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgR2VuZXJhbCBlcnJvciBtZXNzYWdlIHdoZW4gY3JlYXRpbmcgYSBwcm9qZWN0CitlcnJvcl9jcmVhdGluZ19wcm9qZWN0PUFuXCBlcnJvclwgd2FzXCBlbmNvdW50ZXJlZFwgdHJ5aW5nXCB0b1wgY3JlYXRlXCBhXCBSZXNvdXJjZVwgQnVuZGxlXCBQcm9qZWN0LgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDctMDIgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgSnVzc2kgTXlsbHltYWtpCisjIEB7MH0gVGhlIG1lc3NhZ2UgZnJvbSBhbiBJT0V4Y2VwdGlvbiB0aGF0IGlzIHRocm93bgorIyBAY29tbWVudCBFcnJvciBtZXNzYWdlIHdoZW4gdHJ5aW5nIHRvIGRlbGV0ZSBhIGZpbGUKK2Vycm9yX2RlbGV0aW5nPVRpZWRvc3RvYVwgezB9XCBlaVwgdm9pdHVcIHBvaXN0YWEuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wNy0wMiBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBKdXNzaSBNeWxseW1ha2kKKyMgQGNvbW1lbnQgQW4gZXJyb3IgdGhhdCBvY2N1cnMgd2hlbiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gZGVsZXRlIGEgZmlsZSwgYnV0IHRoZSB2aXJ0dWFsIG1hY2hpbmUgY2FuIG5vdCBkbyBzbworZXJyb3JfZGVsZXRpb25fbm90X3Bvc3NpYmxlPVRpZWRvc3RvYVwgZWlcIHZvaXR1XCBwb2lzdGFhLlwgVGllZG9zdG9cIG9uXCBzdW9qYXR0dS4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgR2VuZXJhbCBlcnJvciBtZXNzYWdlIGZvciBleHBvcnRpbmcgcmVzb3VyY2UgYnVuZGxlcworZXJyb3JfZXhwb3J0PVJlc3Vyc3NpdGllZG9zdG9uXCB0YWxsZXR1c1wgZXBcdTAwRTRvbm5pc3R1aQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCAKK2Vycm9yX2ludGVybmFsPVNpc1x1MDBFNGluZW5cIHZpcmhlCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IAorZXJyb3JfbW9kaWZ5X2ZpbGU9UmVzdXJzc2l0aWVkb3N0b25cIG11dXRvc1wgZXBcdTAwRTRvbm5pc3R1aS4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgCitlcnJvcl9tb2RpZnlfZ3JvdXA9UmVzdXJzc2lyeWhtXHUwMEU0blwgbXV1dG9zXCBlcFx1MDBFNG9ubmlzdHVpLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCAKK2Vycm9yX21vZGlmeV9pdGVtPVJlc3Vyc3NpblwgbXV1dG9zXCBlcFx1MDBFNG9ubmlzdHVpLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCAKK2Vycm9yX25vX2J1bmRsZV9mb3JfZmlsZT1BdmFhXCB0YWlcIGx1b1wgdXVzaVwgcmVzdXJzc2lrb2tvZWxtYVwgZW5zaW4sXCBzaXR0ZW5cIHZvaXRcIGx1b2RhXCB1dWRlblwgcmVzdXJzc2l0aWVkb3N0b24uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IAorZXJyb3Jfbm9fYnVuZGxlX2Zvcl9ncm91cD1BdmFhXCB0YWlcIGx1b1wgdXVzaVwgcmVzdXJzc2lrb2tvZWxtYVwgZW5zaW4sXCBzaXR0ZW5cIHZvaXRcIGx1b2RhXCB1dWRlblwgcmVzdXJzc2lyeWhtXHUwMEU0bi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgRXJyb3IgbWVzc2FnZSBkaXNwbGF5ZWQgd2hlbiB0aGUgdXNlciB0cmllcyB0byBjcmVhdGUgYSByZXNvdXJjZSwgd2l0aG91dCBhbiBvcGVuIHJlc291cmNlIGJ1bmRsZQorZXJyb3Jfbm9fYnVuZGxlX2Zvcl9pdGVtPUF2YWFcIHRhaVwgbHVvXCB1dXNpXCByZXN1cnNzaWtva29lbG1hXCBlbnNpbixcIHNpdHRlblwgdm9pdFwgbHVvZGFcIHV1ZGVuXCByZXN1cnNzaW4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorZXJyb3Jfbm9fa2V5X3JlcGxhY2U9S29ydmFhLXRvaW1pdG9cIGVpXCB2YWlrdXRhXCByZXN1cnNzaWF2YWltaWluLlwgTXV1dFwga29ydmF1a3NldFwgdGVoZFx1MDBFNFx1MDBFNG4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgSW5kaWNhdGlvbiB0aGF0IFJCTWFuYWdlciBjYW4gbm90IHJlYWQgdGhlIGZpbGUgYXMgY3JlYXRlZCBieSBSQk1hbmFnZXIKK2Vycm9yX25vdF9yYm1hbmFnZXJfZm9ybWF0PVZhbGl0dHVcIHJlc3Vyc3NpdGllZG9zdG9cIGVpXCBvbGVcIFJCTWFuYWdlcmluXCBsdW9tYVwgdGFpXCB0aWVkb3N0b1wgb25cIHZpb2l0dHVudXQuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wNy0wMiBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBKdXNzaSBNeWxseW1ha2kKKyMgQHswfSBUaGUgbmFtZSBvZiB0aGUgZmlsZSB0aGF0IHdvdWxkIG5vdCBvcGVuCisjIEBjb21tZW50IEVycm9yIG1lc3NhZ2Ugb2NjdXJpbmcgb24gYW4gSS9PIGVycm9yIHRyeWluZyB0byBvcGVuIGEgZmlsZQorZXJyb3Jfb3BlbmluZ19maWxlPVRpZWRvc3RvYVwgezB9XCBlaVwgdm9pdHVcIGF2YXRhCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEVycm9yIG1lc3NhZ2UgZGlzcGxheWVkIHdoZW4gUkJNYW5hZ2VyIGVuY291bnRlcnMgYW4gZXJyb3Igd3JpdGluZyBwcmVmZXJlbmNlcyB0byB0aGUgZmlsZSBzeXN0ZW0KK2Vycm9yX3ByZWZlcmVuY2VzX3NhdmU9QXNldHVzdGVuXCB0YWxsdHVzXCBlcFx1MDBFNG9ubmlzdHVpLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMTAgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAezB9IFRoZSBlcnJvciBtZXNzYWdlIGdlbmVyYXRlZAorIyBAY29tbWVudCBBIG1lc3NhZ2UgcHJlc2VudGVkIHRvIHRoZSB1c2VyIHdoZW4gYW4gZXJyb3Igb2NjdXJzIGluIHNhdmluZyB0aGUgcmVzb3VyY2UgYnVuZGxlCitlcnJvcl9zYXZpbmc9UmVzdXJzc2lrb2tvZWxtYW5cIHRhbGxldHVrc2Vzc2FcIHRhcGFodHVpXCB2aXJoZVw6XCB7MH0KKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMi0xOSBAbW9kaWZpZWQgMjAwMS0xMi0xOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IEdlbmVyYWwgZXJyb3IgbWVzc2FnZSB3aGVuIHNhdmluZyBhIHByb2plY3QKK2Vycm9yX3NhdmluZ19wcm9qZWN0PUFuXCBlcnJvclwgd2FzXCBlbmNvdW50ZXJlZFwgdHJ5aW5nXCB0b1wgc2F2ZVwgdGhlXCBSZXNvdXJjZVwgQnVuZGxlXCBQcm9qZWN0LgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBTdWdnZXN0IHRyeWluZyB0byBpbXBvcnQgdGhlIHJlc291cmNlIGJ1bmRsZSBpbnN0ZWFkIG9mIG9wZW5pbmcgaXQuCitlcnJvcl9zdWdnZXN0X2ltcG9ydF9wcm9wZXJ0aWVzPVlyaXRcdTAwRTRcIHJlc3Vyc3NpdGllZG9zdG9uXCBoYWt1YVwgYXZhdWtzZW5cIHNpamFzdGEKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgCitlcnJvcl90cnlfYWdhaW5fZmlsZT1TeVx1MDBGNnRcdTAwRTRcIHV1ZGV0XCBlbmNvZGluZy1hcnZvdFwgamFcIHlyaXRcdTAwRTRcIHNpdHRlblwgdXVkZXN0YWFuLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCAKK2Vycm9yX3RyeV9hZ2Fpbl9ncm91cD1Zcml0XHUwMEU0XCB1dWRlc3RhYW5cIHRvaXNlbGxhXCByZXN1cnNzaXJ5aG1cdTAwRTRuXCBuaW1lbGxcdTAwRTQuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IAorZXJyb3JfdHJ5X2FnYWluX2l0ZW09WXJpdFx1MDBFNFwgdXVkZXN0YWFuXCB0b2lzZWxsYVwgcmVzdXJzc2luXCBuaW1lbGxcdTAwRTQuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFZhbHVlIGluc2VydGVkIGludG8gdGFibGUgY2VsbHMgd2hlbiBhbiBlcnJvciBoYXMgb2NjdXJlZAordGFibGVfY2VsbF9lcnJvcj0qVmlyaGUqCisKKyMKKyMgQGdyb3VwIEV4cG9ydAorIworIyBAZ3JvdXBDb21tZW50IFJlc291cmNlcyBkZWFsaW5nIHdpdGggZXhwb3J0IG9wdGlvbnMKKworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDctMDIgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgSnVzc2kgTXlsbHltYWtpCisjIEBjb21tZW50IE9wdGlvbiBmb3IgdGhlIHBhcmFtZXRlciBmb3IgY3JlYXRlZCBhIHByb3RlY3RlZCBjbGFzcworZXhwb3J0X2phdmFfY2xhc3NfcHJvdGVjdGVkPUx1b1wgc3VvamF0dHVcIGx1b2trYQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDctMDIgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgSnVzc2kgTXlsbHltYWtpCisjIEBjb21tZW50IE9wdGlvbiBmb3IgcGFyYW1ldGVyIHNldHRpbmcgdGhlIGNyZWF0ZWQgY2xhc3MgYXMgcHVibGljCitleHBvcnRfamF2YV9jbGFzc19wdWJsaWM9THVvXCBqdWxraW5lblwgbHVva2thCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wNy0wMiBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBKdXNzaSBNeWxseW1ha2kKKyMgQGNvbW1lbnQgT3B0aW9uIGZvciBwYXJhbWV0ZXIgZm9yIGNyZWF0aW5nIHByb3RlY3RlZCBtZXRob2RzIGluIHRoZSBqYXZhIGNsYXNzCitleHBvcnRfamF2YV9tZXRob2RzX3Byb3RlY3RlZD1MdW9cIHN1b2phdHR1XCBtZXRvZGkKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTA3LTAyIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIEp1c3NpIE15bGx5bWFraQorIyBAY29tbWVudCBPcHRpb24gZm9yIHBhcmFtZXRlciBmb3IgY3JlYXRpbmcgcHVibGljIG1ldGhvZHMKK2V4cG9ydF9qYXZhX21ldGhvZHNfcHVibGljPUx1b1wganVsa2luZW5cIG1ldG9kaQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDctMDIgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgSnVzc2kgTXlsbHltYWtpCisjIEBjb21tZW50IFRpdGxlIG9mIGEgY2hlY2sgYm94IGZvbGxvd2VkIGJ5IGEgdGV4dCBmaWVsZCBmb3Igc3BlY2lmeWluZyB3aGV0aGVyIG9yIG5vdCB0byB1c2UgYSBwYWNrYWdlIGluIHRoZSBnZW5lcmF0ZWQgamF2YSBjbGFzcyBhbmQgd2hhdCB0aGUgcGFja2FnZSBzaG91bGQgYmUgY2FsbGVkCitleHBvcnRfamF2YV9wYWNrYWdlPUFubmFcIHBha2V0aW5cIG5pbWlcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDctMDIgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgSnVzc2kgTXlsbHltYWtpCisjIEBjb21tZW50IFRleHQgcGxhY2VkIGluIGEgbGFiZWwgYXQgdGhlIHRvcCBvZiB0aGUgZGlhbG9nIGJveCBmb3Igc3BlY2lmeWluZyBwYXJhbWV0ZXJzIGNvbmNlcm5pbmcgdGhlIGV4cG9ydCBvZiByZXNvdXJjZSBidW5kbGVzIGludG8gYSBqYXZhIGNsYXNzCitleHBvcnRfamF2YV90aXRsZT1Bbm5hXCBzZXVyYWF2YXRcIHBhcmFtZXRyaXRcIEphdmEtbHVva2FsbGVcOgorCisjCisjIEBncm91cCBHZW5lcmFsCisjCisjIEBncm91cENvbW1lbnQgU29tZSBpdGVtcyB0aGF0IGFyZSBjb21tb24gYWNjcm9zcyBncm91cHMKKworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCBUaGUgZmlsZSBvciBjbGFzcyBjb21wb3NlZCBvZiB0aGUgZGVmYXVsdCB0cmFuc2xhdGlvbnMgZm9yIHRoZSBidW5kbGUKK2Jhc2VjbGFzcz1CYXNlXCBDbGFzcworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDQtMDYtMjkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEdlb3JnZQorIyBAY29tbWVudCBUaGlzIGlzIHRoZSBsZWdhbCBjb3B5cmlnaHQgbm90aWNlCitjb3B5cmlnaHQ9KEMpXCBDb3B5cmlnaHRcIElCTVwgQ29ycC5cIDIwMDAtMjAwNFwgLVwgS2Fpa2tpXCBvaWtldWRldFwgcGlkXHUwMEU0dGV0dHkKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgR2VybmVyYWwgdXNlIGZvciBmaWxlIGRpcmVjdG9yaWVzCitkaXJlY3Rvcnk9SGFrZW1pc3RvCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IAorZ3JvdXBzPVJ5aG1cdTAwRTR0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IFRoZSBuYW1lIG9mIHRoZSBpbWFnZSBmaWxlIGluIHRoZSAnSW1hZ2VzJyBkaXJlY3RvcnkgdGhhdCByZXByZXNlbnRzIHRoZSBsb2dvIHNlZW4gYXQgdGhlIHRvcCBvZiB0aGUgYXBwbGljYXRpb24KK2xvZ29fZmlsZW5hbWU9VGl0bGVMb2dvX3RyYW5zcGFyZW50LmdpZgorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTEyLTE3IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgVHJlZSBub2RlIHRpdGxlIHdoZW4gdmlld2luZyBhIHJlc291cmNlIGJ1bmRsZSBpbiB0aGUgcHJvamVjdCB2aWV3IHdoZW4gdGhlcmUgaXMgbm8gYWN0aXZlIHByb2plY3QKK25vX3Byb2plY3Q9RGVmYXVsdFwgUHJvamVjdAorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTEyLTE3IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgVHJlZSBub2RlIHRpdGxlIGRlZmF1bHRlZCB0byB3aGVuIG5vIHJlc291cmNlIGJ1bmRsZSBvciBwcm9qZWN0IGhhcyBiZWVuIG9wZW5lZCBieSB0aGUgdXNlcgorbm9fcHJvamVjdF9idW5kbGU9Tm9cIFByb2plY3RcIG9yXCBSZXNvdXJjZVwgQnVuZGxlXCBPcGVuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IFRoZSB0b3AgdHJlZSBub2RlIHRpdGxlLCB3aGVuIG5vIHJlc291cmNlIGJ1bmRsZSBoYXMgYmVlbiBvcGVuZWQgb3IgY3JlYXRlZAorbm9fcmVzb3VyY2VfYnVuZGxlPVJlc3Vyc3Npa29rb2VsbWFhXCBlaVwgb2xlCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IAorbm9uZT1FaVwgb2xlCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBKdXNzaSBNeWxseW1ha2kKKyMgQGNvbW1lbnQgUHJvamVjdCB0YWJsZSBjb2x1bW4gbmFtZSAtIExvY2F0aW9uIG9mIGEgcmVzb3VyY2UgYnVuZGxlCitwcm9qZWN0X3RhYmxlX2ZpbGVfbG9jYXRpb249VGllZG9zdG9uXCBTaWphaW50aQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMTEtMjAgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgSnVzc2kgTXlsbHltYWtpCisjIEBjb21tZW50IFRhYmxlIENvbHVtbiBOYW1lIGZvciByZXNvdXJjZSBidW5kbGUgbmFtZQorcHJvamVjdF90YWJsZV9yZXNvdXJjZV9idW5kbGU9UmVzdXJzc2lrb2tvZWxtYQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCBBbiBhYmJyZXZpYXRlZCBuYW1lIG9mIHRoaXMgYXBwbGljYXRpb24KK3JibWFuYWdlcj1SQk1hbmFnZXIKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDA0LTA2LTI5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBHZW9yZ2UKKyMgQGNvbW1lbnQgCityYm1hbmFnZXJfY29udGFjdD1UZWtpalx1MDBFNFw6XCBKYXJlZFwgSmFja3NvblwgJlwgR2VvcmdlXCBSaG90ZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgVGhlIGZ1bGwgbmFtZSBvZiB0aGlzIGFwcGxpY2F0aW9uCityZXNvdXJjZV9idW5kbGVfbWFuYWdlcj1SZXN1cnNzaW1hbmFnZXJpCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IAordGFibGVfY29sdW1uX2Vycm9yPVZpcmhlXCB0YXVsdWtvblwgc2FyYWtrZWVzc2EKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQHswfSAKKyMgQGNvbW1lbnQgTm9kZSB0aXRsZSwgdW5kZXIgd2hpY2ggYWxsIGZpbGVzIG9mIHRoZSBzYW1lIGNvdW50cnksIGxhbmd1YWdlIHJlc2lkZQordHJlZV9jb3VudHJ5X25vZGU9TWFha29vZGlcOlwgezB9CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEB7MH0gTGFuZ3VhZ2UgRW5jb2RpbmcKKyMgQGNvbW1lbnQgVGhlIG5vZGUgYmVsb3cgd2hpY2ggbGFuZ3VhZ2VzIG9mIG9uZSBlbmNvZGluZyBhcmUgZ3JvdXBlZAordHJlZV9sYW5ndWFnZV9ub2RlPUtpZWxpa29vZGlcOlwgezB9CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IAordHJlZV92YXJpYW50X25vZGU9TXV1bm5lbG1pYVw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IFRoZSBuYW1lIGFzc2lnbmVkIGFzIGEgdXNlciBuYW1lIHdoZW4gdGhlIHVzZXIgbmFtZSBpcyBub3Qgc3BlY2lmaWVkCit1bmtub3duX3VzZXI9VHVubmlzdGFtYXRvbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCAKK3VudGl0bGVkPUVpXCBuaW1lXHUwMEU0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IAordW50cmFuc2xhdGVkX2l0ZW1zPUtcdTAwRTRcdTAwRTRudFx1MDBFNG1cdTAwRTR0dFx1MDBGNm1cdTAwRTR0XCByZXN1cnNzaXQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQHswfSBUaGUgdmVyc2lvbiBudW1iZXIKKyMgQGNvbW1lbnQgVGhlIHZlcnNpb24gb2YgdGhpcyBhcHBsaWNhdGlvbgordmVyc2lvbj1WZXJzaW9cIHswfQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBnZW5lcmFsIHVzZSBXYXJuaW5nCit3YXJuaW5nPVZhcm9pdHVzCisKKyMKKyMgQGdyb3VwIEltcG9ydAorIworIyBAZ3JvdXBDb21tZW50IFJlc291cmNlcyBkZWFsaW5nIHdpdGggaW1wb3J0IG9wdGlvbnMKKworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUaXRsZSBmb3IgZmlsZSBjaG9vc2VyIGZvciBjaG9vc2luZyBUTVggZmlsZXMKK2ltcG9ydF9UTVhfZmlsZV9kZXNjcmlwdGlvbj1UTVgtdGllZG9zdG90CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IERpYWxvZyB0aXRsZSBmb3IgaW1wb3J0aW5nIGZyb20gVE1YIFhNTCBmaWxlcworaW1wb3J0X1RNWF90aXRsZT1UTVgtdGllZG9zdG9uXCBoYWt1CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwNC0wNy0wMSBAbW9kaWZpZWQgMjAwNC0wNy0wMSBAY3JlYXRvciBHZW9yZ2UgUmhvdGVuIEBtb2RpZmllciBHZW9yZ2UgUmhvdGVuCisjIEBjb21tZW50IFRpdGxlIGZvciB0aGUgZmlsZSBjaG9vc2VyIGZvciBjaG9vc2luZyBYTElGRiAoLnhsZikgZmlsZXMKK2ltcG9ydF9YTEZfZmlsZV9kZXNjcmlwdGlvbj1YTElGRi10aWVkb3N0b3QKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDA0LTA3LTAxIEBtb2RpZmllZCAyMDA0LTA3LTAxIEBjcmVhdG9yIEdlb3JnZSBSaG90ZW4gQG1vZGlmaWVyIEdlb3JnZSBSaG90ZW4KKyMgQGNvbW1lbnQgRGlhbG90IHRpdGxlIGZvciBpbXBvcnRpbmcgZnJvbSBYTElGRiAoLnhsZikgZmlsZXMKK2ltcG9ydF9YTEZfdGl0bGU9WExJRkYtdGllZG9zdG9uXCBoYWt1CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IE9wdGlvbiBmb3IgcmVzb2x2aW5nIGNvbmZsY2l0cyBvbiBhIGNhc2UgYnkgY2FzZSBiYXNpcworaW1wb3J0X2NvbmZsaWN0X3Byb21wdD1LeXN5XCBqb2thaXNlblwgb25nZWxtYW5cIGtvaGRhbGxhCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IE9wdGlvbiBzcGVjaWZ5aW5nIHdoZXRoZXIgYSBncm91cCBmb3VuZCBpbiB0aGUgdGFyZ2V0IGJ1dCBub3QgZm91bmQgaW4gdGhlIGFjdGl2ZSByZXNvdXJjZSBidW5kbGUgc2hvdWxkIGJlIGNyZWF0ZWQgaW4gdGhlIHJlc291cmNlIGJ1bmRsZSBvciBub3QKK2ltcG9ydF9kZWZhdWx0X2dyb3VwX2NyZWF0aW9uPUx1b1wgcmVzdXJzc2lyeWhtXHUwMEU0dFwgam9pdGFcIGVpXCBvbGVcIG55a3lpc2Vzc1x1MDBFNFwgdGllZG9zdG9zc2EKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgT3B0b2luIGZvciBtYXJraW5nIHRoZSBpbmNvbWluZyB2YWx1ZXMgYXMgdHJhbnNsYXRlZCBvciBub3QKK2ltcG9ydF9kZWZhdWx0X3RyYW5zbGF0ZWQ9TWVya2l0c2VcIGtcdTAwRTRcdTAwRTRubmV0eWtzaQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUaXRsZSBmb3Igb3B0aW9ucyBzcGVjaWZ5aW5nIHRoZSBtZXRhIGRhdGEgdG8gYmUgYXBwbGllZCB0byBpbmRpdmlkdWFsIHJlc291cmNlcyBpZiBpdCBpcyBub3QgYXZhaWxhYmxlIGluIHRoZSBpbXBvcnQgc291cmNlCitpbXBvcnRfZGVmYXVsdF92YWx1ZXM9T2xldHVzYXJ2b3QKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQHswfSBUaGUgbG9jYWxlIGVuY29kaW5nIG9mIHRoZSBmaWxlIGluIHF1ZXN0aW9uCisjIEBjb21tZW50IEluc3RydWN0aW9ucyBmb3IgcHJvbXB0aW5nIHRoZSB1c2VyIHRvIHJlc29sdmUgYSBjb25mbGljdCB3aGVuIGltcG9ydGluZyByZXNvdXJjZXMgZnJvbSBhIGxvY2FsZSB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBjdXJyZW50IHJlc291cmNlIGJ1bmRsZQoraW1wb3J0X2ZpbGVfY29uZmxpY3RfY2hvb3NlPUVuY29kaW5nXCB7MH1cIGVpXCBvbGVcIG9sZW1hc3NhLlwgVmFsaXRzZVwga3VpbmthXCBoYWx1YXRcIHJhdGthaXN0YVwgb25nZWxtYW4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IE9wdGlvbiBmb3IgZmlsZSBjb25mbGljdHMgaW4gd2hpY2ggYSBuZXcgZmlsZSBpcyBnZW5lcmF0ZWQsIGJ1dCBub3QgcG9wdWxhdGVkCitpbXBvcnRfZmlsZV9jb25mbGljdF9nZW5lcmF0ZV9lbXB0eT1MdW9cIHV1c2lcIHR5aGpcdTAwRTRcIHJlc3Vyc3NpdGllZG9zdG8KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgT3B0aW9uIGZvciByZXNvbHZpbmcgZmlsZSBjb25mbGljdHMgaW4gd2hpY2ggYSBuZXcgZmlsZSBpcyBnZW5lcmF0ZWQgYW5kIHBvcHVsYXRlZCB3aXRoIGFsbCB0aGUgZXhpc3RpbmcgcmVzb3VyY2VzCitpbXBvcnRfZmlsZV9jb25mbGljdF9nZW5lcmF0ZV9wb3B1bGF0ZT1MdW9cIHV1c2lcIHJlc3Vyc3NpdGllZG9zdG9cIGphXCBrb3Bpb2lcIEJhc2VcIENsYXNzaW5cIHJlc3Vyc3NpdFwgc2lpaGVuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IE9wdGlvbiBmb3IgZmlsZSBjb25mbGljdHMgaW4gd2hpY2ggdGhlIGNvbmZsaWN0cyBhcmUgaWdub3JlZAoraW1wb3J0X2ZpbGVfY29uZmxpY3RfaWdub3JlPUh5cHBcdTAwRTRcdTAwRTRcIG5paWRlblwgcmVzdXJzc2llblwgeWxpXCBqb2lkZW5cIEFsdWUtYXNldHVzXCBlaVwgb2xlXCBueWt5aXNlc3NcdTAwRTRcIHJlc3Vyc3NpdGllZG9zdG9zc2EKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgVGl0bGUgZm9yIHNlY3Rpb24gbGlzdGluZyBvcHRpb25zIGZvciB3aGF0IHRvIGRvIHdoZW4gYW4gaW1wb3J0ZWQgdmFsdWUgZXhpc3RzIGluIGEgbG9jYWxlIG5vdCBkZWZpbmVkIGluIHRoZSBleGlzdGluZyByZXNvdXJjZSBidW5kbGUKK2ltcG9ydF9maWxlX2NvbmZsaWN0cz1QdXV0dHV2YXRcIHJlc3Vyc3NpdGllZG9zdG90CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFNlbGVjdGlvbiBvZiB0aGUgZGVmYXVsdCBncm91cC4gQSBsaXN0IG9mIGdyb3VwcyB3aWxsIGFwcGVhciB0byB0aGUgcmlnaHQgb2YgdGhpcyByZXNvdXJjZSBpbiBhIENvbWJvQm94CitpbXBvcnRfaW5zZXJ0X2dyb3VwPVNpam9pdGFcIHJlc3Vyc3NpcnlobVx1MDBFNFx1MDBFNG5cOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUaXRsZSBmb3IgdGhlIHR5cGVzIG9mIGZpbGVzIGFjY2VwdGVkIGZvciB0aGlzIGltcG9ydCB0eXBlCitpbXBvcnRfamF2YV9maWxlX2Rlc2NyaXB0aW9uPUphdmFcIExpc3RSZXNvdXJjZUJ1bmRsZVwgQmFzZVwgQ2xhc3NpdAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUaXRsZSBmb3IgZGlhbG9nIHByb21wdGluZyBmb3IgaW1wb3J0IGZyb20gamF2YSBjbGFzc2VzCitpbXBvcnRfamF2YV90aXRsZT1KYXZhXCBMaXN0UmVzb3VyY2VCdW5kbGVcIENsYXNzaWVuXCBIYWt1CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFRpdGxlIGluZGljYXRpbmcgc2VjdGlvbiBjb250YWluaW5nIHVzZXIgb3B0aW9ucworaW1wb3J0X29wdGlvbnM9SGFrdXBhcmFtZXRyaXQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgVGl0bGUgZm9yIGZpbGUgY2hvb3NlciBmb3Igc2VsZWN0aW9uIG9mIHJlc291cmNlIGJ1bmRsZXMgc3RvcmVkIGluIC5wcm9wZXJ0aWVzIGZpbGVzCitpbXBvcnRfcHJvcGVydGllc19maWxlX2Rlc2NyaXB0aW9uPVJlc3Vyc3NpdGllZG9zdG9uXCBCYXNlXCBDbGFzc2l0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IERpYWxvZyB0aXRsZSBmb3IgaW1wb3J0aW5nIGZyb20gcHJvcGVydGllcyBmaWxlcyAoY3JlYXRlZCBvciBub3QgYnkgUkJNYW5hZ2VyKQoraW1wb3J0X3Byb3BlcnRpZXNfdGl0bGU9UmVzdXJzc2l0aWVkb3N0b2plblwgaGFrdQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAezF9IEVuY29kaW5nIG9mIHRoZSByZXNvdXJjZSB2YWx1ZSB3aXRoIGEgY29uZmxpY3QKKyMgQHswfSBUaGUga2V5IHZhbHVlIG9mIHRoZSByZXNvdXJjZSBpbiBjb25mbGljdAorIyBAY29tbWVudCBUaGlzIGlzIGEgd2FybmluZyBhbmQgaW5zdHJ1Y3Rpb24gZm9yIHdoZW4gYSByZXNvdXJjZSBjb25mbGljdCBvY2N1cnMgZHVyaW5nIGFuIGltcG9ydAoraW1wb3J0X3Jlc291cmNlX2NvbmZsaWN0X2Nob29zZT1BdmFpbnRhXCB7MH1cIGVpXCBvbGVcIG9sZW1hc3NhXCByZXN1cnNzaWtva29lbG1hc3NhXCB7MX0uVmFsaXRzZVwga3VpbmthXCBoYWx1YXRcIHJhdGthaXN0YVwgb25nZWxtYW5cOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAezB9IFRoZSB0cmFuc2xhdGlvbiB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc291cmNlIGl0ZW0KKyMgQGNvbW1lbnQgQW4gaW5kaWNhdGlvbiBvZiB0aGUgdmFsdWUgb2YgdGhlIHJlc291cmNlIGFjY29yZGluZyB0byB0aGUgaW1wb3J0IGZpbGUKK2ltcG9ydF9yZXNvdXJjZV9jb25mbGljdF9jaG9vc2Vfc291cmNlPUhhZVwga1x1MDBFNFx1MDBFNG5uXHUwMEY2c1w6XCB7MH0KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQHswfSBUaGUgdHJhbnNsYXRpb24gdmFsdWUgb2YgdGhlIHJlc291cmNlIGl0ZW0KKyMgQGNvbW1lbnQgQW4gaW5kaWNhdGlvbiBvZiB0aGUgdHJhbnNsYXRpb24gdmFsdWUgaGVsZCBieSB0aGUgYWN0aXZlIHJlc291cmNlIGJ1bmRsZSBkdXJpbmcgYSB0cmFuc2xhdGlvbiByZXNvdXJjZSBjb25mbGljdAoraW1wb3J0X3Jlc291cmNlX2NvbmZsaWN0X2Nob29zZV90YXJnZXQ9UmVzdXJzc2l0aWVkb3N0b25cIGtcdTAwRTRcdTAwRTRublx1MDBGNnNcOlwgezB9CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IE9wdGlvbiBmb3IgcmVzb2x2aW5nIHJlc291cmNlIGNvbmZsaWN0cyBieSBpZ25vcmluZyBpbXBvcnQgdmFsdWUKK2ltcG9ydF9yZXNvdXJjZV9jb25mbGljdF9pZ25vcmU9T2hpdGFcIG9uZ2VsbWFcIGphXCBcdTAwRTRsXHUwMEU0XCBtdXV0YVwgcmVzdXJzc2lhCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IE9wdGlvbiBmb3IgcmVzb2x2aW5nIGNvbmZsaWN0cyBieSB1c2luZyB0aGUgaW1wb3J0IHZhbHVlCitpbXBvcnRfcmVzb3VyY2VfY29uZmxpY3Rfb3ZlcndyaXRlPUtvcnZhYVwgcmVzdXJzc2lcIHRpZWRvc3Rvc3RhXCBoYWV0dWxsYVwgYXJ2b2xsYQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUaXRsZSBsaXN0aW5nIG9wdGlvbnMgZm9yIHJlc29sdmluZyBjb25mbGljdHMgYmV0d2VlbiByZXNvdXJjZXMKK2ltcG9ydF9yZXNvdXJjZV9jb25mbGljdHM9UmVzdXJzc2llblwgb25nZWxtYXQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQHswfSBUaGUgcGF0aCBhbmQgbmFtZSBvZiB0aGUgc291cmNlIGZpbGUKKyMgQGNvbW1lbnQgSW5kaWNhdGlvbiBvZiB0aGUgc291cmNlIGZpbGUgZm9yIHRoZSBpbXBvcnQKK2ltcG9ydF9zb3VyY2VfZmlsZT1UaWVkb3N0b1w6XCB7MH0KKworIworIyBAZ3JvdXAgTWVudSBJdGVtcworIworIyBAZ3JvdXBDb21tZW50IFRoZXNlIHJlc291cmNlcyByZXByZXNlbnQgYWxsIG9mIHRoZSBtZW51IGFuZCBtZW51IGl0ZW0gdGl0bGVzCisKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCBUaGUgbWVudSB0aXRsZSBjb3ZlcmluZyBjb3B5aW5nLCBwYXN0aW5nLCBkZWxldGluZyBvZiBpdGVtcworbWVudV9lZGl0PU11dXRhCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorbWVudV9lZGl0X2NvcHk9S29waW9pCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorbWVudV9lZGl0X2NvcHlfdHJpZ2dlcj1rCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorbWVudV9lZGl0X2N1dD1MZWlra2FhCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorbWVudV9lZGl0X2N1dF90cmlnZ2VyPWwKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCittZW51X2VkaXRfZGVsZXRlPVBvaXN0YQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK21lbnVfZWRpdF9kZWxldGVfdHJpZ2dlcj1wCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorbWVudV9lZGl0X3Bhc3RlPVNpam9pdGEKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCittZW51X2VkaXRfcGFzdGVfdHJpZ2dlcj1zCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgVGhlIHRyaWdnZXIgaXMgYSBsZXR0ZXIgZnJvbSB0aGUgdHJhbnNsYXRpb24gb2YgJ21lbnVfZWRpdCcgd2hpY2ggcHJvdmlkZXMgYSBrZXlib2FyZCBzaG9ydGN1dCB0byB0aGUgbWVudQorbWVudV9lZGl0X3RyaWdnZXI9bQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IE1lbnUgdGl0bGUgZm9yIHRoZSBvcGVuaW5nLCBzYXZpbmcsIGV0Yy4gZG9jdW1lbnRzIGFuZCBleGl0aW5nIHRoZSBwcm9ncmFtCittZW51X2ZpbGU9VGllZG9zdG8KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgQWJpbGl0eSB0byBleHBvcnQgcmVzb3VyY2UgYnVuZGxlcyBpbiBhIHZhcmlldHkgb2YgZm9ybWF0cworbWVudV9maWxlX2V4cG9ydD1SZXN1cnNzaWtva29lbG1hblwgc2lpcnRvCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMi0wNS0xNyBAbW9kaWZpZWQgMjAwMi0wNS0xNyBAY3JlYXRvciBHZW9yZ2UgUmhvdGVuIEBtb2RpZmllciBHZW9yZ2UgUmhvdGVuCisjIEBjb21tZW50IEFibGl0eSB0byBleHBvcnQgdG8gSUNVIFJlc291cmNlIEJ1bmRsZSBmaWxlcworbWVudV9maWxlX2V4cG9ydF9JQ1U9SUNVLXRpZWRvc3RvdC4uLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDItMDUtMTcgQG1vZGlmaWVkIDIwMDItMDUtMTcgQGNyZWF0b3IgR2VvcmdlIFJob3RlbiBAbW9kaWZpZXIgR2VvcmdlIFJob3RlbgorIyBAY29tbWVudCAKK21lbnVfZmlsZV9leHBvcnRfSUNVX3RyaWdnZXI9aQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBBYmxpdHkgdG8gZXhwb3J0IHRvIFRNWCBYTUwgZmlsZXMKK21lbnVfZmlsZV9leHBvcnRfVE1YPVRNWC10aWVkb3N0b3QuLi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCittZW51X2ZpbGVfZXhwb3J0X1RNWF90cmlnZ2VyPXMKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwNC0wNy0wMSBAbW9kaWZpZWQgMjAwNC0wNy0wMSBAY3JlYXRvciBHZW9yZ2UgUmhvdGVuIEBtb2RpZmllciBHZW9yZ2UgUmhvdGVuCisjIEBjb21tZW50IHgKK21lbnVfZmlsZV9leHBvcnRfWExGPVhMSUZGLXRpZWRvc3RvdC4uLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDQtMDctMDEgQG1vZGlmaWVkIDIwMDQtMDctMDEgQGNyZWF0b3IgR2VvcmdlIFJob3RlbiBAbW9kaWZpZXIgR2VvcmdlIFJob3RlbgorIyBAY29tbWVudCAKK21lbnVfZmlsZV9leHBvcnRfWExGX3RyaWdnZXI9eAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBBYmlsaXR5IHRvIGV4cG9ydCB0byBqYXZhIGZpbGVzIHRoYXQgY29tcGlsZSB0byBiZSBMaXN0UmVzb3VyY2VCdW5kbGUgY2xhc3MgZXh0ZW5zaW9ucworbWVudV9maWxlX2V4cG9ydF9qYXZhPUphdmEtdGllZG9zdG90Li4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorbWVudV9maWxlX2V4cG9ydF9qYXZhX3RyaWdnZXI9agorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBFeHBvcnQgYWJpbGl0eSB0byBwcm9wZXJ0aWVzIGZpbGVzIG1pbnVzIHRoZSBtZXRhZGF0YQorbWVudV9maWxlX2V4cG9ydF9wcm9wZXJ0aWVzPVBlbGtrXHUwMEU0XCBQcm9wZXJ0eS10aWVkb3N0by4uLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK21lbnVfZmlsZV9leHBvcnRfcHJvcGVydGllc190cmlnZ2VyPXAKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCittZW51X2ZpbGVfZXhwb3J0X3RyaWdnZXI9cworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IE1lbnUgaXRlbSBmb3IgaW1wb3J0IGFuZCBtZXJnaW5nIGFub3RoZXIgcmVzb3VyY2UgZmlsZSB3aXRoIHRoZSBidW5kbGUgYmVpbmcgd29ya2VkIHdpdGgKK21lbnVfZmlsZV9pbXBvcnQ9THVlXCByZXN1cnNzaWtva29lbG1hXCB0aWVkb3N0b3N0YS4uLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBJbXBvcnQgYWJsaWl0eSBmcm9tIFhNTCBUTVggZG9jdW1lbnRzCittZW51X2ZpbGVfaW1wb3J0X1RNWD1UTVgtdGllZG9zdG90Li4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorbWVudV9maWxlX2ltcG9ydF9UTVhfdHJpZ2dlcj10CisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDQtMDctMDEgQG1vZGlmaWVkIDIwMDQtMDctMDEgQGNyZWF0b3IgR2VvcmdlIFJob3RlbiBAbW9kaWZpZXIgR2VvcmdlIFJob3RlbgorIyBAY29tbWVudCBJbXBvcnQgYWJpbGl0eSBmcm9tIFhNTCBYTElGRiAoLnhsZikgZmlsZXMKK21lbnVfZmlsZV9pbXBvcnRfWExGPVhMSUZGLXRpZWRvc3RvdC4uLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDQtMDctMDEgQG1vZGlmaWVkIDIwMDQtMDctMDEgQGNyZWF0b3IgR2VvcmdlIFJob3RlbiBAbW9kaWZpZXIgR2VvcmdlIFJob3RlbgorIyBAY29tbWVudCBYCittZW51X2ZpbGVfaW1wb3J0X1hMRl90cmlnZ2VyPXgKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgSW1wb3J0IGFiaWxpdHkgZnJvbSBqYXZhIGNsYXNzZXMgKExpc3RSZXNvdXJjZUJ1bmRsZSkKK21lbnVfZmlsZV9pbXBvcnRfamF2YT1KYXZhLXRpZWRvc3RvdC4uLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK21lbnVfZmlsZV9pbXBvcnRfamF2YV90cmlnZ2VyPWoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgSW1wb3J0IGFiaWxpdHkgZnJvbSBwcm9wZXJ0aWVzIGZpbGVzIG5vdCBnZW5lcmF0ZWQgYnkgUkJNYW5hZ2VyCittZW51X2ZpbGVfaW1wb3J0X3Byb3BlcnRpZXM9WWtzaW5rZXJ0YWlzZXRcIHJlc3Vyc3Npa29rb2VsbWF0Li4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorbWVudV9maWxlX2ltcG9ydF9wcm9wZXJ0aWVzX3RyaWdnZXI9cAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IAorbWVudV9maWxlX2ltcG9ydF90cmlnZ2VyPWwKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCBNZW51IGl0ZW0gZm9yIGNyZWF0aW5nIGEgbmV3IHJlc291cmNlIGJ1bmRsZQorbWVudV9maWxlX25ldz1VdXNpXCByZXN1cnNzaWtva29lbG1hLi4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgCittZW51X2ZpbGVfbmV3X3RyaWdnZXI9dQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IE1lbnUgSXRlbSBmb3Igb3BlbmluZyBhIHJlc291cmNlIGJ1bmRsZQorbWVudV9maWxlX29wZW49QXZhYVwgcmVzdXJzc2lrb2tvZWxtYS4uLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IAorbWVudV9maWxlX29wZW5fdHJpZ2dlcj1hCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgTWVudSBpdGVtIGZvciBjbG9zaW5nIHRoZSBhcHBsaWNhdGlvbgorbWVudV9maWxlX3F1aXQ9UG9pc3R1CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgCittZW51X2ZpbGVfcXVpdF90cmlnZ2VyPXAKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCBNZW51IGl0ZW0gZm9yIHNhdmluZyB0aGUgcmVzb3VyY2UgYnVuZGxlIGJlaW5nIHdvcmtlZCB3aXRoCittZW51X2ZpbGVfc2F2ZT1UYWxsZXRhXCByZXN1cnNzaWtva29lbG1hCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgCittZW51X2ZpbGVfc2F2ZV90cmlnZ2VyPXQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCBNZW51IEl0ZW0gZm9yIHNhdmluZyBhIHJlc291cmNlIGJ1bmRsZSB0byBhIHBhcnRpY3VsYXIgbG9jYXRpb24gYW5kIGZpbGUgbmFtZQorbWVudV9maWxlX3NhdmVhcz1UYWxsZXRhXCByZXN1cnNzaWtva29lbG1hXCBuaW1lbGxcdTAwRTQuLi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCAKK21lbnVfZmlsZV9zYXZlYXNfdHJpZ2dlcj1uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgVGhlIHRyaWdnZXIgaXMgYSBsZXR0ZXIgZnJvbSB0aGUgdHJhbnNsYXRpb24gb2YgJ21lbnVfZmlsZScgd2hpY2ggcHJvdmlkZXMgYSBrZXlib2FyZCBzaG9ydGN1dCB0byB0aGUgbWVudQorbWVudV9maWxlX3RyaWdnZXI9dAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IE1lbnUgdGl0bGUgZm9yIGhlbHAgaW5mb3JtYXRpb24gYW5kIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByb2dyYW0KK21lbnVfaGVscD1BcHVhCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgTWVudSBpdGVtIHdoaWNoIGJyaW5ncyB1cCBhIGRpYWxvZyBkZXNjcmliaW5nIHRoZSBhcHBsaWNhdGlvbgorbWVudV9oZWxwX2Fib3V0PUxpc1x1MDBFNHRpZXRvamFcIFJlc3Vyc3NpbWFuYWdlcmlzdGEuLi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCAKK21lbnVfaGVscF9hYm91dF90cmlnZ2VyPWwKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCBUaGUgdHJpZ2dlciBpcyBhIGxldHRlciBmcm9tIHRoZSB0cmFuc2xhdGlvbiBvZiAnbWVudV9oZWxwJyB3aGljaCBwcm92aWRlcyBhIGtleWJvYXJkIHNob3J0Y3V0IHRvIHRoZSBtZW51CittZW51X2hlbHBfdHJpZ2dlcj1hCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgTWVudSB0aXRsZSBmb3Igb3B0aW9ucyBzdWNoIGFzIGNyZWF0aW5nIG5ldyByZXNvdXJjZXMsIGdyb3VwcywgYW5kIHJlc291cmNlIGZpbGVzCittZW51X29wdGlvbnM9QXNldHVrc2V0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgTWVudSBJdGVtIGZvciBjcmVhdGluZyBhIG5ldyByZXNvdXJjZSBpdGVtCittZW51X29wdGlvbnNfYWRkZW50cnk9TGlzXHUwMEU0XHUwMEU0XCByZXN1cnNzaS4uLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IAorbWVudV9vcHRpb25zX2FkZGVudHJ5X3RyaWdnZXI9cgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IE1lbnUgSXRlbSBmb3IgY3JlYXRpbmcgYSBuZXcgcmVzb3VyY2UgZmlsZSBmb3IgYSBwYXJ0aWN1bGFyIGxhbmd1YWdlL2NvdW50cnkvdmFyaWFudAorbWVudV9vcHRpb25zX2FkZGZpbGU9TGlzXHUwMEU0XHUwMEU0XCByZXN1cnNzaXRpZWRvc3RvLi4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgCittZW51X29wdGlvbnNfYWRkZmlsZV90cmlnZ2VyPXQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCBNZW51IGl0ZW0gZm9yIGNyZWF0aW5nIGEgbmV3IHJlc291cmNlIGdyb3VwCittZW51X29wdGlvbnNfYWRkZ3JvdXA9TGlzXHUwMEU0XHUwMEU0XCByZXN1cnNzaXJ5aG1cdTAwRTQuLi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCAKK21lbnVfb3B0aW9uc19hZGRncm91cF90cmlnZ2VyPXIKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgTWVudSBpdGVtIGZvciBlZGl0aW5nIHRoZSB1c2VyJ3MgcHJlZmVyZW5jZXMgZm9yIHRoZSBhcHBsaWNhdGlvbgorbWVudV9vcHRpb25zX3ByZWZlcmVuY2VzPUFzZXR1a3NldC4uLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCAKK21lbnVfb3B0aW9uc19wcmVmZXJlbmNlc190cmlnZ2VyPWEKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTExLTIwIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIEp1c3NpIE15bGx5bWFraQorIyBAY29tbWVudCBNZW51IGl0ZW0gdGhhdCBtYWtlcyB2aXNpYmxlIHRoZSBwcm9qZWN0IHZpZXdlcgorbWVudV9vcHRpb25zX3Byb2plY3Rfdmlld2VyPUF2YWFcIFByb2pla3Rpblx1MDBFNHl0dFx1MDBGNgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMTEtMjAgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgSnVzc2kgTXlsbHltYWtpCisjIEBjb21tZW50IAorbWVudV9vcHRpb25zX3Byb2plY3Rfdmlld2VyX3RyaWdnZXI9bgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IFRoZSB0cmlnZ2VyIGlzIGEgbGV0dGVyIGZyb20gdGhlIHRyYW5zbGF0aW9uIG9mICdtZW51X29wdGlvbnMnIHdoaWNoIHByb3ZpZGVzIGEga2V5Ym9hcmQgc2hvcnRjdXQgdG8gdGhlIG1lbnUKK21lbnVfb3B0aW9uc190cmlnZ2VyPWEKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0xMi0xNyBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IFBvcHVwIG1lbnUgaXRlbSBmb3IgYWRkaW5nIGEgbmV3IHJlc291cmNlIGJ1bmRsZSB0byB0aGUgcHJvamVjdAorbWVudV90cmVlX2FkZF9wcm9qZWN0X2J1bmRsZT1BZGRcIFJlc291cmNlXCBCdW5kbGUuLi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTA3LTAyIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIEp1c3NpIE15bGx5bWFraQorIyBAY29tbWVudCBQb3B1cCBtZW51IGl0ZW0gZm9yIGRlbGV0aW5nIHBlcm1hbmVudGx5IGEgcmVzb3VyY2UgZmlsZQorbWVudV90cmVlX2RlbGV0ZT1Qb2lzdGFcIFJlc3Vyc3NpdGllZG9zdG8KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTA3LTAyIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIEp1c3NpIE15bGx5bWFraQorIyBAY29tbWVudCBQb3B1cCBtZW51IGl0ZW0gZm9yIHJlbW92aW5nIGEgc3BlY2lmaWMgcmVzb3VyY2UgZmlsZSBmcm9tIHRoZSB0cmVlIHZpZXcgb2YgdGhlIHJlc291cmNlIGJ1bmRsZQorbWVudV90cmVlX2hpZGU9UGlpbG90YVwgUmVzdXJzc2l0aWVkb3N0bworIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTEyLTE5IEBtb2RpZmllZCAyMDAxLTEyLTE5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgUG9wdXAgbWVudSBpdGVtIGZvciBjcmVhdGluZyBhIG5ldyBwcm9qZWN0CittZW51X3RyZWVfbmV3X3Byb2plY3Q9TmV3XCBSZXNvdXJjZVwgQnVuZGxlXCBQcm9qZWN0Li4uCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMTItMTcgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBQb3B1cCBtZW51IGl0ZW0gZm9yIG9wZW5pbmcgYSByZXNvdXJjZSBidW5kbGUgcHJvamVjdAorbWVudV90cmVlX29wZW5fcHJvamVjdD1PcGVuXCBSZXNvdXJjZVwgQnVuZGxlXCBQcm9qZWN0Li4uCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMTItMTcgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBQb3B1cCBtZW51IGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlIGJ1bmRsZSBpbiB0aGUgcHJvamVjdCB0cmVlCittZW51X3RyZWVfcmVtb3ZlX3Byb2plY3RfYnVuZGxlPVJlbW92ZVwgZnJvbVwgUHJvamVjdAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDctMDIgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgSnVzc2kgTXlsbHltYWtpCisjIEBjb21tZW50IFBvcHVwIG1lbnUgaXRlbSBmb3Igc2F2aW5nIGEgc3BlY2lmaWMgcmVzb3VyY2UgYnVuZGxlIGZpbGUKK21lbnVfdHJlZV9zYXZlPVRhbGxldGFcIFJlc3Vyc3NpdGllZG9zdG8KKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0xMi0xNyBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IFBvcHVwIG1lbnUgaXRlbSBmb3Igc2F2aW5nIGNoYW5nZXMgdG8gdGhlIHJlc291cmNlIHByb2plY3QgZmlsZSwgbm90IHRoZSByZXNvdXJjZSBidW5kbGVzIHRoZW1zZWx2ZXMgd2l0aGluIHRoZSBwcm9qZWN0CittZW51X3RyZWVfc2F2ZV9wcm9qZWN0PVNhdmVcIFJlc291cmNlXCBCdW5kbGVcIFByb2plY3RcIEZpbGUuLi4KKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0xMi0xNyBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IFBvcHVwIG1lbnUgZm9yIHNlbGVjdGluZyBhIHJlc291cmNlIGJ1bmRsZSBmcm9tIHRoZSBwcm9qZWN0IHRyZWUgdG8gYmUgZWRpdGVkIGluIHRoZSByZXNvdXJjZSBidW5kbGUgdHJlZQorbWVudV90cmVlX3NlbGVjdF9wcm9qZWN0X2J1bmRsZT1Xb3JrXCB3aXRoXCB0aGlzXCBSZXNvdXJjZVwgQnVuZGxlCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgTWVudSB0aXRsZSBmb3IgY2hhbmdpbmcgdGhlIGRpc3BsYXkgYmVpbmcgc2VlbiBieSB0aGUgdXNlcgorbWVudV92aWV3PU5cdTAwRTR5dHRcdTAwRjYKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCBNZW51IGl0ZW0gdGhhdCB0YWtlcyB5b3UgZGlyZWN0bHkgdG8gdGhlIHN0YXRpc3RpY3MgcGFuZWwgZm9yIHRoZSBlbnRpcmUgYnVuZGxlCittZW51X3ZpZXdfc3RhdGlzdGljcz1OXHUwMEU0eXRcdTAwRTRcIHJlc3Vyc3Npa29rb2VsbWFuXCB0aWxhc3RvdGllZG90CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgCittZW51X3ZpZXdfc3RhdGlzdGljc190cmlnZ2VyPXQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCBUaGUgdHJpZ2dlciBpcyBhIGxldHRlciBmcm9tIHRoZSB0cmFuc2xhdGlvbiBvZiAnbWVudV92aWV3JyB3aGljaCBwcm92aWRlcyBhIGtleWJvYXJkIHNob3J0Y3V0IHRvIHRoZSBtZW51CittZW51X3ZpZXdfdHJpZ2dlcj1uCisKKyMKKyMgQGdyb3VwIFByb2plY3QgUGFuZWwKKyMKKyMgQGdyb3VwQ29tbWVudCBQYW5lbCBhc3NvY2lhdGVkIHdpdGggUHJvamVjdCBlZGl0aW5nCisKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMi0xOSBAbW9kaWZpZWQgMjAwMS0xMi0xOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEB7MH0gVGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIGJ1bmRsZQorIyBAY29tbWVudCBMYWJlbCBpbmRpY2F0b3IgYXNzb2NpYXRpbmcgYSB0ZXh0IGJveCBjb250YWluaW5nIGEgdHJhbnNsYXRpb24gd2l0aCB0aGUgcmVzb3VyY2UgYnVuZGxlIHRoZSB0cmFuc2xhdGlvbiBjb21lcyBmcm9tCitwcm9qZWN0X3BhbmVsX2J1bmRsZT1SZXNvdXJjZVwgQnVuZGxlXDpcIHswfQorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTEyLTE5IEBtb2RpZmllZCAyMDAxLTEyLTE5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQHswfSBOYW1lIG9mIHRoZSByZXNvdXJjZSBidW5kbGUKKyMgQGNvbW1lbnQgU3BlY2lhbCBpbmRpY2F0b3Igb2YgdGhlIHJlc291cmNlIGl0ZW0gcmVzb3VyY2UgYnVuZGxlIHdoZW4gdGhlIGl0ZW0gaXMgdW50cmFuc2xhdGVkCitwcm9qZWN0X3BhbmVsX2J1bmRsZV91bnRyYW5zbGF0ZWQ9UmVzb3VyY2VcIEJ1bmRsZVw6XCB7MH1cIChVbnRyYW5zbGF0ZWQpCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTItMTkgQG1vZGlmaWVkIDIwMDEtMTItMTkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBMYWJlbCB0ZXh0IG1hcmtpbmcgdGhlIGxpbmUgYWJvdmUgb3IgdG8gdGhlIGxlZnQgb2YgYSByZXNvdXJjZSBjb21tZW50Citwcm9qZWN0X3BhbmVsX2NvbW1lbnQ9QmFzZVwgQ2xhc3NcIFJlc291cmNlXCBDb21tZW50XDoKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMi0xOSBAbW9kaWZpZWQgMjAwMS0xMi0xOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IExhYmVsIHRleHQgZm9yIGEgY29tbWVudCB3aGVuIG5vbmUgaXMgZm91bmQgZm9yIGEgcmVzb3VyY2UKK3Byb2plY3RfcGFuZWxfY29tbWVudF9ub25lPU5vXCBjb21tZW50XCBzdXBwbGllZAorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTEyLTE5IEBtb2RpZmllZCAyMDAxLTEyLTE5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgQnV0dG9uIHRpdGxlIHNob3duIG9uIHRoZSBwcm9qZWN0IHBhbmVsIGZvciBjb21taXR0aW5nIGNoYW5nZSB0byBvbmUgcmVzb3VyY2Ugb25seQorcHJvamVjdF9wYW5lbF9jb21taXRfYnV0dG9uPUNvbW1pdFwgQ2hhbmdlCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTItMTkgQG1vZGlmaWVkIDIwMDEtMTItMTkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBCdXR0b24gdGl0bGUgb24gdGhlIHByb2plY3QgcGFuZWwgZm9yIHNhdmluZyBhbGwgb2YgdGhlIHJlc291cmNlcyBkaXNwbGF5ZWQuIFRoaXMgbWVhbnMgbXVsdGlwbGUgcmVzb3VyY2UgZmlsZXMgZ2V0IHNhdmVkLgorcHJvamVjdF9wYW5lbF9jb21taXRfYnV0dG9uX2FsbD1Db21taXRcIEFsbFwgUmVzb3VyY2VcIENoYW5nZXMKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMi0xOSBAbW9kaWZpZWQgMjAwMS0xMi0xOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IERlZmF1bHQgdGl0bGUgc2hvd24gb24gdGhlIHByb2plY3QgcGFuZWwgd2hlbiBubyBwYXJ0aWN1bGFyIHJlc291cmNlIGhhcyBiZWVuIHNlbGVjdGVkCitwcm9qZWN0X3BhbmVsX2RlZmF1bHRfdGl0bGU9UHJvamVjdFwgUmVzb3VyY2VcIEVkaXRpbmcKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMi0xOSBAbW9kaWZpZWQgMjAwMS0xMi0xOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IFRleHQgZmllbGQgbWFya2VyIGZvciB0aGUgdHJhbnNsYXRpb24gb2YgYSByZXNvdXJjZSB3aGVuIHRoYXQgcmVzb3VyY2UgZG9lcyBub3QgZXhpc3QgZm9yIHRoZSBlbmNvZGluZyBmaWxlIGl0IGlzIGFzc29jaWF0ZWQgd2l0aAorcHJvamVjdF9wYW5lbF9pdGVtX2luaGVyaXRzPTxOb1wgVHJhbnNsYXRpb25cOlwgUmVzb3VyY2VcIEluaGVyaXRzXCBmcm9tXCBwYXJlbnQ+CisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTItMTkgQG1vZGlmaWVkIDIwMDEtMTItMTkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAezB9IFRoZSBrZXkgb2YgdGhlIHNlbGVjdGVkIHJlc291cmNlCisjIEBjb21tZW50IFRpdGxlIG9uIHRoZSBwcm9qZWN0IHBhbmVsIHdoaWxlIGEgcmVzb3VyY2UgaXMgc2VsZWN0ZWQKK3Byb2plY3RfcGFuZWxfdGl0bGU9UHJvamVjdFwgUmVzb3VyY2VcIEVkaXRpbmdcOlwgezB9CisKKyMKKyMgQGdyb3VwIFJCUmVwb3J0ZXIKKyMKKyMgQGdyb3VwQ29tbWVudCBUcmFuc2xhdGlvbnMgZm9yIHRoZSBSQlJlcG9ydGVyIGFwcGxpY2F0aW9uCisKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEJ1dHRvbiB0aXRsZSBmb3Igc2VsZWN0aW5nIGZpbGUgbG9jYXRpb25zIGZvciBpbnB1dC9vdXRwdXQKK3JlcG9ydGVyX2J1dHRvbl9jaG9vc2U9VmFsaXRzZS4uLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgQnV0dG9uIGluZGljYXRpbmcgdGhlIHJlcG9ydCBnZW5lcmF0aW9uIHNob3VsZCBvY2N1ciBpbW1lZGlhdGVseQorcmVwb3J0ZXJfYnV0dG9uX25vdz1QXHUwMEU0aXZpdFx1MDBFNAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBCdXR0b24gdGl0bGUgZm9yIHNhdmluZyB0aGUgY3VycmVudCBzZXR0aW5ncyBhcyBkZWZhdWx0CityZXBvcnRlcl9idXR0b25fc2F2ZV9kZWZhdWx0cz1UYWxsZXRhXCBueWt5aXNldFwgYXNldHVrc2V0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBCdXR0b24gdG8gYWN0aXZhdGUgdGhlIHJlcG9ydGVyCityZXBvcnRlcl9idXR0b25fc3RhcnQ9QWxvaXRhCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBCdXR0b24gdG8gZGVhY3RpdmUgdGhlIHJlcG9ydGVyCityZXBvcnRlcl9idXR0b25fc3RvcD1QeXNcdTAwRTR5dFx1MDBFNAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgTGV2ZWwgb2YgZGV0YWlsOiBtb3N0IGluZm9ybWF0aW9uIGF2YWlsYWJsZQorcmVwb3J0ZXJfZGV0YWlsX2hpZ2g9UGFsam9uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBJbmRpY2F0aW9uIG9mIGEgc2VsZWN0aW9uIG9wdGlvbiBvZiB0aGUgbGV2ZWwgb2YgZGV0YWlsIGluIHJlcG9ydGluZworcmVwb3J0ZXJfZGV0YWlsX2xldmVsPVRpZWRvblwgbVx1MDBFNFx1MDBFNHJcdTAwRTRcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgTGV2ZWwgb2YgZGV0YWlsOiBzdGFuZGFyZAorcmVwb3J0ZXJfZGV0YWlsX25vcm1hbD1Ob3JtYWFsaQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgQW4gb3V0cHV0IGZvcm1hdDogSFRNTAorcmVwb3J0ZXJfZm9ybWF0X2h0bWw9SFRNTAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgQW4gb3V0cHV0IGZvcm1hdCB0eXBlOiBwbGFpbiB0ZXh0CityZXBvcnRlcl9mb3JtYXRfdGV4dD1UZWtzdGkKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEFuIG91dHB1dCBmb3JtYXQ6IFhNTAorcmVwb3J0ZXJfZm9ybWF0X3htbD1YTUwKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEluZGljYXRpb24gb2YgZmlsZSBsb2NhdGlvbiBvZiB0aGUgcmVzb3VyY2UgYnVuZGxlIHRvIHJlcG9ydCBvbgorcmVwb3J0ZXJfaW5wdXRfYnVuZGxlPVJlc3Vyc3Npa29rb2VsbWFcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgSW5kaWNhdGlvbiB0aGF0IHJlcG9ydGluZyB3aWxsIGhhcHBlbiBhdCBhIHNwZWNpaWZpZWQgdGltZSBvZiBkYXkuIEZvbGxvd2VkIGJ5IGEgdGltZSBhbmQgZGF5IG9wdGlvbi4KK3JlcG9ydGVyX2ludGVydmFsX2RlZmluZWQ9UmFwb3J0b2ludGlhamFua29odGEKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFRleHQgaW5kaWNhdGlvbiBvZiBzZXF1ZW50aWFsIHJlcG9ydGluZyBwYXVzZWQgZm9yIGEgZGVmaW5lZCBpbnRlcnZhbCBiZXR3ZWVuIHJlcG9ydGluZy4gSW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSBudW1iZXIgYW5kIGEgdW5pdCBvZiBtZWFzdXJlIG9mIHRpbWUKK3JlcG9ydGVyX2ludGVydmFsX3NlcXVlbnRpYWw9UmFwb3J0b2ludGl2XHUwMEU0bGkKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEB7MH0gRGF0ZS9UaW1lIG9mIGxhc3QgcmVwb3J0IGdlbmVyYXRpb24KKyMgQGNvbW1lbnQgSW5kaWNhdGlvbiBvZiB0aGUgdGltZSBvZiB0aGUgbGFzdCByZXBvcnQKK3JlcG9ydGVyX2xhc3RfcmVwb3J0PVZpaW1laXNpblwgcmFwb3J0dGlcOlwgezB9CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAezB9IERhdGUvVGltZSBvZiBuZXh0IHJlcG9ydAorIyBAY29tbWVudCBJbmRpY2F0aW9uIG9mIHdoZW4gdGhlIG5leHQgcmVwb3J0IHdpbGwgYmUgZ2VuZXJhdGVkCityZXBvcnRlcl9uZXh0X3JlcG9ydD1TZXVyYWF2YVwgcmFwb3J0dGlcOlwgezB9CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBJbmRpY2F0aW9uIG9mIHRoZSBvdXRwdXQgZGlyZWN0b3J5IGludG8gd2hpY2ggdGhlIHJlcG9ydHMgYXJlIHBsYWNlZAorcmVwb3J0ZXJfb3V0cHV0X2RpcmVjdG9yeT1UYWxsZXR1c2hha2VtaXN0b1w6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBBbiBpbmRpY2F0aW9uIG9mIHRoZSBuYW1lIG9mIHRoZSBvdXRwdXQgZmlsZSBmb3IgYSBwYXJ0aWN1bGFyIG91dHB1dCBmb3JtYXQKK3JlcG9ydGVyX291dHB1dF9maWxlPVRpZWRvc3RvblwgbmltaVw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBQYW5lbCB0aXRsZSBmb3Igc2V0dGluZyBpbnRlcnZhbCBvZiByZXBvcnRpbmcKK3JlcG9ydGVyX3BhbmVsX2ludGVydmFsPVJhcG9ydG9pbnRpdlx1MDBFNGxpCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBQYW5lbCB0aXRsZSBmb3IgY29uZmlndXJhYmxlIG9wdGlvbnMgb2YgdGhlIHJlcG9ydGluZworcmVwb3J0ZXJfcGFuZWxfb3B0aW9ucz1SYXBvcnRvaW50aXBhcmFtZXRyaXQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFN1YnBhbmVsIHRpdGxlIGZvciBjaG9vc2luZyBvdXRwdXQgZm9ybWF0cyBmb3IgdGhlIHJlcG9ydHMKK3JlcG9ydGVyX3BhbmVsX291dHB1dF9mb3JtYXQ9VHVsb3N0dXNtdW90bworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgUGFuZWwgdGl0bGUgZm9yIGluZGljYXRpb24gb2YgcnVubmluZyBzdGF0dXMgb2YgdGhlIHJlcG9ydGVyCityZXBvcnRlcl9wYW5lbF9zdGF0dXM9VGlsYW5uZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBTaG9ydCB0aXRsZSBmb3Igc2VsZWN0aW5nIGEgY29kZSBzY2FuIGNvbmZpZ3VyYXRpb24gZmlsZQorcmVwb3J0ZXJfcGVyZm9ybV9zY2FuPUNvZGVcIFNjYW5cIC10aWVkb3N0bworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgUXVpY2sgaW5kaWNhdGlvbiB0aGF0IHRoZSByZXBvcnRlciBpcyBhY3RpdmUgKHBlcmhhcHMgd2FpdGluZykKK3JlcG9ydGVyX3N0YXR1c19ydW5uaW5nPUtcdTAwRTR5bm5pc3NcdTAwRTQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFF1aWNrIHN0YXR1cyBpbmRpY2F0aW9uIHRoYXQgdGhlIHJlcG9ydGVyIGlzIG5vdCBhY3RpdmUKK3JlcG9ydGVyX3N0YXR1c19zdG9wcGVkPVB5c1x1MDBFNHl0ZXR0eQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgZGF5cyBvcHRpb24KK3JlcG9ydGVyX3RpbWVfZGF5cz1QXHUwMEU0aXZcdTAwRTRcdTAwRTQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IGV2ZXJ5IGRheSBvcHRpb24KK3JlcG9ydGVyX3RpbWVfZXZlcnlkYXk9Sm9rYVwgcFx1MDBFNGl2XHUwMEU0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBmcmlkYXkgb3B0aW9uCityZXBvcnRlcl90aW1lX2ZyaWRheT1QZXJqYW50YWkKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IGhvdXJzIG9wdGlvbgorcmVwb3J0ZXJfdGltZV9ob3Vycz1UdW50aWEKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IG1pbnV0ZXMgb3B0aW9uCityZXBvcnRlcl90aW1lX21pbnV0ZXM9TWludXV0dGlhCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBtb25kYXkgb3B0aW9uCityZXBvcnRlcl90aW1lX21vbmRheT1NYWFuYW50YWkKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IHNhdHVyZGF5IG9wdGlvbgorcmVwb3J0ZXJfdGltZV9zYXR1cmRheT1MYXVhbnRhaQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgc3VuZGF5IG9wdGlvbgorcmVwb3J0ZXJfdGltZV9zdW5kYXk9U3VubnVudGFpCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCB0aHVyc2RheSBvcHRpb24KK3JlcG9ydGVyX3RpbWVfdGh1cnNkYXk9VG9yc3RhaQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgdHVlc2RheSBvcHRpb24KK3JlcG9ydGVyX3RpbWVfdHVlc2RheT1UaWlzdGFpCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCB3ZWRuZXNkYXkgb3B0aW9uCityZXBvcnRlcl90aW1lX3dlZG5lc2RheT1LZXNraXZpaWtrbworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgVGl0bGUgb2YgdGhlIGFwcGxpY2F0aW9uCityZXNvdXJjZV9idW5kbGVfcmVwb3J0ZXI9UkJSZXBvcnRlcgorCisjCisjIEBncm91cCBTZWFyY2ggYW5kIFJlcGxhY2UKKyMKKyMgQGdyb3VwQ29tbWVudCBSZXNvdXJjZXMgZm91bmQgb24gdGhlIHNlYXJjaCB0YWIgcGFuZQorCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEdlbmVyYWwgc2VhcmNoIHRpdGxlCitzZWFyY2g9RXRzaQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBDaGVjayBib3ggb3B0aW9uIGZvciBtYWtpbmcgdGhlIHNlYXJjaCBjYXNlIHNlbnNpdGl2ZSBvciBub3QKK3NlYXJjaF9jYXNlX3NlbnNpdGl2ZT1Jc290XCBqYVwgcGllbmV0XCBraXJqYWltZXRcIG92YXRcIHNhbW9qYQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBDaGVjayBib3ggb3B0aW9uIGZvciBzZWFyY2hpbmcgdGhyb3VnaCByZXNvdXJjZSBjb21tZW50cworc2VhcmNoX2NvbW1lbnRzPUtvbW1lbnRpdAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUZXh0IGluZGljYXRpb24gb2YgdGhlIGZpZWxkIGZvciBlbnRlcmluZyB0ZXh0IHRvIHNlYXJjaCBvbgorc2VhcmNoX2ZpbmQ9RXRzaVw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IENoZWNrIGJveCBzZWxlY3Rpb24gZm9yIHNlYXJjaGluZyBvcHRpb24gdGhyb3VnaCByZXNvdXJjZSBrZXlzCitzZWFyY2hfa2V5cz1SZXN1cnNzaWF2YWltZXQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgVGV4dCBpbmRpY2F0aW9uIG9mIHRoZSBmaWVsZCBmb3IgZW50ZXJpbmcgdGV4dCBmb3IgcmVwbGFjaW5nIHRoZSBmb3VuZCB2YWx1ZQorc2VhcmNoX3JlcGxhY2U9S29ydmFhXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgQ2hlY2sgYm94IG9wdGlvbiBmb3Igc2VhcmNoaW5nIHRocm91Z2ggdHJhbnNsYXRpb24gdmFsdWVzCitzZWFyY2hfdmFsdWVzPUtcdTAwRTRcdTAwRTRublx1MDBGNmtzZXQKKworIworIyBAZ3JvdXAgVGFicworIworIyBAZ3JvdXBDb21tZW50IEdVSSBUYWJzIGluIHRoZSBtYWluIHBhbmVsCisKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0xMi0xNyBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IEdVSSBUYWIgZm9yIFRhYmJlZCBQYW5lIG92ZXIgdGhlIHRyZWUgc2hvd2luZyBhIHNpbmdsZSByZXNvdXJjZSBidW5kbGUgYW5kIGl0cyB2YXJpb3VzIGZpbGVzCit0YWJfYnVuZGxlPUJ1bmRsZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCBUYWIgZm9yIHRoZSBkaXNwbGF5IG9mIHRoZSB2YXJpb3VzIGdyb3VwcyBpbiB0aGUgYnVuZGxlCit0YWJfZ3JvdXBzPVJ5aG1cdTAwRTR0CisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMTItMTcgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBHVUkgVGFiIGZvciB0YWIgb3ZlciB0cmVlIHNob3dpbmcgYSByZXNvdXJjZSBidW5kbGUgcHJvamVjdAordGFiX3Byb2plY3Q9UHJvamVjdAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMDItMDggQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUaXRsZSBmb3IgcGFuZSBhbGxvd2luZyBmb3Igc2VhcmNoIGFuZCByZXBsYWNlIGZ1bmN0aW9ucwordGFiX3NlYXJjaD1FdHNpCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IFRhYiBmb3Igc3RhdGlzdGljcyBkaXNwbGF5IGZvciBlaXRoZXIgdGhlIFJlc291cmNlIEJ1bmRsZSBhcyBhIHdob2xlIG9yIHBhcnRpY3VsYXIgbGFuZ3VhZ2UgZmlsZXMKK3RhYl9zdGF0aXN0aWNzPVRpbGFzdG90aWVkb3QKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTAyLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFRhYiBmb3IgZGlzcGxheSBvZiB1bnRyYW5zbGF0ZWQgaXRlbXMgaW4gdGhlIGRpZmZlcmVudCBsYW5ndWFnZSBmaWxlcwordGFiX3VudHJhbnNsYXRlZD1LXHUwMEU0XHUwMEU0bnRcdTAwRTRtXHUwMEU0dHRcdTAwRjZtXHUwMEU0dAorCisjCisjIEBncm91cCBUcmFuc2xhdGlvbiBGaWxlIEdyb3VwcyBQYW5lCisjCisjIEBncm91cENvbW1lbnQgCisKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgQ29sdW1uIHRpdGxlIGZvciBpdGVtIGNvbW1lbnRzCitsYW5ndWFnZWdyb3VwX2NvbHVtbl9jb21tZW50PUtvbW1lbnR0aQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCBDb2x1bW4gdGl0bGUgZm9yIGl0ZW0ncyByZXNvdXJjZSBrZXkKK2xhbmd1YWdlZ3JvdXBfY29sdW1uX2tleT1SZXN1cnNzaW5cIGF2YWluCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IAorbGFuZ3VhZ2Vncm91cF9jb2x1bW5fdHJhbnNsYXRpb249S1x1MDBFNFx1MDBFNG5uXHUwMEY2cworCisjCisjIEBncm91cCBUcmFuc2xhdGlvbiBGaWxlIFN0YXRpc3RpY3MgUGFuZQorIworIyBAZ3JvdXBDb21tZW50IFRyYW5zbGF0aW9ucyBmb3Igc3RyaW5ncyBpbiB0aGUgbGFuZ3VhZ2UgZmlsZSBzdGF0aXN0aWNzIHBhbmUKKworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCBBIGNvbW1lbnQgZ2l2ZW4gdG8gdGhlIGZpbGUKK2xhbmd1YWdlc3RhdHNfY29tbWVudD1Lb21tZW50dGlcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCBUaGUgY291bnRyeSBiZWluZyBkZXNjcmliZWQgYnkgdGhlIGZpbGUKK2xhbmd1YWdlc3RhdHNfY291bnRyeT1NYWFcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCBUaGUgbnVtYmVyIG9mIHJlc291cmNlcyBpbiB0aGUgZmlsZQorbGFuZ3VhZ2VzdGF0c19pdGVtX2NvdW50PVJlc3Vyc3NpZW5cIG1cdTAwRTRcdTAwRTRyXHUwMEU0XCB0XHUwMEU0c3NcdTAwRTRcIHJlc3Vyc3NpdGllZG9zdG9zc2FcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCBUaGUgbGFuZ3VhZ2UgZGVzY3JpYmVkIGJ5IHRoZSBmaWxlCitsYW5ndWFnZXN0YXRzX2xhbmd1YWdlPUtpZWxpXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgVGhlIG5hbWUgb2YgYSBwZXJzb24gcmVzcG9uc2libGUgZm9yIHRoZSB0cmFuc2xhdGlvbnMgaW4gdGhpcyBsYW5ndWFnZSBmaWxlCitsYW5ndWFnZXN0YXRzX21hbmFnZXI9UmVzdXJzc2l0aWVkb3N0b25cIG9taXN0YWphXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgVGhlIG5hbWUgZ2l2ZW4gdG8gdGhlIGxhbmd1YWdlIGZpbGUKK2xhbmd1YWdlc3RhdHNfdGl0bGU9UmVzdXJzc2l0aWVkb3N0b25cIG5pbWlcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDAtMTEtMDkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEp1c3NpIE15bGx5beRraQorIyBAY29tbWVudCBOdW1iZXIgb2YgcmVzb3VyY2VzIG5lZWRpbmcgdHJhbnNsYXRpb24gaW4gdGhlIGZpbGUKK2xhbmd1YWdlc3RhdHNfdHJhbnNsYXRpb25fY291bnQ9S1x1MDBFNFx1MDBFNG50XHUwMEU0bVx1MDBFNHR0XHUwMEY2bWllblwgcmVzdXJzc2llblwgbVx1MDBFNFx1MDBFNHJcdTAwRTRcIHRcdTAwRTRzc1x1MDBFNFwgcmVzdXJzc2l0aWVkb3N0b3NzYVw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IFRoZSBsYW5ndWFnZS9yZWdpb24gdmFyaWFudCBkZXNjcmliZWQgYnkgdGhlIGZpbGUKK2xhbmd1YWdlc3RhdHNfdmFyaWFudD1NdXVubmVsbWFcOgorCisjCisjIEBncm91cCBUcmFuc2xhdGlvbiBGaWxlIFVudHJhbnNsYXRlZCBJdGVtcyBQYW5lCisjCisjIEBncm91cENvbW1lbnQgCisKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgVGhlIGNvbHVtbiB0aXRsZSBmb3IgZ3JvdXAgbmFtZXMgb2YgaXRlbXMgaW4gdGhlIHJvd3MKK2xhbmd1YWdldW50cmFuc19jb2x1bW5fZ3JvdXA9UmVzdXJzc2lyeWhtXHUwMEU0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMC0xMS0wOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSnVzc2kgTXlsbHlt5GtpCisjIEBjb21tZW50IFRoZSBrZXkgb2YgdGhlIGl0ZW0gYSByb3cKK2xhbmd1YWdldW50cmFuc19jb2x1bW5fa2V5PVJlc3Vyc3NpblwgYXZhaW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAwLTExLTA5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKdXNzaSBNeWxseW3ka2kKKyMgQGNvbW1lbnQgVGhlIHRyYW5zbGF0ZWQgdmFsdWUgb2YgYW4gaXRlbSBpbiBhIHJvdworbGFuZ3VhZ2V1bnRyYW5zX2NvbHVtbl90cmFuc2xhdGlvbj1LXHUwMEU0XHUwMEU0bm5cdTAwRjZzCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0wMi0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFBhbmVsIHRpdGxlIGNvdmVyaW5nIGJ1dHRvbnMgdGhhdCBhcHBseSB0byBhIHNlbGVjdGVkIHJlc291cmNlIGZyb20gYSB0YWJsZSBvZiByZXNvdXJjZXMKK2xhbmd1YWdldW50cmFuc19zZWxlY3RlZF9yZXNvdXJjZXNfb3B0aW9ucz1WYWxpdHR1amVuXCByZXN1cnNzaWVuXCBwYXJhbWV0cml0CmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvY29tL2libS9yYm0vcmVzb3VyY2VzL1JCTWFuYWdlcl9zdi5wcm9wZXJ0aWVzIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL3Jlc291cmNlcy9SQk1hbmFnZXJfc3YucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTc2ZTkwCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL3Jlc291cmNlcy9SQk1hbmFnZXJfc3YucHJvcGVydGllcwpAQCAtMCwwICsxLDEyMTYgQEAKKyMgQGZpbGUgICAgICAgICAgUkJNYW5hZ2VyCisjIEBmaWxlRW5jb2RpbmcgIHN2CisjIEBmaWxlTGFuZ3VhZ2UgIFN3ZWRpc2gKKyMgQGZpbGVDb3VudHJ5ICAgCisjIEBmaWxlVmFyaWFudCAgIAorIyBAZmlsZU1hbmFnZXIgICBTdGVmYW4gRWRsdW5kCisjIEBmaWxlQ29tbWVudCAgIAorCisKKyMKKyMgQGdyb3VwIEJhc2UgQ2xhc3MgR3JvdXBzIFBhbmUKKyMKKyMgQGdyb3VwQ29tbWVudCBUcmFuc2xhdGlvbiBJdGVtcyBmb3IgdGhlIEJhc2UgQ2xhc3MgR3JvdXAgdGFiYmVkIHBhbmUKKworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgCitiYXNlZ3JvdXBfZ3JvdXBfY29tbWVudD1HcnVwcFwga29tbWVudGFyCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCAKK2Jhc2Vncm91cF9ncm91cF9uYW1lPUdydXBwXCBuYW1uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCAKK2Jhc2Vncm91cF9ncm91cF9vcHRpb25zPVJlc3Vyc2dydXBwXCBhbHRlcm5hdGl2CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCAKK2Jhc2Vncm91cF9pdGVtX29wdGlvbnM9UmVzdXJzXCBzYWtcIGFsdGVybmF0aXYKKworIworIyBAZ3JvdXAgQmFzZSBDbGFzcyBTdGF0aXN0aWNzIFBhbmUKKyMKKyMgQGdyb3VwQ29tbWVudCBBbGwgdHJhbnNsYXRpb25zIGZvciBzdHJpbmdzIGFwcGVhcmluZyBvbiB0aGUgc3RhdGlzdGljcyBwYW5lIGZvciB0aGUgYmFzZSBjbGFzcworCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCAKK2Jhc2VzdGF0c19kdXBsaWNhdGVzX2NvdW50PUFudGFsXCBrb3BpZXJhZGVcIHJlc3Vyc255Y2tsYXIKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IAorYmFzZXN0YXRzX2ZpbGVfY291bnQ9QW50YWxcIHJlc3Vyc2ZpbGVyCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCAKK2Jhc2VzdGF0c19ncm91cF9jb3VudD1BbnRhbFwgcmVzdXJzZ3J1cHBlcgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgCitiYXNlc3RhdHNfZ3JvdXBfZ3JvdXA9UmVzdXJzXCBncnVwcGVyCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCAKK2Jhc2VzdGF0c19pdGVtX2NvdW50PUFudGFsXCByZXN1cnNcIHNha2VyCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCAKK2Jhc2VzdGF0c19pdGVtX2dyb3VwPVJlc3Vyc3NhaworCisjCisjIEBncm91cCBCYXNlIENsYXNzIFVudHJhbnNsYXRlZCBJdGVtcyBQYW5lCisjCisjIEBncm91cENvbW1lbnQgVHJhbnNsYXRpb25zIGFwcGVhcmluZyBvbiB0aGUgQmFzZSBDbGFzcyBVbnRyYW5zbGF0ZWQgSXRlbXMgcGFuZQorCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBJbmRpY2F0aW9uIG9mIHRoZSBmaWxlIGJlaW5nIHZpZXdlZAorYmFzZXVudHJhbnNfZmlsZT1GaWxcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgSW5kaWNhdGlvbiBvZiB0aGUgbnVtYmVyIG9mIHJlc291cmNlIGl0ZW1zIG5vdCB0cmFuc2xhdGVkIGluIHRoZSBmaWxlCitiYXNldW50cmFuc191bnRyYW5zX2NvdW50PUFudGFsXCBvb3ZlcnNhdHRhXCBzYWtlcgorCisjCisjIEBncm91cCBCdXR0b24gTmFtZXMKKyMKKyMgQGdyb3VwQ29tbWVudCBUaGUgbmFtZXMgZGlzcGxheWVkIG9uIHRoZSB2YXJpb3VzIGJ1dHRvbnMKKworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgCitiYXNlc3RhdHNfZmlsZV9ncm91cD1SZXN1cnNcIGZpbGVyCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBCdXR0b24gZm9yIGNyZWF0aW5nIGEgbmV3IHJlc291cmNlIGxhbmd1YWdlIGZpbGUKK2J1dHRvbl9hZGRfZmlsZT1MYWdnXCB0aWxsXCBueVwgcmVzdXJzZmlsCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yMyBAbW9kaWZpZWQgMjAwMS0wMS0yMyBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorYnV0dG9uX2FkZF9maWxlX3RyaWdnZXI9bgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgQnV0dG9uIGZvciBjcmVhdGluZyBhIG5ldyByZXNvdXJjZSBncm91cAorYnV0dG9uX2FkZF9ncm91cD1MYWdnXCB0aWxsXCByZXN1cnNcIGdydXBwCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yMyBAbW9kaWZpZWQgMjAwMS0wMS0yMyBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorYnV0dG9uX2FkZF9ncm91cF90cmlnZ2VyPWcKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IEJ1dHRvbiBmb3IgY3JlYXRpbmcgYSBuZXcgcmVzb3VyY2UgdHJhbnNsYXRpb24gaXRlbQorYnV0dG9uX2FkZF9yZXNvdXJjZT1MYWdnXCB0aWxsXCByZXN1cnNzYWsKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTIzIEBtb2RpZmllZCAyMDAxLTAxLTIzIEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCitidXR0b25fYWRkX3Jlc291cmNlX3RyaWdnZXI9cgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgYSBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBHZW5lcmljIGJ1dHRvbiBmb3IgY2FuY2VsaW5nIGFjdGlvbnMKK2J1dHRvbl9jYW5jZWw9QXZicnl0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yNiBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEdlbmVyaWMgYnV0dG9uIGZvciBhIGNob2ljZSBvciBzZWxlY3Rpb24gb3B0aW9uCitidXR0b25fY2hvb3NlPVZcdTAwRTRsagorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjYgQG1vZGlmaWVkIDIwMDEtMDEtMjYgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK2J1dHRvbl9jaG9vc2VfdHJpZ2dlcj1jCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBCdXR0b24gZm9yIGdlbmVyaWMgY3JlYXRpb24gb2YgZ3JvdXBzLCBpdGVtcywgZmlsZXMsIGV0Yy4KK2J1dHRvbl9jcmVhdGU9U2thcGEKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIGEgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgRm9yIGNyZWF0aW9uIG9mIGEgcmVzb3VyY2UgZ3JvdXAKK2J1dHRvbl9jcmVhdGVfZ3JvdXA9U2thcGFcIGdydXBwCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yMyBAbW9kaWZpZWQgMjAwMS0wMS0yMyBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorYnV0dG9uX2NyZWF0ZV9ncm91cF90cmlnZ2VyPWcKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTAyIEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgQnV0dG9uIHRpdGxlIGZvciBjcmVhdGluZyBhbiBpdGVtIHRoZW4gY29udGludWluZyBjcmVhdGluZyBtb3JlIGl0ZW1zCitidXR0b25fY3JlYXRlX21vcmU9U2thcGFcIG9jaFwgRm9ydHNcdTAwRTR0dAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDIgQG1vZGlmaWVkIDIwMDEtMDItMDIgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK2J1dHRvbl9jcmVhdGVfbW9yZV90cmlnZ2VyPXIKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIGEgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgQnV0dG9uIGZvciBjcmVhdGluZyBhIHJlc291cmNlIHRyYW5zbGF0aW9uIGl0ZW0KK2J1dHRvbl9jcmVhdGVfcmVzb3VyY2U9U2thcGFcIHJlc3VycworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjMgQG1vZGlmaWVkIDIwMDEtMDEtMjMgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK2J1dHRvbl9jcmVhdGVfcmVzb3VyY2VfdHJpZ2dlcj1jCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wMiBAbW9kaWZpZWQgMjAwMS0wMi0wMiBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorYnV0dG9uX2NyZWF0ZV90cmlnZ2VyPWMKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIGEgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgQnV0dG9uIGZvciByZW1vdmluZyBhIGdyb3VwIGFuZCBpdHMgY29udGVudHMKK2J1dHRvbl9kZWxldGVfZ3JvdXA9VGFcIGJvcnRcIGdydXBwCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBhIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IEJ1dHRvbiBmb3IgcGVybWFuZW50bHkgcmVtb3ZpbmcgYSByZXNvdXJjZSBmcm9tIHRoZSBidW5kbGUKK2J1dHRvbl9kZWxldGVfcmVzb3VyY2U9VGFcIGJvcnRcIHJlc3VycworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjMgQG1vZGlmaWVkIDIwMDEtMDEtMjMgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK2J1dHRvbl9kZWxldGVfcmVzb3VyY2VfdHJpZ2dlcj1kCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBHZW5lcmljIGVkaXQgYnV0dG9uCitidXR0b25fZWRpdD1FZGl0ZXJhCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBhIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IEJ1dHRvbiBmb3IgZWRpdGluZyBncm91cCBuYW1lIGFuZCBjb21tZW50CitidXR0b25fZWRpdF9ncm91cD1FZGl0ZXJhXCBncnVwcAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgYSBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBCdXR0b24gZm9yIGVkaXRpbmcgcmVzb3VyY2UgaW5mb3JtYXRpb24sIGluY2x1ZGluZyBrZXkgYW5kIHRyYW5zbGF0aW9uCitidXR0b25fZWRpdF9yZXNvdXJjZT1FZGl0ZXJhXCByZXN1cnMKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTIzIEBtb2RpZmllZCAyMDAxLTAxLTIzIEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCitidXR0b25fZWRpdF9yZXNvdXJjZV90cmlnZ2VyPWUKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTI2IEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgQnV0dG9uIHRpdGxlIGZvciBpbml0aWF0aW5nIGFuIGltcG9ydCBvZiByZXNvdXJjZXMgZnJvbSBhbiBhbHRlcm5hdGUgc291cmNlCitidXR0b25faW1wb3J0PUltcG9ydGVyYQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjYgQG1vZGlmaWVkIDIwMDEtMDEtMjYgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK2J1dHRvbl9pbXBvcnRfdHJpZ2dlcj1pCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yMyBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEJ1dHRvbiBhbGxvd3MgYSBzZWxlY3RlZCByZXNvdXJjZSB0byBiZSBtYXJrZWQgYXMgdHJhbnNsYXRlZCB3aXRob3V0IGZ1cnRoZXIgZWRpdGluZworYnV0dG9uX21hcmtfdHJhbnNsYXRlZD1NYXJrZXJhXCBzb21cIFx1MDBGNnZlcnNhdHQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTIzIEBtb2RpZmllZCAyMDAxLTAxLTIzIEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCitidXR0b25fbWFya190cmFuc2xhdGVkX3RyaWdnZXI9dAorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTExLTIwIEBtb2RpZmllZCAyMDAxLTExLTIwIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgQnV0dG9uIGZvciBhZGRpbmcgdGhlIGN1cnJlbnQgcmVzb3VyY2UgYnVuZGxlIGluIHRoZSBtYWluIGFwcGxpY2F0aW9uIHRvIHRoZSBwcm9qZWN0CitidXR0b25fcHJvamVjdF9hZGQ9QWRkXCBDdXJyZW50XCBCdW5kbGUKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMS0yMCBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IAorYnV0dG9uX3Byb2plY3RfYWRkX3RyaWdnZXI9YQorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTExLTIwIEBtb2RpZmllZCAyMDAxLTExLTIwIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgQnV0dG9uIGZvciBjbG9zaW5nIHRoZSBwcm9qZWN0IHdpbmRvdworYnV0dG9uX3Byb2plY3RfY2xvc2U9Q2xvc2VcIFByb2plY3QKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMS0yMCBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IAorYnV0dG9uX3Byb2plY3RfY2xvc2VfdHJpZ2dlcj1jCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTEtMjAgQG1vZGlmaWVkIDIwMDEtMTEtMjAgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBCdXR0b24gZm9yIGNyZWF0aW5nIGEgbmV3IHJlc291cmNlIGJ1bmRsZSBwcm9qZWN0CitidXR0b25fcHJvamVjdF9uZXc9TmV3XCBQcm9qZWN0CisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTEtMjAgQG1vZGlmaWVkIDIwMDEtMTEtMjAgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCAKK2J1dHRvbl9wcm9qZWN0X25ld190cmlnZ2VyPW4KKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMS0yMCBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IEJ1dHRvbiBmb3Igb3BlbmluZyBhIHByb2plY3QgZmlsZQorYnV0dG9uX3Byb2plY3Rfb3Blbj1PcGVuXCBQcm9qZWN0CisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTEtMjAgQG1vZGlmaWVkIDIwMDEtMTEtMjAgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCAKK2J1dHRvbl9wcm9qZWN0X29wZW5fdHJpZ2dlcj1vCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTEtMjAgQG1vZGlmaWVkIDIwMDEtMTEtMjAgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBCdXR0b24gZm9yIHJlbW92aW5nIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcmVzb3VyY2UgYnVuZGxlIGZyb20gdGhlIHByb2plY3QKK2J1dHRvbl9wcm9qZWN0X3JlbW92ZT1SZW1vdmVcIFNlbGVjdGlvbgorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTExLTIwIEBtb2RpZmllZCAyMDAxLTExLTIwIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgCitidXR0b25fcHJvamVjdF9yZW1vdmVfdHJpZ2dlcj1yCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTEtMjAgQG1vZGlmaWVkIDIwMDEtMTEtMjAgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBCdXR0b24gZm9yIGNhdXNpbmcgdGhlIHNlbGVjdGVkIHJlc291cmNlIGJ1bmRsZSB0byBiZSB0aGUgb25lIGJlaW5nIGVkaXRlZCBpbiB0aGUgbWFpbiBhcHBsaWNhdGlvbgorYnV0dG9uX3Byb2plY3Rfc2VsZWN0PUVkaXRcIFNlbGVjdGVkCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTEtMjAgQG1vZGlmaWVkIDIwMDEtMTEtMjAgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCAKK2J1dHRvbl9wcm9qZWN0X3NlbGVjdF90cmlnZ2VyPWUKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTA2IEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgVGl0bGUgZm9yIHBlcmZvcm1pbmcgYSBjb21wbGV0ZSBzZWFyY2gKK2J1dHRvbl9zZWFyY2hfZmluZF9hbGw9SGl0dGFcIGFsbGEKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTA2IEBtb2RpZmllZCAyMDAxLTAyLTA2IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCitidXR0b25fc2VhcmNoX2ZpbmRfYWxsX3RyaWdnZXI9ZgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDYgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUaXRsZSBmb3IgcGVyZm9ybWluZyBjb21wbGV0ZSBzZWFyY2ggYW5kIHJlcGxhY2UKK2J1dHRvbl9zZWFyY2hfcmVwbGFjZV9hbGw9RXJzXHUwMEU0dHRcIGFsbGEKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTA2IEBtb2RpZmllZCAyMDAxLTAyLTA2IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCitidXR0b25fc2VhcmNoX3JlcGxhY2VfYWxsX3RyaWdnZXI9cgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgR2VuZXJpYyBidXR0b24gZm9yIHVwZGF0aW5nIGluZm9ybWF0aW9uCitidXR0b25fdXBkYXRlPVVwZGF0ZXJhCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yMyBAbW9kaWZpZWQgMjAwMS0wMS0yMyBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorYnV0dG9uX3VwZGF0ZV90cmlnZ2VyPXUKKworIworIyBAZ3JvdXAgRGlhbG9ncworIworIyBAZ3JvdXBDb21tZW50IFRyYW5zbGF0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIGFwcGxpY2F0aW9ucyB2YXJpb3VzIGRpYWxvZyBib3hlcworCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCAKK2RhaWxvZ190aXRsZV9wcmVmZXJlbmNlcz1JbnN0YWxsbmluZ2FyCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBJbmRpY2F0aW9uIG9mIHdldGhlciBvciBub3QgYSBuZXcgZmlsZSB3aWxsIGJlIHBvcHVsYXRlZCBmcm9tIHRoZSBlbGVtZW50cyBpbiB0aGUgYmFzZSBjbGFzcworZGlhbG9nX2NoZWNrYm94X2NvcHlfZWxlbWVudHM9S29waWVyYVwgc2FrZXJcIGZyYW5cIGJhc2tsYXNzXCB0aWxsXCBueVwgZmlsCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBJbmRpY2F0b3Igb2Ygd2V0aGVyIGFuIGl0ZW0gaXMgdHJhbnNsYXRlZCBvciBub3QKK2RpYWxvZ19jaGVja2JveF90cmFuc2xhdGVkPU92ZXJzYXR0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCAKK2RpYWxvZ19jb21tZW50PUtvbWVudGFyXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IAorZGlhbG9nX2NvdW50cnk9TGFuZAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgCitkaWFsb2dfY3JlYXRlZD1Ta2FwYWRcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgCitkaWFsb2dfY3JlYXRvcj1Ta2FwYXJlXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEB7MX0gVGhlIGRhdGUKKyMgQHswfSBUaGUgbmFtZSBvZiB0aGUgcGVyc29uIGludm9sdmVkCisjIEBjb21tZW50IFRoZSBkYXRlIGFuZCBwZXJzb24gYXNzb2NpYXRlZCB3aXRoIGEgY3JlYXRpb24gb3IgbW9kaWZpY2F0aW9uIG9mIGFuIGl0ZW0KK2RpYWxvZ19kYXRlX3BlcnNvbj17MH1cIGF2XCB7MX0KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IAorZGlhbG9nX2RlZmF1bHRfY29tbWVudD1Ta29uc3ZhcmRlXCBmb3JcIGtvbW1lbnRhclw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCAKK2RpYWxvZ19kZWZhdWx0X3RyYW5zbGF0aW9uPVNrb25zdmFyZGVcIGZvclwgb3ZlcnNhdHRuaW5nCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCAKK2RpYWxvZ19kZWxldGVfZmlsZT1UYVwgYm9ydFwgcmVzdXJzZmlsCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCAKK2RpYWxvZ19kZWxldGVfZ3JvdXA9VGFcIGJvcnRcIHJlc3Vyc1wgZ3J1cHAKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IAorZGlhbG9nX2RlbGV0ZV9pdGVtPVRhXCBib3J0XCByZXN1cnNzYWsKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTA2LTI3IEBtb2RpZmllZCAyMDAxLTA3LTAyIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgV2FybmluZyBkaXNwbGF5ZWQgd2hlbiBhIHVzZXIgYXNrcyBmb3IgYSBkZWxldGlvbiBvZiBhIGZpbGUuIFByb21wdHMgZm9yICdZZXMnIG9yICdObycKK2RpYWxvZ19kZWxldGVfd2FybmluZz1WYXJuaW5nXCFcIFJhZGVyaW5nZW5cIGthblwgaW50ZVwgXHUwMEU1bmdyYXMuXG5cdTAwQzRyXCBkdVwgc1x1MDBFNGtlclwgYXR0XCBkdVwgdmlsbFwgZm9ydHNcdTAwRTR0dGE/CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCAKK2RpYWxvZ19lbmNvZGluZz1Lb2RuaW5nXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IAorZGlhbG9nX2ZpbGVfY29tbWVudD1Lb21tZW50YXJcIGZvclwgcmVzdXJzZmlsXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IAorZGlhbG9nX2ZpbGVfZmlsdGVyX2Rlc2NyaXB0aW9uPUJhc2tsYXNzXCBlZ2Vuc2thcHNmaWwKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTA2IEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgRGVzY3JpcHRpb24gb2YgRmlsZSBGaWx0ZXIgZm9yIFJCUmVwb3J0ZXIgWE1MIHNjYW4gY29uZmlndXJhdGlvbiBmaWxlcworZGlhbG9nX2ZpbGVfZmlsdGVyX2Rlc2NyaXB0aW9uX3NjYW49WE1MXCBSQlJlcG9ydGVyXCBsXHUwMEU0c1wgZmlsZXIKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IAorZGlhbG9nX2ZpbGVfaW5mbz1GaWxcIGluZm9ybWF0aW9uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCAKK2RpYWxvZ19maWxlX21hbmFnZXI9TmFtblwgZm9yXCByZXN1cnNhZ2FyZVw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCAKK2RpYWxvZ19maWxlX3RpdGxlPVRpdGVsXCBmb3JcIHJlc3Vyc2ZpbFw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCAKK2RpYWxvZ19ncm91cD1HcnVwcFwgbmFtblw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCAKK2RpYWxvZ19ncm91cF9jb21tZW50PUdydXBwXCBrb21tZW50YXJcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgCitkaWFsb2dfa2V5PU55Y2tlbFw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCAKK2RpYWxvZ19sYW5ndWFnZT1TcHJhaworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgCitkaWFsb2dfbG9va3Vwcz1VcHBsZXRuaW5nYXJcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgCitkaWFsb2dfbW9kaWZpZWQ9U2VuYXN0XCBtb2RpZmllcmFkXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IAorZGlhbG9nX21vZGlmaWVyPVNlbmFzdFwgbW9kaWZpZXJhZFwgYXZcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgVGhlIG5hbWUgb2YgYSBsYW5ndWFnZSwgY291bnRyeSwgb3IgdmFyaWFudCBvZiBhIGxhbmd1YWdlIGZpbGUKK2RpYWxvZ19uYW1lPU5hbW5cOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgUHJvbXB0cyB0aGUgdXNlciB0byBlbnRlciBhIG5hbWUgZm9yIHRoZSByZXNvdXJjZSBidW5kbGUsIGJlZm9yZSBjcmVhdGluZyB0aGF0IGJ1bmRsZQorZGlhbG9nX25ld19iYXNlY2xhc3M9TWF0YVwgaW5cIGVuXCBueVwgYmFza2xhc3NuYW1uXCBmb3JcIHJlc3Vyc2ZpbGVuLgorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTEyLTE5IEBtb2RpZmllZCAyMDAxLTEyLTE5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgRGlhbG9nIHBvcHVwIHdpbmRvdyB0ZXh0IHByb21wdGluZyB0aGUgdXNlciBmb3IgdGhlIG5hbWUgb2YgYSByZXNvdXJjZSBidW5kbGUgcHJvamVjdAorZGlhbG9nX25ld19wcm9qZWN0PVBsZWFzZVwgZW50ZXJcIGFcIHRpdGxlXCBmb3JcIHlvdXJcIG5ld1wgUmVzb3VyY2VcIEJ1bmRsZVwgUHJvamVjdC4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IEEgZGVzY3JpcHRpb24gb2YgdGhlIGZpbGVzIG1ha2luZyBpdCB0aHJvdWdoIHRoZSBmaWx0ZXIgdXBvbiBvcGVuaW5nIGEgcmVzb3VyY2UgYnVuZGxlCitkaWFsb2dfb3Blbl9maWxlX2ZpbHRlcj1CYXNrbGFzc1wgZWdlbnNrYXBzZmlsCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBUaGlzIGlzIGEgc2VjdGlvbiBoZWFkaW5nIGZvciBzZXR0aW5nIHRoZSBsb2NhbGUKK2RpYWxvZ19wcmVmZXJlbmNlc19sb2NhbGU9TG9rYWwKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IExvY2FsZXMgY3VycmVudGx5IGRlZmluZWQgaW4gdGhlIHByb3BlcnRpZXMgZmlsZXMgZm9yIHRoZSBhcHBsaWNhdGlvbgorZGlhbG9nX3ByZWZlcmVuY2VzX2xvY2FsZV9kZWZpbmVkPURlZmluaWVyYWRcIGZvclwgUkJNYW5hZ2VyCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IAorZGlhbG9nX3ByZWZlcmVuY2VzX2xvY2FsZV9pc289SVNPXCBTdGFuZGFyZGVyXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IExvY2FsZXMgdGhhdCBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBob3N0IEphdmEgVmlydHVhbCBNYWNoaW5lCitkaWFsb2dfcHJlZmVyZW5jZXNfbG9jYWxlX21hY2hpbmU9S29tcGF0aWJlbFwgdXRydXN0bmluZ1w6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IAorZGlhbG9nX3ByZWZlcmVuY2VzX2xvY2FsZV93YXJuaW5nPU9CUy5cIEFuZHJpbmdhclwgdGlsbFwgbG9rYWxlblwgYXJcIGludGVcIGFrdGl2YVwgdGlsbHNcIGFwcGxpa2F0b2luZW5cIGF0ZXJzdGFydGFzCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCAKK2RpYWxvZ19wcmVmZXJlbmNlc19sb29rYW5kZmVlbD0nTG9va1wgYW5kXCBGZWVsJworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgCitkaWFsb2dfcHJlZmVyZW5jZXNfdXNlcm5hbWU9QW52YW5kYXJuYW1uXDoKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMS0yMCBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IERlc2NyaXB0b3IgdGhhdCBnb2VzIGludG8gR1VJIGZpbGUgY2hvb3NlcgorZGlhbG9nX3Byb2plY3RfZmlsZV9maWx0ZXJfZGVzY3JpcHRpb249UkJNYW5hZ2VyXCBQcm9qZWN0XCBGaWxlcworIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTEyLTE3IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgRmlsZSBGaWx0ZXIgZGVzY3JpcHRpb24gZm9yIHJlc291cmNlIGJ1bmRsZSBwcm9qZWN0IGZpbGVzCitkaWFsb2dfcHJvamVjdF9maWx0ZXJfZGVzY3JpcHRpb249UmVzb3VyY2VcIEJ1bmRsZVwgUHJvamVjdHMKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMS0yMCBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IEFuIGluZGljYXRpb24gdGhhdCBubyBwcm9qZWN0IGlzIG9wZW4sIHBsYWNlZCBpbiB0aGUgdGl0bGUgb2YgdGhlIGRpYWxvZyB3aGVyZSB0aGUgcHJvamVjdCBuYW1lIHdvdWxkIG5vcm1hbGx5IGdvCitkaWFsb2dfcHJvamVjdF9ub25lX3NlbGVjdGVkPU5vXCBBY3RpdmVcIFByb2plY3QKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMS0yMCBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEB7MH0gVGhlIG5hbWUgb2YgdGhlIHByb2plY3QKKyMgQGNvbW1lbnQgVGl0bGUgZm9yIHRoZSB3aW5kb3cgc2hvd2luZyBhbGwgdGhlIHJlc291cmNlIGJ1bmRsZXMgaW4gYSBwcm9qZWN0CitkaWFsb2dfcHJvamVjdF90aXRsZT1SZXNvdXJjZVwgQnVuZGxlXCBQcm9qZWN0XDpcIHswfQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgUHJvbXB0cyB0aGUgdXNlciBpZiB0aGV5IHdvdWxkIGxpa2UgdG8gc2F2ZSBjaGFuZ2VzIGJlZm9yZSBleGl0aW5nCitkaWFsb2dfcXVpdF9zYXZlPVZpbGxcIGR1XCBzcGFyYVwgaW5uYW5cIGR1XCBhdnNsdXRhclwgUkJNYW5hZ2VyPworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMTAgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBBIGdlbmVyaWMgcHJvcG1wdCB0byBhc2sgdGhlIHVzZXIgaWYgdGhleSB3aXNoIHRvIHNhdmUgY2hhbmdlcworZGlhbG9nX3NhdmU9VmlsbFwgZHVcIHNwYXJhXCBhbmRyaW5nYXJcIHRpbGxcIHJlc3Vyc2dydXBlbj8KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IAorZGlhbG9nX3NlYXJjaF9vcHRpb25zPVNva25pbmdzYWx0ZXJuYXRpdgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgCitkaWFsb2dfc2VhcmNoX3BhcmFtPUxldGFcIGVmdGVyXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IFRoZSB0aXRsZSBvZiB0aGUgYWJvdXQgZGlhbG9nIGJveAorZGlhbG9nX3RpdGxlX2Fib3V0X3JibWFuYWdlcj1PbVwgUkJNYW5hZ2VyCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yMiBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFRpdGxlIGZvciBkaWFsb2cgcHJvbXB0aW5nIGZvciBkZWxldGlvbiBvZiBhbiBlbnRpcmUgcmVzb3VyY2UgZ3JvdXAKK2RpYWxvZ190aXRsZV9kZWxldGVfZ3JvdXA9VGFcIGJvcnRcIHJlc3Vyc1wgZ3J1cHAKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTIyIEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgVGl0bGUgd2hlbiBwcm9tcHRpbmcgdG8gZGVsZXRlIGEgcmVzb3VyY2UKK2RpYWxvZ190aXRsZV9kZWxldGVfaXRlbT1UYVwgYm9ydFwgcmVzdXJzCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCAKK2RpYWxvZ190aXRsZV9lZGl0X2dyb3VwPUVkaXRlcmFcIFJlc3Vyc2dydXBwCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCAKK2RpYWxvZ190aXRsZV9lZGl0X2l0ZW09RWRpdGVyYVwgcmVzdXJzc2FrCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTItMTkgQG1vZGlmaWVkIDIwMDEtMTItMTkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCAKK2RpYWxvZ190aXRsZV9lcnJvcj1FcnJvcgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgCitkaWFsb2dfdGl0bGVfZXJyb3JfY3JlYXRpbmdfYnVuZGxlPUZlbFwgdmlkXCBza2FwYW5kZVwgYXZcIHJlc3Vyc2ZpbAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjIgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBEaWFsb2cgdGl0bGUgd2hlbiBvcGVuaW5nIGEgcmVzb3VyY2UgYnVuZGxlIG5vdCBjcmVhdGVkIGJ5IFJCTWFuYWdlcgorZGlhbG9nX3RpdGxlX2Vycm9yX25vdF9yYm1hbmFnZXJfZm9ybWF0PUZlbFw6XCBPbFx1MDBFNHNiYXJcIHJlc3Vyc2dydXBwCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wNi0yNyBAbW9kaWZpZWQgMjAwMS0wNy0wMiBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IFRpdGxlIG9uIGEgd2FybmluZyBkaWFsb2cgdGhhdCBJL08gbWFsZnVuY3Rpb25lZCBvcGVuaW5nIGEgZmlsZQorZGlhbG9nX3RpdGxlX2Vycm9yX29wZW5pbmdfZmlsZT1GZWxcIHZpZFwgXHUwMEY2cHBuYW5kZVwgYXZcIGZpbAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDYtMjcgQG1vZGlmaWVkIDIwMDEtMDctMDIgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBEaWFsb2cgdGl0bGUgZm9yIGEgZGlhbG9nIGJveCBmb3IgZW50ZXJpbmcgc3BlY2lhbCBwYXJhbWV0ZXJzIG5lZWRlZCB0byBleHBvcnQgYSByZXNvdXJjZSBidW5kbGUgdG8gamF2YSBjbGFzcyBjb2RlCitkaWFsb2dfdGl0bGVfZXhwb3J0X2phdmFfb3B0aW9ucz1FeHBvcnRcIHBhcmFtZXRyYXJcOlwgSmF2YVwga2xhc3MKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTA3IEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgVGl0bGUgZm9yIGEgZGlhbG9nIHdpdGggYSBwcm9ncmVzcyBiYXIgZ292ZXJuaW5nIGltcG9ydCBzdGF0dXMKK2RpYWxvZ190aXRsZV9pbXBvcnRfcHJvZ3Jlc3M9SW1wb3J0ZXJpbmdzZnJhbWdcdTAwRTVuZworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgVGl0bGUgZm9yIGNyZWF0aW5nIG5ldyBidW5kbGUKK2RpYWxvZ190aXRsZV9uZXdfYnVuZGxlPVNrYXBhXCBueVwgcmVzdXJzZmlsCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBUaXRsZSBmb3IgY3JlYXRpbmcgYSBuZXcgcmVzb3VyY2UgZmlsZQorZGlhbG9nX3RpdGxlX25ld19maWxlPVNrYXBhXCBueVwgcmVzdXJzZmlsCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBUaXRsZSBmb3IgY3JlYXRpbmcgYSBuZXcgcmVzb3VyY2UgZ3JvdXAKK2RpYWxvZ190aXRsZV9uZXdfZ3JvdXA9U2thcGFcIG55XCByZXN1cnNncnVwcAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgVGl0bGUgZm9yIGNyZWF0aW5nIHJlc291cmNlCitkaWFsb2dfdGl0bGVfbmV3X2l0ZW09U2thcGFcIG55XCByZXN1cnNzYWsKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMi0xOSBAbW9kaWZpZWQgMjAwMS0xMi0xOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IFRpdGxlIG9mIHRoZSBkaWFsb2cgYm94IHNob3dpbmcgd2hlbiBjcmVhdGluZyBhIG5ldyBwcm9qZWN0CitkaWFsb2dfdGl0bGVfbmV3X3Byb2plY3Q9TmV3XCBSZXNvdXJjZVwgQnVuZGxlXCBQcm9qZWN0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCAKK2RpYWxvZ190aXRsZV9wcmVmZXJlbmNlcz1JbnN0YWxsbmluZ2FyCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBUaXRsZSBmb3IgY29uZmlybWluZyBleGl0IGZyb20gYXBwbGljYXRpb24KK2RpYWxvZ190aXRsZV9xdWl0PUF2c2x1dGFcIFJCTWFuYWdlcgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgCitkaWFsb2dfdGl0bGVfc2VhcmNoPVNvaworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgCitkaWFsb2dfdGl0bGVfdXNlcl9uYW1lPU1hdGFcIGluXCBhbnZhbmRhcm5hbW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IAorZGlhbG9nX3RyYW5zbGF0aW9uPU92ZXJzYXR0bmluZ1w6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCAKK2RpYWxvZ191c2VyX25hbWU9TWF0YVwgaW5cIG5hbW4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCAKK2RpYWxvZ192YXJpYW50PVZhcmlhbnRcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgCitkaWFsb2dfd2FybmluZ19kZWxldGVfZ3JvdXA9T21cIGR1XCB0YXJcIGJvcnRcIGRlblwgYXJcIGdydXBwZW5cIHNhXCBmb3JzdmlubmVyXCBhbGxhXCBzYWtlclwgaVwgZ3J1cHBlbi5cIFZpbGxcIGR1XCBmb3JzYXR0YT8KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IAorZGlhbG9nX3dhcm5pbmdfZGVsZXRlX2l0ZW09UmVzdXJzc2FrZW5cIGtvbW1lclwgYXR0XCBmb3JzdmlubmEuXCBWaWxsXCBkdVwgZm9yc2F0dGE/CisKKyMKKyMgQGdyb3VwIEVycm9yIE1lc3NhZ2VzCisjCisjIEBncm91cENvbW1lbnQgCisKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IAorZXJyb3I9RmVsCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTItMTkgQG1vZGlmaWVkIDIwMDEtMTItMTkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBHZW5lcmFsIGVycm9yIG1lc3NhZ2Ugd2hlbiB0cnlpbmcgdG8gYWRkIGEgcmVzb3VyY2UgYnVuZGxlIHRvIGEgcHJvamVjdC4KK2Vycm9yX2FkZGluZ19wcm9qZWN0X2J1bmRsZT1BblwgZXJyb3JcIG9jY3VycmVkXCB0cnlpbmdcIHRvXCBhZGRcIHRoZVwgUmVzb3VyY2VcIEJ1bmRsZVwgeW91XCBzZWxlY3RlZC4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IAorZXJyb3JfYmFzZWNsYXNzX3doaXRlc3BhY2U9UmVzdXJzbmFtblwga2FuXCBpbnRlXCBoYVwgc3BhY2VcIGlcIGRlbS4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IAorZXJyb3JfYnVuZGxlX25vdF9jcmVhdGVkPUluZ2VuXCByZXN1cnNmaWxcIHZhclwgc2thcGFkCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCAKK2Vycm9yX2NyZWF0ZV9maWxlPUV0dFwgZmVsXCB1cHBzdG9kXCBuYXJcIHZpXCBmb3Jzb2t0ZVwgc2thcGFcIHJlc3Vyc2ZpbAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgCitlcnJvcl9jcmVhdGVfZ3JvdXA9RXR0XCBwcm9ibGVtXCB1cHBzdG9kXCBuYXJcIGdydXBwZW5cIGZvcnNva3RlXCBza2FwYXMKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IAorZXJyb3JfY3JlYXRlX2l0ZW09RXR0XCBmZWxcIHVwcHN0b2RcIHZpZFwgc2thcGFuZGVcIGF2XCBueVwgb3ZlcnNhdHRuaW5nCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTItMTkgQG1vZGlmaWVkIDIwMDEtMTItMTkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBHZW5lcmFsIGVycm9yIG1lc3NhZ2Ugd2hlbiBjcmVhdGluZyBhIHByb2plY3QKK2Vycm9yX2NyZWF0aW5nX3Byb2plY3Q9QW5cIGVycm9yXCB3YXNcIGVuY291bnRlcmVkXCB0cnlpbmdcIHRvXCBjcmVhdGVcIGFcIFJlc291cmNlXCBCdW5kbGVcIFByb2plY3QuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wNi0yNyBAbW9kaWZpZWQgMjAwMS0wNy0wMiBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEB7MH0gVGhlIG1lc3NhZ2UgZnJvbSBhbiBJT0V4Y2VwdGlvbiB0aGF0IGlzIHRocm93bgorIyBAY29tbWVudCBFcnJvciBtZXNzYWdlIHdoZW4gdHJ5aW5nIHRvIGRlbGV0ZSBhIGZpbGUKK2Vycm9yX2RlbGV0aW5nPUV0dFwgZmVsXCB1cHBzdG9kXCBuXHUwMEU0clwgamFnXCBmXHUwMEY2cnNcdTAwRjZrdGVcIHRhXCBib3J0XCBmaWxcOlwgezB9CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wNi0yNyBAbW9kaWZpZWQgMjAwMS0wNy0wMiBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IEFuIGVycm9yIHRoYXQgb2NjdXJzIHdoZW4gYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIGRlbGV0ZSBhIGZpbGUsIGJ1dCB0aGUgdmlydHVhbCBtYWNoaW5lIGNhbiBub3QgZG8gc28KK2Vycm9yX2RlbGV0aW9uX25vdF9wb3NzaWJsZT1SQk1hbmFnZXJcIGt1bmRlXCBlalwgdGFcIGJvcnRcIGZpbC5cIFRpbGxzdFx1MDBFNW5kXCBmXHUwMEY2cmJqdWRlbi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTA3IEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgR2VuZXJhbCBlcnJvciBtZXNzYWdlIGZvciBleHBvcnRpbmcgcmVzb3VyY2UgYnVuZGxlcworZXJyb3JfZXhwb3J0PUV0dFwgZmVsXCB1cHBzdG9kXCB2aWRcIGV4cG9ydGVyaW5nXCBhdlwgcmVzdXJzZ3J1cHAKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IAorZXJyb3JfaW50ZXJuYWw9SW50ZXJudFwgZmVsCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCAKK2Vycm9yX21vZGlmeV9maWxlPUV0dFwgZmVsXCB1cHBzdG9kXCB2aWRcIG1vZGlmaWVyaW5nXCBhdlwgcmVzdXJzZmlsCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCAKK2Vycm9yX21vZGlmeV9ncm91cD1FdHRcIGZlbFwgdXBwc3RvZFwgbmFyXCBncnVwcFwgbW9kaWZpZXJhZGVzLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgCitlcnJvcl9tb2RpZnlfaXRlbT1FdHRcIGZlbFwgdXBwc3RvZFwgbmFyXCBvdmVyc2F0dG5pbmdcIGFuZHJhZGVzCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCAKK2Vycm9yX25vX2J1bmRsZV9mb3JfZmlsZT1Gb3JcIGF0dFwgc2thcGFcIGVuXCByZXN1cnNmaWxcIHNhXCBtYXN0ZVwgZHVcIGZvcnN0XCBza2FwYVwgZW5cIHJlc3Vyc2dydXBwCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCAKK2Vycm9yX25vX2J1bmRsZV9mb3JfZ3JvdXA9Rm9yXCBhdHRcIHNrYXBhXCBlblwgZ3J1cHBcIHNhXCBtYXN0ZVwgZHVcIGZvcnN0XCBza2FwYVwgZW5cIHJlc3Vyc2dydXBwLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgRXJyb3IgbWVzc2FnZSBkaXNwbGF5ZWQgd2hlbiB0aGUgdXNlciB0cmllcyB0byBjcmVhdGUgYSByZXNvdXJjZSwgd2l0aG91dCBhbiBvcGVuIHJlc291cmNlIGJ1bmRsZQorZXJyb3Jfbm9fYnVuZGxlX2Zvcl9pdGVtPU9wcG5hXCBlblwgcmVzdXJzZ3J1cHBcIGlubmFuXCBkdVwgZm9yc29rZXJcIHNrYXBhXCBlblwgbnlcIG92ZXJzYXR0bmluZworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDYgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK2Vycm9yX25vX2tleV9yZXBsYWNlPUVyc1x1MDBFNHR0XCBmdW5nZXJhclwgZWpcIGZcdTAwRjZyXCByZXN1cnNcIG55Y2tsYXIuXCBBbGxhXCBhbmRyYVwgZXJzXHUwMEU0dHRuaW5nYXJcIGtvbW1lclwgYXR0XCB1dGZcdTAwRjZyYXMuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yMiBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEluZGljYXRpb24gdGhhdCBSQk1hbmFnZXIgY2FuIG5vdCByZWFkIHRoZSBmaWxlIGFzIGNyZWF0ZWQgYnkgUkJNYW5hZ2VyCitlcnJvcl9ub3RfcmJtYW5hZ2VyX2Zvcm1hdD1EZW5cIHZhbGRhXCByZXN1cnNcIGdydXBwZW5cIHZhclwgZWpcIHNrYXBhZFwgYXZcIFJCTWFuYWdlcixcIGVsbGVyXCBmaWxlblwgXHUwMEU0clwgc2thZGFkLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDYtMjcgQG1vZGlmaWVkIDIwMDEtMDctMDIgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAezB9IFRoZSBuYW1lIG9mIHRoZSBmaWxlIHRoYXQgd291bGQgbm90IG9wZW4KKyMgQGNvbW1lbnQgRXJyb3IgbWVzc2FnZSBvY2N1cmluZyBvbiBhbiBJL08gZXJyb3IgdHJ5aW5nIHRvIG9wZW4gYSBmaWxlCitlcnJvcl9vcGVuaW5nX2ZpbGU9S3VuZGVcIGVqXCBcdTAwRjZwcG5hXCBmaWxcIHswfQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMTUgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBFcnJvciBtZXNzYWdlIGRpc3BsYXllZCB3aGVuIFJCTWFuYWdlciBlbmNvdW50ZXJzIGFuIGVycm9yIHdyaXRpbmcgcHJlZmVyZW5jZXMgdG8gdGhlIGZpbGUgc3lzdGVtCitlcnJvcl9wcmVmZXJlbmNlc19zYXZlPUV0dFwgZmVsXCB1cHBzdG9kXCBuXHUwMEU0clwgamFnXCBmXHUwMEY2cnNcdTAwRjZrdGVcIHNwYXJhXCBkaW5hXCBpbnN0XHUwMEU0bGxpbmdhci4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTEwIEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQHswfSBUaGUgZXJyb3IgbWVzc2FnZSBnZW5lcmF0ZWQKKyMgQGNvbW1lbnQgQSBtZXNzYWdlIHByZXNlbnRlZCB0byB0aGUgdXNlciB3aGVuIGFuIGVycm9yIG9jY3VycyBpbiBzYXZpbmcgdGhlIHJlc291cmNlIGJ1bmRsZQorZXJyb3Jfc2F2aW5nPVByb2JsZW1cIHZpZFwgc3BhcmFuZGVcIGF2XCByZXN1cnNncnVwcGVuXDpcIFwgezB9CisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTItMTkgQG1vZGlmaWVkIDIwMDEtMTItMTkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBHZW5lcmFsIGVycm9yIG1lc3NhZ2Ugd2hlbiBzYXZpbmcgYSBwcm9qZWN0CitlcnJvcl9zYXZpbmdfcHJvamVjdD1BblwgZXJyb3JcIHdhc1wgZW5jb3VudGVyZWRcIHRyeWluZ1wgdG9cIHNhdmVcIHRoZVwgUmVzb3VyY2VcIEJ1bmRsZVwgUHJvamVjdC4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTIyIEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgU3VnZ2VzdCB0cnlpbmcgdG8gaW1wb3J0IHRoZSByZXNvdXJjZSBidW5kbGUgaW5zdGVhZCBvZiBvcGVuaW5nIGl0LgorZXJyb3Jfc3VnZ2VzdF9pbXBvcnRfcHJvcGVydGllcz1GXHUwMEY2cnNcdTAwRjZrXCBpbXBvcnRlcmFcIHJlc3Vyc2dydXBwZW5cIGlzdFx1MDBFNGxsZXQuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCAKK2Vycm9yX3RyeV9hZ2Fpbl9maWxlPUZvcnNva1wgaWdlblwgbWVkXCBlblwgYW5uYW5cIGtvZG5pbmcKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IAorZXJyb3JfdHJ5X2FnYWluX2dyb3VwPUZvcnNva1wgaWdlblwgbWVkXCBlblwgYW5uYW5cIGdydXBwbmFtbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgCitlcnJvcl90cnlfYWdhaW5faXRlbT1Gb3Jzb2tcIGlnZW5cIG1lZFwgZW5cIGFubmFuXCBueWNrZWwKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTA3IEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgVmFsdWUgaW5zZXJ0ZWQgaW50byB0YWJsZSBjZWxscyB3aGVuIGFuIGVycm9yIGhhcyBvY2N1cmVkCit0YWJsZV9jZWxsX2Vycm9yPSpGZWwqCisKKyMKKyMgQGdyb3VwIEV4cG9ydAorIworIyBAZ3JvdXBDb21tZW50IFJlc291cmNlcyBkZWFsaW5nIHdpdGggZXhwb3J0IG9wdGlvbnMKKworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDYtMjcgQG1vZGlmaWVkIDIwMDEtMDctMDIgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBPcHRpb24gZm9yIHRoZSBwYXJhbWV0ZXIgZm9yIGNyZWF0ZWQgYSBwcm90ZWN0ZWQgY2xhc3MKK2V4cG9ydF9qYXZhX2NsYXNzX3Byb3RlY3RlZD1Ta2FwYVwgZW5cIHNreWRkYWRcIGtsYXNzCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wNi0yNyBAbW9kaWZpZWQgMjAwMS0wNy0wMiBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IE9wdGlvbiBmb3IgcGFyYW1ldGVyIHNldHRpbmcgdGhlIGNyZWF0ZWQgY2xhc3MgYXMgcHVibGljCitleHBvcnRfamF2YV9jbGFzc19wdWJsaWM9U2thcGFcIGVuXCBwdWJsaWtcIGtsYXNzCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wNi0yNyBAbW9kaWZpZWQgMjAwMS0wNy0wMiBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IE9wdGlvbiBmb3IgcGFyYW1ldGVyIGZvciBjcmVhdGluZyBwcm90ZWN0ZWQgbWV0aG9kcyBpbiB0aGUgamF2YSBjbGFzcworZXhwb3J0X2phdmFfbWV0aG9kc19wcm90ZWN0ZWQ9U2thcGFcIGVuXCBza3lkZGFkXCBtZXRvZAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDYtMjcgQG1vZGlmaWVkIDIwMDEtMDctMDIgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBPcHRpb24gZm9yIHBhcmFtZXRlciBmb3IgY3JlYXRpbmcgcHVibGljIG1ldGhvZHMKK2V4cG9ydF9qYXZhX21ldGhvZHNfcHVibGljPVNrYXBhXCBwdWJsaWtcIG1ldG9kCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wNi0yNyBAbW9kaWZpZWQgMjAwMS0wNy0wMiBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IFRpdGxlIG9mIGEgY2hlY2sgYm94IGZvbGxvd2VkIGJ5IGEgdGV4dCBmaWVsZCBmb3Igc3BlY2lmeWluZyB3aGV0aGVyIG9yIG5vdCB0byB1c2UgYSBwYWNrYWdlIGluIHRoZSBnZW5lcmF0ZWQgamF2YSBjbGFzcyBhbmQgd2hhdCB0aGUgcGFja2FnZSBzaG91bGQgYmUgY2FsbGVkCitleHBvcnRfamF2YV9wYWNrYWdlPVNwZWNpZmllcmFcIEphdmFcIHBhY2thZ2VcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDYtMjcgQG1vZGlmaWVkIDIwMDEtMDctMDIgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBUZXh0IHBsYWNlZCBpbiBhIGxhYmVsIGF0IHRoZSB0b3Agb2YgdGhlIGRpYWxvZyBib3ggZm9yIHNwZWNpZnlpbmcgcGFyYW1ldGVycyBjb25jZXJuaW5nIHRoZSBleHBvcnQgb2YgcmVzb3VyY2UgYnVuZGxlcyBpbnRvIGEgamF2YSBjbGFzcworZXhwb3J0X2phdmFfdGl0bGU9VmFyXCBnb2RcIHNwZWNpZmljZXJhXCBmXHUwMEY2bGphbmRlXCBwYXJhbWV0cmFyXCBmXHUwMEY2clwgZGluXCBKYXZhXCBrbGFzc1w6CisKKyMKKyMgQGdyb3VwIEdlbmVyYWwKKyMKKyMgQGdyb3VwQ29tbWVudCBTb21lIGl0ZW1zIHRoYXQgYXJlIGNvbW1vbiBhY2Nyb3NzIGdyb3VwcworCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBUaGUgZmlsZSBvciBjbGFzcyBjb21wb3NlZCBvZiB0aGUgZGVmYXVsdCB0cmFuc2xhdGlvbnMgZm9yIHRoZSBidW5kbGUKK2Jhc2VjbGFzcz1CYXNrbGFzcworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDQtMDYtMjkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEdlb3JnZQorIyBAY29tbWVudCBUaGlzIGlzIHRoZSBsZWdhbCBjb3B5cmlnaHQgbm90aWNlCitjb3B5cmlnaHQ9KEMpXCBLb3BpZXJpbmdzc2t5ZGRhZFwgSUJNXCBDb3JwLlwgMjAwMC0yMDA0XCAtXCBBbGxhXCByYXR0aWdoZXRlclwgcmVzZXJ2ZXJhZGUKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTA2IEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgR2VybmVyYWwgdXNlIGZvciBmaWxlIGRpcmVjdG9yaWVzCitkaXJlY3Rvcnk9Rm9sZGVyCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCAKK2dyb3Vwcz1HcnVwcGVyCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0xMCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUaGUgbmFtZSBvZiB0aGUgaW1hZ2UgZmlsZSBpbiB0aGUgJ0ltYWdlcycgZGlyZWN0b3J5IHRoYXQgcmVwcmVzZW50cyB0aGUgbG9nbyBzZWVuIGF0IHRoZSB0b3Agb2YgdGhlIGFwcGxpY2F0aW9uCitsb2dvX2ZpbGVuYW1lPVRpdGxlTG9nb190cmFuc3BhcmVudC5naWYKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0xMi0xNyBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IFRyZWUgbm9kZSB0aXRsZSB3aGVuIHZpZXdpbmcgYSByZXNvdXJjZSBidW5kbGUgaW4gdGhlIHByb2plY3QgdmlldyB3aGVuIHRoZXJlIGlzIG5vIGFjdGl2ZSBwcm9qZWN0Citub19wcm9qZWN0PURlZmF1bHRcIFByb2plY3QKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0xMi0xNyBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IFRyZWUgbm9kZSB0aXRsZSBkZWZhdWx0ZWQgdG8gd2hlbiBubyByZXNvdXJjZSBidW5kbGUgb3IgcHJvamVjdCBoYXMgYmVlbiBvcGVuZWQgYnkgdGhlIHVzZXIKK25vX3Byb2plY3RfYnVuZGxlPU5vXCBQcm9qZWN0XCBvclwgUmVzb3VyY2VcIEJ1bmRsZVwgT3BlbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgVGhlIHRvcCB0cmVlIG5vZGUgdGl0bGUsIHdoZW4gbm8gcmVzb3VyY2UgYnVuZGxlIGhhcyBiZWVuIG9wZW5lZCBvciBjcmVhdGVkCitub19yZXNvdXJjZV9idW5kbGU9SW5nZW5cIHJlc3Vyc2dydXBwCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCAKK25vbmU9SW5nZW4KKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMS0yMCBAbW9kaWZpZWQgMjAwMS0xMS0yMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IFByb2plY3QgdGFibGUgY29sdW1uIG5hbWUgLSBMb2NhdGlvbiBvZiBhIHJlc291cmNlIGJ1bmRsZQorcHJvamVjdF90YWJsZV9maWxlX2xvY2F0aW9uPUZpbGVcIExvY2F0aW9uCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTEtMjAgQG1vZGlmaWVkIDIwMDEtMTEtMjAgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBUYWJsZSBDb2x1bW4gTmFtZSBmb3IgcmVzb3VyY2UgYnVuZGxlIG5hbWUKK3Byb2plY3RfdGFibGVfcmVzb3VyY2VfYnVuZGxlPVJlc291cmNlXCBCdW5kbGUKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTEwIEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEFuIGFiYnJldmlhdGVkIG5hbWUgb2YgdGhpcyBhcHBsaWNhdGlvbgorcmJtYW5hZ2VyPVJCTWFuYWdlcgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDQtMDYtMjkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEdlb3JnZQorIyBAY29tbWVudCAKK3JibWFuYWdlcl9jb250YWN0PVNrYXBhcmVcOlwgSmFyZWRcIEphY2tzb25cICZcIEdlb3JnZVwgUmhvdGVuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBUaGUgZnVsbCBuYW1lIG9mIHRoaXMgYXBwbGljYXRpb24KK3Jlc291cmNlX2J1bmRsZV9tYW5hZ2VyPVJlc3Vyc2dydXBwXCBBZ2FyZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgCit0YWJsZV9jb2x1bW5fZXJyb3I9RmVsXCBpXCBrb2x1bW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEB7MH0gCisjIEBjb21tZW50IE5vZGUgdGl0bGUsIHVuZGVyIHdoaWNoIGFsbCBmaWxlcyBvZiB0aGUgc2FtZSBjb3VudHJ5LCBsYW5ndWFnZSByZXNpZGUKK3RyZWVfY291bnRyeV9ub2RlPUxhbmRza29kXDpcIHswfQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQHswfSBMYW5ndWFnZSBFbmNvZGluZworIyBAY29tbWVudCBUaGUgbm9kZSBiZWxvdyB3aGljaCBsYW5ndWFnZXMgb2Ygb25lIGVuY29kaW5nIGFyZSBncm91cGVkCit0cmVlX2xhbmd1YWdlX25vZGU9U3ByYWtrb2RcOlwgezB9CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCAKK3RyZWVfdmFyaWFudF9ub2RlPVZhcmlhbnRlclw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBUaGUgbmFtZSBhc3NpZ25lZCBhcyBhIHVzZXIgbmFtZSB3aGVuIHRoZSB1c2VyIG5hbWUgaXMgbm90IHNwZWNpZmllZAordW5rbm93bl91c2VyPU9rYW5kCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCAKK3VudGl0bGVkPUluZ2VuXCB0aXRlbAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgCit1bnRyYW5zbGF0ZWRfaXRlbXM9T292ZXJzYXR0YVwgc2FrZXIKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEB7MH0gVGhlIHZlcnNpb24gbnVtYmVyCisjIEBjb21tZW50IFRoZSB2ZXJzaW9uIG9mIHRoaXMgYXBwbGljYXRpb24KK3ZlcnNpb249VmVyc2lvblwgezB9CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wNiBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IGdlbmVyYWwgdXNlIFdhcm5pbmcKK3dhcm5pbmc9VmFybmluZworCisjCisjIEBncm91cCBJbXBvcnQKKyMKKyMgQGdyb3VwQ29tbWVudCBSZXNvdXJjZXMgZGVhbGluZyB3aXRoIGltcG9ydCBvcHRpb25zCisKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTI2IEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgVGl0bGUgZm9yIGZpbGUgY2hvb3NlciBmb3IgY2hvb3NpbmcgVE1YIGZpbGVzCitpbXBvcnRfVE1YX2ZpbGVfZGVzY3JpcHRpb249VE1YXCBmaWxlcgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjYgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBEaWFsb2cgdGl0bGUgZm9yIGltcG9ydGluZyBmcm9tIFRNWCBYTUwgZmlsZXMKK2ltcG9ydF9UTVhfdGl0bGU9VE1YXCBmaWxpbXBvcnQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDA0LTA3LTAxIEBtb2RpZmllZCAyMDA0LTA3LTAxIEBjcmVhdG9yIEdlb3JnZSBSaG90ZW4gQG1vZGlmaWVyIEdlb3JnZSBSaG90ZW4KKyMgQGNvbW1lbnQgVGl0bGUgZm9yIHRoZSBmaWxlIGNob29zZXIgZm9yIGNob29zaW5nIFhMSUZGICgueGxmKSBmaWxlcworaW1wb3J0X1hMRl9maWxlX2Rlc2NyaXB0aW9uPVhMSUZGXCBmaWxlcgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDQtMDctMDEgQG1vZGlmaWVkIDIwMDQtMDctMDEgQGNyZWF0b3IgR2VvcmdlIFJob3RlbiBAbW9kaWZpZXIgR2VvcmdlIFJob3RlbgorIyBAY29tbWVudCBEaWFsb3QgdGl0bGUgZm9yIGltcG9ydGluZyBmcm9tIFhMSUZGICgueGxmKSBmaWxlcworaW1wb3J0X1hMRl90aXRsZT1YTElGRlwgZmlsaW1wb3J0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yNiBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IE9wdGlvbiBmb3IgcmVzb2x2aW5nIGNvbmZsY2l0cyBvbiBhIGNhc2UgYnkgY2FzZSBiYXNpcworaW1wb3J0X2NvbmZsaWN0X3Byb21wdD1Gclx1MDBFNWdhXCB2aWRcIHZhcmplXCBrb25mbGlrdAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDcgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBPcHRpb24gc3BlY2lmeWluZyB3aGV0aGVyIGEgZ3JvdXAgZm91bmQgaW4gdGhlIHRhcmdldCBidXQgbm90IGZvdW5kIGluIHRoZSBhY3RpdmUgcmVzb3VyY2UgYnVuZGxlIHNob3VsZCBiZSBjcmVhdGVkIGluIHRoZSByZXNvdXJjZSBidW5kbGUgb3Igbm90CitpbXBvcnRfZGVmYXVsdF9ncm91cF9jcmVhdGlvbj1Ta2FwYVwgZ3J1cHBlclwgc29tXCBpbnRlXCBleGlzdGVyYXJcIGlcIG51dmFyYW5kZVwgYnVuZGxlCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yNiBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IE9wdG9pbiBmb3IgbWFya2luZyB0aGUgaW5jb21pbmcgdmFsdWVzIGFzIHRyYW5zbGF0ZWQgb3Igbm90CitpbXBvcnRfZGVmYXVsdF90cmFuc2xhdGVkPU1hcmtlcmFcIHNvbVwgXHUwMEY2dmVyc2F0dAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjYgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUaXRsZSBmb3Igb3B0aW9ucyBzcGVjaWZ5aW5nIHRoZSBtZXRhIGRhdGEgdG8gYmUgYXBwbGllZCB0byBpbmRpdmlkdWFsIHJlc291cmNlcyBpZiBpdCBpcyBub3QgYXZhaWxhYmxlIGluIHRoZSBpbXBvcnQgc291cmNlCitpbXBvcnRfZGVmYXVsdF92YWx1ZXM9U2tcdTAwRjZuc3ZcdTAwRTRyZGVuCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wMiBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEB7MH0gVGhlIGxvY2FsZSBlbmNvZGluZyBvZiB0aGUgZmlsZSBpbiBxdWVzdGlvbgorIyBAY29tbWVudCBJbnN0cnVjdGlvbnMgZm9yIHByb21wdGluZyB0aGUgdXNlciB0byByZXNvbHZlIGEgY29uZmxpY3Qgd2hlbiBpbXBvcnRpbmcgcmVzb3VyY2VzIGZyb20gYSBsb2NhbGUgdGhhdCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgY3VycmVudCByZXNvdXJjZSBidW5kbGUKK2ltcG9ydF9maWxlX2NvbmZsaWN0X2Nob29zZT1Lb2RuaW5nZW5cIHswfVwgZmlubnNcIGVqLlwgVlx1MDBFNGxqXCBldHRcIHZhbFwgZlx1MDBGNnJcIGF0dFwgZml4YVwga29uZmxpa3RlbixcIGVsbGVyXCBhdmJyeXRcIGZcdTAwRjZyXCBhdHRcIGlnbm9yZXJhLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjYgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBPcHRpb24gZm9yIGZpbGUgY29uZmxpY3RzIGluIHdoaWNoIGEgbmV3IGZpbGUgaXMgZ2VuZXJhdGVkLCBidXQgbm90IHBvcHVsYXRlZAoraW1wb3J0X2ZpbGVfY29uZmxpY3RfZ2VuZXJhdGVfZW1wdHk9U2thcGFcIGVuXCBueSxcIHRvbVwgcmVzdXJzZmlsCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yNiBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IE9wdGlvbiBmb3IgcmVzb2x2aW5nIGZpbGUgY29uZmxpY3RzIGluIHdoaWNoIGEgbmV3IGZpbGUgaXMgZ2VuZXJhdGVkIGFuZCBwb3B1bGF0ZWQgd2l0aCBhbGwgdGhlIGV4aXN0aW5nIHJlc291cmNlcworaW1wb3J0X2ZpbGVfY29uZmxpY3RfZ2VuZXJhdGVfcG9wdWxhdGU9U2thcGFcIGVuXCBueVwgcmVzdXJzZmlsXCBvY2hcIGZ5bGxcIGlcIG1lZFwgYmFzLWtsYXNzZW5zXCByZXN1cmVyCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yNiBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IE9wdGlvbiBmb3IgZmlsZSBjb25mbGljdHMgaW4gd2hpY2ggdGhlIGNvbmZsaWN0cyBhcmUgaWdub3JlZAoraW1wb3J0X2ZpbGVfY29uZmxpY3RfaWdub3JlPVNraXBwYVwgb2NoXCBpZ25vcmVyYVwgYWxsYVwgcmVzdXJzZXJcIGZyXHUwMEU1blwgbG9rYWxlclwgc29tXCBpbnRlXCBleGlzdGVyYXJcIGlcIG51dmFyYW5kZVwgYnVudC4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTI2IEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgVGl0bGUgZm9yIHNlY3Rpb24gbGlzdGluZyBvcHRpb25zIGZvciB3aGF0IHRvIGRvIHdoZW4gYW4gaW1wb3J0ZWQgdmFsdWUgZXhpc3RzIGluIGEgbG9jYWxlIG5vdCBkZWZpbmVkIGluIHRoZSBleGlzdGluZyByZXNvdXJjZSBidW5kbGUKK2ltcG9ydF9maWxlX2NvbmZsaWN0cz1SZXN1cnNmaWxcIHNha25hcworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjYgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBTZWxlY3Rpb24gb2YgdGhlIGRlZmF1bHQgZ3JvdXAuIEEgbGlzdCBvZiBncm91cHMgd2lsbCBhcHBlYXIgdG8gdGhlIHJpZ2h0IG9mIHRoaXMgcmVzb3VyY2UgaW4gYSBDb21ib0JveAoraW1wb3J0X2luc2VydF9ncm91cD1MXHUwMEU0Z2dcIHRpbGxcIGdydXBwXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTI2IEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgVGl0bGUgZm9yIHRoZSB0eXBlcyBvZiBmaWxlcyBhY2NlcHRlZCBmb3IgdGhpcyBpbXBvcnQgdHlwZQoraW1wb3J0X2phdmFfZmlsZV9kZXNjcmlwdGlvbj1KYXZhXCBMaXN0UmVzb3VyY2VCdW5kbGVcIEJhc1wga2xhc3NlcgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjYgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUaXRsZSBmb3IgZGlhbG9nIHByb21wdGluZyBmb3IgaW1wb3J0IGZyb20gamF2YSBjbGFzc2VzCitpbXBvcnRfamF2YV90aXRsZT1KYXZhXCBMaXN0UmVzb3VyY2VCdW5kbGVcIEtsYXNzXCBpbXBvcnRlcmluZworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjYgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUaXRsZSBpbmRpY2F0aW5nIHNlY3Rpb24gY29udGFpbmluZyB1c2VyIG9wdGlvbnMKK2ltcG9ydF9vcHRpb25zPUltcG9ydGVyaW5nc2luc3RcdTAwRTRsbG5pbmdhcgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjYgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUaXRsZSBmb3IgZmlsZSBjaG9vc2VyIGZvciBzZWxlY3Rpb24gb2YgcmVzb3VyY2UgYnVuZGxlcyBzdG9yZWQgaW4gLnByb3BlcnRpZXMgZmlsZXMKK2ltcG9ydF9wcm9wZXJ0aWVzX2ZpbGVfZGVzY3JpcHRpb249UmVzdXJzYnVudFwgYmFza2xhc3NlcgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjYgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBEaWFsb2cgdGl0bGUgZm9yIGltcG9ydGluZyBmcm9tIHByb3BlcnRpZXMgZmlsZXMgKGNyZWF0ZWQgb3Igbm90IGJ5IFJCTWFuYWdlcikKK2ltcG9ydF9wcm9wZXJ0aWVzX3RpdGxlPVJlc3Vyc2J1bnRcIGluc3RcdTAwRTRsbG5pbmdzaW1wb3J0ZXJpbmcKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTAyIEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQHsxfSBFbmNvZGluZyBvZiB0aGUgcmVzb3VyY2UgdmFsdWUgd2l0aCBhIGNvbmZsaWN0CisjIEB7MH0gVGhlIGtleSB2YWx1ZSBvZiB0aGUgcmVzb3VyY2UgaW4gY29uZmxpY3QKKyMgQGNvbW1lbnQgVGhpcyBpcyBhIHdhcm5pbmcgYW5kIGluc3RydWN0aW9uIGZvciB3aGVuIGEgcmVzb3VyY2UgY29uZmxpY3Qgb2NjdXJzIGR1cmluZyBhbiBpbXBvcnQKK2ltcG9ydF9yZXNvdXJjZV9jb25mbGljdF9jaG9vc2U9Tnlja2VsblwgezB9XCBmaW5uc1wgcmVkYW5cIGlcIHsxfVwgcmVzdXJzYnVudC5cIFZcdTAwRTRsalwgZXR0XCBhbHRlcm5hdGl2XCBmXHUwMEY2clwgYXR0XCBsXHUwMEY2c2FcIHByb2JsZW1ldC4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTAyIEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQHswfSBUaGUgdHJhbnNsYXRpb24gdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXNvdXJjZSBpdGVtCisjIEBjb21tZW50IEFuIGluZGljYXRpb24gb2YgdGhlIHZhbHVlIG9mIHRoZSByZXNvdXJjZSBhY2NvcmRpbmcgdG8gdGhlIGltcG9ydCBmaWxlCitpbXBvcnRfcmVzb3VyY2VfY29uZmxpY3RfY2hvb3NlX3NvdXJjZT1JbXBvcnRcdTAwRjZ2ZXJzXHUwMEU0dHRuaW5nXDpcIHswfQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDIgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAezB9IFRoZSB0cmFuc2xhdGlvbiB2YWx1ZSBvZiB0aGUgcmVzb3VyY2UgaXRlbQorIyBAY29tbWVudCBBbiBpbmRpY2F0aW9uIG9mIHRoZSB0cmFuc2xhdGlvbiB2YWx1ZSBoZWxkIGJ5IHRoZSBhY3RpdmUgcmVzb3VyY2UgYnVuZGxlIGR1cmluZyBhIHRyYW5zbGF0aW9uIHJlc291cmNlIGNvbmZsaWN0CitpbXBvcnRfcmVzb3VyY2VfY29uZmxpY3RfY2hvb3NlX3RhcmdldD1SZXN1cnNidW50XCBcdTAwRjZ2ZXJzXHUwMEU0dHRuaW5nXDpcIHswfQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjYgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBPcHRpb24gZm9yIHJlc29sdmluZyByZXNvdXJjZSBjb25mbGljdHMgYnkgaWdub3JpbmcgaW1wb3J0IHZhbHVlCitpbXBvcnRfcmVzb3VyY2VfY29uZmxpY3RfaWdub3JlPUlnbm9yZXJhXCBrb25mbGl0ZW5cIG9jaFwgbFx1MDBFNG1uYVwgb3JpZ2luYWxyZXN1cnNlblwgb1x1MDBFNG5kcmFkCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yNiBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IE9wdGlvbiBmb3IgcmVzb2x2aW5nIGNvbmZsaWN0cyBieSB1c2luZyB0aGUgaW1wb3J0IHZhbHVlCitpbXBvcnRfcmVzb3VyY2VfY29uZmxpY3Rfb3ZlcndyaXRlPVNrcml2XCBcdTAwRjZ2ZXJcIHJlc3Vyc2VuXCBtZWRcIHZcdTAwRTRyZGVuXCBmclx1MDBFNW5cIGltcG9ydGVyYWRcIGZpbAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMjYgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUaXRsZSBsaXN0aW5nIG9wdGlvbnMgZm9yIHJlc29sdmluZyBjb25mbGljdHMgYmV0d2VlbiByZXNvdXJjZXMKK2ltcG9ydF9yZXNvdXJjZV9jb25mbGljdHM9UmVzdXJzXCBrb25mbGlrdGVyCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0yNiBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEB7MH0gVGhlIHBhdGggYW5kIG5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlCisjIEBjb21tZW50IEluZGljYXRpb24gb2YgdGhlIHNvdXJjZSBmaWxlIGZvciB0aGUgaW1wb3J0CitpbXBvcnRfc291cmNlX2ZpbGU9S1x1MDBFNGxsZmlsXDpcIHswfQorCisjCisjIEBncm91cCBNZW51IEl0ZW1zCisjCisjIEBncm91cENvbW1lbnQgVGhlc2UgcmVzb3VyY2VzIHJlcHJlc2VudCBhbGwgb2YgdGhlIG1lbnUgYW5kIG1lbnUgaXRlbSB0aXRsZXMKKworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBUaGUgbWVudSB0aXRsZSBjb3ZlcmluZyBjb3B5aW5nLCBwYXN0aW5nLCBkZWxldGluZyBvZiBpdGVtcworbWVudV9lZGl0PUVkaXRlcmEKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTA3IEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCittZW51X2VkaXRfY29weT1Lb3BpZXJhCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wNyBAbW9kaWZpZWQgMjAwMS0wMi0wNyBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorbWVudV9lZGl0X2NvcHlfdHJpZ2dlcj1jCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wNyBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorbWVudV9lZGl0X2N1dD1UYVwgYm9ydAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDcgQG1vZGlmaWVkIDIwMDEtMDItMDcgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK21lbnVfZWRpdF9jdXRfdHJpZ2dlcj10CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wNyBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorbWVudV9lZGl0X2RlbGV0ZT1SYWRlcmEKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTA3IEBtb2RpZmllZCAyMDAxLTAyLTA3IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCittZW51X2VkaXRfZGVsZXRlX3RyaWdnZXI9ZAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDcgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK21lbnVfZWRpdF9wYXN0ZT1LbGlzdHJhXCBpbgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDcgQG1vZGlmaWVkIDIwMDEtMDItMDcgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK21lbnVfZWRpdF9wYXN0ZV90cmlnZ2VyPXAKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTEwIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgVGhlIHRyaWdnZXIgaXMgYSBsZXR0ZXIgZnJvbSB0aGUgdHJhbnNsYXRpb24gb2YgJ21lbnVfZWRpdCcgd2hpY2ggcHJvdmlkZXMgYSBrZXlib2FyZCBzaG9ydGN1dCB0byB0aGUgbWVudQorbWVudV9lZGl0X3RyaWdnZXI9ZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBNZW51IHRpdGxlIGZvciB0aGUgb3BlbmluZywgc2F2aW5nLCBldGMuIGRvY3VtZW50cyBhbmQgZXhpdGluZyB0aGUgcHJvZ3JhbQorbWVudV9maWxlPUZpbAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMTUgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBBYmlsaXR5IHRvIGV4cG9ydCByZXNvdXJjZSBidW5kbGVzIGluIGEgdmFyaWV0eSBvZiBmb3JtYXRzCittZW51X2ZpbGVfZXhwb3J0PUV4cG9ydGVyYVwgcmVzdXJzYnVudAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDItMDUtMTcgQG1vZGlmaWVkIDIwMDItMDUtMTcgQGNyZWF0b3IgR2VvcmdlIFJob3RlbiBAbW9kaWZpZXIgR2VvcmdlIFJob3RlbgorIyBAY29tbWVudCBBYmxpdHkgdG8gZXhwb3J0IHRvIElDVSBSZXNvdXJjZSBCdW5kbGUgZmlsZXMKK21lbnVfZmlsZV9leHBvcnRfSUNVPUlDVVwgRmlsZXIuLi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAyLTA1LTE3IEBtb2RpZmllZCAyMDAyLTA1LTE3IEBjcmVhdG9yIEdlb3JnZSBSaG90ZW4gQG1vZGlmaWVyIEdlb3JnZSBSaG90ZW4KKyMgQGNvbW1lbnQgCittZW51X2ZpbGVfZXhwb3J0X0lDVV90cmlnZ2VyPWkKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTE1IEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgQWJsaXR5IHRvIGV4cG9ydCB0byBUTVggWE1MIGZpbGVzCittZW51X2ZpbGVfZXhwb3J0X1RNWD1UTVhcIEZpbGVyLi4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0xNSBAbW9kaWZpZWQgMjAwMS0wMS0xNSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorbWVudV9maWxlX2V4cG9ydF9UTVhfdHJpZ2dlcj10CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwNC0wNy0wMSBAbW9kaWZpZWQgMjAwNC0wNy0wMSBAY3JlYXRvciBHZW9yZ2UgUmhvdGVuIEBtb2RpZmllciBHZW9yZ2UgUmhvdGVuCisjIEBjb21tZW50IHgKK21lbnVfZmlsZV9leHBvcnRfWExGPVhMSUZGXCBGaWxlci4uLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDQtMDctMDEgQG1vZGlmaWVkIDIwMDQtMDctMDEgQGNyZWF0b3IgR2VvcmdlIFJob3RlbiBAbW9kaWZpZXIgR2VvcmdlIFJob3RlbgorIyBAY29tbWVudCAKK21lbnVfZmlsZV9leHBvcnRfWExGX3RyaWdnZXI9eAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMTUgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBBYmlsaXR5IHRvIGV4cG9ydCB0byBqYXZhIGZpbGVzIHRoYXQgY29tcGlsZSB0byBiZSBMaXN0UmVzb3VyY2VCdW5kbGUgY2xhc3MgZXh0ZW5zaW9ucworbWVudV9maWxlX2V4cG9ydF9qYXZhPUtvbXBhdGlibGFcIEphdmFcIGZpbGVyLi4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0xNSBAbW9kaWZpZWQgMjAwMS0wMS0xNSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorbWVudV9maWxlX2V4cG9ydF9qYXZhX3RyaWdnZXI9agorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMTUgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBFeHBvcnQgYWJpbGl0eSB0byBwcm9wZXJ0aWVzIGZpbGVzIG1pbnVzIHRoZSBtZXRhZGF0YQorbWVudV9maWxlX2V4cG9ydF9wcm9wZXJ0aWVzPU1pbmltYWxcIGluc3RcdTAwRTRsbG5pbmdzZmlsLi4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0xNSBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorbWVudV9maWxlX2V4cG9ydF9wcm9wZXJ0aWVzX3RyaWdnZXI9cworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMTUgQG1vZGlmaWVkIDIwMDEtMDEtMTUgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK21lbnVfZmlsZV9leHBvcnRfdHJpZ2dlcj14CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IE1lbnUgaXRlbSBmb3IgaW1wb3J0IGFuZCBtZXJnaW5nIGFub3RoZXIgcmVzb3VyY2UgZmlsZSB3aXRoIHRoZSBidW5kbGUgYmVpbmcgd29ya2VkIHdpdGgKK21lbnVfZmlsZV9pbXBvcnQ9SW1wb3J0ZXJhXCByZXN1cnNncnVwcFwgZnJhblwgZmlsLi4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0xNSBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEltcG9ydCBhYmxpaXR5IGZyb20gWE1MIFRNWCBkb2N1bWVudHMKK21lbnVfZmlsZV9pbXBvcnRfVE1YPVRNWFwgZG9jdW1lbnQuLi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTE1IEBtb2RpZmllZCAyMDAxLTAxLTE1IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCittZW51X2ZpbGVfaW1wb3J0X1RNWF90cmlnZ2VyPXQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDA0LTA3LTAxIEBtb2RpZmllZCAyMDA0LTA3LTAxIEBjcmVhdG9yIEdlb3JnZSBSaG90ZW4gQG1vZGlmaWVyIEdlb3JnZSBSaG90ZW4KKyMgQGNvbW1lbnQgSW1wb3J0IGFiaWxpdHkgZnJvbSBYTUwgWExJRkYgKC54bGYpIGZpbGVzCittZW51X2ZpbGVfaW1wb3J0X1hMRj1YTElGRlwgZG9jdW1lbnQuLi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDA0LTA3LTAxIEBtb2RpZmllZCAyMDA0LTA3LTAxIEBjcmVhdG9yIEdlb3JnZSBSaG90ZW4gQG1vZGlmaWVyIEdlb3JnZSBSaG90ZW4KKyMgQGNvbW1lbnQgWAorbWVudV9maWxlX2ltcG9ydF9YTEZfdHJpZ2dlcj14CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0xNSBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEltcG9ydCBhYmlsaXR5IGZyb20gamF2YSBjbGFzc2VzIChMaXN0UmVzb3VyY2VCdW5kbGUpCittZW51X2ZpbGVfaW1wb3J0X2phdmE9TGlzdFJlc291cmNlQnVuZGxlXCBKYXZhXCBLbGFzc2VyLi4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMS0xNSBAbW9kaWZpZWQgMjAwMS0wMS0xNSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorbWVudV9maWxlX2ltcG9ydF9qYXZhX3RyaWdnZXI9agorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMTUgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBJbXBvcnQgYWJpbGl0eSBmcm9tIHByb3BlcnRpZXMgZmlsZXMgbm90IGdlbmVyYXRlZCBieSBSQk1hbmFnZXIKK21lbnVfZmlsZV9pbXBvcnRfcHJvcGVydGllcz1FbmtlbFwgcmVzdXJzYnVudC4uLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDEtMTUgQG1vZGlmaWVkIDIwMDEtMDEtMTUgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK21lbnVfZmlsZV9pbXBvcnRfcHJvcGVydGllc190cmlnZ2VyPVMKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTEwIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCittZW51X2ZpbGVfaW1wb3J0X3RyaWdnZXI9bQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBNZW51IGl0ZW0gZm9yIGNyZWF0aW5nIGEgbmV3IHJlc291cmNlIGJ1bmRsZQorbWVudV9maWxlX25ldz1OeVwgcmVzdXJzZ3J1cHAKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTEwIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCittZW51X2ZpbGVfbmV3X3RyaWdnZXI9bgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBNZW51IEl0ZW0gZm9yIG9wZW5pbmcgYSByZXNvdXJjZSBidW5kbGUKK21lbnVfZmlsZV9vcGVuPU9wcG5hXCByZXN1cnNncnVwcC4uLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMTAgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK21lbnVfZmlsZV9vcGVuX3RyaWdnZXI9bworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBNZW51IGl0ZW0gZm9yIGNsb3NpbmcgdGhlIGFwcGxpY2F0aW9uCittZW51X2ZpbGVfcXVpdD1BdnNsdXRhCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IAorbWVudV9maWxlX3F1aXRfdHJpZ2dlcj1hCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IE1lbnUgaXRlbSBmb3Igc2F2aW5nIHRoZSByZXNvdXJjZSBidW5kbGUgYmVpbmcgd29ya2VkIHdpdGgKK21lbnVfZmlsZV9zYXZlPVNwYXJhXCByZXN1cnNncnVwcAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMTAgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK21lbnVfZmlsZV9zYXZlX3RyaWdnZXI9cworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBNZW51IEl0ZW0gZm9yIHNhdmluZyBhIHJlc291cmNlIGJ1bmRsZSB0byBhIHBhcnRpY3VsYXIgbG9jYXRpb24gYW5kIGZpbGUgbmFtZQorbWVudV9maWxlX3NhdmVhcz1TcGFyYVwgcmVzdXJzZ3J1cHBcIHNvbS4uLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMTAgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCAKK21lbnVfZmlsZV9zYXZlYXNfdHJpZ2dlcj1hCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0xMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFRoZSB0cmlnZ2VyIGlzIGEgbGV0dGVyIGZyb20gdGhlIHRyYW5zbGF0aW9uIG9mICdtZW51X2ZpbGUnIHdoaWNoIHByb3ZpZGVzIGEga2V5Ym9hcmQgc2hvcnRjdXQgdG8gdGhlIG1lbnUKK21lbnVfZmlsZV90cmlnZ2VyPWYKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgTWVudSB0aXRsZSBmb3IgaGVscCBpbmZvcm1hdGlvbiBhbmQgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcHJvZ3JhbQorbWVudV9oZWxwPUhqYWxwCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0xMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IE1lbnUgaXRlbSB3aGljaCBicmluZ3MgdXAgYSBkaWFsb2cgZGVzY3JpYmluZyB0aGUgYXBwbGljYXRpb24KK21lbnVfaGVscF9hYm91dD1PbVwgUkJNYW5hZ2VyLi4uCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0xMCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IAorbWVudV9oZWxwX2Fib3V0X3RyaWdnZXI9YQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMTAgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBUaGUgdHJpZ2dlciBpcyBhIGxldHRlciBmcm9tIHRoZSB0cmFuc2xhdGlvbiBvZiAnbWVudV9oZWxwJyB3aGljaCBwcm92aWRlcyBhIGtleWJvYXJkIHNob3J0Y3V0IHRvIHRoZSBtZW51CittZW51X2hlbHBfdHJpZ2dlcj1oCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IE1lbnUgdGl0bGUgZm9yIG9wdGlvbnMgc3VjaCBhcyBjcmVhdGluZyBuZXcgcmVzb3VyY2VzLCBncm91cHMsIGFuZCByZXNvdXJjZSBmaWxlcworbWVudV9vcHRpb25zPUluc3RhbGxuaW5nYXIKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTEwIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgTWVudSBJdGVtIGZvciBjcmVhdGluZyBhIG5ldyByZXNvdXJjZSBpdGVtCittZW51X29wdGlvbnNfYWRkZW50cnk9U2thcGFcIG55XCBvdmVyc2F0dG5pbmcuLi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgCittZW51X29wdGlvbnNfYWRkZW50cnlfdHJpZ2dlcj1pCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IE1lbnUgSXRlbSBmb3IgY3JlYXRpbmcgYSBuZXcgcmVzb3VyY2UgZmlsZSBmb3IgYSBwYXJ0aWN1bGFyIGxhbmd1YWdlL2NvdW50cnkvdmFyaWFudAorbWVudV9vcHRpb25zX2FkZGZpbGU9U2thcGFcIG55XCByZXN1cnNmaWwKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTEwIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCittZW51X29wdGlvbnNfYWRkZmlsZV90cmlnZ2VyPWYKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgTWVudSBpdGVtIGZvciBjcmVhdGluZyBhIG5ldyByZXNvdXJjZSBncm91cAorbWVudV9vcHRpb25zX2FkZGdyb3VwPVNrYXBhXCBueVwgZ3J1cHAKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTEwIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCittZW51X29wdGlvbnNfYWRkZ3JvdXBfdHJpZ2dlcj1nCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBNZW51IGl0ZW0gZm9yIGVkaXRpbmcgdGhlIHVzZXIncyBwcmVmZXJlbmNlcyBmb3IgdGhlIGFwcGxpY2F0aW9uCittZW51X29wdGlvbnNfcHJlZmVyZW5jZXM9UGVyc29ubGlnYVwgaW5zdGFsbG5pbmdhci4uLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMTAgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCittZW51X29wdGlvbnNfcHJlZmVyZW5jZXNfdHJpZ2dlcj1wCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTEtMjAgQG1vZGlmaWVkIDIwMDEtMTEtMjAgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBNZW51IGl0ZW0gdGhhdCBtYWtlcyB2aXNpYmxlIHRoZSBwcm9qZWN0IHZpZXdlcgorbWVudV9vcHRpb25zX3Byb2plY3Rfdmlld2VyPU9wZW5cIFByb2plY3RcIFZpZXdlcgorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTExLTIwIEBtb2RpZmllZCAyMDAxLTExLTIwIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgCittZW51X29wdGlvbnNfcHJvamVjdF92aWV3ZXJfdHJpZ2dlcj12CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IFRoZSB0cmlnZ2VyIGlzIGEgbGV0dGVyIGZyb20gdGhlIHRyYW5zbGF0aW9uIG9mICdtZW51X29wdGlvbnMnIHdoaWNoIHByb3ZpZGVzIGEga2V5Ym9hcmQgc2hvcnRjdXQgdG8gdGhlIG1lbnUKK21lbnVfb3B0aW9uc190cmlnZ2VyPWkKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMi0xNyBAbW9kaWZpZWQgMjAwMS0xMi0xNyBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IFBvcHVwIG1lbnUgaXRlbSBmb3IgYWRkaW5nIGEgbmV3IHJlc291cmNlIGJ1bmRsZSB0byB0aGUgcHJvamVjdAorbWVudV90cmVlX2FkZF9wcm9qZWN0X2J1bmRsZT1BZGRcIFJlc291cmNlXCBCdW5kbGUuLi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTA2LTI3IEBtb2RpZmllZCAyMDAxLTA3LTAyIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgUG9wdXAgbWVudSBpdGVtIGZvciBkZWxldGluZyBwZXJtYW5lbnRseSBhIHJlc291cmNlIGZpbGUKK21lbnVfdHJlZV9kZWxldGU9VGFcIGJvcnRcIHJlc3Vyc1wgZmlsCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wNi0yNyBAbW9kaWZpZWQgMjAwMS0wNy0wMiBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IFBvcHVwIG1lbnUgaXRlbSBmb3IgcmVtb3ZpbmcgYSBzcGVjaWZpYyByZXNvdXJjZSBmaWxlIGZyb20gdGhlIHRyZWUgdmlldyBvZiB0aGUgcmVzb3VyY2UgYnVuZGxlCittZW51X3RyZWVfaGlkZT1HXHUwMEY2bVwgcmVzdXJzXCBmaWwKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMi0xOSBAbW9kaWZpZWQgMjAwMS0xMi0xOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IFBvcHVwIG1lbnUgaXRlbSBmb3IgY3JlYXRpbmcgYSBuZXcgcHJvamVjdAorbWVudV90cmVlX25ld19wcm9qZWN0PU5ld1wgUmVzb3VyY2VcIEJ1bmRsZVwgUHJvamVjdC4uLgorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTEyLTE3IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgUG9wdXAgbWVudSBpdGVtIGZvciBvcGVuaW5nIGEgcmVzb3VyY2UgYnVuZGxlIHByb2plY3QKK21lbnVfdHJlZV9vcGVuX3Byb2plY3Q9T3BlblwgUmVzb3VyY2VcIEJ1bmRsZVwgUHJvamVjdC4uLgorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTEyLTE3IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgUG9wdXAgbWVudSBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZSBidW5kbGUgaW4gdGhlIHByb2plY3QgdHJlZQorbWVudV90cmVlX3JlbW92ZV9wcm9qZWN0X2J1bmRsZT1SZW1vdmVcIGZyb21cIFByb2plY3QKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTA2LTI3IEBtb2RpZmllZCAyMDAxLTA3LTAyIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgUG9wdXAgbWVudSBpdGVtIGZvciBzYXZpbmcgYSBzcGVjaWZpYyByZXNvdXJjZSBidW5kbGUgZmlsZQorbWVudV90cmVlX3NhdmU9U3BhcmFcIHJlc3Vyc1wgZmlsCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMTItMTcgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBQb3B1cCBtZW51IGl0ZW0gZm9yIHNhdmluZyBjaGFuZ2VzIHRvIHRoZSByZXNvdXJjZSBwcm9qZWN0IGZpbGUsIG5vdCB0aGUgcmVzb3VyY2UgYnVuZGxlcyB0aGVtc2VsdmVzIHdpdGhpbiB0aGUgcHJvamVjdAorbWVudV90cmVlX3NhdmVfcHJvamVjdD1TYXZlXCBSZXNvdXJjZVwgQnVuZGxlXCBQcm9qZWN0XCBGaWxlLi4uCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMTItMTcgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBQb3B1cCBtZW51IGZvciBzZWxlY3RpbmcgYSByZXNvdXJjZSBidW5kbGUgZnJvbSB0aGUgcHJvamVjdCB0cmVlIHRvIGJlIGVkaXRlZCBpbiB0aGUgcmVzb3VyY2UgYnVuZGxlIHRyZWUKK21lbnVfdHJlZV9zZWxlY3RfcHJvamVjdF9idW5kbGU9V29ya1wgd2l0aFwgdGhpc1wgUmVzb3VyY2VcIEJ1bmRsZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBNZW51IHRpdGxlIGZvciBjaGFuZ2luZyB0aGUgZGlzcGxheSBiZWluZyBzZWVuIGJ5IHRoZSB1c2VyCittZW51X3ZpZXc9VmlzYQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBNZW51IGl0ZW0gdGhhdCB0YWtlcyB5b3UgZGlyZWN0bHkgdG8gdGhlIHN0YXRpc3RpY3MgcGFuZWwgZm9yIHRoZSBlbnRpcmUgYnVuZGxlCittZW51X3ZpZXdfc3RhdGlzdGljcz1TdGF0aXN0aWtcIGZvclwgcmVzdXJzZ3J1cHAKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTEwIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgCittZW51X3ZpZXdfc3RhdGlzdGljc190cmlnZ2VyPXMKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTEwIEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgVGhlIHRyaWdnZXIgaXMgYSBsZXR0ZXIgZnJvbSB0aGUgdHJhbnNsYXRpb24gb2YgJ21lbnVfdmlldycgd2hpY2ggcHJvdmlkZXMgYSBrZXlib2FyZCBzaG9ydGN1dCB0byB0aGUgbWVudQorbWVudV92aWV3X3RyaWdnZXI9dgorCisjCisjIEBncm91cCBQcm9qZWN0IFBhbmVsCisjCisjIEBncm91cENvbW1lbnQgUGFuZWwgYXNzb2NpYXRlZCB3aXRoIFByb2plY3QgZWRpdGluZworCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTItMTkgQG1vZGlmaWVkIDIwMDEtMTItMTkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAezB9IFRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZSBidW5kbGUKKyMgQGNvbW1lbnQgTGFiZWwgaW5kaWNhdG9yIGFzc29jaWF0aW5nIGEgdGV4dCBib3ggY29udGFpbmluZyBhIHRyYW5zbGF0aW9uIHdpdGggdGhlIHJlc291cmNlIGJ1bmRsZSB0aGUgdHJhbnNsYXRpb24gY29tZXMgZnJvbQorcHJvamVjdF9wYW5lbF9idW5kbGU9UmVzb3VyY2VcIEJ1bmRsZVw6XCB7MH0KKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMi0xOSBAbW9kaWZpZWQgMjAwMS0xMi0xOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEB7MH0gTmFtZSBvZiB0aGUgcmVzb3VyY2UgYnVuZGxlCisjIEBjb21tZW50IFNwZWNpYWwgaW5kaWNhdG9yIG9mIHRoZSByZXNvdXJjZSBpdGVtIHJlc291cmNlIGJ1bmRsZSB3aGVuIHRoZSBpdGVtIGlzIHVudHJhbnNsYXRlZAorcHJvamVjdF9wYW5lbF9idW5kbGVfdW50cmFuc2xhdGVkPVJlc291cmNlXCBCdW5kbGVcOlwgezB9XCAoVW50cmFuc2xhdGVkKQorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTEyLTE5IEBtb2RpZmllZCAyMDAxLTEyLTE5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgTGFiZWwgdGV4dCBtYXJraW5nIHRoZSBsaW5lIGFib3ZlIG9yIHRvIHRoZSBsZWZ0IG9mIGEgcmVzb3VyY2UgY29tbWVudAorcHJvamVjdF9wYW5lbF9jb21tZW50PUJhc2VcIENsYXNzXCBSZXNvdXJjZVwgQ29tbWVudFw6CisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTItMTkgQG1vZGlmaWVkIDIwMDEtMTItMTkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBMYWJlbCB0ZXh0IGZvciBhIGNvbW1lbnQgd2hlbiBub25lIGlzIGZvdW5kIGZvciBhIHJlc291cmNlCitwcm9qZWN0X3BhbmVsX2NvbW1lbnRfbm9uZT1Ob1wgY29tbWVudFwgc3VwcGxpZWQKKyMgQHRyYW5zbGF0ZWQgZmFsc2UgQGNyZWF0ZWQgMjAwMS0xMi0xOSBAbW9kaWZpZWQgMjAwMS0xMi0xOSBAY3JlYXRvciBVbmtub3duIEBtb2RpZmllciBVbmtub3duCisjIEBjb21tZW50IEJ1dHRvbiB0aXRsZSBzaG93biBvbiB0aGUgcHJvamVjdCBwYW5lbCBmb3IgY29tbWl0dGluZyBjaGFuZ2UgdG8gb25lIHJlc291cmNlIG9ubHkKK3Byb2plY3RfcGFuZWxfY29tbWl0X2J1dHRvbj1Db21taXRcIENoYW5nZQorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTEyLTE5IEBtb2RpZmllZCAyMDAxLTEyLTE5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgQnV0dG9uIHRpdGxlIG9uIHRoZSBwcm9qZWN0IHBhbmVsIGZvciBzYXZpbmcgYWxsIG9mIHRoZSByZXNvdXJjZXMgZGlzcGxheWVkLiBUaGlzIG1lYW5zIG11bHRpcGxlIHJlc291cmNlIGZpbGVzIGdldCBzYXZlZC4KK3Byb2plY3RfcGFuZWxfY29tbWl0X2J1dHRvbl9hbGw9Q29tbWl0XCBBbGxcIFJlc291cmNlXCBDaGFuZ2VzCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTItMTkgQG1vZGlmaWVkIDIwMDEtMTItMTkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBEZWZhdWx0IHRpdGxlIHNob3duIG9uIHRoZSBwcm9qZWN0IHBhbmVsIHdoZW4gbm8gcGFydGljdWxhciByZXNvdXJjZSBoYXMgYmVlbiBzZWxlY3RlZAorcHJvamVjdF9wYW5lbF9kZWZhdWx0X3RpdGxlPVByb2plY3RcIFJlc291cmNlXCBFZGl0aW5nCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTItMTkgQG1vZGlmaWVkIDIwMDEtMTItMTkgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBUZXh0IGZpZWxkIG1hcmtlciBmb3IgdGhlIHRyYW5zbGF0aW9uIG9mIGEgcmVzb3VyY2Ugd2hlbiB0aGF0IHJlc291cmNlIGRvZXMgbm90IGV4aXN0IGZvciB0aGUgZW5jb2RpbmcgZmlsZSBpdCBpcyBhc3NvY2lhdGVkIHdpdGgKK3Byb2plY3RfcGFuZWxfaXRlbV9pbmhlcml0cz08Tm9cIFRyYW5zbGF0aW9uXDpcIFJlc291cmNlXCBJbmhlcml0c1wgZnJvbVwgcGFyZW50PgorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTEyLTE5IEBtb2RpZmllZCAyMDAxLTEyLTE5IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQHswfSBUaGUga2V5IG9mIHRoZSBzZWxlY3RlZCByZXNvdXJjZQorIyBAY29tbWVudCBUaXRsZSBvbiB0aGUgcHJvamVjdCBwYW5lbCB3aGlsZSBhIHJlc291cmNlIGlzIHNlbGVjdGVkCitwcm9qZWN0X3BhbmVsX3RpdGxlPVByb2plY3RcIFJlc291cmNlXCBFZGl0aW5nXDpcIHswfQorCisjCisjIEBncm91cCBSQlJlcG9ydGVyCisjCisjIEBncm91cENvbW1lbnQgVHJhbnNsYXRpb25zIGZvciB0aGUgUkJSZXBvcnRlciBhcHBsaWNhdGlvbgorCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBCdXR0b24gdGl0bGUgZm9yIHNlbGVjdGluZyBmaWxlIGxvY2F0aW9ucyBmb3IgaW5wdXQvb3V0cHV0CityZXBvcnRlcl9idXR0b25fY2hvb3NlPVZcdTAwRTRsai4uLgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgQnV0dG9uIGluZGljYXRpbmcgdGhlIHJlcG9ydCBnZW5lcmF0aW9uIHNob3VsZCBvY2N1ciBpbW1lZGlhdGVseQorcmVwb3J0ZXJfYnV0dG9uX25vdz1VcGRhdGVyYVwgbnUuLi4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTI5IEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgQnV0dG9uIHRpdGxlIGZvciBzYXZpbmcgdGhlIGN1cnJlbnQgc2V0dGluZ3MgYXMgZGVmYXVsdAorcmVwb3J0ZXJfYnV0dG9uX3NhdmVfZGVmYXVsdHM9U3BhcmFcIGluc3RcdTAwRTRsbG5pbmdhclwgc29tXCBza1x1MDBGNm5zdlx1MDBFNHJkZW4KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEJ1dHRvbiB0byBhY3RpdmF0ZSB0aGUgcmVwb3J0ZXIKK3JlcG9ydGVyX2J1dHRvbl9zdGFydD1TdGFydGEKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEJ1dHRvbiB0byBkZWFjdGl2ZSB0aGUgcmVwb3J0ZXIKK3JlcG9ydGVyX2J1dHRvbl9zdG9wPVN0b3BwYQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgTGV2ZWwgb2YgZGV0YWlsOiBtb3N0IGluZm9ybWF0aW9uIGF2YWlsYWJsZQorcmVwb3J0ZXJfZGV0YWlsX2hpZ2g9SFx1MDBGNmcKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEluZGljYXRpb24gb2YgYSBzZWxlY3Rpb24gb3B0aW9uIG9mIHRoZSBsZXZlbCBvZiBkZXRhaWwgaW4gcmVwb3J0aW5nCityZXBvcnRlcl9kZXRhaWxfbGV2ZWw9RGV0YWxqbml2XHUwMEU1XDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IExldmVsIG9mIGRldGFpbDogc3RhbmRhcmQKK3JlcG9ydGVyX2RldGFpbF9ub3JtYWw9Tm9ybWFsCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBBbiBvdXRwdXQgZm9ybWF0OiBIVE1MCityZXBvcnRlcl9mb3JtYXRfaHRtbD1IVE1MCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMC0xMS0xNyBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgQW4gb3V0cHV0IGZvcm1hdCB0eXBlOiBwbGFpbiB0ZXh0CityZXBvcnRlcl9mb3JtYXRfdGV4dD1UZXh0CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMC0xMS0xNyBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQKKyMgQGNvbW1lbnQgQW4gb3V0cHV0IGZvcm1hdDogWE1MCityZXBvcnRlcl9mb3JtYXRfeG1sPVhNTAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgSW5kaWNhdGlvbiBvZiBmaWxlIGxvY2F0aW9uIG9mIHRoZSByZXNvdXJjZSBidW5kbGUgdG8gcmVwb3J0IG9uCityZXBvcnRlcl9pbnB1dF9idW5kbGU9UmVzdXJzYnVudFw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBJbmRpY2F0aW9uIHRoYXQgcmVwb3J0aW5nIHdpbGwgaGFwcGVuIGF0IGEgc3BlY2lpZmllZCB0aW1lIG9mIGRheS4gRm9sbG93ZWQgYnkgYSB0aW1lIGFuZCBkYXkgb3B0aW9uLgorcmVwb3J0ZXJfaW50ZXJ2YWxfZGVmaW5lZD1SYXBwb3J0ZXJhXCB2aWQKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFRleHQgaW5kaWNhdGlvbiBvZiBzZXF1ZW50aWFsIHJlcG9ydGluZyBwYXVzZWQgZm9yIGEgZGVmaW5lZCBpbnRlcnZhbCBiZXR3ZWVuIHJlcG9ydGluZy4gSW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSBudW1iZXIgYW5kIGEgdW5pdCBvZiBtZWFzdXJlIG9mIHRpbWUKK3JlcG9ydGVyX2ludGVydmFsX3NlcXVlbnRpYWw9UmFwb3J0ZXJhXCB2YXJqZQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQHswfSBEYXRlL1RpbWUgb2YgbGFzdCByZXBvcnQgZ2VuZXJhdGlvbgorIyBAY29tbWVudCBJbmRpY2F0aW9uIG9mIHRoZSB0aW1lIG9mIHRoZSBsYXN0IHJlcG9ydAorcmVwb3J0ZXJfbGFzdF9yZXBvcnQ9U2VuYXN0ZVwgcmFwcG9ydFw6XCB7MAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQHswfSBEYXRlL1RpbWUgb2YgbmV4dCByZXBvcnQKKyMgQGNvbW1lbnQgSW5kaWNhdGlvbiBvZiB3aGVuIHRoZSBuZXh0IHJlcG9ydCB3aWxsIGJlIGdlbmVyYXRlZAorcmVwb3J0ZXJfbmV4dF9yZXBvcnQ9Tlx1MDBFNHN0YVwgcmFwcG9ydFw6XCB7MH0KKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEluZGljYXRpb24gb2YgdGhlIG91dHB1dCBkaXJlY3RvcnkgaW50byB3aGljaCB0aGUgcmVwb3J0cyBhcmUgcGxhY2VkCityZXBvcnRlcl9vdXRwdXRfZGlyZWN0b3J5PVV0Zm9sZGVyXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IEFuIGluZGljYXRpb24gb2YgdGhlIG5hbWUgb2YgdGhlIG91dHB1dCBmaWxlIGZvciBhIHBhcnRpY3VsYXIgb3V0cHV0IGZvcm1hdAorcmVwb3J0ZXJfb3V0cHV0X2ZpbGU9RmlsbmFtblw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBQYW5lbCB0aXRsZSBmb3Igc2V0dGluZyBpbnRlcnZhbCBvZiByZXBvcnRpbmcKK3JlcG9ydGVyX3BhbmVsX2ludGVydmFsPVJhcHBvcnRpbnRlcnZhbGwKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFBhbmVsIHRpdGxlIGZvciBjb25maWd1cmFibGUgb3B0aW9ucyBvZiB0aGUgcmVwb3J0aW5nCityZXBvcnRlcl9wYW5lbF9vcHRpb25zPVJhcHBvcnRcIGluc3RcdTAwRTRsbG5pbmdhcgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgU3VicGFuZWwgdGl0bGUgZm9yIGNob29zaW5nIG91dHB1dCBmb3JtYXRzIGZvciB0aGUgcmVwb3J0cworcmVwb3J0ZXJfcGFuZWxfb3V0cHV0X2Zvcm1hdD1VdGZvcm1hdAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgUGFuZWwgdGl0bGUgZm9yIGluZGljYXRpb24gb2YgcnVubmluZyBzdGF0dXMgb2YgdGhlIHJlcG9ydGVyCityZXBvcnRlcl9wYW5lbF9zdGF0dXM9U3RhdHVzCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wNiBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFNob3J0IHRpdGxlIGZvciBzZWxlY3RpbmcgYSBjb2RlIHNjYW4gY29uZmlndXJhdGlvbiBmaWxlCityZXBvcnRlcl9wZXJmb3JtX3NjYW49S29kYVwgZmlsZXIKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFF1aWNrIGluZGljYXRpb24gdGhhdCB0aGUgcmVwb3J0ZXIgaXMgYWN0aXZlIChwZXJoYXBzIHdhaXRpbmcpCityZXBvcnRlcl9zdGF0dXNfcnVubmluZz1TdGFydGFkCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBRdWljayBzdGF0dXMgaW5kaWNhdGlvbiB0aGF0IHRoZSByZXBvcnRlciBpcyBub3QgYWN0aXZlCityZXBvcnRlcl9zdGF0dXNfc3RvcHBlZD1TdG9wcGFkCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBkYXlzIG9wdGlvbgorcmVwb3J0ZXJfdGltZV9kYXlzPURhZ2FyCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBldmVyeSBkYXkgb3B0aW9uCityZXBvcnRlcl90aW1lX2V2ZXJ5ZGF5PVZhcmplXCBkYWcKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IGZyaWRheSBvcHRpb24KK3JlcG9ydGVyX3RpbWVfZnJpZGF5PUZyZWRhZworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgaG91cnMgb3B0aW9uCityZXBvcnRlcl90aW1lX2hvdXJzPVRpbW1hcgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgbWludXRlcyBvcHRpb24KK3JlcG9ydGVyX3RpbWVfbWludXRlcz1NaW51dGVyCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBtb25kYXkgb3B0aW9uCityZXBvcnRlcl90aW1lX21vbmRheT1NXHUwMEU1bmRhZworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgc2F0dXJkYXkgb3B0aW9uCityZXBvcnRlcl90aW1lX3NhdHVyZGF5PUxcdTAwRjZyZGFnCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBzdW5kYXkgb3B0aW9uCityZXBvcnRlcl90aW1lX3N1bmRheT1TXHUwMEY2bmRhZworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTcgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgdGh1cnNkYXkgb3B0aW9uCityZXBvcnRlcl90aW1lX3RodXJzZGF5PVRvcnNkYWcKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IHR1ZXNkYXkgb3B0aW9uCityZXBvcnRlcl90aW1lX3R1ZXNkYXk9VGlzZGFnCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xNyBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCB3ZWRuZXNkYXkgb3B0aW9uCityZXBvcnRlcl90aW1lX3dlZG5lc2RheT1PbnNkYWcKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTE3IEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IFRpdGxlIG9mIHRoZSBhcHBsaWNhdGlvbgorcmVzb3VyY2VfYnVuZGxlX3JlcG9ydGVyPVJCUmVwb3J0ZXIKKworIworIyBAZ3JvdXAgU2VhcmNoIGFuZCBSZXBsYWNlCisjCisjIEBncm91cENvbW1lbnQgUmVzb3VyY2VzIGZvdW5kIG9uIHRoZSBzZWFyY2ggdGFiIHBhbmUKKworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDYgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBHZW5lcmFsIHNlYXJjaCB0aXRsZQorc2VhcmNoPUxldGEKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTA3IEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgQ2hlY2sgYm94IG9wdGlvbiBmb3IgbWFraW5nIHRoZSBzZWFyY2ggY2FzZSBzZW5zaXRpdmUgb3Igbm90CitzZWFyY2hfY2FzZV9zZW5zaXRpdmU9Qm9rc3RhdnNrXHUwMEU0bnNsaWdcIHNcdTAwRjZrbmluZ1w6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMS0wMi0wNiBAbW9kaWZpZWQgMjAwMS0wMi0xOSBAY3JlYXRvciBKYXJlZCBKYWNrc29uIEBtb2RpZmllciBKYXJlZCBKYWNrc29uCisjIEBjb21tZW50IENoZWNrIGJveCBvcHRpb24gZm9yIHNlYXJjaGluZyB0aHJvdWdoIHJlc291cmNlIGNvbW1lbnRzCitzZWFyY2hfY29tbWVudHM9S29tbWVudGFyZXIKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTA2IEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgVGV4dCBpbmRpY2F0aW9uIG9mIHRoZSBmaWVsZCBmb3IgZW50ZXJpbmcgdGV4dCB0byBzZWFyY2ggb24KK3NlYXJjaF9maW5kPUhpdHRhXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTA2IEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgQ2hlY2sgYm94IHNlbGVjdGlvbiBmb3Igc2VhcmNoaW5nIG9wdGlvbiB0aHJvdWdoIHJlc291cmNlIGtleXMKK3NlYXJjaF9rZXlzPVJlc3Vyc255Y2tsYXIKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTA2IEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgVGV4dCBpbmRpY2F0aW9uIG9mIHRoZSBmaWVsZCBmb3IgZW50ZXJpbmcgdGV4dCBmb3IgcmVwbGFjaW5nIHRoZSBmb3VuZCB2YWx1ZQorc2VhcmNoX3JlcGxhY2U9RXJzXHUwMEU0dHRcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDEtMDItMDYgQG1vZGlmaWVkIDIwMDEtMDItMTkgQGNyZWF0b3IgSmFyZWQgSmFja3NvbiBAbW9kaWZpZXIgSmFyZWQgSmFja3NvbgorIyBAY29tbWVudCBDaGVjayBib3ggb3B0aW9uIGZvciBzZWFyY2hpbmcgdGhyb3VnaCB0cmFuc2xhdGlvbiB2YWx1ZXMKK3NlYXJjaF92YWx1ZXM9XHUwMEQ2dmVyc1x1MDBFNHR0bmluZ2FyCisKKyMKKyMgQGdyb3VwIFRhYnMKKyMKKyMgQGdyb3VwQ29tbWVudCBHVUkgVGFicyBpbiB0aGUgbWFpbiBwYW5lbAorCisjIEB0cmFuc2xhdGVkIGZhbHNlIEBjcmVhdGVkIDIwMDEtMTItMTcgQG1vZGlmaWVkIDIwMDEtMTItMTcgQGNyZWF0b3IgVW5rbm93biBAbW9kaWZpZXIgVW5rbm93bgorIyBAY29tbWVudCBHVUkgVGFiIGZvciBUYWJiZWQgUGFuZSBvdmVyIHRoZSB0cmVlIHNob3dpbmcgYSBzaW5nbGUgcmVzb3VyY2UgYnVuZGxlIGFuZCBpdHMgdmFyaW91cyBmaWxlcwordGFiX2J1bmRsZT1CdW5kbGUKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IFRhYiBmb3IgdGhlIGRpc3BsYXkgb2YgdGhlIHZhcmlvdXMgZ3JvdXBzIGluIHRoZSBidW5kbGUKK3RhYl9ncm91cHM9R3J1cHBlcgorIyBAdHJhbnNsYXRlZCBmYWxzZSBAY3JlYXRlZCAyMDAxLTEyLTE3IEBtb2RpZmllZCAyMDAxLTEyLTE3IEBjcmVhdG9yIFVua25vd24gQG1vZGlmaWVyIFVua25vd24KKyMgQGNvbW1lbnQgR1VJIFRhYiBmb3IgdGFiIG92ZXIgdHJlZSBzaG93aW5nIGEgcmVzb3VyY2UgYnVuZGxlIHByb2plY3QKK3RhYl9wcm9qZWN0PVByb2plY3QKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAyLTA2IEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgVGl0bGUgZm9yIHBhbmUgYWxsb3dpbmcgZm9yIHNlYXJjaCBhbmQgcmVwbGFjZSBmdW5jdGlvbnMKK3RhYl9zZWFyY2g9TGV0YQorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgVGFiIGZvciBzdGF0aXN0aWNzIGRpc3BsYXkgZm9yIGVpdGhlciB0aGUgUmVzb3VyY2UgQnVuZGxlIGFzIGEgd2hvbGUgb3IgcGFydGljdWxhciBsYW5ndWFnZSBmaWxlcwordGFiX3N0YXRpc3RpY3M9U3RhdGlzdGlrCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBUYWIgZm9yIGRpc3BsYXkgb2YgdW50cmFuc2xhdGVkIGl0ZW1zIGluIHRoZSBkaWZmZXJlbnQgbGFuZ3VhZ2UgZmlsZXMKK3RhYl91bnRyYW5zbGF0ZWQ9T292ZXJzYXR0CisKKyMKKyMgQGdyb3VwIFRyYW5zbGF0aW9uIEZpbGUgR3JvdXBzIFBhbmUKKyMKKyMgQGdyb3VwQ29tbWVudCAKKworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgQ29sdW1uIHRpdGxlIGZvciBpdGVtIGNvbW1lbnRzCitsYW5ndWFnZWdyb3VwX2NvbHVtbl9jb21tZW50PUtvbW1lbnRhcgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgQ29sdW1uIHRpdGxlIGZvciBpdGVtJ3MgcmVzb3VyY2Uga2V5CitsYW5ndWFnZWdyb3VwX2NvbHVtbl9rZXk9UmVzdXJzbnlja2VsCisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCAKK2xhbmd1YWdlZ3JvdXBfY29sdW1uX3RyYW5zbGF0aW9uPU92ZXJzYXR0bmluZworCisjCisjIEBncm91cCBUcmFuc2xhdGlvbiBGaWxlIFN0YXRpc3RpY3MgUGFuZQorIworIyBAZ3JvdXBDb21tZW50IFRyYW5zbGF0aW9ucyBmb3Igc3RyaW5ncyBpbiB0aGUgbGFuZ3VhZ2UgZmlsZSBzdGF0aXN0aWNzIHBhbmUKKworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgQSBjb21tZW50IGdpdmVuIHRvIHRoZSBmaWxlCitsYW5ndWFnZXN0YXRzX2NvbW1lbnQ9S29tbWVudGFyXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IFRoZSBjb3VudHJ5IGJlaW5nIGRlc2NyaWJlZCBieSB0aGUgZmlsZQorbGFuZ3VhZ2VzdGF0c19jb3VudHJ5PUxhbmRcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgVGhlIG51bWJlciBvZiByZXNvdXJjZXMgaW4gdGhlIGZpbGUKK2xhbmd1YWdlc3RhdHNfaXRlbV9jb3VudD1BbnRhbFwgcmVzdXJzZXJcIGlcIGRlblwgaGFyXCBmaWxlblw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBUaGUgbGFuZ3VhZ2UgZGVzY3JpYmVkIGJ5IHRoZSBmaWxlCitsYW5ndWFnZXN0YXRzX2xhbmd1YWdlPVNwcmFrXDoKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IFRoZSBuYW1lIG9mIGEgcGVyc29uIHJlc3BvbnNpYmxlIGZvciB0aGUgdHJhbnNsYXRpb25zIGluIHRoaXMgbGFuZ3VhZ2UgZmlsZQorbGFuZ3VhZ2VzdGF0c19tYW5hZ2VyPVJlc3Vyc2ZpbFwgYWdhcmVcOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgVGhlIG5hbWUgZ2l2ZW4gdG8gdGhlIGxhbmd1YWdlIGZpbGUKK2xhbmd1YWdlc3RhdHNfdGl0bGU9UmVzdXJzXCB0aXRlbFw6CisjIEB0cmFuc2xhdGVkIHRydWUgQGNyZWF0ZWQgMjAwMC0xMS0xMCBAbW9kaWZpZWQgMjAwMC0xMS0wOCBAY3JlYXRvciBKYXJlZCBAbW9kaWZpZXIgU3RlZmFuIEVkbHVuZAorIyBAY29tbWVudCBOdW1iZXIgb2YgcmVzb3VyY2VzIG5lZWRpbmcgdHJhbnNsYXRpb24gaW4gdGhlIGZpbGUKK2xhbmd1YWdlc3RhdHNfdHJhbnNsYXRpb25fY291bnQ9QW50YWxcIG9vdmVyc2F0dGFcIHJlc3Vyc3Nha2VyXCBpXCBkZW5cIGhhclwgZmlsZW5cOgorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgVGhlIGxhbmd1YWdlL3JlZ2lvbiB2YXJpYW50IGRlc2NyaWJlZCBieSB0aGUgZmlsZQorbGFuZ3VhZ2VzdGF0c192YXJpYW50PVZhcmlhbnRcIFw6CisKKyMKKyMgQGdyb3VwIFRyYW5zbGF0aW9uIEZpbGUgVW50cmFuc2xhdGVkIEl0ZW1zIFBhbmUKKyMKKyMgQGdyb3VwQ29tbWVudCAKKworIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgVGhlIGNvbHVtbiB0aXRsZSBmb3IgZ3JvdXAgbmFtZXMgb2YgaXRlbXMgaW4gdGhlIHJvd3MKK2xhbmd1YWdldW50cmFuc19jb2x1bW5fZ3JvdXA9R3J1cHAKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAwLTExLTEwIEBtb2RpZmllZCAyMDAwLTExLTA4IEBjcmVhdG9yIEphcmVkIEBtb2RpZmllciBTdGVmYW4gRWRsdW5kCisjIEBjb21tZW50IFRoZSBrZXkgb2YgdGhlIGl0ZW0gYSByb3cKK2xhbmd1YWdldW50cmFuc19jb2x1bW5fa2V5PVJlc3Vyc255Y2tlbAorIyBAdHJhbnNsYXRlZCB0cnVlIEBjcmVhdGVkIDIwMDAtMTEtMTAgQG1vZGlmaWVkIDIwMDAtMTEtMDggQGNyZWF0b3IgSmFyZWQgQG1vZGlmaWVyIFN0ZWZhbiBFZGx1bmQKKyMgQGNvbW1lbnQgVGhlIHRyYW5zbGF0ZWQgdmFsdWUgb2YgYW4gaXRlbSBpbiBhIHJvdworbGFuZ3VhZ2V1bnRyYW5zX2NvbHVtbl90cmFuc2xhdGlvbj1PdmVyc2F0dG5pbmcKKyMgQHRyYW5zbGF0ZWQgdHJ1ZSBAY3JlYXRlZCAyMDAxLTAxLTIzIEBtb2RpZmllZCAyMDAxLTAyLTE5IEBjcmVhdG9yIEphcmVkIEphY2tzb24gQG1vZGlmaWVyIEphcmVkIEphY2tzb24KKyMgQGNvbW1lbnQgUGFuZWwgdGl0bGUgY292ZXJpbmcgYnV0dG9ucyB0aGF0IGFwcGx5IHRvIGEgc2VsZWN0ZWQgcmVzb3VyY2UgZnJvbSBhIHRhYmxlIG9mIHJlc291cmNlcworbGFuZ3VhZ2V1bnRyYW5zX3NlbGVjdGVkX3Jlc291cmNlc19vcHRpb25zPUluc3RcdTAwRTRsbG5pbmdhclwgZlx1MDBGNnJcIHZhbGRcIHJlc3VycwpkaWZmIC0tZ2l0IGEvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL3Jlc291cmNlcy9wcmVmZXJlbmNlcy5wcm9wZXJ0aWVzIGIvdW5pY29kZXRvb2xzL2NvbS9pYm0vcmJtL3Jlc291cmNlcy9wcmVmZXJlbmNlcy5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ZDc0MmEKLS0tIC9kZXYvbnVsbAorKysgYi91bmljb2RldG9vbHMvY29tL2libS9yYm0vcmVzb3VyY2VzL3ByZWZlcmVuY2VzLnByb3BlcnRpZXMKQEAgLTAsMCArMSwzMyBAQAorI1JCTWFuYWdlciBQcmVmZXJlbmNlcworI1dlZCBEZWMgMTkgMTQ6MDg6NTUgUFNUIDIwMDEKK3JlcG9ydGVyX2Zvcm1hdF9odG1sX2ZpbGU9cmVwb3J0Lmh0bWwKK3VzZXJuYW1lPVVua25vd24KK3JlcG9ydGVyX2Zvcm1hdF90ZXh0X2RldGFpbD1IaWdoCityZXBvcnRlcl9mb3JtYXRfeG1sX2RldGFpbD1IaWdoCityZXBvcnRlcl9mb3JtYXRfaG10bF9lbmFibGVkPVllcworcmVwb3J0ZXJfZW5hYmxlZD1ZZXMKK3JlcG9ydGVyX2Zvcm1hdF94bWxfZmlsZT1yZXBvcnQueG1sCityZXBvcnRlcl9pbnRlcnZhbF9kZWZpbmVkX2hvdXI9MQorcmVwb3J0ZXJfaW50ZXJ2YWxfc2VxdWVudGlhbF92YWx1ZT0xCityZXBvcnRlcl9pbnRlcnZhbF9zZXF1ZW50aWFsX3VuaXRzPUhvdXJzCityZXBvcnRlcl9wZXJmb3JtX3NjYW49WWVzCityZXBvcnRlcl9mb3JtYXRfdGV4dF9maWxlPXJlcG9ydC50eHQKK3JlcG9ydGVyX2Zvcm1hdF94bWxfZW5hYmxlZD1ZZXMKK3JlcG9ydGVyX2ludGVydmFsX2RlZmluZWRfZGF5PVNhdHVyZGF5Citsb2NhbGU9ZW4KK3JlcG9ydGVyX2ludGVydmFsPVNlcXVlbnRpYWwKK3JlY2VudGZpbGVsb2MzPQorcmVjZW50ZmlsZWxvYzI9CityZWNlbnRmaWxlbG9jMT0KK3JlY2VudGZpbGVsb2MwPQorcmVwb3J0ZXJfc2Nhbl9maWxlPS4vcmJtYW5hZ2VyX3NjYW5uZXIueG1sCityZXBvcnRlcl9mb3JtYXRfaHRtbF9lbmFibGVkPVllcworcmVjZW50ZmlsZWlkMz0KK3JlY2VudGZpbGVpZDI9CityZWNlbnRmaWxlaWQxPQorcmVwb3J0ZXJfaW50ZXJ2YWxfZGVmaW5lZF9taW51dGU9MDAKK3JlY2VudGZpbGVpZDA9CityZXBvcnRlcl9mb3JtYXRfdGV4dF9lbmFibGVkPVllcworcmVwb3J0ZXJfYmFzZV9jbGFzc19maWxlPQorcmVwb3J0ZXJfb3V0cHV0X2RpcmVjdG9yeT0KK3JlcG9ydGVyX2Zvcm1hdF9odG1sX2RldGFpbD1IaWdoCmRpZmYgLS1naXQgYS91bmljb2RldG9vbHMvbGljZW5zZS5odG1sIGIvdW5pY29kZXRvb2xzL2xpY2Vuc2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Yzk2ZWUwCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL2xpY2Vuc2UuaHRtbApAQCAtMCwwICsxLDM0IEBACis8aHRtbD4KKworPGhlYWQ+Cis8dGl0bGU+SUNVNEogbGljZW5zZSAtIElDVTRKIDEuMy4xIGFuZCBsYXRlcjwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5IEJHQ09MT1I9IiNmZmZmZmYiPgorPGgyPklDVTRKIGxpY2Vuc2UgLSBJQ1U0SiAxLjMuMSBhbmQgbGF0ZXI8L2gyPgorCis8cD5DT1BZUklHSFQgQU5EIFBFUk1JU1NJT04gTk9USUNFPC9wPgorCis8cD4KK0NvcHlyaWdodCAoYykgMTk5NS0yMDAyIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24gYW5kIG90aGVycworPC9wPgorPHA+CitBbGwgcmlnaHRzIHJlc2VydmVkLgorPC9wPgorPHA+CitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMKK3RvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZShzKSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUgYW5kIHRoYXQgYm90aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZShzKSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLgorPC9wPgorPHA+CitUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVCBPRiBUSElSRCBQQVJUWSBSSUdIVFMuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIEhPTERFUlMgSU5DTFVERUQgSU4gVEhJUyBOT1RJQ0UgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIE9SIEFOWSBTUEVDSUFMIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCis8L3A+Cis8cD4KK0V4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIGEgY29weXJpZ2h0IGhvbGRlciBzaGFsbCBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgdGhlIGNvcHlyaWdodCBob2xkZXIuCis8L3A+CisKKzxocj4KKzxzbWFsbD4KK0FsbCB0cmFkZW1hcmtzIGFuZCByZWdpc3RlcmVkIHRyYWRlbWFya3MgbWVudGlvbmVkIGhlcmVpbiBhcmUgdGhlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorPC9zbWFsbD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3VuaWNvZGV0b29scy9yZWFkbWUuaHRtbCBiL3VuaWNvZGV0b29scy9yZWFkbWUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODczNDEzCi0tLSAvZGV2L251bGwKKysrIGIvdW5pY29kZXRvb2xzL3JlYWRtZS5odG1sCkBAIC0wLDAgKzEsNDAwIEBACis8aHRtbD4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KKzx0aXRsZT5JQ1UncyBVbmljb2RlIFRvb2xzIFJlYWQgTWU8L3RpdGxlPgorICAgIDxtZXRhIG5hbWU9IkNPUFlSSUdIVCIgY29udGVudD0KKyAgICAiQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIiAvPgorPHN0eWxlPgorPCEtLQorbGkgICAgICAgICAgIHsgbWFyZ2luLXRvcDogMC41ZW07IG1hcmdpbi1ib3R0b206IDAuNWVtIH0KKy0tPgorPC9zdHlsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKKzxoMT5Vbmljb2RlVG9vbHM8L2gxPgorPHA+VGhpcyBmaWxlIHByb3ZpZGVzIGluc3RydWN0aW9ucyBmb3IgYnVpbGRpbmcgYW5kIHJ1bm5pbmcgdGhlIFVuaWNvZGVUb29scywgd2hpY2g8YnI+CitjYW4gYmUgdXNlZCB0bzo8L3A+Cis8dWw+CisgIDxsaT5idWlsZCB0aGUgRGVyaXZlZCBVbmljb2RlIGZpbGVzIGluIHRoZSBVQ0QgKFVuaWNvZGUgQ2hhcmFjdGVyIERhdGFiYXNlKSw8L2xpPgorICA8bGk+YnVpbGQgdGhlIHRyYW5zZm9ybWVkIFVDQSAoVW5pY29kZSBDb2xsYXRpb24gQWxnb3JpdGhtKSBmaWxlcyBuZWVkZWQgYnkgSUNVLjwvbGk+CisgIDxsaT5ydW4gY29uc2lzdGVuY3kgY2hlY2tzIG9uIGJldGEgcmVsZWFzZXMgb2YgdGhlIFVDRCBhbmQgdGhlIFVDQS48L2xpPgorICA8bGk+YnVpbGQgNCBjaGFydCBmb2xkZXJzIG9uIHRoZSB1bmljb2RlIHNpdGU8L2xpPgorPC91bD4KKzxwPjxmb250IGNvbG9yPSIjRkYwMDAwIj48Yj5XQVJOSU5HISE8L2I+PC9mb250PjwvcD4KKzx1bD4KKyAgPGxpPlRoaXMgaXMgTk9UIHByb2R1Y3Rpb24gbGV2ZWwgY29kZSwgYW5kIHNob3VsZCBuZXZlciBiZSB1c2VkIGluIHByb2dyYW1zLjwvbGk+CisgIDxsaT5UaGUgQVBJIGlzIHN1YmplY3QgdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlLCBhbmQgd2lsbCBub3QgYmUgbWFpbnRhaW5lZC48L2xpPgorICA8bGk+VGhlIHNvdXJjZSBpcyB1bmNvbW1lbnRlZCwgYW5kIGhhcyBtYW55IHdhcnRzOyBzaW5jZSBpdCBpcyBub3QgcHJvZHVjdGlvbiBjb2RlLCBpdCBoYXMgbm90IAorICBiZWVuIHdvcnRoIHRoZSB0aW1lIHRvIGNsZWFuIGl0IHVwLjwvbGk+CisgIDxsaT5JdCB3aWxsIHByb2JhYmx5IG5vdCB3b3JrIG9uIFVuaXggb3IgTWFjIHdpdGhvdXQgY2hhbmdpbmcgdGhlIGZpbGUgc2VwYXJhdG9yLjwvbGk+CisgIDxsaT5DdXJyZW50bHkgaXQgdXNlcyBoYXJkLWNvZGVkIGRpcmVjdG9yeSBuYW1lcy48L2xpPgorICA8bGk+VGhlIGNvbnRlbnRzIG9mIG11bHRpcGxlIHZlcnNpb25zIG9mIHRoZSBVQ0QgbXVzdCBiZSBjb3BpZWQgdG8gYSBsb2NhbCBkaXJlY3RvcnksIGFzIGRlc2NyaWJlZCAKKyAgYmVsb3cuPC9saT4KKzwvdWw+Cis8aDI+SW5zdHJ1Y3Rpb25zOjwvaDI+Cis8aDM+MC4gWW91IHdpbGwgbmVlZCB0byBnZXQgSUNVNEogb24geW91ciBzeXN0ZW0sIHVzaW5nIENWUy48L2gzPgorPHA+VGhlIHJlc3Qgb2YgdGhpcyB3aWxsIGFzc3VtZSB0aGF0IHlvdSBoYXZlIHNldCB1cCBDVlMgc28gdGhhdCB5b3UgbG9hZCB0aGUgSUNVNEogcHJvamVjdCBpbnRvIAorQzpcSUNVNEo8YnI+Cis8YnI+CitZb3UgbmVlZCBib3RoIHRoZSBtYWluIGljdTRqIGFuZCBhIHN1YnByb2plY3QgY2FsbGVkIHVuaWNvZGV0b29scy4gU2VlOgorPGEgaHJlZj0iaHR0cDovL3d3dy5pYm0uY29tL3NvZnR3YXJlL2dsb2JhbGl6YXRpb24vaWN1L3JlcG9zaXRvcnkuanNwIj4KK2h0dHA6Ly93d3cuaWJtLmNvbS9zb2Z0d2FyZS9nbG9iYWxpemF0aW9uL2ljdS9yZXBvc2l0b3J5LmpzcDwvYT4uIEluc2lkZSB1bmljb2RldG9vbHMsIGxvb2sgYXQgY29tL2libS90ZXh0LiBUaGUgCittYWluIGRpcmVjdG9yaWVzIG9mIGludGVyZXN0IGFyZSBVQ0QsIFVDQSBhbmQgdXRpbGl0eS48L3A+Cis8aDQ+MGEuIElmIHlvdSBhcmUgdXNpbmcgRWNsaXBzZSBmb3IgeW91ciBJREUsIGxvb2sgYXQgdGhlIGluc3RydWN0aW9ucyBvbgorPGEgaHJlZj0iaHR0cDovL2ljdS5zb3VyY2Vmb3JnZS5uZXQvZG9jcy9lY2xpcHNlX2hvd3RvL2VjbGlwc2VfaG93dG8uaHRtbCI+CitodHRwOi8vaWN1LnNvdXJjZWZvcmdlLm5ldC9kb2NzL2VjbGlwc2VfaG93dG8vZWNsaXBzZV9ob3d0by5odG1sPC9hPiA8L2g0PgorPHA+U2V0IHVwIEVjbGlwc2UgdG8gYnVpbGQgdHdvIHByb2plY3RzOiBJQ1U0SiBhbmQgVW5pY29kZVRvb2xzOjxicj4KKzxicj4KKzxiPlByb2plY3QgTmFtZTogPC9iPklDVTRKPGJyPgorPGI+RGlyZWN0b3J5OiA8L2I+QzpcSUNVNEpcaWN1NGo8YnI+Cis8Yj5EZWZhdWx0IG91dHB1dCBmb2xkZXIgPSA8L2I+SUNVNEovY2xhc3Nlczxicj4KKzxicj4KKzxiPlByb2plY3QgTmFtZTogPC9iPnVuaWNvZGV0b29sczxicj4KKzxiPkNyZWF0ZSBwcm9qZWN0IGZyb20gZXhpc3Rpbmcgc291cmNlOiA8L2I+QzpcSUNVNEpcdW5pY29kZXRvb2xzPGJyPgorPGI+RGVmYXVsdCBPdXRwdXQgRm9sZGVyOiA8L2I+dW5pY29kZXRvb2xzL2NsYXNzZXM8YnI+Cis8YnI+CitBZnRlciBFY2xpcHNlIGlzIHNldCB1cCB3aXRoIHRoZXNlLCBleGNsdWRlIGNlcnRhaW4gZmlsZXMgZnJvbSB1bmljb2RldG9vbHM6PGJyPgorPGJyPgorUmlnaHQtQ2xpY2sgVW5pY29kZVRvb2xzICZndDsgUHJvcGVydGllcyAmZ3Q7IEphdmEgQnVpbGQgUGF0aCAmZ3Q7IEV4Y2x1c2lvbnM8YnI+Citjb20vaWJtL3JibS88YnI+Citjb20vaWJtL3RleHQvdXRpbGl0eS9Vbmljb2RlTWFwSW50LmphdmE8YnI+Citjb20vaWJtL3RleHQvdXRpbGl0eS9UZXN0VXRpbGl0eS5qYXZhPGJyPgorY29tL2libS90ZXh0L1VDRC9HZW5lcmF0ZVRoYWlCcmVha3Mtb2xkLmphdmEvPGJyPgorY29tL2libS90ZXh0L1VDRC9Qcm9jZXNzVW5paGFuLmphdmEvPGJyPgorY29tL2libS90ZXh0L1VDQS9Xcml0ZUhUTUxDb2xsYXRpb24uamF2YS88YnI+Cis8YnI+CitVbmljb2RlVG9vbHMgbXVzdCBhbHNvIGluY2x1ZGUgdGhlIElDVTRKIHByb2plY3QsIHdpdGg8YnI+Cis8YnI+CitSaWdodC1DbGljayBVbmljb2RlVG9vbHMgJmd0OyBQcm9wZXJ0aWVzICZndDsgSmF2YSBCdWlsZCBQYXRoICZndDsgUHJvamVjdHM8L3A+Cis8aDM+MS4gSW4gVUNELCB5b3UgbXVzdCBlZGl0IFVDRF9UeXBlcy5qYXZhIGF0IHRoZSB0b3AsIHRvIHNldCB0aGUgZGlyZWN0b3JpZXMgZm9yIHRoZSBidWlsZDo8L2gzPgorPHA+cHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9ESVIgPSAmcXVvdDtDOlxcREFUQVxcJnF1b3Q7Ozxicj4KK3B1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVDRF9ESVIgPSBCQVNFX0RJUiArICZxdW90O1VDRFxcJnF1b3Q7Ozxicj4KK3B1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJJTl9ESVIgPSBEQVRBX0RJUiArICZxdW90O0JJTlxcJnF1b3Q7Ozxicj4KK3B1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTl9ESVIgPSBEQVRBX0RJUiArICZxdW90O0dFTlxcJnF1b3Q7Ozxicj4KKzxicj4KK01ha2Ugc3VyZSB0aGF0IGVhY2ggb2YgdGhlc2UgZGlyZWN0b3JpZXMgZXhpc3QuIEFsc28gbWFrZSBzdXJlIHRoYXQgdGhlIGZvbGxvd2luZzxicj4KK2V4aXN0Ojxicj4KKzxicj4KKyZsdDtHRU5fRElSJmd0Oy9EZXJpdmVkRGF0YTxicj4KKyZsdDtHRU5fRElSJmd0Oy9EZXJpdmVkRGF0YS9FeHRyYWN0ZWRQcm9wZXJ0aWVzPGJyPgorJmx0O1VDRF9ESVImZ3Q7L0VYVFJBUy1VcGRhdGU8L3A+Cis8aDM+Mi4gRG93bmxvYWQgYWxsIG9mIHRoZSBVbmljb2RlRGF0YSBmaWxlcyBmb3IgZWFjaCB2ZXJzaW9uIGludG8gVUNEX0RJUi48L2gzPgorPHA+VGhlIGZvbGRlciBuYW1lcyBtdXN0IGJlIG9mIHRoZSBmb3JtOiAmcXVvdDszLjIuMC1VcGRhdGUmcXVvdDssIHNvIHJlbmFtZSB0aGUgZm9sZGVycyBvbiB0aGU8YnI+CitVbmljb2RlIHNpdGUgdG8gdGhpcyBmb3JtYXQuIEk8c3BhbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI0ZGRkYwMCI+ZiB0aGUgCitmb2xkZXIgY29udGFpbnMgdWNkLCB0aGVuIG1ha2UgdGhlIGNvbnRlbnRzIG9mIHRoYXQgZGlyZWN0b3J5IGJlIHRoZSBjb250ZW50cyBvZiAKK3RoZSB4LngueC1VcGRhdGUgZGlyZWN0b3J5LiBUaGF0IGlzLCBlYWNoIGRpcmVjdG9yeSB3aWxsIGRpcmVjdGx5IGNvbnRhaW4gZmlsZXMgCitsaWtlIFByb3BMaXN0Li4uLnR4dDwvc3Bhbj48L3A+Cis8aDQ+MmEgRW5zdXJlIENvbXBsZXRlIFJlbGVhc2U8L2g0PgorPHA+SWYgeW91IGFyZSBkb3dubG9hZGluZyBhbnkgJnF1b3Q7aW5jb21wbGV0ZSZxdW90OyByZWxlYXNlIChvbmUgdGhhdCBkb2VzIG5vdCBjb250YWluIGEgY29tcGxldGUgc2V0IG9mIGRhdGEgCitmaWxlcyBmb3IgdGhhdCByZWxlYXNlLCB5b3UgbmVlZCB0byBhbHNvIGRvd25sb2FkIHRoZSBwcmV2aW91cyBjb21wbGV0ZSByZWxlYXNlKS4gTW9zdCBvZiB0aGUgTi5NLVVwZGF0ZSAKK2RpcmVjdG9yaWVzcyBhcmUgY29tcGxldGUsICpleGNlcHQqOjwvcD4KKzxwPjQuMC1VcGRhdGUsIHdoaWNoIGRvZXMgbm90IGNvbnRhaW4gYSBjb3B5IG9mIFVuaWhhbi50eHQgYW5kIHNvbWUgb3RoZXIgZmlsZXM8YnI+CiszLjEtVXBkYXRlLCB3aGljaCBkb2VzIG5vdCBjb250YWluIGEgY29weSBvZiBCaWRpTWlycm9yaW5nLnR4dDwvcD4KKzxwPkFsc28sIG1ha2UgdGhlIGZvbGxvd2luZyBjaGFuZ2VzIHRvIFVuaWNvZGVEYXRhIGZvciAxLjEuNTo8L3A+Cis8cD48Yj5EZWxldGU8L2I+PC9wPgorPHByZT4zNDAwO0hBTkdVTCBTWUxMQUJMRSBLSVlFT0sgQTtMbzswO0w7MTEwMCAxMTYxOzs7O047Ozs7OworLi4uCis0REZGO0hBTkdVTCBTWUxMQUJMRSBNSUVVTSBXRU8gUklFVUwtVEhJRVVUSDtMbzswO0w7MTEwNiAxMTZGIDExQjQ7Ozs7Tjs7Ozs7Cis0RTAwOzxjamsgSURFT0dSQVBIIFJFUFJFU0VOVEFUSVZFPjtMbzswO0w7Ozs7O047Ozs7OzwvcHJlPgorPHA+PGI+QWRkOjwvYj48L3A+Cis8cHJlPjRFMDA7PGNqayBJZGVvZ3JhcGgsIEZpcnN0PjtMbzswO0w7Ozs7O047Ozs7OworOUZBNTs8Y2prIElkZW9ncmFwaCwgTGFzdD47TG87MDtMOzs7OztOOzs7OzsKK0UwMDA7PHByaXZhdGUgVXNlLCBGaXJzdD47Q287MDtMOzs7OztOOzs7OzsKK0Y4RkY7PHByaXZhdGUgVXNlLCBMYXN0PjtDbzswO0w7Ozs7O047Ozs7OzwvcHJlPgorPHA+PGI+QW5kIGZyb20gYSBsYXRlIHZlcnNpb24gb2YgVW5pY29kZSwgYWRkOjwvYj48L3A+Cis8cHJlPkY5MDA7Q0pLIENPTVBBVElCSUxJVFkgSURFT0dSQVBILUY5MDA7TG87MDtMOzhDNDg7Ozs7Tjs7Ozs7CisuLi4KK0ZBMkQ7Q0pLIENPTVBBVElCSUxJVFkgSURFT0dSQVBILUZBMkQ7TG87MDtMOzlEQjQ7Ozs7Tjs7Ozs7PC9wcmU+Cis8aDQ+MmIuIFVDQSBkYXRhPC9oND4KKzxwPklmIHlvdSBhcmUgYnVpbGRpbmcgYW55IG9mIHRoZSBVQ0EgdG9vbHMsIHlvdSBuZWVkIHRvIGdldCBhIGNvcHkgb2YgdGhlIFVDQSBkYXRhIGZpbGU8YnI+Citmcm9tIGh0dHA6Ly93d3cudW5pY29kZS5vcmcvcmVwb3J0cy90cjEwLyNBbGxLZXlzLiBUaGUgZGVmYXVsdCBsb2NhdGlvbiBmb3IgdGhpcyBpczo8YnI+Cis8YnI+CitCQVNFX0RJUiArICZxdW90O0NvbGxhdGlvblxhbGxrZXlzJnF1b3Q7ICsgVkVSU0lPTiArICZxdW90Oy50eHQmcXVvdDsuPGJyPgorPGJyPgorSWYgeW91IGhhdmUgaXQgaW4gYSBkaWZmZXJlbnQgbG9jYXRpb24sIGNoYW5nZSB0aGF0IHZhbHVlIGZvciBLRVlTIGluIFVDQS5qYXZhLCBhbmQgPGJyPgordGhlIHZhbHVlIGZvciBCQVNFX0RJUjwvcD4KKzxoND4yYy4gSGVyZSBpcyBhbiBleGFtcGxlIG9mIHRoZSBkZWZhdWx0IGRpcmVjdG9yeSBzdHJ1Y3R1cmUgd2l0aCBmaWxlcy4gQWxsIG9mIAordGhlIHllbGxvdyBvbmVzIHNob3VsZCBleGlzdDwvaDQ+Cis8cHJlPkM6Ly9EQVRBLworCisgICAgICAgIEJJTi8KKyAgICAKKzxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRjAwIj4gICAgICAgIENvbGxhdGlvbi8KKyAgICAgICAgICAgIGFsbGtleXMtMy4xLjEudHh0Cis8L3NwYW4+ICAgICAgICAKKyAgICAgICAgR0VOLworICAgICAgICAgICAgRGVyaXZlZERhdGEvCis8c3BhbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI0ZGRkYwMCI+ICAgICAgICA8L3NwYW4+PHNwYW4gc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNGRkZGMDAiPlVDRC8KKyAgICAgICAgICAgIDMuMC4wLVVwZGF0ZS8KKyAgICAgICAgICAgICAgICBVbmloYW4tMy4yLjAudHh0CisgICAgICAgICAgICAgICAgLi4uCisgICAgICAgICAgICAzLjAuMS1VcGRhdGUvCisgICAgICAgICAgICAgICAgLi4uCisgICAgICAgICAgICAzLjEuMC1VcGRhdGUvCisgICAgICAgICAgICAgICAgLi4uCisgICAgICAgICAgICAzLjEuMS1VcGRhdGUvCisgICAgICAgICAgICAgICAgLi4uCisgICAgICAgICAgICAzLjIuMC1VcGRhdGUvCisgICAgICAgICAgICAgICAgLi4uCisgICAgICAgICAgICA0LjAuMC1VcGRhdGUvCisgICAgICAgICAgICAgICAgQXJhYmljU2hhcGluZy00LjAuMGQxNGIudHh0CisgICAgICAgICAgICAgICAgQmlkaU1pcnJvcmluZy00LjAuMGQxYi50eHQKKyAgICAgICAgICAgICAgICAuLi4KKyAgICAgICAgICAgIEVYVFJBUy1VcGRhdGUvPC9zcGFuPjwvcHJlPgorPGgzPjMuIFZlcnNpb25zPC9oMz4KKzxwPkFsbCBvZiB0aGUgZm9sbG93aW5nIGhhdmUgJnF1b3Q7dmVyc2lvbiBYJnF1b3Q7IGluIHRoZSBvcHRpb25zIHlvdSBnaXZlIHRvIEphdmEgKGVpdGhlciBvbiB0aGUmbmJzcDsgCitjb21tYW5kIGxpbmUsIG9yIGluIHRoZSBFY2xpcHNlICdydW4nIG9wdGlvbnMuIElmIHlvdSB3YW50IGEgc3BlY2lmaWMgdmVyc2lvbiBsaWtlIDMuMS4wLCB0aGVuIHlvdSAKK3dvdWxkIHdyaXRlICZxdW90O3ZlcnNpb24gMy4xLjEmcXVvdDsuIElmIHlvdSB3YW50IHRoZSBsYXRlc3QgdmVyc2lvbiAoNC4xLjApLCB5b3UgY2FuIG9taXQgdGhlICZxdW90O3ZlcnNpb24gWCZxdW90Oy48L3A+Cis8aDM+NC4gQnVpbGRpbmcgRmlsZXM8L2gzPgorPG9sPgorCTxsaT48Yj5TZXR1cDwvYj48b2w+CisJCTxsaT5JbiBFY2xpcHNlLCBvcGVuIHRoZSBQYWNrYWdlIEV4cGxvcmVyIChVc2UgV2luZG93Jmd0O1Nob3cgVmlldyBpZiB5b3UgCisJCWRvbid0IHNlZSBpdCk8L2xpPgorCQk8bGk+T3BlbiBVbmljb2RlVG9vbHM8dWw+CisJCQk8bGk+Y29tLmlibS50ZXh0LlVDRDx1bD4KKwkJCQk8bGk+TWFrZVVuaWNvZGVGaWxlcy48c3BhbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI0ZGRkYwMCI+dHh0PC9zcGFuPjxwPlRoaXMgZmlsZSBkcml2ZXMgdGhlIHByb2R1Y3Rpb24gb2YgCisJCQkJdGhlIGRlcml2ZWQgVW5pY29kZSBmaWxlcy4gVGhlIGZpcnN0IHRocmVlIGxpbmVzIGNvbnRhaW4gCisJCQkJcGFyYW1ldGVycyB0aGF0IHlvdSBtYXkgd2FudCB0byBtb2RpZnkgYXQgc29tZSB0aW1lczo8L3A+CisJCQkJPHByZT5HZW5lcmF0ZTogPGI+LipzY3JpcHQuKjwvYj4gPGk+Ly8gdGhpcyBpcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4gVXNlIC4qIGZvciBhbGwgZmlsZXM8L2k+CitEZWx0YVZlcnNpb246IDxiPjEwPC9iPiA8aT4gICAgLy8gVGhpcyBnZXRzIGFwcGVuZGVkIHRvIHRoZSBmaWxlIG5hbWUuIFBpY2sgMSsgdGhlIGhpZ2hlc3QgdmFsdWUgaW4gUHVibGljPC9pPgorQ29weXJpZ2h0WWVhcjogPGI+MjAwNjwvYj4gPGk+IC8vIFBpY2sgdGhlIGN1cnJlbnQgeWVhcjwvaT48L3ByZT4KKwkJCQk8L2xpPgorCQkJPC91bD4KKwkJCTwvbGk+CisJCTwvdWw+CisJCTwvbGk+CisJCTxsaT5PcGVuIGluIFBhY2thZ2UgRXhwbG9yZXIgCisJCTx1bD4KKwkJCTxsaT5jb20uaWJtLnRleHQuVUNEPHVsPgorCQkJCTxsaT5NYWluPC9saT4KKwkJCTwvdWw+CisJCQk8L2xpPgorCQk8L3VsPgorCQk8L2xpPgorCQk8bGk+UnVuJmd0O1J1biBBcy4uLjxvbD4KKwkJCTxsaT5DaG9vc2UgSmF2YSBBcHBsaWNhdGlvbjx1bD4KKwkJCQk8bGk+aXQgd2lsbCBmYWlsLCBkb24ndCB3b3JyeTsgeW91IG5lZWQgdG8gc2V0IHNvbWUgcGFyYW1ldGVycy48L2xpPgorCQkJPC91bD4KKwkJCTwvbGk+CisJCTwvb2w+CisJCTwvbGk+CisJCTxsaT5SdW4mZ3Q7UnVuLi4uPHVsPgorCQkJPGxpPlNlbGVjdCB0aGUgQXJndW1lbnRzIHRhYiwgYW5kIGZpbGwgaW4gdGhlIGZvbGxvd2luZzx1bD4KKwkJCQk8bGk+UHJvZ3JhbSBhcmd1bWVudHM6PHByZT5idWlsZCA1LjA8c3BhbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogI0ZGRkYwMCI+LjA8L3NwYW4+IE1ha2VVbmljb2RlRmlsZXM8L3ByZT4KKwkJCQk8L2xpPgorCQkJCTxsaT5WTSBhcmd1bWVudHM6IAorCQkJCTxwcmU+LVhtczUxMm0gLVhteDUxMm08L3ByZT4KKwkJCQk8L2xpPgorCQkJPC91bD4KKwkJCTwvbGk+CisJCQk8bGk+Q2xvc2UgYW5kIFNhdmU8L2xpPgorCQk8L3VsPgorCQk8L2xpPgorCTwvb2w+CisJPC9saT4KKwk8bGk+PGI+UnVuPC9iPjxvbD4KKwkJPGxpPllvdSdsbCBzZWUgaXQgYnVpbGQgdGhlIDUuMCBmaWxlcywgd2l0aCBzb21ldGhpbmcgbGlrZSB0aGUgZm9sbG93aW5nIAorCQlyZXN1bHRzOjxwcmU+V3JpdGluZyBVQ0RfRGF0YTUuMC4wCitEYXRhIFNpemU6IDEwOSw4MDIKK1dyb3RlIERhdGEgMTA5ODAyPC9wcmU+CisJCTwvbGk+CisJCTxsaT5Gb3IgZWFjaCB2ZXJzaW9uLCB0aGUgdG9vbHMgYnVpbGQgYSBzZXQgb2YgYmluYXJ5IGRhdGEgaW4gQklOIHRoYXQgCisJCWNvbnRhaW4gdGhlIGluZm9ybWF0aW9uIGZvciB0aGF0IHJlbGVhc2UuIFRoaXMgaXMgZG9uZSBhdXRvbWF0aWNhbGx5LCBvciAKKwkJeW91IGNhbiBtYW51YWxseSBkbyBpdCB3aXRoIHRoZSBQcm9ncmFtIEFyZ3VtZW50czxwcmU+dmVyc2lvbiBYIGJ1aWxkPC9wcmU+CisJCTxwPlRoaXMgYnVpbGRzIGFuIGNvbXByZXNzZWQgZm9ybWF0IG9mIGFsbCB0aGUgVUNEIGRhdGEgKGV4Y2VwdCBibG9ja3MgCisJCWFuZCBVbmloYW4pIGludG8gdGhlIEJJTiBkaXJlY3RvcnkuIERvbid0IHdvcnJ5IGFib3V0IHRoZSB2b2x1bWlub3VzIAorCQljb25zb2xlIG1lc3NhZ2VzLCB1bmxlc3Mgb25lIHNheXMgJnF1b3Q7RkFJTCZxdW90Oy48L3A+CisJCTxwPjxmb250IGNvbG9yPSIjRkYwMDAwIj48aT5Zb3UgaGF2ZSB0byBtYW51YWxseSBkbyB0aGlzIGlmIHlvdSBjaGFuZ2UgCisJCWFueSBvZiB0aGUgZGF0YSBmaWxlcyBpbiB0aGF0IHZlcnNpb24hPC9pPjwvZm9udD48L3A+CisJCTxwPk5vdGU6IGlmIGZvciBhbnkgcmVhc29uIHlvdSBtb2RpZnkgdGhlIGJpbmFyeSBmb3JtYXQgb2YgdGhlIEJJTiBmaWxlcywgeW91IGFsc28gaGF2ZSB0byBidW1wIHRoZSAKK3ZhbHVlIGluIHRoYXQgZmlsZTo8L3A+CisJCTxwcmU+c3RhdGljIGZpbmFsIGJ5dGUgQklOQVJZX0ZPUk1BVCA9IDg7IC8vIGJ1bXBlZCBpZiBiaW5hcnkgZm9ybWF0IG9mIFVDRCBjaGFuZ2VzPC9wcmU+CisJCTwvbGk+CisJPC9vbD4KKwk8L2xpPgorCTxsaT5SZXN1bHRzIGluIDxhIGhyZWY9ImZpbGU6Ly8vQzovREFUQS9HRU4vRGVyaXZlZERhdGEiPgorCUM6XERBVEFcR0VOXERlcml2ZWREYXRhPC9hPjxvbD4KKwkJPGxpPlRoZSBmaWxlcyB3aWxsIGJlIGluIHRoaXMgZGlyZWN0b3J5LjwvbGk+CisJCTxsaT5UaGVyZSBhcmUgYWxzbyBESUZGIGZvbGRlcnMsIHRoYXQgY29udGFpbiBCQVQgZmlsZXMgdGhhdCB5b3UgY2FuIHJ1biAKKwkJb24gV2luZG93cyB3aXRoIENvbXBhcmVJdC4gKFlvdSBjYW4gbW9kaWZ5IHRoZSBjb2RlIHRvIGJ1aWxkIEJBVHMgd2l0aCAKKwkJYW5vdGhlciBEaWZmIHByb2dyYW0gaWYgeW91IHdhbnQpLjxvbD4KKwkJCTxsaT5Gb3IgYW55IGZpbGUgd2l0aCBhIHNpZ25pZmljYW50IGRpZmZlcmVuY2UsIGl0IHdpbGwgYnVpbGQgdHdvIAorCQkJQkFUIGZpbGVzLCBzdWNoIGFzIHRoZSBmaXJzdCB0d28gYmVsb3cuPHByZT5EaWZmX1Byb3BMaXN0LTUuMC4wZDEwLnR4dC5iYXQKK09MREVSLURpZmZfUHJvcExpc3QtNS4wLjBkMTAudHh0LmJhdAorCitVTkNIQU5HRUQtRGlmZl9Qcm9wZXJ0eVZhbHVlQWxpYXNlcy01LjAuMGQxMC50eHQuYmF0PC9wcmU+CisJCQk8L2xpPgorCQk8L29sPgorCQk8L2xpPgorCQk8bGk+QW55IGZpbGVzIHdpdGhvdXQgc2lnbmlmaWNhbnQgY2hhbmdlcyB3aWxsIGhhdmUgJnF1b3Q7VU5DSEFOR0VEJnF1b3Q7IGFzIGEgCisJCXByZWZpeDogaWdub3JlIHRoZW0uJm5ic3A7IFRoZSBPTERFUiBwcmVmaXggaXMgdGhlIGNvbXBhcmlzb24gdG8gdGhlIAorCQlsYXN0IHZlcnNpb24gb2YgVW5pY29kZS48L2xpPgorCQk8bGk+T24gV2luZG93cyB5b3UgY2FuIHJ1biB0aGVzZSBCQVRzIHRvIGNvbXBhcmUgZmlsZXM6PC9saT4KKwk8L29sPgorCTwvbGk+CisJPGxpPjxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRjAwIj5ORlNraXBwYWJsZTwvc3Bhbj48b2w+CisJPGxpPjxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRjAwIj5BIGZpbGUgaXMgbmVlZGVkIGJ5IElDVSB0aGF0IGlzIAorCWdlbmVyYXRlZCB3aXRoIHRoZSBzYW1lIHRvb2wuIEp1c3QgdXNlIHRoZSBpbnB1dCBwYXJhbWV0ZXIgJnF1b3Q7TkZTa2lwcGFibGUmcXVvdDsgdG8gCisJZ2VuZXJhdGUgdGhlIGZpbGUgTkZTYWZlU2V0cy50eHQsIGFsc28gaW4gPC9zcGFuPgorCTxhIGhyZWY9ImZpbGU6Ly8vQzovREFUQS9HRU4iPjxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRjAwIj4KKwlmaWxlOi8vL0M6L0RBVEEvR0VOPC9zcGFuPjwvYT48L2xpPgorPC9vbD4KKwk8L2xpPgorPC9vbD4KKzxoMz41LiBJbnZhcmlhbnQgQ2hlY2tpbmc8L2gzPgorPG9sPgorCTxsaT5TZXR1cDxvbD4KKwkJPGxpPk9wZW4gaW4gUGFja2FnZSBFeHBsb3Jlcjx1bD4KKwkJCTxsaT5jb20uaWJtLnRleHQuVUNEPHVsPgorCQkJCTxsaT5UZXN0VW5pY29kZUludmFyaWFudHMuamF2YTwvbGk+CisJCQk8L3VsPgorCQkJPC9saT4KKwkJPC91bD4KKwkJPC9saT4KKwkJPGxpPlJ1biZndDtSdW4gQXMuLi4gSmF2YSBBcHBsaWNhdGlvbjxicj4KKwkJV2lsbCBjcmVhdGUgdGhlIGZvbGxvd2luZyBmaWxlIG9mIHJlc3VsdHM6PHByZT48YSBocmVmPSJmaWxlOi8vL0M6L0RBVEEvR0VOL1VuaWNvZGVJbnZhcmlhbnRSZXN1bHRzLnR4dC8iPkM6XERBVEFcR0VOXFVuaWNvZGVJbnZhcmlhbnRSZXN1bHRzLnR4dFw8L2E+PC9wcmU+CisJCTxwPkFuZCBvbiB0aGUgY29uc29sZSB3aWxsIGxpc3Qgd2hldGhlciBhbnkgcHJvYmxlbXMgYXJlIGZvdW5kLiBUaHVzIGluIAorCQl0aGUgZm9sbG93aW5nIGNhc2UgdGhlcmUgd2FzIG9uZSBmYWlsdXJlOjwvcD4KKwkJPHByZT5QYXJzZUVycm9yQ291bnQ9MAorVGVzdEZhaWx1cmVDb3VudD0xPC9wcmU+CisJCTwvbGk+CisJCTxsaT5UaGUgaGVhZGVyIG9mIHRoZSByZXN1bHQgZmlsZSBleHBsYWlucyB0aGUgc3ludGF4IG9mIHRoZSB0ZXN0cy48L2xpPgorCQk8bGk+T3BlbiB0aGF0IGZpbGUgYW5kIHNlYXJjaCBmb3IgJnF1b3Q7KioqKiBTVEFSVCBFcnJvciBJbmZvICoqKiomcXVvdDsuIEVhY2ggc3VjaCAKKwkJcG9pbnQgcHJvdmlkZXMgYSBkdW1wIG9mIGNvbXBhcmlzb24gaW5mb3JtYXRpb24uPG9sPgorCQk8bGk+RmFpbHVyZXMgcHJpbnQgYSBsaXN0IG9mIGRpZmZlcmVuY2VzIGJldHdlZW4gdHdvIHNldHMgYmVpbmcgCisJCWNvbXBhcmVkLiBTbyBpZiBBIGFuZCBCIGFyZSBiZWluZyBjb21wYXJlZCwgaXQgcHJpbnRzIGFsbCB0aGUgaXRlbXMgaW4gCisJCUEtQiwgdGhlbiBpbiBCLUEsIHRoZW4gaW4gQSZhbXA7Qi48L2xpPgorCQk8bGk+Rm9yIGV4YW1wbGUsIGhlcmUgaXMgYSBsaXN0aW5nIG9mIGEgcHJvYmxlbSB0aGF0IG11c3QgYmUgY29ycmVjdGVkLiAKKwkJTm90ZSB0aGF0IHVzdWFsbHkgdGhlcmUgaXMgYSBjb21tZW50IHRoYXQgZXhwbGFpbnMgd2hhdCB0aGUgZm9sbG93aW5nIAorCQlsaW5lIG9yIGxpbmVzIGFyZSBzdXBwb3NlZCB0byB0ZXN0LiBUaGVuIHdpbGwgY29tZSBGQUxTRSAoaW5kaWNhdGluZyAKKwkJdGhhdCB0aGUgdGVzdCBmYWlsZWQpLCB0aGVuIHRoZSBkZXRhaWxlZCBlcnJvciByZXBvcnQuPHByZT48c3BhbiBzdHlsZT0iZm9udC1zaXplOiA5cHQiPiMgQ2Fub25pY2FsIGRlY29tcG9zaXRpb25zIChtaW51cyBleGNsdXNpb25zKSBtdXN0IGJlIGlkZW50aWNhbCBhY3Jvc3MgcmVsZWFzZXMKK1skRGVjb21wb3NpdGlvbl9UeXBlOkNhbm9uaWNhbCAtICRGdWxsX0NvbXBvc2l0aW9uX0V4Y2x1c2lvbl0gPSBbJNdEZWNvbXBvc2l0aW9uX1R5cGU6Q2Fub25pY2FsIC0gJNdGdWxsX0NvbXBvc2l0aW9uX0V4Y2x1c2lvbl0KKworRkFMU0UKKyoqKiogU1RBUlQgRXJyb3IgSW5mbyAqKioqCisKK0luIFsk10RlY29tcG9zaXRpb25fVHlwZTpDYW5vbmljYWwgLSAk10Z1bGxfQ29tcG9zaXRpb25fRXhjbHVzaW9uXSwgYnV0IG5vdCBpbiBbJERlY29tcG9zaXRpb25fVHlwZTpDYW5vbmljYWwgLSAkRnVsbF9Db21wb3NpdGlvbl9FeGNsdXNpb25dIDoKKworIyBUb3RhbCBjb2RlIHBvaW50czogMAorCitOb3QgaW4gWyTXRGVjb21wb3NpdGlvbl9UeXBlOkNhbm9uaWNhbCAtICTXRnVsbF9Db21wb3NpdGlvbl9FeGNsdXNpb25dLCBidXQgaW4gWyREZWNvbXBvc2l0aW9uX1R5cGU6Q2Fub25pY2FsIC0gJEZ1bGxfQ29tcG9zaXRpb25fRXhjbHVzaW9uXSA6CisxQjA2ICAgICAgICAgICAjIExvICAgICAgIEJBTElORVNFIExFVFRFUiBBS0FSQSBURURVTkcKKzFCMDggICAgICAgICAgICMgTG8gICAgICAgQkFMSU5FU0UgTEVUVEVSIElLQVJBIFRFRFVORworMUIwQSAgICAgICAgICAgIyBMbyAgICAgICBCQUxJTkVTRSBMRVRURVIgVUtBUkEgVEVEVU5HCisxQjBDICAgICAgICAgICAjIExvICAgICAgIEJBTElORVNFIExFVFRFUiBSQSBSRVBBIFRFRFVORworMUIwRSAgICAgICAgICAgIyBMbyAgICAgICBCQUxJTkVTRSBMRVRURVIgTEEgTEVOR0EgVEVEVU5HCisxQjEyICAgICAgICAgICAjIExvICAgICAgIEJBTElORVNFIExFVFRFUiBPS0FSQSBURURVTkcKKzFCM0IgICAgICAgICAgICMgTWMgICAgICAgQkFMSU5FU0UgVk9XRUwgU0lHTiBSQSBSRVBBIFRFRFVORworMUIzRCAgICAgICAgICAgIyBNYyAgICAgICBCQUxJTkVTRSBWT1dFTCBTSUdOIExBIExFTkdBIFRFRFVORworMUI0MC4uMUI0MSAgICAgIyBNYyAgIFsyXSBCQUxJTkVTRSBWT1dFTCBTSUdOIFRBTElORyBURURVTkcuLkJBTElORVNFIFZPV0VMIFNJR04gVEFMSU5HIFJFUEEgVEVEVU5HCisxQjQzICAgICAgICAgICAjIE1jICAgICAgIEJBTElORVNFIFZPV0VMIFNJR04gUEVQRVQgVEVEVU5HCisKKyMgVG90YWwgY29kZSBwb2ludHM6IDExCisKK0luIGJvdGggWyTXRGVjb21wb3NpdGlvbl9UeXBlOkNhbm9uaWNhbCAtICTXRnVsbF9Db21wb3NpdGlvbl9FeGNsdXNpb25dLCBhbmQgaW4gWyREZWNvbXBvc2l0aW9uX1R5cGU6Q2Fub25pY2FsIC0gJEZ1bGxfQ29tcG9zaXRpb25fRXhjbHVzaW9uXSA6CiswMEMwLi4wMEM1ICAgICAjIEwmYW1wOyAgIFs2XSBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggR1JBVkUuLkxBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFCiswMEM3Li4wMENGICAgICAjIEwmYW1wOyAgIFs5XSBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0VESUxMQS4uTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworMDBEMS4uMDBENiAgICAgIyBMJmFtcDsgICBbNl0gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIFRJTERFLi5MQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisuLi4KKzMwRjcuLjMwRkEgICAgICMgTG8gICBbNF0gS0FUQUtBTkEgTEVUVEVSIFZBLi5LQVRBS0FOQSBMRVRURVIgVk8KKzMwRkUgICAgICAgICAgICMgTG0gICAgICAgS0FUQUtBTkEgVk9JQ0VEIElURVJBVElPTiBNQVJLCitBQzAwLi5EN0EzICAgICAjIExvIFsxMTE3Ml0gSEFOR1VMIFNZTExBQkxFIEdBLi5IQU5HVUwgU1lMTEFCTEUgSElICisKKyMgVG90YWwgY29kZSBwb2ludHM6IDEyMDg5CisqKioqIEVORCBFcnJvciBJbmZvICoqKio8L3NwYW4+PC9wcmU+CisJCTwvbGk+CisJPC9vbD4KKwkJPC9saT4KKwkJPGxpPk9wdGlvbnM6PG9sPgorCQk8bGk+LXImbmJzcDsmbmJzcDsmbmJzcDsgUHJpbnQgdGhlIGZhaWx1cmVzIGFzIGEgcmFuZ2UgbGlzdC48L2xpPgorCQk8bGk+LWZ4eHgmbmJzcDsmbmJzcDsmbmJzcDsgVXNlIGEgZGlmZmVyZW50IGlucHV0IGZpbGUsIHN1Y2ggYXMgLWZJbnZhcmlhbnRUZXN0LnR4dDwvbGk+CisJPC9vbD4KKwkJPC9saT4KKwk8L29sPgorCTwvbGk+Cis8L29sPgorPGgzPjYuIE9wdGlvbnM8L2gzPgorPG9sPgorCTxsaT5JZiB5b3Ugd2FudCB0byBzZWUgZmlsZXMgdGhhdCBhcmUgb3BlbmVkIHdoaWxlIHByb2Nlc3NpbmcsIGRvIHRoZSAKKwlmb2xsb3dpbmc6PG9sPgorCQk8bGk+UnVuJmd0O1J1bjwvbGk+CisJCTxsaT5TZWxlY3QgdGhlIEFyZ3VtZW50cyB0YWIsIGFuZCBhZGQgdGhlIGZvbGxvd2luZzxvbD4KKwkJCTxsaT5WTSBhcmd1bWVudHM6CisJCQk8cHJlPi1EU0hPV19GSUxFUzwvcHJlPgorCQkJPC9saT4KKwkJPC9vbD4KKwkJPC9saT4KKwk8L29sPgorCTwvbGk+Cis8L29sPgorPGgzPjUuIFVDQTwvaDM+Cis8b2w+CisJPGxpPllvdSB3aWxsIHVzZSBjb20uaWJtLnRleHQuVUNBLk1haW4gYXMgeW91ciBtYWluIGNsYXNzLCBjcmVhdGluZyBhbG9uZyAKKwl0aGUgc2FtZSBsaW5lcyBhcyBhYm92ZS48L2xpPgorCTxsaT5UbyB0ZXN0IHdoZXRoZXIgdGhlIFVDQSBmaWxlcyBhcmUgdmFsaWQsIHVzZSB0aGUKKwk8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IDQwMCI+b3B0aW9ucyAoPGk+bm90ZTogeW91IG11c3QgYWxzbyBidWlsZCB0aGUgSUNVIAorCWZpbGVzIGJlbG93LCBzaW5jZSB0aGV5IHRlc3Qgb3RoZXIgYXNwZWN0czwvaT4pLjwvc3Bhbj48cHJlPndyaXRlQ29sbGF0aW9uVmFsaWRpdHlMb2c8L3ByZT4KKwk8cD5JdCB3aWxsIGNyZWF0ZSBhIGZpbGU6PC9wPgorCTxwcmU+PGEgaHJlZj0iZmlsZTovLy9DOi9EQVRBL0dFTi9jb2xsYXRpb24vNS4wLjAvQ2hlY2tDb2xsYXRpb25WYWxpZGl0eS5odG1sIj5DOlxEQVRBXEdFTlxjb2xsYXRpb25cNS4wLjBcQ2hlY2tDb2xsYXRpb25WYWxpZGl0eS5odG1sPC9hPjwvcHJlPgorCTxvbD4KKwkJPGxpPlJldmlldyB0aGlzIGZpbGUuIEl0IHdpbGwgbGlzdCBlcnJvcnMuIFNvbWUgb2YgdGhvc2UgYXJlIGFjdHVhbGx5IAorCXdhcm5pbmdzLCBhbmQgaW5kaWNhdGUgcG9zc2libGUgcHJvYmxlbXMgKHRoaXMgaXMgaW5kaWNhdGVkIGluIHRoZSB0ZXh0LCAKKwlzdWNoIGFzIGJ5OiAmcXVvdDtUaGVzZSBhcmUgbm90IG5lY2Vzc2FyaWx5IGVycm9ycywgYnV0IHNob3VsZCBiZSBleGFtaW5lZCBmb3IgCisJCTxpPnBvc3NpYmxlPC9pPiBlcnJvcnMmcXVvdDspLiBJbiB0aG9zZSBjYXNlcywgdGhlIGl0ZW1zIHNob3VsZCBiZSByZXZpZXdlZCB0byBtYWtlIAorCXN1cmUgdGhhdCB0aGVyZSBhcmUgbm8gaW5hZHZlcnRlbnQgcHJvYmxlbXMuPC9saT4KKwkJPGxpPklmIGl0IGlzIG5vdCBzbyBtYXJrZWQsIGl0IGlzIGEgdHJ1ZSBlcnJvciwgYW5kIG11c3QgYmUgZml4ZWQuPC9saT4KKwkJPGxpPkF0IHRoZSBlbmQsIHRoZXJlIGlzIHNlY3Rpb24gPGI+MTEuIENvdmVyYWdlPC9iPi4gVGhlcmUgYXJlIHR3byBzZWN0aW9uczo8b2w+CisJCQk8bGk+SW4gVUNEeHh4LCBidXQgbm90IGluIGFsbGtleXMuIENoZWNrIHRoaXMgb3ZlciB0byBtYWtlIHN1cmUgdGhhdCB0aGVzZSAKKwlhcmUgYWxsIHRoZSBjaGFyYWN0ZXJzIHRoYXQgc2hvdWxkIGdldCA8Yj48aT5pbXBsaWNpdDwvaT48L2I+IHdlaWdodHMuPC9saT4KKwkJCTxsaT5JbiBhbGxrZXlzLCBidXQgbm90IGluIFVDRC4gVGhlc2Ugc2hvdWxkIGJlIDxiPjxpPm9ubHk8L2k+PC9iPiAKKwljb250cmFjdGlvbnMuIENoZWNrIHRoZW0gb3ZlciB0byBtYWtlIHN1cmUgdGhleSBsb29rIHJpZ2h0IGFsc28uPC9saT4KKwkJPC9vbD48L2xpPgorCTwvb2w+PC9saT4KKwk8bGk+CisJPGg0PjxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogNDAwIj5UbyBidWlsZCBhbGwgdGhlIGNoYXJ0cyAoaW5jbHVkaW5nIGZvciAKKwl0aGUgVUNBKSwgdXNlIHRoZSBvcHRpb25zOiA8L3NwYW4+PC9oND4KKwk8cHJlPm5vcm1hbGl6YXRpb25DaGFydCBjYXNlQ2hhcnQgc2NyaXB0Q2hhcnQgaW5kZXhDaGFydDwvcHJlPgorCTxwPlRoZXkgd2lsbCBiZSBidWlsdCBpbnRvPC9wPgorCTxwcmU+PGEgaHJlZj0iZmlsZTovLy9DOi9EQVRBL0dFTi9jaGFydHMiPkM6XERBVEFcR0VOXGNoYXJ0czwvYT48L3ByZT4KKwk8cD48Yj5PbmNlIFVDQSBpcyByZWxlYXNlZCwgdGhlbiBjb3B5IHRob3NlIGZpbGVzIHVwIHRvIHRoZSByaWdodCBzcG90cyBpbiAKKwl0aGUgVW5pY29kZSBzaXRlOjwvYj48dWw+CisJCTxsaT4KKwkJPHByZT48YSBocmVmPSJodHRwOi8vd3d3LnVuaWNvZGUub3JnL2NoYXJ0cy9ub3JtYWxpemF0aW9uLyI+aHR0cDovL3d3dy51bmljb2RlLm9yZy9jaGFydHMvbm9ybWFsaXphdGlvbi88L2E+PC9wcmU+CisJCTwvbGk+CisJCTxsaT4KKwkJPHByZT48YSBocmVmPSJodHRwOi8vd3d3LnVuaWNvZGUub3JnL2NoYXJ0cy9jb2xsYXRpb24vIj5odHRwOi8vd3d3LnVuaWNvZGUub3JnL2NoYXJ0cy9jb2xsYXRpb24vPC9hPiA8L3ByZT4KKwkJPC9saT4KKwkJPGxpPgorCQk8cHJlPjxhIGhyZWY9Imh0dHA6Ly93d3cudW5pY29kZS5vcmcvY2hhcnRzL2Nhc2UvIj5odHRwOi8vd3d3LnVuaWNvZGUub3JnL2NoYXJ0cy9jYXNlLzwvYT4gPC9wcmU+CisJCTwvbGk+CisJCTxsaT4KKwkJPHByZT48YSBocmVmPSJodHRwOi8vd3d3LnVuaWNvZGUub3JnL2NoYXJ0cy9jb2xsYXRpb24vIj5odHRwOi8vd3d3LnVuaWNvZGUub3JnL2NoYXJ0cy9jb2xsYXRpb24vPC9hPiA8L3ByZT4KKwkJPC9saT4KKwk8L3VsPgorCTwvbGk+CisJPGxpPgorCTxoND48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IDQwMCI+VG8gYnVpbGQgYWxsIHRoZSBVQ0EgZmlsZXMgdXNlZCBieSBJQ1UsIHVzZSB0aGUgCisJb3B0aW9uOjwvc3Bhbj48L2g0PgorCTxwcmU+SUNVPC9wcmU+CisJPHA+VGhleSB3aWxsIGJlIGJ1aWx0IGludG86PC9wPgorCTxwcmU+PGEgaHJlZj0iZmlsZTovLy9DOi9EQVRBL0dFTi9jb2xsYXRpb24vNS4wLjAiPkM6XERBVEFcR0VOXGNvbGxhdGlvblw1LjAuMDwvYT48L3ByZT4KKwk8L2xpPgorCTxsaT5Zb3Ugc2hvdWxkIHRoZW4gYnVpbGQgYSBzZXQgb2YgdGhlIElDVSBmaWxlcyBmb3IgdGhlIHByZXZpb3VzIHZlcnNpb24sIAorCWlmIHlvdSBkb24ndCBoYXZlIHRoZW0uIFVzZSB0aGUgb3B0aW9uczo8cHJlPnZlcnNpb24gNC4xLjAgSUNVPC9wcmU+CisJPHA+T3Igd2hhdGV2ZXIgdGhlIGxhc3QgdmVyc2lvbiB3YXMuPC9saT4KKwk8bGk+Tm93LCB5b3Ugd2lsbCB3YW50IHRvIGNvbXBhcmUgdmVyc2lvbnMuIFRoZSBrZXkgZmlsZSBpcyAKKwlVQ0FfUnVsZXNfTm9DRS50eHQuIEl0IGNvbnRhaW5zIHRoZSBydWxlcyBleHByZXNzZWQgaW4gSUNVIGZvcm1hdCwgd2hpY2ggCisJYWxsb3dzIGZvciBjb21wYXJpc29uIGFjcm9zcyB2ZXJzaW9ucyBvZiBVQ0Egd2l0aG91dCBzcHVyaW91cyB2YXJpYXRpb25zIG9mIAorCXRoZSBudW1iZXJzIGdldHRpbmcgaW4gdGhlIHdheS48b2w+CisJCTxsaT5EbyBhIERpZmYgYmV0d2VlbiB0aGUgbGFzdCBhbmQgY3VycmVudCB2ZXJzaW9ucyBvZiB0aGVzZSBmaWxlcywgYW5kIAorCQl2ZXJpZnkgdGhhdCBhbGwgdGhlIGRpZmZlcmVuY2VzIGFyZSBlaXRoZXIgbmV3IGNoYXJhY3RlcnMsIG9yIHdlcmUgCisJCWF1dGhvcml6ZWQgdG8gYmUgY2hhbmdlZCBieSB0aGUgVVRDLjwvbGk+CisJPC9vbD48L2xpPgorPC9vbD4KKworPC9ib2R5PgorCis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQo=